3 * packet-gsm_map.c: There are 1174 display filter fields registered. Most are
4 * prefixed appropriately as "gsm_map", but many others are prefixed as
5 * "gsm_old", or even "gad", "gsm_ss", or with no prefix at all. I don't know
6 * if the ones with "gsm_old" are simply obsolete display filter fields or if
7 * they should be prefixed as "gsm_map.old." or what. Similar uncertainties
8 * for the others. Someone more knowledgeable than I am with respect to this
9 * dissector should provide a patch for it.
12 /* packet-gsm_map-template.c
13 * Routines for GSM MobileApplication packet dissection
15 * Copyright 2004 - 2010 , Anders Broman <anders.broman [AT] ericsson.com>
16 * Based on the dissector by:
17 * Felix Fei <felix.fei [AT] utstar.com>
18 * and Michael Lum <mlum [AT] telostech.com>
20 * Wireshark - Network traffic analyzer
21 * By Gerald Combs <gerald@wireshark.org>
22 * Copyright 1998 Gerald Combs
24 * SPDX-License-Identifier: GPL-2.0-or-later
27 * Updated to ETSI TS 129 002 V7.5.0 (3GPP TS 29.002 V7.5.0 (2006-09) Release 7)
28 * Updated to ETSI TS 129 002 V8.4.0 (3GPP TS 29.002 V8.1.0 (2007-06) Release 8)
30 * References: 3GPP TS 24.080
37 #include <epan/packet.h>
38 #include <epan/prefs.h>
39 #include <epan/stat_tap_ui.h>
41 #include <epan/oids.h>
42 #include <epan/expert.h>
43 #include <epan/proto_data.h>
44 #include <epan/conversation.h>
45 #include <wsutil/strtoi.h>
47 #include <wsutil/array.h>
49 #include <epan/asn1.h>
50 #include "packet-ber.h"
51 #include "packet-per.h"
52 #include "packet-q931.h"
53 #include "packet-gsm_map.h"
54 #include "packet-gsm_a_common.h"
55 #include "packet-tcap.h"
56 #include "packet-e164.h"
57 #include "packet-e212.h"
58 #include "packet-smpp.h"
59 #include "packet-gsm_sms.h"
60 #include "packet-ranap.h"
61 #include "packet-isup.h"
63 #define PNAME "GSM Mobile Application"
64 #define PSNAME "GSM_MAP"
65 #define PFNAME "gsm_map"
67 void proto_register_gsm_map(void);
68 void proto_reg_handoff_gsm_map(void);
70 /* Initialize the protocol and registered fields */
71 static int proto_gsm_map
;
72 static int proto_gsm_map_dialogue
;
73 static int proto_gsm_map_ms
;
75 static int hf_gsm_map_old_Component_PDU
;
76 static int hf_gsm_map_getPassword
;
77 static int hf_gsm_map_currentPassword
;
78 static int hf_gsm_map_extension
;
79 static int hf_gsm_map_nature_of_number
;
80 static int hf_gsm_map_number_plan
;
81 static int hf_gsm_map_address_digits
;
82 static int hf_gsm_map_TBCD_digits
;
83 static int hf_gsm_map_Ss_Status_unused
;
84 static int hf_gsm_map_Ss_Status_q_bit
;
85 static int hf_gsm_map_Ss_Status_p_bit
;
86 static int hf_gsm_map_Ss_Status_r_bit
;
87 static int hf_gsm_map_Ss_Status_a_bit
;
88 static int hf_gsm_map_notification_to_forwarding_party
;
89 static int hf_gsm_map_redirecting_presentation
;
90 static int hf_gsm_map_notification_to_calling_party
;
91 static int hf_gsm_map_forwarding_reason
;
92 static int hf_gsm_map_pdp_type_org
;
93 static int hf_gsm_map_etsi_pdp_type_number
;
94 static int hf_gsm_map_ietf_pdp_type_number
;
95 static int hf_gsm_map_ext_qos_subscribed_pri
;
97 static int hf_gsm_map_qos_traffic_cls
;
98 static int hf_gsm_map_qos_del_order
;
99 static int hf_gsm_map_qos_del_of_err_sdu
;
100 static int hf_gsm_map_qos_ber
;
101 static int hf_gsm_map_qos_sdu_err_rat
;
102 static int hf_gsm_map_qos_traff_hdl_pri
;
103 static int hf_gsm_map_qos_max_sdu
;
104 static int hf_gsm_map_max_brate_ulink
;
105 static int hf_gsm_map_max_brate_dlink
;
106 static int hf_gsm_map_qos_transfer_delay
;
107 static int hf_gsm_map_guaranteed_max_brate_ulink
;
108 static int hf_gsm_map_guaranteed_max_brate_dlink
;
109 static int hf_gsm_map_GSNAddress_IPv4
;
110 static int hf_gsm_map_GSNAddress_IPv6
;
111 static int hf_gsm_map_ranap_service_Handover
;
112 static int hf_gsm_map_IntegrityProtectionInformation
;
113 static int hf_gsm_map_EncryptionInformation
;
114 static int hf_gsm_map_ss_SS_UserData
;
115 static int hf_gsm_map_cbs_coding_grp
;
116 static int hf_gsm_map_cbs_coding_grp0_lang
;
117 static int hf_gsm_map_cbs_coding_grp1_lang
;
118 static int hf_gsm_map_cbs_coding_grp2_lang
;
119 static int hf_gsm_map_cbs_coding_grp3_lang
;
120 static int hf_gsm_map_cbs_coding_grp4_7_comp
;
121 static int hf_gsm_map_cbs_coding_grp4_7_class_ind
;
122 static int hf_gsm_map_cbs_coding_grp4_7_char_set
;
123 static int hf_gsm_map_cbs_coding_grp4_7_class
;
124 static int hf_gsm_map_cbs_coding_grp15_mess_code
;
125 static int hf_gsm_map_cbs_coding_grp15_class
;
126 static int hf_gsm_map_ie_tag
;
127 static int hf_gsm_map_len
;
128 static int hf_gsm_map_disc_par
;
129 static int hf_gsm_map_dlci
;
130 static int hf_gsm_apn_str
;
131 static int hf_gsm_map_ericsson_locationInformation_rat
;
132 static int hf_gsm_map_ericsson_locationInformation_lac
;
133 static int hf_gsm_map_ericsson_locationInformation_ci
;
134 static int hf_gsm_map_ericsson_locationInformation_sac
;
135 static int hf_gsm_map_ussd_string
;
136 static int hf_gsm_map_spare_bits
;
137 static int hf_gsm_map_qos_signalling_ind
;
138 static int hf_gsm_map_qos_source_stat_desc
;
139 static int hf_gsm_map_qos_max_bitrate_upl_ext
;
140 static int hf_gsm_map_qos_max_bitrate_downl_ext
;
141 static int hf_gsm_map_qos_guar_bitrate_upl_ext
;
142 static int hf_gsm_map_qos_guar_bitrate_downl_ext
;
144 static int hf_gsm_map_qos_max_bitrate_upl_ext2;
145 static int hf_gsm_map_qos_max_bitrate_downl_ext2;
146 static int hf_gsm_map_qos_guar_bitrate_upl_ext2;
147 static int hf_gsm_map_qos_guar_bitrate_downl_ext2;
149 static int hf_gsm_map_earp_pci
;
150 static int hf_gsm_map_earp_pl
;
151 static int hf_gsm_map_earp_pvi
;
153 #include "packet-gsm_map-hf.c"
155 /* Initialize the subtree pointers */
156 static int ett_gsm_map
;
157 static int ett_gsm_map_InvokeId
;
158 static int ett_gsm_map_InvokePDU
;
159 static int ett_gsm_map_ReturnResultPDU
;
160 static int ett_gsm_map_ReturnErrorPDU
;
161 static int ett_gsm_map_ReturnResult_result
;
162 static int ett_gsm_map_ReturnError_result
;
163 static int ett_gsm_map_GSMMAPPDU
;
164 static int ett_gsm_map_ext_qos_subscribed
;
165 static int ett_gsm_map_pdptypenumber
;
166 static int ett_gsm_map_RAIdentity
;
167 static int ett_gsm_map_LAIFixedLength
;
168 static int ett_gsm_map_isdn_address_string
;
169 static int ett_gsm_map_geo_desc
;
170 static int ett_gsm_map_LongSignalInfo
;
171 static int ett_gsm_map_RadioResourceInformation
;
172 static int ett_gsm_map_MSNetworkCapability
;
173 static int ett_gsm_map_MSRadioAccessCapability
;
174 static int ett_gsm_map_externalsignalinfo
;
175 static int ett_gsm_map_cbs_data_coding
;
176 static int ett_gsm_map_GlobalCellId
;
177 static int ett_gsm_map_GeographicalInformation
;
178 static int ett_gsm_map_apn_str
;
179 static int ett_gsm_map_LocationNumber
;
180 static int ett_gsm_map_ericsson_locationInformation
;
181 static int ett_gsm_map_extension_data
;
182 static int ett_gsm_map_tbcd_digits
;
183 static int ett_gsm_map_ussd_string
;
184 static int ett_gsm_map_ext2_qos_subscribed
;
185 static int ett_gsm_map_ext3_qos_subscribed
;
186 static int ett_gsm_map_e_utranCellGlobalIdentity
;
187 static int ett_gsm_map_TA_id
;
188 static int ett_gsm_map_GeodeticInformation
;
190 #include "packet-gsm_map-ett.c"
192 static expert_field ei_gsm_map_unknown_sequence3
;
193 static expert_field ei_gsm_map_unknown_sequence
;
194 static expert_field ei_gsm_map_unknown_parameter
;
195 static expert_field ei_gsm_map_unknown_invokeData
;
196 static expert_field ei_gsm_map_undecoded
;
198 static dissector_handle_t gsm_sms_handle
; /* SMS TPDU */
199 static dissector_handle_t ranap_handle
;
200 static dissector_handle_t dtap_handle
;
201 static dissector_handle_t map_handle
;
202 static dissector_handle_t bssap_handle
;
203 static dissector_table_t map_prop_arg_opcode_table
; /* proprietary operation codes */
204 static dissector_table_t map_prop_res_opcode_table
; /* proprietary operation codes */
205 static dissector_table_t map_prop_err_opcode_table
; /* proprietary operation codes */
206 /* Preference settings default */
208 static range_t
*global_ssn_range
;
209 static bool pref_context_version_from_trace
= true;
210 static int pref_application_context_version
= 3;
211 static bool pref_ericsson_proprietary_ext
;
213 /* Global variables */
214 static uint32_t opcode
=0;
215 static uint32_t errorCode
;
216 static int application_context_version
;
217 static unsigned ProtocolId
;
218 static unsigned AccessNetworkProtocolId
;
219 static int gsm_map_tap
;
220 static uint8_t gsmmap_pdu_type
;
221 static uint8_t gsm_map_pdu_size
;
223 #define SMS_ENCODING_NOT_SET 0
224 #define SMS_ENCODING_7BIT 1
225 #define SMS_ENCODING_8BIT 2
226 #define SMS_ENCODING_UCS2 3
227 #define SMS_ENCODING_7BIT_LANG 4
228 #define SMS_ENCODING_UCS2_LANG 5
230 static uint8_t sms_encoding
;
232 /* Forward declarations */
233 static int dissect_invokeData(proto_tree
*tree
, tvbuff_t
*tvb
, int offset
, asn1_ctx_t
*actx
);
234 static int dissect_returnResultData(proto_tree
*tree
, tvbuff_t
*tvb
, int offset
, asn1_ctx_t
*actx
);
235 static int dissect_returnErrorData(proto_tree
*tree
, tvbuff_t
*tvb
, int offset
, asn1_ctx_t
*actx
);
236 const char* gsm_map_opr_code(uint32_t val
, proto_item
*item
);
239 struct tcap_private_t
* tcap_private
;
240 sccp_msg_info_t
*sccp_msg_info
;
241 tvbuff_t
*signal_info_tvb
;
242 } gsm_map_private_info_t
;
245 wmem_tree_t
*packets
;
246 } gsm_map_conv_info_t
;
248 static gsm_map_packet_info_t
*gsm_map_get_packet_info(asn1_ctx_t
*actx
, bool store_conv_info
)
250 gsm_map_packet_info_t
*gsm_map_pi
= (gsm_map_packet_info_t
*)p_get_proto_data(wmem_file_scope(), actx
->pinfo
, proto_gsm_map
, 0);
252 gsm_map_private_info_t
*gsm_map_priv
= (gsm_map_private_info_t
*)actx
->value_ptr
;
253 gsm_map_pi
= wmem_new0(wmem_file_scope(), gsm_map_packet_info_t
);
254 p_add_proto_data(wmem_file_scope(), actx
->pinfo
, proto_gsm_map
, 0, gsm_map_pi
);
255 if (gsm_map_priv
&& gsm_map_priv
->tcap_private
) {
256 gsm_map_pi
->tcap_src_tid
= gsm_map_priv
->tcap_private
->src_tid
;
257 if (store_conv_info
) {
258 conversation_t
*conversation
;
259 gsm_map_conv_info_t
*gsm_map_info
;
260 wmem_tree_key_t key
[3];
261 conversation
= find_or_create_conversation(actx
->pinfo
);
262 gsm_map_info
= (gsm_map_conv_info_t
*)conversation_get_proto_data(conversation
, proto_gsm_map
);
264 gsm_map_info
= wmem_new(wmem_file_scope(), gsm_map_conv_info_t
);
265 gsm_map_info
->packets
= wmem_tree_new(wmem_file_scope());
266 conversation_add_proto_data(conversation
, proto_gsm_map
, gsm_map_info
);
269 key
[0].key
= &gsm_map_priv
->tcap_private
->src_tid
;
271 key
[1].key
= &actx
->pinfo
->num
;
274 wmem_tree_insert32_array(gsm_map_info
->packets
, key
, (void *)gsm_map_pi
);
281 static gsm_map_packet_info_t
*gsm_map_get_matching_tcap_info(asn1_ctx_t
*actx
)
283 gsm_map_private_info_t
*gsm_map_priv
= (gsm_map_private_info_t
*)actx
->value_ptr
;
284 if (gsm_map_priv
&& gsm_map_priv
->tcap_private
) {
285 conversation_t
*conversation
;
286 gsm_map_conv_info_t
*gsm_map_info
;
287 wmem_tree_key_t key
[3];
288 gsm_map_packet_info_t
*gsm_map_pi
;
289 conversation
= find_or_create_conversation(actx
->pinfo
);
290 gsm_map_info
= (gsm_map_conv_info_t
*)conversation_get_proto_data(conversation
, proto_gsm_map
);
292 gsm_map_info
= wmem_new(wmem_file_scope(), gsm_map_conv_info_t
);
293 gsm_map_info
->packets
= wmem_tree_new(wmem_file_scope());
294 conversation_add_proto_data(conversation
, proto_gsm_map
, gsm_map_info
);
297 key
[0].key
= &gsm_map_priv
->tcap_private
->src_tid
;
299 key
[1].key
= &actx
->pinfo
->num
;
302 gsm_map_pi
= (gsm_map_packet_info_t
*)wmem_tree_lookup32_array_le(gsm_map_info
->packets
, key
);
303 if (gsm_map_pi
&& gsm_map_pi
->tcap_src_tid
== gsm_map_priv
->tcap_private
->src_tid
)
311 const value_string gsm_map_PDP_Type_Organisation_vals
[] = {
317 const value_string gsm_map_ietf_defined_pdp_vals
[] = {
318 { 0x21, "IPv4 Address" },
319 { 0x57, "IPv6 Address" },
323 const value_string gsm_map_etsi_defined_pdp_vals
[] = {
328 static const value_string gsm_map_tag_vals
[] = {
329 { 0x4, "Bearer Capability" },
333 static const value_string gsm_map_disc_par_vals
[] = {
334 { 0, "Not Transparent" },
335 { 1, "Transparent" },
339 static const value_string gsm_map_ericsson_locationInformation_rat_vals
[] = {
343 { 0xf, "No information" },
348 /* returns value in kb/s */
350 gsm_map_calc_bitrate(uint8_t value
){
353 unsigned returnvalue
;
358 granularity
= value
>> 6;
359 returnvalue
= value
& 0x7f;
360 switch (granularity
){
364 returnvalue
= ((returnvalue
- 0x40) << 3)+64;
367 returnvalue
= (returnvalue
<< 6)+576;
370 returnvalue
= (returnvalue
<< 6)+576;
378 dissect_gsm_map_ext_qos_subscribed(tvbuff_t
*tvb
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, asn1_ctx_t
*actx
){
384 subtree
= proto_item_add_subtree(actx
->created_item
, ett_gsm_map_ext_qos_subscribed
);
386 Allocation/Retention Priority (This octet encodes each priority level defined in
387 23.107 as the binary value of the priority level, declaration in 29.060)
388 Octets 2-9 are coded according to 3GPP TS 24.008[35] Quality of Service Octets
391 /* Allocation/Retention Priority */
392 proto_tree_add_item(subtree
, hf_gsm_map_ext_qos_subscribed_pri
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
395 /* Quality of Service Octets 6-13.( Octet 2 - 9 Here) */
397 /* Traffic class, octet 6 (see 3GPP TS 23.107) Bits 8 7 6 */
398 proto_tree_add_item(subtree
, hf_gsm_map_qos_traffic_cls
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
399 /* Delivery order, octet 6 (see 3GPP TS 23.107) Bits 5 4 */
400 proto_tree_add_item(subtree
, hf_gsm_map_qos_del_order
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
401 /* Delivery of erroneous SDUs, octet 6 (see 3GPP TS 23.107) Bits 3 2 1 */
402 proto_tree_add_item(subtree
, hf_gsm_map_qos_del_of_err_sdu
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
405 /* Maximum SDU size, octet 7 (see 3GPP TS 23.107) */
406 octet
= tvb_get_uint8(tvb
,offset
);
409 proto_tree_add_uint_format_value(subtree
, hf_gsm_map_qos_max_sdu
, tvb
, offset
, 1, octet
, "Reserved");
413 proto_tree_add_uint(subtree
, hf_gsm_map_qos_max_sdu
, tvb
, offset
, 1, value
);
417 proto_tree_add_uint(subtree
, hf_gsm_map_qos_max_sdu
, tvb
, offset
, 1, value
);
421 proto_tree_add_uint(subtree
, hf_gsm_map_qos_max_sdu
, tvb
, offset
, 1, value
);
426 proto_tree_add_uint(subtree
, hf_gsm_map_qos_max_sdu
, tvb
, offset
, 1, value
);
428 proto_tree_add_uint_format_value(subtree
, hf_gsm_map_qos_max_sdu
, tvb
, offset
, 1, octet
, "0x%x not defined in TS 24.008", octet
);
433 /* Maximum bit rate for uplink, octet 8 */
434 octet
= tvb_get_uint8(tvb
,offset
);
436 proto_tree_add_uint_format_value(subtree
, hf_gsm_map_max_brate_ulink
, tvb
, offset
, 1, octet
, "Reserved" );
438 proto_tree_add_uint(subtree
, hf_gsm_map_max_brate_ulink
, tvb
, offset
, 1, gsm_map_calc_bitrate(octet
));
441 /* Maximum bit rate for downlink, octet 9 (see 3GPP TS 23.107) */
442 octet
= tvb_get_uint8(tvb
,offset
);
444 proto_tree_add_uint_format_value(subtree
, hf_gsm_map_max_brate_dlink
, tvb
, offset
, 1, octet
, "Reserved" );
446 proto_tree_add_uint(subtree
, hf_gsm_map_max_brate_dlink
, tvb
, offset
, 1, gsm_map_calc_bitrate(octet
));
449 /* Residual Bit Error Rate (BER), octet 10 (see 3GPP TS 23.107) Bits 8 7 6 5 */
450 proto_tree_add_item(subtree
, hf_gsm_map_qos_ber
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
451 /* SDU error ratio, octet 10 (see 3GPP TS 23.107) */
452 proto_tree_add_item(subtree
, hf_gsm_map_qos_sdu_err_rat
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
455 /* Transfer delay, octet 11 (See 3GPP TS 23.107) Bits 8 7 6 5 4 3 */
456 proto_tree_add_item(subtree
, hf_gsm_map_qos_transfer_delay
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
457 /* Traffic handling priority, octet 11 (see 3GPP TS 23.107) Bits 2 1 */
458 proto_tree_add_item(subtree
, hf_gsm_map_qos_traff_hdl_pri
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
461 /* Guaranteed bit rate for uplink, octet 12 (See 3GPP TS 23.107)
462 Coding is identical to that of Maximum bit rate for uplink.
464 octet
= tvb_get_uint8(tvb
,offset
);
466 proto_tree_add_uint_format_value(subtree
, hf_gsm_map_guaranteed_max_brate_ulink
, tvb
, offset
, 1, octet
, "Subscribed guaranteed bit rate for uplink/reserved");
468 proto_tree_add_uint(subtree
, hf_gsm_map_guaranteed_max_brate_ulink
, tvb
, offset
, 1, gsm_map_calc_bitrate(octet
));
472 /* Guaranteed bit rate for downlink, octet 13(See 3GPP TS 23.107)
473 Coding is identical to that of Maximum bit rate for uplink.
475 octet
= tvb_get_uint8(tvb
,offset
);
477 proto_tree_add_uint_format_value(subtree
, hf_gsm_map_guaranteed_max_brate_dlink
, tvb
, offset
, 1, octet
, "Subscribed guaranteed bit rate for downlink/reserved");
479 proto_tree_add_uint(subtree
, hf_gsm_map_guaranteed_max_brate_dlink
, tvb
, offset
, 1, gsm_map_calc_bitrate(octet
));
485 Ext2-QoS-Subscribed ::= OCTET STRING (SIZE (1..3))
486 -- Octets 1-3 are coded according to 3GPP TS 24.008 [35] Quality of Service Octets 14-16.
487 -- If Quality of Service information is structured with 14 octet length, then
488 -- Octet 1 is coded according to 3GPP TS 24.008 [35] Quality of Service Octet 14.
492 static const true_false_string gsm_map_qos_signalling_ind_value
= {
493 "Optimised for signalling traffic",
494 "Not optimised for signalling traffic"
497 /* Helper function returning the main bitrates in kbps */
499 qos_calc_bitrate(uint8_t oct
)
504 return 64 + (oct
- 0x40) * 8;
506 return 576 + (oct
- 0x80) * 64;
509 /* Helper function returning the extended bitrates in kbps */
511 qos_calc_ext_bitrate(uint8_t oct
)
514 return 8600 + oct
* 100;
516 return 16000 + (oct
- 0x4a) * 1000;
518 return 128000 + (oct
- 0xba) * 2000;
522 qos_calc_ext2_bitrate(uint8_t oct
)
525 return (256 + oct
* 4);
527 return (500 + (oct
- 0x3d) * 10);
529 return (1500 + (oct
- 0xa1) * 100);
535 dissect_gsm_map_ext2_qos_subscribed(tvbuff_t
*tvb
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, asn1_ctx_t
*actx
) {
540 uint8_t oct
, tmp_oct
;
542 int length
= tvb_reported_length(tvb
);
544 subtree
= proto_item_add_subtree(actx
->created_item
, ett_gsm_map_ext2_qos_subscribed
);
547 oct
= tvb_get_uint8(tvb
, offset
);
548 proto_tree_add_bits_item(subtree
, hf_gsm_map_spare_bits
, tvb
, (offset
<< 3), 3, ENC_BIG_ENDIAN
);
549 proto_tree_add_item(subtree
, hf_gsm_map_qos_signalling_ind
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
557 proto_tree_add_uint_format_value(subtree
, hf_gsm_map_qos_source_stat_desc
, tvb
,
558 offset
, 1, oct
, "%s (%u)", str
, tmp_oct
);
561 if (length
== offset
) {
566 oct
= tvb_get_uint8(tvb
, offset
);
569 str
= "Use the value indicated by the Maximum bit rate for downlink";
572 temp32
= qos_calc_ext_bitrate(oct
);
573 if (temp32
% 1000 == 0)
574 str
= wmem_strdup_printf(pinfo
->pool
, "%u Mbps", temp32
/ 1000);
576 str
= wmem_strdup_printf(pinfo
->pool
, "%u kbps", temp32
);
578 proto_tree_add_uint_format_value(subtree
, hf_gsm_map_qos_max_bitrate_downl_ext
, tvb
,
579 offset
, 1, oct
, "%s (%u)", str
, oct
);
582 if (length
== offset
) {
587 oct
= tvb_get_uint8(tvb
, offset
);
590 str
= "Use the value indicated by the Guaranteed bit rate for downlink";
593 temp32
= qos_calc_ext_bitrate(oct
);
594 if (temp32
% 1000 == 0)
595 str
= wmem_strdup_printf(pinfo
->pool
, "%u Mbps", temp32
/ 1000);
597 str
= wmem_strdup_printf(pinfo
->pool
, "%u kbps", temp32
);
599 proto_tree_add_uint_format_value(subtree
, hf_gsm_map_qos_guar_bitrate_downl_ext
, tvb
,
600 offset
, 1, oct
, "%s (%u)", str
, oct
);
605 Ext3-QoS-Subscribed ::= OCTET STRING (SIZE (1..2))
606 -- Octets 1-2 are coded according to 3GPP TS 24.008 [35] Quality of Service Octets 17-18.
610 dissect_gsm_map_ext3_qos_subscribed(tvbuff_t
*tvb
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, asn1_ctx_t
*actx
) {
617 int length
= tvb_reported_length(tvb
);
619 subtree
= proto_item_add_subtree(actx
->created_item
, ett_gsm_map_ext3_qos_subscribed
);
621 /* Maximum bit rate for uplink (extended) Octet 17 */
622 oct
= tvb_get_uint8(tvb
, offset
);
625 str
= "Use the value indicated by the Maximum bit rate for uplink";
628 temp32
= qos_calc_ext_bitrate(oct
);
629 if (temp32
% 1000 == 0)
630 str
= wmem_strdup_printf(pinfo
->pool
, "%u Mbps", temp32
/ 1000);
632 str
= wmem_strdup_printf(pinfo
->pool
, "%u kbps", temp32
);
634 proto_tree_add_uint_format_value(subtree
, hf_gsm_map_qos_max_bitrate_upl_ext
, tvb
,
635 offset
, 1, oct
, "%s (%u)", str
, oct
);
638 if (length
== offset
) {
642 /* Guaranteed bit rate for uplink (extended) Octet 18 */
643 oct
= tvb_get_uint8(tvb
, offset
);
646 str
= "Use the value indicated by the Guaranteed bit rate for uplink";
649 temp32
= qos_calc_ext_bitrate(oct
);
650 if (temp32
% 1000 == 0)
651 str
= wmem_strdup_printf(pinfo
->pool
, "%u Mbps", temp32
/ 1000);
653 str
= wmem_strdup_printf(pinfo
->pool
, "%u kbps", temp32
);
655 proto_tree_add_uint_format_value(subtree
, hf_gsm_map_qos_guar_bitrate_upl_ext
, tvb
,
656 offset
, 1, oct
, "%s (%u)", str
, oct
);
662 dissect_gsm_map_ext4_qos_subscribed(tvbuff_t
*tvb
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, asn1_ctx_t
*actx
) {
666 subtree
= proto_item_add_subtree(actx
->created_item
, ett_gsm_map_ext3_qos_subscribed
);
668 proto_tree_add_item(subtree
, hf_gsm_map_earp_pvi
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
669 proto_tree_add_item(subtree
, hf_gsm_map_earp_pl
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
670 proto_tree_add_item(subtree
, hf_gsm_map_earp_pci
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
673 #define ELLIPSOID_POINT 0
674 #define ELLIPSOID_POINT_WITH_UNCERT_CIRC 1
675 #define ELLIPSOID_POINT_WITH_UNCERT_ELLIPSE 3
677 #define ELLIPSOID_POINT_WITH_ALT 8
678 #define ELLIPSOID_POINT_WITH_ALT_AND_UNCERT_ELLIPSOID 9
679 #define ELLIPSOID_ARC 10
682 0 0 0 0 Ellipsoid Point
683 0 0 0 1 Ellipsoid point with uncertainty Circle
684 0 0 1 1 Ellipsoid point with uncertainty Ellipse
686 1 0 0 0 Ellipsoid point with altitude
687 1 0 0 1 Ellipsoid point with altitude and uncertainty Ellipsoid
688 1 0 1 0 Ellipsoid Arc
689 other values reserved for future use
692 /* TS 23 032 Table 2a: Coding of Type of Shape */
694 static const value_string type_of_shape_vals
[] = {
695 { ELLIPSOID_POINT
, "Ellipsoid Point"},
696 { ELLIPSOID_POINT_WITH_UNCERT_CIRC
, "Ellipsoid point with uncertainty Circle"},
697 { ELLIPSOID_POINT_WITH_UNCERT_ELLIPSE
, "Ellipsoid point with uncertainty Ellipse"},
698 { POLYGON
, "Polygon"},
699 { ELLIPSOID_POINT_WITH_ALT
, "Ellipsoid point with altitude"},
700 { ELLIPSOID_POINT_WITH_ALT_AND_UNCERT_ELLIPSOID
, "Ellipsoid point with altitude and uncertainty Ellipsoid"},
701 { ELLIPSOID_ARC
, "Ellipsoid Arc"},
705 /* 3GPP TS 23.032 7.3.1 */
706 static const value_string sign_of_latitude_vals
[] = {
712 static const value_string dir_of_alt_vals
[] = {
713 { 0, "Altitude expresses height"},
714 { 1, "Altitude expresses depth"},
719 static const value_string gsm_map_cbs_data_coding_scheme_coding_grp_vals
[] = {
720 { 0, "Coding Group 0(Language using the GSM 7 bit default alphabet)" },
721 { 1, "Coding Group 1" },
722 { 2, "Coding Group 2" },
723 { 3, "Coding Group 3" },
724 { 4, "General Data Coding indication" },
725 { 5, "General Data Coding indication" },
726 { 6, "General Data Coding indication" },
727 { 7, "General Data Coding indication" },
729 { 9, "Message with User Data Header (UDH) structure" },
734 { 14,"Defined by the WAP Forum" },
735 { 15,"Data coding / message handling" },
738 static value_string_ext gsm_map_cbs_data_coding_scheme_coding_grp_vals_ext
= VALUE_STRING_EXT_INIT(gsm_map_cbs_data_coding_scheme_coding_grp_vals
);
741 * Bits 3..0 indicate the language:
743 static const value_string gsm_map_cbs_coding_grp0_lang_vals
[] = {
759 { 15, "Language unspecified"},
762 static value_string_ext gsm_map_cbs_coding_grp0_lang_vals_ext
= VALUE_STRING_EXT_INIT(gsm_map_cbs_coding_grp0_lang_vals
);
764 static const value_string gsm_map_cbs_coding_grp1_lang_vals
[] = {
765 { 0, "GSM 7 bit default alphabet; message preceded by language indication"},
766 { 1, "UCS2; message preceded by language indication"},
783 static value_string_ext gsm_map_cbs_coding_grp1_lang_vals_ext
= VALUE_STRING_EXT_INIT(gsm_map_cbs_coding_grp1_lang_vals
);
785 static const value_string gsm_map_cbs_coding_grp2_lang_vals
[] = {
791 { 5, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
792 { 6, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
793 { 7, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
794 { 8, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
795 { 9, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
796 { 10, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
797 { 11, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
798 { 12, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
799 { 13, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
800 { 14, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
801 { 15, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
804 static value_string_ext gsm_map_cbs_coding_grp2_lang_vals_ext
= VALUE_STRING_EXT_INIT(gsm_map_cbs_coding_grp2_lang_vals
);
806 static const value_string gsm_map_cbs_coding_grp3_lang_vals
[] = {
807 { 0, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
808 { 1, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
809 { 2, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
810 { 3, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
811 { 4, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
812 { 5, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
813 { 6, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
814 { 7, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
815 { 8, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
816 { 9, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
817 { 10, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
818 { 11, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
819 { 12, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
820 { 13, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
821 { 14, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
822 { 15, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
825 static value_string_ext gsm_map_cbs_coding_grp3_lang_vals_ext
= VALUE_STRING_EXT_INIT(gsm_map_cbs_coding_grp3_lang_vals
);
827 static const true_false_string gsm_map_cbs_coding_grp4_7_comp_vals
= {
828 "The text is compressed using the compression algorithm defined in 3GPP TS 23.042",
829 "The text is uncompressed"
832 static const true_false_string gsm_map_cbs_coding_grp4_7_class_ind_vals
= {
833 "Bits 1 to 0 have a message class meaning",
834 "Bits 1 to 0 are reserved and have no message class meaning"
837 /* Bits 3 and 2 indicate the character set being used, as follows: */
839 static const value_string gsm_map_cbs_coding_grp4_7_char_set_vals
[] = {
840 { 0, "GSM 7 bit default alphabet"},
842 { 2, "UCS2 (16 bit)"},
847 static const value_string gsm_map_cbs_coding_grp4_7_class_vals
[] = {
849 { 1, "Class 1 Default meaning: ME-specific"},
850 { 2, "Class 2 (U)SIM specific message"},
851 { 3, "Class 3 Default meaning: TE-specific (see 3GPP TS 27.005"},
855 static const value_string gsm_map_cbs_coding_grp15_mess_code_vals
[] = {
856 { 0, "GSM 7 bit default alphabet"},
861 static const value_string gsm_map_cbs_coding_grp15_class_vals
[] = {
862 { 0, "GSM 7 bit default alphabet"},
868 /* 3GPP TS 23.038 version 7.0.0 Release 7 */
870 dissect_cbs_data_coding_scheme(tvbuff_t
*tvb
, packet_info
*pinfo _U_
, proto_tree
*tree
, uint16_t offset
)
874 uint8_t character_set
;
876 octet
= tvb_get_uint8(tvb
,offset
);
877 coding_grp
= octet
>>4;
878 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
880 sms_encoding
= SMS_ENCODING_NOT_SET
;
883 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp0_lang
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
884 sms_encoding
= SMS_ENCODING_7BIT
;
887 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp1_lang
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
888 if ((octet
& 0x0f)== 0){
889 sms_encoding
= SMS_ENCODING_7BIT_LANG
;
891 sms_encoding
= SMS_ENCODING_UCS2_LANG
;
895 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp2_lang
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
896 sms_encoding
= SMS_ENCODING_7BIT
;
899 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp3_lang
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
900 sms_encoding
= SMS_ENCODING_7BIT
;
902 /* Coding_grp 01xx */
911 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp4_7_comp
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
912 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp4_7_class_ind
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
913 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp4_7_char_set
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
914 if ((octet
& 0x10)== 0x10){
915 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp4_7_class
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
917 /* Bits 3 and 2 indicate the character set being used, */
918 character_set
= (octet
&0x0c)>>2;
919 switch (character_set
){
921 /* GSM 7 bit default alphabet */
922 sms_encoding
= SMS_ENCODING_7BIT
;
926 sms_encoding
= SMS_ENCODING_8BIT
;
930 sms_encoding
= SMS_ENCODING_UCS2
;
934 sms_encoding
= SMS_ENCODING_NOT_SET
;
941 /* Reserved coding groups */
944 /* Message with User Data Header (UDH) structure:*/
945 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp4_7_char_set
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
946 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp4_7_class
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
947 character_set
= (octet
&0x0c)>>2;
948 switch (character_set
){
950 /* GSM 7 bit default alphabet */
951 sms_encoding
= SMS_ENCODING_7BIT
;
955 sms_encoding
= SMS_ENCODING_8BIT
;
959 sms_encoding
= SMS_ENCODING_UCS2
;
963 sms_encoding
= SMS_ENCODING_NOT_SET
;
977 /* 1010..1101 Reserved coding groups */
980 /* Defined by the WAP Forum
981 * "Wireless Datagram Protocol Specification", Wireless Application Protocol Forum Ltd.
985 /* Data coding / message handling */
986 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp15_mess_code
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
987 proto_tree_add_item(tree
, hf_gsm_map_cbs_coding_grp15_class
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
988 character_set
= (octet
&0x04)>>2;
989 if (character_set
== 0){
990 sms_encoding
= SMS_ENCODING_7BIT
;
992 sms_encoding
= SMS_ENCODING_8BIT
;
1002 dissect_gsm_map_msisdn(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
)
1008 proto_tree_add_item(tree
, hf_gsm_map_extension
, tvb
, 0,1,ENC_BIG_ENDIAN
);
1009 proto_tree_add_item(tree
, hf_gsm_map_nature_of_number
, tvb
, 0,1,ENC_BIG_ENDIAN
);
1010 proto_tree_add_item(tree
, hf_gsm_map_number_plan
, tvb
, 0,1,ENC_BIG_ENDIAN
);
1012 if(tvb_reported_length(tvb
)==1)
1015 octet
= tvb_get_uint8(tvb
,0);
1016 /* nature of address indicator */
1017 na
= (octet
& 0x70)>>4;
1018 /* numbering plan indicator */
1022 /* ISDN/Telephony Numbering Plan (Rec ITU-T E.164) */
1025 /* international number */
1026 dissect_e164_msisdn(tvb
, tree
, 1, tvb_reported_length(tvb
)-1, E164_ENC_BCD
);
1029 proto_tree_add_item(tree
, hf_gsm_map_address_digits
, tvb
, 1, -1, ENC_BCD_DIGITS_0_9
|ENC_LITTLE_ENDIAN
);
1034 /* land mobile numbering plan (ITU-T Rec E.212) */
1035 dissect_e212_imsi(tvb
, pinfo
, tree
, 1, tvb_reported_length(tvb
)-1, false);
1038 proto_tree_add_item(tree
, hf_gsm_map_address_digits
, tvb
, 1, -1, ENC_BCD_DIGITS_0_9
|ENC_LITTLE_ENDIAN
);
1044 #include "packet-gsm_map-fn.c"
1046 /* Specific translation for MAP V3 */
1047 static const value_string gsm_map_V1V2_opr_code_strings
[] = {
1048 { 44, "forwardSM" },
1049 { 45, "sendRoutingInfoForSM" },
1050 { 46, "forwardSM" },
1053 /* Generic translation for MAP operation */
1054 const value_string gsm_map_opr_code_strings
[] = {
1055 #include "packet-gsm_map-table.c"
1060 static const value_string gsm_map_err_code_string_vals
[] = {
1061 #include "packet-gsm_map-table.c"
1067 static const value_string gsm_map_nature_of_number_values
[] = {
1068 { 0x00, "unknown" },
1069 { 0x01, "International Number" },
1070 { 0x02, "National Significant Number" },
1071 { 0x03, "Network Specific Number" },
1072 { 0x04, "Subscriber Number" },
1073 { 0x05, "Reserved" },
1074 { 0x06, "Abbreviated Number" },
1075 { 0x07, "Reserved for extension" },
1078 static value_string_ext gsm_map_nature_of_number_values_ext
= VALUE_STRING_EXT_INIT(gsm_map_nature_of_number_values
);
1080 static const value_string gsm_map_number_plan_values
[] = {
1081 { 0x00, "unknown" },
1082 { 0x01, "ISDN/Telephony Numbering (Rec ITU-T E.164)" },
1084 { 0x03, "Data Numbering (ITU-T Rec. X.121)" },
1085 { 0x04, "Telex Numbering (ITU-T Rec. F.69)" },
1087 { 0x06, "Land Mobile Numbering (ITU-T Rec. E.212)" },
1089 { 0x08, "National Numbering" },
1090 { 0x09, "Private Numbering" },
1096 { 0x0f, "Reserved for extension" },
1099 static value_string_ext gsm_map_number_plan_values_ext
= VALUE_STRING_EXT_INIT(gsm_map_number_plan_values
);
1101 static const true_false_string gsm_map_Ss_Status_q_bit_values
= {
1105 static const true_false_string gsm_map_Ss_Status_a_values
= {
1111 * Translate the MAP operation code value to a text string
1112 * Take into account the MAP version for ForwardSM
1114 const char* gsm_map_opr_code(uint32_t val
, proto_item
*item
) {
1116 case 44: /*mt-forwardSM*/
1118 case 46: /*mo-forwardSM*/
1119 if (application_context_version
< 3) {
1120 proto_item_set_text(item
, "%s (%d)", val_to_str_const(val
, gsm_map_V1V2_opr_code_strings
, "Unknown GSM-MAP opcode"), val
);
1121 return val_to_str_const(val
, gsm_map_V1V2_opr_code_strings
, "Unknown GSM-MAP opcode");
1123 /* Else use the default map operation translation */
1126 return val_to_str_ext_const(val
, &gsm_old_GSMMAPOperationLocalvalue_vals_ext
, "Unknown GSM-MAP opcode");
1130 /* Prototype for a decoding function */
1131 typedef int (* dissect_function_t
)( bool,
1139 * Dissect Multiple Choice Message
1140 * This function is used to decode a message, when several encoding may be used.
1141 * For example, in the last MAP version, the Cancel Location is defined like this:
1142 * CancelLocationArg ::= [3] IMPLICIT SEQUENCE
1143 * But in the previous MAP version, it was a CHOICE between a SEQUENCE and an IMSI
1144 * As ASN1 encoders (or software) still uses the old encoding, this function allows
1145 * the decoding of both versions.
1146 * Moreover, some optimizations (or bad practice ?) in ASN1 encoder, removes the
1147 * SEQUENCE tag, when only one parameter is present in the SEQUENCE.
1148 * This explain why the function expects 3 parameters:
1149 * - a [3] SEQUENCE corresponding the recent ASN1 MAP encoding
1150 * - a SEQUENCE for old style
1151 * - and a single parameter, for old version or optimizations
1153 * The analyze of the first ASN1 tag, indicate what kind of decoding should be used,
1154 * if the decoding function is provided (so not a NULL function)
1156 static int dissect_mc_message(tvbuff_t
*tvb
,
1160 bool implicit_param _U_
, dissect_function_t parameter
, int hf_index_param _U_
,
1161 bool implicit_seq _U_
, dissect_function_t sequence
, int hf_index_seq _U_
,
1162 bool implicit_seq3 _U_
, dissect_function_t sequence3
, int hf_index_seq3 _U_
)
1166 bool bug_pc
, bug_ind_field
;
1170 octet
= tvb_get_uint8(tvb
,0);
1171 if ( (octet
& 0xf) == 3) {
1172 /* XXX asn2wrs can not yet handle tagged assignment yes so this
1173 * XXX is some conformance file magic to work around that bug
1175 offset
= get_ber_identifier(tvb
, offset
, &bug_class
, &bug_pc
, &bug_tag
);
1176 offset
= get_ber_length(tvb
, offset
, &bug_len
, &bug_ind_field
);
1177 if (sequence3
!= NULL
) {
1178 offset
= (sequence3
) (implicit_seq3
, tvb
, offset
, actx
, tree
, hf_index_seq3
);
1180 proto_tree_add_expert(tree
, actx
->pinfo
, &ei_gsm_map_unknown_sequence3
, tvb
, offset
, -1);
1182 } else if (octet
== 0x30) {
1183 if (sequence
!= NULL
) {
1184 offset
= (sequence
) (implicit_seq
, tvb
, 0, actx
, tree
, hf_index_seq
);
1186 proto_tree_add_expert(tree
, actx
->pinfo
, &ei_gsm_map_unknown_sequence
, tvb
, offset
, -1);
1189 if (parameter
!= NULL
) {
1190 offset
= (parameter
) (implicit_param
, tvb
, offset
, actx
, tree
, hf_index_param
);
1192 proto_tree_add_expert(tree
, actx
->pinfo
, &ei_gsm_map_unknown_parameter
, tvb
, offset
, -1);
1198 static int dissect_invokeData(proto_tree
*tree
, tvbuff_t
*tvb
, int offset
, asn1_ctx_t
*actx
) {
1201 case 2: /*updateLocation*/
1202 offset
=dissect_gsm_map_ms_UpdateLocationArg(false, tvb
, offset
, actx
, tree
, -1);
1204 case 3: /*cancelLocation*/
1205 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1206 false, dissect_gsm_map_Identity
, hf_gsm_map_ms_identity
,
1207 false, dissect_gsm_map_Identity
, hf_gsm_map_ms_identity
,
1208 true , dissect_gsm_map_ms_CancelLocationArg
, -1);/*undefined*/
1210 case 4: /*provideRoamingNumber*/
1211 offset
=dissect_gsm_map_ch_ProvideRoamingNumberArg(false, tvb
, offset
, actx
, tree
, -1);
1213 case 5: /*noteSubscriberDataModified*/
1214 offset
=dissect_gsm_map_ms_NoteSubscriberDataModifiedArg(false, tvb
, offset
, actx
, tree
, -1);
1216 case 6: /*resumeCallHandling*/
1217 offset
=dissect_gsm_map_ch_ResumeCallHandlingArg(false, tvb
, offset
, actx
, tree
, -1);
1219 case 7: /*insertSubscriberData*/
1220 offset
=dissect_gsm_map_ms_InsertSubscriberDataArg(false, tvb
, offset
, actx
, tree
, -1);
1222 case 8: /*deleteSubscriberData*/
1223 offset
=dissect_gsm_map_ms_DeleteSubscriberDataArg(false, tvb
, offset
, actx
, tree
, -1);
1225 case 9: /*sendParameters*/
1226 offset
= dissect_gsm_old_SendParametersArg(false, tvb
, offset
, actx
, tree
, -1);
1228 case 10: /*registerSS*/
1229 offset
=dissect_gsm_map_ss_RegisterSS_Arg(false, tvb
, offset
, actx
, tree
, -1);
1231 case 11: /*eraseSS*/
1232 offset
=dissect_gsm_map_ss_SS_ForBS_Code(false, tvb
, offset
, actx
, tree
, -1);
1234 case 12: /*activateSS*/
1235 offset
=dissect_gsm_map_ss_SS_ForBS_Code(false, tvb
, offset
, actx
, tree
, -1);
1237 case 13: /*deactivateSS*/
1238 offset
=dissect_gsm_map_ss_SS_ForBS_Code(false, tvb
, offset
, actx
, tree
, -1);
1240 case 14: /*interrogateSS*/
1241 offset
=dissect_gsm_map_ss_SS_ForBS_Code(false, tvb
, offset
, actx
, tree
, -1);
1243 case 15: /*authenticationFailureReport*/
1244 offset
=dissect_gsm_map_ms_AuthenticationFailureReportArg(false, tvb
, offset
, actx
, tree
, -1);
1246 case 16: /*SS-protocol notifySS*/
1247 offset
=dissect_gsm_ss_NotifySS_Arg(false, tvb
, offset
, actx
, tree
, -1);
1249 case 17: /*registerPassword*/
1250 offset
=dissect_gsm_map_SS_Code(false, tvb
, offset
, actx
, tree
, hf_gsm_map_ss_Code
);
1252 case 18: /*getPassword*/
1253 offset
=dissect_gsm_old_GetPasswordArg(false, tvb
, offset
, actx
, tree
, hf_gsm_map_getPassword
);
1255 case 19: /* SS-Protocol processUnstructuredSS-Data (19) */
1256 offset
=dissect_gsm_ss_SS_UserData(false, tvb
, offset
, actx
, tree
, hf_gsm_map_ss_SS_UserData
);
1258 case 20: /*releaseResources*/
1259 offset
=dissect_gsm_map_ch_ReleaseResourcesArg(false, tvb
, offset
, actx
, tree
, -1);
1261 case 21: /*mt-ForwardSM-VGCS*/
1262 offset
=dissect_gsm_map_sm_MT_ForwardSM_VGCS_Arg(false, tvb
, offset
, actx
, tree
, -1);
1264 case 22: /*sendRoutingInfo*/
1265 if (application_context_version
== 3){
1266 offset
=dissect_gsm_map_ch_SendRoutingInfoArg(false, tvb
, offset
, actx
, tree
, -1);
1268 offset
= dissect_gsm_old_SendRoutingInfoArgV2(false, tvb
, offset
, actx
, tree
, -1);
1271 case 23: /*updateGprsLocation*/
1272 offset
=dissect_gsm_map_ms_UpdateGprsLocationArg(false, tvb
, offset
, actx
, tree
, -1);
1274 case 24: /*sendRoutingInfoForGprs*/
1275 offset
=dissect_gsm_map_ms_SendRoutingInfoForGprsArg(false, tvb
, offset
, actx
, tree
, -1);
1277 case 25: /*failureReport*/
1278 offset
=dissect_gsm_map_ms_FailureReportArg(false, tvb
, offset
, actx
, tree
, -1);
1280 case 26: /*noteMsPresentForGprs*/
1281 offset
=dissect_gsm_map_ms_NoteMsPresentForGprsArg(false, tvb
, offset
, actx
, tree
, -1);
1284 /* reserved performHandover (28) */
1285 case 29: /*sendEndSignal*/
1286 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1288 false, dissect_gsm_old_Bss_APDU
, -1,
1289 true , dissect_gsm_map_ms_SendEndSignal_Arg
, -1);
1291 /* reserved performSubsequentHandover (30) */
1292 case 31: /*provideSIWFSNumber*/
1293 offset
=dissect_gsm_old_ProvideSIWFSNumberArg(false, tvb
, offset
, actx
, tree
, -1);
1295 case 32: /*sIWFSSignallingModify*/
1296 offset
=dissect_gsm_old_SIWFSSignallingModifyArg(false, tvb
, offset
, actx
, tree
, -1);
1298 case 33: /*processAccessSignalling*/
1299 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1301 false, dissect_gsm_old_Bss_APDU
, -1,
1302 true , dissect_gsm_map_ms_ProcessAccessSignalling_Arg
, -1);
1304 case 34: /*forwardAccessSignalling*/
1305 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1307 false, dissect_gsm_old_Bss_APDU
, -1,
1308 true , dissect_gsm_map_ms_ForwardAccessSignalling_Arg
, -1);
1310 /* reserved noteInternalHandover (35) */
1311 case 36: /*cancelVcsgLocation*/
1312 offset
=dissect_gsm_map_ms_CancelVcsgLocationArg(false, tvb
, offset
, actx
, tree
, -1);
1315 if (application_context_version
== 1) {
1316 offset
= dissect_gsm_old_ResetArgV1(false, tvb
, offset
, actx
, tree
, -1);
1318 offset
= dissect_gsm_map_ms_ResetArg(false, tvb
, offset
, actx
, tree
, -1);
1321 case 38: /*forwardCheckSS-Indication*/
1323 case 39: /*prepareGroupCall*/
1324 offset
=dissect_gsm_map_gr_PrepareGroupCallArg(false, tvb
, offset
, actx
, tree
, -1);
1326 case 40: /*sendGroupCallEndSignal*/
1327 offset
= dissect_gsm_map_gr_SendGroupCallEndSignalArg(false, tvb
, offset
, actx
, tree
, -1);
1329 case 41: /*processGroupCallSignalling*/
1330 offset
= dissect_gsm_map_gr_ProcessGroupCallSignallingArg(false, tvb
, offset
, actx
, tree
, -1);
1332 case 42: /*forwardGroupCallSignalling*/
1333 offset
=dissect_gsm_map_gr_ForwardGroupCallSignallingArg(false, tvb
, offset
, actx
, tree
, -1);
1335 case 43: /*checkIMEI*/
1336 if (pref_ericsson_proprietary_ext
) {
1337 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1338 false, dissect_gsm_map_IMEI
, hf_gsm_map_ms_imei
,
1339 false, dissect_gsm_map_ericsson_EnhancedCheckIMEI_Arg
, -1,
1340 true , NULL
, -1); /* no [3] SEQUENCE */
1342 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1343 false, dissect_gsm_map_IMEI
, hf_gsm_map_ms_imei
,
1344 false, dissect_gsm_map_ms_CheckIMEI_Arg
, -1,
1345 true , NULL
, -1); /* no [3] SEQUENCE */
1348 case 44: /*mt-forwardSM(v3) or ForwardSM(v1/v2)*/
1349 if (application_context_version
== 3)
1350 offset
=dissect_gsm_map_sm_MT_ForwardSM_Arg(false, tvb
, offset
, actx
, tree
, -1);
1352 offset
=dissect_gsm_old_ForwardSM_Arg(false, tvb
, offset
, actx
, tree
, -1);
1355 case 45: /*sendRoutingInfoForSM*/
1356 if (application_context_version
< 2) {
1357 offset
=dissect_gsm_old_RoutingInfoForSM_ArgV1(false, tvb
, offset
, actx
, tree
, -1);
1359 offset
=dissect_gsm_map_sm_RoutingInfoForSM_Arg(false, tvb
, offset
, actx
, tree
, -1);
1362 case 46: /*mo-forwardSM(v3) or ForwardSM(v1/v2)*/
1363 if (application_context_version
== 3)
1364 offset
=dissect_gsm_map_sm_MO_ForwardSM_Arg(false, tvb
, offset
, actx
, tree
, -1);
1366 offset
=dissect_gsm_old_ForwardSM_Arg(false, tvb
, offset
, actx
, tree
, -1);
1369 case 47: /*reportSM-DeliveryStatus*/
1370 offset
=dissect_gsm_map_sm_ReportSM_DeliveryStatusArg(false, tvb
, offset
, actx
, tree
, -1);
1372 case 48: /*noteSubscriberPresent*/
1373 offset
= dissect_gsm_map_IMSI(false, tvb
, offset
, actx
, tree
, hf_gsm_map_imsi
);
1375 /* reserved alertServiceCentreWithoutResult (49)
1376 * ETS 300 599: December 2000 (GSM 09.02 version 4.19.1)
1377 * -- alertServiceCentreWithoutResult must not be used in
1378 * -- version greater 1
1381 offset
= dissect_gsm_map_sm_AlertServiceCentreArg(false, tvb
, offset
, actx
, tree
, -1);
1383 case 50: /*activateTraceMode*/
1384 offset
=dissect_gsm_map_om_ActivateTraceModeArg(false, tvb
, offset
, actx
, tree
, -1);
1386 case 51: /*deactivateTraceMode*/
1387 offset
=dissect_gsm_map_om_DeactivateTraceModeArg(false, tvb
, offset
, actx
, tree
, -1);
1389 /* reserved traceSubscriberActivity (52) */
1391 case 53: /* UpdateVcsgLocation 53 */
1392 offset
=dissect_gsm_map_ms_UpdateVcsgLocationArg(false, tvb
, offset
, actx
, tree
, -1);
1394 case 54: /*beginSubscriberActivity*/
1395 offset
=dissect_gsm_old_BeginSubscriberActivityArg(false, tvb
, offset
, actx
, tree
, -1);
1397 case 55: /*sendIdentification*/
1398 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1399 false, dissect_gsm_map_TMSI
, hf_gsm_map_tmsi
,
1400 false, dissect_gsm_map_ms_SendIdentificationArg
, -1,
1403 case 56: /*sendAuthenticationInfo*/
1404 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1405 false, dissect_gsm_map_IMSI
, hf_gsm_map_imsi
,
1406 false, dissect_gsm_map_ms_SendAuthenticationInfoArg
, -1,
1409 case 57: /*restoreData*/
1410 offset
=dissect_gsm_map_ms_RestoreDataArg(false, tvb
, offset
, actx
, tree
, -1);
1412 case 58: /*sendIMSI*/
1413 offset
= dissect_gsm_map_ISDN_AddressString(false, tvb
, offset
, actx
, tree
, hf_gsm_map_msisdn
);
1415 case 59: /*processUnstructuredSS-Request*/
1416 offset
=dissect_gsm_map_ss_USSD_Arg(false, tvb
, offset
, actx
, tree
, -1);
1418 case 60: /*unstructuredSS-Request*/
1419 offset
=dissect_gsm_map_ss_USSD_Arg(false, tvb
, offset
, actx
, tree
, -1);
1421 case 61: /*unstructuredSS-Notify*/
1422 offset
=dissect_gsm_map_ss_USSD_Arg(false, tvb
, offset
, actx
, tree
, -1);
1424 case 62: /*AnyTimeSubscriptionInterrogation*/
1425 offset
=dissect_gsm_map_ms_AnyTimeSubscriptionInterrogationArg(false, tvb
, offset
, actx
, tree
, -1);
1427 case 63: /*informServiceCentre*/
1428 offset
=dissect_gsm_map_sm_InformServiceCentreArg(false, tvb
, offset
, actx
, tree
, -1);
1430 case 64: /*alertServiceCentre*/
1431 offset
=dissect_gsm_map_sm_AlertServiceCentreArg(false, tvb
, offset
, actx
, tree
, -1);
1433 case 65: /*AnyTimeModification*/
1434 offset
=dissect_gsm_map_ms_AnyTimeModificationArg(false, tvb
, offset
, actx
, tree
, -1);
1436 case 66: /*readyForSM*/
1437 offset
=dissect_gsm_map_sm_ReadyForSM_Arg(false, tvb
, offset
, actx
, tree
, -1);
1439 case 67: /*purgeMS*/
1440 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1441 false, dissect_gsm_map_IMSI
, hf_gsm_map_imsi
,
1442 false, dissect_gsm_old_PurgeMSArgV2
, -1, /*undefined*/
1443 true , dissect_gsm_map_ms_PurgeMS_Arg
, -1);
1445 case 68: /*prepareHandover*/
1446 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1448 false, dissect_gsm_old_PrepareHO_ArgOld
, -1,
1449 true, dissect_gsm_map_ms_PrepareHO_Arg
, -1);
1451 case 69: /*prepareSubsequentHandover*/
1452 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1455 true, dissect_gsm_map_ms_PrepareSubsequentHO_Arg
, -1);
1457 case 70: /*provideSubscriberInfo*/
1458 offset
=dissect_gsm_map_ms_ProvideSubscriberInfoArg(false, tvb
, offset
, actx
, tree
, -1);
1460 case 71: /*anyTimeInterrogation*/
1461 offset
=dissect_gsm_map_ms_AnyTimeInterrogationArg(false, tvb
, offset
, actx
, tree
, -1);
1463 case 72: /*ss-InvocationNotification*/
1464 offset
=dissect_gsm_map_ss_SS_InvocationNotificationArg(false, tvb
, offset
, actx
, tree
, -1);
1466 case 73: /*setReportingState*/
1467 offset
=dissect_gsm_map_ch_SetReportingStateArg(false, tvb
, offset
, actx
, tree
, -1);
1469 case 74: /*statusReport*/
1470 offset
=dissect_gsm_map_ch_StatusReportArg(false, tvb
, offset
, actx
, tree
, -1);
1472 case 75: /*remoteUserFree*/
1473 offset
=dissect_gsm_map_ch_RemoteUserFreeArg(false, tvb
, offset
, actx
, tree
, -1);
1475 case 76: /*registerCC-Entry*/
1476 offset
=dissect_gsm_map_ss_RegisterCC_EntryArg(false, tvb
, offset
, actx
, tree
, -1);
1478 case 77: /*eraseCC-Entry*/
1479 offset
=dissect_gsm_map_ss_EraseCC_EntryArg(false, tvb
, offset
, actx
, tree
, -1);
1481 case 78: /*secureTransportClass1*/
1482 case 79: /*secureTransportClass1*/
1483 case 80: /*secureTransportClass1*/
1484 case 81: /*secureTransportClass1*/
1485 offset
=dissect_gsm_old_SecureTransportArg(false, tvb
, offset
, actx
, tree
, -1);
1488 case 83: /*provideSubscriberLocation*/
1489 offset
=dissect_gsm_map_lcs_ProvideSubscriberLocation_Arg(false, tvb
, offset
, actx
, tree
, -1);
1491 case 84: /*sendGroupCallInfo*/
1492 offset
=dissect_gsm_map_gr_SendGroupCallInfoArg(false, tvb
, offset
, actx
, tree
, -1);
1494 case 85: /*sendRoutingInfoForLCS*/
1495 offset
=dissect_gsm_map_lcs_RoutingInfoForLCS_Arg(false, tvb
, offset
, actx
, tree
, -1);
1497 case 86: /*subscriberLocationReport*/
1498 offset
=dissect_gsm_map_lcs_SubscriberLocationReport_Arg(false, tvb
, offset
, actx
, tree
, -1);
1500 case 87: /*ist-Alert*/
1501 offset
=dissect_gsm_map_ch_IST_AlertArg(false, tvb
, offset
, actx
, tree
, -1);
1503 case 88: /*ist-Command*/
1504 offset
=dissect_gsm_map_ch_IST_CommandArg(false, tvb
, offset
, actx
, tree
, -1);
1506 case 89: /*noteMM-Event*/
1507 offset
=dissect_gsm_map_ms_NoteMM_EventArg(false, tvb
, offset
, actx
, tree
, -1);
1509 case 108: /*SS-protocol lcs-PeriodicTriggeredInvoke*/
1510 offset
= dissect_gsm_ss_LCS_PeriodicTriggeredInvokeArg(false, tvb
, offset
, actx
, tree
, -1);
1512 case 109: /*SS-protocol lcs-PeriodicLocationCancellation*/
1513 offset
=dissect_gsm_ss_LCS_PeriodicLocationCancellationArg(false, tvb
, offset
, actx
, tree
, -1);
1515 case 110: /*SS-protocol lcs-LocationUpdate*/
1516 offset
=dissect_gsm_ss_LCS_LocationUpdateArg(false, tvb
, offset
, actx
, tree
, -1);
1518 case 111: /*SS-protocol lcs-PeriodicLocationRequest*/
1519 offset
=dissect_gsm_ss_LCS_PeriodicLocationRequestArg(false, tvb
, offset
, actx
, tree
, -1);
1521 case 112: /*SS-protocol lcs-AreaEventCancellation*/
1522 offset
=dissect_gsm_ss_LCS_AreaEventCancellationArg(false, tvb
, offset
, actx
, tree
, -1);
1524 case 113: /*SS-protocol lcs-AreaEventReport*/
1525 offset
=dissect_gsm_ss_LCS_AreaEventReportArg(false, tvb
, offset
, actx
, tree
, -1);
1527 case 114: /*SS-protocol lcs-AreaEventRequest*/
1528 offset
=dissect_gsm_ss_LCS_AreaEventRequestArg(false, tvb
, offset
, actx
, tree
, -1);
1530 case 115: /*SS-protocol lcs-MOLR*/
1531 offset
=dissect_gsm_ss_LCS_MOLRArg(false, tvb
, offset
, actx
, tree
, -1);
1533 case 116: /*SS-protocol lcs-LocationNotification*/
1534 offset
=dissect_gsm_ss_LocationNotificationArg(false, tvb
, offset
, actx
, tree
, -1);
1536 case 117: /*SS-protocol callDeflection*/
1537 offset
=dissect_gsm_ss_CallDeflectionArg(false, tvb
, offset
, actx
, tree
, -1);
1539 case 118: /*SS-protocol userUserService*/
1540 offset
=dissect_gsm_ss_UserUserServiceArg(false, tvb
, offset
, actx
, tree
, -1);
1542 case 119: /*SS-protocol accessRegisterCCEntry*/
1543 offset
=dissect_gsm_ss_AccessRegisterCCEntryArg(false, tvb
, offset
, actx
, tree
, -1);
1545 case 120: /*SS-protocol forwardCUG-Info*/
1546 application_context_version
= 3;
1547 offset
=dissect_gsm_ss_ForwardCUG_InfoArg(false, tvb
, offset
, actx
, tree
, -1);
1549 case 121: /*SS-protocol splitMPTY no Argument*/
1551 case 122: /*SS-protocol retrieveMPTY no Argument*/
1553 case 123: /*SS-protocol holdMPTY no Argument*/
1555 case 124: /*SS-protocol buildMPTY no Argument*/
1557 case 125: /*SS-protocol forwardChargeAdvice*/
1558 offset
=dissect_gsm_ss_ForwardChargeAdviceArg(false, tvb
, offset
, actx
, tree
, -1);
1560 case 126: /*SS-protocol explicitCT no Argument*/
1563 if(!dissector_try_uint_with_data(map_prop_arg_opcode_table
, (uint8_t)opcode
, tvb
, actx
->pinfo
, tree
, true, actx
->subtree
.top_tree
)){
1564 proto_tree_add_expert_format(tree
, actx
->pinfo
, &ei_gsm_map_unknown_invokeData
,
1565 tvb
, offset
, -1, "Unknown invokeData %d", opcode
);
1567 offset
+= tvb_reported_length_remaining(tvb
,offset
);
1574 static int dissect_returnResultData(proto_tree
*tree
, tvbuff_t
*tvb
, int offset
, asn1_ctx_t
*actx
) {
1577 case 2: /*updateLocation*/
1578 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1579 false, dissect_gsm_map_IMSI
, hf_gsm_map_imsi
,
1580 false, dissect_gsm_map_ms_UpdateLocationRes
, -1,
1583 case 3: /*cancelLocation*/
1584 offset
=dissect_gsm_map_ms_CancelLocationRes(false, tvb
, offset
, actx
, tree
, -1);
1586 case 4: /*provideRoamingNumber*/
1587 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1588 false, dissect_gsm_map_ISDN_AddressString
, hf_gsm_map_msisdn
,
1589 false, dissect_gsm_map_ch_ProvideRoamingNumberRes
, -1,
1590 true , NULL
, -1);/*undefined*/
1592 case 5: /*noteSubscriberDataModified*/
1593 offset
=dissect_gsm_map_ms_NoteSubscriberDataModifiedRes(false, tvb
, offset
, actx
, tree
, -1);
1595 case 6: /*resumeCallHandling*/
1596 offset
=dissect_gsm_map_ch_ResumeCallHandlingRes(false, tvb
, offset
, actx
, tree
, -1);
1598 case 7: /*insertSubscriberData*/
1599 offset
=dissect_gsm_map_ms_InsertSubscriberDataRes(false, tvb
, offset
, actx
, tree
, -1);
1601 case 8: /*deleteSubscriberData*/
1602 offset
=dissect_gsm_map_ms_DeleteSubscriberDataRes(false, tvb
, offset
, actx
, tree
, -1);
1604 case 9: /*sendParameters*/
1605 offset
= dissect_gsm_old_SentParameterList(false, tvb
, offset
, actx
, tree
, -1);
1607 case 10: /*registerSS*/
1608 offset
=dissect_gsm_map_ss_SS_Info(false, tvb
, offset
, actx
, tree
, -1);
1610 case 11: /*eraseSS*/
1611 offset
=dissect_gsm_map_ss_SS_Info(false, tvb
, offset
, actx
, tree
, -1);
1613 case 12: /*activateSS*/
1614 offset
=dissect_gsm_map_ss_SS_Info(false, tvb
, offset
, actx
, tree
, -1);
1616 case 13: /*deactivateSS*/
1617 offset
=dissect_gsm_map_ss_SS_Info(false, tvb
, offset
, actx
, tree
, -1);
1619 case 14: /*interrogateSS*/
1620 offset
=dissect_gsm_map_ss_InterrogateSS_Res(false, tvb
, offset
, actx
, tree
, -1);
1622 case 15: /*authenticationFailureReport*/
1623 offset
=dissect_gsm_map_ms_AuthenticationFailureReportRes(false, tvb
, offset
, actx
, tree
, -1);
1625 case 17: /*registerPassword*/
1626 /* change hf_gsm_map_ss_Code to something with password */
1627 offset
=dissect_gsm_old_NewPassword(false, tvb
, offset
, actx
, tree
, hf_gsm_map_ss_Code
);
1629 case 18: /*getPassword*/
1630 offset
=dissect_gsm_old_CurrentPassword(false, tvb
, offset
, actx
, tree
, hf_gsm_map_currentPassword
);
1632 case 19: /* SS-Protocol processUnstructuredSS-Data (19) */
1633 offset
=dissect_gsm_ss_SS_UserData(false, tvb
, offset
, actx
, tree
, hf_gsm_map_ss_SS_UserData
);
1635 case 20: /*releaseResources*/
1636 offset
=dissect_gsm_map_ch_ReleaseResourcesRes(false, tvb
, offset
, actx
, tree
, -1);
1638 case 21: /*mt-ForwardSM-VGCS*/
1639 offset
=dissect_gsm_map_sm_MT_ForwardSM_VGCS_Res(false, tvb
, offset
, actx
, tree
, -1);
1641 case 22: /*sendRoutingInfo*/
1642 if (application_context_version
== 3){
1643 /* If the tag is missing use SendRoutingInfoRes_U */
1644 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1646 false, dissect_gsm_map_ch_SendRoutingInfoRes_U
, -1,
1647 true , dissect_gsm_map_ch_SendRoutingInfoRes
, -1);
1649 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1650 false, dissect_gsm_map_IMSI
, hf_gsm_map_imsi
,
1651 false, dissect_gsm_old_SendRoutingInfoResV2
, -1,
1652 true , dissect_gsm_map_ch_SendRoutingInfoRes
, -1);
1655 case 23: /*updateGprsLocation*/
1656 offset
=dissect_gsm_map_ms_UpdateGprsLocationRes(false, tvb
, offset
, actx
, tree
, -1);
1658 case 24: /*sendRoutingInfoForGprs*/
1659 offset
=dissect_gsm_map_ms_SendRoutingInfoForGprsRes(false, tvb
, offset
, actx
, tree
, -1);
1661 case 25: /*failureReport*/
1662 offset
=dissect_gsm_map_ms_FailureReportRes(false, tvb
, offset
, actx
, tree
, -1);
1664 case 26: /*noteMsPresentForGprs*/
1665 offset
=dissect_gsm_map_ms_NoteMsPresentForGprsRes(false, tvb
, offset
, actx
, tree
, -1);
1667 case 29: /*sendEndSignal*/
1668 /* Taken from MAP-MobileServiceOperations{ 0 identified-organization (4) etsi (0) mobileDomain
1669 * (0) gsm-Network (1) modules (3) map-MobileServiceOperations (5) version9 (9) }
1671 offset
=dissect_gsm_map_ms_SendEndSignal_Res(false, tvb
, offset
, actx
, tree
, -1);
1673 case 31: /*provideSIWFSNumber*/
1674 offset
=dissect_gsm_old_ProvideSIWFSNumberRes(false, tvb
, offset
, actx
, tree
, -1);
1676 case 32: /*provideSIWFSSignallingModify*/
1677 offset
=dissect_gsm_old_SIWFSSignallingModifyRes(false, tvb
, offset
, actx
, tree
, -1);
1679 case 36: /*cancelVcsgLocation*/
1680 offset
=dissect_gsm_map_ms_CancelVcsgLocationRes(false, tvb
, offset
, actx
, tree
, -1);
1682 case 39: /*prepareGroupCall*/
1683 offset
=dissect_gsm_map_gr_PrepareGroupCallRes(false, tvb
, offset
, actx
, tree
, -1);
1685 case 40: /*sendGroupCallEndSignal*/
1686 offset
=dissect_gsm_map_gr_SendGroupCallEndSignalRes(false, tvb
, offset
, actx
, tree
, -1);
1688 case 43: /*checkIMEI*/
1689 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1690 false, dissect_gsm_map_ms_EquipmentStatus
, hf_gsm_map_ms_equipmentStatus
,
1691 false, dissect_gsm_map_ms_CheckIMEI_Res
, -1,
1694 case 44: /*mt-forwardSM*/
1695 offset
=dissect_gsm_map_sm_MT_ForwardSM_Res(false, tvb
, offset
, actx
, tree
, -1);
1697 case 45: /*sendRoutingInfoForSM*/
1698 if (application_context_version
< 3) {
1699 offset
=dissect_gsm_old_RoutingInfoForSM_ResV2(false, tvb
, offset
, actx
, tree
, -1);
1701 offset
=dissect_gsm_map_sm_RoutingInfoForSM_Res(false, tvb
, offset
, actx
, tree
, -1);
1704 case 46: /*mo-forwardSM*/
1705 offset
=dissect_gsm_map_sm_MO_ForwardSM_Res(false, tvb
, offset
, actx
, tree
, -1);
1707 case 47: /*reportSM-DeliveryStatus*/
1708 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1709 false, dissect_gsm_map_ISDN_AddressString
, hf_gsm_map_sm_storedMSISDN
,
1710 false, dissect_gsm_map_sm_ReportSM_DeliveryStatusRes
, -1,
1711 false, NULL
, -1);/*undefined*/
1713 case 48: /*noteSubscriberPresent*/
1715 case 50: /*activateTraceMode*/
1716 offset
=dissect_gsm_map_om_ActivateTraceModeRes(false, tvb
, offset
, actx
, tree
, -1);
1718 case 51: /*deactivateTraceMode*/
1719 offset
=dissect_gsm_map_om_DeactivateTraceModeRes(false, tvb
, offset
, actx
, tree
, -1);
1721 case 53: /* UpdateVcsgLocation 53 */
1722 offset
=dissect_gsm_map_ms_UpdateVcsgLocationRes(false, tvb
, offset
, actx
, tree
, -1);
1724 case 55: /*sendIdentification */
1725 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1726 false, dissect_gsm_map_IMSI
, hf_gsm_map_imsi
,
1727 false, dissect_gsm_old_SendIdentificationResV2
, -1,/*undefined*/
1728 true, dissect_gsm_map_ms_SendIdentificationRes
, -1);
1730 case 56: /*sendAuthenticationInfo*/
1731 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1733 false, dissect_gsm_old_SendAuthenticationInfoResOld
, -1,
1734 true , dissect_gsm_map_ms_SendAuthenticationInfoRes
, -1);
1736 case 57: /*restoreData*/
1737 offset
=dissect_gsm_map_ms_RestoreDataRes(false, tvb
, offset
, actx
, tree
, -1);
1739 case 58: /*sendIMSI*/
1740 offset
=dissect_gsm_map_IMSI(false, tvb
, offset
, actx
, tree
, hf_gsm_map_ms_imsi
);
1742 case 59: /*unstructuredSS-Request*/
1743 offset
=dissect_gsm_map_ss_USSD_Res(false, tvb
, offset
, actx
, tree
, -1);
1745 case 60: /*unstructuredSS-Request*/
1746 offset
=dissect_gsm_map_ss_USSD_Res(false, tvb
, offset
, actx
, tree
, -1);
1748 case 61: /*unstructuredSS-Notify*/
1750 proto_tree_add_expert_format(tree
, actx
->pinfo
, &ei_gsm_map_unknown_invokeData
, tvb
, offset
, -1, "Unknown returnResultData blob");
1752 case 62: /*AnyTimeSubscriptionInterrogation*/
1753 offset
=dissect_gsm_map_ms_AnyTimeSubscriptionInterrogationRes(false, tvb
, offset
, actx
, tree
, -1);
1755 case 64: /*alertServiceCentre*/
1758 case 65: /*AnyTimeModification*/
1759 offset
=dissect_gsm_map_ms_AnyTimeModificationRes(false, tvb
, offset
, actx
, tree
, -1);
1761 case 66: /*readyForSM*/
1762 offset
=dissect_gsm_map_sm_ReadyForSM_Res(false, tvb
, offset
, actx
, tree
, -1);
1764 case 67: /*purgeMS*/
1765 offset
=dissect_gsm_map_ms_PurgeMS_Res(false, tvb
, offset
, actx
, tree
, -1);
1767 case 68: /*prepareHandover*/
1768 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1770 false, dissect_gsm_old_PrepareHO_ResOld
, -1,
1771 true , dissect_gsm_map_ms_PrepareHO_Res
, -1);
1773 case 69: /*prepareSubsequentHandover*/
1774 offset
=dissect_mc_message(tvb
, offset
, actx
, tree
,
1777 true , dissect_gsm_map_ms_PrepareSubsequentHO_Res
, -1);
1779 case 70: /*provideSubscriberInfo*/
1780 offset
=dissect_gsm_map_ms_ProvideSubscriberInfoRes(false, tvb
, offset
, actx
, tree
, -1);
1782 case 71: /*anyTimeInterrogation*/
1783 offset
=dissect_gsm_map_ms_AnyTimeInterrogationRes(false, tvb
, offset
, actx
, tree
, -1);
1785 case 72: /*ss-InvocationNotification*/
1786 offset
=dissect_gsm_map_ss_SS_InvocationNotificationRes(false, tvb
, offset
, actx
, tree
, -1);
1788 case 73: /*setReportingState*/
1789 offset
=dissect_gsm_map_ch_SetReportingStateRes(false, tvb
, offset
, actx
, tree
, -1);
1791 case 74: /*statusReport*/
1792 offset
=dissect_gsm_map_ch_StatusReportRes(false, tvb
, offset
, actx
, tree
, -1);
1794 case 75: /*remoteUserFree*/
1795 offset
=dissect_gsm_map_ch_RemoteUserFreeRes(false, tvb
, offset
, actx
, tree
, -1);
1797 case 76: /*registerCC-Entry*/
1798 offset
=dissect_gsm_map_ss_RegisterCC_EntryRes(false, tvb
, offset
, actx
, tree
, -1);
1800 case 77: /*eraseCC-Entry*/
1801 offset
=dissect_gsm_map_ss_EraseCC_EntryRes(false, tvb
, offset
, actx
, tree
, -1);
1803 case 78: /*secureTransportClass1*/
1804 case 79: /*secureTransportClass2*/
1805 case 80: /*secureTransportClass3*/
1806 case 81: /*secureTransportClass4*/
1807 offset
=dissect_gsm_old_SecureTransportRes(false, tvb
, offset
, actx
, tree
, -1);
1809 case 83: /*provideSubscriberLocation*/
1810 offset
=dissect_gsm_map_lcs_ProvideSubscriberLocation_Res(false, tvb
, offset
, actx
, tree
, -1);
1812 case 84: /*sendGroupCallInfo*/
1813 offset
=dissect_gsm_map_gr_SendGroupCallInfoRes(false, tvb
, offset
, actx
, tree
, -1);
1815 case 85: /*sendRoutingInfoForLCS*/
1816 offset
=dissect_gsm_map_lcs_RoutingInfoForLCS_Res(false, tvb
, offset
, actx
, tree
, -1);
1818 case 86: /*subscriberLocationReport*/
1819 offset
=dissect_gsm_map_lcs_SubscriberLocationReport_Res(false, tvb
, offset
, actx
, tree
, -1);
1821 case 87: /*ist-Alert*/
1822 offset
=dissect_gsm_map_ch_IST_AlertRes(false, tvb
, offset
, actx
, tree
, -1);
1824 case 88: /*ist-Command*/
1825 offset
=dissect_gsm_map_ch_IST_CommandRes(false, tvb
, offset
, actx
, tree
, -1);
1827 case 89: /*noteMM-Event*/
1828 offset
=dissect_gsm_map_ms_NoteMM_EventRes(false, tvb
, offset
, actx
, tree
, -1);
1830 case 108: /*SS-protocol LCS-PeriodicTriggeredInvokeRes*/
1831 offset
= dissect_gsm_ss_LCS_PeriodicTriggeredInvokeRes(false, tvb
, offset
, actx
, tree
, -1);
1833 case 109: /*SS-protocol lcs-PeriodicLocationCancellation*/
1836 case 110: /*SS-protocol lcs-LocationUpdate*/
1837 offset
=dissect_gsm_ss_LCS_LocationUpdateRes(false, tvb
, offset
, actx
, tree
, -1);
1839 case 111: /*SS-protocol lcs-PeriodicLocationRequest*/
1840 offset
=dissect_gsm_ss_LCS_PeriodicLocationRequestRes(false, tvb
, offset
, actx
, tree
, -1);
1842 case 112: /*SS-protocol lcs-AreaEventCancellation*/
1844 case 113: /*SS-protocol lcs-AreaEventReport*/
1846 case 114: /*SS-protocol lcs-AreaEventRequest No RESULT data*/
1848 case 115: /*SS-protocol lcs-MOLR*/
1849 offset
=dissect_gsm_ss_LCS_MOLRRes(false, tvb
, offset
, actx
, tree
, -1);
1851 case 116: /*SS-protocol lcs-LocationNotification*/
1852 offset
=dissect_gsm_ss_LocationNotificationRes(false, tvb
, offset
, actx
, tree
, -1);
1854 case 117: /*SS-protocol callDeflection no RESULT*/
1856 case 118: /*SS-protocol userUserService no RESULT*/
1858 case 119: /*SS-protocol accessRegisterCCEntry*/
1859 offset
=dissect_gsm_map_ss_RegisterCC_EntryRes(false, tvb
, offset
, actx
, tree
, -1);
1861 case 120: /*SS-protocol forwardCUG-Info*/
1862 /* No RETURN RESULT*/
1864 case 121: /*SS-protocol splitMPTY no RESULT*/
1866 case 122: /*SS-protocol retrieveMPTY no RESULT*/
1868 case 123: /*SS-protocol holdMPTY no RESULT*/
1870 case 124: /*SS-protocol buildMPTY no RESULT*/
1872 case 125: /*SS-protocol forwardChargeAdvice no RESULT*/
1874 case 126: /*SS-protocol explicitCT no RESULT*/
1878 if(!dissector_try_uint_with_data(map_prop_res_opcode_table
, (uint8_t)opcode
, tvb
, actx
->pinfo
, tree
, true, actx
->subtree
.top_tree
)){
1879 proto_tree_add_expert_format(tree
, actx
->pinfo
, &ei_gsm_map_unknown_invokeData
,
1880 tvb
, offset
, -1, "Unknown returnResultData %d", opcode
);
1882 offset
+= tvb_reported_length_remaining(tvb
,offset
);
1890 static int dissect_returnErrorData(proto_tree
*tree
, tvbuff_t
*tvb
, int offset
, asn1_ctx_t
*actx
) {
1893 case 1: /* UnknownSubscriberParam */
1894 offset
=dissect_gsm_map_er_UnknownSubscriberParam(false, tvb
, offset
, actx
, tree
, -1);
1896 case 4: /* SecureTransportErrorParam */
1897 offset
=dissect_gsm_old_SecureTransportErrorParam(false, tvb
, offset
, actx
, tree
, -1);
1899 case 5: /* UnidentifiedSubParam */
1900 offset
=dissect_gsm_map_er_UnidentifiedSubParam(false, tvb
, offset
, actx
, tree
, -1);
1902 case 6: /* AbsentSubscriberSM-Param */
1903 offset
=dissect_gsm_map_er_AbsentSubscriberSM_Param(false, tvb
, offset
, actx
, tree
, -1);
1905 case 8: /* RoamingNotAllowedParam */
1906 offset
=dissect_gsm_map_er_RoamingNotAllowedParam(false, tvb
, offset
, actx
, tree
, -1);
1908 case 9: /* IllegalSubscriberParam */
1909 offset
=dissect_gsm_map_er_IllegalSubscriberParam(false, tvb
, offset
, actx
, tree
, -1);
1911 case 10: /* BearerServNotProvParam */
1912 offset
=dissect_gsm_map_er_BearerServNotProvParam(false, tvb
, offset
, actx
, tree
, -1);
1914 case 11: /* TeleservNotProvParam */
1915 offset
=dissect_gsm_map_er_TeleservNotProvParam(false, tvb
, offset
, actx
, tree
, -1);
1917 case 12: /* IllegalEquipmentParam */
1918 offset
=dissect_gsm_map_er_IllegalEquipmentParam(false, tvb
, offset
, actx
, tree
, -1);
1920 case 13: /* CallBarredParam */
1921 offset
=dissect_gsm_map_er_CallBarredParam(false, tvb
, offset
, actx
, tree
, -1);
1923 case 14: /* ForwardingViolationParam */
1924 offset
=dissect_gsm_map_er_ForwardingViolationParam(false, tvb
, offset
, actx
, tree
, -1);
1926 case 15: /* CUG-RejectParam */
1927 offset
=dissect_gsm_map_er_CUG_RejectParam(false, tvb
, offset
, actx
, tree
, -1);
1929 case 16: /* IllegalSS-OperationParam */
1930 offset
=dissect_gsm_map_er_IllegalSS_OperationParam(false, tvb
, offset
, actx
, tree
, -1);
1932 case 17: /* SS-ErrorStatus */
1933 offset
=dissect_gsm_map_ss_SS_Status(false, tvb
, offset
, actx
, tree
, hf_gsm_map_ss_ss_Status
);
1935 case 18: /* SS-NotAvailableParam */
1936 offset
=dissect_gsm_map_er_SS_NotAvailableParam(false, tvb
, offset
, actx
, tree
, -1);
1938 case 19: /* SS-SubscriptionViolationParam */
1939 offset
=dissect_gsm_map_er_SS_SubscriptionViolationParam(false, tvb
, offset
, actx
, tree
, -1);
1941 case 20: /* SS-IncompatibilityCause */
1942 offset
=dissect_gsm_map_er_SS_IncompatibilityCause(false, tvb
, offset
, actx
, tree
, -1);
1944 case 21: /* FacilityNotSupParam */
1945 offset
=dissect_gsm_map_er_FacilityNotSupParam(false, tvb
, offset
, actx
, tree
, -1);
1947 case 22: /* OngoingGroupCallParam */
1948 offset
=dissect_gsm_map_er_OngoingGroupCallParam(false, tvb
, offset
, actx
, tree
, -1);
1950 case 27: /* AbsentSubscriberParam */
1951 offset
=dissect_gsm_map_er_AbsentSubscriberParam(false, tvb
, offset
, actx
, tree
, -1);
1953 case 28: /* IncompatibleTerminalParam */
1954 offset
=dissect_gsm_map_er_IncompatibleTerminalParam(false, tvb
, offset
, actx
, tree
, -1);
1956 case 29: /* ShortTermDenialParam */
1957 offset
=dissect_gsm_map_er_ShortTermDenialParam(false, tvb
, offset
, actx
, tree
, -1);
1959 case 30: /* LongTermDenialParam */
1960 offset
=dissect_gsm_map_er_LongTermDenialParam(false, tvb
, offset
, actx
, tree
, -1);
1962 case 31: /* SubBusyForMT-SMS-Param */
1963 offset
=dissect_gsm_map_er_SubBusyForMT_SMS_Param(false, tvb
, offset
, actx
, tree
, -1);
1965 case 32: /* SM-DeliveryFailureCause */
1966 offset
= dissect_mc_message(tvb
, offset
, actx
, tree
,
1967 false, dissect_gsm_map_er_SM_EnumeratedDeliveryFailureCause
, hf_gsm_map_er_sm_EnumeratedDeliveryFailureCause
,
1968 false, dissect_gsm_map_er_SM_DeliveryFailureCause
, -1,
1972 case 33: /* MessageWaitListFullParam */
1973 offset
=dissect_gsm_map_er_MessageWaitListFullParam(false, tvb
, offset
, actx
, tree
, -1);
1975 case 34: /* SystemFailureParam */
1976 offset
=dissect_gsm_map_er_SystemFailureParam(false, tvb
, offset
, actx
, tree
, -1);
1978 case 35: /* DataMissingParam */
1979 offset
=dissect_gsm_map_er_DataMissingParam(false, tvb
, offset
, actx
, tree
, -1);
1981 case 36: /* UnexpectedDataParam */
1982 offset
=dissect_gsm_map_er_UnexpectedDataParam(false, tvb
, offset
, actx
, tree
, -1);
1984 case 37: /* PW-RegistrationFailureCause */
1985 offset
=dissect_gsm_map_er_PW_RegistrationFailureCause(false, tvb
, offset
, actx
, tree
, -1);
1987 case 39: /* NoRoamingNbParam */
1988 offset
=dissect_gsm_map_er_NoRoamingNbParam(false, tvb
, offset
, actx
, tree
, -1);
1990 case 40: /* TracingBufferFullParam */
1991 offset
=dissect_gsm_map_er_TracingBufferFullParam(false, tvb
, offset
, actx
, tree
, -1);
1993 case 42: /* TargetCellOutsideGCA-Param */
1994 offset
=dissect_gsm_map_er_TargetCellOutsideGCA_Param(false, tvb
, offset
, actx
, tree
, -1);
1996 case 44: /* NumberChangedParam */
1997 offset
=dissect_gsm_map_er_NumberChangedParam(false, tvb
, offset
, actx
, tree
, -1);
1999 case 45: /* BusySubscriberParam */
2000 offset
=dissect_gsm_map_er_BusySubscriberParam(false, tvb
, offset
, actx
, tree
, -1);
2002 case 46: /* NoSubscriberReplyParam */
2003 offset
=dissect_gsm_map_er_NoSubscriberReplyParam(false, tvb
, offset
, actx
, tree
, -1);
2005 case 47: /* ForwardingFailedParam */
2006 offset
=dissect_gsm_map_er_ForwardingFailedParam(false, tvb
, offset
, actx
, tree
, -1);
2008 case 48: /* OR-NotAllowedParam */
2009 offset
=dissect_gsm_map_er_OR_NotAllowedParam(false, tvb
, offset
, actx
, tree
, -1);
2011 case 49: /* ATI-NotAllowedParam */
2012 offset
=dissect_gsm_map_er_ATI_NotAllowedParam(false, tvb
, offset
, actx
, tree
, -1);
2014 case 50: /* NoGroupCallNbParam */
2015 offset
=dissect_gsm_map_er_NoGroupCallNbParam(false, tvb
, offset
, actx
, tree
, -1);
2017 case 51: /* ResourceLimitationParam */
2018 offset
=dissect_gsm_map_er_ResourceLimitationParam(false, tvb
, offset
, actx
, tree
, -1);
2020 case 52: /* UnauthorizedRequestingNetwork-Param */
2021 offset
=dissect_gsm_map_er_UnauthorizedRequestingNetwork_Param(false, tvb
, offset
, actx
, tree
, -1);
2023 case 53: /* UnauthorizedLCSClient-Param */
2024 offset
=dissect_gsm_map_er_UnauthorizedLCSClient_Param(false, tvb
, offset
, actx
, tree
, -1);
2026 case 54: /* PositionMethodFailure-Param */
2027 offset
=dissect_gsm_map_er_PositionMethodFailure_Param(false, tvb
, offset
, actx
, tree
, -1);
2029 case 58: /* UnknownOrUnreachableLCSClient-Param */
2030 offset
=dissect_gsm_map_er_UnknownOrUnreachableLCSClient_Param(false, tvb
, offset
, actx
, tree
, -1);
2032 case 59: /* MM-EventNotSupported-Param */
2033 offset
=dissect_gsm_map_er_MM_EventNotSupported_Param(false, tvb
, offset
, actx
, tree
, -1);
2035 case 60: /* ATSI-NotAllowedParam */
2036 offset
=dissect_gsm_map_er_ATSI_NotAllowedParam(false, tvb
, offset
, actx
, tree
, -1);
2038 case 61: /* ATM-NotAllowedParam */
2039 offset
=dissect_gsm_map_er_ATM_NotAllowedParam(false, tvb
, offset
, actx
, tree
, -1);
2041 case 62: /* InformationNotAvailableParam */
2042 offset
=dissect_gsm_map_er_InformationNotAvailableParam(false, tvb
, offset
, actx
, tree
, -1);
2045 if(!dissector_try_uint_with_data(map_prop_err_opcode_table
, (uint8_t)opcode
, tvb
, actx
->pinfo
, tree
, true, actx
->subtree
.top_tree
)){
2046 proto_tree_add_expert_format(tree
, actx
->pinfo
, &ei_gsm_map_unknown_invokeData
,
2047 tvb
, offset
, -1, "Unknown returnErrorData %d", opcode
);
2049 offset
+= tvb_reported_length_remaining(tvb
,offset
);
2055 /* Private extension container for PLMN Data */
2056 static int dissect_gsm_mapext_PlmnContainer(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2058 asn1_ctx_t asn1_ctx
;
2059 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2060 /* create display subtree for the protocol */
2061 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_gsm_old_PlmnContainer_U
, NULL
, "MAP Ext. Plmn Container");
2063 return dissect_gsm_old_PlmnContainer(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2066 static int dissect_gsm_map_ericsson_ext_ExtensionType(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2068 asn1_ctx_t asn1_ctx
;
2069 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2070 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_gsm_map_ericsson_ExtensionType
, NULL
, "Ericsson Extension");
2071 return dissect_gsm_map_ericsson_ExtensionType(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2074 static int dissect_NokiaMAP_ext_SriResExtension(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2076 asn1_ctx_t asn1_ctx
;
2077 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2078 /* create display subtree for the protocol */
2079 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_SriResExtension_U
, NULL
, "Nokia Extension");
2080 return dissect_NokiaMAP_Extensions_SriResExtension(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2083 static int dissect_NokiaMAP_ext_CanLocArgExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2085 asn1_ctx_t asn1_ctx
;
2086 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2087 /* create display subtree for the protocol */
2088 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_CanLocArgExt_U
, NULL
, "Nokia Extension");
2090 return dissect_NokiaMAP_Extensions_CanLocArgExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2093 static int dissect_NokiaMAP_ext_ATMargExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2095 asn1_ctx_t asn1_ctx
;
2096 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2097 /* create display subtree for the protocol */
2098 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_ATMargExt_U
, NULL
, "Nokia Extension");
2100 return dissect_NokiaMAP_Extensions_ATMargExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2103 static int dissect_NokiaMAP_ext_DTMargExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2105 asn1_ctx_t asn1_ctx
;
2106 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2107 /* create display subtree for the protocol */
2108 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_DTMargExt_U
, NULL
, "Nokia Extension");
2110 return dissect_NokiaMAP_Extensions_DTMargExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2113 static int dissect_NokiaMAP_ext_NumberPorted(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2114 asn1_ctx_t asn1_ctx
;
2115 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2117 return dissect_NokiaMAP_Extensions_NumberPorted(false, tvb
, 0, &asn1_ctx
, parent_tree
, -1);
2120 static int dissect_NokiaMAP_ext_ATMresExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2122 asn1_ctx_t asn1_ctx
;
2123 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2124 /* create display subtree for the protocol */
2125 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_ATMresExt_U
, NULL
, "Nokia Extension");
2127 return dissect_NokiaMAP_Extensions_ATMresExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2130 static int dissect_NokiaMAP_ext_AbsentSubscriberExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2131 asn1_ctx_t asn1_ctx
;
2133 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2134 return dissect_NokiaMAP_Extensions_AbsentSubscriberExt(false, tvb
, 0, &asn1_ctx
, parent_tree
, -1);
2137 static int dissect_NokiaMAP_ext_SriForSMArgExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2139 asn1_ctx_t asn1_ctx
;
2140 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2141 /* create display subtree for the protocol */
2142 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_SriForSMArgExt_U
, NULL
, "Nokia Extension");
2144 return dissect_NokiaMAP_Extensions_SriForSMArgExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2147 static int dissect_NokiaMAP_ext_ReportSMDelStatArgExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2149 asn1_ctx_t asn1_ctx
;
2150 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2151 /* create display subtree for the protocol */
2152 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_ReportSMDelStatArgExt_U
, NULL
, "Nokia Extension");
2154 return dissect_NokiaMAP_Extensions_ReportSMDelStatArgExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2157 static int dissect_NokiaMAP_ext_UdlArgExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2159 asn1_ctx_t asn1_ctx
;
2160 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2161 /* create display subtree for the protocol */
2162 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_UdlArgExt_U
, NULL
, "Nokia Extension");
2164 return dissect_NokiaMAP_Extensions_UdlArgExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2167 static int dissect_NokiaMAP_ext_RoamNotAllowedExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2169 asn1_ctx_t asn1_ctx
;
2170 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2171 /* create display subtree for the protocol */
2172 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_RoamNotAllowedExt_U
, NULL
, "Nokia Extension");
2174 return dissect_NokiaMAP_Extensions_RoamNotAllowedExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2177 static int dissect_NokiaMAP_ext_MO_ForwardSM_ArgExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2179 asn1_ctx_t asn1_ctx
;
2180 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2181 /* create display subtree for the protocol */
2182 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_MO_ForwardSM_ArgExt_U
, NULL
, "Nokia Extension");
2184 return dissect_NokiaMAP_Extensions_MO_ForwardSM_ArgExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2187 static int dissect_NokiaMAP_ext_ErrOlcmInfoTableExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2189 asn1_ctx_t asn1_ctx
;
2190 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2191 /* create display subtree for the protocol */
2192 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_ErrOlcmInfoTableExt_U
, NULL
, "Nokia Extension");
2194 return dissect_NokiaMAP_Extensions_ErrOlcmInfoTableExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2197 static int dissect_NokiaMAP_ext_RoutingCategoryExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2199 asn1_ctx_t asn1_ctx
;
2200 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2201 /* create display subtree for the protocol */
2202 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_RoutingCategoryExt_U
, NULL
, "Nokia Extension");
2204 return dissect_NokiaMAP_Extensions_RoutingCategoryExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2207 static int dissect_NokiaMAP_ext_AnyTimeModArgExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2209 asn1_ctx_t asn1_ctx
;
2210 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2211 /* create display subtree for the protocol */
2212 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_AnyTimeModArgExt_U
, NULL
, "Nokia Extension");
2214 return dissect_NokiaMAP_Extensions_AnyTimeModArgExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2217 static int dissect_NokiaMAP_ext_AccessTypeExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2218 asn1_ctx_t asn1_ctx
;
2219 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2220 /* create display subtree for the protocol */
2221 return dissect_NokiaMAP_Extensions_AccessTypeExt(false, tvb
, 0, &asn1_ctx
, parent_tree
, -1);
2224 static int dissect_NokiaMAP_ext_AccessSubscriptionListExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2225 asn1_ctx_t asn1_ctx
;
2226 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2227 /* create display subtree for the protocol */
2228 return dissect_NokiaMAP_Extensions_AccessSubscriptionListExt(false, tvb
, 0, &asn1_ctx
, parent_tree
, -1);
2231 static int dissect_NokiaMAP_ext_AllowedServiceData(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2232 asn1_ctx_t asn1_ctx
;
2233 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2234 /* create display subtree for the protocol */
2235 return dissect_NokiaMAP_Extensions_AllowedServiceData(false, tvb
, 0, &asn1_ctx
, parent_tree
, -1);
2238 static int dissect_NokiaMAP_ext_SriExtension(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2240 asn1_ctx_t asn1_ctx
;
2241 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2242 /* create display subtree for the protocol */
2243 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_SriExtension_U
, NULL
, "Nokia Extension");
2245 return dissect_NokiaMAP_Extensions_SriExtension(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2248 static int dissect_NokiaMAP_ExtraSignalInfo(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2250 asn1_ctx_t asn1_ctx
;
2251 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2252 /* create display subtree for the protocol */
2253 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_ExtraSignalInfo_U
, NULL
, "Nokia Extension");
2255 return dissect_NokiaMAP_Extensions_ExtraSignalInfo(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2258 static int dissect_NokiaMAP_ext_SS_DataExtension(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2260 asn1_ctx_t asn1_ctx
;
2261 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2262 /* create display subtree for the protocol */
2263 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_SS_DataExtension_U
, NULL
, "Nokia Extension");
2265 return dissect_NokiaMAP_Extensions_SS_DataExtension(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2268 static int dissect_NokiaMAP_ext_HOExtension(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2270 asn1_ctx_t asn1_ctx
;
2271 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2272 /* create display subtree for the protocol */
2273 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_HO_Ext_U
, NULL
, "Nokia Extension");
2275 return dissect_NokiaMAP_Extensions_HO_Ext(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2278 static int dissect_NokiaMAP_ext_UlResExtension(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2280 asn1_ctx_t asn1_ctx
;
2281 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2282 /* create display subtree for the protocol */
2283 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_UlResExt_U
, NULL
, "Nokia Extension");
2285 return dissect_NokiaMAP_Extensions_UlResExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2289 static int dissect_NokiaMAP_ext_IsdArgExtension(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2291 asn1_ctx_t asn1_ctx
;
2292 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2293 /* create display subtree for the protocol */
2294 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_IsdArgExt_U
, NULL
, "Nokia Extension");
2296 return dissect_NokiaMAP_Extensions_IsdArgExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2299 static int dissect_NokiaMAP_ext_DsdArgExt(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data _U_
) {
2301 asn1_ctx_t asn1_ctx
;
2302 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2303 /* create display subtree for the protocol */
2304 tree
= proto_tree_add_subtree(parent_tree
, tvb
, 0, -1, ett_NokiaMAP_Extensions_DsdArgExt_U
, NULL
, "Nokia Extension");
2306 return dissect_NokiaMAP_Extensions_DsdArgExt(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2310 dissect_gsm_map_GSMMAPPDU(bool implicit_tag _U_
, tvbuff_t
*tvb
, int offset
,
2311 asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index _U_
) {
2316 application_context_version
= pref_application_context_version
;
2317 if (pref_context_version_from_trace
== true) {
2318 gsm_map_private_info_t
*gsm_map_priv
= (gsm_map_private_info_t
*)actx
->value_ptr
;
2319 if (gsm_map_priv
&& gsm_map_priv
->tcap_private
!= NULL
){
2320 if (gsm_map_priv
->tcap_private
->acv
==true ){
2321 version_ptr
= strrchr((const char*)gsm_map_priv
->tcap_private
->oid
,'.');
2323 ws_strtoi32(version_ptr
+ 1, NULL
, &application_context_version
);
2329 gsmmap_pdu_type
= tvb_get_uint8(tvb
, offset
)&0x0f;
2330 /* Get the length and add 2 */
2331 gsm_map_pdu_size
= tvb_get_uint8(tvb
, offset
+1)+2;
2333 col_set_str(actx
->pinfo
->cinfo
, COL_INFO
, val_to_str_const(gsmmap_pdu_type
, gsm_old_Component_vals
, "Unknown GSM-MAP Component"));
2334 col_append_str(actx
->pinfo
->cinfo
, COL_INFO
, " ");
2335 offset
= dissect_gsm_old_Component(false, tvb
, 0, actx
, tree
, hf_gsm_map_old_Component_PDU
);
2337 offset = dissect_ber_choice(pinfo, tree, tvb, offset,
2338 GSMMAPPDU_choice, hf_index, ett_gsm_map_GSMMAPPDU, NULL);
2345 dissect_gsm_map(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data
)
2347 proto_item
*item
=NULL
;
2348 proto_tree
*tree
=NULL
;
2349 /* Used for gsm_map TAP */
2350 static gsm_map_tap_rec_t tap_rec
;
2352 asn1_ctx_t asn1_ctx
;
2353 gsm_map_private_info_t
*gsm_map_priv
;
2355 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2357 col_set_str(pinfo
->cinfo
, COL_PROTOCOL
, "GSM MAP");
2359 asn1_ctx
.subtree
.top_tree
= parent_tree
;
2361 gsm_map_priv
= wmem_new0(pinfo
->pool
, gsm_map_private_info_t
);
2362 gsm_map_priv
->tcap_private
= (struct tcap_private_t
*)data
;
2363 asn1_ctx
.value_ptr
= gsm_map_priv
;
2365 /* create display subtree for the protocol */
2366 item
= proto_tree_add_item(parent_tree
, proto_gsm_map
, tvb
, 0, -1, ENC_NA
);
2367 tree
= proto_item_add_subtree(item
, ett_gsm_map
);
2369 dissect_gsm_map_GSMMAPPDU(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2370 try_val_to_str_idx(opcode
, gsm_map_opr_code_strings
, &op_idx
);
2373 tap_rec
.invoke
= (gsmmap_pdu_type
== 1) ? true : false;
2374 tap_rec
.opcode
= opcode
;
2375 tap_rec
.size
= gsm_map_pdu_size
;
2377 tap_queue_packet(gsm_map_tap
, pinfo
, &tap_rec
);
2380 return tvb_captured_length(tvb
);
2384 dissect_gsm_map_sccp(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void* data
)
2386 proto_item
*item
=NULL
;
2387 proto_tree
*tree
=NULL
;
2388 /* Used for gsm_map TAP */
2389 static gsm_map_tap_rec_t tap_rec
;
2391 asn1_ctx_t asn1_ctx
;
2392 gsm_map_private_info_t
*gsm_map_priv
;
2394 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, true, pinfo
);
2396 col_set_str(pinfo
->cinfo
, COL_PROTOCOL
, "GSM MAP");
2398 asn1_ctx
.subtree
.top_tree
= parent_tree
;
2400 gsm_map_priv
= wmem_new0(pinfo
->pool
, gsm_map_private_info_t
);
2401 gsm_map_priv
->sccp_msg_info
= (sccp_msg_info_t
*)data
;
2402 asn1_ctx
.value_ptr
= gsm_map_priv
;
2404 /* create display subtree for the protocol */
2405 item
= proto_tree_add_item(parent_tree
, proto_gsm_map
, tvb
, 0, -1, ENC_NA
);
2406 tree
= proto_item_add_subtree(item
, ett_gsm_map
);
2408 dissect_gsm_map_GSMMAPPDU(false, tvb
, 0, &asn1_ctx
, tree
, -1);
2409 try_val_to_str_idx(opcode
, gsm_map_opr_code_strings
, &op_idx
);
2412 tap_rec
.invoke
= (gsmmap_pdu_type
== 1) ? true : false;
2413 tap_rec
.opcode
= opcode
;
2414 tap_rec
.size
= gsm_map_pdu_size
;
2416 tap_queue_packet(gsm_map_tap
, pinfo
, &tap_rec
);
2419 return tvb_captured_length(tvb
);
2422 const value_string ssCode_vals
[] = {
2423 { 0x00, "allSS - all SS" },
2424 { 0x10 ,"allLineIdentificationSS - all line identification SS" },
2425 { 0x11 ,"clip - calling line identification presentation" },
2426 { 0x12 ,"clir - calling line identification restriction" },
2427 { 0x13 ,"colp - connected line identification presentation" },
2428 { 0x14 ,"colr - connected line identification restriction" },
2429 { 0x15 ,"mci - malicious call identification" },
2430 { 0x18 ,"allNameIdentificationSS - all name identification SS" },
2431 { 0x19 ,"cnap - calling name presentation" },
2432 { 0x20 ,"allForwardingSS - all forwarding SS" },
2433 { 0x21 ,"cfu - call forwarding unconditional" },
2434 { 0x28 ,"allCondForwardingSS - all conditional forwarding SS" },
2435 { 0x29 ,"cfb - call forwarding busy" },
2436 { 0x2a ,"cfnry - call forwarding on no reply" },
2437 { 0x2b ,"cfnrc - call forwarding on mobile subscriber not reachable" },
2438 { 0x24 ,"cd - call deflection" },
2439 { 0x30 ,"allCallOfferingSS - all call offering SS includes also all forwarding SS" },
2440 { 0x31 ,"ect - explicit call transfer" },
2441 { 0x32 ,"mah - mobile access hunting" },
2442 { 0x40 ,"allCallCompletionSS - all Call completion SS" },
2443 { 0x41 ,"cw - call waiting" },
2444 { 0x42 ,"hold - call hold" },
2445 { 0x43 ,"ccbs-A - completion of call to busy subscribers, originating side" },
2446 { 0x44 ,"ccbs-B - completion of call to busy subscribers, destination side" },
2447 { 0x45 ,"mc - multicall" },
2448 { 0x50 ,"allMultiPartySS - all multiparty SS" },
2449 { 0x51 ,"multiPTY - multiparty" },
2450 { 0x60 ,"allCommunityOfInterestSS - all community of interest SS" },
2451 { 0x61 ,"cug - closed user group" },
2452 { 0x70 ,"allChargingSS - all charging SS" },
2453 { 0x71 ,"aoci - advice of charge information" },
2454 { 0x72 ,"aocc - advice of charge charging" },
2455 { 0x80 ,"allAdditionalInfoTransferSS - all additional information transfer SS" },
2456 { 0x81 ,"uus1 - UUS1 user-to-user signalling" },
2457 { 0x82 ,"uus2 - UUS2 user-to-user signalling" },
2458 { 0x83 ,"uus3 - UUS3 user-to-user signalling" },
2459 { 0x90 ,"allCallRestrictionSS - all Callrestriction SS" },
2460 { 0x91 ,"barringOfOutgoingCalls" },
2461 { 0x92 ,"baoc - barring of all outgoing calls" },
2462 { 0x93 ,"boic - barring of outgoing international calls" },
2463 { 0x94 ,"boicExHC - barring of outgoing international calls except those directed to the home PLMN" },
2464 { 0x99 ,"barringOfIncomingCalls" },
2465 { 0x9a ,"baic - barring of all incoming calls" },
2466 { 0x9b ,"bicRoam - barring of incoming calls when roaming outside home PLMN Country" },
2467 { 0xf0 ,"allPLMN-specificSS" },
2468 { 0xa0 ,"allCallPrioritySS - all call priority SS" },
2469 { 0xa1 ,"emlpp - enhanced Multilevel Precedence Pre-emption (EMLPP) service" },
2470 { 0xb0 ,"allLCSPrivacyException - all LCS Privacy Exception Classes" },
2471 { 0xb1 ,"universal - allow location by any LCS client" },
2472 { 0xb2 ,"callrelated - allow location by any value added LCS client to which a call is established from the target MS" },
2473 { 0xb3 ,"callunrelated - allow location by designated external value added LCS clients" },
2474 { 0xb4 ,"plmnoperator - allow location by designated PLMN operator LCS clients" },
2475 { 0xb5 ,"serviceType - allow location by LCS clients of a designated LCS service type" },
2476 { 0xc0 ,"allMOLR-SS - all Mobile Originating Location Request Classes" },
2477 { 0xc1 ,"basicSelfLocation - allow an MS to request its own location" },
2478 { 0xc2 ,"autonomousSelfLocation - allow an MS to perform self location without interaction with the PLMN for a predetermined period of time" },
2479 { 0xc3 ,"transferToThirdParty - allow an MS to request transfer of its location to another LCS client" },
2481 { 0xf1 ,"plmn-specificSS-1" },
2482 { 0xf2 ,"plmn-specificSS-2" },
2483 { 0xf3 ,"plmn-specificSS-3" },
2484 { 0xf4 ,"plmn-specificSS-4" },
2485 { 0xf5 ,"plmn-specificSS-5" },
2486 { 0xf6 ,"plmn-specificSS-6" },
2487 { 0xf7 ,"plmn-specificSS-7" },
2488 { 0xf8 ,"plmn-specificSS-8" },
2489 { 0xf9 ,"plmn-specificSS-9" },
2490 { 0xfa ,"plmn-specificSS-a" },
2491 { 0xfb ,"plmn-specificSS-b" },
2492 { 0xfc ,"plmn-specificSS-c" },
2493 { 0xfd ,"plmn-specificSS-d" },
2494 { 0xfe ,"plmn-specificSS-e" },
2495 { 0xff ,"plmn-specificSS-f" },
2499 static const value_string Teleservice_vals
[] = {
2500 { 0x00, "allTeleservices" },
2501 { 0x10, "allSpeechTransmissionServices" },
2502 { 0x11, "telephony" },
2503 { 0x12, "emergencyCalls" },
2504 { 0x20, "allShortMessageServices" },
2505 { 0x21, "shortMessageMT-PP" },
2506 { 0x22, "shortMessageMO-PP" },
2507 { 0x60, "allFacsimileTransmissionServices" },
2508 { 0x61, "facsimileGroup3AndAlterSpeech" },
2509 { 0x62, "automaticFacsimileGroup3" },
2510 { 0x63, "facsimileGroup4" },
2512 { 0x70, "allDataTeleservices" },
2513 { 0x80, "allTeleservices-ExceptSMS" },
2515 { 0x90, "allVoiceGroupCallServices" },
2516 { 0x91, "voiceGroupCall" },
2517 { 0x92, "voiceBroadcastCall" },
2519 { 0xd0, "allPLMN-specificTS" },
2520 { 0xd1, "plmn-specificTS-1" },
2521 { 0xd2, "plmn-specificTS-2" },
2522 { 0xd3, "plmn-specificTS-3" },
2523 { 0xd4, "plmn-specificTS-4" },
2524 { 0xd5, "plmn-specificTS-5" },
2525 { 0xd6, "plmn-specificTS-6" },
2526 { 0xd7, "plmn-specificTS-7" },
2527 { 0xd8, "plmn-specificTS-8" },
2528 { 0xd9, "plmn-specificTS-9" },
2529 { 0xda, "plmn-specificTS-A" },
2530 { 0xdb, "plmn-specificTS-B" },
2531 { 0xdc, "plmn-specificTS-C" },
2532 { 0xdd, "plmn-specificTS-D" },
2533 { 0xde, "plmn-specificTS-E" },
2534 { 0xdf, "plmn-specificTS-F" },
2538 static const value_string Bearerservice_vals
[] = {
2539 { 0x00, "allBearerServices" },
2540 { 0x10, "allDataCDA-Services" },
2541 { 0x11, "dataCDA-300bps" },
2542 { 0x12, "dataCDA-1200bps" },
2543 { 0x13, "dataCDA-1200-75bps" },
2544 { 0x14, "dataCDA-2400bps" },
2545 { 0x15, "dataCDA-4800bps" },
2546 { 0x16, "dataCDA-9600bps" },
2547 { 0x17, "general-dataCDA" },
2549 { 0x18, "allDataCDS-Services" },
2550 { 0x1A, "dataCDS-1200bps" },
2551 { 0x1C, "dataCDS-2400bps" },
2552 { 0x1D, "dataCDS-4800bps" },
2553 { 0x1E, "dataCDS-9600bps" },
2554 { 0x1F, "general-dataCDS" },
2556 { 0x20, "allPadAccessCA-Services" },
2557 { 0x21, "padAccessCA-300bps" },
2558 { 0x22, "padAccessCA-1200bps" },
2559 { 0x23, "padAccessCA-1200-75bps" },
2560 { 0x24, "padAccessCA-2400bps" },
2561 { 0x25, "padAccessCA-4800bps" },
2562 { 0x26, "padAccessCA-9600bps" },
2563 { 0x27, "general-padAccessCA" },
2565 { 0x28, "allDataPDS-Services" },
2566 { 0x2C, "dataPDS-2400bps" },
2567 { 0x2D, "dataPDS-4800bps" },
2568 { 0x2E, "dataPDS-9600bps" },
2569 { 0x2F, "general-dataPDS" },
2571 { 0x30, "allAlternateSpeech-DataCDA" },
2572 { 0x38, "allAlternateSpeech-DataCDS" },
2573 { 0x40, "allSpeechFollowedByDataCDA" },
2574 { 0x48, "allSpeechFollowedByDataCDS" },
2576 { 0x50, "allDataCircuitAsynchronous" },
2577 { 0x60, "allAsynchronousServices" },
2578 { 0x58, "allDataCircuitSynchronous" },
2579 { 0x68, "allSynchronousServices" },
2581 { 0xD0, "allPLMN-specificBS" },
2582 { 0xD1, "plmn-specificBS-1" },
2583 { 0xD2, "plmn-specificBS-2" },
2584 { 0xD3, "plmn-specificBS-3" },
2585 { 0xD4, "plmn-specificBS-4" },
2586 { 0xD5, "plmn-specificBS-5" },
2587 { 0xD6, "plmn-specificBS-6" },
2588 { 0xD7, "plmn-specificBS-7" },
2589 { 0xD8, "plmn-specificBS-8" },
2590 { 0xD9, "plmn-specificBS-9" },
2591 { 0xDA, "plmn-specificBS-A" },
2592 { 0xDB, "plmn-specificBS-B" },
2593 { 0xDC, "plmn-specificBS-C" },
2594 { 0xDD, "plmn-specificBS-D" },
2595 { 0xDE, "plmn-specificBS-E" },
2596 { 0xDF, "plmn-specificBS-F" },
2601 /* ForwardingOptions
2603 -- bit 8: notification to forwarding party
2604 -- 0 no notification
2607 static const true_false_string notification_value
= {
2612 -- bit 7: redirecting presentation
2613 -- 0 no presentation
2616 static const true_false_string redirecting_presentation_value
= {
2621 -- bit 6: notification to calling party
2622 -- 0 no notification
2626 -- bit 5: 0 (unused)
2627 -- bits 43: forwarding reason
2628 -- 00 ms not reachable
2631 -- 11 unconditional when used in a SRI Result,
2632 -- or call deflection when used in a RCH Argument
2634 static const value_string forwarding_reason_values
[] = {
2635 { 0x0, "ms not reachable" },
2637 { 0x2, "no reply" },
2638 { 0x3, "unconditional when used in a SRI Result or call deflection when used in a RCH Argument" },
2642 -- bits 21: 00 (unused)
2645 static const value_string pdp_type_org_values
[] = {
2648 { 0xf, "Empty PDP type" },
2652 static const value_string etsi_pdp_type_number_values
[] = {
2653 { 0x0, "Reserved, used in earlier version of this protocol" },
2658 static const value_string ietf_pdp_type_number_values
[] = {
2659 { 0x21, "IPv4 Address" },
2660 { 0x57, "IPv6 Address" },
2665 ChargingCharacteristics ::= OCTET STRING (SIZE (2))
2666 -- Octets are coded according to 3GPP TS 32.015.
2667 -- From 3GPP TS 32.015.
2669 -- Descriptions for the bits of the flag set:
2671 -- Bit 1: H (Hot billing) := '00000001'B
2672 -- Bit 2: F (Flat rate) := '00000010'B
2673 -- Bit 3: P (Prepaid service) := '00000100'B
2674 -- Bit 4: N (Normal billing) := '00001000'B
2675 -- Bit 5: - (Reserved, set to 0) := '00010000'B
2676 -- Bit 6: - (Reserved, set to 0) := '00100000'B
2677 -- Bit 7: - (Reserved, set to 0) := '01000000'B
2678 -- Bit 8: - (Reserved, set to 0) := '10000000'B
2680 static const value_string chargingcharacteristics_values
[] = {
2681 { 0x1, "H (Hot billing)" },
2682 { 0x2, "F (Flat rate)" },
2683 { 0x4, "P (Prepaid service)" },
2684 { 0x8, "N (Normal billing)" },
2694 NUM_BYTES_FWD_COLUMN
,
2695 AVG_BYTES_FWD_COLUMN
,
2697 NUM_BYTES_REV_COLUMN
,
2698 AVG_BYTES_REV_COLUMN
,
2701 } gsm_a_stat_columns
;
2703 static stat_tap_table_item gsm_map_stat_fields
[] = {
2704 {TABLE_ITEM_UINT
, TAP_ALIGN_RIGHT
, "ID", "%d"},
2705 {TABLE_ITEM_STRING
, TAP_ALIGN_LEFT
, "Operation Code", "%-25s"},
2706 {TABLE_ITEM_UINT
, TAP_ALIGN_RIGHT
, "Invokes", "%d"},
2707 {TABLE_ITEM_UINT
, TAP_ALIGN_RIGHT
, "Num Bytes", "%d"},
2708 {TABLE_ITEM_FLOAT
, TAP_ALIGN_RIGHT
, "Avg Bytes", "%1.2f"},
2709 {TABLE_ITEM_UINT
, TAP_ALIGN_RIGHT
, "Return Result", "%d"},
2710 {TABLE_ITEM_UINT
, TAP_ALIGN_RIGHT
, "Num Bytes", "%d"},
2711 {TABLE_ITEM_FLOAT
, TAP_ALIGN_RIGHT
, "Avg Bytes", "%1.2f"},
2712 {TABLE_ITEM_UINT
, TAP_ALIGN_RIGHT
, "Total Bytes", "%d"},
2713 {TABLE_ITEM_FLOAT
, TAP_ALIGN_RIGHT
, "Avg Bytes", "%1.2f"},
2716 static void gsm_map_stat_init(stat_tap_table_ui
* new_stat
)
2718 const char *table_name
= "GSM MAP Operation Statistics";
2719 int num_fields
= array_length(gsm_map_stat_fields
);
2720 stat_tap_table
* table
;
2722 stat_tap_table_item_type items
[array_length(gsm_map_stat_fields
)];
2724 memset(items
, 0, sizeof(items
));
2726 items
[ID_COLUMN
].type
= TABLE_ITEM_UINT
;
2727 items
[OP_CODE_COLUMN
].type
= TABLE_ITEM_STRING
;
2728 items
[INVOKES_COLUMN
].type
= TABLE_ITEM_UINT
;
2729 items
[NUM_BYTES_FWD_COLUMN
].type
= TABLE_ITEM_UINT
;
2730 items
[AVG_BYTES_FWD_COLUMN
].type
= TABLE_ITEM_FLOAT
;
2731 items
[RET_RES_COLUMN
].type
= TABLE_ITEM_UINT
;
2732 items
[NUM_BYTES_REV_COLUMN
].type
= TABLE_ITEM_UINT
;
2733 items
[AVG_BYTES_REV_COLUMN
].type
= TABLE_ITEM_FLOAT
;
2734 items
[TOT_BYTES_COLUMN
].type
= TABLE_ITEM_UINT
;
2735 items
[AVG_BYTES_COLUMN
].type
= TABLE_ITEM_FLOAT
;
2737 table
= stat_tap_find_table(new_stat
, table_name
);
2739 if (new_stat
->stat_tap_reset_table_cb
) {
2740 new_stat
->stat_tap_reset_table_cb(table
);
2745 table
= stat_tap_init_table(table_name
, num_fields
, 0, NULL
);
2746 stat_tap_add_table(new_stat
, table
);
2748 /* Add a row for each value type */
2749 for (i
= 0; i
< GSM_MAP_MAX_NUM_OPR_CODES
; i
++)
2751 const char *ocs
= try_val_to_str(i
, gsm_map_opr_code_strings
);
2754 col_str
= g_strdup(ocs
);
2756 col_str
= ws_strdup_printf("Unknown op code %d", i
);
2759 items
[ID_COLUMN
].value
.uint_value
= i
;
2760 items
[OP_CODE_COLUMN
].value
.string_value
= col_str
;
2761 stat_tap_init_table_row(table
, i
, num_fields
, items
);
2765 static tap_packet_status
2766 gsm_map_stat_packet(void *tapdata
, packet_info
*pinfo _U_
, epan_dissect_t
*edt _U_
, const void *gmtr_ptr
, tap_flags_t flags _U_
)
2768 stat_data_t
* stat_data
= (stat_data_t
*)tapdata
;
2769 const gsm_map_tap_rec_t
*gmtr
= (const gsm_map_tap_rec_t
*)gmtr_ptr
;
2770 stat_tap_table
* table
;
2771 stat_tap_table_item_type
*invoke_data
, *fwd_bytes_data
, *result_data
, *rev_bytes_data
, *avg_data
;
2772 unsigned invokes
, fwd_bytes
, results
, rev_bytes
;
2774 table
= g_array_index(stat_data
->stat_tap_data
->tables
, stat_tap_table
*, 0);
2776 invoke_data
= stat_tap_get_field_data(table
, gmtr
->opcode
, INVOKES_COLUMN
);
2777 fwd_bytes_data
= stat_tap_get_field_data(table
, gmtr
->opcode
, NUM_BYTES_FWD_COLUMN
);
2778 result_data
= stat_tap_get_field_data(table
, gmtr
->opcode
, RET_RES_COLUMN
);
2779 rev_bytes_data
= stat_tap_get_field_data(table
, gmtr
->opcode
, NUM_BYTES_REV_COLUMN
);
2783 invoke_data
->value
.uint_value
++;
2784 stat_tap_set_field_data(table
, gmtr
->opcode
, INVOKES_COLUMN
, invoke_data
);
2786 fwd_bytes_data
->value
.uint_value
+= gmtr
->size
;
2787 stat_tap_set_field_data(table
, gmtr
->opcode
, NUM_BYTES_FWD_COLUMN
, fwd_bytes_data
);
2791 result_data
->value
.uint_value
++;
2792 stat_tap_set_field_data(table
, gmtr
->opcode
, RET_RES_COLUMN
, result_data
);
2794 rev_bytes_data
->value
.uint_value
+= gmtr
->size
;
2795 stat_tap_set_field_data(table
, gmtr
->opcode
, NUM_BYTES_REV_COLUMN
, rev_bytes_data
);
2798 invokes
= invoke_data
->value
.uint_value
;
2799 fwd_bytes
= fwd_bytes_data
->value
.uint_value
;
2800 results
= result_data
->value
.uint_value
;
2801 rev_bytes
= rev_bytes_data
->value
.uint_value
;
2805 avg_data
= stat_tap_get_field_data(table
, gmtr
->opcode
, AVG_BYTES_FWD_COLUMN
);
2806 avg_data
->value
.float_value
+= (float) fwd_bytes
/ invokes
;
2807 stat_tap_set_field_data(table
, gmtr
->opcode
, AVG_BYTES_FWD_COLUMN
, avg_data
);
2811 avg_data
= stat_tap_get_field_data(table
, gmtr
->opcode
, AVG_BYTES_REV_COLUMN
);
2812 avg_data
->value
.float_value
+= (float) rev_bytes
/ results
;
2813 stat_tap_set_field_data(table
, gmtr
->opcode
, AVG_BYTES_REV_COLUMN
, avg_data
);
2816 avg_data
= stat_tap_get_field_data(table
, gmtr
->opcode
, AVG_BYTES_COLUMN
);
2817 avg_data
->value
.float_value
+= (float) (fwd_bytes
+ rev_bytes
) / (invokes
+ results
);
2818 stat_tap_set_field_data(table
, gmtr
->opcode
, AVG_BYTES_COLUMN
, avg_data
);
2819 return TAP_PACKET_REDRAW
;
2823 gsm_map_stat_reset(stat_tap_table
* table
)
2826 stat_tap_table_item_type
* item_data
;
2828 for (element
= 0; element
< table
->num_elements
; element
++)
2830 item_data
= stat_tap_get_field_data(table
, element
, INVOKES_COLUMN
);
2831 item_data
->value
.uint_value
= 0;
2832 stat_tap_set_field_data(table
, element
, INVOKES_COLUMN
, item_data
);
2837 gsm_map_stat_free_table_item(stat_tap_table
* table _U_
, unsigned row _U_
, unsigned column
, stat_tap_table_item_type
* field_data
)
2839 if (column
!= OP_CODE_COLUMN
) return;
2840 g_free((char*)field_data
->value
.string_value
);
2843 /*--- proto_reg_handoff_gsm_map ---------------------------------------*/
2844 static void range_delete_callback(uint32_t ssn
, void *ptr _U_
)
2847 delete_itu_tcap_subdissector(ssn
, map_handle
);
2851 static void range_add_callback(uint32_t ssn
, void *ptr _U_
)
2854 add_itu_tcap_subdissector(ssn
, map_handle
);
2858 void proto_reg_handoff_gsm_map(void) {
2860 static bool map_prefs_initialized
= false;
2861 static range_t
*ssn_range
;
2863 if (!map_prefs_initialized
) {
2864 map_prefs_initialized
= true;
2865 ranap_handle
= find_dissector_add_dependency("ranap", proto_gsm_map
);
2866 dtap_handle
= find_dissector_add_dependency("gsm_a_dtap", proto_gsm_map
);
2867 gsm_sms_handle
= find_dissector_add_dependency("gsm_sms", proto_gsm_map
);
2868 bssap_handle
= find_dissector_add_dependency("gsm_a_bssmap", proto_gsm_map
);
2870 oid_add_from_string("itu(0) administration(2) japan(440)","0.2.440" );
2871 register_ber_oid_dissector_handle("0.4.0.0.1.0.1.3", map_handle
, proto_gsm_map
,"networkLocUpContext-v3");
2872 register_ber_oid_dissector_handle("0.4.0.0.1.0.1.2", map_handle
, proto_gsm_map
,"networkLocUpContext-v2" );
2873 register_ber_oid_dissector_handle("0.4.0.0.1.0.1.1", map_handle
, proto_gsm_map
,"networkLocUpContext-v1" );
2874 register_ber_oid_dissector_handle("0.4.0.0.1.0.2.3", map_handle
, proto_gsm_map
,"locationCancellationContext-v3" );
2875 register_ber_oid_dissector_handle("0.4.0.0.1.0.2.2", map_handle
, proto_gsm_map
,"locationCancellationContext-v2" );
2876 register_ber_oid_dissector_handle("0.4.0.0.1.0.2.1", map_handle
, proto_gsm_map
,"locationCancellationContext-v1" );
2877 register_ber_oid_dissector_handle("0.4.0.0.1.0.3.3", map_handle
, proto_gsm_map
,"roamingNumberEnquiryContext-v3" );
2878 register_ber_oid_dissector_handle("0.4.0.0.1.0.3.2", map_handle
, proto_gsm_map
,"roamingNumberEnquiryContext-v2" );
2879 register_ber_oid_dissector_handle("0.4.0.0.1.0.3.1", map_handle
, proto_gsm_map
,"roamingNumberEnquiryContext-v1" );
2880 register_ber_oid_dissector_handle("0.4.0.0.1.0.4.3", map_handle
, proto_gsm_map
,"istAlertingContext-v3" );
2881 register_ber_oid_dissector_handle("0.4.0.0.1.0.5.3", map_handle
, proto_gsm_map
,"locationInfoRetrievalContext-v3" );
2882 register_ber_oid_dissector_handle("0.4.0.0.1.0.5.2", map_handle
, proto_gsm_map
,"locationInfoRetrievalContext-v2" );
2883 register_ber_oid_dissector_handle("0.4.0.0.1.0.5.1", map_handle
, proto_gsm_map
,"locationInfoRetrievalContext-v1" );
2884 register_ber_oid_dissector_handle("0.4.0.0.1.0.6.4", map_handle
, proto_gsm_map
,"callControlTransferContext-v4" );
2885 register_ber_oid_dissector_handle("0.4.0.0.1.0.6.3", map_handle
, proto_gsm_map
,"callControlTransferContext-v3" );
2886 register_ber_oid_dissector_handle("0.4.0.0.1.0.7.3", map_handle
, proto_gsm_map
,"reportingContext-v3" );
2887 register_ber_oid_dissector_handle("0.4.0.0.1.0.8.3", map_handle
, proto_gsm_map
,"callCompletionContext-v3" );
2888 register_ber_oid_dissector_handle("0.4.0.0.1.0.9.3", map_handle
, proto_gsm_map
,"serviceTerminationContext-v3" );
2889 register_ber_oid_dissector_handle("0.4.0.0.1.0.10.2", map_handle
, proto_gsm_map
,"resetContext-v2" );
2890 register_ber_oid_dissector_handle("0.4.0.0.1.0.10.1", map_handle
, proto_gsm_map
,"resetContext-v1" );
2891 register_ber_oid_dissector_handle("0.4.0.0.1.0.11.3", map_handle
, proto_gsm_map
,"handoverControlContext-v3" );
2892 register_ber_oid_dissector_handle("0.4.0.0.1.0.11.2", map_handle
, proto_gsm_map
,"handoverControlContext-v2" );
2893 register_ber_oid_dissector_handle("0.4.0.0.1.0.11.1", map_handle
, proto_gsm_map
,"handoverControlContext-v1" );
2894 register_ber_oid_dissector_handle("0.4.0.0.1.0.12.3", map_handle
, proto_gsm_map
,"sIWFSAllocationContext-v3" );
2895 register_ber_oid_dissector_handle("0.4.0.0.1.0.13.3", map_handle
, proto_gsm_map
,"equipmentMngtContext-v3" );
2896 register_ber_oid_dissector_handle("0.4.0.0.1.0.13.2", map_handle
, proto_gsm_map
,"equipmentMngtContext-v2" );
2897 register_ber_oid_dissector_handle("0.4.0.0.1.0.13.1", map_handle
, proto_gsm_map
,"equipmentMngtContext-v1" );
2898 register_ber_oid_dissector_handle("0.4.0.0.1.0.14.3", map_handle
, proto_gsm_map
,"infoRetrievalContext-v3" );
2899 register_ber_oid_dissector_handle("0.4.0.0.1.0.14.2", map_handle
, proto_gsm_map
,"infoRetrievalContext-v2" );
2900 register_ber_oid_dissector_handle("0.4.0.0.1.0.14.1", map_handle
, proto_gsm_map
,"infoRetrievalContext-v1" );
2901 /* fallback to infoRetrieval(14) version1(1) and not interVlrInfoRetrieval(15) version1(1) */
2902 /*register_ber_oid_dissector_handle("0.4.0.0.1.0.15.1", map_handle, proto_gsm_map,"map-ac interVlrInfoRetrieval(15) version1(1)" );*/
2903 register_ber_oid_dissector_handle("0.4.0.0.1.0.15.2", map_handle
, proto_gsm_map
,"interVlrInfoRetrievalContext-v2" );
2904 register_ber_oid_dissector_handle("0.4.0.0.1.0.15.3", map_handle
, proto_gsm_map
,"interVlrInfoRetrievalContext-v3" );
2905 register_ber_oid_dissector_handle("0.4.0.0.1.0.16.3", map_handle
, proto_gsm_map
,"subscriberDataMngtContext-v3" );
2906 register_ber_oid_dissector_handle("0.4.0.0.1.0.16.2", map_handle
, proto_gsm_map
,"subscriberDataMngtContext-v2" );
2907 register_ber_oid_dissector_handle("0.4.0.0.1.0.16.1", map_handle
, proto_gsm_map
,"subscriberDataMngtContext-v1" );
2908 register_ber_oid_dissector_handle("0.4.0.0.1.0.17.3", map_handle
, proto_gsm_map
,"tracingContext-v3" );
2909 register_ber_oid_dissector_handle("0.4.0.0.1.0.17.2", map_handle
, proto_gsm_map
,"tracingContext-v2" );
2910 register_ber_oid_dissector_handle("0.4.0.0.1.0.17.1", map_handle
, proto_gsm_map
,"tracingContext-v1" );
2911 register_ber_oid_dissector_handle("0.4.0.0.1.0.18.2", map_handle
, proto_gsm_map
,"networkFunctionalSsContext-v2" );
2912 register_ber_oid_dissector_handle("0.4.0.0.1.0.18.1", map_handle
, proto_gsm_map
,"networkFunctionalSsContext-v1" );
2913 register_ber_oid_dissector_handle("0.4.0.0.1.0.19.2", map_handle
, proto_gsm_map
,"networkUnstructuredSsContext-v2" );
2914 register_ber_oid_dissector_handle("0.4.0.0.1.0.20.3", map_handle
, proto_gsm_map
,"shortMsgGatewayContext-v3" );
2915 register_ber_oid_dissector_handle("0.4.0.0.1.0.20.2", map_handle
, proto_gsm_map
,"shortMsgGatewayContext-v2" );
2916 register_ber_oid_dissector_handle("0.4.0.0.1.0.20.1", map_handle
, proto_gsm_map
,"shortMsgGatewayContext-v1" );
2917 register_ber_oid_dissector_handle("0.4.0.0.1.0.21.3", map_handle
, proto_gsm_map
,"shortMsgMO-RelayContext-v3" );
2918 register_ber_oid_dissector_handle("0.4.0.0.1.0.21.2", map_handle
, proto_gsm_map
,"shortMsgMO-RelayContext-v2" );
2919 register_ber_oid_dissector_handle("0.4.0.0.1.0.21.1", map_handle
, proto_gsm_map
,"shortMsgRelayContext-v1" );
2920 register_ber_oid_dissector_handle("0.4.0.0.1.0.22.3", map_handle
, proto_gsm_map
,"subscriberDataModificationNotificationContext-v3" );
2921 register_ber_oid_dissector_handle("0.4.0.0.1.0.23.2", map_handle
, proto_gsm_map
,"shortMsgAlertContext-v2" );
2922 register_ber_oid_dissector_handle("0.4.0.0.1.0.23.1", map_handle
, proto_gsm_map
,"shortMsgAlertContext-v1" );
2923 register_ber_oid_dissector_handle("0.4.0.0.1.0.24.3", map_handle
, proto_gsm_map
,"mwdMngtContext-v3" );
2924 register_ber_oid_dissector_handle("0.4.0.0.1.0.24.2", map_handle
, proto_gsm_map
,"mwdMngtContext-v2" );
2925 register_ber_oid_dissector_handle("0.4.0.0.1.0.24.1", map_handle
, proto_gsm_map
,"mwdMngtContext-v1" );
2926 register_ber_oid_dissector_handle("0.4.0.0.1.0.25.3", map_handle
, proto_gsm_map
,"shortMsgMT-RelayContext-v3" );
2927 register_ber_oid_dissector_handle("0.4.0.0.1.0.25.2", map_handle
, proto_gsm_map
,"shortMsgMT-RelayContext-v2" );
2928 register_ber_oid_dissector_handle("0.4.0.0.1.0.26.2", map_handle
, proto_gsm_map
,"imsiRetrievalContext-v2" );
2929 register_ber_oid_dissector_handle("0.4.0.0.1.0.27.2", map_handle
, proto_gsm_map
,"msPurgingContext-v2" );
2930 register_ber_oid_dissector_handle("0.4.0.0.1.0.27.3", map_handle
, proto_gsm_map
,"msPurgingContext-v3" );
2931 register_ber_oid_dissector_handle("0.4.0.0.1.0.28.3", map_handle
, proto_gsm_map
,"subscriberInfoEnquiryContext-v3" );
2932 register_ber_oid_dissector_handle("0.4.0.0.1.0.29.3", map_handle
, proto_gsm_map
,"anyTimeInfoEnquiryContext-v3" );
2933 register_ber_oid_dissector_handle("0.4.0.0.1.0.31.3", map_handle
, proto_gsm_map
,"groupCallControlContext-v3" );
2934 register_ber_oid_dissector_handle("0.4.0.0.1.0.32.3", map_handle
, proto_gsm_map
,"gprsLocationUpdateContext-v3" );
2935 register_ber_oid_dissector_handle("0.4.0.0.1.0.33.4", map_handle
, proto_gsm_map
,"gprsLocationInfoRetrievalContext-v4" );
2936 register_ber_oid_dissector_handle("0.4.0.0.1.0.33.3", map_handle
, proto_gsm_map
,"gprsLocationInfoRetrievalContext-v3" );
2937 register_ber_oid_dissector_handle("0.4.0.0.1.0.34.3", map_handle
, proto_gsm_map
,"failureReportContext-v3" );
2938 register_ber_oid_dissector_handle("0.4.0.0.1.0.35.3", map_handle
, proto_gsm_map
,"gprsNotifyContext-v3" );
2939 register_ber_oid_dissector_handle("0.4.0.0.1.0.36.3", map_handle
, proto_gsm_map
,"ss-InvocationNotificationContext-v3" );
2940 register_ber_oid_dissector_handle("0.4.0.0.1.0.37.3", map_handle
, proto_gsm_map
,"locationSvcGatewayContext-v3" );
2941 register_ber_oid_dissector_handle("0.4.0.0.1.0.38.3", map_handle
, proto_gsm_map
,"locationSvcEnquiryContext-v3" );
2942 register_ber_oid_dissector_handle("0.4.0.0.1.0.39.3", map_handle
, proto_gsm_map
,"authenticationFailureReportContext-v3" );
2943 register_ber_oid_dissector_handle("0.4.0.0.1.0.40.3", map_handle
, proto_gsm_map
,"secureTransportHandlingContext-v3" );
2944 register_ber_oid_dissector_handle("0.4.0.0.1.0.41.3", map_handle
, proto_gsm_map
,"shortMsgMT-Relay-VGCS-Context-v3" );
2945 register_ber_oid_dissector_handle("0.4.0.0.1.0.42.3", map_handle
, proto_gsm_map
,"mm-EventReportingContext-v3" );
2946 register_ber_oid_dissector_handle("0.4.0.0.1.0.43.3", map_handle
, proto_gsm_map
,"anyTimeInfoHandlingContext-v3" );
2947 register_ber_oid_dissector_handle("0.4.0.0.1.0.44.3", map_handle
, proto_gsm_map
,"resourceManagementContext-v3" );
2948 register_ber_oid_dissector_handle("0.4.0.0.1.0.45.3", map_handle
, proto_gsm_map
,"groupCallInfoRetrievalContext-v3" );
2949 /* Private extension container */
2950 register_ber_oid_dissector("1.3.12.2.1006.53.2.1.3", dissect_gsm_mapext_PlmnContainer
, proto_gsm_map
,"alcatel-E10-MAP-extension-PlmnContainer" );
2951 register_ber_oid_dissector("0.34.0",dissect_NokiaMAP_ext_IsdArgExtension
,proto_gsm_map
,"Nokia ISD Extension");
2952 register_ber_oid_dissector("0.34.1",dissect_NokiaMAP_ext_DsdArgExt
,proto_gsm_map
,"Nokia Dsd Extension");
2953 register_ber_oid_dissector("0.34.2",dissect_NokiaMAP_ext_UlResExtension
,proto_gsm_map
,"Nokia Location Update Extension");
2954 register_ber_oid_dissector("0.34.4",dissect_NokiaMAP_ext_SS_DataExtension
,proto_gsm_map
,"Nokia SS Data Extension");
2955 register_ber_oid_dissector("0.34.5",dissect_NokiaMAP_ext_SriExtension
,proto_gsm_map
,"Nokia SRI Request Extension");
2956 register_ber_oid_dissector("0.34.6",dissect_NokiaMAP_ExtraSignalInfo
,proto_gsm_map
,"Nokia ExtraSignalInfo Extension");
2957 register_ber_oid_dissector("0.34.7",dissect_NokiaMAP_ext_SriResExtension
,proto_gsm_map
,"Nokia SRI Response Extension");
2958 register_ber_oid_dissector("0.34.10",dissect_NokiaMAP_ext_CanLocArgExt
,proto_gsm_map
,"Nokia Cancel Location Extension");
2959 register_ber_oid_dissector("0.34.11",dissect_NokiaMAP_ext_ATMargExt
,proto_gsm_map
,"Nokia ATM Extension");
2960 register_ber_oid_dissector("0.34.12",dissect_NokiaMAP_ext_DTMargExt
,proto_gsm_map
,"Nokia DTM Extension");
2961 register_ber_oid_dissector("0.34.13",dissect_NokiaMAP_ext_NumberPorted
,proto_gsm_map
,"Nokia NumberPorted Extension");
2962 register_ber_oid_dissector("0.34.15",dissect_NokiaMAP_ext_HOExtension
,proto_gsm_map
,"Nokia HandOver Extension");
2963 register_ber_oid_dissector("0.34.16",dissect_NokiaMAP_ext_ATMresExt
,proto_gsm_map
,"Nokia ATMres Extension");
2964 register_ber_oid_dissector("0.34.17",dissect_NokiaMAP_ext_AbsentSubscriberExt
,proto_gsm_map
,"Nokia AbsentSubscriber Extension");
2965 register_ber_oid_dissector("0.34.18",dissect_NokiaMAP_ext_SriForSMArgExt
,proto_gsm_map
,"Nokia SriForSM Extension");
2966 register_ber_oid_dissector("0.34.19",dissect_NokiaMAP_ext_ReportSMDelStatArgExt
,proto_gsm_map
,"Nokia ReportSMDelStatt Extension");
2967 register_ber_oid_dissector("0.34.20",dissect_NokiaMAP_ext_UdlArgExt
,proto_gsm_map
,"Nokia Udl Extension");
2968 register_ber_oid_dissector("0.34.21",dissect_NokiaMAP_ext_RoamNotAllowedExt
,proto_gsm_map
,"Nokia RoamNotAllowed Extension");
2969 register_ber_oid_dissector("0.34.22",dissect_NokiaMAP_ext_MO_ForwardSM_ArgExt
,proto_gsm_map
,"Nokia MO-ForwardSM Extension");
2970 register_ber_oid_dissector("0.34.23",dissect_NokiaMAP_ext_ErrOlcmInfoTableExt
,proto_gsm_map
,"Nokia ErrOlcmInfoTable Extension");
2971 register_ber_oid_dissector("0.34.25",dissect_NokiaMAP_ext_RoutingCategoryExt
,proto_gsm_map
,"Nokia Routing Category Extension");
2972 register_ber_oid_dissector("0.34.26",dissect_NokiaMAP_ext_AnyTimeModArgExt
,proto_gsm_map
,"Nokia AnyTimeMod Extension");
2974 register_ber_oid_dissector("1.3.12.2.1107.3.66.1.1",dissect_NokiaMAP_ext_AccessTypeExt
,proto_gsm_map
,"Nokia AccessTypeExt Extension");
2975 register_ber_oid_dissector("1.3.12.2.1107.3.66.1.3",dissect_NokiaMAP_ext_AccessSubscriptionListExt
,proto_gsm_map
,"Nokia AccessSubscriptionListExt Extension");
2976 register_ber_oid_dissector("1.3.12.2.1107.3.66.1.6",dissect_NokiaMAP_ext_AllowedServiceData
,proto_gsm_map
,"Nokia AllowedServiceData Extension");
2978 register_ber_oid_dissector("1.2.826.0.1249.58.1.0",dissect_gsm_map_ericsson_ext_ExtensionType
,proto_gsm_map
,"Ericsson ExtensionType Extension");
2981 range_foreach(ssn_range
, range_delete_callback
, NULL
);
2982 wmem_free(wmem_epan_scope(), ssn_range
);
2985 ssn_range
= range_copy(wmem_epan_scope(), global_ssn_range
);
2986 range_foreach(ssn_range
, range_add_callback
, NULL
);
2990 /*--- proto_register_gsm_map -------------------------------------------*/
2991 void proto_register_gsm_map(void) {
2992 module_t
*gsm_map_module
;
2993 expert_module_t
* expert_gsm_map
;
2995 /* List of fields */
2996 static hf_register_info hf
[] = {
2997 { &hf_gsm_map_old_Component_PDU
,
2998 { "Component", "gsm_map.old.Component",
2999 FT_UINT32
, BASE_DEC
, VALS(gsm_old_Component_vals
), 0,
3001 { &hf_gsm_map_getPassword
,
3002 { "getPassword", "gsm_map.getPassword",
3003 FT_UINT8
, BASE_DEC
, VALS(gsm_old_GetPasswordArg_vals
), 0,
3005 { &hf_gsm_map_currentPassword
,
3006 { "currentPassword", "gsm_map.currentPassword",
3007 FT_STRING
, BASE_NONE
, NULL
, 0,
3009 { &hf_gsm_map_extension
,
3010 { "Extension", "gsm_map.extension",
3011 FT_BOOLEAN
, 8, TFS(&tfs_no_extension_extension
), 0x80,
3013 { &hf_gsm_map_nature_of_number
,
3014 { "Nature of number", "gsm_map.nature_of_number",
3015 FT_UINT8
, BASE_HEX
|BASE_EXT_STRING
, &gsm_map_nature_of_number_values_ext
, 0x70,
3017 { &hf_gsm_map_number_plan
,
3018 { "Number plan", "gsm_map.number_plan",
3019 FT_UINT8
, BASE_HEX
|BASE_EXT_STRING
, &gsm_map_number_plan_values_ext
, 0x0f,
3021 { &hf_gsm_map_address_digits
,
3022 { "Address digits", "gsm_map.address.digits",
3023 FT_STRING
, BASE_NONE
, NULL
, 0,
3025 { &hf_gsm_map_TBCD_digits
,
3026 { "TBCD digits", "gsm_map.tbcd_digits",
3027 FT_STRING
, BASE_NONE
, NULL
, 0,
3029 { &hf_gsm_map_Ss_Status_unused
,
3030 { "Unused", "gsm_map.unused",
3031 FT_UINT8
, BASE_HEX
, NULL
, 0xf0,
3033 { &hf_gsm_map_Ss_Status_q_bit
,
3034 { "Q bit", "gsm_map.ss_status_q_bit",
3035 FT_BOOLEAN
, 8, TFS(&gsm_map_Ss_Status_q_bit_values
), 0x08,
3037 { &hf_gsm_map_Ss_Status_p_bit
,
3038 { "P bit", "gsm_map.ss_status_p_bit",
3039 FT_BOOLEAN
, 8, TFS(&tfs_provisioned_not_provisioned
), 0x04,
3041 { &hf_gsm_map_Ss_Status_r_bit
,
3042 { "R bit", "gsm_map.ss_status_r_bit",
3043 FT_BOOLEAN
, 8, TFS(&tfs_registered_not_registered
), 0x02,
3045 { &hf_gsm_map_Ss_Status_a_bit
,
3046 { "A bit", "gsm_map.ss_status_a_bit",
3047 FT_BOOLEAN
, 8, TFS(&gsm_map_Ss_Status_a_values
), 0x01,
3049 { &hf_gsm_map_notification_to_forwarding_party
,
3050 { "Notification to forwarding party", "gsm_map.notification_to_forwarding_party",
3051 FT_BOOLEAN
, 8, TFS(¬ification_value
), 0x80,
3053 { &hf_gsm_map_redirecting_presentation
,
3054 { "Redirecting presentation", "gsm_map.redirecting_presentation",
3055 FT_BOOLEAN
, 8, TFS(&redirecting_presentation_value
), 0x40,
3057 { &hf_gsm_map_notification_to_calling_party
,
3058 { "Notification to calling party", "gsm_map.notification_to_calling_party",
3059 FT_BOOLEAN
, 8, TFS(¬ification_value
), 0x20,
3061 { &hf_gsm_map_forwarding_reason
,
3062 { "Forwarding reason", "gsm_map.forwarding_reason",
3063 FT_UINT8
, BASE_HEX
, VALS(forwarding_reason_values
), 0x0c,
3065 { &hf_gsm_map_pdp_type_org
,
3066 { "PDP Type Organization", "gsm_map.pdp_type_org",
3067 FT_UINT8
, BASE_HEX
, VALS(pdp_type_org_values
), 0x0f,
3069 { &hf_gsm_map_etsi_pdp_type_number
,
3070 { "PDP Type Number", "gsm_map.pdp_type_number",
3071 FT_UINT8
, BASE_HEX
, VALS(etsi_pdp_type_number_values
), 0,
3072 "ETSI PDP Type Number", HFILL
}},
3073 { &hf_gsm_map_ietf_pdp_type_number
,
3074 { "PDP Type Number", "gsm_map.ietf_pdp_type_number",
3075 FT_UINT8
, BASE_HEX
, VALS(ietf_pdp_type_number_values
), 0,
3076 "IETF PDP Type Number", HFILL
}},
3077 { &hf_gsm_map_ext_qos_subscribed_pri
,
3078 { "Allocation/Retention priority", "gsm_map.ext_qos_subscribed_pri",
3079 FT_UINT8
, BASE_DEC
, NULL
, 0xff,
3081 { &hf_gsm_map_qos_traffic_cls
,
3082 { "Traffic class", "gsm_map.qos.traffic_cls",
3083 FT_UINT8
, BASE_DEC
, VALS(gsm_a_sm_qos_traffic_cls_vals
), 0xe0,
3085 { &hf_gsm_map_qos_del_order
,
3086 { "Delivery order", "gsm_map.qos.del_order",
3087 FT_UINT8
, BASE_DEC
, VALS(gsm_a_sm_qos_traffic_cls_vals
), 0x18,
3089 { &hf_gsm_map_qos_del_of_err_sdu
,
3090 { "Delivery of erroneous SDUs", "gsm_map.qos.del_of_err_sdu",
3091 FT_UINT8
, BASE_DEC
, VALS(gsm_a_sm_qos_del_of_err_sdu_vals
), 0x03,
3093 { &hf_gsm_map_qos_ber
,
3094 { "Residual Bit Error Rate (BER)", "gsm_map.qos.ber",
3095 FT_UINT8
, BASE_DEC
, VALS(gsm_a_sm_qos_ber_vals
), 0xf0,
3097 { &hf_gsm_map_qos_sdu_err_rat
,
3098 { "SDU error ratio", "gsm_map.qos.sdu_err_rat",
3099 FT_UINT8
, BASE_DEC
, VALS(gsm_a_sm_qos_sdu_err_rat_vals
), 0x0f,
3101 { &hf_gsm_map_qos_traff_hdl_pri
,
3102 { "Traffic handling priority", "gsm_map.qos.traff_hdl_pri",
3103 FT_UINT8
, BASE_DEC
, VALS(gsm_a_sm_qos_traff_hdl_pri_vals
), 0x03,
3106 { &hf_gsm_map_qos_max_sdu
,
3107 { "Maximum SDU size", "gsm_map.qos.max_sdu",
3108 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3110 { &hf_gsm_map_max_brate_ulink
,
3111 { "Maximum bit rate for uplink in kbit/s", "gsm_map.qos.max_brate_ulink",
3112 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3114 { &hf_gsm_map_max_brate_dlink
,
3115 { "Maximum bit rate for downlink in kbit/s", "gsm_map.qos.max_brate_dlink",
3116 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3118 { &hf_gsm_map_qos_transfer_delay
,
3119 { "Transfer delay (Raw data see TS 24.008 for interpretation)", "gsm_map.qos.transfer_delay",
3120 FT_UINT8
, BASE_DEC
, NULL
, 0xfc,
3122 { &hf_gsm_map_guaranteed_max_brate_ulink
,
3123 { "Guaranteed bit rate for uplink in kbit/s", "gsm_map.qos.brate_ulink",
3124 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3126 { &hf_gsm_map_guaranteed_max_brate_dlink
,
3127 { "Guaranteed bit rate for downlink in kbit/s", "gsm_map.qos.brate_dlink",
3128 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3130 { &hf_gsm_map_GSNAddress_IPv4
,
3131 { "GSN-Address IPv4", "gsm_map.gsnaddress_ipv4",
3132 FT_IPv4
, BASE_NONE
, NULL
, 0,
3133 "IPAddress IPv4", HFILL
}},
3134 { &hf_gsm_map_GSNAddress_IPv6
,
3135 { "GSN Address IPv6", "gsm_map.gsnaddress_ipv6",
3136 FT_IPv6
, BASE_NONE
, NULL
, 0,
3137 "IPAddress IPv6", HFILL
}},
3138 { &hf_gsm_map_ranap_service_Handover
,
3139 { "service-Handover", "gsm_map.ranap.service_Handover",
3140 FT_UINT32
, BASE_DEC
, VALS(ranap_Service_Handover_vals
), 0,
3141 "gsm_map.ranap.Service_Handover", HFILL
}},
3142 { &hf_gsm_map_IntegrityProtectionInformation
,
3143 { "IntegrityProtectionInformation", "gsm_map.ranap.IntegrityProtectionInformation",
3144 FT_NONE
, BASE_NONE
, NULL
, 0,
3145 "gsm_map.ranap.IntegrityProtectionInformation", HFILL
}},
3146 { &hf_gsm_map_EncryptionInformation
,
3147 { "EncryptionInformation", "gsm_map.ranap.EncryptionInformation",
3148 FT_NONE
, BASE_NONE
, NULL
, 0,
3149 "gsm_map.ranap.EncryptionInformation", HFILL
}},
3150 { &hf_gsm_map_ss_SS_UserData
,
3151 { "SS-UserData", "gsm_ss.SS_UserData",
3152 FT_STRING
, BASE_NONE
, NULL
, 0,
3153 "gsm_map.ss.SS_UserData", HFILL
}},
3154 { &hf_gsm_map_cbs_coding_grp
,
3155 { "Coding Group","gsm_map.cbs.coding_grp",
3156 FT_UINT8
,BASE_DEC
|BASE_EXT_STRING
, &gsm_map_cbs_data_coding_scheme_coding_grp_vals_ext
, 0xf0,
3159 { &hf_gsm_map_cbs_coding_grp0_lang
,
3160 { "Language","gsm_map.cbs.coding_grp0_lang",
3161 FT_UINT8
,BASE_DEC
|BASE_EXT_STRING
, &gsm_map_cbs_coding_grp0_lang_vals_ext
, 0x0f,
3164 { &hf_gsm_map_cbs_coding_grp1_lang
,
3165 { "Language","gsm_map.cbs.coding_grp1_lang",
3166 FT_UINT8
,BASE_DEC
|BASE_EXT_STRING
, &gsm_map_cbs_coding_grp1_lang_vals_ext
, 0x0f,
3169 { &hf_gsm_map_cbs_coding_grp2_lang
,
3170 { "Language","gsm_map.cbs.coding_grp2_lang",
3171 FT_UINT8
,BASE_DEC
|BASE_EXT_STRING
, &gsm_map_cbs_coding_grp2_lang_vals_ext
, 0x0f,
3174 { &hf_gsm_map_cbs_coding_grp3_lang
,
3175 { "Language","gsm_map.cbs.coding_grp3_lang",
3176 FT_UINT8
,BASE_DEC
|BASE_EXT_STRING
, &gsm_map_cbs_coding_grp3_lang_vals_ext
, 0x0f,
3179 { &hf_gsm_map_cbs_coding_grp4_7_comp
,
3180 { "Compressed indicator","gsm_map.cbs.coding_grp4_7_comp",
3181 FT_BOOLEAN
, 8, TFS(&gsm_map_cbs_coding_grp4_7_comp_vals
), 0x20,
3184 { &hf_gsm_map_cbs_coding_grp4_7_class_ind
,
3185 { "Message Class present","gsm_map.cbs.coding_grp4_7_class_ind",
3186 FT_BOOLEAN
, 8, TFS(&gsm_map_cbs_coding_grp4_7_class_ind_vals
), 0x10,
3189 { &hf_gsm_map_cbs_coding_grp4_7_char_set
,
3190 { "Character set being used","gsm_map.cbs.coding_grp4_7_char_set",
3191 FT_UINT8
,BASE_DEC
, VALS(gsm_map_cbs_coding_grp4_7_char_set_vals
), 0x0c,
3194 { &hf_gsm_map_cbs_coding_grp4_7_class
,
3195 { "Message Class","gsm_map.cbs.coding_grp4_7_class",
3196 FT_UINT8
,BASE_DEC
, VALS(gsm_map_cbs_coding_grp4_7_class_vals
), 0x03,
3199 { &hf_gsm_map_cbs_coding_grp15_mess_code
,
3200 { "Message coding","gsm_map.cbs.cbs_coding_grp15_mess_code",
3201 FT_UINT8
,BASE_DEC
, VALS(gsm_map_cbs_coding_grp15_mess_code_vals
), 0x04,
3204 { &hf_gsm_map_cbs_coding_grp15_class
,
3205 { "Message Class","gsm_map.cbs.gsm_map_cbs_coding_grp15_class",
3206 FT_UINT8
,BASE_DEC
, VALS(gsm_map_cbs_coding_grp15_class_vals
), 0x03,
3209 { &hf_gsm_map_ie_tag
,
3210 { "Tag", "gsm_map.ie_tag",
3211 FT_UINT8
, BASE_DEC
, VALS(gsm_map_tag_vals
), 0,
3212 "GSM 04.08 tag", HFILL
}},
3214 { "Length", "gsm_map.length",
3215 FT_UINT8
, BASE_DEC
, NULL
, 0,
3217 { &hf_gsm_map_disc_par
,
3218 { "Discrimination parameter", "gsm_map.disc_par",
3219 FT_UINT8
, BASE_DEC
, VALS(gsm_map_disc_par_vals
), 0,
3222 { "DLCI", "gsm_map.dlci",
3223 FT_UINT8
, BASE_DEC
, NULL
, 0,
3224 "Data Link Connection Indicator", HFILL
}},
3226 { "APN", "gsm_map.apn_str",
3227 FT_STRING
, BASE_NONE
, NULL
, 0,
3229 { &hf_gsm_map_ericsson_locationInformation_rat
,
3230 { "RAT", "gsm_map.ericsson.locationInformation.rat",
3231 FT_UINT8
, BASE_DEC
, VALS(gsm_map_ericsson_locationInformation_rat_vals
), 0,
3232 "Radio Access Technology", HFILL
}},
3233 { &hf_gsm_map_ericsson_locationInformation_lac
,
3234 { "LAC", "gsm_map.ericsson.locationInformation.lac",
3235 FT_UINT16
, BASE_DEC_HEX
, NULL
, 0,
3236 "Location Area Code", HFILL
}},
3237 { &hf_gsm_map_ericsson_locationInformation_ci
,
3238 { "CI", "gsm_map.ericsson.locationInformation.ci",
3239 FT_UINT16
, BASE_DEC_HEX
, NULL
, 0,
3240 "Cell Identity", HFILL
}},
3241 { &hf_gsm_map_ericsson_locationInformation_sac
,
3242 { "SAC", "gsm_map.ericsson.locationInformation.sac",
3243 FT_UINT16
, BASE_DEC_HEX
, NULL
, 0,
3244 "Service Area Code", HFILL
}},
3245 { &hf_gsm_map_ussd_string
,
3246 { "USSD String", "gsm_map.ussd_string",
3247 FT_STRING
, BASE_NONE
, NULL
, 0,
3249 { &hf_gsm_map_spare_bits
,
3250 { "Spare bit(s)", "gsm_map.spare_bits",
3251 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
3254 { &hf_gsm_map_qos_signalling_ind
,
3255 { "Signalling indication", "gsm_map.qos.signalling_ind",
3256 FT_BOOLEAN
, 8, TFS(&gsm_map_qos_signalling_ind_value
), 0x10,
3259 { &hf_gsm_map_qos_source_stat_desc
,
3260 { "Source statistics description", "gsm_map.qos.source_stat_desc",
3261 FT_UINT8
, BASE_DEC
, NULL
, 0x0f,
3264 { &hf_gsm_map_qos_max_bitrate_upl_ext
,
3265 { "Maximum bitrate for uplink (extended)", "gsm_map.qos.max_bitrate_upl_ext",
3266 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
3269 { &hf_gsm_map_qos_max_bitrate_downl_ext
,
3270 { "Maximum bitrate for downlink (extended)", "gsm_map.qos.max_bitrate_downl_ext",
3271 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
3274 { &hf_gsm_map_qos_guar_bitrate_upl_ext
,
3275 { "Guaranteed bitrate for uplink (extended)", "gsm_map.qos.guar_bitrate_upl_ext",
3276 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
3279 { &hf_gsm_map_qos_guar_bitrate_downl_ext
,
3280 { "Guaranteed bitrate for downlink (extended)", "gsm_map.qos.guar_bitrate_downl_ext",
3281 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
3285 { &hf_gsm_map_qos_max_bitrate_upl_ext2,
3286 { "Maximum bitrate for uplink (extended-2)", "gsm_map.qos.max_bitrate_upl_ext2",
3287 FT_UINT8, BASE_DEC, NULL, 0x0,
3290 { &hf_gsm_map_qos_max_bitrate_downl_ext2,
3291 { "Maximum bitrate for downlink (extended-2)", "gsm_map.qos.max_bitrate_downl_ext2",
3292 FT_UINT8, BASE_DEC, NULL, 0x0,
3295 { &hf_gsm_map_qos_guar_bitrate_upl_ext2,
3296 { "Guaranteed bitrate for uplink (extended-2)", "gsm_map.qos.guar_bitrate_upl_ext2",
3297 FT_UINT8, BASE_DEC, NULL, 0x0,
3300 { &hf_gsm_map_qos_guar_bitrate_downl_ext2,
3301 { "Guaranteed bitrate for downlink (extended-2)", "gsm_map.qos.guar_bitrate_downl_ext2",
3302 FT_UINT8, BASE_DEC, NULL, 0x0,
3306 { &hf_gsm_map_earp_pvi
,
3307 { "PVI Pre-emption Vulnerability", "gsm_map.EARP_pre_emption_par_vulnerability",
3308 FT_BOOLEAN
, 8, TFS(&tfs_disabled_enabled
), 0x01,
3311 { &hf_gsm_map_earp_pl
,
3312 { "PL Priority Level", "gsm_map.EARP_priority_level",
3313 FT_UINT8
, BASE_DEC
, NULL
, 0x3C,
3316 { &hf_gsm_map_earp_pci
,
3317 { "PCI Pre-emption Capability", "gsm_map.EARP_pre_emption_Capability",
3318 FT_BOOLEAN
, 8, TFS(&tfs_disabled_enabled
), 0x40,
3322 #include "packet-gsm_map-hfarr.c"
3325 /* List of subtrees */
3326 static int *ett
[] = {
3328 &ett_gsm_map_InvokeId
,
3329 &ett_gsm_map_InvokePDU
,
3330 &ett_gsm_map_ReturnResultPDU
,
3331 &ett_gsm_map_ReturnErrorPDU
,
3332 &ett_gsm_map_ReturnResult_result
,
3333 &ett_gsm_map_ReturnError_result
,
3334 &ett_gsm_map_GSMMAPPDU
,
3335 &ett_gsm_map_ext_qos_subscribed
,
3336 &ett_gsm_map_pdptypenumber
,
3337 &ett_gsm_map_RAIdentity
,
3338 &ett_gsm_map_LAIFixedLength
,
3339 &ett_gsm_map_isdn_address_string
,
3340 &ett_gsm_map_geo_desc
,
3341 &ett_gsm_map_LongSignalInfo
,
3342 &ett_gsm_map_RadioResourceInformation
,
3343 &ett_gsm_map_MSNetworkCapability
,
3344 &ett_gsm_map_MSRadioAccessCapability
,
3345 &ett_gsm_map_externalsignalinfo
,
3346 &ett_gsm_map_cbs_data_coding
,
3347 &ett_gsm_map_GlobalCellId
,
3348 &ett_gsm_map_GeographicalInformation
,
3349 &ett_gsm_map_apn_str
,
3350 &ett_gsm_map_LocationNumber
,
3351 &ett_gsm_map_ericsson_locationInformation
,
3352 &ett_gsm_map_extension_data
,
3353 &ett_gsm_map_tbcd_digits
,
3354 &ett_gsm_map_ussd_string
,
3355 &ett_gsm_map_ext2_qos_subscribed
,
3356 &ett_gsm_map_ext3_qos_subscribed
,
3357 &ett_gsm_map_e_utranCellGlobalIdentity
,
3359 &ett_gsm_map_GeodeticInformation
,
3361 #include "packet-gsm_map-ettarr.c"
3364 static ei_register_info ei
[] = {
3365 { &ei_gsm_map_unknown_sequence3
, { "gsm_map.unknown.sequence3", PI_UNDECODED
, PI_ERROR
, "Unknown or not implemented [3] sequence", EXPFILL
}},
3366 { &ei_gsm_map_unknown_sequence
, { "gsm_map.unknown.sequence", PI_UNDECODED
, PI_ERROR
, "Unknown or not implemented sequence", EXPFILL
}},
3367 { &ei_gsm_map_unknown_parameter
, { "gsm_map.unknown.parameter", PI_UNDECODED
, PI_ERROR
, "Unknown or not implemented parameter", EXPFILL
}},
3368 { &ei_gsm_map_unknown_invokeData
, { "gsm_map.unknown.invokeData", PI_MALFORMED
, PI_WARN
, "Unknown invokeData", EXPFILL
}},
3369 { &ei_gsm_map_undecoded
, { "gsm_map.undecoded", PI_UNDECODED
, PI_WARN
, "If you want this decoded send the packet to Wireshark-dev", EXPFILL
}},
3372 static const enum_val_t application_context_modes
[] = {
3373 {"1", "Treat as AC 1", 1},
3374 {"2", "Treat as AC 2", 2},
3375 {"3", "Treat as AC 3", 3},
3379 static tap_param gsm_map_stat_params
[] = {
3380 { PARAM_FILTER
, "filter", "Filter", NULL
, true }
3383 static stat_tap_table_ui gsm_map_stat_table
= {
3384 REGISTER_TELEPHONY_GROUP_GSM
,
3387 "gsm_map,operation",
3389 gsm_map_stat_packet
,
3391 gsm_map_stat_free_table_item
,
3393 array_length(gsm_map_stat_fields
), gsm_map_stat_fields
,
3394 array_length(gsm_map_stat_params
), gsm_map_stat_params
,
3399 /* Register protocol */
3400 proto_gsm_map_ms
= proto_gsm_map_dialogue
= proto_gsm_map
= proto_register_protocol(PNAME
, PSNAME
, PFNAME
);
3402 map_handle
= register_dissector("gsm_map", dissect_gsm_map
, proto_gsm_map
);
3403 register_dissector("gsm_map_sccp", dissect_gsm_map_sccp
, proto_gsm_map
);
3405 /* Register fields and subtrees */
3406 proto_register_field_array(proto_gsm_map
, hf
, array_length(hf
));
3407 proto_register_subtree_array(ett
, array_length(ett
));
3408 expert_gsm_map
= expert_register_protocol(proto_gsm_map
);
3409 expert_register_field_array(expert_gsm_map
, ei
, array_length(ei
));
3411 register_dissector_table("gsm_map.v3.arg.opcode", "GSM_MAP V3 Arg Opcodes", proto_gsm_map
, FT_UINT8
, BASE_DEC
);
3412 register_dissector_table("gsm_map.v3.res.opcode", "GSM_MAP V3 Res Opcodes", proto_gsm_map
, FT_UINT8
, BASE_DEC
);
3414 map_prop_arg_opcode_table
= register_dissector_table("gsm_map.prop.arg.opcode", "GSM_MAP Proprietary Arg Opcodes", proto_gsm_map
, FT_UINT8
, BASE_DEC
);
3415 map_prop_res_opcode_table
= register_dissector_table("gsm_map.prop.res.opcode", "GSM_MAP Proprietary Res Opcodes", proto_gsm_map
, FT_UINT8
, BASE_DEC
);
3416 map_prop_err_opcode_table
= register_dissector_table("gsm_map.prop.err.opcode", "GSM_MAP Proprietary Err Opcodes", proto_gsm_map
, FT_UINT8
, BASE_DEC
);
3418 gsm_map_tap
= register_tap("gsm_map");
3420 #include "packet-gsm_map-dis-tab.c"
3421 oid_add_from_string("ericsson-gsm-Map-Ext","1.2.826.0.1249.58.1.0" );
3422 oid_add_from_string("accessTypeNotAllowed-id","1.3.12.2.1107.3.66.1.2");
3423 /*oid_add_from_string("map-ac networkLocUp(1) version3(3)","0.4.0.0.1.0.1.3" );
3425 * Register our configuration options, particularly our ssn:s
3428 range_convert_str(wmem_epan_scope(), &global_ssn_range
, "6-9,145,148-150", MAX_SSN
);
3430 gsm_map_module
= prefs_register_protocol(proto_gsm_map
, proto_reg_handoff_gsm_map
);
3432 prefs_register_range_preference(gsm_map_module
, "tcap.ssn", "TCAP SSNs",
3433 "TCAP Subsystem numbers used for GSM MAP",
3434 &global_ssn_range
, MAX_SSN
);
3436 prefs_register_bool_preference(gsm_map_module
, "application.context.version.from.trace",
3437 "Use application context from the trace",
3438 "Use the application context version from the "
3439 "lower level protocol (i.e., TCAP) transaction "
3441 &pref_context_version_from_trace
);
3443 prefs_register_enum_preference(gsm_map_module
, "application.context.version",
3444 "Default application context version",
3445 "The default application context version "
3446 "when not using the version from the lower "
3447 "layer transaction",
3448 &pref_application_context_version
, application_context_modes
, 3);
3450 prefs_register_bool_preference(gsm_map_module
, "ericsson.proprietary.extensions",
3451 "Dissect Ericsson proprietary extensions",
3452 "When enabled, dissector will use the non 3GPP standard extensions from Ericsson (that can override the standard ones)",
3453 &pref_ericsson_proprietary_ext
);
3455 register_stat_tap_table_ui(&gsm_map_stat_table
);
3464 * indent-tabs-mode: nil
3467 * ex: set shiftwidth=2 tabstop=8 expandtab:
3468 * :indentSize=2:tabSize=8:noTabs=true: