07c597fbf83bd2487f79e606ba34e0e82a10f4b9
[obnox/wireshark/wip.git] / asn1 / gsm_map / gsm_map.cnf
1
2 #.OPT
3 -b 
4 #-d satcom
5 #-s packet-gsm_map-tmp
6 -k
7 -o gsm_map
8 #.END
9
10 #.MODULE
11 MAP-BS-Code             gsm_map        
12 MAP-TS-Code             gsm_map        
13 MAP-SS-Code             gsm_map        
14 MAP-ExtensionDataTypes  gsm_map        
15 MAP-CommonDataTypes     gsm_map
16
17 MAP-SS-DataTypes        gsm_map.ss
18 MAP-OM-DataTypes        gsm_map.om
19 MAP-ER-DataTypes        gsm_map.er
20 MAP-SM-DataTypes        gsm_map.sm
21 MAP-MS-DataTypes        gsm_map.ms
22 MAP-LCS-DataTypes       gsm_map.lcs
23 MAP-GR-DataTypes        gsm_map.gr
24 MAP-CH-DataTypes        gsm_map.ch
25
26 MAP-Errors              gsm_map
27 MAP-LocationServiceOperations   gsm_map
28 MAP-Group-Call-Operations       gsm_map
29 MAP-ShortMessageServiceOperations  gsm_map
30 MAP-SupplementaryServiceOperations  gsm_map
31 MAP-CallHandlingOperations      gsm_map
32 MAP-OperationAndMaintenanceOperations  gsm_map
33 MAP-MobileServiceOperations     gsm_map
34 MAP-Protocol                    gsm_map
35 MAP-DialogueInformation         gsm_map.dialogue
36 MAP-ApplicationContexts         gsm_map
37 SS-DataTypes                                    gsm_ss
38 SS-Operations                                   gsm_ss
39 DummyMAP                                                gsm_old
40
41 Remote-Operations-Information-Objects ROS
42
43 #.OMIT_ASSIGNMENT
44 Code
45 Priority
46 CommonComponentId
47 SubscriberId
48 GuidanceInfo
49 SS-InfoList
50 #.END
51 #.PDU_NEW
52 LCS-ClientID
53 ISDN-AddressString
54
55 #.EXPORTS
56 AddressString
57 Add-GeographicalInformation
58 AgeOfLocationInformation
59 AlertingPattern
60 AreaEventInfo
61 CallReferenceNumber
62 CCBS-Feature
63 CellGlobalIdOrServiceAreaIdFixedLength
64 CUG-CheckInfo
65 CUG-Index
66 CUG-Interlock
67 CUG-Info
68 CurrentPassword
69 D-CSI
70 DeferredLocationEventType
71 DefaultGPRS-Handling
72 DefaultSMS-Handling
73 EraseCC-EntryArg
74 EraseCC-EntryRes
75 Ext-BasicServiceCode
76 Ext-ForwOptions
77 Ext-GeographicalInformation
78 Ext-NoRepCondTime
79 Ext-QoS-Subscribed
80 Ext2-QoS-Subscribed
81 Ext3-QoS-Subscribed
82 ExtensionContainer
83 GeographicalInformation
84 GetPasswordArg
85 GlobalCellId
86 GPRSChargingID
87 GPRSMSClass
88 GSMMAPLocalErrorcode
89 GSN-Address
90 IMEI
91 IMSI
92 InterrogateSS-Res
93 ISDN-AddressString
94 ISDN-AddressString_PDU
95 ISDN-SubaddressString
96 LAIFixedLength
97 LCSClientExternalID
98 LCS-ClientID
99 LCS-ClientID_PDU
100 LCSClientInternalID
101 LCSClientName
102 LCSClientType
103 LCSRequestorID
104 LCSCodeword
105 LCS-Priority
106 LCSServiceTypeID
107 LCS-ReferenceNumber
108 LCS-QoS
109 LocationInformation
110 LocationMethod
111 LocationType
112 LSAIdentity
113 MS-Classmark2
114 NewPassword
115 NotificationToMSUser
116 O-CSI
117 O-BcsmCamelTDPCriteriaList
118 OfferedCamel4Functionalities
119 PositionMethodFailure-Diagnostic
120 ProtectedPayload
121 QoS-Subscribed
122 RAIdentity
123 RegisterCC-EntryRes
124 RegisterSS-Arg
125 SubscriberState
126 SecurityHeader
127 ServiceKey
128 SupportedCamelPhases
129 SupportedGADShapes
130 SuppressionOfAnnouncement
131 SS-Code
132 SS-Status
133 SS-Info
134 SS-ForBS-Code
135 UnauthorizedLCSClient-Diagnostic
136 USSD-DataCodingScheme
137 USSD-String
138 USSD-Arg
139 USSD-Res
140 UU-Data
141 VelocityEstimate
142 #.END
143 #.REGISTER
144 MAP-DialoguePDU                         B "0.4.0.0.1.1.1.1" "map-DialogueAS"
145
146 # This table creates the value_sting to name GSM MAP operation codes and errors
147 # in file packet-camel-table.c which is included in the template file
148 #
149 #.TABLE_BODY OPERATION
150         { %(&operationCode)s, "%(_ident)s" },
151 #.END
152
153 #.TABLE2_BODY ERROR
154         { %(&errorCode)s, "%(_ident)s" },  
155 #.END
156
157
158 # Conformance for ROS stuff
159
160 #.FN_BODY InvokeParameter
161         offset = dissect_invokeData(tree, tvb, offset, actx);
162
163 #.FN_BODY ReturnResultParameter
164         offset = dissect_returnResultData(tree, tvb, offset, actx);
165
166 #.FN_BODY ReturnErrorParameter
167         offset = dissect_returnErrorData(tree, tvb, offset, actx);
168
169 #.FN_PARS  GSMMAPOperationLocalvalue
170
171   VAL_PTR = &opcode
172
173 #.FN_BODY  GSMMAPOperationLocalvalue
174
175 %(DEFAULT_BODY)s 
176   col_append_str(actx->pinfo->cinfo, COL_INFO, gsm_map_opr_code(opcode));
177   col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
178
179 #.FN_PARS  GSMMAPLocalErrorcode
180
181   VAL_PTR = &errorCode
182 # End ROS
183 #----------------------------------------------------------------------------------------
184
185 #.FN_PARS PrivateExtension/extId  FN_VARIANT = _str  VAL_PTR = &obj_id
186
187 #.FN_BODY PrivateExtension/extType      
188   proto_tree_add_text(tree, tvb, offset, -1, "Extension Data");
189   if (obj_id){
190          offset=call_ber_oid_callback(obj_id, tvb, offset, actx->pinfo, tree);
191   }else{
192          call_dissector(data_handle, tvb, actx->pinfo, tree);
193          offset = tvb_length_remaining(tvb,offset);
194   }     
195
196 #.FN_PARS  AccessNetworkProtocolId
197
198   VAL_PTR = &AccessNetworkProtocolId
199
200 #.FN_BODY AddressString VAL_PTR = &parameter_tvb
201
202  tvbuff_t       *parameter_tvb;
203  proto_tree *subtree;
204
205 %(DEFAULT_BODY)s
206
207  if (!parameter_tvb)
208         return offset;
209
210  subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_isdn_address_string);
211  dissect_gsm_map_msisdn(parameter_tvb, actx->pinfo , subtree);
212
213 #.FN_BODY TBCD-STRING VAL_PTR = &parameter_tvb
214  tvbuff_t       *parameter_tvb;
215  const char     *digit_str;
216
217  %(DEFAULT_BODY)s
218
219  if (!parameter_tvb)
220         return offset;
221
222  digit_str = unpack_digits(parameter_tvb, 0);
223  proto_tree_add_string(tree, hf_gsm_map_TBCD_digits, parameter_tvb, 0, -1, digit_str);
224
225 #----------------------------------------------------------------------------------------
226 #.FN_BODY LongSignalInfo VAL_PTR = &parameter_tvb
227 #
228 #7.6.9.1 AN-apdu
229 #This parameter includes one or two concatenated complete 3GPP TS 25.413 or 3GPP TS 48.006 [48] messages, as
230 #described in 3GPP TS 23.009 and 3GPP TS 29.010. The access network protocol ID indicates that the message or
231 #messages are according to either 3GPP TS 48.006 [48] or 3GPP TS 25.413. For the coding of the messages see 3GPP
232 #TS 25.413, 3GPP TS 48.006 [48] and 3GPP TS 48.008 [49].
233
234  tvbuff_t       *parameter_tvb;
235  guint8         octet;
236  guint8         length;
237  tvbuff_t       *next_tvb;
238  proto_tree *subtree;
239
240
241 %(DEFAULT_BODY)s
242
243  if (!parameter_tvb)
244         return offset;
245
246  subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_LongSignalInfo); 
247
248  switch (AccessNetworkProtocolId){
249         /* ts3G-48006 */
250         case 1:
251                 octet = tvb_get_guint8(parameter_tvb,0);
252                 /* Discrimination parameter */
253                 proto_tree_add_item(subtree, hf_gsm_map_disc_par, parameter_tvb, 0,1,FALSE);
254                 if ( octet == 0) {/* DISCRIMINATION TS 48 006(GSM 08.06 version 5.3.0) */
255                         /* Strip off discrimination and length */
256                         length = tvb_get_guint8(parameter_tvb,0);
257                         proto_tree_add_item(subtree, hf_gsm_map_len, parameter_tvb, 1,1,FALSE);
258                         next_tvb = tvb_new_subset_remaining(parameter_tvb, 2);
259                         dissect_bssmap(next_tvb, actx->pinfo, subtree);
260                 }else if(octet==1){
261                         proto_tree_add_item(subtree, hf_gsm_map_dlci, parameter_tvb, 1,1,FALSE);
262                         proto_tree_add_item(subtree, hf_gsm_map_len, parameter_tvb, 2,1,FALSE);
263                         length = tvb_get_guint8(parameter_tvb,0);
264                         next_tvb = tvb_new_subset_remaining(parameter_tvb, 3);
265                         call_dissector(dtap_handle, next_tvb, actx->pinfo, subtree); 
266                 }       
267                 break;
268         /* ts3G-25413 */
269         case 2:
270                 call_dissector(ranap_handle, parameter_tvb, actx->pinfo, tree); 
271                 break;
272         default:
273                 break;
274
275  }
276 # Set SENT/RECEIVED depending if ISDN-AddressString or AddressString is used.
277 # as it's a CHOICE only one is present.
278 #.FN_BODY SM-RP-OAold/serviceCentreAddressOA
279         actx->pinfo->p2p_dir = P2P_DIR_SENT;
280 %(DEFAULT_BODY)s
281
282 #.FN_BODY SM-RP-OA/serviceCentreAddressOA
283         actx->pinfo->p2p_dir = P2P_DIR_SENT;
284 %(DEFAULT_BODY)s
285
286 #.FN_BODY SM-RP-OAold/msisdn
287 actx->pinfo->p2p_dir = P2P_DIR_RECV;
288  %(DEFAULT_BODY)s
289
290 #.FN_BODY SM-RP-OA/msisdn
291 actx->pinfo->p2p_dir = P2P_DIR_RECV;
292  %(DEFAULT_BODY)s
293
294 #.FN_BODY SignalInfo VAL_PTR = &parameter_tvb
295  tvbuff_t       *parameter_tvb;
296
297  %(DEFAULT_BODY)s
298         actx->value_ptr = parameter_tvb;
299
300
301 #.FN_BODY SM-DeliveryFailureCause
302         /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
303 %(DEFAULT_BODY)s
304
305         if (!actx->value_ptr)
306                 return offset;
307         dissector_try_uint(sms_dissector_table, 0, actx->value_ptr, actx->pinfo, top_tree);
308
309 #.FN_BODY ForwardSM-Arg
310
311         /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
312 %(DEFAULT_BODY)s
313
314         if (!actx->value_ptr)
315                 return offset;
316         dissector_try_uint(sms_dissector_table, 0, actx->value_ptr, actx->pinfo, top_tree);
317
318 #.FN_BODY MO-ForwardSM-Arg
319
320         /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
321 %(DEFAULT_BODY)s
322
323         if (!actx->value_ptr)
324                 return offset;
325         dissector_try_uint(sms_dissector_table, 0, actx->value_ptr, actx->pinfo, top_tree);
326
327 #.FN_BODY MO-ForwardSM-Res
328
329         /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
330 %(DEFAULT_BODY)s
331
332         if (!actx->value_ptr)
333                 return offset;
334         dissector_try_uint(sms_dissector_table, 0, actx->value_ptr, actx->pinfo, top_tree);
335
336 #.FN_BODY MT-ForwardSM-Arg
337
338         /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
339 %(DEFAULT_BODY)s
340
341         if (!actx->value_ptr)
342                 return offset;
343         dissector_try_uint(sms_dissector_table, 0, actx->value_ptr, actx->pinfo, top_tree);
344
345 #.FN_BODY MT-ForwardSM-Res
346
347         /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
348 %(DEFAULT_BODY)s
349
350         if (!actx->value_ptr)
351                 return offset;
352         dissector_try_uint(sms_dissector_table, 0, actx->value_ptr, actx->pinfo, top_tree);
353
354 #.FN_BODY MT-ForwardSM-VGCS-Arg
355
356         /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
357 %(DEFAULT_BODY)s
358
359         if (!actx->value_ptr)
360                 return offset;
361         dissector_try_uint(sms_dissector_table, 0, actx->value_ptr, actx->pinfo, top_tree);
362
363 #.FN_BODY MT-ForwardSM-VGCS-Res
364
365         /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
366 %(DEFAULT_BODY)s
367
368         if (!actx->value_ptr)
369                 return offset;
370         dissector_try_uint(sms_dissector_table, 0, actx->value_ptr, actx->pinfo, top_tree);
371
372 #.FN_BODY SS-Status VAL_PTR = &parameter_tvb
373
374  tvbuff_t       *parameter_tvb;
375  guint8         octet;
376
377 %(DEFAULT_BODY)s
378
379  if (!parameter_tvb)
380         return offset;
381
382  octet = tvb_get_guint8(parameter_tvb,0);
383
384  proto_tree_add_uint(tree, hf_gsm_map_Ss_Status_unused, parameter_tvb, 0,1,octet);
385  if ((octet & 0x01)== 1)        
386         proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_q_bit, parameter_tvb, 0,1,octet);
387                                                                                 
388  proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_p_bit, parameter_tvb, 0,1,octet);                                                                    
389  proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_r_bit, parameter_tvb, 0,1,octet);                                                                    
390  proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_a_bit, parameter_tvb, 0,1,octet);                                                                    
391
392 #.FN_BODY Ext-SS-Status VAL_PTR = &parameter_tvb
393  /* Note Ext-SS-Status can have more than one byte */
394
395  tvbuff_t       *parameter_tvb;
396  guint8         octet;
397
398 %(DEFAULT_BODY)s
399
400  if (!parameter_tvb)
401         return offset;
402
403  octet = tvb_get_guint8(parameter_tvb,0);
404
405  proto_tree_add_uint(tree, hf_gsm_map_Ss_Status_unused, parameter_tvb, 0,1,octet);
406  if ((octet & 0x01)== 1)        
407         proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_q_bit, parameter_tvb, 0,1,octet);
408                                                                                 
409  proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_p_bit, parameter_tvb, 0,1,octet);                                                                    
410  proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_r_bit, parameter_tvb, 0,1,octet);                                                                    
411  proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_a_bit, parameter_tvb, 0,1,octet);                                                                    
412
413 #.END
414
415 #.FN_BODY USSD-DataCodingScheme VAL_PTR = &parameter_tvb
416  /*The structure of the USSD-DataCodingScheme is defined by
417   * the Cell Broadcast Data Coding Scheme as described in
418   * TS 3GPP TS 23.038
419   * TODO: Should dissect_cbs_data_coding_scheme return encoding type? - like 7bit Alphabet
420   */
421   tvbuff_t      *parameter_tvb;
422   proto_tree *subtree;
423
424 %(DEFAULT_BODY)s
425   if (!parameter_tvb)
426      return offset;
427   subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_cbs_data_coding);
428   dissect_cbs_data_coding_scheme(parameter_tvb, actx->pinfo, subtree);
429
430 #.FN_BODY USSD-String VAL_PTR = &parameter_tvb
431
432   tvbuff_t      *parameter_tvb;
433   int                   length;
434   guint8                out_len;
435   /* XXX - The maximum item label length is 240.  Does this really need to be 1024? 
436    * use ep_alloc ?
437    */
438   static unsigned char msgbuf[1024];
439   gchar *utf8_text = NULL;
440   GIConv cd;    
441   GError *l_conv_error = NULL;
442
443 %(DEFAULT_BODY)s
444   if (!parameter_tvb)
445      return offset;
446
447   length = tvb_length_remaining(parameter_tvb,0);
448   switch(sms_encoding){
449     case SMS_ENCODING_7BIT:
450     case SMS_ENCODING_7BIT_LANG:
451         out_len = gsm_sms_char_7bit_unpack(0, length, sizeof(msgbuf),
452                                            tvb_get_ptr(parameter_tvb, 0, length),
453                                                        msgbuf);
454
455         msgbuf[out_len] = '\0';
456         utf8_text = gsm_sms_chars_to_utf8(msgbuf, out_len);
457         proto_tree_add_text(tree, parameter_tvb, 0, length, "USSD String: %%s", utf8_text);
458         break;
459     case SMS_ENCODING_8BIT:
460         proto_tree_add_text(tree, parameter_tvb , 0, length, "USSD String: %%s", tvb_get_ephemeral_string(parameter_tvb, 0, length));
461         break;
462     case SMS_ENCODING_UCS2:
463     case SMS_ENCODING_UCS2_LANG:
464         if ((cd = g_iconv_open("UTF-8","UCS-2BE")) != (GIConv) -1)
465         {
466             utf8_text = g_convert_with_iconv(parameter_tvb->real_data, length, cd, NULL, NULL, &l_conv_error);
467             if(!l_conv_error)
468                 proto_tree_add_text(tree, tvb, 0, length, "USSD String: %%s", utf8_text);
469             else
470                 proto_tree_add_text(tree, tvb, 0, length, "USSD String: g_convert_with_iconv FAILED");
471
472             g_free(utf8_text);
473             g_iconv_close(cd);                          
474         }
475         else
476             proto_tree_add_text(tree, tvb, 0, length, "USSD String: g_iconv_open FAILED contact wireshark");
477
478         break;
479     default:
480         break;  
481   }
482
483 #.FN_FTR ForwardingOptions
484
485         proto_tree_add_item(tree, hf_gsm_map_notification_to_forwarding_party, tvb, 0,1,FALSE);
486         proto_tree_add_item(tree, hf_gsm_map_redirecting_presentation, tvb, 0,1,FALSE);
487         proto_tree_add_item(tree, hf_gsm_map_notification_to_calling_party, tvb, 0,1,FALSE);
488         proto_tree_add_item(tree, hf_gsm_map_forwarding_reason, tvb, 0,1,FALSE);
489 #.FN_FTR Ext-ForwFeature/forwardingOptions
490
491         proto_tree_add_item(tree, hf_gsm_map_notification_to_forwarding_party, tvb, 0,1,FALSE);
492         proto_tree_add_item(tree, hf_gsm_map_redirecting_presentation, tvb, 0,1,FALSE);
493         proto_tree_add_item(tree, hf_gsm_map_notification_to_calling_party, tvb, 0,1,FALSE);
494         proto_tree_add_item(tree, hf_gsm_map_forwarding_reason, tvb, 0,1,FALSE);
495
496
497 #.FN_BODY PDP-Type VAL_PTR = &parameter_tvb
498         guint8 pdp_type_org;
499         tvbuff_t        *parameter_tvb;
500
501
502 %(DEFAULT_BODY)s
503
504  if (!parameter_tvb)
505         return offset;
506         proto_tree_add_item(tree, hf_gsm_map_pdp_type_org, parameter_tvb, 0,1,FALSE);
507         pdp_type_org = tvb_get_guint8(parameter_tvb,1);
508         switch (pdp_type_org){
509                 case 0: /* ETSI */
510                         proto_tree_add_item(tree, hf_gsm_map_etsi_pdp_type_number, parameter_tvb, 0,1,FALSE);
511                         break;
512                 case 1: /* IETF */
513                         proto_tree_add_item(tree, hf_gsm_map_ietf_pdp_type_number, parameter_tvb, 0,1,FALSE);
514                         break;
515                 default:
516                 break;
517         }
518
519 #.FN_BODY QoS-Subscribed VAL_PTR = &parameter_tvb
520
521
522         tvbuff_t        *parameter_tvb;
523
524 %(DEFAULT_BODY)s
525
526          if (!parameter_tvb)
527                 return offset;
528         de_sm_qos(parameter_tvb, tree, actx->pinfo, 0, 3, NULL,0);
529
530 #.FN_BODY Ext-QoS-Subscribed VAL_PTR = &parameter_tvb
531
532         tvbuff_t        *parameter_tvb;
533
534 %(DEFAULT_BODY)s
535
536         if (!parameter_tvb)
537                 return offset;
538         dissect_gsm_map_ext_qos_subscribed(tvb, actx->pinfo, tree, actx);
539
540 #.FN_BODY GSN-Address VAL_PTR = &parameter_tvb
541
542         tvbuff_t        *parameter_tvb;
543         guint8          octet;
544         proto_tree *subtree;
545
546 %(DEFAULT_BODY)s
547
548         if (!parameter_tvb)
549                 return offset;
550         subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_pdptypenumber);
551
552         octet = tvb_get_guint8(parameter_tvb,0);
553         switch(octet){
554         case 0x04: /* IPv4 */
555                 proto_tree_add_item(subtree, hf_gsm_map_GSNAddress_IPv4, parameter_tvb, 1, tvb_length_remaining(parameter_tvb, 1), FALSE);
556                 break;
557         case 0x50: /* IPv4 */
558                 proto_tree_add_item(subtree, hf_gsm_map_GSNAddress_IPv4, parameter_tvb, 1, tvb_length_remaining(parameter_tvb, 1), FALSE);
559                 break;
560         default:
561                 break;
562         }
563
564 #.FN_BODY RAIdentity VAL_PTR = &parameter_tvb
565
566         tvbuff_t        *parameter_tvb;
567         proto_tree *subtree;
568
569 %(DEFAULT_BODY)s
570
571          if (!parameter_tvb)
572                 return offset;
573         subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_RAIdentity);
574         de_gmm_rai(parameter_tvb, subtree, actx->pinfo, 0, 3, NULL,0);
575
576 #.FN_BODY LAIFixedLength VAL_PTR = &parameter_tvb
577
578         tvbuff_t        *parameter_tvb; 
579         proto_tree *subtree; 
580
581 %(DEFAULT_BODY)s 
582
583          if (!parameter_tvb) 
584                 return offset; 
585         subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_LAIFixedLength); 
586         dissect_e212_mcc_mnc(parameter_tvb, actx->pinfo, subtree, 0, TRUE); 
587
588 #.FN_BODY RadioResourceInformation VAL_PTR = &parameter_tvb 
589     tvbuff_t        *parameter_tvb; 
590         proto_tree *subtree;
591
592 %(DEFAULT_BODY)s 
593
594         if (!parameter_tvb) 
595                 return offset; 
596
597     subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_RadioResourceInformation); 
598         be_chan_type(parameter_tvb, subtree, actx->pinfo, 0, tvb_length_remaining(tvb,0), NULL, 0);
599
600 #.FN_BODY RANAP-ServiceHandover VAL_PTR = &parameter_tvb
601     tvbuff_t        *parameter_tvb;
602         asn1_ctx_t              asn1_ctx;
603
604 %(DEFAULT_BODY)s 
605
606         if (!parameter_tvb) 
607                 return offset;
608
609         asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, TRUE, actx->pinfo);
610         dissect_ranap_Service_Handover(parameter_tvb, 0, &asn1_ctx, tree, hf_gsm_map_ranap_service_Handover);
611
612 #.FN_BODY IntegrityProtectionInformation VAL_PTR = &parameter_tvb
613     tvbuff_t        *parameter_tvb;
614         asn1_ctx_t              asn1_ctx;
615
616 %(DEFAULT_BODY)s 
617
618         if (!parameter_tvb) 
619                 return offset;
620
621         asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, TRUE, actx->pinfo);
622         dissect_ranap_IntegrityProtectionInformation(parameter_tvb, 0, &asn1_ctx, tree, hf_gsm_map_IntegrityProtectionInformation);
623
624 #.FN_BODY EncryptionInformation VAL_PTR = &parameter_tvb
625     tvbuff_t        *parameter_tvb;
626         asn1_ctx_t              asn1_ctx;
627
628 %(DEFAULT_BODY)s 
629
630         if (!parameter_tvb) 
631                 return offset;
632
633         asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, TRUE, actx->pinfo);
634         dissect_ranap_EncryptionInformation(parameter_tvb, 0, &asn1_ctx, tree, hf_gsm_map_EncryptionInformation);
635
636 #.FN_PARS ProtocolId VAL_PTR = &ProtocolId
637 #.FN_BODY Bss-APDU
638  guint8         octet;
639  guint8         length;
640  tvbuff_t       *next_tvb;
641  proto_tree *subtree;
642 /*
643 ETS 300 599: December 2000 (GSM 09.02 version 4.19.1)
644 5.6.9.1 BSS-apdu
645 This parameter includes one or two concatenated complete 08.06 messages, as described in GSM 03.09
646 and GSM 09.10. The Protocol ID indicates that the message or messages are according to GSM 08.06.
647 For the coding of the messages see GSM 08.06 and GSM 08.08.
648 */
649  ProtocolId = 0xffffffff;
650 %(DEFAULT_BODY)s 
651 if (!actx->value_ptr)
652         return offset;
653  subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_externalsignalinfo);
654  switch (ProtocolId){
655         case 1:
656         /* gsm-0408 */
657                 /* As per comment abowe Individual IE:(s) will be found here in TLV format
658                  * Unfortunatly a branch for each IE must be made to call the apropriate
659                  * function
660                  */
661                  /* Get tag */
662                  octet = tvb_get_guint8(actx->value_ptr,0);
663                  proto_tree_add_item(subtree, hf_gsm_map_ie_tag, actx->value_ptr, 0,1,FALSE);
664                  /* get length */
665                  length = tvb_get_guint8(actx->value_ptr,1);
666                  proto_tree_add_item(subtree, hf_gsm_map_len, actx->value_ptr, 1,1,FALSE);
667                  /* Branch on tag */
668                  switch(octet){
669                  case 4:
670                         /* Dissect the data part */                     
671                         de_bearer_cap(actx->value_ptr, subtree, actx->pinfo, 2, length, NULL, 0);
672                         /* TODO: There may be more than one IE */
673                         break;
674                  default:
675                         proto_tree_add_text(subtree, actx->value_ptr, 0, length, "If you want this decoded send the packet to Wireshark-dev");
676                         break;
677                 }/* switch(octet) */
678                 break;
679         case 2:
680                 /* gsm-0806 */
681                 octet = tvb_get_guint8(actx->value_ptr,0);
682                 /* Discrimination parameter */
683                 proto_tree_add_item(subtree, hf_gsm_map_disc_par, actx->value_ptr, 0,1,FALSE);
684                 if ( octet == 0) {/* DISCRIMINATION TS 48 006(GSM 08.06 version 5.3.0) */
685                         /* Strip off discrimination and length */
686                         proto_tree_add_item(subtree, hf_gsm_map_len, actx->value_ptr, 1,1,FALSE);
687                         next_tvb = tvb_new_subset_remaining(actx->value_ptr, 2);
688                         dissect_bssmap(next_tvb, actx->pinfo, subtree);
689                 }else if(octet==1){
690                         proto_tree_add_item(subtree, hf_gsm_map_dlci, actx->value_ptr, 1,1,FALSE);
691                         proto_tree_add_item(subtree, hf_gsm_map_len, actx->value_ptr, 2,1,FALSE);
692                         next_tvb = tvb_new_subset_remaining(actx->value_ptr, 3);
693                         call_dissector(dtap_handle, next_tvb, actx->pinfo, subtree); 
694                 }       
695                 break;
696         case 3:
697         /* gsm-BSSMAP -- Value 3 is reserved and must not be used*/
698                 octet = tvb_get_guint8(actx->value_ptr,0);
699                 length = tvb_get_guint8(actx->value_ptr,1);
700                 if ( octet == 0) {/* DISCRIMINATION TS 48 006 */
701                         next_tvb = tvb_new_subset_remaining(actx->value_ptr, 2);
702                         dissect_bssmap(next_tvb, actx->pinfo, subtree);
703                 }
704                 break;
705         /* ets-300102-1 (~Q.931 ) */
706         case 4:
707                 octet = tvb_get_guint8(actx->value_ptr,0);
708                 length = tvb_get_guint8(actx->value_ptr,1);
709                 if ( octet == 4 )
710                         dissect_q931_bearer_capability_ie(actx->value_ptr, 2, length, subtree);
711                 break;
712         default:
713                 break;
714         }/*switch (ProtocolId)*/
715
716 #.FN_BODY ExternalSignalInfo
717 /*
718 -- Information about the internal structure is given in
719 -- clause 7.6.9.
720 7.6.9.4 External Signal Information
721 This parameter contains concatenated information elements (including tag and length) which are defined by a common
722 protocol version, preceded by the associated protocol ID. It is used to transport information of the indicated protocol via
723 MAP interfaces
724 */
725  guint8         octet;
726  guint8         length;
727  tvbuff_t       *next_tvb;
728  proto_tree *subtree;
729  
730  ProtocolId = 0xffffffff;
731 %(DEFAULT_BODY)s 
732 if (!actx->value_ptr)
733         return offset;
734  subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_externalsignalinfo);
735  switch (ProtocolId){
736         case 1:
737         /* gsm-0408 */
738                 /* As per comment abowe Individual IE:(s) will be found here in TLV format
739                  * Unfortunatly a branch for each IE must be made to call the apropriate
740                  * function
741                  */
742                  /* Get tag */
743                  octet = tvb_get_guint8(actx->value_ptr,0);
744                  proto_tree_add_item(subtree, hf_gsm_map_ie_tag, actx->value_ptr, 0,1,FALSE);
745                  /* get length */
746                  length = tvb_get_guint8(actx->value_ptr,1);
747                  proto_tree_add_item(subtree, hf_gsm_map_len, actx->value_ptr, 1,1,FALSE);
748                  /* Branch on tag */
749                  switch(octet){
750                  case 4:
751                         /* Dissect the data part */                     
752                         de_bearer_cap(actx->value_ptr, subtree, actx->pinfo, 2, length, NULL, 0);
753                         /* TODO: There may be more than one IE */
754                         break;
755                  default:
756                         proto_tree_add_text(subtree, actx->value_ptr, 0, length, "If you want this decoded send the packet to Wireshark-dev");
757                         break;
758                 }/* switch(octet) */
759                 break;
760         case 2:
761                 /* gsm-0806 */
762                 octet = tvb_get_guint8(actx->value_ptr,0);
763                 /* Discrimination parameter */
764                 proto_tree_add_item(subtree, hf_gsm_map_disc_par, actx->value_ptr, 0,1,FALSE);
765                 if ( octet == 0) {/* DISCRIMINATION TS 48 006(GSM 08.06 version 5.3.0) */
766                         /* Strip off discrimination and length */
767                         proto_tree_add_item(subtree, hf_gsm_map_len, actx->value_ptr, 1,1,FALSE);
768                         next_tvb = tvb_new_subset_remaining(actx->value_ptr, 2);
769                         dissect_bssmap(next_tvb, actx->pinfo, subtree);
770                 }else if(octet==1){
771                         proto_tree_add_item(subtree, hf_gsm_map_dlci, actx->value_ptr, 1,1,FALSE);
772                         proto_tree_add_item(subtree, hf_gsm_map_len, actx->value_ptr, 2,1,FALSE);
773                         next_tvb = tvb_new_subset_remaining(actx->value_ptr, 3);
774                         call_dissector(dtap_handle, next_tvb, actx->pinfo, subtree); 
775                 }       
776                 break;
777         case 3:
778         /* gsm-BSSMAP TODO Is it correct to stripp off two first octets here?*/
779                 octet = tvb_get_guint8(actx->value_ptr,0);
780                 length = tvb_get_guint8(actx->value_ptr,1);
781                 if ( octet == 0) {/* DISCRIMINATION TS 48 006 */
782                         next_tvb = tvb_new_subset_remaining(actx->value_ptr, 2);
783                         dissect_bssmap(next_tvb, actx->pinfo, subtree);
784                 }
785                 break;
786         /* ets-300102-1 (~Q.931 ) */
787         case 4:
788                 octet = tvb_get_guint8(actx->value_ptr,0);
789                 length = tvb_get_guint8(actx->value_ptr,1);
790                 if ( octet == 4 )
791                         dissect_q931_bearer_capability_ie(actx->value_ptr, 2, length, subtree);
792                 break;
793         default:
794                 break;
795         }/*switch (ProtocolId)*/
796
797 #.FN_BODY GlobalCellId VAL_PTR = &parameter_tvb 
798     tvbuff_t    *parameter_tvb; 
799         proto_tree      *subtree;
800
801 %(DEFAULT_BODY)s 
802
803         if (!parameter_tvb) 
804                 return offset; 
805
806     subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_GlobalCellId); 
807         be_cell_id_aux(parameter_tvb, subtree, actx->pinfo, 0, tvb_length_remaining(tvb,0), NULL, 0, 0);
808
809 #.FN_BODY Ext-GeographicalInformation VAL_PTR = &parameter_tvb 
810     tvbuff_t    *parameter_tvb; 
811         proto_tree      *subtree;
812
813 %(DEFAULT_BODY)s 
814
815         if (!parameter_tvb) 
816                 return offset; 
817
818     subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_GeographicalInformation);
819         dissect_geographical_description(parameter_tvb, actx->pinfo, subtree); 
820
821 #----------------------------------------------------------------------------------------
822 #.TYPE_ATTR
823 SS-Code  TYPE = FT_UINT8  DISPLAY = BASE_DEC  STRINGS = VALS(ssCode_vals)
824 Teleservice  TYPE = FT_UINT8  DISPLAY = BASE_DEC  STRINGS = VALS(Teleservice_vals)
825 Bearerservice  TYPE = FT_UINT8  DISPLAY = BASE_DEC  STRINGS = VALS(Bearerservice_vals)
826 TeleserviceCode  TYPE = FT_UINT8  DISPLAY = BASE_DEC  STRINGS = VALS(Teleservice_vals)
827 BearerServiceCode  TYPE = FT_UINT8  DISPLAY = BASE_DEC  STRINGS = VALS(Bearerservice_vals)
828 Ext-TeleserviceCode TYPE = FT_UINT8  DISPLAY = BASE_DEC  STRINGS = VALS(Teleservice_vals)
829 Ext-BearerServiceCode  TYPE = FT_UINT8  DISPLAY = BASE_DEC  STRINGS = VALS(Bearerservice_vals)
830 ChargingCharacteristics  TYPE = FT_UINT16  DISPLAY = BASE_DEC  BITMASK = 0x0f00 STRINGS = VALS(chargingcharacteristics_values)
831 RoutingInfo TYPE = FT_UINT32  DISPLAY = BASE_DEC  STRINGS = VALS(gsm_map_ch_RoutingInfo_vals)
832 #.END