Revert "TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags"
[wireshark-sm.git] / epan / dissectors / asn1 / gsm_map / packet-gsm_map-template.c
blob42cc2e1e9183a2d88cf7220e190e92d18f307d70
1 /* XXX see bug 1852:
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
14 * including GSM SS.
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
25 * References GSM MAP:
26 * ETSI TS 129 002
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)
29 * References GSM SS
30 * References: 3GPP TS 24.080
33 #include "config.h"
35 #include <stdlib.h>
37 #include <epan/packet.h>
38 #include <epan/prefs.h>
39 #include <epan/stat_tap_ui.h>
40 #include <epan/tap.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>
46 #include <epan/tfs.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 */
207 #define MAX_SSN 254
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);
238 typedef struct {
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;
244 typedef struct {
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);
251 if (!gsm_map_pi) {
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);
263 if (!gsm_map_info) {
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);
268 key[0].length = 1;
269 key[0].key = &gsm_map_priv->tcap_private->src_tid;
270 key[1].length = 1;
271 key[1].key = &actx->pinfo->num;
272 key[2].length = 0;
273 key[2].key = NULL;
274 wmem_tree_insert32_array(gsm_map_info->packets, key, (void *)gsm_map_pi);
278 return 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);
291 if (!gsm_map_info) {
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);
296 key[0].length = 1;
297 key[0].key = &gsm_map_priv->tcap_private->src_tid;
298 key[1].length = 1;
299 key[1].key = &actx->pinfo->num;
300 key[2].length = 0;
301 key[2].key = NULL;
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)
304 return gsm_map_pi;
306 return NULL;
309 /* Value strings */
311 const value_string gsm_map_PDP_Type_Organisation_vals[] = {
312 { 0, "ETSI" },
313 { 1, "IETF" },
314 { 0, NULL }
317 const value_string gsm_map_ietf_defined_pdp_vals[] = {
318 { 0x21, "IPv4 Address" },
319 { 0x57, "IPv6 Address" },
320 { 0, NULL }
323 const value_string gsm_map_etsi_defined_pdp_vals[] = {
324 { 1, "PPP" },
325 { 0, NULL }
328 static const value_string gsm_map_tag_vals[] = {
329 { 0x4, "Bearer Capability" },
330 { 0, NULL }
333 static const value_string gsm_map_disc_par_vals[] = {
334 { 0, "Not Transparent" },
335 { 1, "Transparent" },
336 { 0, NULL }
339 static const value_string gsm_map_ericsson_locationInformation_rat_vals[] = {
340 { 0x0, "GSM" },
341 { 0x1, "UMTS" },
342 { 0x2, "LTE" },
343 { 0xf, "No information" },
344 { 0, NULL }
348 /* returns value in kb/s */
349 static unsigned
350 gsm_map_calc_bitrate(uint8_t value){
352 uint8_t granularity;
353 unsigned returnvalue;
355 if (value == 0xff)
356 return 0;
358 granularity = value >> 6;
359 returnvalue = value & 0x7f;
360 switch (granularity){
361 case 0:
362 break;
363 case 1:
364 returnvalue = ((returnvalue - 0x40) << 3)+64;
365 break;
366 case 2:
367 returnvalue = (returnvalue << 6)+576;
368 break;
369 case 3:
370 returnvalue = (returnvalue << 6)+576;
371 break;
373 return returnvalue;
377 static void
378 dissect_gsm_map_ext_qos_subscribed(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx){
379 int offset = 0;
380 proto_tree *subtree;
381 uint8_t octet;
382 uint16_t value;
384 subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_ext_qos_subscribed);
385 /* OCTET 1:
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
389 6-13.
391 /* Allocation/Retention Priority */
392 proto_tree_add_item(subtree, hf_gsm_map_ext_qos_subscribed_pri, tvb, offset, 1, ENC_BIG_ENDIAN);
393 offset++;
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);
403 offset++;
405 /* Maximum SDU size, octet 7 (see 3GPP TS 23.107) */
406 octet = tvb_get_uint8(tvb,offset);
407 switch (octet){
408 case 0:
409 proto_tree_add_uint_format_value(subtree, hf_gsm_map_qos_max_sdu, tvb, offset, 1, octet, "Reserved");
410 break;
411 case 0x93:
412 value = 1502;
413 proto_tree_add_uint(subtree, hf_gsm_map_qos_max_sdu, tvb, offset, 1, value);
414 break;
415 case 0x98:
416 value = 1510;
417 proto_tree_add_uint(subtree, hf_gsm_map_qos_max_sdu, tvb, offset, 1, value);
418 break;
419 case 0x99:
420 value = 1532;
421 proto_tree_add_uint(subtree, hf_gsm_map_qos_max_sdu, tvb, offset, 1, value);
422 break;
423 default:
424 if (octet<0x97){
425 value = octet * 10;
426 proto_tree_add_uint(subtree, hf_gsm_map_qos_max_sdu, tvb, offset, 1, value);
427 }else{
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);
431 offset++;
433 /* Maximum bit rate for uplink, octet 8 */
434 octet = tvb_get_uint8(tvb,offset);
435 if (octet == 0 ){
436 proto_tree_add_uint_format_value(subtree, hf_gsm_map_max_brate_ulink, tvb, offset, 1, octet, "Reserved" );
437 }else{
438 proto_tree_add_uint(subtree, hf_gsm_map_max_brate_ulink, tvb, offset, 1, gsm_map_calc_bitrate(octet));
440 offset++;
441 /* Maximum bit rate for downlink, octet 9 (see 3GPP TS 23.107) */
442 octet = tvb_get_uint8(tvb,offset);
443 if (octet == 0 ){
444 proto_tree_add_uint_format_value(subtree, hf_gsm_map_max_brate_dlink, tvb, offset, 1, octet, "Reserved" );
445 }else{
446 proto_tree_add_uint(subtree, hf_gsm_map_max_brate_dlink, tvb, offset, 1, gsm_map_calc_bitrate(octet));
448 offset++;
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);
453 offset++;
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);
459 offset++;
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);
465 if (octet == 0 ){
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");
467 }else{
468 proto_tree_add_uint(subtree, hf_gsm_map_guaranteed_max_brate_ulink, tvb, offset, 1, gsm_map_calc_bitrate(octet));
470 offset++;
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);
476 if (octet == 0 ){
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");
478 }else{
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"
496 #if 0
497 /* Helper function returning the main bitrates in kbps */
498 static uint32_t
499 qos_calc_bitrate(uint8_t oct)
501 if (oct <= 0x3f)
502 return oct;
503 if (oct <= 0x7f)
504 return 64 + (oct - 0x40) * 8;
506 return 576 + (oct - 0x80) * 64;
508 #endif
509 /* Helper function returning the extended bitrates in kbps */
510 static uint32_t
511 qos_calc_ext_bitrate(uint8_t oct)
513 if (oct <= 0x4a)
514 return 8600 + oct * 100;
515 if (oct <= 0xba)
516 return 16000 + (oct - 0x4a) * 1000;
518 return 128000 + (oct - 0xba) * 2000;
520 #if 0
521 static uint32_t
522 qos_calc_ext2_bitrate(uint8_t oct)
524 if (oct <= 0x3d)
525 return (256 + oct * 4);
526 if (oct <= 0xa1)
527 return (500 + (oct - 0x3d) * 10);
528 if (oct <= 0xf6)
529 return (1500 + (oct - 0xa1) * 100);
531 return 10000;
533 #endif
534 static void
535 dissect_gsm_map_ext2_qos_subscribed(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx) {
537 int offset = 0;
538 proto_tree *subtree;
539 const char *str;
540 uint8_t oct, tmp_oct;
541 uint32_t temp32;
542 int length = tvb_reported_length(tvb);
544 subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_ext2_qos_subscribed);
546 /* Ocet 14 */
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);
551 tmp_oct = oct & 7;
552 if (tmp_oct == 0x01)
553 str = "speech";
554 else
555 str = "unknown";
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);
560 offset += 1;
561 if (length == offset) {
562 return;
565 /* Octet 15 */
566 oct = tvb_get_uint8(tvb, offset);
568 if (oct == 0x00)
569 str = "Use the value indicated by the Maximum bit rate for downlink";
570 else
572 temp32 = qos_calc_ext_bitrate(oct);
573 if (temp32 % 1000 == 0)
574 str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32 / 1000);
575 else
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);
581 offset += 1;
582 if (length == offset) {
583 return;
586 /* Octet 16 */
587 oct = tvb_get_uint8(tvb, offset);
589 if (oct == 0x00)
590 str = "Use the value indicated by the Guaranteed bit rate for downlink";
591 else
593 temp32 = qos_calc_ext_bitrate(oct);
594 if (temp32 % 1000 == 0)
595 str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32 / 1000);
596 else
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.
609 static void
610 dissect_gsm_map_ext3_qos_subscribed(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx) {
612 int offset = 0;
613 proto_tree *subtree;
614 const char *str;
615 uint8_t oct;
616 uint32_t temp32;
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);
624 if (oct == 0x00)
625 str = "Use the value indicated by the Maximum bit rate for uplink";
626 else
628 temp32 = qos_calc_ext_bitrate(oct);
629 if (temp32 % 1000 == 0)
630 str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32 / 1000);
631 else
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);
637 offset += 1;
638 if (length == offset) {
639 return;
642 /* Guaranteed bit rate for uplink (extended) Octet 18 */
643 oct = tvb_get_uint8(tvb, offset);
645 if (oct == 0x00)
646 str = "Use the value indicated by the Guaranteed bit rate for uplink";
647 else
649 temp32 = qos_calc_ext_bitrate(oct);
650 if (temp32 % 1000 == 0)
651 str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32 / 1000);
652 else
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);
658 return;
661 static void
662 dissect_gsm_map_ext4_qos_subscribed(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx) {
663 int offset = 0;
664 proto_tree *subtree;
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
676 #define POLYGON 5
677 #define ELLIPSOID_POINT_WITH_ALT 8
678 #define ELLIPSOID_POINT_WITH_ALT_AND_UNCERT_ELLIPSOID 9
679 #define ELLIPSOID_ARC 10
681 4 3 2 1
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
685 0 1 0 1 Polygon
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 */
693 #if 0
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"},
702 { 0, NULL }
705 /* 3GPP TS 23.032 7.3.1 */
706 static const value_string sign_of_latitude_vals[] = {
707 { 0, "North"},
708 { 1, "South"},
709 { 0, NULL }
712 static const value_string dir_of_alt_vals[] = {
713 { 0, "Altitude expresses height"},
714 { 1, "Altitude expresses depth"},
715 { 0, NULL }
717 #endif
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" },
728 { 8, "Reserved" },
729 { 9, "Message with User Data Header (UDH) structure" },
730 { 10,"Reserved" },
731 { 11,"Reserved" },
732 { 12,"Reserved" },
733 { 13,"Reserved" },
734 { 14,"Defined by the WAP Forum" },
735 { 15,"Data coding / message handling" },
736 { 0, NULL}
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);
740 /* Coding group 0
741 * Bits 3..0 indicate the language:
743 static const value_string gsm_map_cbs_coding_grp0_lang_vals[] = {
744 { 0, "German"},
745 { 1, "English"},
746 { 2, "Italian"},
747 { 3, "French"},
748 { 4, "Spanish"},
749 { 5, "Dutch"},
750 { 6, "Swedish"},
751 { 7, "Danish"},
752 { 8, "Portuguese"},
753 { 9, "Finnish"},
754 { 10, "Norwegian"},
755 { 11, "Greek"},
756 { 12, "Turkish"},
757 { 13, "Hungarian"},
758 { 14, "Polish"},
759 { 15, "Language unspecified"},
760 { 0, NULL }
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"},
767 { 2, "Reserved"},
768 { 3, "Reserved"},
769 { 4, "Reserved"},
770 { 5, "Reserved"},
771 { 6, "Reserved"},
772 { 7, "Reserved"},
773 { 8, "Reserved"},
774 { 9, "Reserved"},
775 { 10, "Reserved"},
776 { 11, "Reserved"},
777 { 12, "Reserved"},
778 { 13, "Reserved"},
779 { 14, "Reserved"},
780 { 15, "Reserved"},
781 { 0, NULL }
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[] = {
786 { 0, "Czech"},
787 { 1, "Hebrew"},
788 { 2, "Arabic"},
789 { 3, "Russian"},
790 { 4, "Icelandic"},
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"},
802 { 0, NULL }
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"},
823 { 0, NULL }
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"},
841 { 1, "8 bit data"},
842 { 2, "UCS2 (16 bit)"},
843 { 3, "Reserved"},
844 { 0, NULL }
847 static const value_string gsm_map_cbs_coding_grp4_7_class_vals[] = {
848 { 0, "Class 0"},
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"},
852 { 0, NULL }
855 static const value_string gsm_map_cbs_coding_grp15_mess_code_vals[] = {
856 { 0, "GSM 7 bit default alphabet"},
857 { 1, "8 bit data"},
858 { 0, NULL }
861 static const value_string gsm_map_cbs_coding_grp15_class_vals[] = {
862 { 0, "GSM 7 bit default alphabet"},
863 { 1, "8 bit data"},
864 { 0, NULL }
868 /* 3GPP TS 23.038 version 7.0.0 Release 7 */
869 uint8_t
870 dissect_cbs_data_coding_scheme(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, uint16_t offset)
872 uint8_t octet;
873 uint8_t coding_grp;
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;
881 switch (coding_grp){
882 case 0:
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;
885 break;
886 case 1:
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;
890 }else{
891 sms_encoding = SMS_ENCODING_UCS2_LANG;
893 break;
894 case 2:
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;
897 break;
898 case 3:
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;
901 break;
902 /* Coding_grp 01xx */
903 case 4:
904 /* FALLTHRU */
905 case 5:
906 /* FALLTHRU */
907 case 6:
908 /* FALLTHRU */
909 case 7:
910 /* FALLTHRU */
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){
920 case 0:
921 /* GSM 7 bit default alphabet */
922 sms_encoding = SMS_ENCODING_7BIT;
923 break;
924 case 1:
925 /* 8 bit data */
926 sms_encoding = SMS_ENCODING_8BIT;
927 break;
928 case 2:
929 /* UCS2 (16 bit) */
930 sms_encoding = SMS_ENCODING_UCS2;
931 break;
932 case 3:
933 /* Reserved */
934 sms_encoding = SMS_ENCODING_NOT_SET;
935 break;
936 default:
937 break;
939 break;
940 case 8:
941 /* Reserved coding groups */
942 break;
943 case 9:
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){
949 case 0:
950 /* GSM 7 bit default alphabet */
951 sms_encoding = SMS_ENCODING_7BIT;
952 break;
953 case 1:
954 /* 8 bit data */
955 sms_encoding = SMS_ENCODING_8BIT;
956 break;
957 case 2:
958 /* UCS2 (16 bit) */
959 sms_encoding = SMS_ENCODING_UCS2;
960 break;
961 case 3:
962 /* Reserved */
963 sms_encoding = SMS_ENCODING_NOT_SET;
964 break;
965 default:
966 break;
968 break;
969 case 10:
970 /* FALLTHRU */
971 case 11:
972 /* FALLTHRU */
973 case 12:
974 /* FALLTHRU */
975 case 13:
976 /* FALLTHRU */
977 /* 1010..1101 Reserved coding groups */
978 break;
979 case 14:
980 /* Defined by the WAP Forum
981 * "Wireless Datagram Protocol Specification", Wireless Application Protocol Forum Ltd.
983 break;
984 case 15:
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;
991 }else{
992 sms_encoding = SMS_ENCODING_8BIT;
994 break;
995 default:
996 break;
999 return sms_encoding;
1001 void
1002 dissect_gsm_map_msisdn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1004 uint8_t octet;
1005 uint8_t na;
1006 uint8_t np;
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)
1013 return;
1015 octet = tvb_get_uint8(tvb,0);
1016 /* nature of address indicator */
1017 na = (octet & 0x70)>>4;
1018 /* numbering plan indicator */
1019 np = octet & 0x0f;
1020 switch(np){
1021 case 1:
1022 /* ISDN/Telephony Numbering Plan (Rec ITU-T E.164) */
1023 switch(na){
1024 case 1:
1025 /* international number */
1026 dissect_e164_msisdn(tvb, tree, 1, tvb_reported_length(tvb)-1, E164_ENC_BCD);
1027 break;
1028 default:
1029 proto_tree_add_item(tree, hf_gsm_map_address_digits, tvb, 1, -1, ENC_BCD_DIGITS_0_9|ENC_LITTLE_ENDIAN);
1030 break;
1032 break;
1033 case 6:
1034 /* land mobile numbering plan (ITU-T Rec E.212) */
1035 dissect_e212_imsi(tvb, pinfo, tree, 1, tvb_reported_length(tvb)-1, false);
1036 break;
1037 default:
1038 proto_tree_add_item(tree, hf_gsm_map_address_digits, tvb, 1, -1, ENC_BCD_DIGITS_0_9|ENC_LITTLE_ENDIAN);
1039 break;
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" },
1051 { 0, NULL }
1053 /* Generic translation for MAP operation */
1054 const value_string gsm_map_opr_code_strings[] = {
1055 #include "packet-gsm_map-table.c"
1056 { 0, NULL }
1059 #if 0
1060 static const value_string gsm_map_err_code_string_vals[] = {
1061 #include "packet-gsm_map-table.c"
1062 { 0, NULL }
1064 #endif
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" },
1076 { 0, NULL }
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)" },
1083 { 0x02, "spare" },
1084 { 0x03, "Data Numbering (ITU-T Rec. X.121)" },
1085 { 0x04, "Telex Numbering (ITU-T Rec. F.69)" },
1086 { 0x05, "spare" },
1087 { 0x06, "Land Mobile Numbering (ITU-T Rec. E.212)" },
1088 { 0x07, "spare" },
1089 { 0x08, "National Numbering" },
1090 { 0x09, "Private Numbering" },
1091 { 0x0a, "spare" },
1092 { 0x0b, "spare" },
1093 { 0x0c, "spare" },
1094 { 0x0d, "spare" },
1095 { 0x0e, "spare" },
1096 { 0x0f, "Reserved for extension" },
1097 { 0, NULL }
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 = {
1102 "Quiescent",
1103 "Operative"
1105 static const true_false_string gsm_map_Ss_Status_a_values = {
1106 "Active",
1107 "not Active"
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) {
1115 switch (val) {
1116 case 44: /*mt-forwardSM*/
1117 /* FALLTHRU */
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 */
1124 /* FALLTHRU */
1125 default:
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,
1132 tvbuff_t *,
1133 int ,
1134 asn1_ctx_t *,
1135 proto_tree *,
1136 int);
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,
1157 int offset,
1158 asn1_ctx_t *actx,
1159 proto_tree *tree,
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_ )
1164 uint8_t octet;
1165 int8_t bug_class;
1166 bool bug_pc, bug_ind_field;
1167 int32_t bug_tag;
1168 uint32_t bug_len;
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);
1179 } else {
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);
1185 } else {
1186 proto_tree_add_expert(tree, actx->pinfo, &ei_gsm_map_unknown_sequence, tvb, offset, -1);
1188 } else {
1189 if (parameter != NULL) {
1190 offset= (parameter) (implicit_param, tvb, offset, actx, tree, hf_index_param);
1191 } else {
1192 proto_tree_add_expert(tree, actx->pinfo, &ei_gsm_map_unknown_parameter, tvb, offset, -1);
1195 return offset;
1198 static int dissect_invokeData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx) {
1200 switch(opcode){
1201 case 2: /*updateLocation*/
1202 offset=dissect_gsm_map_ms_UpdateLocationArg(false, tvb, offset, actx, tree, -1);
1203 break;
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*/
1209 break;
1210 case 4: /*provideRoamingNumber*/
1211 offset=dissect_gsm_map_ch_ProvideRoamingNumberArg(false, tvb, offset, actx, tree, -1);
1212 break;
1213 case 5: /*noteSubscriberDataModified*/
1214 offset=dissect_gsm_map_ms_NoteSubscriberDataModifiedArg(false, tvb, offset, actx, tree, -1);
1215 break;
1216 case 6: /*resumeCallHandling*/
1217 offset=dissect_gsm_map_ch_ResumeCallHandlingArg(false, tvb, offset, actx, tree, -1);
1218 break;
1219 case 7: /*insertSubscriberData*/
1220 offset=dissect_gsm_map_ms_InsertSubscriberDataArg(false, tvb, offset, actx, tree, -1);
1221 break;
1222 case 8: /*deleteSubscriberData*/
1223 offset=dissect_gsm_map_ms_DeleteSubscriberDataArg(false, tvb, offset, actx, tree, -1);
1224 break;
1225 case 9: /*sendParameters*/
1226 offset = dissect_gsm_old_SendParametersArg(false, tvb, offset, actx, tree, -1);
1227 break;
1228 case 10: /*registerSS*/
1229 offset=dissect_gsm_map_ss_RegisterSS_Arg(false, tvb, offset, actx, tree, -1);
1230 break;
1231 case 11: /*eraseSS*/
1232 offset=dissect_gsm_map_ss_SS_ForBS_Code(false, tvb, offset, actx, tree, -1);
1233 break;
1234 case 12: /*activateSS*/
1235 offset=dissect_gsm_map_ss_SS_ForBS_Code(false, tvb, offset, actx, tree, -1);
1236 break;
1237 case 13: /*deactivateSS*/
1238 offset=dissect_gsm_map_ss_SS_ForBS_Code(false, tvb, offset, actx, tree, -1);
1239 break;
1240 case 14: /*interrogateSS*/
1241 offset=dissect_gsm_map_ss_SS_ForBS_Code(false, tvb, offset, actx, tree, -1);
1242 break;
1243 case 15: /*authenticationFailureReport*/
1244 offset=dissect_gsm_map_ms_AuthenticationFailureReportArg(false, tvb, offset, actx, tree, -1);
1245 break;
1246 case 16: /*SS-protocol notifySS*/
1247 offset=dissect_gsm_ss_NotifySS_Arg(false, tvb, offset, actx, tree, -1);
1248 break;
1249 case 17: /*registerPassword*/
1250 offset=dissect_gsm_map_SS_Code(false, tvb, offset, actx, tree, hf_gsm_map_ss_Code);
1251 break;
1252 case 18: /*getPassword*/
1253 offset=dissect_gsm_old_GetPasswordArg(false, tvb, offset, actx, tree, hf_gsm_map_getPassword);
1254 break;
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);
1257 break;
1258 case 20: /*releaseResources*/
1259 offset=dissect_gsm_map_ch_ReleaseResourcesArg(false, tvb, offset, actx, tree, -1);
1260 break;
1261 case 21: /*mt-ForwardSM-VGCS*/
1262 offset=dissect_gsm_map_sm_MT_ForwardSM_VGCS_Arg(false, tvb, offset, actx, tree, -1);
1263 break;
1264 case 22: /*sendRoutingInfo*/
1265 if (application_context_version == 3){
1266 offset=dissect_gsm_map_ch_SendRoutingInfoArg(false, tvb, offset, actx, tree, -1);
1267 }else{
1268 offset = dissect_gsm_old_SendRoutingInfoArgV2(false, tvb, offset, actx, tree, -1);
1270 break;
1271 case 23: /*updateGprsLocation*/
1272 offset=dissect_gsm_map_ms_UpdateGprsLocationArg(false, tvb, offset, actx, tree, -1);
1273 break;
1274 case 24: /*sendRoutingInfoForGprs*/
1275 offset=dissect_gsm_map_ms_SendRoutingInfoForGprsArg(false, tvb, offset, actx, tree, -1);
1276 break;
1277 case 25: /*failureReport*/
1278 offset=dissect_gsm_map_ms_FailureReportArg(false, tvb, offset, actx, tree, -1);
1279 break;
1280 case 26: /*noteMsPresentForGprs*/
1281 offset=dissect_gsm_map_ms_NoteMsPresentForGprsArg(false, tvb, offset, actx, tree, -1);
1282 break;
1283 /* undefined 27 */
1284 /* reserved performHandover (28) */
1285 case 29: /*sendEndSignal*/
1286 offset=dissect_mc_message(tvb, offset, actx, tree,
1287 false, NULL, -1,
1288 false, dissect_gsm_old_Bss_APDU, -1,
1289 true , dissect_gsm_map_ms_SendEndSignal_Arg, -1);
1290 break;
1291 /* reserved performSubsequentHandover (30) */
1292 case 31: /*provideSIWFSNumber*/
1293 offset=dissect_gsm_old_ProvideSIWFSNumberArg(false, tvb, offset, actx, tree, -1);
1294 break;
1295 case 32: /*sIWFSSignallingModify*/
1296 offset=dissect_gsm_old_SIWFSSignallingModifyArg(false, tvb, offset, actx, tree, -1);
1297 break;
1298 case 33: /*processAccessSignalling*/
1299 offset=dissect_mc_message(tvb, offset, actx, tree,
1300 false, NULL, -1,
1301 false, dissect_gsm_old_Bss_APDU, -1,
1302 true , dissect_gsm_map_ms_ProcessAccessSignalling_Arg, -1);
1303 break;
1304 case 34: /*forwardAccessSignalling*/
1305 offset=dissect_mc_message(tvb, offset, actx, tree,
1306 false, NULL, -1,
1307 false, dissect_gsm_old_Bss_APDU, -1,
1308 true , dissect_gsm_map_ms_ForwardAccessSignalling_Arg, -1);
1309 break;
1310 /* reserved noteInternalHandover (35) */
1311 case 36: /*cancelVcsgLocation*/
1312 offset=dissect_gsm_map_ms_CancelVcsgLocationArg(false, tvb, offset, actx, tree, -1);
1313 break;
1314 case 37: /*reset*/
1315 if (application_context_version == 1) {
1316 offset = dissect_gsm_old_ResetArgV1(false, tvb, offset, actx, tree, -1);
1317 } else {
1318 offset = dissect_gsm_map_ms_ResetArg(false, tvb, offset, actx, tree, -1);
1320 break;
1321 case 38: /*forwardCheckSS-Indication*/
1322 return offset;
1323 case 39: /*prepareGroupCall*/
1324 offset=dissect_gsm_map_gr_PrepareGroupCallArg(false, tvb, offset, actx, tree, -1);
1325 break;
1326 case 40: /*sendGroupCallEndSignal*/
1327 offset = dissect_gsm_map_gr_SendGroupCallEndSignalArg(false, tvb, offset, actx, tree, -1);
1328 break;
1329 case 41: /*processGroupCallSignalling*/
1330 offset = dissect_gsm_map_gr_ProcessGroupCallSignallingArg(false, tvb, offset, actx, tree, -1);
1331 break;
1332 case 42: /*forwardGroupCallSignalling*/
1333 offset=dissect_gsm_map_gr_ForwardGroupCallSignallingArg(false, tvb, offset, actx, tree, -1);
1334 break;
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 */
1341 } else {
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 */
1347 break;
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);
1351 else {
1352 offset=dissect_gsm_old_ForwardSM_Arg(false, tvb, offset, actx, tree, -1);
1354 break;
1355 case 45: /*sendRoutingInfoForSM*/
1356 if (application_context_version < 2) {
1357 offset=dissect_gsm_old_RoutingInfoForSM_ArgV1(false, tvb, offset, actx, tree, -1);
1358 } else {
1359 offset=dissect_gsm_map_sm_RoutingInfoForSM_Arg(false, tvb, offset, actx, tree, -1);
1361 break;
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);
1365 else {
1366 offset=dissect_gsm_old_ForwardSM_Arg(false, tvb, offset, actx, tree, -1);
1368 break;
1369 case 47: /*reportSM-DeliveryStatus*/
1370 offset=dissect_gsm_map_sm_ReportSM_DeliveryStatusArg(false, tvb, offset, actx, tree, -1);
1371 break;
1372 case 48: /*noteSubscriberPresent*/
1373 offset = dissect_gsm_map_IMSI(false, tvb, offset, actx, tree, hf_gsm_map_imsi);
1374 break;
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
1380 case 49:
1381 offset = dissect_gsm_map_sm_AlertServiceCentreArg(false, tvb, offset, actx, tree, -1);
1382 break;
1383 case 50: /*activateTraceMode*/
1384 offset=dissect_gsm_map_om_ActivateTraceModeArg(false, tvb, offset, actx, tree, -1);
1385 break;
1386 case 51: /*deactivateTraceMode*/
1387 offset=dissect_gsm_map_om_DeactivateTraceModeArg(false, tvb, offset, actx, tree, -1);
1388 break;
1389 /* reserved traceSubscriberActivity (52) */
1391 case 53: /* UpdateVcsgLocation 53 */
1392 offset=dissect_gsm_map_ms_UpdateVcsgLocationArg(false, tvb, offset, actx, tree, -1);
1393 break;
1394 case 54: /*beginSubscriberActivity*/
1395 offset=dissect_gsm_old_BeginSubscriberActivityArg(false, tvb, offset, actx, tree, -1);
1396 break;
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,
1401 true, NULL, -1);
1402 break;
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,
1407 true, NULL, -1);
1408 break;
1409 case 57: /*restoreData*/
1410 offset=dissect_gsm_map_ms_RestoreDataArg(false, tvb, offset, actx, tree, -1);
1411 break;
1412 case 58: /*sendIMSI*/
1413 offset = dissect_gsm_map_ISDN_AddressString(false, tvb, offset, actx, tree, hf_gsm_map_msisdn);
1414 break;
1415 case 59: /*processUnstructuredSS-Request*/
1416 offset=dissect_gsm_map_ss_USSD_Arg(false, tvb, offset, actx, tree, -1);
1417 break;
1418 case 60: /*unstructuredSS-Request*/
1419 offset=dissect_gsm_map_ss_USSD_Arg(false, tvb, offset, actx, tree, -1);
1420 break;
1421 case 61: /*unstructuredSS-Notify*/
1422 offset=dissect_gsm_map_ss_USSD_Arg(false, tvb, offset, actx, tree, -1);
1423 break;
1424 case 62: /*AnyTimeSubscriptionInterrogation*/
1425 offset=dissect_gsm_map_ms_AnyTimeSubscriptionInterrogationArg(false, tvb, offset, actx, tree, -1);
1426 break;
1427 case 63: /*informServiceCentre*/
1428 offset=dissect_gsm_map_sm_InformServiceCentreArg(false, tvb, offset, actx, tree, -1);
1429 break;
1430 case 64: /*alertServiceCentre*/
1431 offset=dissect_gsm_map_sm_AlertServiceCentreArg(false, tvb, offset, actx, tree, -1);
1432 break;
1433 case 65: /*AnyTimeModification*/
1434 offset=dissect_gsm_map_ms_AnyTimeModificationArg(false, tvb, offset, actx, tree, -1);
1435 break;
1436 case 66: /*readyForSM*/
1437 offset=dissect_gsm_map_sm_ReadyForSM_Arg(false, tvb, offset, actx, tree, -1);
1438 break;
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);
1444 break;
1445 case 68: /*prepareHandover*/
1446 offset=dissect_mc_message(tvb, offset, actx, tree,
1447 false, NULL, -1,
1448 false, dissect_gsm_old_PrepareHO_ArgOld, -1,
1449 true, dissect_gsm_map_ms_PrepareHO_Arg, -1);
1450 break;
1451 case 69: /*prepareSubsequentHandover*/
1452 offset=dissect_mc_message(tvb, offset, actx, tree,
1453 false, NULL, -1,
1454 false, NULL, -1,
1455 true, dissect_gsm_map_ms_PrepareSubsequentHO_Arg, -1);
1456 break;
1457 case 70: /*provideSubscriberInfo*/
1458 offset=dissect_gsm_map_ms_ProvideSubscriberInfoArg(false, tvb, offset, actx, tree, -1);
1459 break;
1460 case 71: /*anyTimeInterrogation*/
1461 offset=dissect_gsm_map_ms_AnyTimeInterrogationArg(false, tvb, offset, actx, tree, -1);
1462 break;
1463 case 72: /*ss-InvocationNotification*/
1464 offset=dissect_gsm_map_ss_SS_InvocationNotificationArg(false, tvb, offset, actx, tree, -1);
1465 break;
1466 case 73: /*setReportingState*/
1467 offset=dissect_gsm_map_ch_SetReportingStateArg(false, tvb, offset, actx, tree, -1);
1468 break;
1469 case 74: /*statusReport*/
1470 offset=dissect_gsm_map_ch_StatusReportArg(false, tvb, offset, actx, tree, -1);
1471 break;
1472 case 75: /*remoteUserFree*/
1473 offset=dissect_gsm_map_ch_RemoteUserFreeArg(false, tvb, offset, actx, tree, -1);
1474 break;
1475 case 76: /*registerCC-Entry*/
1476 offset=dissect_gsm_map_ss_RegisterCC_EntryArg(false, tvb, offset, actx, tree, -1);
1477 break;
1478 case 77: /*eraseCC-Entry*/
1479 offset=dissect_gsm_map_ss_EraseCC_EntryArg(false, tvb, offset, actx, tree, -1);
1480 break;
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);
1486 break;
1487 /* undefined 82 */
1488 case 83: /*provideSubscriberLocation*/
1489 offset=dissect_gsm_map_lcs_ProvideSubscriberLocation_Arg(false, tvb, offset, actx, tree, -1);
1490 break;
1491 case 84: /*sendGroupCallInfo*/
1492 offset=dissect_gsm_map_gr_SendGroupCallInfoArg(false, tvb, offset, actx, tree, -1);
1493 break;
1494 case 85: /*sendRoutingInfoForLCS*/
1495 offset=dissect_gsm_map_lcs_RoutingInfoForLCS_Arg(false, tvb, offset, actx, tree, -1);
1496 break;
1497 case 86: /*subscriberLocationReport*/
1498 offset=dissect_gsm_map_lcs_SubscriberLocationReport_Arg(false, tvb, offset, actx, tree, -1);
1499 break;
1500 case 87: /*ist-Alert*/
1501 offset=dissect_gsm_map_ch_IST_AlertArg(false, tvb, offset, actx, tree, -1);
1502 break;
1503 case 88: /*ist-Command*/
1504 offset=dissect_gsm_map_ch_IST_CommandArg(false, tvb, offset, actx, tree, -1);
1505 break;
1506 case 89: /*noteMM-Event*/
1507 offset=dissect_gsm_map_ms_NoteMM_EventArg(false, tvb, offset, actx, tree, -1);
1508 break;
1509 case 108: /*SS-protocol lcs-PeriodicTriggeredInvoke*/
1510 offset = dissect_gsm_ss_LCS_PeriodicTriggeredInvokeArg(false, tvb, offset, actx, tree, -1);
1511 break;
1512 case 109: /*SS-protocol lcs-PeriodicLocationCancellation*/
1513 offset=dissect_gsm_ss_LCS_PeriodicLocationCancellationArg(false, tvb, offset, actx, tree, -1);
1514 break;
1515 case 110: /*SS-protocol lcs-LocationUpdate*/
1516 offset=dissect_gsm_ss_LCS_LocationUpdateArg(false, tvb, offset, actx, tree, -1);
1517 break;
1518 case 111: /*SS-protocol lcs-PeriodicLocationRequest*/
1519 offset=dissect_gsm_ss_LCS_PeriodicLocationRequestArg(false, tvb, offset, actx, tree, -1);
1520 break;
1521 case 112: /*SS-protocol lcs-AreaEventCancellation*/
1522 offset=dissect_gsm_ss_LCS_AreaEventCancellationArg(false, tvb, offset, actx, tree, -1);
1523 break;
1524 case 113: /*SS-protocol lcs-AreaEventReport*/
1525 offset=dissect_gsm_ss_LCS_AreaEventReportArg(false, tvb, offset, actx, tree, -1);
1526 break;
1527 case 114: /*SS-protocol lcs-AreaEventRequest*/
1528 offset=dissect_gsm_ss_LCS_AreaEventRequestArg(false, tvb, offset, actx, tree, -1);
1529 break;
1530 case 115: /*SS-protocol lcs-MOLR*/
1531 offset=dissect_gsm_ss_LCS_MOLRArg(false, tvb, offset, actx, tree, -1);
1532 break;
1533 case 116: /*SS-protocol lcs-LocationNotification*/
1534 offset=dissect_gsm_ss_LocationNotificationArg(false, tvb, offset, actx, tree, -1);
1535 break;
1536 case 117: /*SS-protocol callDeflection*/
1537 offset=dissect_gsm_ss_CallDeflectionArg(false, tvb, offset, actx, tree, -1);
1538 break;
1539 case 118: /*SS-protocol userUserService*/
1540 offset=dissect_gsm_ss_UserUserServiceArg(false, tvb, offset, actx, tree, -1);
1541 break;
1542 case 119: /*SS-protocol accessRegisterCCEntry*/
1543 offset=dissect_gsm_ss_AccessRegisterCCEntryArg(false, tvb, offset, actx, tree, -1);
1544 break;
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);
1548 break;
1549 case 121: /*SS-protocol splitMPTY no Argument*/
1550 break;
1551 case 122: /*SS-protocol retrieveMPTY no Argument*/
1552 break;
1553 case 123: /*SS-protocol holdMPTY no Argument*/
1554 break;
1555 case 124: /*SS-protocol buildMPTY no Argument*/
1556 break;
1557 case 125: /*SS-protocol forwardChargeAdvice*/
1558 offset=dissect_gsm_ss_ForwardChargeAdviceArg(false, tvb, offset, actx, tree, -1);
1559 break;
1560 case 126: /*SS-protocol explicitCT no Argument*/
1561 break;
1562 default:
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);
1568 break;
1570 return offset;
1574 static int dissect_returnResultData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx) {
1576 switch(opcode){
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,
1581 true , NULL, -1);
1582 break;
1583 case 3: /*cancelLocation*/
1584 offset=dissect_gsm_map_ms_CancelLocationRes(false, tvb, offset, actx, tree, -1);
1585 break;
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*/
1591 break;
1592 case 5: /*noteSubscriberDataModified*/
1593 offset=dissect_gsm_map_ms_NoteSubscriberDataModifiedRes(false, tvb, offset, actx, tree, -1);
1594 break;
1595 case 6: /*resumeCallHandling*/
1596 offset=dissect_gsm_map_ch_ResumeCallHandlingRes(false, tvb, offset, actx, tree, -1);
1597 break;
1598 case 7: /*insertSubscriberData*/
1599 offset=dissect_gsm_map_ms_InsertSubscriberDataRes(false, tvb, offset, actx, tree, -1);
1600 break;
1601 case 8: /*deleteSubscriberData*/
1602 offset=dissect_gsm_map_ms_DeleteSubscriberDataRes(false, tvb, offset, actx, tree, -1);
1603 break;
1604 case 9: /*sendParameters*/
1605 offset = dissect_gsm_old_SentParameterList(false, tvb, offset, actx, tree, -1);
1606 break;
1607 case 10: /*registerSS*/
1608 offset=dissect_gsm_map_ss_SS_Info(false, tvb, offset, actx, tree, -1);
1609 break;
1610 case 11: /*eraseSS*/
1611 offset=dissect_gsm_map_ss_SS_Info(false, tvb, offset, actx, tree, -1);
1612 break;
1613 case 12: /*activateSS*/
1614 offset=dissect_gsm_map_ss_SS_Info(false, tvb, offset, actx, tree, -1);
1615 break;
1616 case 13: /*deactivateSS*/
1617 offset=dissect_gsm_map_ss_SS_Info(false, tvb, offset, actx, tree, -1);
1618 break;
1619 case 14: /*interrogateSS*/
1620 offset=dissect_gsm_map_ss_InterrogateSS_Res(false, tvb, offset, actx, tree, -1);
1621 break;
1622 case 15: /*authenticationFailureReport*/
1623 offset=dissect_gsm_map_ms_AuthenticationFailureReportRes(false, tvb, offset, actx, tree, -1);
1624 break;
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);
1628 break;
1629 case 18: /*getPassword*/
1630 offset=dissect_gsm_old_CurrentPassword(false, tvb, offset, actx, tree, hf_gsm_map_currentPassword);
1631 break;
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);
1634 break;
1635 case 20: /*releaseResources*/
1636 offset=dissect_gsm_map_ch_ReleaseResourcesRes(false, tvb, offset, actx, tree, -1);
1637 break;
1638 case 21: /*mt-ForwardSM-VGCS*/
1639 offset=dissect_gsm_map_sm_MT_ForwardSM_VGCS_Res(false, tvb, offset, actx, tree, -1);
1640 break;
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,
1645 false, NULL, -1,
1646 false, dissect_gsm_map_ch_SendRoutingInfoRes_U, -1,
1647 true , dissect_gsm_map_ch_SendRoutingInfoRes, -1);
1648 }else{
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);
1654 break;
1655 case 23: /*updateGprsLocation*/
1656 offset=dissect_gsm_map_ms_UpdateGprsLocationRes(false, tvb, offset, actx, tree, -1);
1657 break;
1658 case 24: /*sendRoutingInfoForGprs*/
1659 offset=dissect_gsm_map_ms_SendRoutingInfoForGprsRes(false, tvb, offset, actx, tree, -1);
1660 break;
1661 case 25: /*failureReport*/
1662 offset=dissect_gsm_map_ms_FailureReportRes(false, tvb, offset, actx, tree, -1);
1663 break;
1664 case 26: /*noteMsPresentForGprs*/
1665 offset=dissect_gsm_map_ms_NoteMsPresentForGprsRes(false, tvb, offset, actx, tree, -1);
1666 break;
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);
1672 break;
1673 case 31: /*provideSIWFSNumber*/
1674 offset=dissect_gsm_old_ProvideSIWFSNumberRes(false, tvb, offset, actx, tree, -1);
1675 break;
1676 case 32: /*provideSIWFSSignallingModify*/
1677 offset=dissect_gsm_old_SIWFSSignallingModifyRes(false, tvb, offset, actx, tree, -1);
1678 break;
1679 case 36: /*cancelVcsgLocation*/
1680 offset=dissect_gsm_map_ms_CancelVcsgLocationRes(false, tvb, offset, actx, tree, -1);
1681 break;
1682 case 39: /*prepareGroupCall*/
1683 offset=dissect_gsm_map_gr_PrepareGroupCallRes(false, tvb, offset, actx, tree, -1);
1684 break;
1685 case 40: /*sendGroupCallEndSignal*/
1686 offset=dissect_gsm_map_gr_SendGroupCallEndSignalRes(false, tvb, offset, actx, tree, -1);
1687 break;
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,
1692 true, NULL, -1);
1693 break;
1694 case 44: /*mt-forwardSM*/
1695 offset=dissect_gsm_map_sm_MT_ForwardSM_Res(false, tvb, offset, actx, tree, -1);
1696 break;
1697 case 45: /*sendRoutingInfoForSM*/
1698 if (application_context_version < 3) {
1699 offset=dissect_gsm_old_RoutingInfoForSM_ResV2(false, tvb, offset, actx, tree, -1);
1700 } else {
1701 offset=dissect_gsm_map_sm_RoutingInfoForSM_Res(false, tvb, offset, actx, tree, -1);
1703 break;
1704 case 46: /*mo-forwardSM*/
1705 offset=dissect_gsm_map_sm_MO_ForwardSM_Res(false, tvb, offset, actx, tree, -1);
1706 break;
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*/
1712 break;
1713 case 48: /*noteSubscriberPresent*/
1714 break;
1715 case 50: /*activateTraceMode*/
1716 offset=dissect_gsm_map_om_ActivateTraceModeRes(false, tvb, offset, actx, tree, -1);
1717 break;
1718 case 51: /*deactivateTraceMode*/
1719 offset=dissect_gsm_map_om_DeactivateTraceModeRes(false, tvb, offset, actx, tree, -1);
1720 break;
1721 case 53: /* UpdateVcsgLocation 53 */
1722 offset=dissect_gsm_map_ms_UpdateVcsgLocationRes(false, tvb, offset, actx, tree, -1);
1723 break;
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);
1729 break;
1730 case 56: /*sendAuthenticationInfo*/
1731 offset=dissect_mc_message(tvb, offset, actx, tree,
1732 false, NULL, -1,
1733 false, dissect_gsm_old_SendAuthenticationInfoResOld, -1,
1734 true , dissect_gsm_map_ms_SendAuthenticationInfoRes, -1);
1735 break;
1736 case 57: /*restoreData*/
1737 offset=dissect_gsm_map_ms_RestoreDataRes(false, tvb, offset, actx, tree, -1);
1738 break;
1739 case 58: /*sendIMSI*/
1740 offset=dissect_gsm_map_IMSI(false, tvb, offset, actx, tree, hf_gsm_map_ms_imsi);
1741 break;
1742 case 59: /*unstructuredSS-Request*/
1743 offset=dissect_gsm_map_ss_USSD_Res(false, tvb, offset, actx, tree, -1);
1744 break;
1745 case 60: /*unstructuredSS-Request*/
1746 offset=dissect_gsm_map_ss_USSD_Res(false, tvb, offset, actx, tree, -1);
1747 break;
1748 case 61: /*unstructuredSS-Notify*/
1749 /* true ? */
1750 proto_tree_add_expert_format(tree, actx->pinfo, &ei_gsm_map_unknown_invokeData, tvb, offset, -1, "Unknown returnResultData blob");
1751 break;
1752 case 62: /*AnyTimeSubscriptionInterrogation*/
1753 offset=dissect_gsm_map_ms_AnyTimeSubscriptionInterrogationRes(false, tvb, offset, actx, tree, -1);
1754 break;
1755 case 64: /*alertServiceCentre*/
1756 /* true */
1757 break;
1758 case 65: /*AnyTimeModification*/
1759 offset=dissect_gsm_map_ms_AnyTimeModificationRes(false, tvb, offset, actx, tree, -1);
1760 break;
1761 case 66: /*readyForSM*/
1762 offset=dissect_gsm_map_sm_ReadyForSM_Res(false, tvb, offset, actx, tree, -1);
1763 break;
1764 case 67: /*purgeMS*/
1765 offset=dissect_gsm_map_ms_PurgeMS_Res(false, tvb, offset, actx, tree, -1);
1766 break;
1767 case 68: /*prepareHandover*/
1768 offset=dissect_mc_message(tvb, offset, actx, tree,
1769 false, NULL, -1,
1770 false, dissect_gsm_old_PrepareHO_ResOld, -1,
1771 true , dissect_gsm_map_ms_PrepareHO_Res, -1);
1772 break;
1773 case 69: /*prepareSubsequentHandover*/
1774 offset=dissect_mc_message(tvb, offset, actx, tree,
1775 false, NULL, -1,
1776 false, NULL, -1,
1777 true , dissect_gsm_map_ms_PrepareSubsequentHO_Res, -1);
1778 break;
1779 case 70: /*provideSubscriberInfo*/
1780 offset=dissect_gsm_map_ms_ProvideSubscriberInfoRes(false, tvb, offset, actx, tree, -1);
1781 break;
1782 case 71: /*anyTimeInterrogation*/
1783 offset=dissect_gsm_map_ms_AnyTimeInterrogationRes(false, tvb, offset, actx, tree, -1);
1784 break;
1785 case 72: /*ss-InvocationNotification*/
1786 offset=dissect_gsm_map_ss_SS_InvocationNotificationRes(false, tvb, offset, actx, tree, -1);
1787 break;
1788 case 73: /*setReportingState*/
1789 offset=dissect_gsm_map_ch_SetReportingStateRes(false, tvb, offset, actx, tree, -1);
1790 break;
1791 case 74: /*statusReport*/
1792 offset=dissect_gsm_map_ch_StatusReportRes(false, tvb, offset, actx, tree, -1);
1793 break;
1794 case 75: /*remoteUserFree*/
1795 offset=dissect_gsm_map_ch_RemoteUserFreeRes(false, tvb, offset, actx, tree, -1);
1796 break;
1797 case 76: /*registerCC-Entry*/
1798 offset=dissect_gsm_map_ss_RegisterCC_EntryRes(false, tvb, offset, actx, tree, -1);
1799 break;
1800 case 77: /*eraseCC-Entry*/
1801 offset=dissect_gsm_map_ss_EraseCC_EntryRes(false, tvb, offset, actx, tree, -1);
1802 break;
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);
1808 break;
1809 case 83: /*provideSubscriberLocation*/
1810 offset=dissect_gsm_map_lcs_ProvideSubscriberLocation_Res(false, tvb, offset, actx, tree, -1);
1811 break;
1812 case 84: /*sendGroupCallInfo*/
1813 offset=dissect_gsm_map_gr_SendGroupCallInfoRes(false, tvb, offset, actx, tree, -1);
1814 break;
1815 case 85: /*sendRoutingInfoForLCS*/
1816 offset=dissect_gsm_map_lcs_RoutingInfoForLCS_Res(false, tvb, offset, actx, tree, -1);
1817 break;
1818 case 86: /*subscriberLocationReport*/
1819 offset=dissect_gsm_map_lcs_SubscriberLocationReport_Res(false, tvb, offset, actx, tree, -1);
1820 break;
1821 case 87: /*ist-Alert*/
1822 offset=dissect_gsm_map_ch_IST_AlertRes(false, tvb, offset, actx, tree, -1);
1823 break;
1824 case 88: /*ist-Command*/
1825 offset=dissect_gsm_map_ch_IST_CommandRes(false, tvb, offset, actx, tree, -1);
1826 break;
1827 case 89: /*noteMM-Event*/
1828 offset=dissect_gsm_map_ms_NoteMM_EventRes(false, tvb, offset, actx, tree, -1);
1829 break;
1830 case 108: /*SS-protocol LCS-PeriodicTriggeredInvokeRes*/
1831 offset = dissect_gsm_ss_LCS_PeriodicTriggeredInvokeRes(false, tvb, offset, actx, tree, -1);
1832 break;
1833 case 109: /*SS-protocol lcs-PeriodicLocationCancellation*/
1834 /* No parameter */
1835 break;
1836 case 110: /*SS-protocol lcs-LocationUpdate*/
1837 offset=dissect_gsm_ss_LCS_LocationUpdateRes(false, tvb, offset, actx, tree, -1);
1838 break;
1839 case 111: /*SS-protocol lcs-PeriodicLocationRequest*/
1840 offset=dissect_gsm_ss_LCS_PeriodicLocationRequestRes(false, tvb, offset, actx, tree, -1);
1841 break;
1842 case 112: /*SS-protocol lcs-AreaEventCancellation*/
1843 break;
1844 case 113: /*SS-protocol lcs-AreaEventReport*/
1845 break;
1846 case 114: /*SS-protocol lcs-AreaEventRequest No RESULT data*/
1847 break;
1848 case 115: /*SS-protocol lcs-MOLR*/
1849 offset=dissect_gsm_ss_LCS_MOLRRes(false, tvb, offset, actx, tree, -1);
1850 break;
1851 case 116: /*SS-protocol lcs-LocationNotification*/
1852 offset=dissect_gsm_ss_LocationNotificationRes(false, tvb, offset, actx, tree, -1);
1853 break;
1854 case 117: /*SS-protocol callDeflection no RESULT*/
1855 break;
1856 case 118: /*SS-protocol userUserService no RESULT*/
1857 break;
1858 case 119: /*SS-protocol accessRegisterCCEntry*/
1859 offset=dissect_gsm_map_ss_RegisterCC_EntryRes(false, tvb, offset, actx, tree, -1);
1860 break;
1861 case 120: /*SS-protocol forwardCUG-Info*/
1862 /* No RETURN RESULT*/
1863 break;
1864 case 121: /*SS-protocol splitMPTY no RESULT*/
1865 break;
1866 case 122: /*SS-protocol retrieveMPTY no RESULT*/
1867 break;
1868 case 123: /*SS-protocol holdMPTY no RESULT*/
1869 break;
1870 case 124: /*SS-protocol buildMPTY no RESULT*/
1871 break;
1872 case 125: /*SS-protocol forwardChargeAdvice no RESULT*/
1873 break;
1874 case 126: /*SS-protocol explicitCT no RESULT*/
1875 break;
1877 default:
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);
1883 break;
1885 return offset;
1890 static int dissect_returnErrorData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx) {
1892 switch(errorCode){
1893 case 1: /* UnknownSubscriberParam */
1894 offset=dissect_gsm_map_er_UnknownSubscriberParam(false, tvb, offset, actx, tree, -1);
1895 break;
1896 case 4: /* SecureTransportErrorParam */
1897 offset=dissect_gsm_old_SecureTransportErrorParam(false, tvb, offset, actx, tree, -1);
1898 break;
1899 case 5: /* UnidentifiedSubParam */
1900 offset=dissect_gsm_map_er_UnidentifiedSubParam(false, tvb, offset, actx, tree, -1);
1901 break;
1902 case 6: /* AbsentSubscriberSM-Param */
1903 offset=dissect_gsm_map_er_AbsentSubscriberSM_Param(false, tvb, offset, actx, tree, -1);
1904 break;
1905 case 8: /* RoamingNotAllowedParam */
1906 offset=dissect_gsm_map_er_RoamingNotAllowedParam(false, tvb, offset, actx, tree, -1);
1907 break;
1908 case 9: /* IllegalSubscriberParam */
1909 offset=dissect_gsm_map_er_IllegalSubscriberParam(false, tvb, offset, actx, tree, -1);
1910 break;
1911 case 10: /* BearerServNotProvParam */
1912 offset=dissect_gsm_map_er_BearerServNotProvParam(false, tvb, offset, actx, tree, -1);
1913 break;
1914 case 11: /* TeleservNotProvParam */
1915 offset=dissect_gsm_map_er_TeleservNotProvParam(false, tvb, offset, actx, tree, -1);
1916 break;
1917 case 12: /* IllegalEquipmentParam */
1918 offset=dissect_gsm_map_er_IllegalEquipmentParam(false, tvb, offset, actx, tree, -1);
1919 break;
1920 case 13: /* CallBarredParam */
1921 offset=dissect_gsm_map_er_CallBarredParam(false, tvb, offset, actx, tree, -1);
1922 break;
1923 case 14: /* ForwardingViolationParam */
1924 offset=dissect_gsm_map_er_ForwardingViolationParam(false, tvb, offset, actx, tree, -1);
1925 break;
1926 case 15: /* CUG-RejectParam */
1927 offset=dissect_gsm_map_er_CUG_RejectParam(false, tvb, offset, actx, tree, -1);
1928 break;
1929 case 16: /* IllegalSS-OperationParam */
1930 offset=dissect_gsm_map_er_IllegalSS_OperationParam(false, tvb, offset, actx, tree, -1);
1931 break;
1932 case 17: /* SS-ErrorStatus */
1933 offset=dissect_gsm_map_ss_SS_Status(false, tvb, offset, actx, tree, hf_gsm_map_ss_ss_Status);
1934 break;
1935 case 18: /* SS-NotAvailableParam */
1936 offset=dissect_gsm_map_er_SS_NotAvailableParam(false, tvb, offset, actx, tree, -1);
1937 break;
1938 case 19: /* SS-SubscriptionViolationParam */
1939 offset=dissect_gsm_map_er_SS_SubscriptionViolationParam(false, tvb, offset, actx, tree, -1);
1940 break;
1941 case 20: /* SS-IncompatibilityCause */
1942 offset=dissect_gsm_map_er_SS_IncompatibilityCause(false, tvb, offset, actx, tree, -1);
1943 break;
1944 case 21: /* FacilityNotSupParam */
1945 offset=dissect_gsm_map_er_FacilityNotSupParam(false, tvb, offset, actx, tree, -1);
1946 break;
1947 case 22: /* OngoingGroupCallParam */
1948 offset=dissect_gsm_map_er_OngoingGroupCallParam(false, tvb, offset, actx, tree, -1);
1949 break;
1950 case 27: /* AbsentSubscriberParam */
1951 offset=dissect_gsm_map_er_AbsentSubscriberParam(false, tvb, offset, actx, tree, -1);
1952 break;
1953 case 28: /* IncompatibleTerminalParam */
1954 offset=dissect_gsm_map_er_IncompatibleTerminalParam(false, tvb, offset, actx, tree, -1);
1955 break;
1956 case 29: /* ShortTermDenialParam */
1957 offset=dissect_gsm_map_er_ShortTermDenialParam(false, tvb, offset, actx, tree, -1);
1958 break;
1959 case 30: /* LongTermDenialParam */
1960 offset=dissect_gsm_map_er_LongTermDenialParam(false, tvb, offset, actx, tree, -1);
1961 break;
1962 case 31: /* SubBusyForMT-SMS-Param */
1963 offset=dissect_gsm_map_er_SubBusyForMT_SMS_Param(false, tvb, offset, actx, tree, -1);
1964 break;
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,
1969 false, NULL, -1);
1971 break;
1972 case 33: /* MessageWaitListFullParam */
1973 offset=dissect_gsm_map_er_MessageWaitListFullParam(false, tvb, offset, actx, tree, -1);
1974 break;
1975 case 34: /* SystemFailureParam */
1976 offset=dissect_gsm_map_er_SystemFailureParam(false, tvb, offset, actx, tree, -1);
1977 break;
1978 case 35: /* DataMissingParam */
1979 offset=dissect_gsm_map_er_DataMissingParam(false, tvb, offset, actx, tree, -1);
1980 break;
1981 case 36: /* UnexpectedDataParam */
1982 offset=dissect_gsm_map_er_UnexpectedDataParam(false, tvb, offset, actx, tree, -1);
1983 break;
1984 case 37: /* PW-RegistrationFailureCause */
1985 offset=dissect_gsm_map_er_PW_RegistrationFailureCause(false, tvb, offset, actx, tree, -1);
1986 break;
1987 case 39: /* NoRoamingNbParam */
1988 offset=dissect_gsm_map_er_NoRoamingNbParam(false, tvb, offset, actx, tree, -1);
1989 break;
1990 case 40: /* TracingBufferFullParam */
1991 offset=dissect_gsm_map_er_TracingBufferFullParam(false, tvb, offset, actx, tree, -1);
1992 break;
1993 case 42: /* TargetCellOutsideGCA-Param */
1994 offset=dissect_gsm_map_er_TargetCellOutsideGCA_Param(false, tvb, offset, actx, tree, -1);
1995 break;
1996 case 44: /* NumberChangedParam */
1997 offset=dissect_gsm_map_er_NumberChangedParam(false, tvb, offset, actx, tree, -1);
1998 break;
1999 case 45: /* BusySubscriberParam */
2000 offset=dissect_gsm_map_er_BusySubscriberParam(false, tvb, offset, actx, tree, -1);
2001 break;
2002 case 46: /* NoSubscriberReplyParam */
2003 offset=dissect_gsm_map_er_NoSubscriberReplyParam(false, tvb, offset, actx, tree, -1);
2004 break;
2005 case 47: /* ForwardingFailedParam */
2006 offset=dissect_gsm_map_er_ForwardingFailedParam(false, tvb, offset, actx, tree, -1);
2007 break;
2008 case 48: /* OR-NotAllowedParam */
2009 offset=dissect_gsm_map_er_OR_NotAllowedParam(false, tvb, offset, actx, tree, -1);
2010 break;
2011 case 49: /* ATI-NotAllowedParam */
2012 offset=dissect_gsm_map_er_ATI_NotAllowedParam(false, tvb, offset, actx, tree, -1);
2013 break;
2014 case 50: /* NoGroupCallNbParam */
2015 offset=dissect_gsm_map_er_NoGroupCallNbParam(false, tvb, offset, actx, tree, -1);
2016 break;
2017 case 51: /* ResourceLimitationParam */
2018 offset=dissect_gsm_map_er_ResourceLimitationParam(false, tvb, offset, actx, tree, -1);
2019 break;
2020 case 52: /* UnauthorizedRequestingNetwork-Param */
2021 offset=dissect_gsm_map_er_UnauthorizedRequestingNetwork_Param(false, tvb, offset, actx, tree, -1);
2022 break;
2023 case 53: /* UnauthorizedLCSClient-Param */
2024 offset=dissect_gsm_map_er_UnauthorizedLCSClient_Param(false, tvb, offset, actx, tree, -1);
2025 break;
2026 case 54: /* PositionMethodFailure-Param */
2027 offset=dissect_gsm_map_er_PositionMethodFailure_Param(false, tvb, offset, actx, tree, -1);
2028 break;
2029 case 58: /* UnknownOrUnreachableLCSClient-Param */
2030 offset=dissect_gsm_map_er_UnknownOrUnreachableLCSClient_Param(false, tvb, offset, actx, tree, -1);
2031 break;
2032 case 59: /* MM-EventNotSupported-Param */
2033 offset=dissect_gsm_map_er_MM_EventNotSupported_Param(false, tvb, offset, actx, tree, -1);
2034 break;
2035 case 60: /* ATSI-NotAllowedParam */
2036 offset=dissect_gsm_map_er_ATSI_NotAllowedParam(false, tvb, offset, actx, tree, -1);
2037 break;
2038 case 61: /* ATM-NotAllowedParam */
2039 offset=dissect_gsm_map_er_ATM_NotAllowedParam(false, tvb, offset, actx, tree, -1);
2040 break;
2041 case 62: /* InformationNotAvailableParam */
2042 offset=dissect_gsm_map_er_InformationNotAvailableParam(false, tvb, offset, actx, tree, -1);
2043 break;
2044 default:
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);
2050 break;
2052 return 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_) {
2057 proto_tree *tree;
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_) {
2067 proto_tree *tree;
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_) {
2075 proto_tree *tree;
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_) {
2084 proto_tree *tree;
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_) {
2094 proto_tree *tree;
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_) {
2104 proto_tree *tree;
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_) {
2121 proto_tree *tree;
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_) {
2138 proto_tree *tree;
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_) {
2148 proto_tree *tree;
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_) {
2158 proto_tree *tree;
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_) {
2168 proto_tree *tree;
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_) {
2178 proto_tree *tree;
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_) {
2188 proto_tree *tree;
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_) {
2198 proto_tree *tree;
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_) {
2208 proto_tree *tree;
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_) {
2239 proto_tree *tree;
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_) {
2249 proto_tree *tree;
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_) {
2259 proto_tree *tree;
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_) {
2269 proto_tree *tree;
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_) {
2279 proto_tree *tree;
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_) {
2290 proto_tree *tree;
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_) {
2300 proto_tree *tree;
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);
2309 static int
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_) {
2313 char *version_ptr;
2315 opcode = 0;
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,'.');
2322 if (version_ptr){
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);
2341 return offset;
2344 static int
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;
2351 int op_idx;
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);
2372 if (op_idx != -1) {
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);
2383 static int
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;
2390 int op_idx;
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);
2411 if (op_idx != -1) {
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" },
2496 { 0, NULL }
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" },
2535 { 0, NULL }
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" },
2598 { 0, NULL }
2601 /* ForwardingOptions
2603 -- bit 8: notification to forwarding party
2604 -- 0 no notification
2605 -- 1 notification
2607 static const true_false_string notification_value = {
2608 "Notification",
2609 "No notification"
2612 -- bit 7: redirecting presentation
2613 -- 0 no presentation
2614 -- 1 presentation
2616 static const true_false_string redirecting_presentation_value = {
2617 "Presentation",
2618 "No presentation"
2621 -- bit 6: notification to calling party
2622 -- 0 no notification
2623 -- 1 notification
2626 -- bit 5: 0 (unused)
2627 -- bits 43: forwarding reason
2628 -- 00 ms not reachable
2629 -- 01 ms busy
2630 -- 10 no reply
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" },
2636 { 0x1, "ms busy" },
2637 { 0x2, "no reply" },
2638 { 0x3, "unconditional when used in a SRI Result or call deflection when used in a RCH Argument" },
2639 { 0, NULL }
2642 -- bits 21: 00 (unused)
2645 static const value_string pdp_type_org_values[] = {
2646 { 0x0, "ETSI" },
2647 { 0x1, "IETF" },
2648 { 0xf, "Empty PDP type" },
2649 { 0, NULL }
2652 static const value_string etsi_pdp_type_number_values[] = {
2653 { 0x0, "Reserved, used in earlier version of this protocol" },
2654 { 0x1, "PPP" },
2655 { 0, NULL }
2658 static const value_string ietf_pdp_type_number_values[] = {
2659 { 0x21, "IPv4 Address" },
2660 { 0x57, "IPv6 Address" },
2661 { 0, NULL }
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)" },
2685 { 0, NULL }
2688 /* TAP STAT INFO */
2689 typedef enum
2691 ID_COLUMN,
2692 OP_CODE_COLUMN,
2693 INVOKES_COLUMN,
2694 NUM_BYTES_FWD_COLUMN,
2695 AVG_BYTES_FWD_COLUMN,
2696 RET_RES_COLUMN,
2697 NUM_BYTES_REV_COLUMN,
2698 AVG_BYTES_REV_COLUMN,
2699 TOT_BYTES_COLUMN,
2700 AVG_BYTES_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;
2721 unsigned i;
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);
2738 if (table) {
2739 if (new_stat->stat_tap_reset_table_cb) {
2740 new_stat->stat_tap_reset_table_cb(table);
2742 return;
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);
2752 char *col_str;
2753 if (ocs) {
2754 col_str = g_strdup(ocs);
2755 } else {
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);
2781 if (gmtr->invoke)
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);
2789 else
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;
2803 if (gmtr->invoke)
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);
2809 else
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;
2822 static void
2823 gsm_map_stat_reset(stat_tap_table* table)
2825 unsigned element;
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);
2836 static void
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_)
2846 if (ssn) {
2847 delete_itu_tcap_subdissector(ssn, map_handle);
2851 static void range_add_callback(uint32_t ssn, void *ptr _U_)
2853 if (ssn) {
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");
2980 else {
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,
3000 NULL, HFILL }},
3001 { &hf_gsm_map_getPassword,
3002 { "getPassword", "gsm_map.getPassword",
3003 FT_UINT8, BASE_DEC, VALS(gsm_old_GetPasswordArg_vals), 0,
3004 NULL, HFILL }},
3005 { &hf_gsm_map_currentPassword,
3006 { "currentPassword", "gsm_map.currentPassword",
3007 FT_STRING, BASE_NONE, NULL, 0,
3008 NULL, HFILL }},
3009 { &hf_gsm_map_extension,
3010 { "Extension", "gsm_map.extension",
3011 FT_BOOLEAN, 8, TFS(&tfs_no_extension_extension), 0x80,
3012 NULL, HFILL }},
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,
3016 NULL, HFILL }},
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,
3020 NULL, HFILL }},
3021 { &hf_gsm_map_address_digits,
3022 { "Address digits", "gsm_map.address.digits",
3023 FT_STRING, BASE_NONE, NULL, 0,
3024 NULL, HFILL }},
3025 { &hf_gsm_map_TBCD_digits,
3026 { "TBCD digits", "gsm_map.tbcd_digits",
3027 FT_STRING, BASE_NONE, NULL, 0,
3028 NULL, HFILL }},
3029 { &hf_gsm_map_Ss_Status_unused,
3030 { "Unused", "gsm_map.unused",
3031 FT_UINT8, BASE_HEX, NULL, 0xf0,
3032 NULL, HFILL }},
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,
3036 NULL, HFILL }},
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,
3040 NULL, HFILL }},
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,
3044 NULL, HFILL }},
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,
3048 NULL, HFILL }},
3049 { &hf_gsm_map_notification_to_forwarding_party,
3050 { "Notification to forwarding party", "gsm_map.notification_to_forwarding_party",
3051 FT_BOOLEAN, 8, TFS(&notification_value), 0x80,
3052 NULL, HFILL }},
3053 { &hf_gsm_map_redirecting_presentation,
3054 { "Redirecting presentation", "gsm_map.redirecting_presentation",
3055 FT_BOOLEAN, 8, TFS(&redirecting_presentation_value), 0x40,
3056 NULL, HFILL }},
3057 { &hf_gsm_map_notification_to_calling_party,
3058 { "Notification to calling party", "gsm_map.notification_to_calling_party",
3059 FT_BOOLEAN, 8, TFS(&notification_value), 0x20,
3060 NULL, HFILL }},
3061 { &hf_gsm_map_forwarding_reason,
3062 { "Forwarding reason", "gsm_map.forwarding_reason",
3063 FT_UINT8, BASE_HEX, VALS(forwarding_reason_values), 0x0c,
3064 NULL, HFILL }},
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,
3068 NULL, HFILL }},
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,
3080 NULL, HFILL }},
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,
3084 NULL, HFILL }},
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,
3088 NULL, HFILL }},
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,
3092 NULL, HFILL }},
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,
3096 NULL, HFILL }},
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,
3100 NULL, HFILL }},
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,
3104 NULL, HFILL }},
3106 { &hf_gsm_map_qos_max_sdu,
3107 { "Maximum SDU size", "gsm_map.qos.max_sdu",
3108 FT_UINT32, BASE_DEC, NULL, 0x0,
3109 NULL, HFILL }},
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,
3113 NULL, HFILL }},
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,
3117 NULL, HFILL }},
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,
3121 NULL, HFILL }},
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,
3125 NULL, HFILL }},
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,
3129 NULL, HFILL }},
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,
3157 NULL, HFILL }
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,
3162 NULL, HFILL }
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,
3167 NULL, HFILL }
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,
3172 NULL, HFILL }
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,
3177 NULL, HFILL }
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,
3182 NULL, HFILL }
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,
3187 NULL, HFILL }
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,
3192 NULL, HFILL }
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,
3197 NULL, HFILL }
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,
3202 NULL, HFILL }
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,
3207 NULL, HFILL }
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 }},
3213 { &hf_gsm_map_len,
3214 { "Length", "gsm_map.length",
3215 FT_UINT8, BASE_DEC, NULL, 0,
3216 NULL, HFILL }},
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,
3220 NULL, HFILL }},
3221 { &hf_gsm_map_dlci,
3222 { "DLCI", "gsm_map.dlci",
3223 FT_UINT8, BASE_DEC, NULL, 0,
3224 "Data Link Connection Indicator", HFILL }},
3225 { &hf_gsm_apn_str,
3226 { "APN", "gsm_map.apn_str",
3227 FT_STRING, BASE_NONE, NULL, 0,
3228 NULL, HFILL }},
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,
3248 NULL, HFILL }},
3249 { &hf_gsm_map_spare_bits,
3250 { "Spare bit(s)", "gsm_map.spare_bits",
3251 FT_UINT8, BASE_DEC, NULL, 0x0,
3252 NULL, HFILL }
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,
3257 NULL, HFILL }
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,
3262 NULL, HFILL }
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,
3267 NULL, HFILL }
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,
3272 NULL, HFILL }
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,
3277 NULL, HFILL }
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,
3282 NULL, HFILL }
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,
3288 NULL, HFILL }
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,
3293 NULL, HFILL }
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,
3298 NULL, HFILL }
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,
3303 NULL, HFILL }
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,
3309 NULL, HFILL }
3311 { &hf_gsm_map_earp_pl,
3312 { "PL Priority Level", "gsm_map.EARP_priority_level",
3313 FT_UINT8, BASE_DEC, NULL, 0x3C,
3314 NULL, HFILL }
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,
3319 NULL, HFILL }
3322 #include "packet-gsm_map-hfarr.c"
3325 /* List of subtrees */
3326 static int *ett[] = {
3327 &ett_gsm_map,
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,
3358 &ett_gsm_map_TA_id,
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},
3376 {NULL, NULL, -1}
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,
3385 "MAP Operation",
3386 "gsm_map",
3387 "gsm_map,operation",
3388 gsm_map_stat_init,
3389 gsm_map_stat_packet,
3390 gsm_map_stat_reset,
3391 gsm_map_stat_free_table_item,
3392 NULL,
3393 array_length(gsm_map_stat_fields), gsm_map_stat_fields,
3394 array_length(gsm_map_stat_params), gsm_map_stat_params,
3395 NULL,
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
3426 * Set default SSNs
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 "
3440 "if available",
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);
3459 * Editor modelines
3461 * Local Variables:
3462 * c-basic-offset: 2
3463 * tab-width: 8
3464 * indent-tabs-mode: nil
3465 * End:
3467 * ex: set shiftwidth=2 tabstop=8 expandtab:
3468 * :indentSize=2:tabSize=8:noTabs=true: