forked from osmocom/wireshark
4e1b5ea866
Change-Id: I1a317b19d8076588c9305dae6287bb80cc14da64 Reviewed-on: https://code.wireshark.org/review/4494 Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net> Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Stig Bjørlykke <stig@bjorlykke.org>
673 lines
21 KiB
INI
673 lines
21 KiB
INI
# 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_NEW
|
|
ERROR.&ParameterType
|
|
OPERATION.&ArgumentType
|
|
OPERATION.&ResultType
|
|
#.END
|
|
|
|
|
|
#.REGISTER_NEW
|
|
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 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 = ¶meter_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, subtree, NULL);
|
|
#.END
|
|
|
|
#----------------------------------------------------------------------------------------
|
|
#.FN_BODY CalledPartyNumber VAL_PTR = ¶meter_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, subtree, NULL);
|
|
#.END
|
|
|
|
#----------------------------------------------------------------------------------------
|
|
#.FN_BODY LocationNumber VAL_PTR = ¶meter_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, subtree, NULL);
|
|
#.END
|
|
|
|
#----------------------------------------------------------------------------------------
|
|
#.FN_BODY GenericNumber VAL_PTR = ¶meter_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 = ¶meter_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_length_remaining(parameter_tvb,0), subtree, hf_camel_cause_indicator, &Cause_value, isup_parameter_type_value);
|
|
#.END
|
|
|
|
#----------------------------------------------------------------------------------------
|
|
#.FN_BODY RPCause VAL_PTR = ¶meter_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_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 = ¶meter_tvb
|
|
tvbuff_t *parameter_tvb;
|
|
|
|
%(DEFAULT_BODY)s
|
|
|
|
if (!parameter_tvb)
|
|
return offset;
|
|
|
|
dissect_q931_bearer_capability_ie(parameter_tvb, 0, tvb_length_remaining(parameter_tvb,0), tree);
|
|
#.END
|
|
|
|
#----------------------------------------------------------------------------------------
|
|
#.FN_BODY OriginalCalledPartyID VAL_PTR = ¶meter_tvb
|
|
|
|
tvbuff_t *parameter_tvb;
|
|
|
|
%(DEFAULT_BODY)s
|
|
|
|
if (!parameter_tvb)
|
|
return offset;
|
|
dissect_isup_original_called_number_parameter(parameter_tvb, actx->pinfo, tree, NULL);
|
|
#.END
|
|
|
|
#----------------------------------------------------------------------------------------
|
|
#.FN_PARS RedirectingPartyID
|
|
|
|
VAL_PTR = ¶meter_tvb
|
|
|
|
#.FN_BODY RedirectingPartyID
|
|
|
|
tvbuff_t *parameter_tvb;
|
|
|
|
%(DEFAULT_BODY)s
|
|
|
|
if (!parameter_tvb)
|
|
return offset;
|
|
dissect_isup_redirecting_number_parameter(parameter_tvb, tree, NULL);
|
|
#.END
|
|
|
|
#----------------------------------------------------------------------------------------
|
|
#.FN_PARS AccessPointName
|
|
VAL_PTR = ¶meter_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_length(parameter_tvb), NULL, 0);
|
|
#.END
|
|
|
|
#----------------------------------------------------------------------------------------
|
|
#.FN_BODY EndUserAddress/pDPTypeOrganization VAL_PTR = ¶meter_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 = ¶meter_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 = ¶meter_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_length(parameter_tvb), ENC_BIG_ENDIAN);
|
|
break;
|
|
case 0x57: /* IPv6 */
|
|
proto_tree_add_item(subtree, hf_camel_PDPAddress_IPv6, parameter_tvb, 0, tvb_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 = ¶meter_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 = ¶meter_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 = ¶meter_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 = ¶meter_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 = ¶meter_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 = ¶meter_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 = ¶meter_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_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 = ¶meter_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_length(parameter_tvb), NULL, 0);
|
|
|
|
#.END
|
|
|
|
#.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)
|
|
#.END
|