diff options
author | Anders Broman <anders.broman@ericsson.com> | 2012-04-27 10:48:03 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2012-04-27 10:48:03 +0000 |
commit | a72f9abfc0c79a3920316140dc68a40a297da7aa (patch) | |
tree | 502b2bb6fe34b32f23c6abc6bd0227ae9a5ee945 | |
parent | 7eab849657682663b54bc4969312c3f76d490f27 (diff) | |
download | wireshark-a72f9abfc0c79a3920316140dc68a40a297da7aa.tar.gz |
From David Wei:
Further additions and fixes to MBMS in GTPv2 and DIAMETER dissectors.
svn path=/trunk/; revision=42289
-rw-r--r-- | epan/dissectors/packet-diameter_3gpp.c | 1399 | ||||
-rw-r--r-- | epan/dissectors/packet-gtpv2.c | 40 | ||||
-rw-r--r-- | epan/dissectors/packet-gtpv2.h | 1 |
3 files changed, 747 insertions, 693 deletions
diff --git a/epan/dissectors/packet-diameter_3gpp.c b/epan/dissectors/packet-diameter_3gpp.c index 83f7c97053..3ec6200828 100644 --- a/epan/dissectors/packet-diameter_3gpp.c +++ b/epan/dissectors/packet-diameter_3gpp.c @@ -44,18 +44,18 @@ #include "packet-ntp.h" /* Initialize the protocol and registered fields */ -static int proto_diameter_3gpp = -1; - -static int hf_diameter_3gpp_visited_nw_id = -1; -static int hf_diameter_3gpp_msisdn = -1; -static int hf_diameter_3gpp_path = -1; -static int hf_diameter_3gpp_contact = -1; -static int hf_diameter_3gpp_user_data = -1; -static int hf_diameter_3gpp_ipaddr = -1; -static int hf_diameter_3gpp_mbms_required_qos_prio = -1; -static int hf_diameter_3gpp_tmgi = -1; -static int hf_diameter_3gpp_service_ind = -1; -static int hf_diameter_mbms_service_id = -1; +static int proto_diameter_3gpp = -1; + +static int hf_diameter_3gpp_visited_nw_id = -1; +static int hf_diameter_3gpp_msisdn = -1; +static int hf_diameter_3gpp_path = -1; +static int hf_diameter_3gpp_contact = -1; +static int hf_diameter_3gpp_user_data = -1; +static int hf_diameter_3gpp_ipaddr = -1; +static int hf_diameter_3gpp_mbms_required_qos_prio = -1; +static int hf_diameter_3gpp_tmgi = -1; +static int hf_diameter_3gpp_service_ind = -1; +static int hf_diameter_mbms_service_id = -1; static int hf_diameter_address_digits = -1; static int hf_diameter_3gpp_spare_bits = -1; static int hf_diameter_3gpp_feature_list_flags = -1; @@ -106,12 +106,13 @@ 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_ipv6addr = -1; static int hf_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer = -1; +static int hf_diameter_3gpp_udp_port = -1; static gint diameter_3gpp_path_ett = -1; static gint diameter_3gpp_msisdn_ett = -1; static gint diameter_3gpp_feature_list_ett = -1; -static gint diameter_3gpp_tmgi_ett = -1; +static gint diameter_3gpp_tmgi_ett = -1; static gint diameter_3gpp_ulr_flags_ett = -1; static gint diameter_3gpp_ula_flags_ett = -1; static gint diameter_3gpp_dsr_flags_ett = -1; @@ -125,16 +126,17 @@ static gint diameter_3gpp_idr_flags_ett = -1; static dissector_handle_t xml_handle; /* AVP Code: 15 3GPP-SGSN-IPv6-Address */ +/* AVP Code: 917 MBMS-GGSN-IPv6-Address */ static int -dissect_diameter_3gpp_sgsn_ipv6_addr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) +dissect_diameter_3gpp_ipv6addr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - int offset = 0; + int offset = 0; - proto_tree_add_item(tree, hf_diameter_3gpp_sgsn_ipv6_addr, tvb, offset, 16, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_diameter_3gpp_ipv6addr, tvb, offset, 16, ENC_BIG_ENDIAN); - offset += 16; + offset += 16; - return offset; + return offset; } @@ -148,19 +150,19 @@ dissect_diameter_3gpp_sgsn_ipv6_addr(tvbuff_t *tvb, packet_info *pinfo _U_, prot static int dissect_diameter_3gpp_visited_nw_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - int offset = 0, i; - int length = tvb_length(tvb); + proto_item* item; + int offset = 0, i; + int length = tvb_length(tvb); - for(i = 0; i < length; i++) - if(!g_ascii_isprint(tvb_get_guint8(tvb, i))) - return length; + for(i = 0; i < length; i++) + if(!g_ascii_isprint(tvb_get_guint8(tvb, i))) + return length; - item = proto_tree_add_item(tree, hf_diameter_3gpp_visited_nw_id, tvb, offset, length, ENC_ASCII|ENC_NA); - PROTO_ITEM_SET_GENERATED(item); + item = proto_tree_add_item(tree, hf_diameter_3gpp_visited_nw_id, tvb, offset, length, ENC_ASCII|ENC_NA); + PROTO_ITEM_SET_GENERATED(item); - return length; + return length; } /* AVP Code: 630 Feature-List * imscxdx.xml @@ -170,13 +172,13 @@ dissect_diameter_3gpp_visited_nw_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto static int dissect_diameter_3gpp_feature_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - proto_tree *sub_tree; - int offset = 0; + proto_item* item; + proto_tree *sub_tree; + int offset = 0; guint32 bit_offset; - item = proto_tree_add_item(tree, hf_diameter_3gpp_feature_list_flags, tvb, offset, 4, ENC_BIG_ENDIAN); - sub_tree = proto_item_add_subtree(item, diameter_3gpp_feature_list_ett); + item = proto_tree_add_item(tree, hf_diameter_3gpp_feature_list_flags, tvb, offset, 4, ENC_BIG_ENDIAN); + sub_tree = proto_item_add_subtree(item, diameter_3gpp_feature_list_ett); bit_offset = 0; proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 29, ENC_BIG_ENDIAN); @@ -189,7 +191,7 @@ dissect_diameter_3gpp_feature_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_ bit_offset++; offset = bit_offset>>3; - return offset; + return offset; } @@ -203,26 +205,26 @@ dissect_diameter_3gpp_feature_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_ static int dissect_diameter_3gpp_path(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - proto_tree *sub_tree; - int offset = 0, comma_offset; - int end_offset = tvb_length(tvb) - 1; + proto_item* item; + proto_tree *sub_tree; + int offset = 0, comma_offset; + int end_offset = tvb_length(tvb) - 1; - item = proto_tree_add_text(tree, tvb, offset, -1,"Paths"); - sub_tree = proto_item_add_subtree(item,diameter_3gpp_path_ett); + item = proto_tree_add_text(tree, tvb, offset, -1,"Paths"); + sub_tree = proto_item_add_subtree(item,diameter_3gpp_path_ett); - while (offset < end_offset){ - comma_offset = tvb_find_guint8(tvb, offset, -1, ','); - if(comma_offset == -1){ - proto_tree_add_item(sub_tree, hf_diameter_3gpp_path, tvb, offset, comma_offset, ENC_ASCII|ENC_NA); - return end_offset; - } - proto_tree_add_item(sub_tree, hf_diameter_3gpp_path, tvb, offset, comma_offset, ENC_ASCII|ENC_NA); - offset = comma_offset+1; - } + while (offset < end_offset){ + comma_offset = tvb_find_guint8(tvb, offset, -1, ','); + if(comma_offset == -1){ + proto_tree_add_item(sub_tree, hf_diameter_3gpp_path, tvb, offset, comma_offset, ENC_ASCII|ENC_NA); + return end_offset; + } + proto_tree_add_item(sub_tree, hf_diameter_3gpp_path, tvb, offset, comma_offset, ENC_ASCII|ENC_NA); + offset = comma_offset+1; + } - return tvb_length(tvb); + return tvb_length(tvb); } /* AVP Code: 641 Contact @@ -235,63 +237,63 @@ dissect_diameter_3gpp_path(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr static int dissect_diameter_3gpp_contact(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - int offset = 0; + proto_item* item; + int offset = 0; - item = proto_tree_add_item(tree, hf_diameter_3gpp_contact, tvb, offset, -1, ENC_ASCII|ENC_NA); - PROTO_ITEM_SET_GENERATED(item); + item = proto_tree_add_item(tree, hf_diameter_3gpp_contact, tvb, offset, -1, ENC_ASCII|ENC_NA); + PROTO_ITEM_SET_GENERATED(item); - return tvb_length(tvb); + return tvb_length(tvb); } /* AVP Code: 701 MSISDN */ static int dissect_diameter_3gpp_msisdn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - proto_tree *sub_tree; - int offset = 0; - const char *digit_str; - int length = tvb_length(tvb); + proto_item* item; + proto_tree *sub_tree; + int offset = 0; + const char *digit_str; + int length = tvb_length(tvb); - item = proto_tree_add_item(tree, hf_diameter_3gpp_msisdn, tvb, offset, length, ENC_NA); - sub_tree = proto_item_add_subtree(item,diameter_3gpp_msisdn_ett); + item = proto_tree_add_item(tree, hf_diameter_3gpp_msisdn, tvb, offset, length, ENC_NA); + sub_tree = proto_item_add_subtree(item,diameter_3gpp_msisdn_ett); - dissect_e164_cc(tvb, sub_tree, offset, TRUE); + dissect_e164_cc(tvb, sub_tree, offset, TRUE); - digit_str = unpack_digits(tvb, 1); - proto_tree_add_string(sub_tree, hf_diameter_address_digits, tvb, 1, -1, digit_str); + digit_str = unpack_digits(tvb, 1); + proto_tree_add_string(sub_tree, hf_diameter_address_digits, tvb, 1, -1, digit_str); - return tvb_length(tvb); + return tvb_length(tvb); } -/* AVP Code: 702 User-Data +/* AVP Code: 702 User-Data * TGPPSh.xml * The AVP codes from 709 to799 are reserved for TS 29.329 */ -/* AVP Code: 606 User-Data +/* AVP Code: 606 User-Data * imscxdx.xml * IMS Cx Dx AVPS 3GPP TS 29.229 */ static int dissect_diameter_3gpp_user_data(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - guint8 word[6]; - int length = tvb_length(tvb); + guint8 word[6]; + int length = tvb_length(tvb); - /* If there is less than 38 characters this is not XML - * <?xml version="1.0" encoding="UTF-8"?> - */ - if(length < 38) - return length; + /* If there is less than 38 characters this is not XML + * <?xml version="1.0" encoding="UTF-8"?> + */ + if(length < 38) + return length; - tvb_get_nstringz0(tvb, 0, sizeof(word),word); - if (g_ascii_strncasecmp(word, "<?xml", 5) == 0){ - call_dissector(xml_handle, tvb, pinfo, tree); - } + tvb_get_nstringz0(tvb, 0, sizeof(word),word); + if (g_ascii_strncasecmp(word, "<?xml", 5) == 0){ + call_dissector(xml_handle, tvb, pinfo, tree); + } - return length; + return length; } @@ -301,41 +303,41 @@ dissect_diameter_3gpp_user_data(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre static int dissect_diameter_3gpp_service_ind(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - int offset = 0, i; - int length = tvb_length(tvb); + proto_item* item; + int offset = 0, i; + int length = tvb_length(tvb); - for(i = 0; i < length; i++) - if(!g_ascii_isprint(tvb_get_guint8(tvb, i))) - return length; + for(i = 0; i < length; i++) + if(!g_ascii_isprint(tvb_get_guint8(tvb, i))) + return length; - item = proto_tree_add_item(tree, hf_diameter_3gpp_service_ind, tvb, offset, length, ENC_ASCII|ENC_NA); - PROTO_ITEM_SET_GENERATED(item); + item = proto_tree_add_item(tree, hf_diameter_3gpp_service_ind, tvb, offset, length, ENC_ASCII|ENC_NA); + PROTO_ITEM_SET_GENERATED(item); - return length; + return length; } /* AVP Code: 900 TMGI */ static int dissect_diameter_3gpp_tmgi(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - proto_tree *sub_tree; - int offset = 0; + proto_item* item; + proto_tree *sub_tree; + int offset = 0; - item = proto_tree_add_item(tree, hf_diameter_3gpp_tmgi, tvb, offset, 6, ENC_NA); - sub_tree = proto_item_add_subtree(item,diameter_3gpp_tmgi_ett); + item = proto_tree_add_item(tree, hf_diameter_3gpp_tmgi, tvb, offset, 6, ENC_NA); + sub_tree = proto_item_add_subtree(item,diameter_3gpp_tmgi_ett); - /* MBMS Service ID consisting of three octets. MBMS Service ID consists of a 6-digit - * fixed-length hexadecimal number between 000000 and FFFFFF. - * MBMS Service ID uniquely identifies an MBMS bearer service within a PLMN. - */ + /* MBMS Service ID consisting of three octets. MBMS Service ID consists of a 6-digit + * fixed-length hexadecimal number between 000000 and FFFFFF. + * MBMS Service ID uniquely identifies an MBMS bearer service within a PLMN. + */ - proto_tree_add_item(sub_tree, hf_diameter_mbms_service_id, tvb, offset, 3, ENC_BIG_ENDIAN); - offset = offset+3; - offset = dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, offset, TRUE); + proto_tree_add_item(sub_tree, hf_diameter_mbms_service_id, tvb, offset, 3, ENC_BIG_ENDIAN); + offset = offset+3; + offset = dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, offset, TRUE); - return offset; + return offset; } @@ -345,12 +347,12 @@ dissect_diameter_3gpp_tmgi(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr static int dissect_diameter_3gpp_ipaddr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - int offset = 0; + int offset = 0; - proto_tree_add_item(tree, hf_diameter_3gpp_ipaddr, tvb, offset, 4, ENC_BIG_ENDIAN); - offset += 4; + proto_tree_add_item(tree, hf_diameter_3gpp_ipaddr, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; - return offset; + return offset; } @@ -358,73 +360,87 @@ dissect_diameter_3gpp_ipaddr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree * static int dissect_diameter_3gpp_mbms_required_qos(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - int offset = 0; - guint length; - - /* Octet - * 1 Allocation/Retention Priority as specified in 3GPP TS 23.107. - * This octet encodes each priority level defined in 3GPP TS 23.107 - * as the binary value of the priority level. It specifies the relative - * importance of the actual MBMS bearer service compared to other MBMS - * and non-MBMS bearer services for allocation and retention of the - * MBMS bearer service. - * 2-N QoS Profile as specified by the Quality-of-Service information element, - * from octet 3 onwards, in 3GPP TS 24.008 - */ - proto_tree_add_item(tree, hf_diameter_3gpp_mbms_required_qos_prio, tvb, offset, 1, ENC_BIG_ENDIAN); - offset++; - length = tvb_length(tvb) - 1; - de_sm_qos(tvb, tree, pinfo, offset,length, NULL, 0); - return offset+length; + int offset = 0; + guint length; + + /* Octet + * 1 Allocation/Retention Priority as specified in 3GPP TS 23.107. + * This octet encodes each priority level defined in 3GPP TS 23.107 + * as the binary value of the priority level. It specifies the relative + * importance of the actual MBMS bearer service compared to other MBMS + * and non-MBMS bearer services for allocation and retention of the + * MBMS bearer service. + * 2-N QoS Profile as specified by the Quality-of-Service information element, + * from octet 3 onwards, in 3GPP TS 24.008 + */ + proto_tree_add_item(tree, hf_diameter_3gpp_mbms_required_qos_prio, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + length = tvb_length(tvb) - 1; + de_sm_qos(tvb, tree, pinfo, offset,length, NULL, 0); + return offset+length; } +/* AVP Code: 926 MBMS-BMSC-SSM-UDP-Port */ +/* AVP Code: 927 MBMS-GW-UDP-Port */ +static int +dissect_diameter_3gpp_udp_port(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) +{ + int offset = 0; + + proto_tree_add_item(tree, hf_diameter_3gpp_udp_port, tvb, offset, 1, ENC_BIG_ENDIAN); + + offset += 1; + + return offset; +} + /* 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; + 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; + 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; + return offset; } /* AVP Code: 1405 ULR-Flags */ static int dissect_diameter_3gpp_ulr_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - proto_tree *sub_tree; - int offset = 0; - guint32 bit_offset; - - item = proto_tree_add_item(tree, hf_diameter_3gpp_ulr_flags, tvb, offset, 4, ENC_BIG_ENDIAN); - sub_tree = proto_item_add_subtree(item, diameter_3gpp_ulr_flags_ett); - bit_offset = 0; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 25, ENC_BIG_ENDIAN); - bit_offset+=25; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit6, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit5, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - offset = bit_offset>>3; - return offset; + proto_item* item; + proto_tree *sub_tree; + int offset = 0; + guint32 bit_offset; + + item = proto_tree_add_item(tree, hf_diameter_3gpp_ulr_flags, tvb, offset, 4, ENC_BIG_ENDIAN); + sub_tree = proto_item_add_subtree(item, diameter_3gpp_ulr_flags_ett); + bit_offset = 0; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 25, ENC_BIG_ENDIAN); + bit_offset+=25; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit6, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit5, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + offset = bit_offset>>3; + return offset; } @@ -432,21 +448,21 @@ dissect_diameter_3gpp_ulr_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre static int dissect_diameter_3gpp_ula_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - proto_tree *sub_tree; - int offset = 0; - guint32 bit_offset; + proto_item* item; + proto_tree *sub_tree; + int offset = 0; + guint32 bit_offset; - item = proto_tree_add_item(tree, hf_diameter_3gpp_ula_flags, tvb, offset, 4, ENC_BIG_ENDIAN); - sub_tree = proto_item_add_subtree(item, diameter_3gpp_ula_flags_ett); - bit_offset = 0; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 31, ENC_BIG_ENDIAN); - bit_offset+=31; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ula_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; + item = proto_tree_add_item(tree, hf_diameter_3gpp_ula_flags, tvb, offset, 4, ENC_BIG_ENDIAN); + sub_tree = proto_item_add_subtree(item, diameter_3gpp_ula_flags_ett); + bit_offset = 0; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 31, ENC_BIG_ENDIAN); + bit_offset+=31; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ula_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; - offset = bit_offset>>3; - return offset; + offset = bit_offset>>3; + return offset; } @@ -454,47 +470,47 @@ dissect_diameter_3gpp_ula_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre static int dissect_diameter_3gpp_dsr_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - proto_tree *sub_tree; - int offset = 0; - guint32 bit_offset; - - item = proto_tree_add_item(tree, hf_diameter_3gpp_dsr_flags, tvb, offset, 4, ENC_BIG_ENDIAN); - sub_tree = proto_item_add_subtree(item, diameter_3gpp_dsr_flags_ett); - bit_offset = 0; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 18, ENC_BIG_ENDIAN); - bit_offset+=18; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit13, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit12, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit11, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit10, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit9, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit8, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit7, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit6, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit5, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - offset = bit_offset>>3; - return offset; + proto_item* item; + proto_tree *sub_tree; + int offset = 0; + guint32 bit_offset; + + item = proto_tree_add_item(tree, hf_diameter_3gpp_dsr_flags, tvb, offset, 4, ENC_BIG_ENDIAN); + sub_tree = proto_item_add_subtree(item, diameter_3gpp_dsr_flags_ett); + bit_offset = 0; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 18, ENC_BIG_ENDIAN); + bit_offset+=18; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit13, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit12, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit11, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit10, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit9, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit8, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit7, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit6, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit5, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + offset = bit_offset>>3; + return offset; } @@ -502,21 +518,21 @@ dissect_diameter_3gpp_dsr_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre static int dissect_diameter_3gpp_dsa_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - proto_tree *sub_tree; - int offset = 0; - guint32 bit_offset; + proto_item* item; + proto_tree *sub_tree; + int offset = 0; + guint32 bit_offset; - item = proto_tree_add_item(tree, hf_diameter_3gpp_dsa_flags, tvb, offset, 4, ENC_BIG_ENDIAN); - sub_tree = proto_item_add_subtree(item, diameter_3gpp_dsa_flags_ett); - bit_offset = 0; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 31, ENC_BIG_ENDIAN); - bit_offset+=31; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsa_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; + item = proto_tree_add_item(tree, hf_diameter_3gpp_dsa_flags, tvb, offset, 4, ENC_BIG_ENDIAN); + sub_tree = proto_item_add_subtree(item, diameter_3gpp_dsa_flags_ett); + bit_offset = 0; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 31, ENC_BIG_ENDIAN); + bit_offset+=31; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsa_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; - offset = bit_offset>>3; - return offset; + offset = bit_offset>>3; + return offset; } @@ -524,21 +540,21 @@ dissect_diameter_3gpp_dsa_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre static int dissect_diameter_3gpp_ida_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - proto_tree *sub_tree; - int offset = 0; - guint32 bit_offset; + proto_item* item; + proto_tree *sub_tree; + int offset = 0; + guint32 bit_offset; - item = proto_tree_add_item(tree, hf_diameter_3gpp_ida_flags, tvb, offset, 4, ENC_BIG_ENDIAN); - sub_tree = proto_item_add_subtree(item, diameter_3gpp_ida_flags_ett); - bit_offset = 0; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 31, ENC_BIG_ENDIAN); - bit_offset+=31; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ida_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; + item = proto_tree_add_item(tree, hf_diameter_3gpp_ida_flags, tvb, offset, 4, ENC_BIG_ENDIAN); + sub_tree = proto_item_add_subtree(item, diameter_3gpp_ida_flags_ett); + bit_offset = 0; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 31, ENC_BIG_ENDIAN); + bit_offset+=31; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ida_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; - offset = bit_offset>>3; - return offset; + offset = bit_offset>>3; + return offset; } @@ -546,23 +562,23 @@ dissect_diameter_3gpp_ida_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre static int dissect_diameter_3gpp_pua_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - proto_tree *sub_tree; - int offset = 0; - guint32 bit_offset; + proto_item* item; + proto_tree *sub_tree; + int offset = 0; + guint32 bit_offset; - item = proto_tree_add_item(tree, hf_diameter_3gpp_pua_flags, tvb, offset, 4, ENC_BIG_ENDIAN); - sub_tree = proto_item_add_subtree(item, diameter_3gpp_pua_flags_ett); - bit_offset = 0; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 30, ENC_BIG_ENDIAN); - bit_offset+=30; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_pua_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_pua_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; + item = proto_tree_add_item(tree, hf_diameter_3gpp_pua_flags, tvb, offset, 4, ENC_BIG_ENDIAN); + sub_tree = proto_item_add_subtree(item, diameter_3gpp_pua_flags_ett); + bit_offset = 0; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 30, ENC_BIG_ENDIAN); + bit_offset+=30; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_pua_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_pua_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; - offset = bit_offset>>3; - return offset; + offset = bit_offset>>3; + return offset; } @@ -571,29 +587,29 @@ dissect_diameter_3gpp_pua_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre static int dissect_diameter_3gpp_nor_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - proto_tree *sub_tree; - int offset = 0; - guint32 bit_offset; - - item = proto_tree_add_item(tree, hf_diameter_3gpp_nor_flags, tvb, offset, 4, ENC_BIG_ENDIAN); - sub_tree = proto_item_add_subtree(item, diameter_3gpp_nor_flags_ett); - bit_offset = 0; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 27, ENC_BIG_ENDIAN); - bit_offset+=27; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - offset = bit_offset>>3; - return offset; + proto_item* item; + proto_tree *sub_tree; + int offset = 0; + guint32 bit_offset; + + item = proto_tree_add_item(tree, hf_diameter_3gpp_nor_flags, tvb, offset, 4, ENC_BIG_ENDIAN); + sub_tree = proto_item_add_subtree(item, diameter_3gpp_nor_flags_ett); + bit_offset = 0; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 27, ENC_BIG_ENDIAN); + bit_offset+=27; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + offset = bit_offset>>3; + return offset; } @@ -601,29 +617,29 @@ dissect_diameter_3gpp_nor_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre static int dissect_diameter_3gpp_idr_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { - proto_item* item; - proto_tree *sub_tree; - int offset = 0; - guint32 bit_offset; - - item = proto_tree_add_item(tree, hf_diameter_3gpp_idr_flags, tvb, offset, 4, ENC_BIG_ENDIAN); - sub_tree = proto_item_add_subtree(item, diameter_3gpp_idr_flags_ett); - bit_offset = 0; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 27, ENC_BIG_ENDIAN); - bit_offset+=27; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - offset = bit_offset>>3; - return offset; + proto_item* item; + proto_tree *sub_tree; + int offset = 0; + guint32 bit_offset; + + item = proto_tree_add_item(tree, hf_diameter_3gpp_idr_flags, tvb, offset, 4, ENC_BIG_ENDIAN); + sub_tree = proto_item_add_subtree(item, diameter_3gpp_idr_flags_ett); + bit_offset = 0; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 27, ENC_BIG_ENDIAN); + bit_offset+=27; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + offset = bit_offset>>3; + return offset; } @@ -631,86 +647,94 @@ void proto_reg_handoff_diameter_3gpp(void) { - /* AVP Code: 5 3GPP-GPRS Negotiated QoS profile */ - /* Registered by packet-gtp.c */ + /* 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_ipv6addr, proto_diameter_3gpp)); + + /* AVP Code: 22 3GPP-User-Location-Info + * Registered by packet-gtpv2.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: 600 Visited-Network-Identifier */ + dissector_add_uint("diameter.3gpp", 600, new_create_dissector_handle(dissect_diameter_3gpp_visited_nw_id, proto_diameter_3gpp)); - /* AVP Code: 22 3GPP-User-Location-Info - * Registered by packet-gtpv2.c - */ + /* AVP Code: 606 User-Data */ + dissector_add_uint("diameter.3gpp", 606, new_create_dissector_handle(dissect_diameter_3gpp_user_data, proto_diameter_3gpp)); - /* AVP Code: 600 Visited-Network-Identifier */ - dissector_add_uint("diameter.3gpp", 600, new_create_dissector_handle(dissect_diameter_3gpp_visited_nw_id, proto_diameter_3gpp)); + /* AVP Code: 630 Feature-List */ + dissector_add_uint("diameter.3gpp", 630, new_create_dissector_handle(dissect_diameter_3gpp_feature_list, proto_diameter_3gpp)); - /* AVP Code: 606 User-Data */ - dissector_add_uint("diameter.3gpp", 606, new_create_dissector_handle(dissect_diameter_3gpp_user_data, proto_diameter_3gpp)); + /* AVP Code: 640 Path */ + dissector_add_uint("diameter.3gpp", 640, new_create_dissector_handle(dissect_diameter_3gpp_path, proto_diameter_3gpp)); - /* AVP Code: 630 Feature-List */ - dissector_add_uint("diameter.3gpp", 630, new_create_dissector_handle(dissect_diameter_3gpp_feature_list, proto_diameter_3gpp)); + /* AVP Code: 641 Contact */ + dissector_add_uint("diameter.3gpp", 641, new_create_dissector_handle(dissect_diameter_3gpp_contact, proto_diameter_3gpp)); - /* AVP Code: 640 Path */ - dissector_add_uint("diameter.3gpp", 640, new_create_dissector_handle(dissect_diameter_3gpp_path, proto_diameter_3gpp)); + /* AVP Code: 701 MSISDN */ + dissector_add_uint("diameter.3gpp", 701, new_create_dissector_handle(dissect_diameter_3gpp_msisdn, proto_diameter_3gpp)); - /* AVP Code: 641 Contact */ - dissector_add_uint("diameter.3gpp", 641, new_create_dissector_handle(dissect_diameter_3gpp_contact, proto_diameter_3gpp)); + /* AVP Code: 702 User-Data */ + dissector_add_uint("diameter.3gpp", 702, new_create_dissector_handle(dissect_diameter_3gpp_user_data, proto_diameter_3gpp)); - /* AVP Code: 701 MSISDN */ - dissector_add_uint("diameter.3gpp", 701, new_create_dissector_handle(dissect_diameter_3gpp_msisdn, proto_diameter_3gpp)); + /* AVP Code: 704 Service-Indication */ + dissector_add_uint("diameter.3gpp", 704, new_create_dissector_handle(dissect_diameter_3gpp_service_ind, proto_diameter_3gpp)); - /* AVP Code: 702 User-Data */ - dissector_add_uint("diameter.3gpp", 702, new_create_dissector_handle(dissect_diameter_3gpp_user_data, proto_diameter_3gpp)); + /* AVP Code: 900 TMGI */ + dissector_add_uint("diameter.3gpp", 900, new_create_dissector_handle(dissect_diameter_3gpp_tmgi, proto_diameter_3gpp)); - /* AVP Code: 704 Service-Indication */ - dissector_add_uint("diameter.3gpp", 704, new_create_dissector_handle(dissect_diameter_3gpp_service_ind, proto_diameter_3gpp)); + /* AVP Code: 904 MBMS-Session-Duration Registered by packet-gtp.c */ + /* AVP Code: 903 MBMS-Service-Area Registered by packet-gtp.c */ - /* AVP Code: 900 TMGI */ - dissector_add_uint("diameter.3gpp", 900, new_create_dissector_handle(dissect_diameter_3gpp_tmgi, proto_diameter_3gpp)); + /* AVP Code: 911 MBMS-Time-To-Data-Transfer Registered by packet-gtp.c */ + /* Registered by packet-gtp.c */ - /* AVP Code: 904 MBMS-Session-Duration Registered by packet-gtp.c */ - /* AVP Code: 903 MBMS-Service-Area Registered by packet-gtp.c */ + /* AVP Code: 913 MBMS-Required-QoS */ + dissector_add_uint("diameter.3gpp", 913, new_create_dissector_handle(dissect_diameter_3gpp_mbms_required_qos, proto_diameter_3gpp)); - /* AVP Code: 911 MBMS-Time-To-Data-Transfer Registered by packet-gtp.c */ - /* Registered by packet-gtp.c */ + /* AVP Code: 917 MBMS-GGSN-IPv6-Address */ + dissector_add_uint("diameter.3gpp", 917, new_create_dissector_handle(dissect_diameter_3gpp_ipv6addr, proto_diameter_3gpp)); - /* AVP Code: 913 MBMS-Required-QoS */ - dissector_add_uint("diameter.3gpp", 913, new_create_dissector_handle(dissect_diameter_3gpp_mbms_required_qos, proto_diameter_3gpp)); + /* 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: 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: 926 MBMS-BMSC-SSM-UDP-Port */ + /* AVP Code: 927 MBMS-GW-UDP-Port */ + dissector_add_uint("diameter.3gpp", 926, new_create_dissector_handle(dissect_diameter_3gpp_udp_port, proto_diameter_3gpp)); + dissector_add_uint("diameter.3gpp", 927, new_create_dissector_handle(dissect_diameter_3gpp_udp_port, 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: 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: 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)); + /* AVP Code: 1405 ULR-Flags */ + dissector_add_uint("diameter.3gpp", 1405, new_create_dissector_handle(dissect_diameter_3gpp_ulr_flags, proto_diameter_3gpp)); - /* AVP Code: 1406 ULA-Flags */ - dissector_add_uint("diameter.3gpp", 1406, new_create_dissector_handle(dissect_diameter_3gpp_ula_flags, proto_diameter_3gpp)); + /* AVP Code: 1406 ULA-Flags */ + dissector_add_uint("diameter.3gpp", 1406, new_create_dissector_handle(dissect_diameter_3gpp_ula_flags, proto_diameter_3gpp)); - /* AVP Code: 1421 DSR-Flags */ - dissector_add_uint("diameter.3gpp", 1421, new_create_dissector_handle(dissect_diameter_3gpp_dsr_flags, proto_diameter_3gpp)); + /* AVP Code: 1421 DSR-Flags */ + dissector_add_uint("diameter.3gpp", 1421, new_create_dissector_handle(dissect_diameter_3gpp_dsr_flags, proto_diameter_3gpp)); - /* AVP Code: 1422 DSA-Flags */ - dissector_add_uint("diameter.3gpp", 1422, new_create_dissector_handle(dissect_diameter_3gpp_dsa_flags, proto_diameter_3gpp)); + /* AVP Code: 1422 DSA-Flags */ + dissector_add_uint("diameter.3gpp", 1422, new_create_dissector_handle(dissect_diameter_3gpp_dsa_flags, proto_diameter_3gpp)); - /* AVP Code: 1441 IDA-Flags */ - dissector_add_uint("diameter.3gpp", 1441, new_create_dissector_handle(dissect_diameter_3gpp_ida_flags, proto_diameter_3gpp)); + /* AVP Code: 1441 IDA-Flags */ + dissector_add_uint("diameter.3gpp", 1441, new_create_dissector_handle(dissect_diameter_3gpp_ida_flags, proto_diameter_3gpp)); - /* AVP Code: 1442 PUA-Flags */ - dissector_add_uint("diameter.3gpp", 1442, new_create_dissector_handle(dissect_diameter_3gpp_pua_flags, proto_diameter_3gpp)); + /* AVP Code: 1442 PUA-Flags */ + dissector_add_uint("diameter.3gpp", 1442, new_create_dissector_handle(dissect_diameter_3gpp_pua_flags, proto_diameter_3gpp)); - /* AVP Code: 1443 NOR-Flags */ - dissector_add_uint("diameter.3gpp", 1443, new_create_dissector_handle(dissect_diameter_3gpp_nor_flags, proto_diameter_3gpp)); + /* AVP Code: 1443 NOR-Flags */ + dissector_add_uint("diameter.3gpp", 1443, new_create_dissector_handle(dissect_diameter_3gpp_nor_flags, proto_diameter_3gpp)); - /* AVP Code: 1490 IDR-Flags */ - dissector_add_uint("diameter.3gpp", 1490, new_create_dissector_handle(dissect_diameter_3gpp_idr_flags, proto_diameter_3gpp)); + /* AVP Code: 1490 IDR-Flags */ + dissector_add_uint("diameter.3gpp", 1490, new_create_dissector_handle(dissect_diameter_3gpp_idr_flags, proto_diameter_3gpp)); - xml_handle = find_dissector("xml"); + xml_handle = find_dissector("xml"); } void @@ -718,337 +742,342 @@ proto_register_diameter_3gpp(void) { /* Setup list of header fields See Section 1.6.1 for details*/ - static hf_register_info hf[] = { - { &hf_diameter_3gpp_path, - { "Path", "diameter.3gpp.path", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_contact, - { "Contact", "diameter.3gpp.contact", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_visited_nw_id, - { "Visited-Network-Identifier", "diameter.3gpp.visited_nw_id", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_msisdn, - { "MSISDN", "diameter.3gpp.msisdn", - FT_BYTES, BASE_NONE, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_user_data, - { "User data", "diameter.3gpp.user_data", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ipaddr, - { "IPv4 Address", "diameter.3gpp.ipaddr", - FT_IPv4, BASE_NONE, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_mbms_required_qos_prio, - { "Allocation/Retention Priority", "diameter.3gpp.mbms_required_qos_prio", - FT_UINT8, BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_tmgi, - { "TMGI", "diameter.3gpp.tmgi", - FT_BYTES, BASE_NONE, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_service_ind, - { "Service-Indication", "diameter.3gpp.service_ind", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_mbms_service_id, - { "MBMS Service ID", "diameter.3gpp.mbms_service_id", - FT_UINT24, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_address_digits, - { "Address digits", "diameter.3gpp.address_digits", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_spare_bits, - { "Spare bit(s)", "diameter.3gpp.spare_bits", - FT_UINT32, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_feature_list_flags, - { "Feature-List Flags", "diameter.3gpp.feature_list_flags", - FT_UINT32, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_feature_list_flags_bit0, - { "Shared IFC Sets", "diameter.3gpp.feature_list_flags_bit0", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_feature_list_flags_bit1, - { "Alias Indication", "diameter.3gpp.feature_list_flags_bit1", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_feature_list_flags_bit2, - { "IMS Restoration Indication", "diameter.3gpp.feature_list_flags_bit2", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ulr_flags, - { "ULR Flags", "diameter.3gpp.ulr_flags", - FT_UINT32, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ulr_flags_bit0, - { "Single-Registration-Indication", "diameter.3gpp.ulr_flags_bit0", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ulr_flags_bit1, - { "S6a/S6d-Indicator", "diameter.3gpp.ulr_flags_bit1", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ulr_flags_bit2, - { "Skip-Subscriber-Data", "diameter.3gpp.ulr_flags_bit2", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ulr_flags_bit3, - { "GPRS-Subscription-Data-Indicator", "diameter.3gpp.ulr_flags_bit3", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ulr_flags_bit4, - { "Node-Type-Indicator", "diameter.3gpp.ulr_flags_bit4", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ulr_flags_bit5, - { "Initial-Attach-Indicator", "diameter.3gpp.ulr_flags_bit5", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ulr_flags_bit6, - { "PS-LCS-Not-Supported-By-UE", "diameter.3gpp.ulr_flags_bit6", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ula_flags, - { "ULA Flags", "diameter.3gpp.ula_flags", - FT_UINT32, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ula_flags_bit0, - { "Separation Indication", "diameter.3gpp.ula_flags_bit0", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags, - { "DSR Flags", "diameter.3gpp.dsr_flags", - FT_UINT32, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit0, - { "Regional Subscription Withdrawal", "diameter.3gpp.dsr_flags_bit0", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit1, - { "Complete APN Configuration Profile Withdrawal", "diameter.3gpp.dsr_flags_bit1", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit2, - { "Subscribed Charging Characteristics Withdrawal", "diameter.3gpp.dsr_flags_bit2", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit3, - { "PDN subscription contexts Withdrawal", "diameter.3gpp.dsr_flags_bit3", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit4, - { "STN-SR", "diameter.3gpp.dsr_flags_bit4", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit5, - { "Complete PDP context list Withdrawal", "diameter.3gpp.dsr_flags_bit5", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit6, - { "PDP contexts Withdrawal", "diameter.3gpp.dsr_flags_bit6", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit7, - { "Roaming Restricted due to unsupported feature", "diameter.3gpp.dsr_flags_bit7", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit8, - { "Trace Data Withdrawal", "diameter.3gpp.dsr_flags_bit8", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit9, - { "CSG Deleted", "diameter.3gpp.dsr_flags_bit9", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit10, - { "APN-OI-Replacement", "diameter.3gpp.dsr_flags_bit10", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit11, - { "GMLC List Withdrawal", "diameter.3gpp.dsr_flags_bit11", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit12, - { "LCS Withdrawal", "diameter.3gpp.dsr_flags_bit12", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsr_flags_bit13, - { "SMS Withdrawal", "diameter.3gpp.dsr_flags_bit13", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsa_flags, - { "DSA Flags", "diameter.3gpp.dsa_flags", - FT_UINT32, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_dsa_flags_bit0, - { "Network Node area restricted", "diameter.3gpp.dsa_flags_bit0", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ida_flags, - { "IDA Flags", "diameter.3gpp.ida_flags", - FT_UINT32, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_ida_flags_bit0, - { "Network Node area restricted", "diameter.3gpp.ida_flags_bit0", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_pua_flags, - { "PUA Flags", "diameter.3gpp.pua_flags", - FT_UINT32, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_pua_flags_bit0, - { "Freeze M-TMSI", "diameter.3gpp.pua_flags_bit0", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_pua_flags_bit1, - { "Freeze P-TMSI", "diameter.3gpp.pua_flags_bit1", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_nor_flags, - { "NOR Flags", "diameter.3gpp.nor_flags", - FT_UINT32, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_nor_flags_bit0, - { "Single-Registration-Indication", "diameter.3gpp.nor_flags_bit0", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_nor_flags_bit1, - { "SGSN area restricted", "diameter.3gpp.nor_flags_bit1", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_nor_flags_bit2, - { "Ready for SM", "diameter.3gpp.nor_flags_bit2", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_nor_flags_bit3, - { "UE Reachable", "diameter.3gpp.nor_flags_bit3", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_nor_flags_bit4, - { "Delete all APN and PDN GW identity pairs", "diameter.3gpp.nor_flags_bit4", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_idr_flags, - { "IDR Flags", "diameter.3gpp.idr_flags", - FT_UINT32, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_idr_flags_bit0, - { "UE Reachability Request", "diameter.3gpp.idr_flags_bit0", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_idr_flags_bit1, - { "T-ADS Data Request", "diameter.3gpp.idr_flags_bit1", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_idr_flags_bit2, - { "EPS User State Request", "diameter.3gpp.idr_flags_bit2", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_idr_flags_bit3, - { "EPS Location Information Request", "diameter.3gpp.idr_flags_bit3", - FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, - NULL, HFILL } - }, - { &hf_diameter_3gpp_idr_flags_bit4, - { "Current Location Request", "diameter.3gpp.idr_flags_bit4", - 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 */ - static gint *ett[] = { - &diameter_3gpp_path_ett, - &diameter_3gpp_msisdn_ett, - &diameter_3gpp_feature_list_ett, - &diameter_3gpp_tmgi_ett, - &diameter_3gpp_ulr_flags_ett, - &diameter_3gpp_ula_flags_ett, - &diameter_3gpp_dsr_flags_ett, - &diameter_3gpp_dsa_flags_ett, - &diameter_3gpp_ida_flags_ett, - &diameter_3gpp_pua_flags_ett, - &diameter_3gpp_nor_flags_ett, - &diameter_3gpp_idr_flags_ett, - }; - - /* Required function calls to register the header fields and subtrees used */ - proto_diameter_3gpp = proto_register_protocol("Diameter 3GPP","Diameter3GPP", "diameter3gpp"); - proto_register_field_array(proto_diameter_3gpp, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); + static hf_register_info hf[] = { + { &hf_diameter_3gpp_path, + { "Path", "diameter.3gpp.path", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_contact, + { "Contact", "diameter.3gpp.contact", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_visited_nw_id, + { "Visited-Network-Identifier", "diameter.3gpp.visited_nw_id", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_msisdn, + { "MSISDN", "diameter.3gpp.msisdn", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_user_data, + { "User data", "diameter.3gpp.user_data", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ipaddr, + { "IPv4 Address", "diameter.3gpp.ipaddr", + FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_mbms_required_qos_prio, + { "Allocation/Retention Priority", "diameter.3gpp.mbms_required_qos_prio", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_tmgi, + { "TMGI", "diameter.3gpp.tmgi", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_service_ind, + { "Service-Indication", "diameter.3gpp.service_ind", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_mbms_service_id, + { "MBMS Service ID", "diameter.3gpp.mbms_service_id", + FT_UINT24, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_address_digits, + { "Address digits", "diameter.3gpp.address_digits", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_spare_bits, + { "Spare bit(s)", "diameter.3gpp.spare_bits", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list_flags, + { "Feature-List Flags", "diameter.3gpp.feature_list_flags", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list_flags_bit0, + { "Shared IFC Sets", "diameter.3gpp.feature_list_flags_bit0", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list_flags_bit1, + { "Alias Indication", "diameter.3gpp.feature_list_flags_bit1", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list_flags_bit2, + { "IMS Restoration Indication", "diameter.3gpp.feature_list_flags_bit2", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ulr_flags, + { "ULR Flags", "diameter.3gpp.ulr_flags", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ulr_flags_bit0, + { "Single-Registration-Indication", "diameter.3gpp.ulr_flags_bit0", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ulr_flags_bit1, + { "S6a/S6d-Indicator", "diameter.3gpp.ulr_flags_bit1", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ulr_flags_bit2, + { "Skip-Subscriber-Data", "diameter.3gpp.ulr_flags_bit2", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ulr_flags_bit3, + { "GPRS-Subscription-Data-Indicator", "diameter.3gpp.ulr_flags_bit3", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ulr_flags_bit4, + { "Node-Type-Indicator", "diameter.3gpp.ulr_flags_bit4", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ulr_flags_bit5, + { "Initial-Attach-Indicator", "diameter.3gpp.ulr_flags_bit5", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ulr_flags_bit6, + { "PS-LCS-Not-Supported-By-UE", "diameter.3gpp.ulr_flags_bit6", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ula_flags, + { "ULA Flags", "diameter.3gpp.ula_flags", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ula_flags_bit0, + { "Separation Indication", "diameter.3gpp.ula_flags_bit0", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags, + { "DSR Flags", "diameter.3gpp.dsr_flags", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit0, + { "Regional Subscription Withdrawal", "diameter.3gpp.dsr_flags_bit0", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit1, + { "Complete APN Configuration Profile Withdrawal", "diameter.3gpp.dsr_flags_bit1", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit2, + { "Subscribed Charging Characteristics Withdrawal", "diameter.3gpp.dsr_flags_bit2", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit3, + { "PDN subscription contexts Withdrawal", "diameter.3gpp.dsr_flags_bit3", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit4, + { "STN-SR", "diameter.3gpp.dsr_flags_bit4", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit5, + { "Complete PDP context list Withdrawal", "diameter.3gpp.dsr_flags_bit5", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit6, + { "PDP contexts Withdrawal", "diameter.3gpp.dsr_flags_bit6", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit7, + { "Roaming Restricted due to unsupported feature", "diameter.3gpp.dsr_flags_bit7", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit8, + { "Trace Data Withdrawal", "diameter.3gpp.dsr_flags_bit8", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit9, + { "CSG Deleted", "diameter.3gpp.dsr_flags_bit9", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit10, + { "APN-OI-Replacement", "diameter.3gpp.dsr_flags_bit10", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit11, + { "GMLC List Withdrawal", "diameter.3gpp.dsr_flags_bit11", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit12, + { "LCS Withdrawal", "diameter.3gpp.dsr_flags_bit12", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsr_flags_bit13, + { "SMS Withdrawal", "diameter.3gpp.dsr_flags_bit13", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsa_flags, + { "DSA Flags", "diameter.3gpp.dsa_flags", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_dsa_flags_bit0, + { "Network Node area restricted", "diameter.3gpp.dsa_flags_bit0", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ida_flags, + { "IDA Flags", "diameter.3gpp.ida_flags", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ida_flags_bit0, + { "Network Node area restricted", "diameter.3gpp.ida_flags_bit0", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_pua_flags, + { "PUA Flags", "diameter.3gpp.pua_flags", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_pua_flags_bit0, + { "Freeze M-TMSI", "diameter.3gpp.pua_flags_bit0", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_pua_flags_bit1, + { "Freeze P-TMSI", "diameter.3gpp.pua_flags_bit1", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_nor_flags, + { "NOR Flags", "diameter.3gpp.nor_flags", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_nor_flags_bit0, + { "Single-Registration-Indication", "diameter.3gpp.nor_flags_bit0", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_nor_flags_bit1, + { "SGSN area restricted", "diameter.3gpp.nor_flags_bit1", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_nor_flags_bit2, + { "Ready for SM", "diameter.3gpp.nor_flags_bit2", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_nor_flags_bit3, + { "UE Reachable", "diameter.3gpp.nor_flags_bit3", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_nor_flags_bit4, + { "Delete all APN and PDN GW identity pairs", "diameter.3gpp.nor_flags_bit4", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_idr_flags, + { "IDR Flags", "diameter.3gpp.idr_flags", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_idr_flags_bit0, + { "UE Reachability Request", "diameter.3gpp.idr_flags_bit0", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_idr_flags_bit1, + { "T-ADS Data Request", "diameter.3gpp.idr_flags_bit1", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_idr_flags_bit2, + { "EPS User State Request", "diameter.3gpp.idr_flags_bit2", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_idr_flags_bit3, + { "EPS Location Information Request", "diameter.3gpp.idr_flags_bit3", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_idr_flags_bit4, + { "Current Location Request", "diameter.3gpp.idr_flags_bit4", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_ipv6addr, + { "IPv6 Address", "diameter.3gpp.ipv6addr", + 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 } + }, + { &hf_diameter_3gpp_udp_port , + { "UDP Port", "diameter.3gpp.udp_port", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + }; + + /* Setup protocol subtree array */ + static gint *ett[] = { + &diameter_3gpp_path_ett, + &diameter_3gpp_msisdn_ett, + &diameter_3gpp_feature_list_ett, + &diameter_3gpp_tmgi_ett, + &diameter_3gpp_ulr_flags_ett, + &diameter_3gpp_ula_flags_ett, + &diameter_3gpp_dsr_flags_ett, + &diameter_3gpp_dsa_flags_ett, + &diameter_3gpp_ida_flags_ett, + &diameter_3gpp_pua_flags_ett, + &diameter_3gpp_nor_flags_ett, + &diameter_3gpp_idr_flags_ett, + }; + + /* Required function calls to register the header fields and subtrees used */ + proto_diameter_3gpp = proto_register_protocol("Diameter 3GPP","Diameter3GPP", "diameter3gpp"); + proto_register_field_array(proto_diameter_3gpp, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); } diff --git a/epan/dissectors/packet-gtpv2.c b/epan/dissectors/packet-gtpv2.c index 59e85d5e5c..0fff57c217 100644 --- a/epan/dissectors/packet-gtpv2.c +++ b/epan/dissectors/packet-gtpv2.c @@ -371,6 +371,9 @@ static int hf_gtpv2_abs_time_mbms_data = -1; static int hf_gtpv2_mbms_session_duration_days = -1; static int hf_gtpv2_mbms_session_duration_secs = -1; static int hf_gtpv2_time_to_data_xfer = -1; +static int hf_gtpv2_arp_pvi = -1; +static int hf_gtpv2_arp_pl = -1; +static int hf_gtpv2_arp_pci = -1; static gint ett_gtpv2 = -1; static gint ett_gtpv2_flags = -1; @@ -4316,6 +4319,7 @@ dissect_gtpv2_mbms_session_duration(tvbuff_t *tvb, packet_info *pinfo _U_, proto int bit_offset = 0; guint32 days; guint32 hours; + guint32 minutes; guint32 seconds; /* From 3GPP TS 29.061 17.7.7 MBMS-Session-Duration AVP */ @@ -4337,12 +4341,13 @@ dissect_gtpv2_mbms_session_duration(tvbuff_t *tvb, packet_info *pinfo _U_, proto proto_tree_add_item(tree, hf_gtpv2_mbms_session_duration_secs, tvb, offset, 3, ENC_BIG_ENDIAN); proto_item_append_text(item, "Indefinite (always-on)"); } else { - hours = seconds / 60; - seconds = seconds % 60; + hours = seconds / 3600; + minutes = (seconds % 3600) / 60; + seconds = (seconds % 3600) % 60; proto_tree_add_item(tree, hf_gtpv2_mbms_session_duration_days, tvb, offset, 3, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_gtpv2_mbms_session_duration_secs, tvb, offset, 3, ENC_BIG_ENDIAN); - proto_item_append_text(item, "%d day(s), %d hour(s), %d second(s)", days, hours, seconds); + proto_item_append_text(item, "%d days %02d:%02d:%02d (DD days HH:MM:SS)", days, hours, minutes, seconds); } offset += 3; @@ -4619,14 +4624,18 @@ dissect_gtpv2_throttling(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree } /* 8.86 Allocation/Retention Priority (ARP) */ -static void +void dissect_gtpv2_arp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_) { - proto_item *expert_item; + int offset = 0; - expert_item = proto_tree_add_text(tree, tvb, 0, length, "IE data not dissected yet"); - expert_add_info_format(pinfo, expert_item, PI_PROTOCOL, PI_NOTE, "IE data not dissected yet"); - PROTO_ITEM_SET_GENERATED(expert_item); + proto_tree_add_item(tree, hf_gtpv2_arp_pvi, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gtpv2_arp_pl, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gtpv2_arp_pci, tvb, offset, 1, ENC_BIG_ENDIAN); + + offset += 1; + if(length > 1) + proto_tree_add_text(tree, tvb, offset, length-1, "Spare: %s", tvb_bytes_to_str(tvb, offset, length-1)); } /* 8.87 EPC Timer */ @@ -6531,6 +6540,21 @@ void proto_register_gtpv2(void) FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL} }, + { &hf_gtpv2_arp_pvi, + {"Pre-emption Vulnerability (PVI)", "gtpv2.arp_pvi", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL} + }, + { &hf_gtpv2_arp_pl, + {"Priority Level", "gtpv2.arp_pl", + FT_UINT8, BASE_DEC, NULL, 0x3c, + NULL, HFILL} + }, + { &hf_gtpv2_arp_pci, + {"Pre-emption Capability (PCI)", "gtpv2.arp_pci", + FT_BOOLEAN, 8, NULL, 0x40, + NULL, HFILL} + }, }; static gint *ett_gtpv2_array[] = { diff --git a/epan/dissectors/packet-gtpv2.h b/epan/dissectors/packet-gtpv2.h index 293f2a5c38..319df06d40 100644 --- a/epan/dissectors/packet-gtpv2.h +++ b/epan/dissectors/packet-gtpv2.h @@ -24,3 +24,4 @@ extern void dissect_gtpv2_mbms_service_area(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_); extern void dissect_gtpv2_mbms_session_duration(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_); extern void dissect_gtpv2_mbms_time_to_data_xfer(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_); +extern void dissect_gtpv2_arp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_); |