1 /* packet-diameter_3gpp.c
2 * Routines for dissecting 3GPP OctetSting AVP:s
3 * Copyright 2008, Anders Broman <anders.broman[at]ericsson.com>
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 /* This dissector registers a dissector table for 3GPP Vendor specific
27 * AVP:s which will be called from the Diameter dissector to dissect
28 * the content of AVP:s of the OctetString type(or similar).
37 #include <epan/packet.h>
38 #include <epan/asn1.h>
40 #include "packet-gsm_map.h"
41 #include "packet-gsm_a_common.h"
42 #include "packet-e164.h"
43 #include "packet-e212.h"
44 #include "packet-ntp.h"
46 /* Initialize the protocol and registered fields */
47 static int proto_diameter_3gpp = -1;
49 static int hf_diameter_3gpp_visited_nw_id = -1;
50 static int hf_diameter_3gpp_msisdn = -1;
51 static int hf_diameter_3gpp_path = -1;
52 static int hf_diameter_3gpp_contact = -1;
53 static int hf_diameter_3gpp_user_data = -1;
54 static int hf_diameter_3gpp_ipaddr = -1;
55 static int hf_diameter_3gpp_mbms_required_qos_prio = -1;
56 static int hf_diameter_3gpp_tmgi = -1;
57 static int hf_diameter_3gpp_service_ind = -1;
58 static int hf_diameter_mbms_service_id = -1;
59 static int hf_diameter_address_digits = -1;
60 static int hf_diameter_3gpp_spare_bits = -1;
61 static int hf_diameter_3gpp_feature_list_flags = -1;
62 static int hf_diameter_3gpp_feature_list_flags_bit0 = -1;
63 static int hf_diameter_3gpp_feature_list_flags_bit1 = -1;
64 static int hf_diameter_3gpp_feature_list_flags_bit2 = -1;
65 static int hf_diameter_3gpp_ulr_flags = -1;
66 static int hf_diameter_3gpp_ulr_flags_bit0 = -1;
67 static int hf_diameter_3gpp_ulr_flags_bit1 = -1;
68 static int hf_diameter_3gpp_ulr_flags_bit2 = -1;
69 static int hf_diameter_3gpp_ulr_flags_bit3 = -1;
70 static int hf_diameter_3gpp_ulr_flags_bit4 = -1;
71 static int hf_diameter_3gpp_ulr_flags_bit5 = -1;
72 static int hf_diameter_3gpp_ulr_flags_bit6 = -1;
73 static int hf_diameter_3gpp_ula_flags = -1;
74 static int hf_diameter_3gpp_ula_flags_bit0 = -1;
75 static int hf_diameter_3gpp_dsr_flags = -1;
76 static int hf_diameter_3gpp_dsr_flags_bit0 = -1;
77 static int hf_diameter_3gpp_dsr_flags_bit1 = -1;
78 static int hf_diameter_3gpp_dsr_flags_bit2 = -1;
79 static int hf_diameter_3gpp_dsr_flags_bit3 = -1;
80 static int hf_diameter_3gpp_dsr_flags_bit4 = -1;
81 static int hf_diameter_3gpp_dsr_flags_bit5 = -1;
82 static int hf_diameter_3gpp_dsr_flags_bit6 = -1;
83 static int hf_diameter_3gpp_dsr_flags_bit7 = -1;
84 static int hf_diameter_3gpp_dsr_flags_bit8 = -1;
85 static int hf_diameter_3gpp_dsr_flags_bit9 = -1;
86 static int hf_diameter_3gpp_dsr_flags_bit10 = -1;
87 static int hf_diameter_3gpp_dsr_flags_bit11 = -1;
88 static int hf_diameter_3gpp_dsr_flags_bit12 = -1;
89 static int hf_diameter_3gpp_dsr_flags_bit13 = -1;
90 static int hf_diameter_3gpp_dsr_flags_bit14 = -1;
91 static int hf_diameter_3gpp_dsr_flags_bit15 = -1;
92 static int hf_diameter_3gpp_dsa_flags = -1;
93 static int hf_diameter_3gpp_dsa_flags_bit0 = -1;
94 static int hf_diameter_3gpp_ida_flags = -1;
95 static int hf_diameter_3gpp_ida_flags_bit0 = -1;
96 static int hf_diameter_3gpp_pua_flags = -1;
97 static int hf_diameter_3gpp_pua_flags_bit0 = -1;
98 static int hf_diameter_3gpp_pua_flags_bit1 = -1;
99 static int hf_diameter_3gpp_nor_flags = -1;
100 static int hf_diameter_3gpp_nor_flags_bit0 = -1;
101 static int hf_diameter_3gpp_nor_flags_bit1 = -1;
102 static int hf_diameter_3gpp_nor_flags_bit2 = -1;
103 static int hf_diameter_3gpp_nor_flags_bit3 = -1;
104 static int hf_diameter_3gpp_nor_flags_bit4 = -1;
105 static int hf_diameter_3gpp_nor_flags_bit5 = -1;
106 static int hf_diameter_3gpp_nor_flags_bit6 = -1;
107 static int hf_diameter_3gpp_idr_flags = -1;
108 static int hf_diameter_3gpp_idr_flags_bit0 = -1;
109 static int hf_diameter_3gpp_idr_flags_bit1 = -1;
110 static int hf_diameter_3gpp_idr_flags_bit2 = -1;
111 static int hf_diameter_3gpp_idr_flags_bit3 = -1;
112 static int hf_diameter_3gpp_idr_flags_bit4 = -1;
113 static int hf_diameter_3gpp_ipv6addr = -1;
114 static int hf_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer = -1;
115 static int hf_diameter_3gpp_udp_port = -1;
116 static gint diameter_3gpp_path_ett = -1;
117 static gint diameter_3gpp_msisdn_ett = -1;
118 static gint diameter_3gpp_feature_list_ett = -1;
119 static gint diameter_3gpp_tmgi_ett = -1;
120 static gint diameter_3gpp_ulr_flags_ett = -1;
121 static gint diameter_3gpp_ula_flags_ett = -1;
122 static gint diameter_3gpp_dsr_flags_ett = -1;
123 static gint diameter_3gpp_dsa_flags_ett = -1;
124 static gint diameter_3gpp_ida_flags_ett = -1;
125 static gint diameter_3gpp_pua_flags_ett = -1;
126 static gint diameter_3gpp_nor_flags_ett = -1;
127 static gint diameter_3gpp_idr_flags_ett = -1;
129 /* Dissector handles */
130 static dissector_handle_t xml_handle;
132 /* AVP Code: 15 3GPP-SGSN-IPv6-Address */
133 /* AVP Code: 917 MBMS-GGSN-IPv6-Address */
135 dissect_diameter_3gpp_ipv6addr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
139 proto_tree_add_item(tree, hf_diameter_3gpp_ipv6addr, tvb, offset, 16, ENC_BIG_ENDIAN);
147 /* AVP Code: 600 Visited-Network-Identifier
149 * 6.3.1 Visited-Network-Identifier AVP
150 * The Visited-Network-Identifier AVP is of type OctetString. This AVP contains an identifier that helps the home
151 * network to identify the visited network (e.g. the visited network domain name).
155 dissect_diameter_3gpp_visited_nw_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
159 int length = tvb_length(tvb);
161 for(i = 0; i < length; i++)
162 if(!g_ascii_isprint(tvb_get_guint8(tvb, i)))
165 item = proto_tree_add_item(tree, hf_diameter_3gpp_visited_nw_id, tvb, offset, length, ENC_ASCII|ENC_NA);
166 PROTO_ITEM_SET_GENERATED(item);
171 /* AVP Code: 630 Feature-List
173 * IMS Cx Dx AVPS 3GPP TS 29.229
177 dissect_diameter_3gpp_feature_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
180 proto_tree *sub_tree;
184 item = proto_tree_add_item(tree, hf_diameter_3gpp_feature_list_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
185 sub_tree = proto_item_add_subtree(item, diameter_3gpp_feature_list_ett);
188 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 29, ENC_BIG_ENDIAN);
190 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
192 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
194 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
197 offset = bit_offset>>3;
202 /* AVP Code: 640 Path
204 * IMS Cx Dx AVPS 3GPP TS 29.229
206 * The Path AVP is of type OctetString and it contains a comma separated list of SIP proxies in the Path header as defined
207 * in IETF RFC 3327 [17].
210 dissect_diameter_3gpp_path(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
213 proto_tree *sub_tree;
214 int offset = 0, comma_offset;
215 int end_offset = tvb_length(tvb) - 1;
217 item = proto_tree_add_text(tree, tvb, offset, -1,"Paths");
218 sub_tree = proto_item_add_subtree(item,diameter_3gpp_path_ett);
220 while (offset < end_offset){
221 comma_offset = tvb_find_guint8(tvb, offset, -1, ',');
222 if(comma_offset == -1){
223 proto_tree_add_item(sub_tree, hf_diameter_3gpp_path, tvb, offset, comma_offset, ENC_ASCII|ENC_NA);
226 proto_tree_add_item(sub_tree, hf_diameter_3gpp_path, tvb, offset, comma_offset, ENC_ASCII|ENC_NA);
227 offset = comma_offset+1;
231 return tvb_length(tvb);
234 /* AVP Code: 641 Contact
236 * IMS Cx Dx AVPS 3GPP TS 29.229
238 * The Contact AVP is of type OctetString and it contains the Contact Addresses and Parameters in the Contact header as
239 * defined in IETF RFC 3261.
242 dissect_diameter_3gpp_contact(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
247 item = proto_tree_add_item(tree, hf_diameter_3gpp_contact, tvb, offset, -1, ENC_ASCII|ENC_NA);
248 PROTO_ITEM_SET_GENERATED(item);
250 return tvb_length(tvb);
253 /* AVP Code: 701 MSISDN */
255 dissect_diameter_3gpp_msisdn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
258 proto_tree *sub_tree;
260 const char *digit_str;
261 int length = tvb_length(tvb);
263 item = proto_tree_add_item(tree, hf_diameter_3gpp_msisdn, tvb, offset, length, ENC_NA);
264 sub_tree = proto_item_add_subtree(item,diameter_3gpp_msisdn_ett);
266 dissect_e164_cc(tvb, sub_tree, offset, TRUE);
268 digit_str = unpack_digits(tvb, 1);
269 proto_tree_add_string(sub_tree, hf_diameter_address_digits, tvb, 1, -1, digit_str);
271 return tvb_length(tvb);
275 /* AVP Code: 702 User-Data
277 * The AVP codes from 709 to799 are reserved for TS 29.329
279 /* AVP Code: 606 User-Data
281 * IMS Cx Dx AVPS 3GPP TS 29.229
284 dissect_diameter_3gpp_user_data(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
287 int length = tvb_length(tvb);
289 /* If there is less than 38 characters this is not XML
290 * <?xml version="1.0" encoding="UTF-8"?>
295 tvb_get_nstringz0(tvb, 0, sizeof(word),word);
296 if (g_ascii_strncasecmp(word, "<?xml", 5) == 0){
297 call_dissector(xml_handle, tvb, pinfo, tree);
305 * AVP Code: 704 Service-Indication
308 dissect_diameter_3gpp_service_ind(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
312 int length = tvb_length(tvb);
314 for(i = 0; i < length; i++)
315 if(!g_ascii_isprint(tvb_get_guint8(tvb, i)))
318 item = proto_tree_add_item(tree, hf_diameter_3gpp_service_ind, tvb, offset, length, ENC_ASCII|ENC_NA);
319 PROTO_ITEM_SET_GENERATED(item);
324 /* AVP Code: 900 TMGI */
326 dissect_diameter_3gpp_tmgi(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
329 proto_tree *sub_tree;
332 item = proto_tree_add_item(tree, hf_diameter_3gpp_tmgi, tvb, offset, 6, ENC_NA);
333 sub_tree = proto_item_add_subtree(item,diameter_3gpp_tmgi_ett);
335 /* MBMS Service ID consisting of three octets. MBMS Service ID consists of a 6-digit
336 * fixed-length hexadecimal number between 000000 and FFFFFF.
337 * MBMS Service ID uniquely identifies an MBMS bearer service within a PLMN.
340 proto_tree_add_item(sub_tree, hf_diameter_mbms_service_id, tvb, offset, 3, ENC_BIG_ENDIAN);
342 offset = dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, offset, TRUE);
348 /* AVP Code: 903 MBMS-Service-Area */
350 /* AVP Code: 918 MBMS-BMSC-SSM-IP-Address */
352 dissect_diameter_3gpp_ipaddr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
356 proto_tree_add_item(tree, hf_diameter_3gpp_ipaddr, tvb, offset, 4, ENC_BIG_ENDIAN);
363 /* AVP Code: 913 MBMS-Required-QoS */
365 dissect_diameter_3gpp_mbms_required_qos(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
371 * 1 Allocation/Retention Priority as specified in 3GPP TS 23.107.
372 * This octet encodes each priority level defined in 3GPP TS 23.107
373 * as the binary value of the priority level. It specifies the relative
374 * importance of the actual MBMS bearer service compared to other MBMS
375 * and non-MBMS bearer services for allocation and retention of the
376 * MBMS bearer service.
377 * 2-N QoS Profile as specified by the Quality-of-Service information element,
378 * from octet 3 onwards, in 3GPP TS 24.008
380 proto_tree_add_item(tree, hf_diameter_3gpp_mbms_required_qos_prio, tvb, offset, 1, ENC_BIG_ENDIAN);
382 length = tvb_length(tvb) - 1;
383 de_sm_qos(tvb, tree, pinfo, offset,length, NULL, 0);
384 return offset+length;
388 /* AVP Code: 926 MBMS-BMSC-SSM-UDP-Port */
389 /* AVP Code: 927 MBMS-GW-UDP-Port */
391 dissect_diameter_3gpp_udp_port(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
395 proto_tree_add_item(tree, hf_diameter_3gpp_udp_port, tvb, offset, 1, ENC_BIG_ENDIAN);
402 /* AVP Code: 929 MBMS-Data-Transfer-Start */
403 /* AVP Code: 930 MBMS-Data-Transfer-Stop */
405 dissect_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
408 const gchar *time_str;
410 time_str = tvb_ntp_fmt_ts(tvb, offset);
411 proto_tree_add_string(tree, hf_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer, tvb, offset, 8, time_str);
417 /* AVP Code: 1405 ULR-Flags */
419 dissect_diameter_3gpp_ulr_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
422 proto_tree *sub_tree;
426 item = proto_tree_add_item(tree, hf_diameter_3gpp_ulr_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
427 sub_tree = proto_item_add_subtree(item, diameter_3gpp_ulr_flags_ett);
429 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 25, ENC_BIG_ENDIAN);
431 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit6, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
433 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit5, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
435 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
437 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
439 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
441 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
443 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ulr_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
446 offset = bit_offset>>3;
451 /* AVP Code: 1406 ULA-Flags */
453 dissect_diameter_3gpp_ula_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
456 proto_tree *sub_tree;
460 item = proto_tree_add_item(tree, hf_diameter_3gpp_ula_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
461 sub_tree = proto_item_add_subtree(item, diameter_3gpp_ula_flags_ett);
463 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 31, ENC_BIG_ENDIAN);
465 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ula_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
468 offset = bit_offset>>3;
473 /* AVP Code: 1421 DSR-Flags */
475 dissect_diameter_3gpp_dsr_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
478 proto_tree *sub_tree;
482 item = proto_tree_add_item(tree, hf_diameter_3gpp_dsr_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
483 sub_tree = proto_item_add_subtree(item, diameter_3gpp_dsr_flags_ett);
485 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
487 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit14, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
489 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit14, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
491 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit13, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
493 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit12, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
495 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit11, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
497 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit10, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
499 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit9, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
501 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit8, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
503 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit7, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
505 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit6, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
507 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit5, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
509 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
511 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
513 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
515 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
517 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsr_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
520 offset = bit_offset>>3;
525 /* AVP Code: 1422 DSA-Flags */
527 dissect_diameter_3gpp_dsa_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
530 proto_tree *sub_tree;
534 item = proto_tree_add_item(tree, hf_diameter_3gpp_dsa_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
535 sub_tree = proto_item_add_subtree(item, diameter_3gpp_dsa_flags_ett);
537 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 31, ENC_BIG_ENDIAN);
539 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_dsa_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
542 offset = bit_offset>>3;
547 /* AVP Code: 1441 IDA-Flags */
549 dissect_diameter_3gpp_ida_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
552 proto_tree *sub_tree;
556 item = proto_tree_add_item(tree, hf_diameter_3gpp_ida_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
557 sub_tree = proto_item_add_subtree(item, diameter_3gpp_ida_flags_ett);
559 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 31, ENC_BIG_ENDIAN);
561 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_ida_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
564 offset = bit_offset>>3;
569 /* AVP Code: 1442 PUA-Flags */
571 dissect_diameter_3gpp_pua_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
574 proto_tree *sub_tree;
578 item = proto_tree_add_item(tree, hf_diameter_3gpp_pua_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
579 sub_tree = proto_item_add_subtree(item, diameter_3gpp_pua_flags_ett);
581 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 30, ENC_BIG_ENDIAN);
583 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_pua_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
585 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_pua_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
588 offset = bit_offset>>3;
594 /* AVP Code: 1443 NOR-Flags */
596 dissect_diameter_3gpp_nor_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
599 proto_tree *sub_tree;
603 item = proto_tree_add_item(tree, hf_diameter_3gpp_nor_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
604 sub_tree = proto_item_add_subtree(item, diameter_3gpp_nor_flags_ett);
606 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 25, ENC_BIG_ENDIAN);
608 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit6, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
610 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit5, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
612 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
614 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
616 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
618 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
620 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_nor_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
623 offset = bit_offset>>3;
628 /* AVP Code: 1490 IDR-Flags */
630 dissect_diameter_3gpp_idr_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) {
633 proto_tree *sub_tree;
637 item = proto_tree_add_item(tree, hf_diameter_3gpp_idr_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
638 sub_tree = proto_item_add_subtree(item, diameter_3gpp_idr_flags_ett);
640 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 27, ENC_BIG_ENDIAN);
642 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
644 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
646 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
648 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
650 proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_idr_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
653 offset = bit_offset>>3;
659 proto_reg_handoff_diameter_3gpp(void)
662 /* AVP Code: 5 3GPP-GPRS Negotiated QoS profile */
663 /* Registered by packet-gtp.c */
665 /* AVP Code: 15 3GPP-SGSN-IPv6-Address */
666 dissector_add_uint("diameter.3gpp", 15, new_create_dissector_handle(dissect_diameter_3gpp_ipv6addr, proto_diameter_3gpp));
668 /* AVP Code: 22 3GPP-User-Location-Info
669 * Registered by packet-gtpv2.c
672 /* AVP Code: 600 Visited-Network-Identifier */
673 dissector_add_uint("diameter.3gpp", 600, new_create_dissector_handle(dissect_diameter_3gpp_visited_nw_id, proto_diameter_3gpp));
675 /* AVP Code: 606 User-Data */
676 dissector_add_uint("diameter.3gpp", 606, new_create_dissector_handle(dissect_diameter_3gpp_user_data, proto_diameter_3gpp));
678 /* AVP Code: 630 Feature-List */
679 dissector_add_uint("diameter.3gpp", 630, new_create_dissector_handle(dissect_diameter_3gpp_feature_list, proto_diameter_3gpp));
681 /* AVP Code: 640 Path */
682 dissector_add_uint("diameter.3gpp", 640, new_create_dissector_handle(dissect_diameter_3gpp_path, proto_diameter_3gpp));
684 /* AVP Code: 641 Contact */
685 dissector_add_uint("diameter.3gpp", 641, new_create_dissector_handle(dissect_diameter_3gpp_contact, proto_diameter_3gpp));
687 /* AVP Code: 701 MSISDN */
688 dissector_add_uint("diameter.3gpp", 701, new_create_dissector_handle(dissect_diameter_3gpp_msisdn, proto_diameter_3gpp));
690 /* AVP Code: 702 User-Data */
691 dissector_add_uint("diameter.3gpp", 702, new_create_dissector_handle(dissect_diameter_3gpp_user_data, proto_diameter_3gpp));
693 /* AVP Code: 704 Service-Indication */
694 dissector_add_uint("diameter.3gpp", 704, new_create_dissector_handle(dissect_diameter_3gpp_service_ind, proto_diameter_3gpp));
696 /* AVP Code: 900 TMGI */
697 dissector_add_uint("diameter.3gpp", 900, new_create_dissector_handle(dissect_diameter_3gpp_tmgi, proto_diameter_3gpp));
699 /* AVP Code: 904 MBMS-Session-Duration Registered by packet-gtp.c */
700 /* AVP Code: 903 MBMS-Service-Area Registered by packet-gtp.c */
702 /* AVP Code: 911 MBMS-Time-To-Data-Transfer Registered by packet-gtp.c */
703 /* Registered by packet-gtp.c */
705 /* AVP Code: 913 MBMS-Required-QoS */
706 dissector_add_uint("diameter.3gpp", 913, new_create_dissector_handle(dissect_diameter_3gpp_mbms_required_qos, proto_diameter_3gpp));
708 /* AVP Code: 917 MBMS-GGSN-IPv6-Address */
709 dissector_add_uint("diameter.3gpp", 917, new_create_dissector_handle(dissect_diameter_3gpp_ipv6addr, proto_diameter_3gpp));
711 /* AVP Code: 918 MBMS-BMSC-SSM-IP-Address */
712 dissector_add_uint("diameter.3gpp", 918, new_create_dissector_handle(dissect_diameter_3gpp_ipaddr, proto_diameter_3gpp));
714 /* AVP Code: 926 MBMS-BMSC-SSM-UDP-Port */
715 /* AVP Code: 927 MBMS-GW-UDP-Port */
716 dissector_add_uint("diameter.3gpp", 926, new_create_dissector_handle(dissect_diameter_3gpp_udp_port, proto_diameter_3gpp));
717 dissector_add_uint("diameter.3gpp", 927, new_create_dissector_handle(dissect_diameter_3gpp_udp_port, proto_diameter_3gpp));
719 /* AVP Code: 929 MBMS-Data-Transfer-Start */
720 dissector_add_uint("diameter.3gpp", 929, new_create_dissector_handle(dissect_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer, proto_diameter_3gpp));
722 /* AVP Code: 930 MBMS-Data-Transfer-Stop */
723 dissector_add_uint("diameter.3gpp", 930, new_create_dissector_handle(dissect_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer, proto_diameter_3gpp));
725 /* AVP Code: 1405 ULR-Flags */
726 dissector_add_uint("diameter.3gpp", 1405, new_create_dissector_handle(dissect_diameter_3gpp_ulr_flags, proto_diameter_3gpp));
728 /* AVP Code: 1406 ULA-Flags */
729 dissector_add_uint("diameter.3gpp", 1406, new_create_dissector_handle(dissect_diameter_3gpp_ula_flags, proto_diameter_3gpp));
731 /* AVP Code: 1421 DSR-Flags */
732 dissector_add_uint("diameter.3gpp", 1421, new_create_dissector_handle(dissect_diameter_3gpp_dsr_flags, proto_diameter_3gpp));
734 /* AVP Code: 1422 DSA-Flags */
735 dissector_add_uint("diameter.3gpp", 1422, new_create_dissector_handle(dissect_diameter_3gpp_dsa_flags, proto_diameter_3gpp));
737 /* AVP Code: 1441 IDA-Flags */
738 dissector_add_uint("diameter.3gpp", 1441, new_create_dissector_handle(dissect_diameter_3gpp_ida_flags, proto_diameter_3gpp));
740 /* AVP Code: 1442 PUA-Flags */
741 dissector_add_uint("diameter.3gpp", 1442, new_create_dissector_handle(dissect_diameter_3gpp_pua_flags, proto_diameter_3gpp));
743 /* AVP Code: 1443 NOR-Flags */
744 dissector_add_uint("diameter.3gpp", 1443, new_create_dissector_handle(dissect_diameter_3gpp_nor_flags, proto_diameter_3gpp));
746 /* AVP Code: 1490 IDR-Flags */
747 dissector_add_uint("diameter.3gpp", 1490, new_create_dissector_handle(dissect_diameter_3gpp_idr_flags, proto_diameter_3gpp));
749 xml_handle = find_dissector("xml");
753 proto_register_diameter_3gpp(void)
756 /* Setup list of header fields See Section 1.6.1 for details*/
757 static hf_register_info hf[] = {
758 { &hf_diameter_3gpp_path,
759 { "Path", "diameter.3gpp.path",
760 FT_STRING, BASE_NONE, NULL, 0x0,
763 { &hf_diameter_3gpp_contact,
764 { "Contact", "diameter.3gpp.contact",
765 FT_STRING, BASE_NONE, NULL, 0x0,
768 { &hf_diameter_3gpp_visited_nw_id,
769 { "Visited-Network-Identifier", "diameter.3gpp.visited_nw_id",
770 FT_STRING, BASE_NONE, NULL, 0x0,
773 { &hf_diameter_3gpp_msisdn,
774 { "MSISDN", "diameter.3gpp.msisdn",
775 FT_BYTES, BASE_NONE, NULL, 0x0,
778 { &hf_diameter_3gpp_user_data,
779 { "User data", "diameter.3gpp.user_data",
780 FT_STRING, BASE_NONE, NULL, 0x0,
783 { &hf_diameter_3gpp_ipaddr,
784 { "IPv4 Address", "diameter.3gpp.ipaddr",
785 FT_IPv4, BASE_NONE, NULL, 0x0,
788 { &hf_diameter_3gpp_mbms_required_qos_prio,
789 { "Allocation/Retention Priority", "diameter.3gpp.mbms_required_qos_prio",
790 FT_UINT8, BASE_DEC, NULL, 0x0,
793 { &hf_diameter_3gpp_tmgi,
794 { "TMGI", "diameter.3gpp.tmgi",
795 FT_BYTES, BASE_NONE, NULL, 0x0,
798 { &hf_diameter_3gpp_service_ind,
799 { "Service-Indication", "diameter.3gpp.service_ind",
800 FT_STRING, BASE_NONE, NULL, 0x0,
803 { &hf_diameter_mbms_service_id,
804 { "MBMS Service ID", "diameter.3gpp.mbms_service_id",
805 FT_UINT24, BASE_HEX, NULL, 0x0,
808 { &hf_diameter_address_digits,
809 { "Address digits", "diameter.3gpp.address_digits",
810 FT_STRING, BASE_NONE, NULL, 0x0,
813 { &hf_diameter_3gpp_spare_bits,
814 { "Spare bit(s)", "diameter.3gpp.spare_bits",
815 FT_UINT32, BASE_HEX, NULL, 0x0,
818 { &hf_diameter_3gpp_feature_list_flags,
819 { "Feature-List Flags", "diameter.3gpp.feature_list_flags",
820 FT_UINT32, BASE_HEX, NULL, 0x0,
823 { &hf_diameter_3gpp_feature_list_flags_bit0,
824 { "Shared IFC Sets", "diameter.3gpp.feature_list_flags_bit0",
825 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
828 { &hf_diameter_3gpp_feature_list_flags_bit1,
829 { "Alias Indication", "diameter.3gpp.feature_list_flags_bit1",
830 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
833 { &hf_diameter_3gpp_feature_list_flags_bit2,
834 { "IMS Restoration Indication", "diameter.3gpp.feature_list_flags_bit2",
835 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
838 { &hf_diameter_3gpp_ulr_flags,
839 { "ULR Flags", "diameter.3gpp.ulr_flags",
840 FT_UINT32, BASE_HEX, NULL, 0x0,
843 { &hf_diameter_3gpp_ulr_flags_bit0,
844 { "Single-Registration-Indication", "diameter.3gpp.ulr_flags_bit0",
845 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
848 { &hf_diameter_3gpp_ulr_flags_bit1,
849 { "S6a/S6d-Indicator", "diameter.3gpp.ulr_flags_bit1",
850 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
853 { &hf_diameter_3gpp_ulr_flags_bit2,
854 { "Skip-Subscriber-Data", "diameter.3gpp.ulr_flags_bit2",
855 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
858 { &hf_diameter_3gpp_ulr_flags_bit3,
859 { "GPRS-Subscription-Data-Indicator", "diameter.3gpp.ulr_flags_bit3",
860 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
863 { &hf_diameter_3gpp_ulr_flags_bit4,
864 { "Node-Type-Indicator", "diameter.3gpp.ulr_flags_bit4",
865 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
868 { &hf_diameter_3gpp_ulr_flags_bit5,
869 { "Initial-Attach-Indicator", "diameter.3gpp.ulr_flags_bit5",
870 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
873 { &hf_diameter_3gpp_ulr_flags_bit6,
874 { "PS-LCS-Not-Supported-By-UE", "diameter.3gpp.ulr_flags_bit6",
875 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
878 { &hf_diameter_3gpp_ula_flags,
879 { "ULA Flags", "diameter.3gpp.ula_flags",
880 FT_UINT32, BASE_HEX, NULL, 0x0,
883 { &hf_diameter_3gpp_ula_flags_bit0,
884 { "Separation Indication", "diameter.3gpp.ula_flags_bit0",
885 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
888 { &hf_diameter_3gpp_dsr_flags,
889 { "DSR Flags", "diameter.3gpp.dsr_flags",
890 FT_UINT32, BASE_HEX, NULL, 0x0,
893 { &hf_diameter_3gpp_dsr_flags_bit0,
894 { "Regional Subscription Withdrawal", "diameter.3gpp.dsr_flags_bit0",
895 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
898 { &hf_diameter_3gpp_dsr_flags_bit1,
899 { "Complete APN Configuration Profile Withdrawal", "diameter.3gpp.dsr_flags_bit1",
900 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
903 { &hf_diameter_3gpp_dsr_flags_bit2,
904 { "Subscribed Charging Characteristics Withdrawal", "diameter.3gpp.dsr_flags_bit2",
905 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
908 { &hf_diameter_3gpp_dsr_flags_bit3,
909 { "PDN subscription contexts Withdrawal", "diameter.3gpp.dsr_flags_bit3",
910 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
913 { &hf_diameter_3gpp_dsr_flags_bit4,
914 { "STN-SR", "diameter.3gpp.dsr_flags_bit4",
915 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
918 { &hf_diameter_3gpp_dsr_flags_bit5,
919 { "Complete PDP context list Withdrawal", "diameter.3gpp.dsr_flags_bit5",
920 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
923 { &hf_diameter_3gpp_dsr_flags_bit6,
924 { "PDP contexts Withdrawal", "diameter.3gpp.dsr_flags_bit6",
925 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
928 { &hf_diameter_3gpp_dsr_flags_bit7,
929 { "Roaming Restricted due to unsupported feature", "diameter.3gpp.dsr_flags_bit7",
930 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
933 { &hf_diameter_3gpp_dsr_flags_bit8,
934 { "Trace Data Withdrawal", "diameter.3gpp.dsr_flags_bit8",
935 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
938 { &hf_diameter_3gpp_dsr_flags_bit9,
939 { "CSG Deleted", "diameter.3gpp.dsr_flags_bit9",
940 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
943 { &hf_diameter_3gpp_dsr_flags_bit10,
944 { "APN-OI-Replacement", "diameter.3gpp.dsr_flags_bit10",
945 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
948 { &hf_diameter_3gpp_dsr_flags_bit11,
949 { "GMLC List Withdrawal", "diameter.3gpp.dsr_flags_bit11",
950 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
953 { &hf_diameter_3gpp_dsr_flags_bit12,
954 { "LCS Withdrawal", "diameter.3gpp.dsr_flags_bit12",
955 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
958 { &hf_diameter_3gpp_dsr_flags_bit13,
959 { "SMS Withdrawal", "diameter.3gpp.dsr_flags_bit13",
960 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
963 { &hf_diameter_3gpp_dsr_flags_bit14,
964 { "Subscribed VSRVCC Withdrawal", "diameter.3gpp.dsr_flags_bit14",
965 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
968 { &hf_diameter_3gpp_dsr_flags_bit15,
969 { "Subscribed periodic RAU-TAU Timer Withdrawal", "diameter.3gpp.dsr_flags_bit15",
970 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
973 { &hf_diameter_3gpp_dsa_flags,
974 { "DSA Flags", "diameter.3gpp.dsa_flags",
975 FT_UINT32, BASE_HEX, NULL, 0x0,
978 { &hf_diameter_3gpp_dsa_flags_bit0,
979 { "Network Node area restricted", "diameter.3gpp.dsa_flags_bit0",
980 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
983 { &hf_diameter_3gpp_ida_flags,
984 { "IDA Flags", "diameter.3gpp.ida_flags",
985 FT_UINT32, BASE_HEX, NULL, 0x0,
988 { &hf_diameter_3gpp_ida_flags_bit0,
989 { "Network Node area restricted", "diameter.3gpp.ida_flags_bit0",
990 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
993 { &hf_diameter_3gpp_pua_flags,
994 { "PUA Flags", "diameter.3gpp.pua_flags",
995 FT_UINT32, BASE_HEX, NULL, 0x0,
998 { &hf_diameter_3gpp_pua_flags_bit0,
999 { "Freeze M-TMSI", "diameter.3gpp.pua_flags_bit0",
1000 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1003 { &hf_diameter_3gpp_pua_flags_bit1,
1004 { "Freeze P-TMSI", "diameter.3gpp.pua_flags_bit1",
1005 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1008 { &hf_diameter_3gpp_nor_flags,
1009 { "NOR Flags", "diameter.3gpp.nor_flags",
1010 FT_UINT32, BASE_HEX, NULL, 0x0,
1013 { &hf_diameter_3gpp_nor_flags_bit0,
1014 { "Single-Registration-Indication", "diameter.3gpp.nor_flags_bit0",
1015 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1018 { &hf_diameter_3gpp_nor_flags_bit1,
1019 { "SGSN area restricted", "diameter.3gpp.nor_flags_bit1",
1020 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1023 { &hf_diameter_3gpp_nor_flags_bit2,
1024 { "Ready for SM", "diameter.3gpp.nor_flags_bit2",
1025 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1028 { &hf_diameter_3gpp_nor_flags_bit3,
1029 { "UE Reachable", "diameter.3gpp.nor_flags_bit3",
1030 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1033 { &hf_diameter_3gpp_nor_flags_bit4,
1034 { "Delete all APN and PDN GW identity pairs", "diameter.3gpp.nor_flags_bit4",
1035 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1038 { &hf_diameter_3gpp_nor_flags_bit5,
1039 { "UE Reachable from SGSN", "diameter.3gpp.nor_flags_bit5",
1040 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1043 { &hf_diameter_3gpp_nor_flags_bit6,
1044 { "Ready for SM from MME", "diameter.3gpp.nor_flags_bit6",
1045 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1048 { &hf_diameter_3gpp_idr_flags,
1049 { "IDR Flags", "diameter.3gpp.idr_flags",
1050 FT_UINT32, BASE_HEX, NULL, 0x0,
1053 { &hf_diameter_3gpp_idr_flags_bit0,
1054 { "UE Reachability Request", "diameter.3gpp.idr_flags_bit0",
1055 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1058 { &hf_diameter_3gpp_idr_flags_bit1,
1059 { "T-ADS Data Request", "diameter.3gpp.idr_flags_bit1",
1060 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1063 { &hf_diameter_3gpp_idr_flags_bit2,
1064 { "EPS User State Request", "diameter.3gpp.idr_flags_bit2",
1065 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1068 { &hf_diameter_3gpp_idr_flags_bit3,
1069 { "EPS Location Information Request", "diameter.3gpp.idr_flags_bit3",
1070 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1073 { &hf_diameter_3gpp_idr_flags_bit4,
1074 { "Current Location Request", "diameter.3gpp.idr_flags_bit4",
1075 FT_BOOLEAN, BASE_NONE, TFS(&tfs_set_notset), 0x0,
1078 { &hf_diameter_3gpp_ipv6addr,
1079 { "IPv6 Address", "diameter.3gpp.ipv6addr",
1080 FT_IPv6, BASE_NONE, NULL, 0x0,
1083 { &hf_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer,
1084 { "Absolute Time of MBMS Data Transfer", "diameter.3gpp.mbms_abs_time_ofmbms_data_tfer",
1085 FT_STRING, BASE_NONE, NULL, 0x0,
1088 { &hf_diameter_3gpp_udp_port ,
1089 { "UDP Port", "diameter.3gpp.udp_port",
1090 FT_UINT8, BASE_DEC, NULL, 0x0,
1095 /* Setup protocol subtree array */
1096 static gint *ett[] = {
1097 &diameter_3gpp_path_ett,
1098 &diameter_3gpp_msisdn_ett,
1099 &diameter_3gpp_feature_list_ett,
1100 &diameter_3gpp_tmgi_ett,
1101 &diameter_3gpp_ulr_flags_ett,
1102 &diameter_3gpp_ula_flags_ett,
1103 &diameter_3gpp_dsr_flags_ett,
1104 &diameter_3gpp_dsa_flags_ett,
1105 &diameter_3gpp_ida_flags_ett,
1106 &diameter_3gpp_pua_flags_ett,
1107 &diameter_3gpp_nor_flags_ett,
1108 &diameter_3gpp_idr_flags_ett,
1111 /* Required function calls to register the header fields and subtrees used */
1112 proto_diameter_3gpp = proto_register_protocol("Diameter 3GPP","Diameter3GPP", "diameter.3gpp");
1113 proto_register_field_array(proto_diameter_3gpp, hf, array_length(hf));
1114 proto_register_subtree_array(ett, array_length(ett));