diff options
author | AndersBroman <anders.broman@ericsson.com> | 2018-08-15 10:00:19 +0200 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2018-08-16 07:43:09 +0000 |
commit | 0b297ce308c36ef1a0d10fcc976fe5d0436b25c1 (patch) | |
tree | 505241a4ec9be94908bf351f2cfbac389a68e902 /epan/dissectors/packet-gtp.c | |
parent | 15ef9039a772a99a98867e21278cb417b9842964 (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.c | 22 |
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); |