aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-gtp.c
diff options
context:
space:
mode:
authorAndersBroman <anders.broman@ericsson.com>2018-08-15 10:00:19 +0200
committerAnders Broman <a.broman58@gmail.com>2018-08-16 07:43:09 +0000
commit0b297ce308c36ef1a0d10fcc976fe5d0436b25c1 (patch)
tree505241a4ec9be94908bf351f2cfbac389a68e902 /epan/dissectors/packet-gtp.c
parent15ef9039a772a99a98867e21278cb417b9842964 (diff)
gtp: Create a dissector table for GTP header extensions.
Change-Id: Ied39f7c1f37fba7aeaf5fdebfbb7e03d8456588c Reviewed-on: https://code.wireshark.org/review/29150 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-gtp.c')
-rw-r--r--epan/dissectors/packet-gtp.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/epan/dissectors/packet-gtp.c b/epan/dissectors/packet-gtp.c
index 815662987f..7574524bb6 100644
--- a/epan/dissectors/packet-gtp.c
+++ b/epan/dissectors/packet-gtp.c
@@ -72,6 +72,7 @@ void proto_reg_handoff_gtp(void);
static dissector_table_t ppp_subdissector_table;
static dissector_table_t gtp_priv_ext_dissector_table;
static dissector_table_t gtp_cdr_fmt_dissector_table;
+static dissector_table_t gtp_hdr_ext_dissector_table;
static dissector_handle_t gtp_handle, gtp_prime_handle;
#define GTPv0_PORT 3386
@@ -9306,7 +9307,25 @@ dissect_gtp_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
break;
default:
- break;
+ {
+ tvbuff_t * ext_hdr_tvb;
+ int toffset, rem_len;
+
+ /* NOTE Type end lenght included in the call*/
+ ext_hdr_tvb = tvb_new_subset_remaining(tvb, offset - 2);
+ if ((toffset = dissector_try_uint(gtp_hdr_ext_dissector_table, next_hdr, ext_hdr_tvb, pinfo, ext_tree))) {
+ /* Dissector found*/
+ rem_len = tvb_reported_length(ext_hdr_tvb);
+ if (rem_len == toffset) {
+ /* All bytes consumed */
+ offset += ext_hdr_length * 4 - 2;
+
+ proto_tree_add_item(ext_tree, hf_gtp_ext_hdr_next, tvb, offset, 1, ENC_BIG_ENDIAN);
+ return tvb_reported_length(tvb);
+ }
+ }
+ break;
+ }
}
offset += ext_hdr_length*4 - 2;
@@ -10912,6 +10931,7 @@ proto_register_gtp(void)
gtp_priv_ext_dissector_table = register_dissector_table("gtp.priv_ext", "GTP Private Extension", proto_gtp, FT_UINT16, BASE_DEC);
gtp_cdr_fmt_dissector_table = register_dissector_table("gtp.cdr_fmt", "GTP Data Record Type", proto_gtp, FT_UINT16, BASE_DEC);
+ gtp_hdr_ext_dissector_table = register_dissector_table("gtp.hdr_ext", "GTP Header Extension", proto_gtp, FT_UINT16, BASE_DEC);
register_init_routine(gtp_init);
register_cleanup_routine(gtp_cleanup);