diff options
author | Michael Mann <mmann78@netscape.net> | 2016-03-02 09:13:08 -0500 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2016-03-03 17:02:10 +0000 |
commit | d7de3515db98a7444fe527c82de43bfaf550b698 (patch) | |
tree | 646ad2af6362088bdad5eb110957294aec0ea779 /wiretap | |
parent | 28b76dbb9e3b7f1c4469fcb20d60371888fa7c00 (diff) |
Refactor wiretap option block types into a registration system.
Also required mergecap to look for plugins to initialize wiretap option blocks.
Change-Id: I4208d1028dd0f94f185393801d72025329266cb7
Reviewed-on: https://code.wireshark.org/review/14300
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'wiretap')
-rw-r--r-- | wiretap/wtap_opttypes.c | 448 | ||||
-rw-r--r-- | wiretap/wtap_opttypes.h | 3 |
2 files changed, 261 insertions, 190 deletions
diff --git a/wiretap/wtap_opttypes.c b/wiretap/wtap_opttypes.c index 376ac1316e..e72d77d907 100644 --- a/wiretap/wtap_opttypes.c +++ b/wiretap/wtap_opttypes.c @@ -28,103 +28,76 @@ #include "wtap-int.h" #include "pcapng.h" -struct wtap_optionblock +typedef void (*wtap_block_create_func)(wtap_optionblock_t block); +typedef void (*wtap_mand_free_func)(wtap_optionblock_t block); +typedef void (*wtap_mand_copy_func)(wtap_optionblock_t dest_block, wtap_optionblock_t src_block); + +typedef struct wtap_opt_register { const char *name; /**< name of block */ const char *description; /**< human-readable description of block */ - wtap_optionblock_type_t type; + wtap_block_create_func create; + wtap_mand_free_func free_mand; + wtap_mand_copy_func copy_mand; +} wtap_opt_register_t; + +struct wtap_optionblock +{ + wtap_opt_register_t* info; void* mandatory_data; GArray* options; }; -void wtap_opttypes_initialize(void) +/* Keep track of wtap_opt_register_t's via their id number */ +static wtap_opt_register_t* block_list[WTAP_OPTION_BLOCK_MAX_TYPE]; + +static void wtap_opttype_block_register(int block_type, wtap_opt_register_t *block) { + /* Check input */ + g_assert(block_type < WTAP_OPTION_BLOCK_MAX_TYPE); + + /* Don't re-register. */ + g_assert(block_list[block_type] == NULL); + + /* Sanity check */ + g_assert(block->name); + g_assert(block->description); + g_assert(block->create); + + block_list[block_type] = block; } -static void wtap_if_descr_filter_free(void* data) +void* wtap_optionblock_get_mandatory_data(wtap_optionblock_t block) { - wtapng_if_descr_filter_t* filter = (wtapng_if_descr_filter_t*)data; - g_free(filter->if_filter_str); - g_free(filter->if_filter_bpf_bytes); + return block->mandatory_data; } -wtap_optionblock_t wtap_optionblock_create(wtap_optionblock_type_t block_type) +static wtap_opttype_t* wtap_optionblock_get_option(wtap_optionblock_t block, guint option_id) { - wtap_optionblock_t block = NULL; + guint i; + wtap_opttype_t* opttype = NULL; - switch(block_type) + for (i = 0; i < block->options->len; i++) { - case WTAP_OPTION_BLOCK_NG_SECTION: - { - wtapng_mandatory_section_t* section_mand; - - block = g_new(struct wtap_optionblock, 1); - block->name = "SHB"; - block->description = "Section Header block"; - block->type = WTAP_OPTION_BLOCK_NG_SECTION; - block->mandatory_data = g_new(wtapng_mandatory_section_t, 1); - section_mand = (wtapng_mandatory_section_t*)block->mandatory_data; - section_mand->section_length = -1; - block->options = g_array_new(FALSE, FALSE, sizeof(wtap_opttype_t*)); - - wtap_optionblock_add_option_string(block, OPT_COMMENT, "opt_comment", "Optional comment", NULL, NULL); - wtap_optionblock_add_option_string(block, OPT_SHB_HARDWARE, "hardware", "SBH Hardware", NULL, NULL); - wtap_optionblock_add_option_string(block, OPT_SHB_OS, "os", "SBH Operating System", NULL, NULL); - wtap_optionblock_add_option_string(block, OPT_SHB_USERAPPL, "user_appl", "SBH User Application", NULL, NULL); - } - break; - case WTAP_OPTION_BLOCK_NG_NRB: - block = g_new(struct wtap_optionblock, 1); - block->name = "NRB"; - block->description = "Name Resolution Block"; - block->type = WTAP_OPTION_BLOCK_NG_NRB; - block->mandatory_data = NULL; - block->options = g_array_new(FALSE, FALSE, sizeof(wtap_opttype_t*)); - - wtap_optionblock_add_option_string(block, OPT_COMMENT, "opt_comment", "Optional comment", NULL, NULL); - break; - - case WTAP_OPTION_BLOCK_IF_STATS: - block = g_new(struct wtap_optionblock, 1); - block->name = "ISB"; - block->description = "Interface Statistics Block"; - block->type = WTAP_OPTION_BLOCK_IF_STATS; - block->mandatory_data = g_new0(wtapng_if_stats_mandatory_t, 1); - block->options = g_array_new(FALSE, FALSE, sizeof(wtap_opttype_t*)); - - wtap_optionblock_add_option_string(block, OPT_COMMENT, "opt_comment", "Optional comment", NULL, NULL); - wtap_optionblock_add_option_uint64(block, OPT_ISB_STARTTIME, "start_time", "Start Time", 0, 0); - wtap_optionblock_add_option_uint64(block, OPT_ISB_ENDTIME, "end_time", "End Time", 0, 0); - wtap_optionblock_add_option_uint64(block, OPT_ISB_IFRECV, "recv", "Receive Packets", G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF), G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); - wtap_optionblock_add_option_uint64(block, OPT_ISB_IFDROP, "drop", "Dropped Packets", G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF), G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); - wtap_optionblock_add_option_uint64(block, OPT_ISB_FILTERACCEPT, "filter_accept", "Filter Accept", G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF), G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); - wtap_optionblock_add_option_uint64(block, OPT_ISB_OSDROP, "os_drop", "OS Dropped Packets", G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF), G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); - wtap_optionblock_add_option_uint64(block, OPT_ISB_USRDELIV, "user_deliv", "User Delivery", G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF), G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); - break; - case WTAP_OPTION_BLOCK_IF_DESCR: - { - wtapng_if_descr_filter_t default_filter; - memset(&default_filter, 0, sizeof(default_filter)); - - block = g_new(struct wtap_optionblock, 1); - block->name = "IDB"; - block->description = "Interface Description Block"; - block->type = WTAP_OPTION_BLOCK_IF_DESCR; - block->mandatory_data = g_new0(wtapng_if_descr_mandatory_t, 1); - block->options = g_array_new(FALSE, FALSE, sizeof(wtap_opttype_t*)); - - wtap_optionblock_add_option_string(block, OPT_COMMENT, "opt_comment", "Optional comment", NULL, NULL); - wtap_optionblock_add_option_string(block, OPT_IDB_NAME, "name", "Device name", NULL, NULL); - wtap_optionblock_add_option_string(block, OPT_IDB_DESCR, "description", "Device description", NULL, NULL); - wtap_optionblock_add_option_uint64(block, OPT_IDB_SPEED, "speed", "Interface speed (in bps)", G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF), G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); - wtap_optionblock_add_option_uint8(block, OPT_IDB_TSRESOL, "ts_resolution", "Resolution of timestamps", 6, 6); - wtap_optionblock_add_option_custom(block, OPT_IDB_FILTER, "filter", "Filter string", &default_filter, &default_filter, sizeof(wtapng_if_descr_filter_t), wtap_if_descr_filter_free); - wtap_optionblock_add_option_string(block, OPT_IDB_OS, "os", "Operating System", NULL, NULL); - wtap_optionblock_add_option_uint8(block, OPT_IDB_FCSLEN, "fcslen", "FCS Length", -1, -1); - } - break; + opttype = g_array_index(block->options, wtap_opttype_t*, i); + if (opttype->number == option_id) + return opttype; } + return NULL; +} + +wtap_optionblock_t wtap_optionblock_create(wtap_optionblock_type_t block_type) +{ + wtap_optionblock_t block; + + if (block_type >= WTAP_OPTION_BLOCK_MAX_TYPE) + return NULL; + + block = g_new(struct wtap_optionblock, 1); + block->info = block_list[block_type]; + block->info->create(block); + return block; } @@ -155,49 +128,81 @@ static void wtap_optionblock_free_options(wtap_optionblock_t block) void wtap_optionblock_free(wtap_optionblock_t block) { - guint j; - wtap_optionblock_t if_stats; - if (block != NULL) { - /* Need special consideration for freeing of the interface_statistics member */ - if (block->type == WTAP_OPTION_BLOCK_IF_DESCR) - { - wtapng_if_descr_mandatory_t* mand = (wtapng_if_descr_mandatory_t*)block->mandatory_data; - for(j = 0; j < mand->num_stat_entries; j++) { - if_stats = g_array_index(mand->interface_statistics, wtap_optionblock_t, j); - wtap_optionblock_free(if_stats); - } - - if (mand->interface_statistics) - g_array_free(mand->interface_statistics, TRUE); - } + if (block->info->free_mand != NULL) + block->info->free_mand(block); g_free(block->mandatory_data); wtap_optionblock_free_options(block); - g_array_free(block->options, FALSE); + if (block->options != NULL) + g_array_free(block->options, FALSE); g_free(block); } } -void* wtap_optionblock_get_mandatory_data(wtap_optionblock_t block) -{ - return block->mandatory_data; -} - -static wtap_opttype_t* wtap_optionblock_get_option(wtap_optionblock_t block, guint option_id) +void wtap_optionblock_copy_options(wtap_optionblock_t dest_block, wtap_optionblock_t src_block) { guint i; - wtap_opttype_t* opttype = NULL; + wtap_opttype_t *dest_opttype, *src_opttype; - for (i = 0; i < block->options->len; i++) + if (dest_block->info->copy_mand != NULL) + dest_block->info->copy_mand(dest_block, src_block); + + /* Copy the options. For now, don't remove any options that are in destination + * but not source. + */ + for (i = 0; i < src_block->options->len; i++) { - opttype = g_array_index(block->options, wtap_opttype_t*, i); - if (opttype->number == option_id) - return opttype; + src_opttype = g_array_index(src_block->options, wtap_opttype_t*, i); + dest_opttype = wtap_optionblock_get_option(dest_block, src_opttype->number); + if (dest_opttype == NULL) + { + /* Option doesn't exist, add it */ + switch(src_opttype->type) + { + case WTAP_OPTTYPE_UINT8: + wtap_optionblock_add_option_uint8(dest_block, src_opttype->number, src_opttype->name, src_opttype->description, + src_opttype->option.uint8val, src_opttype->default_val.uint8val); + break; + case WTAP_OPTTYPE_UINT64: + wtap_optionblock_add_option_uint64(dest_block, src_opttype->number, src_opttype->name, src_opttype->description, + src_opttype->option.uint64val, src_opttype->default_val.uint64val); + break; + case WTAP_OPTTYPE_STRING: + wtap_optionblock_add_option_string(dest_block, src_opttype->number, src_opttype->name, src_opttype->description, + src_opttype->option.stringval, src_opttype->default_val.stringval); + break; + case WTAP_OPTTYPE_CUSTOM: + wtap_optionblock_add_option_custom(dest_block, src_opttype->number, src_opttype->name, src_opttype->description, + src_opttype->option.customval.data, src_opttype->default_val.customval.data, + src_opttype->option.customval.size, src_opttype->option.customval.free_func); + break; + } + } + else + { + /* Option exists, replace it */ + switch(src_opttype->type) + { + case WTAP_OPTTYPE_UINT8: + dest_opttype->option.uint8val = src_opttype->option.uint8val; + break; + case WTAP_OPTTYPE_UINT64: + dest_opttype->option.uint64val = src_opttype->option.uint64val; + break; + case WTAP_OPTTYPE_STRING: + g_free(dest_opttype->option.stringval); + dest_opttype->option.stringval = g_strdup(src_opttype->option.stringval); + break; + case WTAP_OPTTYPE_CUSTOM: + dest_opttype->option.customval.free_func(dest_opttype->option.customval.data); + g_free(dest_opttype->option.customval.data); + dest_opttype->option.customval.data = g_memdup(src_opttype->option.customval.data, src_opttype->option.customval.size); + break; + } + } } - - return NULL; } int wtap_optionblock_add_option_string(wtap_optionblock_t block, guint option_id, @@ -418,94 +423,159 @@ int wtap_optionblock_get_option_custom(wtap_optionblock_t block, guint option_id return WTAP_OPTTYPE_SUCCESS; } -void wtap_optionblock_copy_options(wtap_optionblock_t dest_block, wtap_optionblock_t src_block) +static void shb_create(wtap_optionblock_t block) { - guint i; - wtap_opttype_t *dest_opttype, *src_opttype; + wtapng_mandatory_section_t* section_mand = g_new(wtapng_mandatory_section_t, 1); - switch(src_block->type) - { - case WTAP_OPTION_BLOCK_NG_SECTION: - memcpy(dest_block->mandatory_data, src_block->mandatory_data, sizeof(wtapng_mandatory_section_t)); - break; - case WTAP_OPTION_BLOCK_NG_NRB: - /* No mandatory data */ - break; - case WTAP_OPTION_BLOCK_IF_STATS: - memcpy(dest_block->mandatory_data, src_block->mandatory_data, sizeof(wtapng_if_stats_mandatory_t)); - break; - case WTAP_OPTION_BLOCK_IF_DESCR: - { - wtapng_if_descr_mandatory_t *src_mand = (wtapng_if_descr_mandatory_t*)src_block->mandatory_data, - *dest_mand = (wtapng_if_descr_mandatory_t*)dest_block->mandatory_data; - /* Need special consideration for copying of the interface_statistics member */ - if (dest_mand->num_stat_entries != 0) - { - g_array_free(dest_mand->interface_statistics, TRUE); - } + section_mand->section_length = -1; - memcpy(dest_mand, src_mand, sizeof(wtapng_if_descr_mandatory_t)); - if (src_mand->num_stat_entries != 0) - { - dest_mand->interface_statistics = g_array_new(FALSE, FALSE, sizeof(wtap_optionblock_t)); - dest_mand->interface_statistics = g_array_append_vals(dest_mand->interface_statistics, src_mand->interface_statistics->data, src_mand->interface_statistics->len); - } - } - break; + block->mandatory_data = section_mand; + block->options = g_array_new(FALSE, FALSE, sizeof(wtap_opttype_t*)); + + wtap_optionblock_add_option_string(block, OPT_COMMENT, "opt_comment", "Optional comment", NULL, NULL); + wtap_optionblock_add_option_string(block, OPT_SHB_HARDWARE, "hardware", "SBH Hardware", NULL, NULL); + wtap_optionblock_add_option_string(block, OPT_SHB_OS, "os", "SBH Operating System", NULL, NULL); + wtap_optionblock_add_option_string(block, OPT_SHB_USERAPPL, "user_appl", "SBH User Application", NULL, NULL); +} + +static void shb_copy_mand(wtap_optionblock_t dest_block, wtap_optionblock_t src_block) +{ + memcpy(dest_block->mandatory_data, src_block->mandatory_data, sizeof(wtapng_mandatory_section_t)); +} + +static void nrb_create(wtap_optionblock_t block) +{ + block->mandatory_data = NULL; + block->options = g_array_new(FALSE, FALSE, sizeof(wtap_opttype_t*)); + + wtap_optionblock_add_option_string(block, OPT_COMMENT, "opt_comment", "Optional comment", NULL, NULL); +} + +static void isb_create(wtap_optionblock_t block) +{ + block->mandatory_data = g_new0(wtapng_if_stats_mandatory_t, 1); + block->options = g_array_new(FALSE, FALSE, sizeof(wtap_opttype_t*)); + + wtap_optionblock_add_option_string(block, OPT_COMMENT, "opt_comment", "Optional comment", NULL, NULL); + wtap_optionblock_add_option_uint64(block, OPT_ISB_STARTTIME, "start_time", "Start Time", 0, 0); + wtap_optionblock_add_option_uint64(block, OPT_ISB_ENDTIME, "end_time", "End Time", 0, 0); + wtap_optionblock_add_option_uint64(block, OPT_ISB_IFRECV, "recv", "Receive Packets", G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF), G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); + wtap_optionblock_add_option_uint64(block, OPT_ISB_IFDROP, "drop", "Dropped Packets", G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF), G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); + wtap_optionblock_add_option_uint64(block, OPT_ISB_FILTERACCEPT, "filter_accept", "Filter Accept", G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF), G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); + wtap_optionblock_add_option_uint64(block, OPT_ISB_OSDROP, "os_drop", "OS Dropped Packets", G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF), G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); + wtap_optionblock_add_option_uint64(block, OPT_ISB_USRDELIV, "user_deliv", "User Delivery", G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF), G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); +} + +static void isb_copy_mand(wtap_optionblock_t dest_block, wtap_optionblock_t src_block) +{ + memcpy(dest_block->mandatory_data, src_block->mandatory_data, sizeof(wtapng_if_stats_mandatory_t)); +} + +static void idb_filter_free(void* data) +{ + wtapng_if_descr_filter_t* filter = (wtapng_if_descr_filter_t*)data; + g_free(filter->if_filter_str); + g_free(filter->if_filter_bpf_bytes); +} + +static void idb_create(wtap_optionblock_t block) +{ + wtapng_if_descr_filter_t default_filter; + memset(&default_filter, 0, sizeof(default_filter)); + + block->mandatory_data = g_new0(wtapng_if_descr_mandatory_t, 1); + block->options = g_array_new(FALSE, FALSE, sizeof(wtap_opttype_t*)); + + wtap_optionblock_add_option_string(block, OPT_COMMENT, "opt_comment", "Optional comment", NULL, NULL); + wtap_optionblock_add_option_string(block, OPT_IDB_NAME, "name", "Device name", NULL, NULL); + wtap_optionblock_add_option_string(block, OPT_IDB_DESCR, "description", "Device description", NULL, NULL); + wtap_optionblock_add_option_uint64(block, OPT_IDB_SPEED, "speed", "Interface speed (in bps)", G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF), G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); + wtap_optionblock_add_option_uint8(block, OPT_IDB_TSRESOL, "ts_resolution", "Resolution of timestamps", 6, 6); + wtap_optionblock_add_option_custom(block, OPT_IDB_FILTER, "filter", "Filter string", &default_filter, &default_filter, sizeof(wtapng_if_descr_filter_t), idb_filter_free); + wtap_optionblock_add_option_string(block, OPT_IDB_OS, "os", "Operating System", NULL, NULL); + wtap_optionblock_add_option_uint8(block, OPT_IDB_FCSLEN, "fcslen", "FCS Length", -1, -1); +} + +static void idb_free_mand(wtap_optionblock_t block) +{ + guint j; + wtap_optionblock_t if_stats; + wtapng_if_descr_mandatory_t* mand = (wtapng_if_descr_mandatory_t*)block->mandatory_data; + + for(j = 0; j < mand->num_stat_entries; j++) { + if_stats = g_array_index(mand->interface_statistics, wtap_optionblock_t, j); + wtap_optionblock_free(if_stats); } - /* Copy the options. For now, don't remove any options that are in destination - * but not source. - */ - for (i = 0; i < src_block->options->len; i++) + if (mand->interface_statistics) + g_array_free(mand->interface_statistics, TRUE); +} + +static void idb_copy_mand(wtap_optionblock_t dest_block, wtap_optionblock_t src_block) +{ + guint j; + wtap_optionblock_t src_if_stats, dest_if_stats; + wtapng_if_descr_mandatory_t *src_mand = (wtapng_if_descr_mandatory_t*)src_block->mandatory_data, + *dest_mand = (wtapng_if_descr_mandatory_t*)dest_block->mandatory_data; + + /* Need special consideration for copying of the interface_statistics member */ + if (dest_mand->num_stat_entries != 0) + g_array_free(dest_mand->interface_statistics, TRUE); + + memcpy(dest_mand, src_mand, sizeof(wtapng_if_descr_mandatory_t)); + if (src_mand->num_stat_entries != 0) { - src_opttype = g_array_index(src_block->options, wtap_opttype_t*, i); - dest_opttype = wtap_optionblock_get_option(dest_block, src_opttype->number); - if (dest_opttype == NULL) - { - /* Option doesn't exist, add it */ - switch(src_opttype->type) - { - case WTAP_OPTTYPE_UINT8: - wtap_optionblock_add_option_uint8(dest_block, src_opttype->number, src_opttype->name, src_opttype->description, - src_opttype->option.uint8val, src_opttype->default_val.uint8val); - break; - case WTAP_OPTTYPE_UINT64: - wtap_optionblock_add_option_uint64(dest_block, src_opttype->number, src_opttype->name, src_opttype->description, - src_opttype->option.uint64val, src_opttype->default_val.uint64val); - break; - case WTAP_OPTTYPE_STRING: - wtap_optionblock_add_option_string(dest_block, src_opttype->number, src_opttype->name, src_opttype->description, - src_opttype->option.stringval, src_opttype->default_val.stringval); - break; - case WTAP_OPTTYPE_CUSTOM: - wtap_optionblock_add_option_custom(dest_block, src_opttype->number, src_opttype->name, src_opttype->description, - src_opttype->option.customval.data, src_opttype->default_val.customval.data, - src_opttype->option.customval.size, src_opttype->option.customval.free_func); - break; - } - } - else + dest_mand->interface_statistics = g_array_new(FALSE, FALSE, sizeof(wtap_optionblock_t)); + for (j = 0; j < src_mand->num_stat_entries; j++) { - /* Option exists, replace it */ - switch(src_opttype->type) - { - case WTAP_OPTTYPE_UINT8: - dest_opttype->option.uint8val = src_opttype->option.uint8val; - break; - case WTAP_OPTTYPE_UINT64: - dest_opttype->option.uint64val = src_opttype->option.uint64val; - break; - case WTAP_OPTTYPE_STRING: - g_free(dest_opttype->option.stringval); - dest_opttype->option.stringval = g_strdup(src_opttype->option.stringval); - break; - case WTAP_OPTTYPE_CUSTOM: - dest_opttype->option.customval.free_func(dest_opttype->option.customval.data); - g_free(dest_opttype->option.customval.data); - dest_opttype->option.customval.data = g_memdup(src_opttype->option.customval.data, src_opttype->option.customval.size); - break; - } + src_if_stats = g_array_index(src_mand->interface_statistics, wtap_optionblock_t, j); + dest_if_stats = wtap_optionblock_create(WTAP_OPTION_BLOCK_IF_STATS); + wtap_optionblock_copy_options(dest_if_stats, src_if_stats); + dest_mand->interface_statistics = g_array_append_val(dest_mand->interface_statistics, dest_if_stats); } } } + +void wtap_opttypes_initialize(void) +{ + static wtap_opt_register_t shb_block = { + "SHB", /* name */ + "Section Header Block", /* description */ + shb_create, /* create */ + NULL, /* free_mand */ + shb_copy_mand, /* copy_mand */ + }; + + static wtap_opt_register_t nrb_block = { + "NRB", /* name */ + "Name Resolution Block", /* description */ + nrb_create, /* create */ + NULL, /* free_mand */ + NULL, /* copy_mand */ + }; + + static wtap_opt_register_t isb_block = { + "ISB", /* name */ + "Interface Statistics Block", /* description */ + isb_create, /* create */ + NULL, /* free_mand */ + isb_copy_mand, /* copy_mand */ + }; + + static wtap_opt_register_t idb_block = { + "IDB", /* name */ + "Interface Description Block", /* description */ + idb_create, /* create */ + idb_free_mand, /* free_mand */ + idb_copy_mand, /* copy_mand */ + }; + + /* Initialize the block array. This is mostly for future proofing + "outside registered" block types (for NULL checking) */ + memset(block_list, 0, WTAP_OPTION_BLOCK_MAX_TYPE*sizeof(wtap_opt_register_t*)); + + wtap_opttype_block_register(WTAP_OPTION_BLOCK_NG_SECTION, &shb_block ); + wtap_opttype_block_register(WTAP_OPTION_BLOCK_NG_NRB, &nrb_block ); + wtap_opttype_block_register(WTAP_OPTION_BLOCK_IF_STATS, &isb_block ); + wtap_opttype_block_register(WTAP_OPTION_BLOCK_IF_DESCR, &idb_block ); +} diff --git a/wiretap/wtap_opttypes.h b/wiretap/wtap_opttypes.h index f25e07f388..7d404f221d 100644 --- a/wiretap/wtap_opttypes.h +++ b/wiretap/wtap_opttypes.h @@ -29,7 +29,8 @@ typedef enum { WTAP_OPTION_BLOCK_IF_DESCR = 0, WTAP_OPTION_BLOCK_IF_STATS, WTAP_OPTION_BLOCK_NG_SECTION, - WTAP_OPTION_BLOCK_NG_NRB + WTAP_OPTION_BLOCK_NG_NRB, + WTAP_OPTION_BLOCK_MAX_TYPE } wtap_optionblock_type_t; /* Currently supported option types */ |