summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/asn1/camel/camel.cnf
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/asn1/camel/camel.cnf
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/asn1/camel/camel.cnf')
-rw-r--r--epan/dissectors/asn1/camel/camel.cnf831
1 files changed, 831 insertions, 0 deletions
diff --git a/epan/dissectors/asn1/camel/camel.cnf b/epan/dissectors/asn1/camel/camel.cnf
new file mode 100644
index 00000000..40fa1959
--- /dev/null
+++ b/epan/dissectors/asn1/camel/camel.cnf
@@ -0,0 +1,831 @@
+# camel.cnf
+# camel conformation file
+# Anders Broman 2007
+
+#.IMPORT ../gsm_map/gsm_map-exp.cnf
+#.IMPORT ../inap/inap-exp.cnf
+
+#.MODULE
+CS1-DataTypes inap
+CS2-datatypes inap
+
+#.ASSIGNED_OBJECT_IDENTIFIER classes
+#.ASSIGNED_OBJECT_IDENTIFIER ros-InformationObjects
+#.ASSIGNED_OBJECT_IDENTIFIER tc-Messages
+#.ASSIGNED_OBJECT_IDENTIFIER tc-NotationExtensions
+#.ASSIGNED_OBJECT_IDENTIFIER gprsSSF-gsmSCF-Operations
+#.ASSIGNED_OBJECT_IDENTIFIER gsmSCF-gsmSRF-Operations
+#.ASSIGNED_OBJECT_IDENTIFIER gsmSSF-gsmSCF-Operations
+#.ASSIGNED_OBJECT_IDENTIFIER sms-Operations
+#.ASSIGNED_OBJECT_IDENTIFIER gsmSSF-gsmSCF-Protocol
+#.ASSIGNED_OBJECT_IDENTIFIER gsmSCF-gsmSRF-Protocol
+#.ASSIGNED_OBJECT_IDENTIFIER operationcodes
+#.ASSIGNED_OBJECT_IDENTIFIER datatypes
+#.ASSIGNED_OBJECT_IDENTIFIER errortypes
+
+#.OMIT_ASSIGNMENT Remote-Operations-Information-Objects
+Bind
+Unbind
+#.END
+#.OMIT_ASSIGNMENT
+# Removed as they are giving 'defined but not used' warnings currently.
+RejectProblem
+TariffSwitchInterval
+Priority
+#.END
+
+#.PDU
+ERROR.&ParameterType
+OPERATION.&ArgumentType
+OPERATION.&ResultType
+#.END
+
+
+#.REGISTER
+CAP-GPRS-ReferenceNumber B "0.4.0.0.1.1.5.2" "id-CAP-GPRS-ReferenceNumber"
+CAP-U-ABORT-REASON B "0.4.0.0.1.1.2.2" "id-CAP-U-ABORT-Reason"
+
+#.NO_EMIT ONLY_VALS
+CAMEL-AChBillingChargingCharacteristicsV2
+ROS
+
+#.TYPE_RENAME
+ReturnResult/result/result ResultArgument
+
+#.FIELD_RENAME
+Invoke/linkedId/present linkedIdPresent
+Reject/problem/invoke invokeProblem
+Reject/problem/returnError returnErrorProblem
+ReturnResult/result/result resultArgument
+Reject/problem/returnResult problemReturnResult
+
+PAR-cancelFailed/problem par-cancelFailedProblem
+CAMEL-FCIBillingChargingCharacteristics/fCIBCCCAMELsequence1 fci-fCIBCCCAMELsequence1
+CAMEL-FCIGPRSBillingChargingCharacteristics/fCIBCCCAMELsequence1 fciGPRS-fCIBCCCAMELsequence1
+CAMEL-FCISMSBillingChargingCharacteristics/fCIBCCCAMELsequence1 fciSMS-fCIBCCCAMELsequence1
+EventSpecificInformationBCSM/oMidCallSpecificInfo/midCallEvents omidCallEvents
+EventSpecificInformationBCSM/tMidCallSpecificInfo/midCallEvents tmidCallEvents
+AudibleIndicator/tone audibleIndicatorTone
+GapIndicators/duration gapIndicatorsDuration
+InbandInfo/duration inbandInfoDuration
+Tone/duration toneDuration
+Burst/toneDuration burstToneDuration
+
+EventSpecificInformationSMS/o-smsFailureSpecificInfo/failureCause mo-smsfailureCause
+EventSpecificInformationBCSM/routeSelectFailureSpecificInfo/failureCause routeSelectfailureCause
+EventSpecificInformationSMS/t-smsFailureSpecificInfo/failureCause t-smsfailureCause
+
+CAMEL-FCIBillingChargingCharacteristics/fCIBCCCAMELsequence1/partyToCharge fCIBCCCAMELsequence1partyToCharge
+CAMEL-CallResult/timeDurationChargingResult/partyToCharge timeDurationChargingResultpartyToCharge
+
+AOCSubsequent/tariffSwitchInterval aocSubsequent-tariffSwitchInterval
+CAMEL-AChBillingChargingCharacteristics/timeDurationCharging/tariffSwitchInterval timeDurationCharging-tariffSwitchInterval
+ApplyChargingGPRSArg/tariffSwitchInterval applyChargingGPRS-tariffSwitchInterval
+TimeIfTariffSwitch/tariffSwitchInterval timeIfTariffSwitch-tariffSwitchInterval
+
+# This table creates the value_sting to name Camel operation codes and errors
+# in file packet-camel-table.c which is included in the template file
+#
+#.TABLE_HDR
+/* CAMEL OPERATIONS */
+const value_string camel_opr_code_strings[] = {
+#.TABLE_BODY OPERATION
+ { %(&operationCode)s, "%(_ident)s" },
+#.TABLE_FTR
+ { 0, NULL }
+};
+#.END
+
+#.TABLE_HDR
+/* CAMEL ERRORS */
+static const value_string camel_err_code_string_vals[] = {
+#.TABLE_BODY ERROR
+ { %(&errorCode)s, "%(_ident)s" },
+#.TABLE_FTR
+ { 0, NULL }
+};
+#.END
+
+# This table creates the switch() to branch on Camel operation codes and errors
+# in file packet-camel-table2.c which is included in the template file
+#
+#.TABLE2_HDR
+static int dissect_invokeData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx) {
+
+ switch(opcode){
+#.TABLE2_BODY OPERATION.&ArgumentType
+ case %(&operationCode)s: /* %(_ident)s */
+ offset= %(_argument_pdu)s(tvb, actx->pinfo , tree , NULL);
+ break;
+#.TABLE2_FTR
+ default:
+ proto_tree_add_expert_format(tree, actx->pinfo, &ei_camel_unknown_invokeData,
+ tvb, offset, -1, "Unknown invokeData %d", opcode);
+ /* todo call the asn.1 dissector */
+ break;
+ }
+ return offset;
+}
+#.END
+#.TABLE2_HDR
+static int dissect_returnResultData(proto_tree *tree, tvbuff_t *tvb, int offset,asn1_ctx_t *actx) {
+
+ switch(opcode){
+#.TABLE2_BODY OPERATION.&ResultType
+ case %(&operationCode)s: /* %(_ident)s */
+ offset= %(_result_pdu)s(tvb, actx->pinfo , tree , NULL);
+ break;
+#.TABLE2_FTR
+ default:
+ proto_tree_add_expert_format(tree, actx->pinfo, &ei_camel_unknown_returnResultData,
+ tvb, offset, -1, "Unknown returnResultData %d",opcode);
+ }
+ return offset;
+}
+#.END
+#.TABLE2_HDR
+static int dissect_returnErrorData(proto_tree *tree, tvbuff_t *tvb, int offset,asn1_ctx_t *actx) {
+
+ switch(errorCode) {
+#.TABLE2_BODY ERROR.&ParameterType
+ case %(&errorCode)s: /* %(_ident)s */
+ %(_parameter_pdu)s(tvb, actx->pinfo , tree , NULL);
+ break;
+#.TABLE2_FTR
+ default:
+ proto_tree_add_expert_format(tree, actx->pinfo, &ei_camel_unknown_returnErrorData,
+ tvb, offset, -1, "Unknown returnErrorData %d",errorCode);
+ }
+ return offset;
+}
+#.END
+# ROS stuff here XXX change when TCAP is redone.
+
+#.FN_BODY Code/local VAL_PTR = &opcode
+
+ if (is_ExtensionField){
+ hf_index = hf_camel_extension_code_local;
+ }else if (camel_opcode_type == CAMEL_OPCODE_RETURN_ERROR){
+ hf_index = hf_camel_error_code_local;
+ }
+ %(DEFAULT_BODY)s
+ if (is_ExtensionField == FALSE){
+ if (camel_opcode_type == CAMEL_OPCODE_RETURN_ERROR){
+ errorCode = opcode;
+ col_append_str(actx->pinfo->cinfo, COL_INFO,
+ val_to_str(errorCode, camel_err_code_string_vals, "Unknown CAMEL error (%%u)"));
+ col_append_str(actx->pinfo->cinfo, COL_INFO, " ");
+ col_set_fence(actx->pinfo->cinfo, COL_INFO);
+ }else{
+ col_append_str(actx->pinfo->cinfo, COL_INFO,
+ val_to_str(opcode, camel_opr_code_strings, "Unknown CAMEL (%%u)"));
+ col_append_str(actx->pinfo->cinfo, COL_INFO, " ");
+ col_set_fence(actx->pinfo->cinfo, COL_INFO);
+ }
+ gp_camelsrt_info->opcode=opcode;
+ }
+#.FN_HDR Invoke
+ camel_opcode_type=CAMEL_OPCODE_INVOKE;
+
+#.FN_HDR ReturnResult
+ camel_opcode_type=CAMEL_OPCODE_RETURN_RESULT;
+
+#.FN_HDR ReturnError
+ camel_opcode_type=CAMEL_OPCODE_RETURN_ERROR;
+
+#.FN_HDR Reject
+ camel_opcode_type=CAMEL_OPCODE_REJECT;
+
+
+#.FN_BODY Invoke/argument
+ offset = dissect_invokeData(tree, tvb, offset, actx);
+
+#.FN_BODY ReturnResult/result/result
+ offset = dissect_returnResultData(tree, tvb, offset, actx);
+
+#.FN_BODY ReturnError/parameter
+ offset = dissect_returnErrorData(tree, tvb, offset, actx);
+
+# END ROS
+
+#.FN_BODY InitialDPArgExtension
+
+if((camel_ver == 2)||(camel_ver == 1)){
+ return dissect_camel_InitialDPArgExtensionV2(implicit_tag, tvb, offset, actx, tree, hf_index);
+}
+
+%(DEFAULT_BODY)s
+
+#.FN_HDR ExtensionField
+ camel_obj_id = NULL;
+ is_ExtensionField =TRUE;
+
+#.FN_PARS Code/global FN_VARIANT = _str VAL_PTR = &camel_obj_id
+
+#.FN_BODY ExtensionField/value
+ /*XXX handle local form here */
+ if(camel_obj_id){
+ offset=call_ber_oid_callback(camel_obj_id, tvb, offset, actx->pinfo, tree, NULL);
+ }
+ is_ExtensionField = FALSE;
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY CallingPartyNumber VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+
+subtree = proto_item_add_subtree(actx->created_item, ett_camel_callingpartynumber);
+dissect_isup_calling_party_number_parameter(parameter_tvb, actx->pinfo, subtree, NULL);
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY CalledPartyNumber VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_calledpartybcdnumber);
+ dissect_isup_called_party_number_parameter(parameter_tvb, actx->pinfo, subtree, NULL);
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY LocationNumber VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+
+subtree = proto_item_add_subtree(actx->created_item, ett_camel_locationnumber);
+dissect_isup_location_number_parameter(parameter_tvb, actx->pinfo, subtree, NULL);
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY GenericNumber VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+
+dissect_isup_generic_number_parameter(parameter_tvb, actx->pinfo, tree, NULL);
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY Cause VAL_PTR = &parameter_tvb
+
+tvbuff_t *parameter_tvb;
+guint8 Cause_value;
+proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_cause);
+
+ dissect_q931_cause_ie(parameter_tvb, 0, tvb_reported_length_remaining(parameter_tvb,0), subtree, hf_camel_cause_indicator, &Cause_value, isup_parameter_type_value);
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY RPCause VAL_PTR = &parameter_tvb
+
+tvbuff_t *parameter_tvb;
+guint8 Cause_value;
+proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_RPcause);
+
+ dissect_RP_cause_ie(parameter_tvb, 0, tvb_reported_length_remaining(parameter_tvb,0), subtree, hf_camel_RP_Cause, &Cause_value);
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY DateAndTime
+
+
+/*
+* date_option = 1 european dd:mm:yyyy
+* date_option = 2 american mm:dd:yyyy
+*/
+
+/*
+* Output should be HH:MM:SS;dd/mm/yyyy
+* if european is selected, and HH:MM:SS;mm/dd/yyyy
+* otherwise.
+*/
+
+ guint8 digit_pair;
+ guint8 i = 0, curr_offset;
+ char camel_time[CAMEL_DATE_AND_TIME_LEN];
+ char c[CAMEL_DATE_AND_TIME_LEN]; /*temporary container*/
+
+ /* 2 digits per octet, 7 octets total + 5 delimiters */
+
+ for (curr_offset = 0; curr_offset < 7 ; curr_offset++)
+ /*Loop to extract date*/
+ {
+ digit_pair = tvb_get_guint8(tvb, curr_offset);
+
+ proto_tree_add_uint(tree,
+ hf_digit,
+ tvb,
+ curr_offset,
+ 1,
+ digit_pair & 0x0F);
+
+ proto_tree_add_uint(tree,
+ hf_digit,
+ tvb,
+ curr_offset,
+ 1,
+ digit_pair >>4);
+
+
+ c[i] = camel_number_to_char( digit_pair & 0x0F);
+ i++;
+ c[i] = camel_number_to_char( digit_pair >>4);
+ i++;
+ }
+
+ /* Pretty print date */
+ /* XXX - Should we use sprintf here instead of assembling the string by
+ * hand? */
+
+ camel_time[0] = c[8];
+ camel_time[1] = c[9];
+ camel_time[2] = ':';
+ camel_time[3] = c[10];
+ camel_time[4] = c[11];
+ camel_time[5] = ':';
+ camel_time[6] = c[12];
+ camel_time[7] = c[13];
+ camel_time[8] = ';';
+ if ( EUROPEAN_DATE == date_format) /*european*/
+ {
+ camel_time[9] = c[6]; /*day*/
+ camel_time[10] = c[7];
+ camel_time[11] = '/';
+ camel_time[12] = c[4]; /*month*/
+ camel_time[13] = c[5];
+ }
+ else /*american*/
+ {
+ camel_time[9] = c[4]; /*month*/
+ camel_time[10] = c[5];
+ camel_time[11] = '/';
+ camel_time[12] = c[6]; /*day*/
+ camel_time[13] = c[7];
+ }
+ camel_time[14] = '/';
+ camel_time[15] = c[0];
+ camel_time[16] = c[1];
+ camel_time[17] = c[2];
+ camel_time[18] = c[3];
+
+ camel_time[CAMEL_DATE_AND_TIME_LEN - 1] = '\0';
+
+/*start = 0, length = 7*/
+
+ proto_tree_add_string(tree,
+ hf_index,
+ tvb,
+ 0,
+ 7,
+ camel_time);
+
+ return 7; /* 7 octets eaten*/
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY BearerCapability/bearerCap VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+
+ dissect_q931_bearer_capability_ie(parameter_tvb, 0, tvb_reported_length_remaining(parameter_tvb,0), tree);
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY OriginalCalledPartyID VAL_PTR = &parameter_tvb
+
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_originalcalledpartyid);
+ dissect_isup_original_called_number_parameter(parameter_tvb, actx->pinfo, subtree, NULL);
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_PARS RedirectingPartyID
+
+ VAL_PTR = &parameter_tvb
+
+#.FN_BODY RedirectingPartyID
+
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_redirectingpartyid);
+ dissect_isup_redirecting_number_parameter(parameter_tvb, actx->pinfo, subtree, NULL);
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_PARS AccessPointName
+ VAL_PTR = &parameter_tvb
+
+#.FN_BODY AccessPointName
+
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_AccessPointName);
+ de_sm_apn(parameter_tvb, subtree, actx->pinfo, 0, tvb_reported_length(parameter_tvb), NULL, 0);
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY EndUserAddress/pDPTypeOrganization VAL_PTR = &parameter_tvb
+
+ tvbuff_t *parameter_tvb;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+ PDPTypeOrganization = (tvb_get_guint8(parameter_tvb,0) &0x0f);
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY EndUserAddress/pDPTypeNumber VAL_PTR = &parameter_tvb
+
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+ PDPTypeNumber = tvb_get_guint8(parameter_tvb,0);
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_pdptypenumber);
+ switch (PDPTypeOrganization){
+ case 0: /* ETSI */
+ proto_tree_add_item(subtree, hf_camel_PDPTypeNumber_etsi, parameter_tvb, 0, 1, ENC_BIG_ENDIAN);
+ break;
+ case 1: /* IETF */
+ proto_tree_add_item(subtree, hf_camel_PDPTypeNumber_ietf, parameter_tvb, 0, 1, ENC_BIG_ENDIAN);
+ break;
+ default:
+ break;
+ }
+#.END
+
+
+#.FN_BODY EndUserAddress/pDPAddress VAL_PTR = &parameter_tvb
+
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_pdptypenumber);
+ switch (PDPTypeOrganization){
+ case 0: /* ETSI */
+ break;
+ case 1: /* IETF */
+ switch(PDPTypeNumber){
+ case 0x21: /* IPv4 */
+ proto_tree_add_item(subtree, hf_camel_PDPAddress_IPv4, parameter_tvb, 0, tvb_reported_length(parameter_tvb), ENC_BIG_ENDIAN);
+ break;
+ case 0x57: /* IPv6 */
+ proto_tree_add_item(subtree, hf_camel_PDPAddress_IPv6, parameter_tvb, 0, tvb_reported_length(parameter_tvb), ENC_NA);
+ break;
+ default:
+ break;
+ }
+ default:
+ break;
+
+ }
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY LocationInformationGPRS/cellGlobalIdOrServiceAreaIdOrLAI
+ proto_tree *subtree;
+ int start_offset;
+
+ start_offset = offset;
+%(DEFAULT_BODY)s
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_pdptypenumber);
+
+ if (tvb_reported_length_remaining(tvb,start_offset) == 7){
+ dissect_gsm_map_CellGlobalIdOrServiceAreaIdFixedLength(TRUE, tvb, start_offset, actx, subtree, hf_camel_cellGlobalIdOrServiceAreaIdFixedLength);
+ }else{
+ dissect_gsm_map_LAIFixedLength(TRUE, tvb, start_offset, actx, subtree, hf_camel_locationAreaId);
+ }
+#.END
+
+#----------------------------------------------------------------------------------------
+#.FN_BODY AChBillingChargingCharacteristics VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_AChBillingChargingCharacteristics);
+ if((camel_ver == 2)||(camel_ver == 1)){
+ return dissect_camel_CAMEL_AChBillingChargingCharacteristicsV2(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_AChBillingChargingCharacteristics);
+ }
+ dissect_camel_CAMEL_AChBillingChargingCharacteristics(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_AChBillingChargingCharacteristics);
+
+#.FN_BODY FCIBillingChargingCharacteristics VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_FCIBillingChargingCharacteristics);
+ dissect_camel_CAMEL_FCIBillingChargingCharacteristics(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_FCIBillingChargingCharacteristics);
+
+#.FN_BODY FCIGPRSBillingChargingCharacteristics VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_FCIGPRSBillingChargingCharacteristics);
+ dissect_camel_CAMEL_FCIGPRSBillingChargingCharacteristics(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_FCIGPRSBillingChargingCharacteristics);
+
+#.FN_BODY FCISMSBillingChargingCharacteristics VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_FCISMSBillingChargingCharacteristics);
+ dissect_camel_CAMEL_FCISMSBillingChargingCharacteristics(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_FCISMSBillingChargingCharacteristics);
+
+#.FN_BODY SCIBillingChargingCharacteristics VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_SCIBillingChargingCharacteristics);
+ dissect_camel_CAMEL_SCIBillingChargingCharacteristics(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_SCIBillingChargingCharacteristics);
+
+#.FN_BODY SCIGPRSBillingChargingCharacteristics VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_SCIGPRSBillingChargingCharacteristics);
+ dissect_camel_CAMEL_SCIGPRSBillingChargingCharacteristics(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_SCIGPRSBillingChargingCharacteristics);
+
+#.FN_BODY CallResult VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_CAMEL_CallResult);
+ dissect_camel_CAMEL_CallResult(FALSE, parameter_tvb, 0, actx, subtree, hf_camel_CAMEL_CallResult);
+
+# V3 and V4 incompatibillity bug #1719
+#.FN_BODY CAMEL-AChBillingChargingCharacteristics/timeDurationCharging/audibleIndicator
+ if (tvb_reported_length_remaining(tvb,offset) < 2)
+ offset = dissect_camel_BOOLEAN(TRUE, tvb, offset, actx , tree, hf_camel_audibleIndicatorTone);
+ else
+%(DEFAULT_BODY)s
+
+#.FN_BODY CalledPartyBCDNumber VAL_PTR = &parameter_tvb
+/* See 3GPP TS 29.078
+ * and 3GPP TS 24.008, section 10.5.4.7
+ * Indicates the Called Party Number, including service selection information.
+ * Refer to 3GPP TS 24.008 [9] for encoding.
+ * This data type carries only the 'type of number', 'numbering plan
+ * identification' and 'number digit' fields defined in 3GPP TS 24.008 [9];
+ * it does not carry the 'called party BCD number IEI' or 'length of called
+ * party BCD number contents'.
+ * In the context of the DestinationSubscriberNumber field in ConnectSMSArg or
+ * InitialDPSMSArg, a CalledPartyBCDNumber may also contain an alphanumeric
+ * character string. In this case, type-of-number '101'B is used, in accordance
+ * with 3GPP TS 23.040 [6]. The address is coded in accordance with the
+ * GSM 7-bit default alphabet definition and the SMS packing rules
+ * as specified in 3GPP TS 23.038 [15] in this case.
+ */
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_calledpartybcdnumber);
+ de_cld_party_bcd_num(parameter_tvb, subtree, actx->pinfo, 0, tvb_reported_length(parameter_tvb), NULL, 0);
+
+#.END
+
+#.FN_BODY Digits VAL_PTR = &parameter_tvb
+/*
+* Digits {PARAMETERS-BOUND : bound} ::= OCTET STRING (SIZE(
+* bound.&minDigitsLength .. bound.&maxDigitsLength))
+*-- Indicates the address signalling digits.
+*-- Refer to ETSI EN 300 356 1 [23] Generic Number & Generic Digits parameters for encoding.
+*-- The coding of the subfields 'NumberQualifier' in Generic Number and 'TypeOfDigits' in
+*-- Generic Digits are irrelevant to the CAP;
+*-- the ASN.1 tags are sufficient to identify the parameter.
+*-- The ISUP format does not allow to exclude these subfields,
+*-- therefore the value is network operator specific.
+*--
+*-- The following parameters shall use Generic Number:
+*-- - AdditionalCallingPartyNumber for InitialDP
+*-- - AssistingSSPIPRoutingAddress for EstablishTemporaryConnection
+*-- - CorrelationID for AssistRequestInstructions
+*-- - CalledAddressValue for all occurrences, CallingAddressValue for all occurrences.
+*--
+*-- The following parameters shall use Generic Digits:
+*-- - CorrelationID in EstablishTemporaryConnection
+*-- - number in VariablePart
+*-- - digitsResponse in ReceivedInformationArg
+*-- - midCallEvents in oMidCallSpecificInfo and tMidCallSpecificInfo
+*--
+*-- In the digitsResponse and midCallevents, the digits may also include the '*', '#',
+*-- a, b, c and d digits by using the IA5 character encoding scheme. If the BCD even or
+*-- BCD odd encoding scheme is used, then the following encoding shall be applied for the
+*-- non-decimal characters: 1011 (*), 1100 (#).
+*--
+*-- AssistingSSPIPRoutingAddress in EstablishTemporaryConnection and CorrelationID in
+*-- AssistRequestInstructions may contain a Hex B digit as address signal. Refer to
+*-- Annex A.6 for the usage of the Hex B digit.
+*--
+*-- Note that when CorrelationID is transported in Generic Digits, then the digits shall
+*-- always be BCD encoded.
+*/
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+ gint ett = -1;
+ bool digits = FALSE;
+
+ offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
+ &parameter_tvb);
+
+ if (!parameter_tvb)
+ return offset;
+
+ if (hf_index == hf_camel_calledAddressValue) {
+ ett = ett_camel_calledAddressValue;
+ } else if (hf_index == hf_camel_callingAddressValue) {
+ ett = ett_camel_callingAddressValue;
+ } else if (hf_index == hf_camel_additionalCallingPartyNumber) {
+ ett = ett_camel_additionalcallingpartynumber;
+ } else if (hf_index == hf_camel_assistingSSPIPRoutingAddress) {
+ ett = ett_camel_assistingSSPIPRoutingAddress;
+ } else if (hf_index == hf_camel_correlationID) {
+ ett = ett_camel_correlationID;
+ digits = (opcode == opcode_establishTemporaryConnection) ? TRUE : FALSE;
+ } else if (hf_index == hf_camel_dTMFDigitsCompleted) {
+ ett = ett_camel_dTMFDigitsCompleted;
+ digits = TRUE;
+ } else if (hf_index == hf_camel_dTMFDigitsTimeOut) {
+ ett = ett_camel_dTMFDigitsTimeOut;
+ digits = TRUE;
+ } else if (hf_index == hf_camel_number) {
+ ett = ett_camel_number;
+ digits = TRUE;
+ } else if (hf_index == hf_camel_digitsResponse) {
+ ett = ett_camel_digitsResponse;
+ digits = TRUE;
+ }
+
+ subtree = proto_item_add_subtree(actx->created_item, ett);
+ if (digits) {
+ dissect_isup_generic_digits_parameter(parameter_tvb, subtree, NULL);
+ } else {
+ dissect_isup_generic_number_parameter(parameter_tvb, actx->pinfo, subtree, NULL);
+ }
+
+# I don't know how to "access" the EstablishTemporaryConnectionArg-PDU which would have been cleaner.
+#.FN_BODY EstablishTemporaryConnectionArg
+
+ if(camel_ver==2){
+ return dissect_camel_EstablishTemporaryConnectionArgV2(implicit_tag, tvb, offset, actx, tree, hf_index);
+ }
+%(DEFAULT_BODY)s
+
+#.FN_BODY SpecializedResourceReportArg
+ if (camel_ver < 4) {
+ return dissect_camel_SpecializedResourceReportArgV23(implicit_tag, tvb, offset, actx, tree, hf_camel_allAnnouncementsComplete);
+ }
+%(DEFAULT_BODY)s
+
+#.FN_BODY TimeAndTimezone VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb;
+ proto_tree *subtree;
+ proto_item *item;
+ gchar *digit_str;
+ guint length;
+ gchar year[5];
+ gchar month[3];
+ gchar day[3];
+ gchar hour[3];
+ gchar minute[3];
+ gchar second[3];
+
+ guint8 oct;
+ int8_t tz;
+%(DEFAULT_BODY)s
+
+ if (!parameter_tvb)
+ return offset;
+ length = tvb_reported_length(parameter_tvb);
+ if (length < 8 /*cAPSpecificBoundSetminTimeAndTimezoneLength*/){
+ expert_add_info(actx->pinfo, actx->created_item, &ei_camel_par_wrong_length);
+ return offset;
+ }
+ subtree = proto_item_add_subtree(actx->created_item, ett_camel_timeandtimezone);
+ item = proto_tree_add_item_ret_display_string(subtree, hf_camel_timeandtimezone_time, parameter_tvb, 0, 7, ENC_BCD_DIGITS_0_9, actx->pinfo->pool, &digit_str);
+
+/*
+The Time Zone indicates the difference, expressed in quarters of an hour, between the local time and GMT. In the first of the two semi octets,
+the first bit (bit 3 of the seventh octet of the TP Service Centre Time Stamp field) represents the algebraic sign of this difference (0: positive, 1: negative).
+*/
+ oct = tvb_get_guint8(parameter_tvb,7);
+
+ /* packet-gsm_sms.c time dis_field_scts_aux() */
+ tz = (oct >> 4) + (oct & 0x07) * 10;
+ tz = (oct & 0x08) ? -tz : tz;
+
+ proto_tree_add_int_format_value(subtree, hf_camel_timeandtimezone_tz, parameter_tvb, 7, 1, tz, "GMT %%+d hours %%d minutes", tz / 4, tz %% 4 * 15);
+
+ /* ENC_BCD_DIGITS_0_9 truncates if the nibble is 0xf. */
+ if (strlen(digit_str) < 14 || strchr(digit_str, '?')) {
+ expert_add_info(actx->pinfo, item, &ei_camel_bcd_not_digit);
+ return offset;
+ }
+
+ (void) g_strlcpy(year, digit_str, 5);
+ (void) g_strlcpy(month, digit_str+4, 3);
+ (void) g_strlcpy(day, digit_str+6, 3);
+ (void) g_strlcpy(hour, digit_str+8, 3);
+ (void) g_strlcpy(minute, digit_str+10, 3);
+ (void) g_strlcpy(second, digit_str+12, 3);
+
+ proto_item_append_text(item, " (%%s-%%s-%%s %%s:%%s:%%s)",year,month,day,hour,minute,second);
+
+#.TYPE_ATTR
+PDPTypeOrganization TYPE = FT_UINT8 DISPLAY = BASE_DEC BITMASK = 0x0f STRINGS = VALS(gsm_map_PDP_Type_Organisation_vals)
+DateAndTime TYPE = FT_STRING DISPLAY = BASE_NONE
+Code/local TYPE = FT_INT32 DISPLAY = BASE_DEC STRINGS = VALS(camel_opr_code_strings)
+ServiceInteractionIndicatorsTwo/holdTreatmentIndicator TYPE = FT_INT32 DISPLAY = BASE_DEC STRINGS = VALS(camel_holdTreatmentIndicator_values)
+ServiceInteractionIndicatorsTwo/cwTreatmentIndicator TYPE = FT_INT32 DISPLAY = BASE_DEC STRINGS = VALS(camel_cwTreatmentIndicator_values)
+ServiceInteractionIndicatorsTwo/ectTreatmentIndicator TYPE = FT_INT32 DISPLAY = BASE_DEC STRINGS = VALS(camel_ectTreatmentIndicator_values)
+#.FIELD_ATTR
+EventSpecificInformationSMS/o-smsFailureSpecificInfo/failureCause ABBREV=mo-smsfailureCause
+EventSpecificInformationBCSM/routeSelectFailureSpecificInfo/failureCause ABBREV=routeSelectfailureCause
+EventSpecificInformationSMS/t-smsFailureSpecificInfo/failureCause ABBREV=t-smsfailureCause
+Tone/duration ABBREV=toneDuration
+GapIndicators/duration ABBREV=gapIndicatorsDuration
+InbandInfo/duration ABBREV=inbandInfoDuration
+
+#.END