Convert ASN.1 dissectors to use filterable expert info.
[metze/wireshark/wip.git] / asn1 / gsm_map / packet-gsm_map-template.c
1 /* XXX see bug 1852:
2  *
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.
10  */
11
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>
19  *
20  * $Id$
21  *
22  * Wireshark - Network traffic analyzer
23  * By Gerald Combs <gerald@wireshark.org>
24  * Copyright 1998 Gerald Combs
25  *
26  * This program is free software; you can redistribute it and/or
27  * modify it under the terms of the GNU General Public License
28  * as published by the Free Software Foundation; either version 2
29  * of the License, or (at your option) any later version.
30  *
31  * This program is distributed in the hope that it will be useful,
32  * but WITHOUT ANY WARRANTY; without even the implied warranty of
33  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
34  * GNU General Public License for more details.
35  *
36  * You should have received a copy of the GNU General Public License
37  * along with this program; if not, write to the Free Software
38  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
39  * References GSM MAP:
40  * ETSI TS 129 002
41  * Updated to ETSI TS 129 002 V7.5.0 (3GPP TS 29.002 V7.5.0 (2006-09) Release 7)
42  * Updated to ETSI TS 129 002 V8.4.0 (3GPP TS 29.002 V8.1.0 (2007-06) Release 8)
43  * References GSM SS
44  * References: 3GPP TS 24.080
45  */
46
47 #include "config.h"
48
49 #include <glib.h>
50 #include <epan/packet.h>
51 #include <epan/prefs.h>
52 #include <epan/tap.h>
53 #include <epan/emem.h>
54 #include <epan/oids.h>
55 #include <epan/expert.h>
56
57 #include <string.h>
58
59 #include <epan/asn1.h>
60 #include "packet-ber.h"
61 #include "packet-per.h"
62 #include "packet-q931.h"
63 #include "packet-gsm_map.h"
64 #include "packet-gsm_a_common.h"
65 #include "packet-tcap.h"
66 #include "packet-e164.h"
67 #include "packet-e212.h"
68 #include "packet-smpp.h"
69 #include "packet-gsm_sms.h"
70 #include "packet-ranap.h"
71
72 #define PNAME  "GSM Mobile Application"
73 #define PSNAME "GSM_MAP"
74 #define PFNAME "gsm_map"
75
76 void proto_register_gsm_map(void);
77 void proto_reg_handoff_gsm_map(void);
78
79 /* Initialize the protocol and registered fields */
80 static int proto_gsm_map = -1;
81 static int proto_gsm_map_dialogue = -1;
82
83 static int hf_gsm_map_old_Component_PDU = -1;
84 static int hf_gsm_map_getPassword = -1;
85 static int hf_gsm_map_currentPassword = -1;
86 static int hf_gsm_map_extension = -1;
87 static int hf_gsm_map_nature_of_number = -1;
88 static int hf_gsm_map_number_plan = -1;
89 static int hf_gsm_map_isdn_address_digits = -1;
90 static int hf_gsm_map_address_digits = -1;
91 static int hf_gsm_map_servicecentreaddress_digits = -1;
92 static int hf_gsm_map_TBCD_digits = -1;
93 static int hf_gsm_map_Ss_Status_unused = -1;
94 static int hf_gsm_map_Ss_Status_q_bit = -1;
95 static int hf_gsm_map_Ss_Status_p_bit = -1;
96 static int hf_gsm_map_Ss_Status_r_bit = -1;
97 static int hf_gsm_map_Ss_Status_a_bit = -1;
98 static int hf_gsm_map_notification_to_forwarding_party = -1;
99 static int hf_gsm_map_redirecting_presentation = -1;
100 static int hf_gsm_map_notification_to_calling_party = -1;
101 static int hf_gsm_map_forwarding_reason = -1;
102 static int hf_gsm_map_pdp_type_org = -1;
103 static int hf_gsm_map_etsi_pdp_type_number = -1;
104 static int hf_gsm_map_ietf_pdp_type_number = -1;
105 static int hf_gsm_map_ext_qos_subscribed_pri = -1;
106
107 static int hf_gsm_map_qos_traffic_cls = -1;
108 static int hf_gsm_map_qos_del_order = -1;
109 static int hf_gsm_map_qos_del_of_err_sdu = -1;
110 static int hf_gsm_map_qos_ber = -1;
111 static int hf_gsm_map_qos_sdu_err_rat = -1;
112 static int hf_gsm_map_qos_traff_hdl_pri = -1;
113 static int hf_gsm_map_qos_max_sdu = -1;
114 static int hf_gsm_map_max_brate_ulink = -1;
115 static int hf_gsm_map_max_brate_dlink = -1;
116 static int hf_gsm_map_qos_transfer_delay = -1;
117 static int hf_gsm_map_guaranteed_max_brate_ulink = -1;
118 static int hf_gsm_map_guaranteed_max_brate_dlink = -1;
119 static int hf_gsm_map_GSNAddress_IPv4 = -1;
120 static int hf_gsm_map_GSNAddress_IPv6 = -1;
121 static int hf_gsm_map_ranap_service_Handover = -1;
122 static int hf_gsm_map_IntegrityProtectionInformation = -1;
123 static int hf_gsm_map_EncryptionInformation = -1;
124 static int hf_gsm_map_PlmnContainer_PDU = -1;
125 static int hf_gsm_map_ss_SS_UserData = -1;
126 static int hf_gsm_map_cbs_coding_grp = -1;
127 static int hf_gsm_map_cbs_coding_grp0_lang = -1;
128 static int hf_gsm_map_cbs_coding_grp1_lang = -1;
129 static int hf_gsm_map_cbs_coding_grp2_lang = -1;
130 static int hf_gsm_map_cbs_coding_grp3_lang = -1;
131 static int hf_gsm_map_cbs_coding_grp4_7_comp = -1;
132 static int hf_gsm_map_cbs_coding_grp4_7_class_ind = -1;
133 static int hf_gsm_map_cbs_coding_grp4_7_char_set = -1;
134 static int hf_gsm_map_cbs_coding_grp4_7_class = -1;
135 static int hf_gsm_map_cbs_coding_grp15_mess_code = -1;
136 static int hf_gsm_map_cbs_coding_grp15_class = -1;
137 static int hf_gsm_map_tmsi = -1;
138 static int hf_gsm_map_ie_tag = -1;
139 static int hf_gsm_map_len = -1;
140 static int hf_gsm_map_disc_par = -1;
141 static int hf_gsm_map_dlci = -1;
142 static int hf_gsm_apn_str = -1;
143 static int hf_gsm_map_locationnumber_odd_even = -1;
144 static int hf_gsm_map_locationnumber_nai = -1;
145 static int hf_gsm_map_locationnumber_inn = -1;
146 static int hf_gsm_map_locationnumber_npi = -1;
147 static int hf_gsm_map_locationnumber_apri = -1;
148 static int hf_gsm_map_locationnumber_screening_ind = -1;
149 static int hf_gsm_map_locationnumber_digits = -1;
150 static int hf_gsm_map_ericsson_locationInformation_rat = -1;
151 static int hf_gsm_map_ericsson_locationInformation_lac = -1;
152 static int hf_gsm_map_ericsson_locationInformation_ci = -1;
153 static int hf_gsm_map_ericsson_locationInformation_sac = -1;
154
155 #include "packet-gsm_map-hf.c"
156
157 /* Initialize the subtree pointers */
158 static gint ett_gsm_map = -1;
159 static gint ett_gsm_map_InvokeId = -1;
160 static gint ett_gsm_map_InvokePDU = -1;
161 static gint ett_gsm_map_ReturnResultPDU = -1;
162 static gint ett_gsm_map_ReturnErrorPDU = -1;
163 static gint ett_gsm_map_ReturnResult_result = -1;
164 static gint ett_gsm_map_ReturnError_result = -1;
165 static gint ett_gsm_map_GSMMAPPDU = -1;
166 static gint ett_gsm_map_ext_qos_subscribed = -1;
167 static gint ett_gsm_map_pdptypenumber = -1;
168 static gint ett_gsm_map_RAIdentity = -1;
169 static gint ett_gsm_map_LAIFixedLength = -1;
170 static gint ett_gsm_map_isdn_address_string = -1;
171 static gint ett_gsm_map_geo_desc = -1;
172 static gint ett_gsm_map_LongSignalInfo = -1;
173 static gint ett_gsm_map_RadioResourceInformation =-1;
174 static gint ett_gsm_map_MSNetworkCapability =-1;
175 static gint ett_gsm_map_MSRadioAccessCapability = -1;
176 static gint ett_gsm_map_externalsignalinfo = -1;
177 static gint ett_gsm_map_cbs_data_coding = -1;
178 static gint ett_gsm_map_GlobalCellId = -1;
179 static gint ett_gsm_map_GeographicalInformation = -1;
180 static gint ett_gsm_map_apn_str = -1;
181 static gint ett_gsm_map_LocationNumber = -1;
182 static gint ett_gsm_map_ericsson_locationInformation = -1;
183
184 #include "packet-gsm_map-ett.c"
185
186 static expert_field ei_gsm_map_unknown_sequence3 = EI_INIT;
187 static expert_field ei_gsm_map_unknown_sequence = EI_INIT;
188 static expert_field ei_gsm_map_unknown_parameter = EI_INIT;
189 static expert_field ei_gsm_map_unknown_invokeData = EI_INIT;
190
191 static dissector_table_t        sms_dissector_table;    /* SMS TPDU */
192 static dissector_handle_t       data_handle;
193 static dissector_handle_t       ranap_handle;
194 static dissector_handle_t       dtap_handle;
195 static dissector_handle_t       map_handle;
196 static dissector_table_t        map_prop_arg_opcode_table; /* prorietary operation codes */
197 static dissector_table_t        map_prop_res_opcode_table; /* prorietary operation codes */
198 static dissector_table_t        map_prop_err_opcode_table; /* prorietary operation codes */
199 /* Preferenc settings default */
200 #define MAX_SSN 254
201 static range_t *global_ssn_range;
202 #define APPLICATON_CONTEXT_FROM_TRACE 0
203 static gint pref_application_context_version = APPLICATON_CONTEXT_FROM_TRACE;
204 static gboolean pref_ericsson_proprietary_ext = FALSE;
205
206 /* Global variables */
207 static guint32 opcode=0;
208 static guint32 errorCode;
209 static proto_tree *top_tree;
210 static int application_context_version;
211 static guint ProtocolId;
212 static guint AccessNetworkProtocolId;
213 static const char *obj_id = NULL;
214 static int gsm_map_tap = -1;
215
216 #define SMS_ENCODING_NOT_SET    0
217 #define SMS_ENCODING_7BIT               1
218 #define SMS_ENCODING_8BIT               2
219 #define SMS_ENCODING_UCS2               3
220 #define SMS_ENCODING_7BIT_LANG  4
221 #define SMS_ENCODING_UCS2_LANG  5
222
223 static guint8 sms_encoding;
224
225 /* Forward declarations */
226 static int dissect_invokeData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx);
227 static int dissect_returnResultData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx);
228 static int dissect_returnErrorData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx);
229 const gchar* gsm_map_opr_code(guint32 val);
230
231 /* Value strings */
232
233 const value_string gsm_map_PDP_Type_Organisation_vals[] = {
234   {  0, "ETSI" },
235   {  1, "IETF" },
236   { 0, NULL }
237 };
238
239 const value_string gsm_map_ietf_defined_pdp_vals[] = {
240   {  0x21, "IPv4 Address" },
241   {  0x57, "IPv6 Address" },
242   { 0, NULL }
243 };
244
245 const value_string gsm_map_etsi_defined_pdp_vals[] = {
246   {  1, "PPP" },
247   { 0, NULL }
248 };
249
250 static const value_string gsm_map_tag_vals[] = {
251   {  0x4, "Bearer Capability" },
252   { 0, NULL }
253 };
254
255 static const value_string gsm_map_disc_par_vals[] = {
256   {  0, "Not Transparent" },
257   {  1, "Transparent" },
258   { 0, NULL }
259 };
260
261 static const value_string gsm_map_ericsson_locationInformation_rat_vals[] = {
262   { 0x0, "GSM" },
263   { 0x1, "UMTS" },
264   { 0x2, "LTE" },
265   { 0xf, "No information" },
266   { 0, NULL }
267 };
268
269 /* ITU-T Q.763 (12/1999)
270  * 3.30 Location number
271  */
272 /* b) Nature of address indicator */
273 static const range_string gsm_map_na_vals[] = {
274     { 0, 0, "spare" },
275     { 1, 1, "reserved for subscriber number (national use)" },
276     { 2, 2, "reserved for unknown (national use)" },
277     { 3, 3, "national (significant) number (national use)" },
278     { 4, 4, "international number" },
279     { 5, 0x6f, "spare" },
280     { 0x70, 0x7e, "spare" },
281     { 0x70, 0x7e, "reserved for national use" },
282     { 0x7f, 0x7f, "spare" },
283     { 0,           0,          NULL                   }
284 };
285
286 /* d) Numbering plan indicator */
287 static const value_string gsm_map_np_vals[] = {
288   {  0, "spare" },
289   {  1, "ISDN (telephony) numbering plan (ITU-T Recommendation E.164)" },
290   {  2, "spare" },
291   {  3, "Data numbering plan (ITU-T Recommendation X.121) (national use)" },
292   {  4, "Telex numbering plan (ITU-T Recommendation F.69) (national use)" },
293   {  5, "private numbering plan" },
294   {  6, "reserved for national use" },
295   {  7, "spare" },
296   { 0, NULL }
297 };
298 /*
299  * e) Address presentation restricted indicator
300  */
301 static const value_string gsm_map_addr_pres_rest_vals[] = {
302   {  0, "presentation allowed" },
303   {  1, "presentation restricted" },
304   {  2, "address not available (national use)" },
305   {  3, "spare" },
306   { 0, NULL }
307 };
308
309 /* f) Screening indicator */
310 static const value_string gsm_map_screening_ind_vals[] = {
311   {  0, "reserved" },
312   {  1, "user provided, verified and passed" },
313   {  2, "reserved" },
314   {  3, "network provided" },
315   { 0, NULL }
316 };
317
318 const char *
319 unpack_digits(tvbuff_t *tvb, int offset) {
320
321         int length;
322         guint8 octet;
323         int i=0;
324         char *digit_str;
325
326         length = tvb_length(tvb);
327         if (length < offset)
328                 return "";
329         digit_str = (char *)ep_alloc((length - offset)*2+1);
330
331         while ( offset < length ){
332
333                 octet = tvb_get_guint8(tvb,offset);
334                 digit_str[i] = ((octet & 0x0f) + '0');
335                 i++;
336
337                 /*
338                  * unpack second value in byte
339                  */
340                 octet = octet >> 4;
341
342                 if (octet == 0x0f)      /* odd number bytes - hit filler */
343                         break;
344
345                 digit_str[i] = ((octet & 0x0f) + '0');
346                 i++;
347                 offset++;
348
349         }
350         digit_str[i]= '\0';
351         return digit_str;
352 }
353
354 /* returns value in kb/s */
355 static guint
356 gsm_map_calc_bitrate(guint8 value){
357
358         guint8 granularity;
359         guint returnvalue;
360
361         if (value == 0xff)
362                 return 0;
363
364         granularity = value >> 6;
365         returnvalue = value & 0x7f;
366         switch (granularity){
367         case 0:
368                 break;
369         case 1:
370                 returnvalue = ((returnvalue - 0x40) << 3)+64;
371                 break;
372         case 2:
373                 returnvalue = (returnvalue << 6)+576;
374                 break;
375         case 3:
376                 returnvalue = (returnvalue << 6)+576;
377                 break;
378         }
379         return returnvalue;
380
381 }
382
383 static void
384 dissect_gsm_map_ext_qos_subscribed(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx){
385         int offset = 0;
386     proto_tree *subtree;
387         guint8 octet;
388         guint16 value;
389
390         subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_ext_qos_subscribed);
391         /*  OCTET 1:
392                 Allocation/Retention Priority (This octet encodes each priority level defined in
393                 23.107 as the binary value of the priority level, declaration in 29.060)
394                 Octets 2-9 are coded according to 3GPP TS 24.008[35] Quality of Service Octets
395                 6-13.
396          */
397         /* Allocation/Retention Priority */
398         proto_tree_add_item(subtree, hf_gsm_map_ext_qos_subscribed_pri, tvb, offset, 1, ENC_BIG_ENDIAN);
399         offset++;
400
401         /* Quality of Service Octets 6-13.( Octet 2 - 9 Here) */
402
403         /* Traffic class, octet 6 (see 3GPP TS 23.107) Bits 8 7 6 */
404         proto_tree_add_item(subtree, hf_gsm_map_qos_traffic_cls, tvb, offset, 1, ENC_BIG_ENDIAN);
405         /* Delivery order, octet 6 (see 3GPP TS 23.107) Bits 5 4 */
406         proto_tree_add_item(subtree, hf_gsm_map_qos_del_order, tvb, offset, 1, ENC_BIG_ENDIAN);
407         /* Delivery of erroneous SDUs, octet 6 (see 3GPP TS 23.107) Bits 3 2 1 */
408         proto_tree_add_item(subtree, hf_gsm_map_qos_del_of_err_sdu, tvb, offset, 1, ENC_BIG_ENDIAN);
409         offset++;
410
411         /* Maximum SDU size, octet 7 (see 3GPP TS 23.107) */
412         octet = tvb_get_guint8(tvb,offset);
413         switch (octet){
414         case 0:
415                 proto_tree_add_text(subtree, tvb, offset, 1, "Subscribed Maximum SDU size/Reserved");
416                 break;
417         case 0x93:
418                 value = 1502;
419                 proto_tree_add_uint(subtree, hf_gsm_map_qos_max_sdu, tvb, offset, 1, value);
420                 break;
421         case 0x98:
422                 value = 1510;
423                 proto_tree_add_uint(subtree, hf_gsm_map_qos_max_sdu, tvb, offset, 1, value);
424                 break;
425         case 0x99:
426                 value = 1532;
427                 proto_tree_add_uint(subtree, hf_gsm_map_qos_max_sdu, tvb, offset, 1, value);
428                 break;
429         default:
430                 if (octet<0x97){
431                         value = octet * 10;
432                         proto_tree_add_uint(subtree, hf_gsm_map_qos_max_sdu, tvb, offset, 1, value);
433                 }else{
434                         proto_tree_add_text(subtree, tvb, offset, 1, "Maximum SDU size value 0x%x not defined in TS 24.008",octet);
435                 }
436         }
437         offset++;
438
439         /* Maximum bit rate for uplink, octet 8 */
440         octet = tvb_get_guint8(tvb,offset);
441         if (octet == 0 ){
442                 proto_tree_add_text(subtree, tvb, offset, 1, "Subscribed Maximum bit rate for uplink/Reserved"  );
443         }else{
444                 proto_tree_add_uint(subtree, hf_gsm_map_max_brate_ulink, tvb, offset, 1, gsm_map_calc_bitrate(octet));
445         }
446         offset++;
447         /* Maximum bit rate for downlink, octet 9 (see 3GPP TS 23.107) */
448         octet = tvb_get_guint8(tvb,offset);
449         if (octet == 0 ){
450                 proto_tree_add_text(subtree, tvb, offset, 1, "Subscribed Maximum bit rate for downlink/Reserved"  );
451         }else{
452                 proto_tree_add_uint(subtree, hf_gsm_map_max_brate_dlink, tvb, offset, 1, gsm_map_calc_bitrate(octet));
453         }
454         offset++;
455         /* Residual Bit Error Rate (BER), octet 10 (see 3GPP TS 23.107) Bits 8 7 6 5 */
456         proto_tree_add_item(subtree, hf_gsm_map_qos_ber, tvb, offset, 1, ENC_BIG_ENDIAN);
457         /* SDU error ratio, octet 10 (see 3GPP TS 23.107) */
458         proto_tree_add_item(subtree, hf_gsm_map_qos_sdu_err_rat, tvb, offset, 1, ENC_BIG_ENDIAN);
459         offset++;
460
461         /* Transfer delay, octet 11 (See 3GPP TS 23.107) Bits 8 7 6 5 4 3 */
462         proto_tree_add_item(subtree, hf_gsm_map_qos_transfer_delay, tvb, offset, 1, ENC_BIG_ENDIAN);
463         /* Traffic handling priority, octet 11 (see 3GPP TS 23.107) Bits 2 1 */
464         proto_tree_add_item(subtree, hf_gsm_map_qos_traff_hdl_pri, tvb, offset, 1, ENC_BIG_ENDIAN);
465         offset++;
466
467         /*      Guaranteed bit rate for uplink, octet 12 (See 3GPP TS 23.107)
468                 Coding is identical to that of Maximum bit rate for uplink.
469          */
470         octet = tvb_get_guint8(tvb,offset);
471         if (octet == 0 ){
472                 proto_tree_add_text(subtree, tvb, offset, 1, "Subscribed Guaranteed bit rate for uplink/Reserved"  );
473         }else{
474                 proto_tree_add_uint(subtree, hf_gsm_map_guaranteed_max_brate_ulink, tvb, offset, 1, gsm_map_calc_bitrate(octet));
475         }
476         offset++;
477
478         /*      Guaranteed bit rate for downlink, octet 13(See 3GPP TS 23.107)
479                 Coding is identical to that of Maximum bit rate for uplink.
480          */
481         octet = tvb_get_guint8(tvb,offset);
482         if (octet == 0 ){
483                 proto_tree_add_text(subtree, tvb, offset, 1, "Subscribed Guaranteed bit rate for downlink/Reserved"  );
484         }else{
485                 proto_tree_add_uint(subtree, hf_gsm_map_guaranteed_max_brate_dlink, tvb, offset, 1, gsm_map_calc_bitrate(octet));
486         }
487
488 }
489
490 #define  ELLIPSOID_POINT 0
491 #define  ELLIPSOID_POINT_WITH_UNCERT_CIRC 1
492 #define  ELLIPSOID_POINT_WITH_UNCERT_ELLIPSE 3
493 #define  POLYGON 5
494 #define  ELLIPSOID_POINT_WITH_ALT 8
495 #define  ELLIPSOID_POINT_WITH_ALT_AND_UNCERT_ELLIPSOID 9
496 #define  ELLIPSOID_ARC 10
497 /*
498 4 3 2 1
499 0 0 0 0 Ellipsoid Point
500 0 0 0 1 Ellipsoid point with uncertainty Circle
501 0 0 1 1 Ellipsoid point with uncertainty Ellipse
502 0 1 0 1 Polygon
503 1 0 0 0 Ellipsoid point with altitude
504 1 0 0 1 Ellipsoid point with altitude and uncertainty Ellipsoid
505 1 0 1 0 Ellipsoid Arc
506 other values reserved for future use
507 */
508
509 /* TS 23 032 Table 2a: Coding of Type of Shape */
510 static const value_string type_of_shape_vals[] = {
511         { ELLIPSOID_POINT,                                                                      "Ellipsoid Point"},
512         { ELLIPSOID_POINT_WITH_UNCERT_CIRC,                                     "Ellipsoid point with uncertainty Circle"},
513         { ELLIPSOID_POINT_WITH_UNCERT_ELLIPSE,                          "Ellipsoid point with uncertainty Ellipse"},
514         { POLYGON,                                                                                      "Polygon"},
515         { ELLIPSOID_POINT_WITH_ALT,                                                     "Ellipsoid point with altitude"},
516         { ELLIPSOID_POINT_WITH_ALT_AND_UNCERT_ELLIPSOID,        "Ellipsoid point with altitude and uncertainty Ellipsoid"},
517         { ELLIPSOID_ARC,                                                                        "Ellipsoid Arc"},
518         { 0,    NULL }
519 };
520
521 /* 3GPP TS 23.032 7.3.1 */
522 static const value_string sign_of_latitude_vals[] = {
523         { 0,            "North"},
524         { 1,            "South"},
525         { 0,    NULL }
526 };
527
528 static const value_string dir_of_alt_vals[] = {
529         { 0,            "Altitude expresses height"},
530         { 1,            "Altitude expresses depth"},
531         { 0,    NULL }
532 };
533
534 static const value_string gsm_map_cbs_data_coding_scheme_coding_grp_vals[] = {
535         { 0, "Coding Group 0(Language using the GSM 7 bit default alphabet)" },
536         { 1, "Coding Group 1" },
537         { 2, "Coding Group 2" },
538         { 3, "Coding Group 3" },
539         { 4, "General Data Coding indication" },
540         { 5, "General Data Coding indication" },
541         { 6, "General Data Coding indication" },
542         { 7, "General Data Coding indication" },
543         { 8, "Reserved" },
544         { 9, "Message with User Data Header (UDH) structure" },
545         { 10,"Reserved" },
546         { 11,"Reserved" },
547         { 12,"Reserved" },
548         { 13,"Reserved" },
549         { 14,"Defined by the WAP Forum" },
550         { 15,"Data coding / message handling" },
551         { 0, NULL}
552 };
553 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);
554
555 /* Coding group 0
556  * Bits 3..0 indicate the language:
557  */
558 static const value_string gsm_map_cbs_coding_grp0_lang_vals[] = {
559         { 0, "German"},
560         { 1, "English"},
561         { 2, "Italian"},
562         { 3, "French"},
563         { 4, "Spanish"},
564         { 5, "Dutch"},
565         { 6, "Swedish"},
566         { 7, "Danish"},
567         { 8, "Portuguese"},
568         { 9, "Finnish"},
569         { 10, "Norwegian"},
570         { 11, "Greek"},
571         { 12, "Turkish"},
572         { 13, "Hungarian"},
573         { 14, "Polish"},
574         { 15, "Language unspecified"},
575         { 0,    NULL }
576 };
577 static value_string_ext gsm_map_cbs_coding_grp0_lang_vals_ext = VALUE_STRING_EXT_INIT(gsm_map_cbs_coding_grp0_lang_vals);
578
579 static const value_string gsm_map_cbs_coding_grp1_lang_vals[] = {
580         { 0, "GSM 7 bit default alphabet; message preceded by language indication"},
581         { 1, "UCS2; message preceded by language indication"},
582         { 2, "Reserved"},
583         { 3, "Reserved"},
584         { 4, "Reserved"},
585         { 5, "Reserved"},
586         { 6, "Reserved"},
587         { 7, "Reserved"},
588         { 8, "Reserved"},
589         { 9, "Reserved"},
590         { 10, "Reserved"},
591         { 11, "Reserved"},
592         { 12, "Reserved"},
593         { 13, "Reserved"},
594         { 14, "Reserved"},
595         { 15, "Reserved"},
596         { 0,    NULL }
597 };
598 static value_string_ext gsm_map_cbs_coding_grp1_lang_vals_ext = VALUE_STRING_EXT_INIT(gsm_map_cbs_coding_grp1_lang_vals);
599
600 static const value_string gsm_map_cbs_coding_grp2_lang_vals[] = {
601         { 0, "Czech"},
602         { 1, "Hebrew"},
603         { 2, "Arabic"},
604         { 3, "Russian"},
605         { 4, "Icelandic"},
606         { 5, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
607         { 6, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
608         { 7, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
609         { 8, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
610         { 9, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
611         { 10, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
612         { 11, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
613         { 12, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
614         { 13, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
615         { 14, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
616         { 15, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
617         { 0,    NULL }
618 };
619 static value_string_ext gsm_map_cbs_coding_grp2_lang_vals_ext = VALUE_STRING_EXT_INIT(gsm_map_cbs_coding_grp2_lang_vals);
620
621 static const value_string gsm_map_cbs_coding_grp3_lang_vals[] = {
622         { 0, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
623         { 1, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
624         { 2, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
625         { 3, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
626         { 4, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
627         { 5, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
628         { 6, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
629         { 7, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
630         { 8, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
631         { 9, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
632         { 10, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
633         { 11, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
634         { 12, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
635         { 13, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
636         { 14, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
637         { 15, "Reserved for other languages using the GSM 7 bit default alphabet, with unspecified handling at the MS"},
638         { 0,    NULL }
639 };
640 static value_string_ext gsm_map_cbs_coding_grp3_lang_vals_ext = VALUE_STRING_EXT_INIT(gsm_map_cbs_coding_grp3_lang_vals);
641
642 static const true_false_string gsm_map_cbs_coding_grp4_7_comp_vals = {
643   "The text is compressed using the compression algorithm defined in 3GPP TS 23.042",
644   "The text is uncompressed"
645 };
646
647 static const true_false_string gsm_map_cbs_coding_grp4_7_class_ind_vals = {
648   "Bits 1 to 0 have a message class meaning",
649   "Bits 1 to 0 are reserved and have no message class meaning"
650 };
651
652 /* Bits 3 and 2 indicate the character set being used, as follows: */
653
654 static const value_string gsm_map_cbs_coding_grp4_7_char_set_vals[] = {
655         { 0, "GSM 7 bit default alphabet"},
656         { 1, "8 bit data"},
657         { 2, "UCS2 (16 bit)"},
658         { 3, "Reserved"},
659         { 0,    NULL }
660 };
661
662 static const value_string gsm_map_cbs_coding_grp4_7_class_vals[] = {
663         { 0, "Class 0"},
664         { 1, "Class 1 Default meaning: ME-specific"},
665         { 2, "Class 2 (U)SIM specific message"},
666         { 3, "Class 3 Default meaning: TE-specific (see 3GPP TS 27.005"},
667         { 0,    NULL }
668 };
669
670 static const value_string gsm_map_cbs_coding_grp15_mess_code_vals[] = {
671         { 0, "GSM 7 bit default alphabet"},
672         { 1, "8 bit data"},
673         { 0,    NULL }
674 };
675
676 static const value_string gsm_map_cbs_coding_grp15_class_vals[] = {
677         { 0, "GSM 7 bit default alphabet"},
678         { 1, "8 bit data"},
679         { 0,    NULL }
680 };
681
682
683 /* 3GPP TS 23.038 version 7.0.0 Release 7 */
684 guint8
685 dissect_cbs_data_coding_scheme(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint16 offset)
686 {
687         guint8 octet;
688         guint8 coding_grp;
689         guint8 character_set;
690
691         octet = tvb_get_guint8(tvb,offset);
692         coding_grp = octet >>4;
693         proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp, tvb, offset, 1, ENC_BIG_ENDIAN);
694
695         sms_encoding = SMS_ENCODING_NOT_SET;
696         switch (coding_grp){
697         case 0:
698                 proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp0_lang, tvb, offset, 1, ENC_BIG_ENDIAN);
699                 sms_encoding = SMS_ENCODING_7BIT;
700                 break;
701         case 1:
702                 proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp1_lang, tvb, offset, 1, ENC_BIG_ENDIAN);
703                 if ((octet & 0x0f)== 0){
704                         sms_encoding = SMS_ENCODING_7BIT_LANG;
705                 }else{
706                         sms_encoding = SMS_ENCODING_UCS2_LANG;
707                 }
708                 break;
709         case 2:
710                 proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp2_lang, tvb, offset, 1, ENC_BIG_ENDIAN);
711                 sms_encoding = SMS_ENCODING_7BIT;
712                 break;
713         case 3:
714                 proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp3_lang, tvb, offset, 1, ENC_BIG_ENDIAN);
715                 sms_encoding = SMS_ENCODING_7BIT;
716                 break;
717                 /* Coding_grp 01xx */
718         case 4:
719                   /* FALLTHRU */
720         case 5:
721                   /* FALLTHRU */
722         case 6:
723                   /* FALLTHRU */
724         case 7:
725                   /* FALLTHRU */
726                 proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp4_7_comp, tvb, offset, 1, ENC_BIG_ENDIAN);
727                 proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp4_7_class_ind, tvb, offset, 1, ENC_BIG_ENDIAN);
728                 proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp4_7_char_set, tvb, offset, 1, ENC_BIG_ENDIAN);
729                 if ((octet & 0x10)== 0x10){
730                         proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp4_7_class, tvb, offset, 1, ENC_BIG_ENDIAN);
731                 }
732                 /* Bits 3 and 2 indicate the character set being used, */
733                 character_set = (octet&0x0c)>>2;
734                 switch (character_set){
735                 case 0:
736                         /* GSM 7 bit default alphabet */
737                         sms_encoding = SMS_ENCODING_7BIT;
738                         break;
739                 case 1:
740                         /* 8 bit data */
741                         sms_encoding = SMS_ENCODING_8BIT;
742                         break;
743                 case 2:
744                         /* UCS2 (16 bit) */
745                         sms_encoding = SMS_ENCODING_UCS2;
746                         break;
747                 case 3:
748                         /* Reserved */
749                         sms_encoding = SMS_ENCODING_NOT_SET;
750                         break;
751                 default:
752                         break;
753                 }
754                 break;
755         case 8:
756                 /* Reserved coding groups */
757                 break;
758         case 9:
759                 /* Message with User Data Header (UDH) structure:*/
760                 proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp4_7_char_set, tvb, offset, 1, ENC_BIG_ENDIAN);
761                 proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp4_7_class, tvb, offset, 1, ENC_BIG_ENDIAN);
762                 character_set = (octet&0x0c)>>2;
763                 switch (character_set){
764                 case 0:
765                         /* GSM 7 bit default alphabet */
766                         sms_encoding = SMS_ENCODING_7BIT;
767                         break;
768                 case 1:
769                         /* 8 bit data */
770                         sms_encoding = SMS_ENCODING_8BIT;
771                         break;
772                 case 2:
773                         /* UCS2 (16 bit) */
774                         sms_encoding = SMS_ENCODING_UCS2;
775                         break;
776                 case 3:
777                         /* Reserved */
778                         sms_encoding = SMS_ENCODING_NOT_SET;
779                         break;
780                 default:
781                         break;
782                 }
783                 break;
784         case 10:
785                 /* FALLTHRU */
786         case 11:
787                 /* FALLTHRU */
788         case 12:
789                 /* FALLTHRU */
790         case 13:
791                 /* FALLTHRU */
792                 /* 1010..1101 Reserved coding groups */
793                 break;
794         case 14:
795                 /* Defined by the WAP Forum
796                  * "Wireless Datagram Protocol Specification", Wireless Application Protocol Forum Ltd.
797                  */
798                 break;
799         case 15:
800                 /* Data coding / message handling */
801                 proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp15_mess_code, tvb, offset, 1, ENC_BIG_ENDIAN);
802                 proto_tree_add_item(tree, hf_gsm_map_cbs_coding_grp15_class, tvb, offset, 1, ENC_BIG_ENDIAN);
803                 character_set = (octet&0x04)>>2;
804                 if (character_set == 0){
805                         sms_encoding = SMS_ENCODING_7BIT;
806                 }else{
807                         sms_encoding = SMS_ENCODING_8BIT;
808                 }
809                 break;
810         default:
811                 break;
812         }
813
814         return sms_encoding;
815 }
816 void
817 dissect_gsm_map_msisdn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
818 {
819  const char     *digit_str;
820  guint8         octet;
821  guint8         na;
822  guint8         np;
823
824  proto_tree_add_item(tree, hf_gsm_map_extension, tvb, 0,1,ENC_BIG_ENDIAN);
825  proto_tree_add_item(tree, hf_gsm_map_nature_of_number, tvb, 0,1,ENC_BIG_ENDIAN);
826  proto_tree_add_item(tree, hf_gsm_map_number_plan, tvb, 0,1,ENC_BIG_ENDIAN);
827
828  if(tvb_length(tvb)==1)
829          return;
830
831  digit_str = unpack_digits(tvb, 1);
832
833  proto_tree_add_string(tree, hf_gsm_map_address_digits, tvb, 1, -1, digit_str);
834
835  octet = tvb_get_guint8(tvb,0);
836  na = (octet & 0x70)>>4;
837  np = octet & 0x0f;
838  if ((na == 1) && (np==1))/*International Number & E164*/
839         dissect_e164_cc(tvb, tree, 1, TRUE);
840  else if(np==6)
841         dissect_e212_mcc_mnc_in_address(tvb, pinfo, tree, 1);
842
843 }
844
845 #include "packet-gsm_map-fn.c"
846
847 /* Specific translation for MAP V3 */
848 const value_string gsm_map_V1V2_opr_code_strings[] = {
849   {  44, "forwardSM" },
850   {  45, "sendRoutingInfoForSM" },
851   {  46, "forwardSM" },
852   { 0, NULL }
853 };
854 /* Generic translation for MAP operation */
855 const value_string gsm_map_opr_code_strings[] = {
856 #include "packet-gsm_map-table.c"
857   { 0, NULL }
858 };
859 static const value_string gsm_map_err_code_string_vals[] = {
860 #include "packet-gsm_map-table.c"
861     { 0, NULL }
862 };
863 static const true_false_string gsm_map_extension_value = {
864   "No Extension",
865   "Extension"
866 };
867 static const value_string gsm_map_nature_of_number_values[] = {
868         {   0x00,       "unknown" },
869         {   0x01,       "International Number" },
870         {   0x02,       "National Significant Number" },
871         {   0x03,       "Network Specific Number" },
872         {   0x04,       "Subscriber Number" },
873         {   0x05,       "Reserved" },
874         {   0x06,       "Abbreviated Number" },
875         {   0x07,       "Reserved for extension" },
876         { 0, NULL }
877 };
878 static value_string_ext gsm_map_nature_of_number_values_ext = VALUE_STRING_EXT_INIT(gsm_map_nature_of_number_values);
879
880 static const value_string gsm_map_number_plan_values[] = {
881         {   0x00,       "unknown" },
882         {   0x01,       "ISDN/Telephony Numbering (Rec ITU-T E.164)" },
883         {   0x02,       "spare" },
884         {   0x03,       "Data Numbering (ITU-T Rec. X.121)" },
885         {   0x04,       "Telex Numbering (ITU-T Rec. F.69)" },
886         {   0x05,       "spare" },
887         {   0x06,       "Land Mobile Numbering (ITU-T Rec. E.212)" },
888         {   0x07,       "spare" },
889         {   0x08,       "National Numbering" },
890         {   0x09,       "Private Numbering" },
891         {   0x0a,       "spare" },
892         {   0x0b,       "spare" },
893         {   0x0c,       "spare" },
894         {   0x0d,       "spare" },
895         {   0x0e,       "spare" },
896         {   0x0f,       "Reserved for extension" },
897         { 0, NULL }
898 };
899 static value_string_ext gsm_map_number_plan_values_ext = VALUE_STRING_EXT_INIT(gsm_map_number_plan_values);
900
901 static const true_false_string gsm_map_Ss_Status_q_bit_values = {
902   "Quiescent",
903   "Operative"
904 };
905 static const true_false_string gsm_map_Ss_Status_p_values = {
906   "Provisioned",
907   "Not Provisioned"
908 };
909 static const true_false_string gsm_map_Ss_Status_r_values = {
910   "Registered",
911   "Not Registered"
912 };
913 static const true_false_string gsm_map_Ss_Status_a_values = {
914   "Active",
915   "not Active"
916 };
917
918 /*
919  * Translate the MAP operation code value to a text string
920  * Take into account the MAP version for ForwardSM
921  */
922 const gchar* gsm_map_opr_code(guint32 val) {
923   switch (val) {
924   case 44: /*mt-forwardSM*/
925           /* FALLTHRU */
926   case 46: /*mo-forwardSM*/
927           /* FALLTHRU */
928     if (application_context_version < 3) {
929       return val_to_str_const(val, gsm_map_V1V2_opr_code_strings, "Unknown GSM-MAP opcode");
930     }
931     /* Else use the default map operation translation */
932   default:
933     return val_to_str_ext_const(val, &gsm_old_GSMMAPOperationLocalvalue_vals_ext, "Unknown GSM-MAP opcode");
934     break;
935   }
936 }
937
938 /* Prototype for a decoding function */
939 typedef int (* dissect_function_t)( gboolean,
940                                     tvbuff_t *,
941                                     int ,
942                                         asn1_ctx_t *,
943                                     proto_tree *,
944                                     int);
945
946 /*
947  * Dissect Multiple Choice Message
948  * This function is used to decode a message, when several encoding may be used.
949  * For exemple, in the last MAP version, the Cancel Location is defined like this:
950  * CancelLocationArg ::= [3] IMPLICIT SEQUENCE
951  * But in the previous MAP version, it was a CHOICE between a SEQUENCE and an IMSI
952  * As ASN1 encoders (or software) still uses the old encoding, this function allows
953  * the decoding of both versions.
954  * Moreover, some optimizations (or bad practice ?) in ASN1 encoder, removes the
955  * SEQUENCE tag, when only one parameter is present in the SEQUENCE.
956  * This explain why the function expects 3 parameters:
957  * - a [3] SEQUENCE corresponding the recent ASN1 MAP encoding
958  * - a SEQUENCE for old style
959  * - and a single parameter, for old version or optimizations
960  *
961  * The analyze of the first ASN1 tag, indicate what kind of decoding should be used,
962  * if the decoding function is provided (so not a NULL function)
963  */
964 static int dissect_mc_message(tvbuff_t *tvb,
965                               int offset,
966                                   asn1_ctx_t *actx,
967                               proto_tree *tree,
968                               gboolean implicit_param _U_, dissect_function_t parameter, int hf_index_param _U_,
969                               gboolean implicit_seq   _U_, dissect_function_t sequence,  int hf_index_seq   _U_,
970                               gboolean implicit_seq3 _U_, dissect_function_t sequence3, int hf_index_seq3 _U_ )
971 {
972   guint8 octet;
973   gint8 bug_class;
974   gboolean bug_pc, bug_ind_field;
975   gint32 bug_tag;
976   guint32 bug_len;
977   proto_item *cause;
978
979   octet = tvb_get_guint8(tvb,0);
980   if ( (octet & 0xf) == 3) {
981     /* XXX  asn2wrs can not yet handle tagged assignment yes so this
982      * XXX is some conformance file magic to work around that bug
983      */
984     offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
985     offset = get_ber_length(tvb, offset, &bug_len, &bug_ind_field);
986     if (sequence3 != NULL) {
987       offset= (sequence3) (implicit_seq3, tvb, offset, actx, tree, hf_index_seq3);
988     } else {
989       cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown or not implemented [3] sequence, cannot decode");
990       expert_add_info(actx->pinfo, cause, &ei_gsm_map_unknown_sequence3);
991     }
992   } else if (octet == 0x30) {
993     if (sequence != NULL) {
994       offset= (sequence) (implicit_seq, tvb, 0, actx, tree, hf_index_seq);
995     } else {
996       cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown or not implemented sequence");
997       expert_add_info(actx->pinfo, cause, &ei_gsm_map_unknown_sequence);
998     }
999   } else {
1000     if (parameter != NULL) {
1001       offset= (parameter) (implicit_param, tvb, offset, actx, tree, hf_index_param);
1002     } else {
1003       cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown or not implemented parameter");
1004       expert_add_info(actx->pinfo, cause, &ei_gsm_map_unknown_parameter);
1005     }
1006   }
1007   return offset;
1008 }
1009
1010 static int dissect_invokeData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx) {
1011
1012   proto_item *cause;
1013
1014   switch(opcode){
1015   case  2: /*updateLocation*/
1016     offset=dissect_gsm_map_ms_UpdateLocationArg(FALSE, tvb, offset, actx, tree, -1);
1017     break;
1018   case  3: /*cancelLocation*/
1019     offset=dissect_mc_message(tvb, offset, actx, tree,
1020                               FALSE, dissect_gsm_map_Identity, hf_gsm_map_ms_identity,
1021                               FALSE, dissect_gsm_map_Identity, hf_gsm_map_ms_identity,
1022                               TRUE , dissect_gsm_map_ms_CancelLocationArg, -1);/*undefined*/
1023     break;
1024   case  4: /*provideRoamingNumber*/
1025     offset=dissect_gsm_map_ch_ProvideRoamingNumberArg(FALSE, tvb, offset, actx, tree, -1);
1026     break;
1027   case  5: /*noteSubscriberDataModified*/
1028     offset=dissect_gsm_map_ms_NoteSubscriberDataModifiedArg(FALSE, tvb, offset, actx, tree, -1);
1029     break;
1030   case  6: /*resumeCallHandling*/
1031     offset=dissect_gsm_map_ch_ResumeCallHandlingArg(FALSE, tvb, offset, actx, tree, -1);
1032     break;
1033   case  7: /*insertSubscriberData*/
1034     offset=dissect_gsm_map_ms_InsertSubscriberDataArg(FALSE, tvb, offset, actx, tree, -1);
1035     break;
1036   case  8: /*deleteSubscriberData*/
1037     offset=dissect_gsm_map_ms_DeleteSubscriberDataArg(FALSE, tvb, offset, actx, tree, -1);
1038     break;
1039     /* TODO find out why this isn't in the ASN1 file */
1040     /* reserved sendParameters (9) */
1041   case  10: /*registerSS*/
1042     offset=dissect_gsm_map_ss_RegisterSS_Arg(FALSE, tvb, offset, actx, tree, -1);
1043     break;
1044   case  11: /*eraseSS*/
1045     offset=dissect_gsm_map_ss_SS_ForBS_Code(FALSE, tvb, offset, actx, tree, -1);
1046     break;
1047   case 12: /*activateSS*/
1048     offset=dissect_gsm_map_ss_SS_ForBS_Code(FALSE, tvb, offset, actx, tree, -1);
1049     break;
1050   case 13: /*deactivateSS*/
1051     offset=dissect_gsm_map_ss_SS_ForBS_Code(FALSE, tvb, offset, actx, tree, -1);
1052     break;
1053   case 14: /*interrogateSS*/
1054     offset=dissect_gsm_map_ss_SS_ForBS_Code(FALSE, tvb, offset, actx, tree, -1);
1055     break;
1056   case 15: /*authenticationFailureReport*/
1057     offset=dissect_gsm_map_ms_AuthenticationFailureReportArg(FALSE, tvb, offset, actx, tree, -1);
1058     break;
1059   case 16: /*SS-protocol notifySS*/
1060     offset=dissect_gsm_ss_NotifySS_Arg(FALSE, tvb, offset, actx, tree, -1);
1061     break;
1062   case 17: /*registerPassword*/
1063     offset=dissect_gsm_map_SS_Code(FALSE, tvb, offset, actx, tree, hf_gsm_map_ss_Code);
1064     break;
1065   case 18: /*getPassword*/
1066     offset=dissect_gsm_old_GetPasswordArg(FALSE, tvb, offset, actx, tree, hf_gsm_map_getPassword);
1067     break;
1068   case 19: /* SS-Protocol processUnstructuredSS-Data (19) */
1069     offset=dissect_gsm_ss_SS_UserData(FALSE, tvb, offset, actx, tree, hf_gsm_map_ss_SS_UserData);
1070     break;
1071   case 20: /*releaseResources*/
1072     offset=dissect_gsm_map_ch_ReleaseResourcesArg(FALSE, tvb, offset, actx, tree, -1);
1073     break;
1074   case 21: /*mt-ForwardSM-VGCS*/
1075     offset=dissect_gsm_map_sm_MT_ForwardSM_VGCS_Arg(FALSE, tvb, offset, actx, tree, -1);
1076     break;
1077   case 22: /*sendRoutingInfo*/
1078           if (application_context_version == 3){
1079                   offset=dissect_gsm_map_ch_SendRoutingInfoArg(FALSE, tvb, offset, actx, tree, -1);
1080           }else{
1081                   offset=dissect_gsm_old_SendRoutingInfoArgV2(FALSE, tvb, offset, actx, tree, -1);
1082           }
1083     break;
1084   case 23: /*updateGprsLocation*/
1085     offset=dissect_gsm_map_ms_UpdateGprsLocationArg(FALSE, tvb, offset, actx, tree, -1);
1086     break;
1087   case 24: /*sendRoutingInfoForGprs*/
1088     offset=dissect_gsm_map_ms_SendRoutingInfoForGprsArg(FALSE, tvb, offset, actx, tree, -1);
1089     break;
1090   case 25: /*failureReport*/
1091     offset=dissect_gsm_map_ms_FailureReportArg(FALSE, tvb, offset, actx, tree, -1);
1092     break;
1093   case 26: /*noteMsPresentForGprs*/
1094     offset=dissect_gsm_map_ms_NoteMsPresentForGprsArg(FALSE, tvb, offset, actx, tree, -1);
1095     break;
1096     /* undefined 27 */
1097     /* reserved performHandover (28) */
1098   case 29: /*sendEndSignal*/
1099     offset=dissect_mc_message(tvb, offset, actx, tree,
1100                               FALSE, NULL, -1,
1101                               FALSE, dissect_gsm_old_Bss_APDU, -1,
1102                               TRUE , dissect_gsm_map_ms_SendEndSignal_Arg, -1);
1103     break;
1104     /* reserved performSubsequentHandover (30) */
1105   case 31: /*provideSIWFSNumber*/
1106     offset=dissect_gsm_old_ProvideSIWFSNumberArg(FALSE, tvb, offset, actx, tree, -1);
1107     break;
1108   case 32: /*sIWFSSignallingModify*/
1109     offset=dissect_gsm_old_SIWFSSignallingModifyArg(FALSE, tvb, offset, actx, tree, -1);
1110     break;
1111   case 33: /*processAccessSignalling*/
1112     offset=dissect_mc_message(tvb, offset, actx, tree,
1113                               FALSE, NULL, -1,
1114                               FALSE, dissect_gsm_old_Bss_APDU, -1,
1115                               TRUE , dissect_gsm_map_ms_ProcessAccessSignalling_Arg, -1);
1116     break;
1117   case 34: /*forwardAccessSignalling*/
1118     offset=dissect_mc_message(tvb, offset, actx, tree,
1119                               FALSE, NULL, -1,
1120                               FALSE, dissect_gsm_old_Bss_APDU, -1,
1121                               TRUE , dissect_gsm_map_ms_ForwardAccessSignalling_Arg, -1);
1122     break;
1123     /* reserved noteInternalHandover (35) */
1124     /* undefined 36 */
1125   case 37: /*reset*/
1126     offset=dissect_gsm_map_ms_ResetArg(FALSE, tvb, offset, actx, tree, -1);
1127     break;
1128   case 38: /*forwardCheckSS-Indication*/
1129     return offset;
1130     break;
1131   case 39: /*prepareGroupCall*/
1132     offset=dissect_gsm_map_gr_PrepareGroupCallArg(FALSE, tvb, offset, actx, tree, -1);
1133     break;
1134   case 40: /*sendGroupCallEndSignal*/
1135     offset = dissect_gsm_map_gr_SendGroupCallEndSignalArg(FALSE, tvb, offset, actx, tree, -1);
1136     break;
1137   case 41: /*processGroupCallSignalling*/
1138     offset = dissect_gsm_map_gr_ProcessGroupCallSignallingArg(FALSE, tvb, offset, actx, tree, -1);
1139     break;
1140   case 42: /*forwardGroupCallSignalling*/
1141     offset=dissect_gsm_map_gr_ForwardGroupCallSignallingArg(FALSE, tvb, offset, actx, tree, -1);
1142     break;
1143   case 43: /*checkIMEI*/
1144     if (pref_ericsson_proprietary_ext) {
1145       offset=dissect_mc_message(tvb, offset, actx, tree,
1146                     FALSE, dissect_gsm_map_IMEI, hf_gsm_map_ms_imei,
1147                     FALSE, dissect_gsm_map_ericsson_EnhancedCheckIMEI_Arg, -1,
1148                     TRUE , NULL, -1); /* no [3] SEQUENCE */
1149     } else {
1150       offset=dissect_mc_message(tvb, offset, actx, tree,
1151                     FALSE, dissect_gsm_map_IMEI, hf_gsm_map_ms_imei,
1152                     FALSE, dissect_gsm_map_ms_CheckIMEI_Arg, -1,
1153                     TRUE , NULL, -1); /* no [3] SEQUENCE */
1154     }
1155     break;
1156   case 44: /*mt-forwardSM(v3) or ForwardSM(v1/v2)*/
1157     if (application_context_version == 3)
1158       offset=dissect_gsm_map_sm_MT_ForwardSM_Arg(FALSE, tvb, offset, actx, tree, -1);
1159     else {
1160       offset=dissect_gsm_old_ForwardSM_Arg(FALSE, tvb, offset, actx, tree, -1);
1161     }
1162     break;
1163   case 45: /*sendRoutingInfoForSM*/
1164     offset=dissect_gsm_map_sm_RoutingInfoForSM_Arg(FALSE, tvb, offset, actx, tree, -1);
1165     break;
1166   case 46: /*mo-forwardSM(v3) or ForwardSM(v1/v2)*/
1167     if (application_context_version == 3)
1168       offset=dissect_gsm_map_sm_MO_ForwardSM_Arg(FALSE, tvb, offset, actx, tree, -1);
1169     else {
1170       offset=dissect_gsm_old_ForwardSM_Arg(FALSE, tvb, offset, actx, tree, -1);
1171     }
1172     break;
1173   case 47: /*reportSM-DeliveryStatus*/
1174     offset=dissect_gsm_map_sm_ReportSM_DeliveryStatusArg(FALSE, tvb, offset, actx, tree, -1);
1175     break;
1176     /* reserved noteSubscriberPresent (48) */
1177     /* reserved alertServiceCentreWithoutResult (49)
1178          * ETS 300 599: December 2000 (GSM 09.02 version 4.19.1)
1179          * -- alertServiceCentreWithoutResult must not be used in
1180          * -- version greater 1
1181          */
1182   case 49:
1183         offset = dissect_gsm_map_sm_AlertServiceCentreArg(FALSE, tvb, offset, actx, tree, -1);
1184         break;
1185   case 50: /*activateTraceMode*/
1186     offset=dissect_gsm_map_om_ActivateTraceModeArg(FALSE, tvb, offset, actx, tree, -1);
1187     break;
1188   case 51: /*deactivateTraceMode*/
1189     offset=dissect_gsm_map_om_DeactivateTraceModeArg(FALSE, tvb, offset, actx, tree, -1);
1190     break;
1191     /* reserved traceSubscriberActivity (52) */
1192     /* undefined 53 */
1193   case 54: /*beginSubscriberActivity*/
1194     offset=dissect_gsm_old_BeginSubscriberActivityArg(FALSE, tvb, offset, actx, tree, -1);
1195     break;
1196   case 55: /*sendIdentification*/
1197     offset=dissect_mc_message(tvb, offset, actx, tree,
1198                               FALSE, dissect_gsm_map_TMSI, hf_gsm_map_tmsi,
1199                               FALSE, dissect_gsm_map_ms_SendIdentificationArg, -1,
1200                               TRUE,  NULL, -1);
1201     break;
1202   case 56: /*sendAuthenticationInfo*/
1203     offset=dissect_mc_message(tvb, offset, actx, tree,
1204                               FALSE, dissect_gsm_map_IMSI, hf_gsm_map_imsi,
1205                               FALSE, dissect_gsm_map_ms_SendAuthenticationInfoArg, -1,
1206                               TRUE,  NULL, -1);
1207     break;
1208   case 57: /*restoreData*/
1209     offset=dissect_gsm_map_ms_RestoreDataArg(FALSE, tvb, offset, actx, tree, -1);
1210     break;
1211   case 58: /*sendIMSI*/
1212     offset = dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, actx, tree, hf_gsm_map_msisdn);
1213     break;
1214   case 59: /*processUnstructuredSS-Request*/
1215     offset=dissect_gsm_map_ss_USSD_Arg(FALSE, tvb, offset, actx, tree, -1);
1216     break;
1217   case 60: /*unstructuredSS-Request*/
1218     offset=dissect_gsm_map_ss_USSD_Arg(FALSE, tvb, offset, actx, tree, -1);
1219     break;
1220   case 61: /*unstructuredSS-Notify*/
1221     offset=dissect_gsm_map_ss_USSD_Arg(FALSE, tvb, offset, actx, tree, -1);
1222     break;
1223   case 62: /*AnyTimeSubscriptionInterrogation*/
1224     offset=dissect_gsm_map_ms_AnyTimeSubscriptionInterrogationArg(FALSE, tvb, offset, actx, tree, -1);
1225     break;
1226   case 63: /*informServiceCentre*/
1227     offset=dissect_gsm_map_sm_InformServiceCentreArg(FALSE, tvb, offset, actx, tree, -1);
1228     break;
1229   case 64: /*alertServiceCentre*/
1230     offset=dissect_gsm_map_sm_AlertServiceCentreArg(FALSE, tvb, offset, actx, tree, -1);
1231     break;
1232   case 65: /*AnyTimeModification*/
1233     offset=dissect_gsm_map_ms_AnyTimeModificationArg(FALSE, tvb, offset, actx, tree, -1);
1234     break;
1235   case 66: /*readyForSM*/
1236     offset=dissect_gsm_map_sm_ReadyForSM_Arg(FALSE, tvb, offset, actx, tree, -1);
1237     break;
1238   case 67: /*purgeMS*/
1239     offset=dissect_mc_message(tvb, offset, actx, tree,
1240                               FALSE, dissect_gsm_map_IMSI, hf_gsm_map_imsi,
1241                               FALSE, dissect_gsm_old_PurgeMSArgV2, -1, /*undefined*/
1242                               TRUE , dissect_gsm_map_ms_PurgeMS_Arg, -1);
1243     break;
1244   case 68: /*prepareHandover*/
1245     offset=dissect_mc_message(tvb, offset, actx, tree,
1246                               FALSE, NULL, -1,
1247                               FALSE, dissect_gsm_old_PrepareHO_ArgOld, -1,
1248                               TRUE, dissect_gsm_map_ms_PrepareHO_Arg, -1);
1249     break;
1250   case 69: /*prepareSubsequentHandover*/
1251     offset=dissect_mc_message(tvb, offset, actx, tree,
1252                               FALSE, NULL, -1,
1253                               FALSE, NULL, -1,
1254                               TRUE, dissect_gsm_map_ms_PrepareSubsequentHO_Arg, -1);
1255     break;
1256   case 70: /*provideSubscriberInfo*/
1257     offset=dissect_gsm_map_ms_ProvideSubscriberInfoArg(FALSE, tvb, offset, actx, tree, -1);
1258     break;
1259   case 71: /*anyTimeInterrogation*/
1260     offset=dissect_gsm_map_ms_AnyTimeInterrogationArg(FALSE, tvb, offset, actx, tree, -1);
1261     break;
1262   case 72: /*ss-InvocationNotificatio*/
1263     offset=dissect_gsm_map_ss_SS_InvocationNotificationArg(FALSE, tvb, offset, actx, tree, -1);
1264     break;
1265   case 73: /*setReportingState*/
1266     offset=dissect_gsm_map_ch_SetReportingStateArg(FALSE, tvb, offset, actx, tree, -1);
1267     break;
1268   case 74: /*statusReport*/
1269     offset=dissect_gsm_map_ch_StatusReportArg(FALSE, tvb, offset, actx, tree, -1);
1270     break;
1271   case 75: /*remoteUserFree*/
1272     offset=dissect_gsm_map_ch_RemoteUserFreeArg(FALSE, tvb, offset, actx, tree, -1);
1273     break;
1274   case 76: /*registerCC-Entry*/
1275     offset=dissect_gsm_map_ss_RegisterCC_EntryArg(FALSE, tvb, offset, actx, tree, -1);
1276     break;
1277   case 77: /*eraseCC-Entry*/
1278     offset=dissect_gsm_map_ss_EraseCC_EntryArg(FALSE, tvb, offset, actx, tree, -1);
1279     break;
1280   case 78: /*secureTransportClass1*/
1281   case 79: /*secureTransportClass1*/
1282   case 80: /*secureTransportClass1*/
1283   case 81: /*secureTransportClass1*/
1284     offset=dissect_gsm_old_SecureTransportArg(FALSE, tvb, offset, actx, tree, -1);
1285     break;
1286     /* undefined 82 */
1287   case 83: /*provideSubscriberLocation*/
1288     offset=dissect_gsm_map_lcs_ProvideSubscriberLocation_Arg(FALSE, tvb, offset, actx, tree, -1);
1289     break;
1290   case 84: /*sendGroupCallInfo*/
1291     offset=dissect_gsm_map_gr_SendGroupCallInfoArg(FALSE, tvb, offset, actx, tree, -1);
1292     break;
1293   case 85: /*sendRoutingInfoForLCS*/
1294     offset=dissect_gsm_map_lcs_RoutingInfoForLCS_Arg(FALSE, tvb, offset, actx, tree, -1);
1295     break;
1296   case 86: /*subscriberLocationReport*/
1297     offset=dissect_gsm_map_lcs_SubscriberLocationReport_Arg(FALSE, tvb, offset, actx, tree, -1);
1298     break;
1299   case 87: /*ist-Alert*/
1300     offset=dissect_gsm_map_ch_IST_AlertArg(FALSE, tvb, offset, actx, tree, -1);
1301     break;
1302   case 88: /*ist-Command*/
1303     offset=dissect_gsm_map_ch_IST_CommandArg(FALSE, tvb, offset, actx, tree, -1);
1304     break;
1305   case 89: /*noteMM-Event*/
1306     offset=dissect_gsm_map_ms_NoteMM_EventArg(FALSE, tvb, offset, actx, tree, -1);
1307     break;
1308   case 109: /*SS-protocol lcs-PeriodicLocationCancellation*/
1309     offset=dissect_gsm_ss_LCS_PeriodicLocationCancellationArg(FALSE, tvb, offset, actx, tree, -1);
1310     break;
1311   case 110: /*SS-protocol lcs-LocationUpdate*/
1312     offset=dissect_gsm_ss_LCS_LocationUpdateArg(FALSE, tvb, offset, actx, tree, -1);
1313     break;
1314   case 111: /*SS-protocol lcs-PeriodicLocationRequest*/
1315     offset=dissect_gsm_ss_LCS_PeriodicLocationRequestArg(FALSE, tvb, offset, actx, tree, -1);
1316     break;
1317   case 112: /*SS-protocol lcs-AreaEventCancellation*/
1318     offset=dissect_gsm_ss_LCS_AreaEventCancellationArg(FALSE, tvb, offset, actx, tree, -1);
1319     break;
1320   case 113: /*SS-protocol lcs-AreaEventReport*/
1321     offset=dissect_gsm_ss_LCS_AreaEventReportArg(FALSE, tvb, offset, actx, tree, -1);
1322     break;
1323   case 114: /*SS-protocol lcs-AreaEventRequest*/
1324     offset=dissect_gsm_ss_LCS_AreaEventRequestArg(FALSE, tvb, offset, actx, tree, -1);
1325     break;
1326   case 115: /*SS-protocol lcs-MOLR*/
1327     offset=dissect_gsm_ss_LCS_MOLRArg(FALSE, tvb, offset, actx, tree, -1);
1328     break;
1329   case 116: /*SS-protocol lcs-LocationNotification*/
1330     offset=dissect_gsm_ss_LocationNotificationArg(FALSE, tvb, offset, actx, tree, -1);
1331     break;
1332   case 117: /*SS-protocol callDeflection*/
1333     offset=dissect_gsm_ss_CallDeflectionArg(FALSE, tvb, offset, actx, tree, -1);
1334     break;
1335   case 118: /*SS-protocol userUserService*/
1336     offset=dissect_gsm_ss_UserUserServiceArg(FALSE, tvb, offset, actx, tree, -1);
1337     break;
1338   case 119: /*SS-protocol accessRegisterCCEntry*/
1339     offset=dissect_gsm_ss_AccessRegisterCCEntryArg(FALSE, tvb, offset, actx, tree, -1);
1340     break;
1341   case 120: /*SS-protocol forwardCUG-Info*/
1342         application_context_version = 3;
1343     offset=dissect_gsm_ss_ForwardCUG_InfoArg(FALSE, tvb, offset, actx, tree, -1);
1344     break;
1345   case 121: /*SS-protocol splitMPTY no Argument*/
1346     break;
1347   case 122: /*SS-protocol retrieveMPTY no Argument*/
1348     break;
1349   case 123: /*SS-protocol holdMPTY no Argument*/
1350     break;
1351   case 124: /*SS-protocol buildMPTY no Argument*/
1352     break;
1353   case 125: /*SS-protocol forwardChargeAdvice*/
1354     offset=dissect_gsm_ss_ForwardChargeAdviceArg(FALSE, tvb, offset, actx, tree, -1);
1355     break;
1356   case 126: /*SS-protocol explicitCT no Argument*/
1357     break;
1358   default:
1359     if(!dissector_try_uint(map_prop_arg_opcode_table, (guint8)opcode, tvb, actx->pinfo, tree)){
1360         cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown invokeData blob");
1361         expert_add_info_format_text(actx->pinfo, cause, &ei_gsm_map_unknown_invokeData, "Unknown invokeData %d",opcode);
1362         }
1363         offset+= tvb_length_remaining(tvb,offset);
1364         break;
1365   }
1366   return offset;
1367 }
1368
1369
1370 static int dissect_returnResultData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx) {
1371
1372   proto_item *cause;
1373
1374   switch(opcode){
1375   case  2: /*updateLocation*/
1376     offset=dissect_mc_message(tvb, offset, actx, tree,
1377                               FALSE, dissect_gsm_map_IMSI, hf_gsm_map_imsi,
1378                               FALSE, dissect_gsm_map_ms_UpdateLocationRes, -1,
1379                               TRUE , NULL, -1);
1380     break;
1381   case  3: /*cancelLocation*/
1382     offset=dissect_gsm_map_ms_CancelLocationRes(FALSE, tvb, offset, actx, tree, -1);
1383     break;
1384   case  4: /*provideRoamingNumber*/
1385     offset=dissect_mc_message(tvb, offset, actx, tree,
1386                               FALSE, dissect_gsm_map_ISDN_AddressString, hf_gsm_map_msisdn,
1387                               FALSE, dissect_gsm_map_ch_ProvideRoamingNumberRes, -1,
1388                               TRUE , NULL, -1);/*undefined*/
1389     break;
1390   case  5: /*noteSubscriberDataModified*/
1391     offset=dissect_gsm_map_ms_NoteSubscriberDataModifiedRes(FALSE, tvb, offset, actx, tree, -1);
1392     break;
1393   case  6: /*resumeCallHandling*/
1394     offset=dissect_gsm_map_ch_ResumeCallHandlingRes(FALSE, tvb, offset, actx, tree, -1);
1395     break;
1396   case  7: /*insertSubscriberData*/
1397     offset=dissect_gsm_map_ms_InsertSubscriberDataRes(FALSE, tvb, offset, actx, tree, -1);
1398     break;
1399   case  8: /*deleteSubscriberData*/
1400     offset=dissect_gsm_map_ms_DeleteSubscriberDataRes(FALSE, tvb, offset, actx, tree, -1);
1401     break;
1402         /* TODO find out why this isn't in the ASN1 file
1403   case  9: sendParameters
1404     offset=dissect_gsm_map_DeleteSubscriberDataArg(FALSE, tvb, offset, actx, tree, -1);
1405     break;
1406         */
1407   case  10: /*registerSS*/
1408     offset=dissect_gsm_map_ss_SS_Info(FALSE, tvb, offset, actx, tree, -1);
1409     break;
1410   case  11: /*eraseSS*/
1411     offset=dissect_gsm_map_ss_SS_Info(FALSE, tvb, offset, actx, tree, -1);
1412     break;
1413   case 12: /*activateSS*/
1414     offset=dissect_gsm_map_ss_SS_Info(FALSE, tvb, offset, actx, tree, -1);
1415     break;
1416   case 13: /*deactivateSS*/
1417     offset=dissect_gsm_map_ss_SS_Info(FALSE, tvb, offset, actx, tree, -1);
1418     break;
1419   case 14: /*interrogateSS*/
1420     offset=dissect_gsm_map_ss_InterrogateSS_Res(FALSE, tvb, offset, actx, tree, -1);
1421     break;
1422   case 15: /*authenticationFailureReport*/
1423     offset=dissect_gsm_map_ms_AuthenticationFailureReportRes(FALSE, tvb, offset, actx, tree, -1);
1424     break;
1425   case 17: /*registerPassword*/
1426     /* change hf_gsm_map_ss_Code to something with password */
1427     offset=dissect_gsm_old_NewPassword(FALSE, tvb, offset, actx, tree, hf_gsm_map_ss_Code);
1428     break;
1429   case 18: /*getPassword*/
1430     offset=dissect_gsm_old_CurrentPassword(FALSE, tvb, offset, actx, tree, hf_gsm_map_currentPassword);
1431     break;
1432   case 19: /* SS-Protocol processUnstructuredSS-Data (19) */
1433     offset=dissect_gsm_ss_SS_UserData(FALSE, tvb, offset, actx, tree, hf_gsm_map_ss_SS_UserData);
1434     break;
1435   case 20: /*releaseResources*/
1436     offset=dissect_gsm_map_ch_ReleaseResourcesRes(FALSE, tvb, offset, actx, tree, -1);
1437     break;
1438   case 21: /*mt-ForwardSM-VGCS*/
1439     offset=dissect_gsm_map_sm_MT_ForwardSM_VGCS_Res(FALSE, tvb, offset, actx, tree, -1);
1440     break;
1441   case 22: /*sendRoutingInfo*/
1442           if (application_context_version == 3){
1443                   /* If the tag is missing use SendRoutingInfoRes_U */
1444                   offset=dissect_mc_message(tvb, offset, actx, tree,
1445                               FALSE, NULL, -1,
1446                               FALSE, dissect_gsm_map_ch_SendRoutingInfoRes_U, -1,
1447                               TRUE , dissect_gsm_map_ch_SendRoutingInfoRes, -1);
1448           }else{
1449                   offset=dissect_mc_message(tvb, offset, actx, tree,
1450                               FALSE, dissect_gsm_map_IMSI, hf_gsm_map_imsi,
1451                               FALSE, dissect_gsm_old_SendRoutingInfoResV2, -1,
1452                               TRUE , dissect_gsm_map_ch_SendRoutingInfoRes, -1);
1453           }
1454     break;
1455   case 23: /*updateGprsLocation*/
1456     offset=dissect_gsm_map_ms_UpdateGprsLocationRes(FALSE, tvb, offset, actx, tree, -1);
1457     break;
1458   case 24: /*sendRoutingInfoForGprs*/
1459     offset=dissect_gsm_map_ms_SendRoutingInfoForGprsRes(FALSE, tvb, offset, actx, tree, -1);
1460     break;
1461   case 25: /*failureReport*/
1462     offset=dissect_gsm_map_ms_FailureReportRes(FALSE, tvb, offset, actx, tree, -1);
1463     break;
1464   case 26: /*noteMsPresentForGprs*/
1465     offset=dissect_gsm_map_ms_NoteMsPresentForGprsRes(FALSE, tvb, offset, actx, tree, -1);
1466     break;
1467   case 29: /*sendEndSignal*/
1468           /* Taken from MAP-MobileServiceOperations{ 0 identified-organization (4) etsi (0) mobileDomain
1469            * (0) gsm-Network (1) modules (3) map-MobileServiceOperations (5) version9 (9) }
1470            */
1471     offset=dissect_gsm_map_ms_SendEndSignal_Res(FALSE, tvb, offset, actx, tree, -1);
1472     break;
1473   case 31: /*provideSIWFSNumber*/
1474     offset=dissect_gsm_old_ProvideSIWFSNumberRes(FALSE, tvb, offset, actx, tree, -1);
1475     break;
1476   case 32: /*provideSIWFSSignallingModify*/
1477     offset=dissect_gsm_old_SIWFSSignallingModifyRes(FALSE, tvb, offset, actx, tree, -1);
1478     break;
1479   case 39: /*prepareGroupCall*/
1480     offset=dissect_gsm_map_gr_PrepareGroupCallRes(FALSE, tvb, offset, actx, tree, -1);
1481     break;
1482   case 40: /*sendGroupCallEndSignal*/
1483     offset=dissect_gsm_map_gr_SendGroupCallEndSignalRes(FALSE, tvb, offset, actx, tree, -1);
1484     break;
1485   case 43: /*checkIMEI*/
1486     offset=dissect_mc_message(tvb, offset, actx, tree,
1487                               FALSE, dissect_gsm_map_ms_EquipmentStatus, hf_gsm_map_ms_equipmentStatus,
1488                               FALSE, dissect_gsm_map_ms_CheckIMEI_Res, -1,
1489                               TRUE,  NULL, -1);
1490     break;
1491   case 44: /*mt-forwardSM*/
1492     offset=dissect_gsm_map_sm_MT_ForwardSM_Res(FALSE, tvb, offset, actx, tree, -1);
1493     break;
1494   case 45: /*sendRoutingInfoForSM*/
1495     offset=dissect_gsm_map_sm_RoutingInfoForSM_Res(FALSE, tvb, offset, actx, tree, -1);
1496     break;
1497   case 46: /*mo-forwardSM*/
1498     offset=dissect_gsm_map_sm_MO_ForwardSM_Res(FALSE, tvb, offset, actx, tree, -1);
1499     break;
1500   case 47: /*reportSM-DeliveryStatus*/
1501     offset=dissect_mc_message(tvb, offset, actx, tree,
1502                               FALSE, dissect_gsm_map_ISDN_AddressString, hf_gsm_map_sm_storedMSISDN,
1503                               FALSE, NULL, -1,
1504                               FALSE , dissect_gsm_map_sm_ReportSM_DeliveryStatusRes, -1);/*undefined*/
1505
1506     break;
1507   case 48: /*noteSubscriberPresent*/
1508     break;
1509   case 50: /*activateTraceMode*/
1510     offset=dissect_gsm_map_om_ActivateTraceModeRes(FALSE, tvb, offset, actx, tree, -1);
1511     break;
1512   case 51: /*deactivateTraceMode*/
1513     offset=dissect_gsm_map_om_DeactivateTraceModeRes(FALSE, tvb, offset, actx, tree, -1);
1514     break;
1515   case 55: /*sendIdentification */
1516     offset=dissect_mc_message(tvb, offset, actx, tree,
1517                               FALSE, dissect_gsm_map_IMSI, hf_gsm_map_imsi,
1518                               FALSE, dissect_gsm_old_SendIdentificationResV2, -1,/*undefined*/
1519                               TRUE,  dissect_gsm_map_ms_SendIdentificationRes, -1);
1520     break;
1521   case 56: /*sendAuthenticationInfo*/
1522     offset=dissect_mc_message(tvb, offset, actx, tree,
1523                               FALSE, NULL, -1,
1524                               FALSE, dissect_gsm_old_SendAuthenticationInfoResOld, -1,
1525                               TRUE , dissect_gsm_map_ms_SendAuthenticationInfoRes, -1);
1526     break;
1527   case 57: /*restoreData*/
1528     offset=dissect_gsm_map_ms_RestoreDataRes(FALSE, tvb, offset, actx, tree, -1);
1529     break;
1530   case 58: /*sendIMSI*/
1531     offset=dissect_gsm_map_IMSI(FALSE, tvb, offset, actx, tree, hf_gsm_map_ms_imsi);
1532     break;
1533   case 59: /*unstructuredSS-Request*/
1534     offset=dissect_gsm_map_ss_USSD_Res(FALSE, tvb, offset, actx, tree, -1);
1535     break;
1536   case 60: /*unstructuredSS-Request*/
1537     offset=dissect_gsm_map_ss_USSD_Res(FALSE, tvb, offset, actx, tree, -1);
1538     break;
1539   case 61: /*unstructuredSS-Notify*/
1540     /* TRUE ? */
1541     proto_tree_add_text(tree, tvb, offset, -1, "Unknown returnResultData blob");
1542     break;
1543   case 62: /*AnyTimeSubscriptionInterrogation*/
1544     offset=dissect_gsm_map_ms_AnyTimeSubscriptionInterrogationRes(FALSE, tvb, offset, actx, tree, -1);
1545     break;
1546   case 64: /*alertServiceCentre*/
1547     /* TRUE */
1548     break;
1549   case 65: /*AnyTimeModification*/
1550     offset=dissect_gsm_map_ms_AnyTimeModificationRes(FALSE, tvb, offset, actx, tree, -1);
1551     break;
1552   case 66: /*readyForSM*/
1553     offset=dissect_gsm_map_sm_ReadyForSM_Res(FALSE, tvb, offset, actx, tree, -1);
1554     break;
1555   case 67: /*purgeMS*/
1556     offset=dissect_gsm_map_ms_PurgeMS_Res(FALSE, tvb, offset, actx, tree, -1);
1557     break;
1558   case 68: /*prepareHandover*/
1559     offset=dissect_mc_message(tvb, offset, actx, tree,
1560                               FALSE, NULL, -1,
1561                               FALSE, dissect_gsm_old_PrepareHO_ResOld, -1,
1562                               TRUE , dissect_gsm_map_ms_PrepareHO_Res, -1);
1563     break;
1564   case 69: /*prepareSubsequentHandover*/
1565     offset=dissect_mc_message(tvb, offset, actx, tree,
1566                               FALSE, NULL, -1,
1567                               FALSE, NULL, -1,
1568                               TRUE , dissect_gsm_map_ms_PrepareSubsequentHO_Res, -1);
1569     break;
1570   case 70: /*provideSubscriberInfo*/
1571     offset=dissect_gsm_map_ms_ProvideSubscriberInfoRes(FALSE, tvb, offset, actx, tree, -1);
1572     break;
1573   case 71: /*anyTimeInterrogation*/
1574     offset=dissect_gsm_map_ms_AnyTimeInterrogationRes(FALSE, tvb, offset, actx, tree, -1);
1575     break;
1576   case 72: /*ss-InvocationNotificatio*/
1577     offset=dissect_gsm_map_ss_SS_InvocationNotificationRes(FALSE, tvb, offset, actx, tree, -1);
1578     break;
1579   case 73: /*setReportingState*/
1580     offset=dissect_gsm_map_ch_SetReportingStateRes(FALSE, tvb, offset, actx, tree, -1);
1581     break;
1582   case 74: /*statusReport*/
1583     offset=dissect_gsm_map_ch_StatusReportRes(FALSE, tvb, offset, actx, tree, -1);
1584     break;
1585   case 75: /*remoteUserFree*/
1586     offset=dissect_gsm_map_ch_RemoteUserFreeRes(FALSE, tvb, offset, actx, tree, -1);
1587     break;
1588   case 76: /*registerCC-Entry*/
1589     offset=dissect_gsm_map_ss_RegisterCC_EntryRes(FALSE, tvb, offset, actx, tree, -1);
1590     break;
1591   case 77: /*eraseCC-Entry*/
1592     offset=dissect_gsm_map_ss_EraseCC_EntryRes(FALSE, tvb, offset, actx, tree, -1);
1593     break;
1594   case 78: /*secureTransportClass1*/
1595   case 79: /*secureTransportClass2*/
1596   case 80: /*secureTransportClass3*/
1597   case 81: /*secureTransportClass4*/
1598     offset=dissect_gsm_old_SecureTransportRes(FALSE, tvb, offset, actx, tree, -1);
1599     break;
1600   case 83: /*provideSubscriberLocation*/
1601     offset=dissect_gsm_map_lcs_ProvideSubscriberLocation_Res(FALSE, tvb, offset, actx, tree, -1);
1602     break;
1603   case 84: /*sendGroupCallInfo*/
1604     offset=dissect_gsm_map_gr_SendGroupCallInfoRes(FALSE, tvb, offset, actx, tree, -1);
1605     break;
1606   case 85: /*sendRoutingInfoForLCS*/
1607     offset=dissect_gsm_map_lcs_RoutingInfoForLCS_Res(FALSE, tvb, offset, actx, tree, -1);
1608     break;
1609   case 86: /*subscriberLocationReport*/
1610     offset=dissect_gsm_map_lcs_SubscriberLocationReport_Res(FALSE, tvb, offset, actx, tree, -1);
1611     break;
1612   case 87: /*ist-Alert*/
1613     offset=dissect_gsm_map_ch_IST_AlertRes(FALSE, tvb, offset, actx, tree, -1);
1614     break;
1615   case 88: /*ist-Command*/
1616     offset=dissect_gsm_map_ch_IST_CommandRes(FALSE, tvb, offset, actx, tree, -1);
1617     break;
1618   case 89: /*noteMM-Event*/
1619     offset=dissect_gsm_map_ms_NoteMM_EventRes(FALSE, tvb, offset, actx, tree, -1);
1620     break;
1621   case 109: /*SS-protocol lcs-PeriodicLocationCancellation*/
1622           /* No parameter */
1623     break;
1624   case 110: /*SS-protocol lcs-LocationUpdate*/
1625           offset=dissect_gsm_ss_LCS_LocationUpdateRes(FALSE, tvb, offset, actx, tree, -1);
1626     break;
1627   case 111: /*SS-protocol lcs-PeriodicLocationRequest*/
1628     offset=dissect_gsm_ss_LCS_PeriodicLocationRequestRes(FALSE, tvb, offset, actx, tree, -1);
1629     break;
1630   case 112: /*SS-protocol lcs-AreaEventCancellation*/
1631     break;
1632   case 113: /*SS-protocol lcs-AreaEventReport*/
1633     break;
1634   case 114: /*SS-protocol lcs-AreaEventRequest No RESULT data*/
1635     break;
1636   case 115: /*SS-protocol lcs-MOLR*/
1637     offset=dissect_gsm_ss_LCS_MOLRRes(FALSE, tvb, offset, actx, tree, -1);
1638     break;
1639   case 116: /*SS-protocol lcs-LocationNotification*/
1640     offset=dissect_gsm_ss_LocationNotificationRes(FALSE, tvb, offset, actx, tree, -1);
1641     break;
1642   case 117: /*SS-protocol callDeflection no RESULT*/
1643     break;
1644   case 118: /*SS-protocol userUserService no RESULT*/
1645     break;
1646   case 119: /*SS-protocol accessRegisterCCEntry*/
1647     offset=dissect_gsm_map_ss_RegisterCC_EntryRes(FALSE, tvb, offset, actx, tree, -1);
1648     break;
1649   case 120: /*SS-protocol forwardCUG-Info*/
1650           /* No RETURN RESULT*/
1651     break;
1652   case 121: /*SS-protocol splitMPTY no RESULT*/
1653     break;
1654   case 122: /*SS-protocol retrieveMPTY no RESULT*/
1655     break;
1656   case 123: /*SS-protocol holdMPTY no RESULT*/
1657     break;
1658   case 124: /*SS-protocol buildMPTY no RESULT*/
1659     break;
1660   case 125: /*SS-protocol forwardChargeAdvice no RESULT*/
1661     break;
1662   case 126: /*SS-protocol explicitCT no RESULT*/
1663     break;
1664
1665  default:
1666    if(!dissector_try_uint(map_prop_res_opcode_table, (guint8)opcode, tvb, actx->pinfo, tree)){
1667        cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown returnResultData blob");
1668        expert_add_info_format_text(actx->pinfo, cause, &ei_gsm_map_unknown_invokeData, "Unknown invokeData %d",opcode);
1669    }
1670    offset+= tvb_length_remaining(tvb,offset);
1671    break;
1672   }
1673   return offset;
1674 }
1675
1676
1677
1678 static int dissect_returnErrorData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx) {
1679   proto_item *cause;
1680
1681   switch(errorCode){
1682   case 1: /* UnknownSubscriberParam */
1683           offset=dissect_gsm_map_er_UnknownSubscriberParam(FALSE, tvb, offset, actx, tree, -1);
1684           break;
1685   case 4: /* SecureTransportErrorParam */
1686           offset=dissect_gsm_old_SecureTransportErrorParam(FALSE, tvb, offset, actx, tree, -1);
1687           break;
1688   case 5: /* UnidentifiedSubParam */
1689           offset=dissect_gsm_map_er_UnidentifiedSubParam(FALSE, tvb, offset, actx, tree, -1);
1690           break;
1691   case 6: /* AbsentSubscriberSM-Param */
1692           offset=dissect_gsm_map_er_AbsentSubscriberSM_Param(FALSE, tvb, offset, actx, tree, -1);
1693           break;
1694   case 8: /* RoamingNotAllowedParam */
1695           offset=dissect_gsm_map_er_RoamingNotAllowedParam(FALSE, tvb, offset, actx, tree, -1);
1696           break;
1697   case 9: /* IllegalSubscriberParam */
1698           offset=dissect_gsm_map_er_IllegalSubscriberParam(FALSE, tvb, offset, actx, tree, -1);
1699           break;
1700   case 10: /* BearerServNotProvParam */
1701           offset=dissect_gsm_map_er_BearerServNotProvParam(FALSE, tvb, offset, actx, tree, -1);
1702           break;
1703   case 11: /* TeleservNotProvParam */
1704           offset=dissect_gsm_map_er_TeleservNotProvParam(FALSE, tvb, offset, actx, tree, -1);
1705           break;
1706   case 12: /* IllegalEquipmentParam */
1707           offset=dissect_gsm_map_er_IllegalEquipmentParam(FALSE, tvb, offset, actx, tree, -1);
1708           break;
1709   case 13: /* CallBarredParam */
1710           offset=dissect_gsm_map_er_CallBarredParam(FALSE, tvb, offset, actx, tree, -1);
1711           break;
1712   case 14: /* ForwardingViolationParam */
1713           offset=dissect_gsm_map_er_ForwardingViolationParam(FALSE, tvb, offset, actx, tree, -1);
1714           break;
1715   case 15: /* CUG-RejectParam */
1716           offset=dissect_gsm_map_er_CUG_RejectParam(FALSE, tvb, offset, actx, tree, -1);
1717           break;
1718   case 16: /* IllegalSS-OperationParam */
1719           offset=dissect_gsm_map_er_IllegalSS_OperationParam(FALSE, tvb, offset, actx, tree, -1);
1720           break;
1721   case 17: /* SS-ErrorStatus */
1722           offset=dissect_gsm_map_ss_SS_Status(FALSE, tvb, offset, actx, tree, hf_gsm_map_ss_ss_Status);
1723           break;
1724   case 18: /* SS-NotAvailableParam */
1725           offset=dissect_gsm_map_er_SS_NotAvailableParam(FALSE, tvb, offset, actx, tree, -1);
1726           break;
1727   case 19: /* SS-SubscriptionViolationParam */
1728           offset=dissect_gsm_map_er_SS_SubscriptionViolationParam(FALSE, tvb, offset, actx, tree, -1);
1729           break;
1730   case 20: /* SS-IncompatibilityCause */
1731           offset=dissect_gsm_map_er_SS_IncompatibilityCause(FALSE, tvb, offset, actx, tree, -1);
1732           break;
1733   case 21: /* FacilityNotSupParam */
1734           offset=dissect_gsm_map_er_FacilityNotSupParam(FALSE, tvb, offset, actx, tree, -1);
1735           break;
1736   case 22: /* OngoingGroupCallParam */
1737       offset=dissect_gsm_map_er_OngoingGroupCallParam(FALSE, tvb, offset, actx, tree, -1);
1738       break;
1739   case 27: /* AbsentSubscriberParam */
1740           offset=dissect_gsm_map_er_AbsentSubscriberParam(FALSE, tvb, offset, actx, tree, -1);
1741           break;
1742   case 28: /* IncompatibleTerminalParam */
1743           offset=dissect_gsm_map_er_IncompatibleTerminalParam(FALSE, tvb, offset, actx, tree, -1);
1744           break;
1745   case 29: /* ShortTermDenialParam */
1746           offset=dissect_gsm_map_er_ShortTermDenialParam(FALSE, tvb, offset, actx, tree, -1);
1747           break;
1748   case 30: /* LongTermDenialParam */
1749           offset=dissect_gsm_map_er_LongTermDenialParam(FALSE, tvb, offset, actx, tree, -1);
1750           break;
1751   case 31: /* SubBusyForMT-SMS-Param */
1752           offset=dissect_gsm_map_er_SubBusyForMT_SMS_Param(FALSE, tvb, offset, actx, tree, -1);
1753           break;
1754   case 32: /* SM-DeliveryFailureCause */
1755           offset=dissect_gsm_map_er_SM_DeliveryFailureCause(FALSE, tvb, offset, actx, tree, -1);
1756           break;
1757   case 33: /* MessageWaitListFullParam */
1758           offset=dissect_gsm_map_er_MessageWaitListFullParam(FALSE, tvb, offset, actx, tree, -1);
1759           break;
1760   case 34: /* SystemFailureParam */
1761           offset=dissect_gsm_map_er_SystemFailureParam(FALSE, tvb, offset, actx, tree, -1);
1762           break;
1763   case 35: /* DataMissingParam */
1764           offset=dissect_gsm_map_er_DataMissingParam(FALSE, tvb, offset, actx, tree, -1);
1765           break;
1766   case 36: /* UnexpectedDataParam */
1767           offset=dissect_gsm_map_er_UnexpectedDataParam(FALSE, tvb, offset, actx, tree, -1);
1768           break;
1769   case 37: /* PW-RegistrationFailureCause */
1770           offset=dissect_gsm_map_er_PW_RegistrationFailureCause(FALSE, tvb, offset, actx, tree, -1);
1771           break;
1772   case 39: /* NoRoamingNbParam */
1773           offset=dissect_gsm_map_er_NoRoamingNbParam(FALSE, tvb, offset, actx, tree, -1);
1774           break;
1775   case 40: /* TracingBufferFullParam */
1776           offset=dissect_gsm_map_er_TracingBufferFullParam(FALSE, tvb, offset, actx, tree, -1);
1777           break;
1778   case 42: /* TargetCellOutsideGCA-Param */
1779           offset=dissect_gsm_map_er_TargetCellOutsideGCA_Param(FALSE, tvb, offset, actx, tree, -1);
1780           break;
1781   case 44: /* NumberChangedParam */
1782           offset=dissect_gsm_map_er_NumberChangedParam(FALSE, tvb, offset, actx, tree, -1);
1783           break;
1784   case 45: /* BusySubscriberParam */
1785           offset=dissect_gsm_map_er_BusySubscriberParam(FALSE, tvb, offset, actx, tree, -1);
1786           break;
1787   case 46: /* NoSubscriberReplyParam */
1788           offset=dissect_gsm_map_er_NoSubscriberReplyParam(FALSE, tvb, offset, actx, tree, -1);
1789           break;
1790   case 47: /* ForwardingFailedParam */
1791           offset=dissect_gsm_map_er_ForwardingFailedParam(FALSE, tvb, offset, actx, tree, -1);
1792           break;
1793   case 48: /* OR-NotAllowedParam */
1794           offset=dissect_gsm_map_er_OR_NotAllowedParam(FALSE, tvb, offset, actx, tree, -1);
1795           break;
1796   case 49: /* ATI-NotAllowedParam */
1797           offset=dissect_gsm_map_er_ATI_NotAllowedParam(FALSE, tvb, offset, actx, tree, -1);
1798           break;
1799   case 50: /* NoGroupCallNbParam */
1800           offset=dissect_gsm_map_er_NoGroupCallNbParam(FALSE, tvb, offset, actx, tree, -1);
1801           break;
1802   case 51: /* ResourceLimitationParam */
1803           offset=dissect_gsm_map_er_ResourceLimitationParam(FALSE, tvb, offset, actx, tree, -1);
1804           break;
1805   case 52: /* UnauthorizedRequestingNetwork-Param */
1806           offset=dissect_gsm_map_er_UnauthorizedRequestingNetwork_Param(FALSE, tvb, offset, actx, tree, -1);
1807           break;
1808   case 53: /* UnauthorizedLCSClient-Param */
1809           offset=dissect_gsm_map_er_UnauthorizedLCSClient_Param(FALSE, tvb, offset, actx, tree, -1);
1810           break;
1811   case 54: /* PositionMethodFailure-Param */
1812           offset=dissect_gsm_map_er_PositionMethodFailure_Param(FALSE, tvb, offset, actx, tree, -1);
1813           break;
1814   case 58: /* UnknownOrUnreachableLCSClient-Param */
1815           offset=dissect_gsm_map_er_UnknownOrUnreachableLCSClient_Param(FALSE, tvb, offset, actx, tree, -1);
1816           break;
1817   case 59: /* MM-EventNotSupported-Param */
1818           offset=dissect_gsm_map_er_MM_EventNotSupported_Param(FALSE, tvb, offset, actx, tree, -1);
1819           break;
1820   case 60: /* ATSI-NotAllowedParam */
1821           offset=dissect_gsm_map_er_ATSI_NotAllowedParam(FALSE, tvb, offset, actx, tree, -1);
1822           break;
1823   case 61: /* ATM-NotAllowedParam */
1824           offset=dissect_gsm_map_er_ATM_NotAllowedParam(FALSE, tvb, offset, actx, tree, -1);
1825           break;
1826   case 62: /* InformationNotAvailableParam */
1827           offset=dissect_gsm_map_er_InformationNotAvailableParam(FALSE, tvb, offset, actx, tree, -1);
1828           break;
1829   default:
1830     if(!dissector_try_uint(map_prop_err_opcode_table, (guint8)opcode, tvb, actx->pinfo, tree)){
1831         cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown returnErrorData blob");
1832         expert_add_info_format_text(actx->pinfo, cause, &ei_gsm_map_unknown_invokeData, "Unknown invokeData %d",errorCode);
1833     }
1834         offset+= tvb_length_remaining(tvb,offset);
1835     break;
1836   }
1837   return offset;
1838 }
1839
1840 /* Private extension container for PLMN Data */
1841 static void dissect_gsm_mapext_PlmnContainer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) {
1842   proto_item    *item=NULL;
1843   proto_tree    *tree=NULL;
1844   asn1_ctx_t asn1_ctx;
1845   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1846   /* create display subtree for the protocol */
1847   if(parent_tree){
1848     item = proto_tree_add_text(parent_tree, tvb, 0, -1, "MAP Ext. Plmn Container");
1849     tree = proto_item_add_subtree(item, ett_gsm_old_PlmnContainer_U);
1850   }
1851   dissect_gsm_old_PlmnContainer(FALSE, tvb, 0, &asn1_ctx, tree, -1);
1852 }
1853
1854
1855 static guint8 gsmmap_pdu_type = 0;
1856 static guint8 gsm_map_pdu_size = 0;
1857
1858 static int
1859 dissect_gsm_map_GSMMAPPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index _U_) {
1860
1861   char *version_ptr;
1862   struct tcap_private_t * p_private_tcap;
1863
1864   opcode = 0;
1865   if (pref_application_context_version == APPLICATON_CONTEXT_FROM_TRACE) {
1866           application_context_version = 0;
1867           if (actx->pinfo->private_data != NULL){
1868                 p_private_tcap = (struct tcap_private_t *)actx->pinfo->private_data;
1869                 if (p_private_tcap->acv==TRUE ){
1870                   version_ptr = strrchr((const char*)p_private_tcap->oid,'.');
1871                   if (version_ptr){
1872                           application_context_version = atoi(version_ptr+1);
1873                   }
1874                 }
1875           }
1876   }else{
1877           application_context_version = pref_application_context_version;
1878   }
1879
1880   gsmmap_pdu_type = tvb_get_guint8(tvb, offset)&0x0f;
1881   /* Get the length and add 2 */
1882   gsm_map_pdu_size = tvb_get_guint8(tvb, offset+1)+2;
1883
1884   col_add_str(actx->pinfo->cinfo, COL_INFO, val_to_str_const(gsmmap_pdu_type, gsm_old_Component_vals, "Unknown GSM-MAP Component"));
1885   col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
1886   offset = dissect_gsm_old_Component(FALSE, tvb, 0, actx, tree, hf_gsm_map_old_Component_PDU);
1887 /*
1888   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
1889                               GSMMAPPDU_choice, hf_index, ett_gsm_map_GSMMAPPDU, NULL);
1890 */
1891
1892   return offset;
1893 }
1894
1895 static void
1896 dissect_gsm_map(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
1897 {
1898     proto_item          *item=NULL;
1899     proto_tree          *tree=NULL;
1900     /* Used for gsm_map TAP */
1901     static              gsm_map_tap_rec_t tap_rec;
1902     gint                op_idx;
1903         asn1_ctx_t asn1_ctx;
1904
1905         asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1906
1907     col_set_str(pinfo->cinfo, COL_PROTOCOL, "GSM MAP");
1908
1909     top_tree = parent_tree;
1910
1911     /* create display subtree for the protocol */
1912     if(parent_tree){
1913         item = proto_tree_add_item(parent_tree, proto_gsm_map, tvb, 0, -1, ENC_NA);
1914         tree = proto_item_add_subtree(item, ett_gsm_map);
1915     }
1916
1917     dissect_gsm_map_GSMMAPPDU(FALSE, tvb, 0, &asn1_ctx, tree, -1);
1918     try_val_to_str_idx(opcode, gsm_map_opr_code_strings, &op_idx);
1919
1920     if (op_idx != -1) {
1921         tap_rec.invoke = (gsmmap_pdu_type == 1) ? TRUE : FALSE;
1922         tap_rec.opr_code_idx = op_idx;
1923         tap_rec.size = gsm_map_pdu_size;
1924
1925         tap_queue_packet(gsm_map_tap, pinfo, &tap_rec);
1926     }
1927 }
1928
1929 const value_string ssCode_vals[] = {
1930   { 0x00, "allSS - all SS" },
1931   { 0x10 ,"allLineIdentificationSS - all line identification SS" },
1932   { 0x11 ,"clip - calling line identification presentation" },
1933   { 0x12 ,"clir - calling line identification restriction" },
1934   { 0x13 ,"colp - connected line identification presentation" },
1935   { 0x14 ,"colr - connected line identification restriction" },
1936   { 0x15 ,"mci - malicious call identification" },
1937   { 0x18 ,"allNameIdentificationSS - all name identification SS" },
1938   { 0x19 ,"cnap - calling name presentation" },
1939   { 0x20 ,"allForwardingSS - all forwarding SS" },
1940   { 0x21 ,"cfu - call forwarding unconditional" },
1941   { 0x28 ,"allCondForwardingSS - all conditional forwarding SS" },
1942   { 0x29 ,"cfb - call forwarding busy" },
1943   { 0x2a ,"cfnry - call forwarding on no reply" },
1944   { 0x2b ,"cfnrc - call forwarding on mobile subscriber not reachable" },
1945   { 0x24 ,"cd - call deflection" },
1946   { 0x30 ,"allCallOfferingSS - all call offering SS includes also all forwarding SS" },
1947   { 0x31 ,"ect - explicit call transfer" },
1948   { 0x32 ,"mah - mobile access hunting" },
1949   { 0x40 ,"allCallCompletionSS - all Call completion SS" },
1950   { 0x41 ,"cw - call waiting" },
1951   { 0x42 ,"hold - call hold" },
1952   { 0x43 ,"ccbs-A - completion of call to busy subscribers, originating side" },
1953   { 0x44 ,"ccbs-B - completion of call to busy subscribers, destination side" },
1954   { 0x45 ,"mc - multicall" },
1955   { 0x50 ,"allMultiPartySS - all multiparty SS" },
1956   { 0x51 ,"multiPTY - multiparty" },
1957   { 0x60 ,"allCommunityOfInterestSS - all community of interest SS" },
1958   { 0x61 ,"cug - closed user group" },
1959   { 0x70 ,"allChargingSS - all charging SS" },
1960   { 0x71 ,"aoci - advice of charge information" },
1961   { 0x72 ,"aocc - advice of charge charging" },
1962   { 0x80 ,"allAdditionalInfoTransferSS - all additional information transfer SS" },
1963   { 0x81 ,"uus1 - UUS1 user-to-user signalling" },
1964   { 0x82 ,"uus2 - UUS2 user-to-user signalling" },
1965   { 0x83 ,"uus3 - UUS3 user-to-user signalling" },
1966   { 0x90 ,"allCallRestrictionSS - all Callrestriction SS" },
1967   { 0x91 ,"barringOfOutgoingCalls" },
1968   { 0x92 ,"baoc - barring of all outgoing calls" },
1969   { 0x93 ,"boic - barring of outgoing international calls" },
1970   { 0x94 ,"boicExHC - barring of outgoing international calls except those directed to the home PLMN" },
1971   { 0x99 ,"barringOfIncomingCalls" },
1972   { 0x9a ,"baic - barring of all incoming calls" },
1973   { 0x9b ,"bicRoam - barring of incoming calls when roaming outside home PLMN Country" },
1974   { 0xf0 ,"allPLMN-specificSS" },
1975   { 0xa0 ,"allCallPrioritySS - all call priority SS" },
1976   { 0xa1 ,"emlpp - enhanced Multilevel Precedence Pre-emption (EMLPP) service" },
1977   { 0xb0 ,"allLCSPrivacyException - all LCS Privacy Exception Classes" },
1978   { 0xb1 ,"universal - allow location by any LCS client" },
1979   { 0xb2 ,"callrelated - allow location by any value added LCS client to which a call is established from the target MS" },
1980   { 0xb3 ,"callunrelated - allow location by designated external value added LCS clients" },
1981   { 0xb4 ,"plmnoperator - allow location by designated PLMN operator LCS clients" },
1982   { 0xb5 ,"serviceType - allow location by LCS clients of a designated LCS service type" },
1983   { 0xc0 ,"allMOLR-SS - all Mobile Originating Location Request Classes" },
1984   { 0xc1 ,"basicSelfLocation - allow an MS to request its own location" },
1985   { 0xc2 ,"autonomousSelfLocation - allow an MS to perform self location without interaction with the PLMN for a predetermined period of time" },
1986   { 0xc3 ,"transferToThirdParty - allow an MS to request transfer of its location to another LCS client" },
1987
1988   { 0xf1 ,"plmn-specificSS-1" },
1989   { 0xf2 ,"plmn-specificSS-2" },
1990   { 0xf3 ,"plmn-specificSS-3" },
1991   { 0xf4 ,"plmn-specificSS-4" },
1992   { 0xf5 ,"plmn-specificSS-5" },
1993   { 0xf6 ,"plmn-specificSS-6" },
1994   { 0xf7 ,"plmn-specificSS-7" },
1995   { 0xf8 ,"plmn-specificSS-8" },
1996   { 0xf9 ,"plmn-specificSS-9" },
1997   { 0xfa ,"plmn-specificSS-a" },
1998   { 0xfb ,"plmn-specificSS-b" },
1999   { 0xfc ,"plmn-specificSS-c" },
2000   { 0xfd ,"plmn-specificSS-d" },
2001   { 0xfe ,"plmn-specificSS-e" },
2002   { 0xff ,"plmn-specificSS-f" },
2003   { 0, NULL }
2004 };
2005
2006 static const value_string Teleservice_vals[] = {
2007 {0x00, "allTeleservices" },
2008 {0x10, "allSpeechTransmissionServices" },
2009 {0x11, "telephony" },
2010 {0x12, "emergencyCalls" },
2011 {0x20, "allShortMessageServices" },
2012 {0x21, "shortMessageMT-PP" },
2013 {0x22, "shortMessageMO-PP" },
2014 {0x60, "allFacsimileTransmissionServices" },
2015 {0x61, "facsimileGroup3AndAlterSpeech" },
2016 {0x62, "automaticFacsimileGroup3" },
2017 {0x63, "facsimileGroup4" },
2018
2019 {0x70, "allDataTeleservices" },
2020 {0x80, "allTeleservices-ExeptSMS" },
2021
2022 {0x90, "allVoiceGroupCallServices" },
2023 {0x91, "voiceGroupCall" },
2024 {0x92, "voiceBroadcastCall" },
2025
2026 {0xd0, "allPLMN-specificTS" },
2027 {0xd1, "plmn-specificTS-1" },
2028 {0xd2, "plmn-specificTS-2" },
2029 {0xd3, "plmn-specificTS-3" },
2030 {0xd4, "plmn-specificTS-4" },
2031 {0xd5, "plmn-specificTS-5" },
2032 {0xd6, "plmn-specificTS-6" },
2033 {0xd7, "plmn-specificTS-7" },
2034 {0xd8, "plmn-specificTS-8" },
2035 {0xd9, "plmn-specificTS-9" },
2036 {0xda, "plmn-specificTS-A" },
2037 {0xdb, "plmn-specificTS-B" },
2038 {0xdc, "plmn-specificTS-C" },
2039 {0xdd, "plmn-specificTS-D" },
2040 {0xde, "plmn-specificTS-E" },
2041 {0xdf, "plmn-specificTS-F" },
2042   { 0, NULL }
2043 };
2044
2045 static const value_string Bearerservice_vals[] = {
2046 {0x00, "allBearerServices" },
2047 {0x10, "allDataCDA-Services" },
2048 {0x11, "dataCDA-300bps" },
2049 {0x12, "dataCDA-1200bps" },
2050 {0x13, "dataCDA-1200-75bps" },
2051 {0x14, "dataCDA-2400bps" },
2052 {0x15, "dataCDA-4800bps" },
2053 {0x16, "dataCDA-9600bps" },
2054 {0x17, "general-dataCDA" },
2055
2056 {0x18, "allDataCDS-Services" },
2057 {0x1A, "dataCDS-1200bps" },
2058 {0x1C, "dataCDS-2400bps" },
2059 {0x1D, "dataCDS-4800bps" },
2060 {0x1E, "dataCDS-9600bps" },
2061 {0x1F, "general-dataCDS" },
2062
2063 {0x20, "allPadAccessCA-Services" },
2064 {0x21, "padAccessCA-300bps" },
2065 {0x22, "padAccessCA-1200bps" },
2066 {0x23, "padAccessCA-1200-75bps" },
2067 {0x24, "padAccessCA-2400bps" },
2068 {0x25, "padAccessCA-4800bps" },
2069 {0x26, "padAccessCA-9600bps" },
2070 {0x27, "general-padAccessCA" },
2071
2072 {0x28, "allDataPDS-Services" },
2073 {0x2C, "dataPDS-2400bps" },
2074 {0x2D, "dataPDS-4800bps" },
2075 {0x2E, "dataPDS-9600bps" },
2076 {0x2F, "general-dataPDS" },
2077
2078 {0x30, "allAlternateSpeech-DataCDA" },
2079 {0x38, "allAlternateSpeech-DataCDS" },
2080 {0x40, "allSpeechFollowedByDataCDA" },
2081 {0x48, "allSpeechFollowedByDataCDS" },
2082
2083 {0x50, "allDataCircuitAsynchronous" },
2084 {0x60, "allAsynchronousServices" },
2085 {0x58, "allDataCircuitSynchronous" },
2086 {0x68, "allSynchronousServices" },
2087
2088 {0xD0, "allPLMN-specificBS" },
2089 {0xD1, "plmn-specificBS-1" },
2090 {0xD2, "plmn-specificBS-2" },
2091 {0xD3, "plmn-specificBS-3" },
2092 {0xD4, "plmn-specificBS-4" },
2093 {0xD5, "plmn-specificBS-5" },
2094 {0xD6, "plmn-specificBS-6" },
2095 {0xD7, "plmn-specificBS-7" },
2096 {0xD8, "plmn-specificBS-8" },
2097 {0xD9, "plmn-specificBS-9" },
2098 {0xDA, "plmn-specificBS-A" },
2099 {0xDB, "plmn-specificBS-B" },
2100 {0xDC, "plmn-specificBS-C" },
2101 {0xDD, "plmn-specificBS-D" },
2102 {0xDE, "plmn-specificBS-E" },
2103 {0xDF, "plmn-specificBS-F" },
2104
2105 { 0, NULL }
2106 };
2107
2108 /* ForwardingOptions
2109
2110 -- bit 8: notification to forwarding party
2111 -- 0 no notification
2112 -- 1 notification
2113 */
2114 static const true_false_string notification_value  = {
2115   "Notification",
2116   "No notification"
2117 };
2118 /*
2119 -- bit 7: redirecting presentation
2120 -- 0 no presentation
2121 -- 1 presentation
2122 */
2123 static const true_false_string redirecting_presentation_value  = {
2124   "Presentation",
2125   "No presentationn"
2126 };
2127 /*
2128 -- bit 6: notification to calling party
2129 -- 0 no notification
2130 -- 1 notification
2131 */
2132 /*
2133 -- bit 5: 0 (unused)
2134 -- bits 43: forwarding reason
2135 -- 00 ms not reachable
2136 -- 01 ms busy
2137 -- 10 no reply
2138 -- 11 unconditional when used in a SRI Result,
2139 -- or call deflection when used in a RCH Argument
2140 */
2141 static const value_string forwarding_reason_values[] = {
2142 {0x0, "ms not reachable" },
2143 {0x1, "ms busy" },
2144 {0x2, "no reply" },
2145 {0x3, "unconditional when used in a SRI Result or call deflection when used in a RCH Argument" },
2146 { 0, NULL }
2147 };
2148 /*
2149 -- bits 21: 00 (unused)
2150 */
2151
2152 static const value_string pdp_type_org_values[] = {
2153 {0x0, "ETSI" },
2154 {0x1, "IETF" },
2155 {0xf, "Empty PDP type" },
2156 { 0, NULL }
2157 };
2158
2159 static const value_string etsi_pdp_type_number_values[] = {
2160 {0x0, "Reserved, used in earlier version of this protocol" },
2161 {0x1, "PPP" },
2162 { 0, NULL }
2163 };
2164
2165 static const value_string ietf_pdp_type_number_values[] = {
2166 {0x21, "IPv4 Address" },
2167 {0x57, "IPv6 Address" },
2168 { 0, NULL }
2169 };
2170
2171 /*
2172 ChargingCharacteristics ::= OCTET STRING (SIZE (2))
2173 -- Octets are coded according to 3GPP TS 32.015.
2174 -- From 3GPP TS 32.015.
2175 --
2176 -- Descriptions for the bits of the flag set:
2177 --
2178 -- Bit 1: H (Hot billing) := '00000001'B
2179 -- Bit 2: F (Flat rate) := '00000010'B
2180 -- Bit 3: P (Prepaid service) := '00000100'B
2181 -- Bit 4: N (Normal billing) := '00001000'B
2182 -- Bit 5: - (Reserved, set to 0) := '00010000'B
2183 -- Bit 6: - (Reserved, set to 0) := '00100000'B
2184 -- Bit 7: - (Reserved, set to 0) := '01000000'B
2185 -- Bit 8: - (Reserved, set to 0) := '10000000'B
2186 */
2187 static const value_string chargingcharacteristics_values[] = {
2188 {0x1, "H (Hot billing)" },
2189 {0x2, "F (Flat rate)" },
2190 {0x4, "P (Prepaid service)" },
2191 {0x8, "N (Normal billing)" },
2192 { 0, NULL }
2193 };
2194
2195 /*--- proto_reg_handoff_gsm_map ---------------------------------------*/
2196 static void range_delete_callback(guint32 ssn)
2197 {
2198     if (ssn) {
2199         delete_itu_tcap_subdissector(ssn, map_handle);
2200     }
2201 }
2202
2203 static void range_add_callback(guint32 ssn)
2204 {
2205     if (ssn) {
2206         add_itu_tcap_subdissector(ssn, map_handle);
2207     }
2208 }
2209
2210 void proto_reg_handoff_gsm_map(void) {
2211
2212     static gboolean map_prefs_initialized = FALSE;
2213     static range_t *ssn_range;
2214
2215     if (!map_prefs_initialized) {
2216         map_prefs_initialized = TRUE;
2217         data_handle = find_dissector("data");
2218         ranap_handle = find_dissector("ranap");
2219         dtap_handle = find_dissector("gsm_a_dtap");
2220
2221         map_handle = find_dissector("gsm_map");
2222                 oid_add_from_string("itu(0) administration(2) japan(440)","0.2.440" );
2223         register_ber_oid_dissector_handle("0.4.0.0.1.0.1.3", map_handle, proto_gsm_map,"networkLocUpContext-v3");
2224         register_ber_oid_dissector_handle("0.4.0.0.1.0.1.2", map_handle, proto_gsm_map,"networkLocUpContext-v2" );
2225         register_ber_oid_dissector_handle("0.4.0.0.1.0.1.1", map_handle, proto_gsm_map,"networkLocUpContext-v1" );
2226         register_ber_oid_dissector_handle("0.4.0.0.1.0.2.3", map_handle, proto_gsm_map,"locationCancellationContext-v3" );
2227         register_ber_oid_dissector_handle("0.4.0.0.1.0.2.2", map_handle, proto_gsm_map,"locationCancellationContext-v2" );
2228         register_ber_oid_dissector_handle("0.4.0.0.1.0.2.1", map_handle, proto_gsm_map,"locationCancellationContext-v1" );
2229         register_ber_oid_dissector_handle("0.4.0.0.1.0.3.3", map_handle, proto_gsm_map,"roamingNumberEnquiryContext-v3" );
2230         register_ber_oid_dissector_handle("0.4.0.0.1.0.3.2", map_handle, proto_gsm_map,"roamingNumberEnquiryContext-v2" );
2231         register_ber_oid_dissector_handle("0.4.0.0.1.0.3.1", map_handle, proto_gsm_map,"roamingNumberEnquiryContext-v1" );
2232         register_ber_oid_dissector_handle("0.4.0.0.1.0.4.3", map_handle, proto_gsm_map,"istAlertingContext-v3" );
2233         register_ber_oid_dissector_handle("0.4.0.0.1.0.5.3", map_handle, proto_gsm_map,"locationInfoRetrievalContext-v3" );
2234         register_ber_oid_dissector_handle("0.4.0.0.1.0.5.2", map_handle, proto_gsm_map,"locationInfoRetrievalContext-v2" );
2235         register_ber_oid_dissector_handle("0.4.0.0.1.0.5.1", map_handle, proto_gsm_map,"locationInfoRetrievalContext-v1" );
2236         register_ber_oid_dissector_handle("0.4.0.0.1.0.6.4", map_handle, proto_gsm_map,"callControlTransferContext-v4" );
2237         register_ber_oid_dissector_handle("0.4.0.0.1.0.6.3", map_handle, proto_gsm_map,"callControlTransferContext-v3" );
2238         register_ber_oid_dissector_handle("0.4.0.0.1.0.7.3", map_handle, proto_gsm_map,"reportingContext-v3" );
2239         register_ber_oid_dissector_handle("0.4.0.0.1.0.8.3", map_handle, proto_gsm_map,"callCompletionContext-v3" );
2240         register_ber_oid_dissector_handle("0.4.0.0.1.0.9.3", map_handle, proto_gsm_map,"serviceTerminationContext-v3" );
2241         register_ber_oid_dissector_handle("0.4.0.0.1.0.10.2", map_handle, proto_gsm_map,"resetContext-v2" );
2242         register_ber_oid_dissector_handle("0.4.0.0.1.0.10.1", map_handle, proto_gsm_map,"resetContext-v1" );
2243         register_ber_oid_dissector_handle("0.4.0.0.1.0.11.3", map_handle, proto_gsm_map,"handoverControlContext-v3" );
2244         register_ber_oid_dissector_handle("0.4.0.0.1.0.11.2", map_handle, proto_gsm_map,"handoverControlContext-v2" );
2245         register_ber_oid_dissector_handle("0.4.0.0.1.0.11.1", map_handle, proto_gsm_map,"handoverControlContext-v1" );
2246         register_ber_oid_dissector_handle("0.4.0.0.1.0.12.3", map_handle, proto_gsm_map,"sIWFSAllocationContext-v3" );
2247         register_ber_oid_dissector_handle("0.4.0.0.1.0.13.3", map_handle, proto_gsm_map,"equipmentMngtContext-v3" );
2248         register_ber_oid_dissector_handle("0.4.0.0.1.0.13.2", map_handle, proto_gsm_map,"equipmentMngtContext-v2" );
2249         register_ber_oid_dissector_handle("0.4.0.0.1.0.13.1", map_handle, proto_gsm_map,"equipmentMngtContext-v1" );
2250         register_ber_oid_dissector_handle("0.4.0.0.1.0.14.3", map_handle, proto_gsm_map,"infoRetrievalContext-v3" );
2251         register_ber_oid_dissector_handle("0.4.0.0.1.0.14.2", map_handle, proto_gsm_map,"infoRetrievalContext-v2" );
2252         register_ber_oid_dissector_handle("0.4.0.0.1.0.14.1", map_handle, proto_gsm_map,"infoRetrievalContext-v1" );
2253         /* fallback to infoRetrieval(14) version1(1) and not interVlrInfoRetrieval(15) version1(1) */
2254         /*register_ber_oid_dissector_handle("0.4.0.0.1.0.15.1", map_handle, proto_gsm_map,"map-ac interVlrInfoRetrieval(15) version1(1)" );*/
2255         register_ber_oid_dissector_handle("0.4.0.0.1.0.15.2", map_handle, proto_gsm_map,"interVlrInfoRetrievalContext-v2" );
2256         register_ber_oid_dissector_handle("0.4.0.0.1.0.15.3", map_handle, proto_gsm_map,"interVlrInfoRetrievalContext-v3" );
2257         register_ber_oid_dissector_handle("0.4.0.0.1.0.16.3", map_handle, proto_gsm_map,"subscriberDataMngtContext-v3" );
2258         register_ber_oid_dissector_handle("0.4.0.0.1.0.16.2", map_handle, proto_gsm_map,"subscriberDataMngtContext-v2" );
2259         register_ber_oid_dissector_handle("0.4.0.0.1.0.16.1", map_handle, proto_gsm_map,"subscriberDataMngtContext-v1" );
2260         register_ber_oid_dissector_handle("0.4.0.0.1.0.17.3", map_handle, proto_gsm_map,"tracingContext-v3" );
2261         register_ber_oid_dissector_handle("0.4.0.0.1.0.17.2", map_handle, proto_gsm_map,"tracingContext-v2" );
2262         register_ber_oid_dissector_handle("0.4.0.0.1.0.17.1", map_handle, proto_gsm_map,"tracingContext-v1" );
2263         register_ber_oid_dissector_handle("0.4.0.0.1.0.18.2", map_handle, proto_gsm_map,"networkFunctionalSsContext-v2" );
2264         register_ber_oid_dissector_handle("0.4.0.0.1.0.18.1", map_handle, proto_gsm_map,"networkFunctionalSsContext-v1" );
2265         register_ber_oid_dissector_handle("0.4.0.0.1.0.19.2", map_handle, proto_gsm_map,"networkUnstructuredSsContext-v2" );
2266         register_ber_oid_dissector_handle("0.4.0.0.1.0.20.3", map_handle, proto_gsm_map,"shortMsgGatewayContext-v3" );
2267         register_ber_oid_dissector_handle("0.4.0.0.1.0.20.2", map_handle, proto_gsm_map,"shortMsgGatewayContext-v2" );
2268         register_ber_oid_dissector_handle("0.4.0.0.1.0.20.1", map_handle, proto_gsm_map,"shortMsgGatewayContext-v1" );
2269         register_ber_oid_dissector_handle("0.4.0.0.1.0.21.3", map_handle, proto_gsm_map,"shortMsgMO-RelayContext-v3" );
2270         register_ber_oid_dissector_handle("0.4.0.0.1.0.21.2", map_handle, proto_gsm_map,"shortMsgMO-RelayContext-v2" );
2271         register_ber_oid_dissector_handle("0.4.0.0.1.0.21.1", map_handle, proto_gsm_map,"shortMsgRelayContext-v1" );
2272         register_ber_oid_dissector_handle("0.4.0.0.1.0.22.3", map_handle, proto_gsm_map,"subscriberDataModificationNotificationContext-v3" );
2273         register_ber_oid_dissector_handle("0.4.0.0.1.0.23.2", map_handle, proto_gsm_map,"shortMsgAlertContext-v2" );
2274         register_ber_oid_dissector_handle("0.4.0.0.1.0.23.1", map_handle, proto_gsm_map,"shortMsgAlertContext-v1" );
2275         register_ber_oid_dissector_handle("0.4.0.0.1.0.24.3", map_handle, proto_gsm_map,"mwdMngtContext-v3" );
2276         register_ber_oid_dissector_handle("0.4.0.0.1.0.24.2", map_handle, proto_gsm_map,"mwdMngtContext-v2" );
2277         register_ber_oid_dissector_handle("0.4.0.0.1.0.24.1", map_handle, proto_gsm_map,"mwdMngtContext-v1" );
2278         register_ber_oid_dissector_handle("0.4.0.0.1.0.25.3", map_handle, proto_gsm_map,"shortMsgMT-RelayContext-v3" );
2279         register_ber_oid_dissector_handle("0.4.0.0.1.0.25.2", map_handle, proto_gsm_map,"shortMsgMT-RelayContext-v2" );
2280         register_ber_oid_dissector_handle("0.4.0.0.1.0.26.2", map_handle, proto_gsm_map,"imsiRetrievalContext-v2" );
2281         register_ber_oid_dissector_handle("0.4.0.0.1.0.27.2", map_handle, proto_gsm_map,"msPurgingContext-v2" );
2282         register_ber_oid_dissector_handle("0.4.0.0.1.0.27.3", map_handle, proto_gsm_map,"msPurgingContext-v3" );
2283         register_ber_oid_dissector_handle("0.4.0.0.1.0.28.3", map_handle, proto_gsm_map,"subscriberInfoEnquiryContext-v3" );
2284         register_ber_oid_dissector_handle("0.4.0.0.1.0.29.3", map_handle, proto_gsm_map,"anyTimeInfoEnquiryContext-v3" );
2285         register_ber_oid_dissector_handle("0.4.0.0.1.0.31.3", map_handle, proto_gsm_map,"groupCallControlContext-v3" );
2286         register_ber_oid_dissector_handle("0.4.0.0.1.0.32.3", map_handle, proto_gsm_map,"gprsLocationUpdateContext-v3" );
2287         register_ber_oid_dissector_handle("0.4.0.0.1.0.33.4", map_handle, proto_gsm_map,"gprsLocationInfoRetrievalContext-v4" );
2288         register_ber_oid_dissector_handle("0.4.0.0.1.0.33.3", map_handle, proto_gsm_map,"gprsLocationInfoRetrievalContext-v3" );
2289         register_ber_oid_dissector_handle("0.4.0.0.1.0.34.3", map_handle, proto_gsm_map,"failureReportContext-v3" );
2290         register_ber_oid_dissector_handle("0.4.0.0.1.0.35.3", map_handle, proto_gsm_map,"gprsNotifyContext-v3" );
2291         register_ber_oid_dissector_handle("0.4.0.0.1.0.36.3", map_handle, proto_gsm_map,"ss-InvocationNotificationContext-v3" );
2292         register_ber_oid_dissector_handle("0.4.0.0.1.0.37.3", map_handle, proto_gsm_map,"locationSvcGatewayContext-v3" );
2293         register_ber_oid_dissector_handle("0.4.0.0.1.0.38.3", map_handle, proto_gsm_map,"locationSvcEnquiryContext-v3" );
2294         register_ber_oid_dissector_handle("0.4.0.0.1.0.39.3", map_handle, proto_gsm_map,"authenticationFailureReportContext-v3" );
2295         register_ber_oid_dissector_handle("0.4.0.0.1.0.40.3", map_handle, proto_gsm_map,"secureTransportHandlingContext-v3" );
2296         register_ber_oid_dissector_handle("0.4.0.0.1.0.41.3", map_handle, proto_gsm_map,"shortMsgMT-Relay-VGCS-Context-v3" );
2297         register_ber_oid_dissector_handle("0.4.0.0.1.0.42.3", map_handle, proto_gsm_map,"mm-EventReportingContext-v3" );
2298         register_ber_oid_dissector_handle("0.4.0.0.1.0.43.3", map_handle, proto_gsm_map,"anyTimeInfoHandlingContext-v3" );
2299         register_ber_oid_dissector_handle("0.4.0.0.1.0.44.3", map_handle, proto_gsm_map,"resourceManagementContext-v3" );
2300         register_ber_oid_dissector_handle("0.4.0.0.1.0.45.3", map_handle, proto_gsm_map,"groupCallInfoRetrievalContext-v3" );
2301         /* Private extension container */
2302         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" );
2303     }
2304     else {
2305         range_foreach(ssn_range, range_delete_callback);
2306         g_free(ssn_range);
2307     }
2308
2309     ssn_range = range_copy(global_ssn_range);
2310     range_foreach(ssn_range, range_add_callback);
2311
2312 }
2313
2314 /*--- proto_register_gsm_map -------------------------------------------*/
2315 void proto_register_gsm_map(void) {
2316         module_t *gsm_map_module;
2317         expert_module_t* expert_gsm_map;
2318
2319   /* List of fields */
2320   static hf_register_info hf[] = {
2321       { &hf_gsm_map_old_Component_PDU,
2322         { "Component", "gsm_map.old.Component",
2323           FT_UINT32, BASE_DEC, VALS(gsm_old_Component_vals), 0,
2324           NULL, HFILL }},
2325       { &hf_gsm_map_getPassword,
2326         { "getPassword", "gsm_map.getPassword",
2327           FT_UINT8, BASE_DEC, VALS(gsm_old_GetPasswordArg_vals), 0,
2328           NULL, HFILL }},
2329       { &hf_gsm_map_currentPassword,
2330         { "currentPassword", "gsm_map.currentPassword",
2331           FT_STRING, BASE_NONE, NULL, 0,
2332           NULL, HFILL }},
2333       { &hf_gsm_map_extension,
2334         { "Extension", "gsm_map.extension",
2335           FT_BOOLEAN, 8, TFS(&gsm_map_extension_value), 0x80,
2336           NULL, HFILL }},
2337       { &hf_gsm_map_nature_of_number,
2338         { "Nature of number", "gsm_map.nature_of_number",
2339           FT_UINT8, BASE_HEX|BASE_EXT_STRING, &gsm_map_nature_of_number_values_ext, 0x70,
2340           NULL, HFILL }},
2341       { &hf_gsm_map_number_plan,
2342         { "Number plan", "gsm_map.number_plan",
2343           FT_UINT8, BASE_HEX|BASE_EXT_STRING, &gsm_map_number_plan_values_ext, 0x0f,
2344           NULL, HFILL }},
2345       { &hf_gsm_map_isdn_address_digits,
2346         { "ISDN Address digits", "gsm_map.isdn.address.digits",
2347           FT_STRING, BASE_NONE, NULL, 0,
2348           NULL, HFILL }},
2349       { &hf_gsm_map_address_digits,
2350         { "Address digits", "gsm_map.address.digits",
2351           FT_STRING, BASE_NONE, NULL, 0,
2352           NULL, HFILL }},
2353       { &hf_gsm_map_servicecentreaddress_digits,
2354         { "ServiceCentreAddress digits", "gsm_map.servicecentreaddress_digits",
2355           FT_STRING, BASE_NONE, NULL, 0,
2356           NULL, HFILL }},
2357       { &hf_gsm_map_TBCD_digits,
2358         { "TBCD digits", "gsm_map.tbcd_digits",
2359           FT_STRING, BASE_NONE, NULL, 0,
2360           NULL, HFILL }},
2361       { &hf_gsm_map_Ss_Status_unused,
2362         { "Unused", "gsm_map.unused",
2363           FT_UINT8, BASE_HEX, NULL, 0xf0,
2364           NULL, HFILL }},
2365       { &hf_gsm_map_Ss_Status_q_bit,
2366         { "Q bit", "gsm_map.ss_status_q_bit",
2367           FT_BOOLEAN, 8, TFS(&gsm_map_Ss_Status_q_bit_values), 0x08,
2368           NULL, HFILL }},
2369       { &hf_gsm_map_Ss_Status_p_bit,
2370         { "P bit", "gsm_map.ss_status_p_bit",
2371           FT_BOOLEAN, 8, TFS(&gsm_map_Ss_Status_p_values), 0x04,
2372           NULL, HFILL }},
2373       { &hf_gsm_map_Ss_Status_r_bit,
2374         { "R bit", "gsm_map.ss_status_r_bit",
2375           FT_BOOLEAN, 8, TFS(&gsm_map_Ss_Status_r_values), 0x02,
2376           NULL, HFILL }},
2377       { &hf_gsm_map_Ss_Status_a_bit,
2378         { "A bit", "gsm_map.ss_status_a_bit",
2379           FT_BOOLEAN, 8, TFS(&gsm_map_Ss_Status_a_values), 0x01,
2380           NULL, HFILL }},
2381       { &hf_gsm_map_notification_to_forwarding_party,
2382         { "Notification to forwarding party", "gsm_map.notification_to_forwarding_party",
2383           FT_BOOLEAN, 8, TFS(&notification_value), 0x80,
2384           NULL, HFILL }},
2385       { &hf_gsm_map_redirecting_presentation,
2386         { "Redirecting presentation", "gsm_map.redirecting_presentation",
2387           FT_BOOLEAN, 8, TFS(&redirecting_presentation_value), 0x40,
2388           NULL, HFILL }},
2389       { &hf_gsm_map_notification_to_calling_party,
2390         { "Notification to calling party", "gsm_map.notification_to_clling_party",
2391           FT_BOOLEAN, 8, TFS(&notification_value), 0x20,
2392           NULL, HFILL }},
2393       { &hf_gsm_map_forwarding_reason,
2394         { "Forwarding reason", "gsm_map.forwarding_reason",
2395           FT_UINT8, BASE_HEX, VALS(forwarding_reason_values), 0x0c,
2396           NULL, HFILL }},
2397       { &hf_gsm_map_pdp_type_org,
2398         { "PDP Type Organization", "gsm_map.pdp_type_org",
2399           FT_UINT8, BASE_HEX, VALS(pdp_type_org_values), 0x0f,
2400           NULL, HFILL }},
2401       { &hf_gsm_map_etsi_pdp_type_number,
2402         { "PDP Type Number", "gsm_map.pdp_type_number",
2403           FT_UINT8, BASE_HEX, VALS(etsi_pdp_type_number_values), 0,
2404           "ETSI PDP Type Number", HFILL }},
2405       { &hf_gsm_map_ietf_pdp_type_number,
2406         { "PDP Type Number", "gsm_map.ietf_pdp_type_number",
2407           FT_UINT8, BASE_HEX, VALS(ietf_pdp_type_number_values), 0,
2408           "IETF PDP Type Number", HFILL }},
2409       { &hf_gsm_map_ext_qos_subscribed_pri,
2410         { "Allocation/Retention priority", "gsm_map.ext_qos_subscribed_pri",
2411           FT_UINT8, BASE_DEC, NULL, 0xff,
2412           NULL, HFILL }},
2413       { &hf_gsm_map_qos_traffic_cls,
2414         { "Traffic class", "gsm_map.qos.traffic_cls",
2415           FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_traffic_cls_vals), 0xe0,
2416           NULL, HFILL }},
2417       { &hf_gsm_map_qos_del_order,
2418         { "Delivery order", "gsm_map.qos.del_order",
2419           FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_traffic_cls_vals), 0x18,
2420           NULL, HFILL }},
2421       { &hf_gsm_map_qos_del_of_err_sdu,
2422         { "Delivery of erroneous SDUs", "gsm_map.qos.del_of_err_sdu",
2423           FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_del_of_err_sdu_vals), 0x03,
2424           NULL, HFILL }},
2425       { &hf_gsm_map_qos_ber,
2426         { "Residual Bit Error Rate (BER)", "gsm_map.qos.ber",
2427           FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_ber_vals), 0xf0,
2428           NULL, HFILL }},
2429       { &hf_gsm_map_qos_sdu_err_rat,
2430         { "SDU error ratio", "gsm_map.qos.sdu_err_rat",
2431           FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_sdu_err_rat_vals), 0x0f,
2432           NULL, HFILL }},
2433       { &hf_gsm_map_qos_traff_hdl_pri,
2434         { "Traffic handling priority", "gsm_map.qos.traff_hdl_pri",
2435           FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_traff_hdl_pri_vals), 0x03,
2436           NULL, HFILL }},
2437
2438       { &hf_gsm_map_qos_max_sdu,
2439         { "Maximum SDU size", "gsm_map.qos.max_sdu",
2440           FT_UINT32, BASE_DEC, NULL, 0x0,
2441           NULL, HFILL }},
2442       { &hf_gsm_map_max_brate_ulink,
2443         { "Maximum bit rate for uplink in kbit/s", "gsm_map.qos.max_brate_ulink",
2444           FT_UINT32, BASE_DEC, NULL, 0x0,
2445           "Maximum bit rate for uplink", HFILL }},
2446       { &hf_gsm_map_max_brate_dlink,
2447         { "Maximum bit rate for downlink in kbit/s", "gsm_map.qos.max_brate_dlink",
2448           FT_UINT32, BASE_DEC, NULL, 0x0,
2449           "Maximum bit rate for downlink", HFILL }},
2450       { &hf_gsm_map_qos_transfer_delay,
2451         { "Transfer delay (Raw data see TS 24.008 for interpretation)", "gsm_map.qos.transfer_delay",
2452           FT_UINT8, BASE_DEC, NULL, 0xfc,
2453           "Transfer delay", HFILL }},
2454       { &hf_gsm_map_guaranteed_max_brate_ulink,
2455         { "Guaranteed bit rate for uplink in kbit/s", "gsm_map.qos.brate_ulink",
2456           FT_UINT32, BASE_DEC, NULL, 0x0,
2457           "Guaranteed bit rate for uplink", HFILL }},
2458       { &hf_gsm_map_guaranteed_max_brate_dlink,
2459         { "Guaranteed bit rate for downlink in kbit/s", "gsm_map.qos.brate_dlink",
2460           FT_UINT32, BASE_DEC, NULL, 0x0,
2461           "Guaranteed bit rate for downlink", HFILL }},
2462       { &hf_gsm_map_GSNAddress_IPv4,
2463         { "GSN-Address IPv4",  "gsm_map.gsnaddress_ipv4",
2464           FT_IPv4, BASE_NONE, NULL, 0,
2465           "IPAddress IPv4", HFILL }},
2466       { &hf_gsm_map_GSNAddress_IPv6,
2467         { "GSN Address IPv6",  "gsm_map.gsnaddress_ipv6",
2468           FT_IPv4, BASE_NONE, NULL, 0,
2469           "IPAddress IPv6", HFILL }},
2470       { &hf_gsm_map_ranap_service_Handover,
2471         { "service-Handover", "gsm_map.ranap.service_Handover",
2472           FT_UINT32, BASE_DEC, VALS(ranap_Service_Handover_vals), 0,
2473           "gsm_map.ranap.Service_Handover", HFILL }},
2474       { &hf_gsm_map_IntegrityProtectionInformation,
2475         { "IntegrityProtectionInformation", "gsm_map.ranap.IntegrityProtectionInformation",
2476           FT_NONE, BASE_NONE, NULL, 0,
2477           "gsm_map.ranap.IntegrityProtectionInformation", HFILL }},
2478       { &hf_gsm_map_EncryptionInformation,
2479         { "EncryptionInformation", "gsm_map.ranap.EncryptionInformation",
2480           FT_NONE, BASE_NONE, NULL, 0,
2481           "gsm_map.ranap.EncryptionInformation", HFILL }},
2482       { &hf_gsm_map_PlmnContainer_PDU,
2483         { "PlmnContainer", "gsm_map.PlmnContainer",
2484           FT_NONE, BASE_NONE, NULL, 0,
2485           "gsm_map.PlmnContainer", HFILL }},
2486       { &hf_gsm_map_ss_SS_UserData,
2487         { "SS-UserData", "gsm_ss.SS_UserData",
2488           FT_STRING, BASE_NONE, NULL, 0,
2489           "gsm_map.ss.SS_UserData", HFILL }},
2490       { &hf_gsm_map_cbs_coding_grp,
2491         { "Coding Group","gsm_map.cbs.coding_grp",
2492           FT_UINT8,BASE_DEC|BASE_EXT_STRING, &gsm_map_cbs_data_coding_scheme_coding_grp_vals_ext, 0xf0,
2493           NULL, HFILL }
2494       },
2495       { &hf_gsm_map_cbs_coding_grp0_lang,
2496         { "Language","gsm_map.cbs.coding_grp0_lang",
2497           FT_UINT8,BASE_DEC|BASE_EXT_STRING, &gsm_map_cbs_coding_grp0_lang_vals_ext, 0x0f,
2498           NULL, HFILL }
2499       },
2500       { &hf_gsm_map_cbs_coding_grp1_lang,
2501         { "Language","gsm_map.cbs.coding_grp1_lang",
2502           FT_UINT8,BASE_DEC|BASE_EXT_STRING, &gsm_map_cbs_coding_grp1_lang_vals_ext, 0x0f,
2503           NULL, HFILL }
2504       },
2505       { &hf_gsm_map_cbs_coding_grp2_lang,
2506         { "Language","gsm_map.cbs.coding_grp2_lang",
2507           FT_UINT8,BASE_DEC|BASE_EXT_STRING, &gsm_map_cbs_coding_grp2_lang_vals_ext, 0x0f,
2508           NULL, HFILL }
2509       },
2510       { &hf_gsm_map_cbs_coding_grp3_lang,
2511         { "Language","gsm_map.cbs.coding_grp3_lang",
2512           FT_UINT8,BASE_DEC|BASE_EXT_STRING, &gsm_map_cbs_coding_grp3_lang_vals_ext, 0x0f,
2513           NULL, HFILL }
2514       },
2515       { &hf_gsm_map_cbs_coding_grp4_7_comp,
2516         { "Compressed indicator","gsm_map.cbs.coding_grp4_7_comp",
2517           FT_BOOLEAN, 8, TFS(&gsm_map_cbs_coding_grp4_7_comp_vals), 0x20,
2518           NULL, HFILL }
2519       },
2520       { &hf_gsm_map_cbs_coding_grp4_7_class_ind,
2521         { "Message Class present","gsm_map.cbs.coding_grp4_7_class_ind",
2522           FT_BOOLEAN, 8, TFS(&gsm_map_cbs_coding_grp4_7_class_ind_vals), 0x10,
2523           NULL, HFILL }
2524       },
2525       { &hf_gsm_map_cbs_coding_grp4_7_char_set,
2526         { "Character set being used","gsm_map.cbs.coding_grp4_7_char_set",
2527           FT_UINT8,BASE_DEC, VALS(gsm_map_cbs_coding_grp4_7_char_set_vals), 0x0c,
2528           NULL, HFILL }
2529       },
2530       { &hf_gsm_map_cbs_coding_grp4_7_class,
2531         { "Message Class","gsm_map.cbs.coding_grp4_7_class",
2532           FT_UINT8,BASE_DEC, VALS(gsm_map_cbs_coding_grp4_7_class_vals), 0x03,
2533           NULL, HFILL }
2534       },
2535       { &hf_gsm_map_cbs_coding_grp15_mess_code,
2536         { "Message coding","gsm_map.cbs.cbs_coding_grp15_mess_code",
2537           FT_UINT8,BASE_DEC, VALS(gsm_map_cbs_coding_grp15_mess_code_vals), 0x04,
2538           NULL, HFILL }
2539       },
2540       { &hf_gsm_map_cbs_coding_grp15_class,
2541         { "Message Class","gsm_map.cbs.gsm_map_cbs_coding_grp15_class",
2542           FT_UINT8,BASE_DEC, VALS(gsm_map_cbs_coding_grp15_class_vals), 0x03,
2543           NULL, HFILL }
2544       },
2545       { &hf_gsm_map_tmsi,
2546         { "tmsi", "gsm_map.tmsi",
2547           FT_BYTES, BASE_NONE, NULL, 0,
2548           "gsm_map.TMSI", HFILL }},
2549
2550       { &hf_gsm_map_ie_tag,
2551         { "Tag", "gsm_map.ie_tag",
2552           FT_UINT8, BASE_DEC, VALS(gsm_map_tag_vals), 0,
2553           "GSM 04.08 tag", HFILL }},
2554       { &hf_gsm_map_len,
2555         { "Length", "gsm_map.length",
2556           FT_UINT8, BASE_DEC, NULL, 0,
2557           NULL, HFILL }},
2558       { &hf_gsm_map_disc_par,
2559         { "Discrimination parameter", "gsm_map.disc_par",
2560           FT_UINT8, BASE_DEC, VALS(gsm_map_disc_par_vals), 0,
2561           NULL, HFILL }},
2562       { &hf_gsm_map_dlci,
2563         { "DLCI", "gsm_map.dlci",
2564           FT_UINT8, BASE_DEC, NULL, 0,
2565           "Data Link Connection Indicator", HFILL }},
2566       { &hf_gsm_apn_str,
2567         { "APN", "gsm_map.apn_str",
2568           FT_STRING, BASE_NONE, NULL, 0,
2569           NULL, HFILL }},
2570       { &hf_gsm_map_locationnumber_odd_even,
2571         { "Odd/Even", "gsm_map.locationnumber.odd_even",
2572           FT_BOOLEAN, 8, NULL, 0x80,
2573           NULL, HFILL }},
2574       { &hf_gsm_map_locationnumber_nai,
2575         { "Nature of address indicator", "gsm_map.locationnumber.nai",
2576           FT_UINT8, BASE_RANGE_STRING | BASE_DEC, RVALS(gsm_map_na_vals), 0x3f,
2577           NULL, HFILL }},
2578       { &hf_gsm_map_locationnumber_inn,
2579         { "Internal Network Number indicator (INN)", "gsm_map.locationnumber.inn",
2580           FT_BOOLEAN, 8, NULL, 0x80,
2581           NULL, HFILL }},
2582       { &hf_gsm_map_locationnumber_npi,
2583         { "Numbering plan indicator", "gsm_map.locationnumber.npi",
2584           FT_UINT8, BASE_DEC, VALS(gsm_map_np_vals), 0x30,
2585           NULL, HFILL }},
2586       { &hf_gsm_map_locationnumber_apri,
2587         { "Address presentation restricted indicator", "gsm_map.locationnumber.apri",
2588           FT_UINT8, BASE_DEC, VALS(gsm_map_addr_pres_rest_vals), 0x0c,
2589           NULL, HFILL }},
2590       { &hf_gsm_map_locationnumber_screening_ind,
2591         { "Screening indicator", "gsm_map.locationnumber.screening_ind",
2592           FT_UINT8, BASE_DEC, VALS(gsm_map_screening_ind_vals), 0x03,
2593           NULL, HFILL }},
2594       { &hf_gsm_map_locationnumber_digits,
2595         { "Address digits", "gsm_map.locationnumber.digits",
2596           FT_STRING, BASE_NONE, NULL, 0,
2597           NULL, HFILL }},
2598       { &hf_gsm_map_ericsson_locationInformation_rat,
2599         { "RAT", "gsm_map.ericsson.locationInformation.rat",
2600           FT_UINT8, BASE_DEC, VALS(gsm_map_ericsson_locationInformation_rat_vals), 0,
2601           "Radio Access Technology", HFILL }},
2602       { &hf_gsm_map_ericsson_locationInformation_lac,
2603         { "LAC", "gsm_map.ericsson.locationInformation.lac",
2604           FT_UINT16, BASE_DEC_HEX, NULL, 0,
2605           "Location Area Code", HFILL }},
2606       { &hf_gsm_map_ericsson_locationInformation_ci,
2607         { "CI", "gsm_map.ericsson.locationInformation.ci",
2608           FT_UINT16, BASE_DEC_HEX, NULL, 0,
2609           "Cell Identity", HFILL }},
2610       { &hf_gsm_map_ericsson_locationInformation_sac,
2611         { "SAC", "gsm_map.ericsson.locationInformation.sac",
2612           FT_UINT16, BASE_DEC_HEX, NULL, 0,
2613           "Service Area Code", HFILL }},
2614
2615 #include "packet-gsm_map-hfarr.c"
2616   };
2617
2618   /* List of subtrees */
2619   static gint *ett[] = {
2620     &ett_gsm_map,
2621     &ett_gsm_map_InvokeId,
2622     &ett_gsm_map_InvokePDU,
2623     &ett_gsm_map_ReturnResultPDU,
2624     &ett_gsm_map_ReturnErrorPDU,
2625     &ett_gsm_map_ReturnResult_result,
2626     &ett_gsm_map_ReturnError_result,
2627     &ett_gsm_map_GSMMAPPDU,
2628     &ett_gsm_map_ext_qos_subscribed,
2629     &ett_gsm_map_pdptypenumber,
2630     &ett_gsm_map_RAIdentity,
2631     &ett_gsm_map_LAIFixedLength,
2632     &ett_gsm_map_isdn_address_string,
2633     &ett_gsm_map_geo_desc,
2634     &ett_gsm_map_LongSignalInfo,
2635     &ett_gsm_map_RadioResourceInformation,
2636     &ett_gsm_map_MSNetworkCapability,
2637     &ett_gsm_map_MSRadioAccessCapability,
2638     &ett_gsm_map_externalsignalinfo,
2639     &ett_gsm_map_cbs_data_coding,
2640     &ett_gsm_map_GlobalCellId,
2641     &ett_gsm_map_GeographicalInformation,
2642     &ett_gsm_map_apn_str,
2643     &ett_gsm_map_LocationNumber,
2644     &ett_gsm_map_ericsson_locationInformation,
2645
2646 #include "packet-gsm_map-ettarr.c"
2647   };
2648
2649   static ei_register_info ei[] = {
2650      { &ei_gsm_map_unknown_sequence3, { "gsm_map.unknown.sequence3", PI_UNDECODED, PI_ERROR, "Unknown or not implemented [3] sequence", EXPFILL }},
2651      { &ei_gsm_map_unknown_sequence, { "gsm_map.unknown.sequence", PI_UNDECODED, PI_ERROR, "Unknown or not implemented sequence", EXPFILL }},
2652      { &ei_gsm_map_unknown_parameter, { "gsm_map.unknown.parameter", PI_UNDECODED, PI_ERROR, "Unknown or not implemented parameter", EXPFILL }},
2653      { &ei_gsm_map_unknown_invokeData, { "gsm_map.unknown.invokeData", PI_MALFORMED, PI_WARN, "Unknown invokeData", EXPFILL }},
2654   };
2655
2656   static const enum_val_t application_context_modes[] = {
2657     {"Use Application Context from the trace", "Use application context from the trace", APPLICATON_CONTEXT_FROM_TRACE},
2658     {"Treat as AC 1", "Treat as AC 1", 1},
2659     {"Treat as AC 2", "Treat as AC 2", 2},
2660     {"Treat as AC 3", "Treat as AC 3", 3},
2661     {NULL, NULL, -1}
2662   };
2663
2664
2665   /* Register protocol */
2666   proto_gsm_map_dialogue =proto_gsm_map = proto_register_protocol(PNAME, PSNAME, PFNAME);
2667
2668   register_dissector("gsm_map", dissect_gsm_map, proto_gsm_map);
2669
2670   /* Register fields and subtrees */
2671   proto_register_field_array(proto_gsm_map, hf, array_length(hf));
2672   proto_register_subtree_array(ett, array_length(ett));
2673   expert_gsm_map = expert_register_protocol(proto_gsm_map);
2674   expert_register_field_array(expert_gsm_map, ei, array_length(ei));
2675
2676   sms_dissector_table = register_dissector_table("gsm_map.sms_tpdu",
2677                                                  "GSM SMS TPDU", FT_UINT8,
2678                                                  BASE_DEC);
2679
2680   map_prop_arg_opcode_table = register_dissector_table("gsm_map.prop.arg.opcode", "Proprietary Opcodes", FT_UINT8, BASE_DEC);
2681   map_prop_res_opcode_table = register_dissector_table("gsm_map.prop.res.opcode", "Proprietary Opcodes", FT_UINT8, BASE_DEC);
2682   map_prop_err_opcode_table = register_dissector_table("gsm_map.prop.err.opcode", "Proprietary Opcodes", FT_UINT8, BASE_DEC);
2683
2684   gsm_map_tap = register_tap("gsm_map");
2685
2686 #include "packet-gsm_map-dis-tab.c" */
2687   oid_add_from_string("ericsson-gsm-Map-Ext","1.2.826.0.1249.58.1.0" );
2688   oid_add_from_string("accessTypeNotAllowed-id","1.3.12.2.1107.3.66.1.2");
2689   /*oid_add_from_string("map-ac networkLocUp(1) version3(3)","0.4.0.0.1.0.1.3" );
2690    *
2691    * Register our configuration options, particularly our ssn:s
2692    * Set default SSNs
2693    */
2694   range_convert_str(&global_ssn_range, "6-9", MAX_SSN);
2695
2696   gsm_map_module = prefs_register_protocol(proto_gsm_map, proto_reg_handoff_gsm_map);
2697
2698   prefs_register_range_preference(gsm_map_module, "tcap.ssn", "TCAP SSNs",
2699                                   "TCAP Subsystem numbers used for GSM MAP",
2700                                   &global_ssn_range, MAX_SSN);
2701
2702   prefs_register_enum_preference(gsm_map_module, "application.context.version",
2703                                   "Application context version",
2704                                   "How to treat Application context",
2705                                   &pref_application_context_version, application_context_modes, APPLICATON_CONTEXT_FROM_TRACE);
2706
2707   prefs_register_bool_preference(gsm_map_module, "ericsson.proprietary.extensions",
2708                                   "Dissect Ericsson proprietary extensions",
2709                                   "When enabled, dissector will use the non 3GPP standard extensions from Ericsson (that can override the standard ones)",
2710                                   &pref_ericsson_proprietary_ext);
2711 }