Update to V9.0.0 (2009-12)
[obnox/wireshark/wip.git] / asn1 / camel / camel.cnf
1 # camel.cnf
2 # camel conformation file
3 # Anders Broman 2007
4 # $Id$
5
6 #.IMPORT ../gsm_map/gsm_map-exp.cnf
7 #.IMPORT ../inap/inap-exp.cnf
8
9 #.MODULE
10 CS1-DataTypes  inap
11 CS2-datatypes  inap
12
13 #.ASSIGNED_OBJECT_IDENTIFIER classes
14 #.ASSIGNED_OBJECT_IDENTIFIER ros-InformationObjects 
15 #.ASSIGNED_OBJECT_IDENTIFIER tc-Messages 
16 #.ASSIGNED_OBJECT_IDENTIFIER tc-NotationExtensions
17 #.ASSIGNED_OBJECT_IDENTIFIER gprsSSF-gsmSCF-Operations
18 #.ASSIGNED_OBJECT_IDENTIFIER gsmSCF-gsmSRF-Operations
19 #.ASSIGNED_OBJECT_IDENTIFIER gsmSSF-gsmSCF-Operations
20 #.ASSIGNED_OBJECT_IDENTIFIER sms-Operations
21 #.ASSIGNED_OBJECT_IDENTIFIER gsmSSF-gsmSCF-Protocol
22 #.ASSIGNED_OBJECT_IDENTIFIER gsmSCF-gsmSRF-Protocol
23 #.ASSIGNED_OBJECT_IDENTIFIER operationcodes
24 #.ASSIGNED_OBJECT_IDENTIFIER datatypes
25 #.ASSIGNED_OBJECT_IDENTIFIER errortypes
26
27 #.OMIT_ASSIGNMENT Remote-Operations-Information-Objects
28 Bind
29 Unbind
30 #.END
31 #.OMIT_ASSIGNMENT
32 # Removed as they are giving 'defined but not used' warnings currently.
33 RejectProblem
34 TariffSwitchInterval
35 Priority
36 #.END
37
38 #.PDU_NEW
39 ERROR.&ParameterType
40 OPERATION.&ArgumentType
41 OPERATION.&ResultType
42 #.END
43
44
45 #.REGISTER
46 CAP-GPRS-ReferenceNumber        B "0.4.0.0.1.1.5.2" "id-CAP-GPRS-ReferenceNumber"
47 CAP-U-ABORT-REASON                      B "0.4.0.0.1.1.2.2" "id-CAP-U-ABORT-Reason"
48
49 #.NO_EMIT
50
51 #.TYPE_RENAME
52 ReturnResult/result/result              ResultArgument
53
54 #.FIELD_RENAME
55 Invoke/linkedId/present                 linkedIdPresent
56 Reject/problem/invoke                   invokeProblem
57 Reject/problem/returnError              returnErrorProblem
58 ReturnResult/result/result              resultArgument
59 Reject/problem/returnResult             problemReturnResult
60
61 PAR-cancelFailed/problem                par-cancelFailedProblem
62 CAMEL-FCIBillingChargingCharacteristics/fCIBCCCAMELsequence1            fci-fCIBCCCAMELsequence1
63 CAMEL-FCIGPRSBillingChargingCharacteristics/fCIBCCCAMELsequence1        fciGPRS-fCIBCCCAMELsequence1
64 CAMEL-FCISMSBillingChargingCharacteristics/fCIBCCCAMELsequence1         fciSMS-fCIBCCCAMELsequence1
65 EventSpecificInformationBCSM/oMidCallSpecificInfo/midCallEvents         omidCallEvents
66 EventSpecificInformationBCSM/tMidCallSpecificInfo/midCallEvents         tmidCallEvents
67 AudibleIndicator/tone           audibleIndicatorTone
68 GapIndicators/duration          gapIndicatorsDuration
69 InbandInfo/duration                     inbandInfoDuration
70 Tone/duration                           toneDuration
71 Burst/toneDuration                      burstToneDuration
72
73 EventSpecificInformationSMS/o-smsFailureSpecificInfo/failureCause smsfailureCause
74 EventSpecificInformationBCSM/routeSelectFailureSpecificInfo/failureCause routeSelectfailureCause
75 EventSpecificInformationSMS/t-smsFailureSpecificInfo/failureCause t-smsfailureCause
76
77 CAMEL-FCIBillingChargingCharacteristics/fCIBCCCAMELsequence1/partyToCharge fCIBCCCAMELsequence1partyToCharge
78 CAMEL-CallResult/timeDurationChargingResult/partyToCharge timeDurationChargingResultpartyToCharge
79
80 AOCSubsequent/tariffSwitchInterval aocSubsequent-tariffSwitchInterval
81 CAMEL-AChBillingChargingCharacteristics/timeDurationCharging/tariffSwitchInterval timeDurationCharging-tariffSwitchInterval
82 ApplyChargingGPRSArg/tariffSwitchInterval applyChargingGPRS-tariffSwitchInterval
83 TimeIfTariffSwitch/tariffSwitchInterval timeIfTariffSwitch-tariffSwitchInterval
84
85 # This table creates the value_sting to name Camel operation codes and errors
86 # in file packet-camel-table.c which is included in the template file
87 #
88 #.TABLE_HDR
89 /* CAMEL OPERATIONS */
90 const value_string camel_opr_code_strings[] = {
91 #.TABLE_BODY OPERATION
92         { %(&operationCode)s, "%(_ident)s" },
93 #.TABLE_FTR
94   { 0, NULL }
95 };
96 #.END
97
98 #.TABLE_HDR
99 /* CAMEL ERRORS */
100 static const value_string camel_err_code_string_vals[] = {
101 #.TABLE_BODY ERROR
102         { %(&errorCode)s, "%(_ident)s" },  
103 #.TABLE_FTR
104   { 0, NULL }
105 };
106 #.END
107
108 # This table creates the switch() to branch on Camel operation codes and errors
109 # in file packet-camel-table2.c which is included in the template file
110 #
111 #.TABLE2_HDR
112 static int dissect_invokeData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx) {
113   proto_item *cause;
114
115   switch(opcode){
116 #.TABLE2_BODY OPERATION.&ArgumentType
117     case %(&operationCode)s:  /* %(_ident)s */
118       offset= %(_argument_pdu)s(tvb, actx->pinfo , tree);
119       break;
120 #.TABLE2_FTR
121     cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown invokeData blob");
122     proto_item_set_expert_flags(cause, PI_MALFORMED, PI_WARN);
123     expert_add_info_format(actx->pinfo, cause, PI_MALFORMED, PI_WARN, "Unknown invokeData %d",opcode);
124     /* todo call the asn.1 dissector */
125   }
126   return offset;
127 }
128 #.END
129 #.TABLE2_HDR
130 static int dissect_returnResultData(proto_tree *tree, tvbuff_t *tvb, int offset,asn1_ctx_t *actx) {
131   proto_item *cause;
132
133   switch(opcode){
134 #.TABLE2_BODY OPERATION.&ResultType
135     case %(&operationCode)s:  /* %(_ident)s */
136           offset= %(_result_pdu)s(tvb, actx->pinfo , tree);
137       break;
138 #.TABLE2_FTR
139   default:
140     cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown returnResultData blob");
141     proto_item_set_expert_flags(cause, PI_MALFORMED, PI_WARN);
142     expert_add_info_format(actx->pinfo, cause, PI_MALFORMED, PI_WARN, "Unknown returnResultData %d",opcode);
143   }
144   return offset;
145 }
146 #.END
147 #.TABLE2_HDR
148 static int dissect_returnErrorData(proto_tree *tree, tvbuff_t *tvb, int offset,asn1_ctx_t *actx) {
149   proto_item *cause;
150
151   switch(errorCode) {
152 #.TABLE2_BODY ERROR.&ParameterType
153     case %(&errorCode)s:  /* %(_ident)s */
154       %(_parameter_pdu)s(tvb, actx->pinfo , tree);
155       break;
156 #.TABLE2_FTR
157   default:
158     cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown returnErrorData blob");
159     proto_item_set_expert_flags(cause, PI_MALFORMED, PI_WARN);
160     expert_add_info_format(actx->pinfo, cause, PI_MALFORMED, PI_WARN, "Unknown returnErrorData %d",errorCode);
161   }
162   return offset;
163 }
164 #.END
165 # Create a table of opcode and corresponding args and res
166 #.TABLE11_HDR
167 typedef struct _camel_op_t {
168   gint32 opcode;
169   new_dissector_t arg_pdu;
170   new_dissector_t res_pdu;
171 } camel_op_t;
172
173 static const camel_op_t camel_op_tab[] = {
174 #.TABLE11_BODY OPERATION
175   /* %(_name)-31s */ { %(&operationCode)-40s, %(_argument_pdu)-45s, %(_result_pdu)s },
176 #.TABLE11_FTR
177 };
178 #.END
179 #.TABLE21_HDR
180 typedef struct _camel_err_t {
181   gint32 errcode;
182   new_dissector_t err_pdu;
183 } camel_err_t;
184
185 static const camel_err_t camel_err_tab[] = {
186 #.TABLE21_BODY ERROR
187   /* %(_name)-24s */ { %(&errorCode)4s, %(_parameter_pdu)s },
188 #.TABLE21_FTR
189 };
190 #.END
191 # ROS stuff here XXX change when TCAP is redone.
192
193 #.FN_BODY Code/local  VAL_PTR = &opcode
194
195   if (is_ExtensionField){
196         hf_index = hf_camel_extension_code_local;
197   }else if (camel_opcode_type == CAMEL_OPCODE_RETURN_ERROR){
198         hf_index = hf_camel_error_code_local;  
199   }             
200   %(DEFAULT_BODY)s
201   if (is_ExtensionField == FALSE){
202         if (camel_opcode_type == CAMEL_OPCODE_RETURN_ERROR){
203           errorCode = opcode;   
204           if (check_col(actx->pinfo->cinfo, COL_INFO)){
205             col_append_str(actx->pinfo->cinfo, COL_INFO, 
206                val_to_str(errorCode, camel_err_code_string_vals, "Unknown CAMEL error (%%u)"));
207             col_append_str(actx->pinfo->cinfo, COL_INFO, " ");
208             col_set_fence(actx->pinfo->cinfo, COL_INFO);
209           }
210         }else{
211           if (check_col(actx->pinfo->cinfo, COL_INFO)){
212             col_append_str(actx->pinfo->cinfo, COL_INFO, 
213                val_to_str(opcode, camel_opr_code_strings, "Unknown CAMEL (%%u)"));
214             col_append_str(actx->pinfo->cinfo, COL_INFO, " ");
215             col_set_fence(actx->pinfo->cinfo, COL_INFO);
216           }
217         }
218         gp_camelsrt_info->opcode=opcode;
219   }
220 #.FN_HDR Invoke
221   camel_opcode_type=CAMEL_OPCODE_INVOKE;
222
223 #.FN_HDR ReturnResult
224   camel_opcode_type=CAMEL_OPCODE_RETURN_RESULT;
225
226 #.FN_HDR ReturnError
227   camel_opcode_type=CAMEL_OPCODE_RETURN_ERROR;
228
229 #.FN_HDR Reject
230   camel_opcode_type=CAMEL_OPCODE_REJECT;
231
232
233 #.FN_BODY Invoke/argument
234         offset = dissect_invokeData(tree, tvb, offset, actx);
235
236 #.FN_BODY ReturnResult/result/result
237         offset = dissect_returnResultData(tree, tvb, offset, actx);
238
239 #.FN_BODY ReturnError/parameter
240         offset = dissect_returnErrorData(tree, tvb, offset, actx);
241
242 # END ROS
243
244 #.FN_HDR ExtensionField
245         camel_obj_id = NULL;
246         is_ExtensionField =TRUE;
247
248 #.FN_PARS Code/global  FN_VARIANT = _str  VAL_PTR = &camel_obj_id
249
250 #.FN_BODY ExtensionField/value
251   /*XXX handle local form here */
252   if(camel_obj_id){
253     offset=call_ber_oid_callback(camel_obj_id, tvb, offset, actx->pinfo, tree);
254   }
255   is_ExtensionField = FALSE;
256
257 #----------------------------------------------------------------------------------------
258 #.FN_BODY CallingPartyNumber VAL_PTR = &parameter_tvb
259   tvbuff_t *parameter_tvb;
260
261 %(DEFAULT_BODY)s
262
263  if (!parameter_tvb)
264         return offset;
265
266 dissect_isup_calling_party_number_parameter(parameter_tvb, tree, NULL);
267 #.END
268
269 #----------------------------------------------------------------------------------------
270 #.FN_BODY CalledPartyNumber VAL_PTR = &parameter_tvb
271   tvbuff_t *parameter_tvb;
272
273 %(DEFAULT_BODY)s
274
275  if (!parameter_tvb)
276         return offset;
277
278 dissect_isup_called_party_number_parameter(parameter_tvb, tree, NULL);
279 #.END
280
281 #----------------------------------------------------------------------------------------
282 #.FN_BODY LocationNumber VAL_PTR = &parameter_tvb
283   tvbuff_t *parameter_tvb;
284
285 %(DEFAULT_BODY)s
286
287  if (!parameter_tvb)
288         return offset;
289
290 dissect_isup_location_number_parameter(parameter_tvb, tree, NULL);
291 #.END
292
293 #----------------------------------------------------------------------------------------
294 #.FN_BODY GenericNumber VAL_PTR = &parameter_tvb
295   tvbuff_t *parameter_tvb;
296
297 %(DEFAULT_BODY)s
298
299  if (!parameter_tvb)
300         return offset;
301
302 dissect_isup_generic_number_parameter(parameter_tvb, tree, NULL);
303 #.END
304
305 #----------------------------------------------------------------------------------------
306 #.FN_BODY Cause VAL_PTR = &parameter_tvb
307
308 tvbuff_t *parameter_tvb;
309 guint8 Cause_value;
310 proto_tree *subtree;
311
312 %(DEFAULT_BODY)s
313
314  if (!parameter_tvb)
315         return offset;
316  subtree = proto_item_add_subtree(actx->created_item, ett_camel_cause);
317
318  dissect_q931_cause_ie(parameter_tvb, 0, tvb_length_remaining(parameter_tvb,0), subtree, hf_camel_cause_indicator, &Cause_value, isup_parameter_type_value);
319 #.END
320
321 #----------------------------------------------------------------------------------------
322 #.FN_BODY RPCause VAL_PTR = &parameter_tvb
323
324 tvbuff_t *parameter_tvb;
325 guint8 Cause_value;
326 proto_tree *subtree;
327
328 %(DEFAULT_BODY)s
329
330  if (!parameter_tvb)
331         return offset;
332  subtree = proto_item_add_subtree(actx->created_item, ett_camel_RPcause);
333
334  dissect_RP_cause_ie(parameter_tvb, 0, tvb_length_remaining(parameter_tvb,0), subtree, hf_camel_RP_Cause, &Cause_value);
335 #.END
336
337 #----------------------------------------------------------------------------------------
338 #.FN_BODY DateAndTime
339
340
341 /* 
342 * date_option = 1 european dd:mm:yyyy
343 * date_option = 2 american mm:dd:yyyy
344 */
345
346 /*
347 * Output should be HH:MM:SS;dd/mm/yyyy
348 * if european is selected, and HH:MM:SS;mm/dd/yyyy
349 * otherwise.
350 */
351
352   guint8 digit_pair;
353   guint8 i = 0, curr_offset; 
354   char time[CAMEL_DATE_AND_TIME_LEN];
355   char c[CAMEL_DATE_AND_TIME_LEN]; /*temporary container*/
356
357   /* 2 digits per octet, 7 octets total + 5 delimiters */
358     
359   for (curr_offset = 0; curr_offset < 7 ; curr_offset++)    
360   /*Loop to extract date*/
361   {
362       digit_pair = tvb_get_guint8(tvb, curr_offset);
363       
364       proto_tree_add_uint(tree,
365                           hf_digit,
366                           tvb,
367                           curr_offset,
368                           1,
369                           digit_pair & 0x0F);
370
371       proto_tree_add_uint(tree,
372                           hf_digit,
373                           tvb,
374                           curr_offset,
375                           1,
376                           digit_pair >>4);
377                           
378       
379       c[i] = camel_number_to_char( digit_pair & 0x0F);
380       i++;
381       c[i] = camel_number_to_char( digit_pair >>4);
382       i++;
383   }
384   
385   /* Pretty print date */
386   /* XXX - Should we use sprintf here instead of assembling the string by
387    * hand? */
388   
389   time[0] = c[8];
390   time[1] = c[9];
391   time[2] = ':';
392   time[3] = c[10];
393   time[4] = c[11];
394   time[5] = ':';
395   time[6] = c[12];
396   time[7] = c[13];
397   time[8] = ';';
398   if ( EUROPEAN_DATE == date_format) /*european*/
399   {
400     time[9] = c[6]; /*day*/
401     time[10] = c[7];
402     time[11] = '/'; 
403     time[12] = c[4]; /*month*/
404     time[13] = c[5];
405   }
406   else /*american*/
407   {
408     time[9] = c[4]; /*month*/
409     time[10] = c[5];
410     time[11] = '/'; 
411     time[12] = c[6]; /*day*/
412     time[13] = c[7];
413   }
414   time[14] = '/';
415   time[15] = c[0];
416   time[16] = c[1];
417   time[17] = c[2];
418   time[18] = c[3];
419
420   time[CAMEL_DATE_AND_TIME_LEN - 1] = '\0';
421  
422 /*start = 0, length = 7*/
423  
424   proto_tree_add_string(tree, 
425                       hf_index, 
426                       tvb,
427                       0, 
428                       7, 
429                       time);
430
431   return 7; /* 7  octets eaten*/
432 #.END
433
434 #----------------------------------------------------------------------------------------
435 #.FN_BODY BearerCapability/bearerCap VAL_PTR = &parameter_tvb
436  tvbuff_t       *parameter_tvb;
437
438 %(DEFAULT_BODY)s
439
440  if (!parameter_tvb)
441         return offset;
442
443  dissect_q931_bearer_capability_ie(parameter_tvb, 0, tvb_length_remaining(parameter_tvb,0), tree);
444 #.END
445
446 #----------------------------------------------------------------------------------------
447 #.FN_BODY OriginalCalledPartyID VAL_PTR = &parameter_tvb
448
449  tvbuff_t       *parameter_tvb;
450
451 %(DEFAULT_BODY)s
452
453  if (!parameter_tvb)
454         return offset;
455  dissect_isup_original_called_number_parameter(parameter_tvb, tree, NULL);
456 #.END
457
458 #----------------------------------------------------------------------------------------
459 #.FN_PARS  RedirectingPartyID 
460
461   VAL_PTR = &parameter_tvb
462
463 #.FN_BODY RedirectingPartyID 
464
465  tvbuff_t       *parameter_tvb;
466
467 %(DEFAULT_BODY)s
468
469  if (!parameter_tvb)
470         return offset;
471  dissect_isup_redirecting_number_parameter(parameter_tvb, tree, NULL);
472 #.END
473
474
475 #----------------------------------------------------------------------------------------
476 #.FN_BODY EndUserAddress/pDPTypeOrganization VAL_PTR = &parameter_tvb
477
478  tvbuff_t       *parameter_tvb;
479
480 %(DEFAULT_BODY)s
481
482  if (!parameter_tvb)
483         return offset;
484  PDPTypeOrganization  = (tvb_get_guint8(parameter_tvb,0) &0x0f);        
485 #.END
486
487 #----------------------------------------------------------------------------------------
488 #.FN_BODY EndUserAddress/pDPTypeNumber VAL_PTR = &parameter_tvb
489
490  tvbuff_t       *parameter_tvb;
491  proto_tree *subtree;
492
493 %(DEFAULT_BODY)s
494
495  if (!parameter_tvb)
496         return offset;
497  PDPTypeNumber = tvb_get_guint8(parameter_tvb,0);       
498  subtree = proto_item_add_subtree(actx->created_item, ett_camel_pdptypenumber);
499  switch (PDPTypeOrganization){
500  case 0: /* ETSI */
501         proto_tree_add_item(tree, hf_camel_PDPTypeNumber_etsi, parameter_tvb, 0, 1, FALSE);
502         break;
503  case 1: /* IETF */
504         proto_tree_add_item(tree, hf_camel_PDPTypeNumber_ietf, parameter_tvb, 0, 1, FALSE);
505         break;
506  default:
507         break;
508  }
509 #.END
510
511
512 #.FN_BODY EndUserAddress/pDPAddress VAL_PTR = &parameter_tvb
513
514  tvbuff_t       *parameter_tvb;
515  proto_tree *subtree;
516
517 %(DEFAULT_BODY)s
518
519  if (!parameter_tvb)
520         return offset;
521  subtree = proto_item_add_subtree(actx->created_item, ett_camel_pdptypenumber);
522  switch (PDPTypeOrganization){
523  case 0: /* ETSI */
524         break;
525  case 1: /* IETF */
526         switch(PDPTypeNumber){
527         case 0x21: /* IPv4 */
528                 proto_tree_add_item(tree, hf_camel_PDPAddress_IPv4, parameter_tvb, 0, tvb_length(parameter_tvb), FALSE);
529                 break;
530         case 0x57: /* IPv6 */
531                 proto_tree_add_item(tree, hf_camel_PDPAddress_IPv6, parameter_tvb, 0, tvb_length(parameter_tvb), FALSE);
532                 break;
533         default:
534                 break;
535         }
536  default:
537         break;
538
539  }
540 #.END
541
542 #----------------------------------------------------------------------------------------
543 #.FN_BODY LocationInformationGPRS/cellGlobalIdOrServiceAreaIdOrLAI 
544         proto_tree *subtree;
545         int start_offset;
546
547  start_offset = offset;
548 %(DEFAULT_BODY)s
549
550  subtree = proto_item_add_subtree(actx->created_item, ett_camel_pdptypenumber);
551
552  if (tvb_reported_length_remaining(tvb,start_offset) == 7){
553         dissect_gsm_map_CellGlobalIdOrServiceAreaIdFixedLength(TRUE, tvb, start_offset, actx, subtree, hf_camel_cellGlobalIdOrServiceAreaIdFixedLength);
554  }else{
555         dissect_gsm_map_LAIFixedLength(TRUE, tvb, start_offset, actx, subtree, hf_camel_locationAreaId);
556  }                      
557 #.END
558
559 #----------------------------------------------------------------------------------------
560 #.FN_BODY AChBillingChargingCharacteristics VAL_PTR = &parameter_tvb
561  tvbuff_t       *parameter_tvb;
562  proto_tree *subtree;
563
564 %(DEFAULT_BODY)s
565  if (!parameter_tvb)
566         return offset;
567  subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_AChBillingChargingCharacteristics);
568  dissect_camel_CAMEL_AChBillingChargingCharacteristics(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_AChBillingChargingCharacteristics);
569
570 #.FN_BODY FCIBillingChargingCharacteristics VAL_PTR = &parameter_tvb
571  tvbuff_t       *parameter_tvb;
572  proto_tree *subtree; 
573
574 %(DEFAULT_BODY)s
575  if (!parameter_tvb)
576         return offset;
577  subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_FCIBillingChargingCharacteristics);
578  dissect_camel_CAMEL_FCIBillingChargingCharacteristics(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_FCIBillingChargingCharacteristics);
579
580 #.FN_BODY FCIGPRSBillingChargingCharacteristics VAL_PTR = &parameter_tvb
581  tvbuff_t       *parameter_tvb; 
582  proto_tree *subtree; 
583
584 %(DEFAULT_BODY)s
585  if (!parameter_tvb)
586         return offset;
587  subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_FCIGPRSBillingChargingCharacteristics);
588  dissect_camel_CAMEL_FCIGPRSBillingChargingCharacteristics(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_FCIGPRSBillingChargingCharacteristics);
589
590 #.FN_BODY FCISMSBillingChargingCharacteristics VAL_PTR = &parameter_tvb
591  tvbuff_t       *parameter_tvb;
592  proto_tree *subtree; 
593
594 %(DEFAULT_BODY)s
595  if (!parameter_tvb)
596         return offset; 
597  subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_FCISMSBillingChargingCharacteristics);
598  dissect_camel_CAMEL_FCISMSBillingChargingCharacteristics(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_FCISMSBillingChargingCharacteristics);
599
600 #.FN_BODY SCIBillingChargingCharacteristics VAL_PTR = &parameter_tvb
601  tvbuff_t       *parameter_tvb;
602  proto_tree *subtree; 
603
604 %(DEFAULT_BODY)s
605  if (!parameter_tvb)
606         return offset;
607  subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_SCIBillingChargingCharacteristics);
608  dissect_camel_CAMEL_SCIBillingChargingCharacteristics(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_SCIBillingChargingCharacteristics);
609
610 #.FN_BODY SCIGPRSBillingChargingCharacteristics VAL_PTR = &parameter_tvb
611  tvbuff_t       *parameter_tvb;
612  proto_tree *subtree; 
613
614 %(DEFAULT_BODY)s
615  if (!parameter_tvb)
616         return offset; 
617  subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_SCIGPRSBillingChargingCharacteristics);
618  dissect_camel_CAMEL_SCIGPRSBillingChargingCharacteristics(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_SCIGPRSBillingChargingCharacteristics);
619
620 #.FN_BODY CallResult VAL_PTR = &parameter_tvb
621  tvbuff_t       *parameter_tvb; 
622  proto_tree *subtree; 
623
624 %(DEFAULT_BODY)s
625  if (!parameter_tvb)
626         return offset;
627  subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_CallResult);
628  dissect_camel_CAMEL_CallResult(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_CallResult);
629
630 # V3 and V4 incompatibillity bug #1719
631 #.FN_BODY CAMEL-AChBillingChargingCharacteristics/timeDurationCharging/audibleIndicator
632   if (tvb_length_remaining(tvb,offset) < 2)
633         offset = dissect_camel_BOOLEAN(TRUE, tvb, offset, actx , tree, hf_camel_audibleIndicatorTone);
634   else
635 %(DEFAULT_BODY)s
636
637 #.END
638
639 #.TYPE_ATTR
640 PDPTypeOrganization TYPE = FT_UINT8  DISPLAY = BASE_DEC  BITMASK = 0x0f STRINGS = VALS(gsm_map_PDP_Type_Organisation_vals)
641 DateAndTime     TYPE = FT_STRING DISPLAY = BASE_NONE
642 AccessPointName TYPE = FT_STRING DISPLAY = BASE_NONE
643 Code/local TYPE = FT_INT32  DISPLAY = BASE_DEC  STRINGS = VALS(camel_opr_code_strings)
644 ServiceInteractionIndicatorsTwo/holdTreatmentIndicator TYPE = FT_INT32  DISPLAY = BASE_DEC STRINGS = VALS(camel_holdTreatmentIndicator_values)
645 ServiceInteractionIndicatorsTwo/cwTreatmentIndicator TYPE = FT_INT32  DISPLAY = BASE_DEC STRINGS = VALS(camel_cwTreatmentIndicator_values)
646 ServiceInteractionIndicatorsTwo/ectTreatmentIndicator TYPE = FT_INT32  DISPLAY = BASE_DEC STRINGS = VALS(camel_ectTreatmentIndicator_values)
647 #.END