# inap.cnf # inap conformation file #.IMPORT ../dap/dap-exp.cnf #.IMPORT ../dsp/dsp-exp.cnf #.EXPORTS BothwayThroughConnectionInd CallingPartysCategory CriticalityType Duration HighLayerCompatibility Integer4 Interval LegID MiscCallInfo RedirectionInformation ServiceKey #.NO_EMIT ONLY_VALS ROS #.OMIT_ASSIGNMENT # Removed as they are giving 'defined but not used' warnings currently. Priority RejectProblem #.END #.TYPE_RENAME ReturnResult/result/result ResultArgument #.FIELD_RENAME Invoke/linkedId/present inkedIdPresent Reject/problem/invoke invokeProblem Reject/problem/returnError returnErrorProblem ReturnResult/result/result resultArgument Reject/problem/returnResult problemReturnResult Trigger/tDPIdentifier trigger_tDPIdentifier InbandInfo/duration inbandInfo_duration Tone/duration tone_duration FilteringCharacteristics/interval filteringCharacteristics_interval InbandInfo/interval inbandInfo_interval ScfTaskRefusedParameter/reason scfTaskRefusedParameter_reason Code/local code_local #.FIELD_ATTR Trigger/tDPIdentifier ABBREV=trigger.tdpidentifier InbandInfo/duration ABBREV=inbandInfo.duration Tone/duration ABBREV=tone.duration FilteringCharacteristics/interval ABBREV=filteringCharacteristics.interval InbandInfo/interval ABBREV=inbandInfo.interval ScfTaskRefusedParameter/reason ABBREV=scfTaskRefusedParameter.reason Code/local ABBREV=code.local #.OMIT_ASSIGNMENT Remote-Operations-Information-Objects Bind Unbind #.END #.PDU ERROR.&ParameterType OPERATION.&ArgumentType OPERATION.&ResultType # This table creates the value_string to name Inap operation codes and errors # in file packet-inap-table.c which is included in the template file # #.TABLE_HDR /* INAP OPERATIONS */ static const value_string inap_opr_code_strings[] = { #.TABLE_BODY OPERATION.&operationCode { %(&operationCode)-40s, "%(_ident)s" }, #.TABLE_FTR { 0, NULL } }; #.END #.TABLE_HDR /* INAP ERRORS */ static const value_string inap_err_code_string_vals[] = { #.TABLE_BODY ERROR.&errorCode { %(&errorCode)-40s, "%(_ident)s" }, #.TABLE_FTR { 0, NULL } }; #.END # This table creates the switch() to branch on Camel operation codes and errors # in file packet-inap-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_inap_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_inap_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 */ offset= %(_parameter_pdu)s(tvb, actx->pinfo , tree , NULL); break; #.TABLE2_FTR default: proto_tree_add_expert_format(tree, actx->pinfo, &ei_inap_unknown_returnErrorData, tvb, offset, -1, "Unknown returnErrorData %d", opcode); } return offset; } #.END # Create a table of opcode and corresponding args and res #.TABLE11_HDR typedef struct _inap_op_t { int32_t opcode; dissector_t arg_pdu; dissector_t res_pdu; } inap_op_t; static const inap_op_t inap_op_tab[] = { #.TABLE11_BODY OPERATION.&operationCode /* %(_name)-31s */ { %(&operationCode)-40s, %(_argument_pdu)-45s, %(_result_pdu)s }, #.TABLE11_FTR }; #.END #.TABLE11_HDR typedef struct _inap_err_t { int32_t errcode; dissector_t err_pdu; } inap_err_t; static const inap_err_t inap_err_tab[] = { #.TABLE11_BODY ERROR.&errorCode /* %(_name)-30s */ { %(&errorCode)4s, %(_parameter_pdu)s }, #.TABLE11_FTR }; #.END # ROS stuff here XXX change when TCAP is redone. #.FN_BODY Code/local VAL_PTR = &opcode %(DEFAULT_BODY)s if (is_ExtensionField == false){ if (inap_opcode_type == INAP_OPCODE_RETURN_ERROR){ errorCode = opcode; col_append_str(actx->pinfo->cinfo, COL_INFO, val_to_str(errorCode, inap_err_code_string_vals, "Unknown INAP 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, inap_opr_code_strings, "Unknown INAP (%%u)")); col_append_str(actx->pinfo->cinfo, COL_INFO, " "); col_set_fence(actx->pinfo->cinfo, COL_INFO); } } #.FN_HDR Invoke inap_opcode_type=INAP_OPCODE_INVOKE; #.FN_HDR ReturnResult inap_opcode_type=INAP_OPCODE_RETURN_RESULT; #.FN_HDR ReturnError inap_opcode_type=INAP_OPCODE_RETURN_ERROR; #.FN_HDR Reject inap_opcode_type=INAP_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 TriggerData/triggerPar /* FIX ME */ #.FN_BODY ScriptEventArg/uIScriptResult /* FIX ME */ #.FN_BODY ScriptCloseArg/uIScriptSpecificInfo /* FIX ME */ #.FN_BODY ScriptInformationArg/uIScriptSpecificInfo /* FIX ME */ #.FN_BODY ScriptRunArg/uIScriptSpecificInfo /* FIX ME */ #.FN_HDR ExtensionField obj_id = NULL; is_ExtensionField =true; #.FN_PARS Code/global FN_VARIANT = _str VAL_PTR = &obj_id #.FN_BODY ExtensionField/value proto_tree *ext_tree; ext_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_inap_extension_data, NULL, "Extension Data"); if (obj_id){ offset=call_ber_oid_callback(obj_id, tvb, offset, actx->pinfo, ext_tree, NULL); }else{ call_data_dissector(tvb, actx->pinfo, ext_tree); offset = tvb_reported_length_remaining(tvb,offset); } is_ExtensionField = false; #.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, actx->pinfo, tree, NULL); #.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, actx->pinfo, tree, NULL); #.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_reported_length_remaining(parameter_tvb,0), tree); #.FN_BODY RedirectionInformation 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_inap_RedirectionInformation); dissect_isup_redirection_information_parameter(parameter_tvb, subtree, NULL); #.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); #.FN_BODY RedirectingPartyID VAL_PTR = ¶meter_tvb tvbuff_t *parameter_tvb; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; dissect_isup_redirecting_number_parameter(parameter_tvb, actx->pinfo, tree, NULL); #.FN_BODY HighLayerCompatibility VAL_PTR = ¶meter_tvb /* * -- Indicates the teleservice. For encoding, DSS1 (Q.931) is used. */ tvbuff_t *parameter_tvb; proto_tree *subtree; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; subtree = proto_item_add_subtree(actx->created_item, ett_inap_HighLayerCompatibility); dissect_q931_high_layer_compat_ie(parameter_tvb, 0, tvb_reported_length_remaining(parameter_tvb,0), subtree); #.FN_BODY Cause VAL_PTR = ¶meter_tvb /* * -- Indicates the cause for interface related information. Refer to the Q.763 Cause parameter for encoding * -- For the use of cause and location values refer to Q.850. */ tvbuff_t *parameter_tvb; uint8_t Cause_value; proto_tree *subtree; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; subtree = proto_item_add_subtree(actx->created_item, ett_inap_cause); dissect_q931_cause_ie(parameter_tvb, 0, tvb_reported_length_remaining(parameter_tvb,0), subtree, hf_inap_cause_indicator, &Cause_value, isup_parameter_type_value); #.FN_BODY Digits VAL_PTR = ¶meter_tvb /* *-- Indicates the address signalling digits. Refer to the Q.763 Generic Number and Generic Digits parameter *-- for encoding. The coding of the subfield's 'NumberQualifier' in Generic Number and 'TypeOfDigits' in *-- Generic Digits are irrelevant to the INAP, 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 should use Generic Number *-- Additional Calling Number, CorrelationID for AssistRequestInstructions, AssistingSSPIPRoutingAddress *-- for EstablishTemporaryConnection *-- calledAddressValue for all occurrences,callingAddressValue for all occurrences *-- The following parameters should use Generic Digits: prefix, all *-- other CorrelationID occurrences, dialledNumber filtering criteria, callingLineID filtering criteria, lineID for *-- ResourceID type, digitResponse for ReceivedInformationArg, iNServiceControlLow / iNServiceControlHigh for *--MidCallInfoType,, iNServiceControlCode for MidCallInfo. */ tvbuff_t *parameter_tvb; proto_tree *subtree; int ett = -1; bool digits = false; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; if (hf_index == hf_inap_additionalCallingPartyNumber) { ett = ett_inap_additionalCallingPartyNumber; } else if (hf_index == hf_inap_assistingSSPIPRoutingAddress) { ett = ett_inap_assistingSSPIPRoutingAddress; } else if (hf_index == hf_inap_correlationID) { ett = ett_inap_correlationID; digits = (opcode != opcode_assistRequestInstructions) ? true : false; } else if (hf_index == hf_inap_calledAddressValue) { ett = ett_inap_calledAddressValue; } else if (hf_index == hf_inap_callingAddressValue) { ett = ett_inap_callingAddressValue; } else if (hf_index == hf_inap_number) { ett = ett_inap_number; } else if (hf_index == hf_inap_dialledNumber) { ett = ett_inap_dialledNumber; digits = true; } else if (hf_index == hf_inap_callingLineID) { ett = ett_inap_callingLineID; digits = true; } else if (hf_index == hf_inap_iNServiceControlCode) { ett = ett_inap_iNServiceControlCode; digits = true; } else if (hf_index == hf_inap_iNServiceControlCodeLow) { ett = ett_inap_iNServiceControlCodeLow; digits = true; } else if (hf_index == hf_inap_iNServiceControlCodeHigh) { ett = ett_inap_iNServiceControlCodeHigh; digits = true; } else if (hf_index == hf_inap_lineID) { ett = ett_inap_lineID; digits = true; } else if (hf_index == hf_inap_prefix) { ett = ett_inap_prefix; digits = true; } else if (hf_index == hf_inap_iPAddressValue) { ett = ett_inap_iPAddressValue; } else if (hf_index == hf_inap_digitsResponse) { ett = ett_inap_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); } #.END #.TYPE_ATTR CallingPartysCategory TYPE = FT_UINT16 DISPLAY = BASE_DEC|BASE_EXT_STRING STRINGS = &isup_calling_partys_category_value_ext #.END # # Editor modelines - https://www.wireshark.org/tools/modelines.html # # Local variables: # c-basic-offset: 2 # tab-width: 8 # indent-tabs-mode: nil # End: # # vi: set shiftwidth=2 tabstop=8 expandtab: # :indentSize=2:tabSize=8:noTabs=true: #