gchar * wtap_get_debug_if_descr(const wtap_block_t if_descr, const int indent, const char* line_end) { char* tmp_content; wtapng_if_descr_mandatory_t* if_descr_mand; GString *info = g_string_new(""); guint64 tmp64; gint8 itmp8; guint8 tmp8; wtapng_if_descr_filter_t* if_filter; g_assert(if_descr); if_descr_mand = (wtapng_if_descr_mandatory_t*)wtap_block_get_mandatory_data(if_descr); if (wtap_block_get_string_option_value(if_descr, OPT_IDB_NAME, &tmp_content) == WTAP_OPTTYPE_SUCCESS) { g_string_printf(info, "%*cName = %s%s", indent, ' ', tmp_content ? tmp_content : "UNKNOWN", line_end); } if (wtap_block_get_string_option_value(if_descr, OPT_IDB_DESCR, &tmp_content) == WTAP_OPTTYPE_SUCCESS) { g_string_append_printf(info, "%*cDescription = %s%s", indent, ' ', tmp_content ? tmp_content : "NONE", line_end); } g_string_append_printf(info, "%*cEncapsulation = %s (%d - %s)%s", indent, ' ', wtap_encap_description(if_descr_mand->wtap_encap), if_descr_mand->wtap_encap, wtap_encap_name(if_descr_mand->wtap_encap), line_end); if (wtap_block_get_string_option_value(if_descr, OPT_IDB_HARDWARE, &tmp_content) == WTAP_OPTTYPE_SUCCESS) { g_string_append_printf(info, "%*cHardware = %s%s", indent, ' ', tmp_content ? tmp_content : "NONE", line_end); } if (wtap_block_get_uint64_option_value(if_descr, OPT_IDB_SPEED, &tmp64) == WTAP_OPTTYPE_SUCCESS) { g_string_append_printf(info, "%*cSpeed = %" G_GINT64_MODIFIER "u%s", indent, ' ', tmp64, line_end); } g_string_append_printf(info, "%*cCapture length = %u%s", indent, ' ', if_descr_mand->snap_len, line_end); if (wtap_block_get_uint8_option_value(if_descr, OPT_IDB_FCSLEN, &itmp8) == WTAP_OPTTYPE_SUCCESS) { g_string_append_printf(info, "%*cFCS length = %d%s", indent, ' ', itmp8, line_end); } g_string_append_printf(info, "%*cTime precision = %s (%d)%s", indent, ' ', wtap_tsprec_string(if_descr_mand->tsprecision), if_descr_mand->tsprecision, line_end); g_string_append_printf(info, "%*cTime ticks per second = %" G_GINT64_MODIFIER "u%s", indent, ' ', if_descr_mand->time_units_per_second, line_end); if (wtap_block_get_uint8_option_value(if_descr, OPT_IDB_TSRESOL, &tmp8) == WTAP_OPTTYPE_SUCCESS) { g_string_append_printf(info, "%*cTime resolution = 0x%.2x%s", indent, ' ', tmp8, line_end); } if (wtap_block_get_custom_option_value(if_descr, OPT_IDB_FILTER, (void**)&if_filter) == WTAP_OPTTYPE_SUCCESS) { g_string_append_printf(info, "%*cFilter string = %s%s", indent, ' ', if_filter->if_filter_str ? if_filter->if_filter_str : "NONE", line_end); g_string_append_printf(info, "%*cBPF filter length = %u%s", indent, ' ', if_filter->bpf_filter_len, line_end); } if (wtap_block_get_string_option_value(if_descr, OPT_IDB_OS, &tmp_content) == WTAP_OPTTYPE_SUCCESS) { g_string_append_printf(info, "%*cOperating system = %s%s", indent, ' ', tmp_content ? tmp_content : "UNKNOWN", line_end); } /* * XXX - support multiple comments. */ if (wtap_block_get_nth_string_option_value(if_descr, OPT_COMMENT, 0, &tmp_content) == WTAP_OPTTYPE_SUCCESS) { g_string_append_printf(info, "%*cComment = %s%s", indent, ' ', tmp_content ? tmp_content : "NONE", line_end); } g_string_append_printf(info, "%*cNumber of stat entries = %u%s", indent, ' ', if_descr_mand->num_stat_entries, line_end); return g_string_free(info, FALSE); }
static gboolean is_duplicate_idb(const wtap_block_t idb1, const wtap_block_t idb2) { wtapng_if_descr_mandatory_t *idb1_mand, *idb2_mand; gboolean have_idb1_value, have_idb2_value; guint64 idb1_if_speed, idb2_if_speed; guint8 idb1_if_tsresol, idb2_if_tsresol; guint8 idb1_if_fcslen, idb2_if_fcslen; char *idb1_opt_comment, *idb2_opt_comment, *idb1_if_name, *idb2_if_name, *idb1_if_description, *idb2_if_description, *idb1_if_os, *idb2_if_os; g_assert(idb1 && idb2); idb1_mand = (wtapng_if_descr_mandatory_t*)wtap_block_get_mandatory_data(idb1); idb2_mand = (wtapng_if_descr_mandatory_t*)wtap_block_get_mandatory_data(idb2); merge_debug("merge::is_duplicate_idb() called"); merge_debug("idb1_mand->wtap_encap == idb2_mand->wtap_encap: %s", (idb1_mand->wtap_encap == idb2_mand->wtap_encap) ? "TRUE":"FALSE"); if (idb1_mand->wtap_encap != idb2_mand->wtap_encap) { /* Clearly not the same interface. */ merge_debug("merge::is_duplicate_idb() returning FALSE"); return FALSE; } merge_debug("idb1_mand->link_type == idb2_mand->link_type: %s", (idb1_mand->link_type == idb2_mand->link_type) ? "TRUE":"FALSE"); if (idb1_mand->link_type != idb2_mand->link_type) { /* Clearly not the same interface. */ merge_debug("merge::is_duplicate_idb() returning FALSE"); return FALSE; } merge_debug("idb1_mand->time_units_per_second == idb2_mand->time_units_per_second: %s", (idb1_mand->time_units_per_second == idb2_mand->time_units_per_second) ? "TRUE":"FALSE"); if (idb1_mand->time_units_per_second != idb2_mand->time_units_per_second) { /* * Probably not the same interface, and we can't combine them * in any case. */ merge_debug("merge::is_duplicate_idb() returning FALSE"); return FALSE; } merge_debug("idb1_mand->tsprecision == idb2_mand->tsprecision: %s", (idb1_mand->tsprecision == idb2_mand->tsprecision) ? "TRUE":"FALSE"); if (idb1_mand->tsprecision != idb2_mand->tsprecision) { /* * Probably not the same interface, and we can't combine them * in any case. */ merge_debug("merge::is_duplicate_idb() returning FALSE"); return FALSE; } /* XXX: should snaplen not be compared? */ merge_debug("idb1_mand->snap_len == idb2_mand->snap_len: %s", (idb1_mand->snap_len == idb2_mand->snap_len) ? "TRUE":"FALSE"); if (idb1_mand->snap_len != idb2_mand->snap_len) { merge_debug("merge::is_duplicate_idb() returning FALSE"); return FALSE; } /* XXX - what do to if we have only one value? */ have_idb1_value = (wtap_block_get_uint64_option_value(idb1, OPT_IDB_SPEED, &idb1_if_speed) == WTAP_OPTTYPE_SUCCESS); have_idb2_value = (wtap_block_get_uint64_option_value(idb2, OPT_IDB_SPEED, &idb2_if_speed) == WTAP_OPTTYPE_SUCCESS); if (have_idb1_value && have_idb2_value) { merge_debug("idb1_if_speed == idb2_if_speed: %s", (idb1_if_speed == idb2_if_speed) ? "TRUE":"FALSE"); if (idb1_if_speed != idb2_if_speed) { merge_debug("merge::is_duplicate_idb() returning FALSE"); return FALSE; } } /* XXX - what do to if we have only one value? */ have_idb1_value = (wtap_block_get_uint8_option_value(idb1, OPT_IDB_TSRESOL, &idb1_if_tsresol) == WTAP_OPTTYPE_SUCCESS); have_idb2_value = (wtap_block_get_uint8_option_value(idb2, OPT_IDB_TSRESOL, &idb2_if_tsresol) == WTAP_OPTTYPE_SUCCESS); if (have_idb1_value && have_idb2_value) { merge_debug("idb1_if_tsresol == idb2_if_tsresol: %s", (idb1_if_tsresol == idb2_if_tsresol) ? "TRUE":"FALSE"); if (idb1_if_tsresol != idb2_if_tsresol) { merge_debug("merge::is_duplicate_idb() returning FALSE"); return FALSE; } } /* XXX - what do to if we have only one value? */ have_idb1_value = (wtap_block_get_uint8_option_value(idb1, OPT_IDB_FCSLEN, &idb1_if_fcslen) == WTAP_OPTTYPE_SUCCESS); have_idb2_value = (wtap_block_get_uint8_option_value(idb2, OPT_IDB_FCSLEN, &idb2_if_fcslen) == WTAP_OPTTYPE_SUCCESS); if (have_idb1_value && have_idb2_value) { merge_debug("idb1_if_fcslen == idb2_if_fcslen: %s", (idb1_if_fcslen == idb2_if_fcslen) ? "TRUE":"FALSE"); if (idb1_if_fcslen == idb2_if_fcslen) { merge_debug("merge::is_duplicate_idb() returning FALSE"); return FALSE; } } /* * XXX - handle multiple comments? * XXX - if the comments are different, just combine them if we * decide the two interfaces are really the same? As comments * can be arbitrary strings added by people, the fact that they're * different doesn't necessarily mean the interfaces are different. */ have_idb1_value = (wtap_block_get_nth_string_option_value(idb1, OPT_COMMENT, 0, &idb1_opt_comment) == WTAP_OPTTYPE_SUCCESS); have_idb2_value = (wtap_block_get_nth_string_option_value(idb2, OPT_COMMENT, 0, &idb2_opt_comment) == WTAP_OPTTYPE_SUCCESS); if (have_idb1_value && have_idb2_value) { merge_debug("g_strcmp0(idb1_opt_comment, idb2_opt_comment) == 0: %s", (g_strcmp0(idb1_opt_comment, idb2_opt_comment) == 0) ? "TRUE":"FALSE"); if (g_strcmp0(idb1_opt_comment, idb2_opt_comment) != 0) { merge_debug("merge::is_duplicate_idb() returning FALSE"); return FALSE; } } /* XXX - what do to if we have only one value? */ have_idb1_value = (wtap_block_get_string_option_value(idb1, OPT_IDB_NAME, &idb1_if_name) == WTAP_OPTTYPE_SUCCESS); have_idb2_value = (wtap_block_get_string_option_value(idb2, OPT_IDB_NAME, &idb2_if_name) == WTAP_OPTTYPE_SUCCESS); if (have_idb1_value && have_idb2_value) { merge_debug("g_strcmp0(idb1_if_name, idb2_if_name) == 0: %s", (g_strcmp0(idb1_if_name, idb2_if_name) == 0) ? "TRUE":"FALSE"); if (g_strcmp0(idb1_if_name, idb2_if_name) != 0) { merge_debug("merge::is_duplicate_idb() returning FALSE"); return FALSE; } } /* XXX - what do to if we have only one value? */ have_idb1_value = (wtap_block_get_string_option_value(idb1, OPT_IDB_DESCR, &idb1_if_description) == WTAP_OPTTYPE_SUCCESS); have_idb2_value = (wtap_block_get_string_option_value(idb2, OPT_IDB_DESCR, &idb2_if_description) == WTAP_OPTTYPE_SUCCESS); if (have_idb1_value && have_idb2_value) { merge_debug("g_strcmp0(idb1_if_description, idb2_if_description) == 0: %s", (g_strcmp0(idb1_if_description, idb2_if_description) == 0) ? "TRUE":"FALSE"); if (g_strcmp0(idb1_if_description, idb2_if_description) != 0) { merge_debug("merge::is_duplicate_idb() returning FALSE"); return FALSE; } } /* XXX - what do to if we have only one value? */ have_idb1_value = (wtap_block_get_string_option_value(idb1, OPT_IDB_OS, &idb1_if_os) == WTAP_OPTTYPE_SUCCESS); have_idb2_value = (wtap_block_get_string_option_value(idb2, OPT_IDB_OS, &idb2_if_os) == WTAP_OPTTYPE_SUCCESS); if (have_idb1_value && have_idb2_value) { merge_debug("g_strcmp0(idb1_if_os, idb2_if_os) == 0: %s", (g_strcmp0(idb1_if_os, idb2_if_os) == 0) ? "TRUE":"FALSE"); if (g_strcmp0(idb1_if_os, idb2_if_os) != 0) { merge_debug("merge::is_duplicate_idb() returning FALSE"); return FALSE; } } /* does not compare filters nor interface statistics */ merge_debug("merge::is_duplicate_idb() returning TRUE"); return TRUE; }