From 949079e2b4efbfc1136ccab15ecbefc72d0b6cf9 Mon Sep 17 00:00:00 2001 From: Anders Broman Date: Tue, 24 Apr 2012 12:33:00 +0000 Subject: From David Wei: Bug fixes and improvements to Sm (GTPv2) and SGmb (DIAMETER) dissectors. svn path=/trunk/; revision=42220 --- epan/dissectors/packet-diameter_3gpp.c | 48 +++++++++++++ epan/dissectors/packet-nas_eps.c | 127 +++++++++++++++++++-------------- 2 files changed, 122 insertions(+), 53 deletions(-) (limited to 'epan') diff --git a/epan/dissectors/packet-diameter_3gpp.c b/epan/dissectors/packet-diameter_3gpp.c index af34d90078..d13a641984 100644 --- a/epan/dissectors/packet-diameter_3gpp.c +++ b/epan/dissectors/packet-diameter_3gpp.c @@ -41,6 +41,7 @@ #include "packet-gsm_a_common.h" #include "packet-e164.h" #include "packet-e212.h" +#include "packet-ntp.h" /* Initialize the protocol and registered fields */ static int proto_diameter_3gpp = -1; @@ -105,6 +106,8 @@ static int hf_diameter_3gpp_idr_flags_bit1 = -1; static int hf_diameter_3gpp_idr_flags_bit2 = -1; static int hf_diameter_3gpp_idr_flags_bit3 = -1; static int hf_diameter_3gpp_idr_flags_bit4 = -1; +static int hf_diameter_3gpp_sgsn_ipv6_addr = -1; +static int hf_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer = -1; static gint diameter_3gpp_path_ett = -1; static gint diameter_3gpp_msisdn_ett = -1; static gint diameter_3gpp_feature_list_ett = -1; @@ -121,7 +124,18 @@ static gint diameter_3gpp_idr_flags_ett = -1; /* Dissector handles */ static dissector_handle_t xml_handle; +/* AVP Code: 15 3GPP-SGSN-IPv6-Address */ +static int +dissect_diameter_3gpp_sgsn_ipv6_addr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) +{ + int offset = 0; + proto_tree_add_item(tree, hf_diameter_3gpp_sgsn_ipv6_addr, tvb, offset, 16, ENC_BIG_ENDIAN); + + offset += 16; + + return offset; +} /* AVP Code: 600 Visited-Network-Identifier @@ -365,6 +379,21 @@ dissect_diameter_3gpp_mbms_required_qos(tvbuff_t *tvb, packet_info *pinfo, proto } +/* AVP Code: 929 MBMS-Data-Transfer-Start */ +/* AVP Code: 930 MBMS-Data-Transfer-Stop */ +static int +dissect_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) +{ + int offset = 0; + const gchar *time_str; + + time_str = tvb_ntp_fmt_ts(tvb, offset); + proto_tree_add_string(tree, hf_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer, tvb, offset, 8, time_str); + offset+=8; + + return offset; +} + /* AVP Code: 1405 ULR-Flags */ static int dissect_diameter_3gpp_ulr_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { @@ -605,6 +634,9 @@ proto_reg_handoff_diameter_3gpp(void) /* AVP Code: 5 3GPP-GPRS Negotiated QoS profile */ /* Registered by packet-gtp.c */ + /* AVP Code: 15 3GPP-SGSN-IPv6-Address */ + dissector_add_uint("diameter.3gpp", 15, new_create_dissector_handle(dissect_diameter_3gpp_sgsn_ipv6_addr, proto_diameter_3gpp)); + /* AVP Code: 22 3GPP-User-Location-Info * Registered by packet-gtpv2.c */ @@ -648,6 +680,12 @@ proto_reg_handoff_diameter_3gpp(void) /* AVP Code: 918 MBMS-BMSC-SSM-IP-Address */ dissector_add_uint("diameter.3gpp", 918, new_create_dissector_handle(dissect_diameter_3gpp_ipaddr, proto_diameter_3gpp)); + /* AVP Code: 929 MBMS-Data-Transfer-Start */ + dissector_add_uint("diameter.3gpp", 929, new_create_dissector_handle(dissect_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer, proto_diameter_3gpp)); + + /* AVP Code: 930 MBMS-Data-Transfer-Stop */ + dissector_add_uint("diameter.3gpp", 930, new_create_dissector_handle(dissect_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer, proto_diameter_3gpp)); + /* AVP Code: 1405 ULR-Flags */ dissector_add_uint("diameter.3gpp", 1405, new_create_dissector_handle(dissect_diameter_3gpp_ulr_flags, proto_diameter_3gpp)); @@ -981,6 +1019,16 @@ proto_register_diameter_3gpp(void) FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, NULL, HFILL } }, + { &hf_diameter_3gpp_sgsn_ipv6_addr, + { "SGSN IPv6 Address", "diameter.3gpp.sgsn_ipv6_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer, + { "Absolute Time of MBMS Data Transfer", "diameter.3gpp.mbms_abs_time_ofmbms_data_tfer", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, }; /* Setup protocol subtree array */ diff --git a/epan/dissectors/packet-nas_eps.c b/epan/dissectors/packet-nas_eps.c index 4e423fc0b4..1e858e1d0c 100644 --- a/epan/dissectors/packet-nas_eps.c +++ b/epan/dissectors/packet-nas_eps.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "packet-gsm_map.h" #include "packet-gsm_a_common.h" @@ -215,6 +216,7 @@ static int ett_nas_eps_cmn_add_info = -1; /* Global variables */ static packet_info *gpinfo; +static gboolean g_nas_eps_dissect_plain = FALSE; guint8 eps_nas_gen_msg_cont_type = 0; @@ -4491,6 +4493,56 @@ dissect_nas_eps_emm_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int } } + +static void +dissect_nas_eps_plain(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +{ + proto_item *item; + proto_tree *nas_eps_tree; + guint8 pd; + int offset = 0; + + /* Save pinfo */ + gpinfo = pinfo; + + /* make entry in the Protocol column on summary display */ + col_append_str(pinfo->cinfo, COL_PROTOCOL, "/NAS-EPS"); + + item = proto_tree_add_item(tree, proto_nas_eps, tvb, 0, -1, ENC_NA); + nas_eps_tree = proto_item_add_subtree(item, ett_nas_eps); + + pd = tvb_get_guint8(tvb,offset)&0x0f; + switch (pd){ + case 2: + /* EPS session management messages. + * Ref 3GPP TS 24.007 version 8.0.0 Release 8, Table 11.2: Protocol discriminator values + */ + disect_nas_eps_esm_msg(tvb, pinfo, nas_eps_tree, offset); + break; + case 7: + /* EPS mobility management messages. + * Ref 3GPP TS 24.007 version 8.0.0 Release 8, Table 11.2: Protocol discriminator values + */ + dissect_nas_eps_emm_msg(tvb, pinfo, nas_eps_tree, offset, TRUE); + break; + case 15: + /* Special conformance testing functions for User Equipment messages. + * Ref 3GPP TS 24.007 version 8.0.0 Release 8, Table 11.2: Protocol discriminator values + */ + if (gsm_a_dtap_handle){ + tvbuff_t *new_tvb = tvb_new_subset_remaining(tvb, offset); + call_dissector(gsm_a_dtap_handle, new_tvb,pinfo, nas_eps_tree); + break; + } /* else fall through default */ + default: + proto_tree_add_text(nas_eps_tree, tvb, offset, -1, "Not a NAS EPS PD %u(%s)", + pd, + val_to_str_const(pd, protocol_discriminator_vals, "unknown")); + break; + } + +} + /* TS 24.301 8.2.1 * 9 General message format and information elements coding * 9.1 Overview @@ -4532,9 +4584,21 @@ dissect_nas_eps(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) guint32 len; guint32 msg_auth_code; + len = tvb_length(tvb); + /* The protected NAS message header is 6 octets long, and the NAS message header is at least 2 octets long. */ + /* If the length of the tvbuffer is less than 8 octets, we can safely conclude the message is not protected. */ + if (len < 8) { + dissect_nas_eps_plain(tvb, pinfo, tree); + return; + } + + if (g_nas_eps_dissect_plain) { + dissect_nas_eps_plain(tvb, pinfo, tree); + return; + } + /* Save pinfo */ gpinfo = pinfo; - len = tvb_length(tvb); /* make entry in the Protocol column on summary display */ col_append_str(pinfo->cinfo, COL_PROTOCOL, "/NAS-EPS"); @@ -4630,59 +4694,18 @@ dissect_nas_eps(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } -static void -dissect_nas_eps_plain(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +void +proto_reg_handoff_nas_eps(void) { - proto_item *item; - proto_tree *nas_eps_tree; - guint8 pd; - int offset = 0; - - /* Save pinfo */ - gpinfo = pinfo; - - /* make entry in the Protocol column on summary display */ - col_append_str(pinfo->cinfo, COL_PROTOCOL, "/NAS-EPS"); - - item = proto_tree_add_item(tree, proto_nas_eps, tvb, 0, -1, ENC_NA); - nas_eps_tree = proto_item_add_subtree(item, ett_nas_eps); - - pd = tvb_get_guint8(tvb,offset)&0x0f; - switch (pd){ - case 2: - /* EPS session management messages. - * Ref 3GPP TS 24.007 version 8.0.0 Release 8, Table 11.2: Protocol discriminator values - */ - disect_nas_eps_esm_msg(tvb, pinfo, nas_eps_tree, offset); - break; - case 7: - /* EPS mobility management messages. - * Ref 3GPP TS 24.007 version 8.0.0 Release 8, Table 11.2: Protocol discriminator values - */ - dissect_nas_eps_emm_msg(tvb, pinfo, nas_eps_tree, offset, TRUE); - break; - case 15: - /* Special conformance testing functions for User Equipment messages. - * Ref 3GPP TS 24.007 version 8.0.0 Release 8, Table 11.2: Protocol discriminator values - */ - if (gsm_a_dtap_handle){ - tvbuff_t *new_tvb = tvb_new_subset_remaining(tvb, offset); - call_dissector(gsm_a_dtap_handle, new_tvb,pinfo, nas_eps_tree); - break; - } /* else fall through default */ - default: - proto_tree_add_text(nas_eps_tree, tvb, offset, -1, "Not a NAS EPS PD %u(%s)", - pd, - val_to_str_const(pd, protocol_discriminator_vals, "unknown")); - break; - } - + gsm_a_dtap_handle = find_dissector("gsm_a_dtap"); + lpp_handle = find_dissector("lpp"); } void proto_register_nas_eps(void) { guint i; guint last_offset; + module_t *nas_eps_module; /* List of fields */ @@ -5464,11 +5487,9 @@ proto_register_nas_eps(void) { /* Register dissector */ register_dissector("nas-eps_plain", dissect_nas_eps_plain, proto_nas_eps); -} -void -proto_reg_handoff_nas_eps(void) -{ - gsm_a_dtap_handle = find_dissector("gsm_a_dtap"); - lpp_handle = find_dissector("lpp"); + /* Register configuration options to always dissect as plain messages */ + nas_eps_module = prefs_register_protocol(proto_nas_eps, proto_reg_handoff_nas_eps); + + prefs_register_bool_preference(nas_eps_module, "dissect_plain", "Force dissect as plain NAS EPS", "Always dissect NAS EPS messages as plain", &g_nas_eps_dissect_plain); } -- cgit v1.2.3