aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2005-01-19 04:49:29 +0000
committerGerald Combs <gerald@wireshark.org>2005-01-19 04:49:29 +0000
commit561fbc8b2580515702c5b491a83f8ca7e7cfe635 (patch)
treef8c9d31da31a83213b24c35d2a0a0438db5f690c /epan
parent5b84b7e764bf78c3c4d58bc192c775ea3fc606d1 (diff)
Add a field called "frame.protocols" which shows the protocols present
in the frame. The filter "frame.protocols contains ip:icmp:ip" could be used to find any ICMP packets containing IP headers. Clean up whitespace. svn path=/trunk/; revision=13118
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-frame.c18
-rw-r--r--epan/packet.c15
-rw-r--r--epan/packet_info.h15
3 files changed, 37 insertions, 11 deletions
diff --git a/epan/dissectors/packet-frame.c b/epan/dissectors/packet-frame.c
index e80ce51eda..5e7c57e788 100644
--- a/epan/dissectors/packet-frame.c
+++ b/epan/dissectors/packet-frame.c
@@ -46,6 +46,7 @@ static int hf_frame_p2p_dir = -1;
static int hf_frame_file_off = -1;
static int hf_frame_marked = -1;
static int hf_frame_ref_time = -1;
+static int hf_frame_protocols = -1;
static int proto_short = -1;
int proto_malformed = -1;
@@ -166,6 +167,10 @@ dissect_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
0, 0, cap_len, "Capture Length: %d byte%s", cap_len,
plurality(cap_len, "", "s"));
+ ti = proto_tree_add_string(fh_tree, hf_frame_protocols, tvb,
+ 0, 0, "");
+ pinfo->layer_names = g_string_new("");
+
/* Check for existences of P2P pseudo header */
if (pinfo->p2p_dir != P2P_DIR_UNKNOWN) {
proto_tree_add_uint(fh_tree, hf_frame_p2p_dir, tvb,
@@ -180,7 +185,6 @@ dissect_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
-
TRY {
if (!dissector_try_port(wtap_encap_dissector_table, pinfo->fd->lnk_t,
tvb, pinfo, tree)) {
@@ -198,8 +202,14 @@ dissect_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
ENDTRY;
+ if (tree) {
+ proto_item_append_string(ti, pinfo->layer_names->str);
+ g_string_free(pinfo->layer_names, TRUE);
+ pinfo->layer_names = NULL;
+ }
+
tap_queue_packet(frame_tap, pinfo, NULL);
-
+
if (mate_handle) call_dissector(mate_handle,tvb, pinfo, tree);
}
@@ -313,6 +323,10 @@ proto_register_frame(void)
{ &hf_frame_ref_time,
{ "This is a Ref Time frame", "frame.ref_time", FT_NONE, 0, NULL, 0x0,
"This frame is a Reference Time frame", HFILL }},
+
+ { &hf_frame_protocols,
+ { "Protocols in frame", "frame.protocols", FT_STRING, 0, NULL, 0x0,
+ "Protocols carried by this frame", HFILL }},
};
static gint *ett[] = {
&ett_frame,
diff --git a/epan/packet.c b/epan/packet.c
index 049a1bb824..f6c67e9541 100644
--- a/epan/packet.c
+++ b/epan/packet.c
@@ -299,6 +299,7 @@ dissect_packet(epan_dissect_t *edt, union wtap_pseudo_header *pseudo_header,
edt->pi.vsan = 0;
edt->pi.dcectxid = 0;
edt->pi.dcetransporttype = -1;
+ edt->pi.layer_names = NULL;
TRY {
edt->tvb = tvb_new_real_data(pd, fd->cap_len, fd->pkt_len);
@@ -431,6 +432,16 @@ call_dissector_work(dissector_handle_t handle, tvbuff_t *tvb,
if (handle->protocol != NULL) {
pinfo->current_proto =
proto_get_protocol_short_name(handle->protocol);
+
+ /*
+ * Add the protocol name to the layers
+ */
+ if (pinfo->layer_names) {
+ if (pinfo->layer_names->len > 0)
+ g_string_append(pinfo->layer_names, ":");
+ g_string_append(pinfo->layer_names,
+ proto_get_protocol_filter_name(proto_get_id(handle->protocol)));
+ }
}
if (pinfo->in_error_pkt) {
@@ -575,7 +586,7 @@ find_dissector_table(const char *name)
return g_hash_table_lookup( dissector_tables, name );
}
-/* Find an entry in a uint dissector table. */
+/* Find an entry in a uint dissector table. */
static dtbl_entry_t *
find_uint_dtbl_entry(dissector_table_t sub_dissectors, guint32 pattern)
{
@@ -821,7 +832,7 @@ dissector_get_port_handle(dissector_table_t sub_dissectors, guint32 port)
return NULL;
}
-/* Find an entry in a string dissector table. */
+/* Find an entry in a string dissector table. */
static dtbl_entry_t *
find_string_dtbl_entry(dissector_table_t sub_dissectors, const gchar *pattern)
{
diff --git a/epan/packet_info.h b/epan/packet_info.h
index bccf653f47..c37ae13511 100644
--- a/epan/packet_info.h
+++ b/epan/packet_info.h
@@ -85,13 +85,13 @@ typedef struct _packet_info {
guint16 want_pdu_tracking; /* >0 if the subdissector has specified
a value in 'bytes_until_next_pdu'.
When a dissector detects that the next PDU
- will start beyond the start of the next
- segment, it can set this value to 2
- and 'bytes_until_next_pdu' to the number of
- bytes beyond the next segment where the
+ will start beyond the start of the next
+ segment, it can set this value to 2
+ and 'bytes_until_next_pdu' to the number of
+ bytes beyond the next segment where the
next PDU starts.
- If the protocol dissector below this
+ If the protocol dissector below this
one is capable of PDU tracking it can
use this hint to detect PDUs that starts
unaligned to the segment boundaries.
@@ -99,7 +99,7 @@ typedef struct _packet_info {
(some) protocols to detect when a new PDU
starts in the middle of a tcp segment.
- There is intelligence in the glue between
+ There is intelligence in the glue between
dissector layers to make sure that this
request is only passed down to the protocol
immediately below the current one and not
@@ -107,7 +107,7 @@ typedef struct _packet_info {
*/
guint32 bytes_until_next_pdu;
-
+
int iplen;
int iphdrlen;
int p2p_dir;
@@ -131,6 +131,7 @@ typedef struct _packet_info {
* in the SCTP packet
*/
void *private_data; /* pointer to data passed from one dissector to another */
+ GString *layer_names; /* layers of each protocol */
} packet_info;
#endif /* __PACKET_INFO_H__ */