diff --git a/cfile.c b/cfile.c index 8fe484622c..50c532eb62 100644 --- a/cfile.c +++ b/cfile.c @@ -31,6 +31,29 @@ #include "cfile.h" +const char * +cap_file_get_interface_name(void *data, guint32 interface_id) +{ + capture_file *cf = (capture_file *) data; + wtapng_iface_descriptions_t *idb_info; + const wtapng_if_descr_t *wtapng_if_descr = NULL; + + idb_info = wtap_file_get_idb_info(cf->wth); + + if (interface_id < idb_info->number_of_interfaces) + wtapng_if_descr = &g_array_index(idb_info->interface_data, wtapng_if_descr_t, interface_id); + + g_free(idb_info); + + if (wtapng_if_descr) { + if (wtapng_if_descr->if_name) + return wtapng_if_descr->if_name; + else if (wtapng_if_descr->if_description) + return wtapng_if_descr->if_description; + } + return "unknown"; +} + void cap_file_init(capture_file *cf) { diff --git a/cfile.h b/cfile.h index e9fb2afb99..c1ff88f1b2 100644 --- a/cfile.h +++ b/cfile.h @@ -128,6 +128,8 @@ typedef struct _capture_file { extern void cap_file_init(capture_file *cf); +extern const char *cap_file_get_interface_name(void *data, guint32 interface_id); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/epan/dissectors/packet-frame.c b/epan/dissectors/packet-frame.c index c3e40f116d..1abdbe8d88 100644 --- a/epan/dissectors/packet-frame.c +++ b/epan/dissectors/packet-frame.c @@ -288,8 +288,14 @@ dissect_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) fh_tree = proto_item_add_subtree(ti, ett_frame); - if (pinfo->fd->flags.has_if_id) - proto_tree_add_uint(fh_tree, hf_frame_interface_id, tvb, 0, 0, pinfo->fd->interface_id); + if (pinfo->fd->flags.has_if_id && proto_field_is_referenced(tree, hf_frame_interface_id)) { + const char *interface_name = epan_get_interface_name(pinfo->epan, pinfo->fd->interface_id); + + if (interface_name) + proto_tree_add_uint_format_value(fh_tree, hf_frame_interface_id, tvb, 0, 0, pinfo->fd->interface_id, "%u (%s)", pinfo->fd->interface_id, interface_name); + else + proto_tree_add_uint(fh_tree, hf_frame_interface_id, tvb, 0, 0, pinfo->fd->interface_id); + } if (pinfo->fd->flags.has_pack_flags) { proto_tree *flags_tree; diff --git a/epan/epan-int.h b/epan/epan-int.h index 6580c55c26..0fa38d0427 100644 --- a/epan/epan-int.h +++ b/epan/epan-int.h @@ -30,6 +30,7 @@ struct epan_session { void *data; const nstime_t *(*get_frame_ts)(void *data, guint32 frame_num); + const char *(*get_interface_name)(void *data, guint32 interface_id); }; #endif diff --git a/epan/epan.c b/epan/epan.c index e4a7c2dd48..70db022c53 100644 --- a/epan/epan.c +++ b/epan/epan.c @@ -146,6 +146,15 @@ epan_new(void) return session; } +const char * +epan_get_interface_name(const epan_t *session, guint32 interface_id) +{ + if (session->get_interface_name) + return session->get_interface_name(session->data, interface_id); + + return NULL; +} + const nstime_t * epan_get_frame_ts(const epan_t *session, guint32 frame_num) { diff --git a/epan/epan.h b/epan/epan.h index 252d748ee8..63d1e41828 100644 --- a/epan/epan.h +++ b/epan/epan.h @@ -129,6 +129,8 @@ typedef struct epan_session epan_t; WS_DLL_PUBLIC epan_t *epan_new(void); +const char *epan_get_interface_name(const epan_t *session, guint32 interface_id); + const nstime_t *epan_get_frame_ts(const epan_t *session, guint32 frame_num); WS_DLL_PUBLIC void epan_free(epan_t *session); diff --git a/file.c b/file.c index e7c110b7c7..ef28127d52 100644 --- a/file.c +++ b/file.c @@ -303,7 +303,7 @@ static void compute_elapsed(GTimeVal *start_time) computed_elapsed = (gulong) (delta_time / 1000); /* ms */ } -const nstime_t * +static const nstime_t * ws_get_frame_ts(void *data, guint32 frame_num) { capture_file *cf = (capture_file *) data; @@ -330,6 +330,7 @@ ws_epan_new(capture_file *cf) epan->data = cf; epan->get_frame_ts = ws_get_frame_ts; + epan->get_interface_name = cap_file_get_interface_name; return epan; } diff --git a/rawshark.c b/rawshark.c index dcf86b96ea..69e417b495 100644 --- a/rawshark.c +++ b/rawshark.c @@ -1594,6 +1594,7 @@ raw_epan_new(capture_file *cf) epan->data = cf; epan->get_frame_ts = raw_get_frame_ts; + epan->get_interface_name = cap_file_get_interface_name; return epan; } diff --git a/tshark.c b/tshark.c index 115ecc12ee..0d48f1506b 100644 --- a/tshark.c +++ b/tshark.c @@ -2189,6 +2189,7 @@ tshark_epan_new(capture_file *cf) epan->data = cf; epan->get_frame_ts = tshark_get_frame_ts; + epan->get_interface_name = cap_file_get_interface_name; return epan; }