/** * initialize our plugin library. Pass the DLT of the source pcap handle. * Actions: * - Create new tcpeditdlt_t context * - Link tcpedit to new context * - Register plugins * - Select decoder plugin using srcdlt * - Select encoder plugin using destination name * - Initialize decoder/encoder plugins * - Parse options for encoder plugin * - Validate provides/reqiures + user options */ tcpeditdlt_t * tcpedit_dlt_init(tcpedit_t *tcpedit, const int srcdlt) { tcpeditdlt_t *ctx; int rcode; assert(tcpedit); assert(srcdlt >= 0); ctx = (tcpeditdlt_t *)safe_malloc(sizeof(tcpeditdlt_t)); /* do we need a side buffer for L3 data? */ #ifdef FORCE_ALIGN ctx->l3buff = (u_char *)safe_malloc(MAXPACKET); #endif /* copy our tcpedit context */ ctx->tcpedit = tcpedit; /* register all our plugins */ if (tcpedit_dlt_register(ctx) != TCPEDIT_OK) { tcpedit_dlt_cleanup(ctx); return NULL; } /* Choose decode plugin */ if ((ctx->decoder = tcpedit_dlt_getplugin(ctx, srcdlt)) == NULL) { tcpedit_seterr(tcpedit, "No DLT plugin available for source DLT: 0x%x", srcdlt); tcpedit_dlt_cleanup(ctx); return NULL; } /* set our dlt type */ ctx->dlt = srcdlt; /* set our address type */ ctx->addr_type = ctx->decoder->plugin_l2addr_type(); /* initalize decoder plugin */ rcode = ctx->decoder->plugin_init(ctx); if (tcpedit_checkerror(ctx->tcpedit, rcode, NULL) != TCPEDIT_OK) { tcpedit_dlt_cleanup(ctx); return NULL; } /* we're OK */ return ctx; }
/* * Since this is used in a library, we should manually clean up after ourselves * Unless you allocated some memory in dlt_jnpr_ether_init(), this is just an stub. * Returns: TCPEDIT_ERROR | TCPEDIT_OK | TCPEDIT_WARN */ int dlt_jnpr_ether_cleanup(tcpeditdlt_t *ctx) { tcpeditdlt_plugin_t *plugin; jnpr_ether_config_t *config; assert(ctx); if ((plugin = tcpedit_dlt_getplugin(ctx, dlt_value)) == NULL) { tcpedit_seterr(ctx->tcpedit, "Unable to cleanup unregistered plugin %s", dlt_name); return TCPEDIT_ERROR; } if (ctx->decoded_extra != NULL) { safe_free(ctx->decoded_extra); ctx->decoded_extra = NULL; } if (plugin->config != NULL) { /* clean up the en10mb plugin */ config = (jnpr_ether_config_t *)ctx->encoder->config; tcpedit_dlt_cleanup(config->subctx); plugin->config = NULL; } return TCPEDIT_OK; /* success */ }