# camel.cnf # camel conformation file # Anders Broman 2007 # $Id$ #.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 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 #.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) { proto_item *cause; switch(opcode){ #.TABLE2_BODY OPERATION.&ArgumentType case %(&operationCode)s: /* %(_ident)s */ offset= %(_argument_pdu)s(tvb, actx->pinfo , tree); break; #.TABLE2_FTR cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown invokeData blob"); proto_item_set_expert_flags(cause, PI_MALFORMED, PI_WARN); expert_add_info_format(actx->pinfo, cause, PI_MALFORMED, PI_WARN, "Unknown invokeData %d",opcode); /* todo call the asn.1 dissector */ } return offset; } #.END #.TABLE2_HDR static int dissect_returnResultData(proto_tree *tree, tvbuff_t *tvb, int offset,asn1_ctx_t *actx) { proto_item *cause; switch(opcode){ #.TABLE2_BODY OPERATION.&ResultType case %(&operationCode)s: /* %(_ident)s */ offset= %(_result_pdu)s(tvb, actx->pinfo , tree); break; #.TABLE2_FTR default: cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown returnResultData blob"); proto_item_set_expert_flags(cause, PI_MALFORMED, PI_WARN); expert_add_info_format(actx->pinfo, cause, PI_MALFORMED, PI_WARN, "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) { proto_item *cause; switch(errorCode) { #.TABLE2_BODY ERROR.&ParameterType case %(&errorCode)s: /* %(_ident)s */ %(_parameter_pdu)s(tvb, actx->pinfo , tree); break; #.TABLE2_FTR default: cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown returnErrorData blob"); proto_item_set_expert_flags(cause, PI_MALFORMED, PI_WARN); expert_add_info_format(actx->pinfo, cause, PI_MALFORMED, PI_WARN, "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_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); } is_ExtensionField = FALSE; #---------------------------------------------------------------------------------------- #.FN_BODY CallingPartyNumber VAL_PTR = ¶meter_tvb tvbuff_t *parameter_tvb; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; dissect_isup_calling_party_number_parameter(parameter_tvb, tree, NULL); #.END #---------------------------------------------------------------------------------------- #.FN_BODY CalledPartyNumber VAL_PTR = ¶meter_tvb tvbuff_t *parameter_tvb; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; dissect_isup_called_party_number_parameter(parameter_tvb, tree, NULL); #.END #---------------------------------------------------------------------------------------- #.FN_BODY LocationNumber VAL_PTR = ¶meter_tvb tvbuff_t *parameter_tvb; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; dissect_isup_location_number_parameter(parameter_tvb, tree, 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, 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, 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_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(tree, hf_camel_PDPTypeNumber_etsi, parameter_tvb, 0, 1, FALSE); break; case 1: /* IETF */ proto_tree_add_item(tree, hf_camel_PDPTypeNumber_ietf, parameter_tvb, 0, 1, FALSE); 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(tree, hf_camel_PDPAddress_IPv4, parameter_tvb, 0, tvb_length(parameter_tvb), FALSE); break; case 0x57: /* IPv6 */ proto_tree_add_item(tree, hf_camel_PDPAddress_IPv6, parameter_tvb, 0, tvb_length(parameter_tvb), FALSE); 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); 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 #.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 AccessPointName 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