diff options
Diffstat (limited to 'epan/dissectors/asn1/gsm_map/gsm_map.cnf')
-rw-r--r-- | epan/dissectors/asn1/gsm_map/gsm_map.cnf | 1020 |
1 files changed, 1020 insertions, 0 deletions
diff --git a/epan/dissectors/asn1/gsm_map/gsm_map.cnf b/epan/dissectors/asn1/gsm_map/gsm_map.cnf new file mode 100644 index 0000000000..e8b1cbb1bb --- /dev/null +++ b/epan/dissectors/asn1/gsm_map/gsm_map.cnf @@ -0,0 +1,1020 @@ +#.OPT +-b +#-d satcom +#-s packet-gsm_map-tmp +#-k +-o gsm_map +#.END + +#.MODULE +MAP-BS-Code gsm_map +MAP-TS-Code gsm_map +MAP-SS-Code gsm_map +MAP-ExtensionDataTypes gsm_map +MAP-CommonDataTypes gsm_map + +MAP-SS-DataTypes gsm_map.ss +MAP-OM-DataTypes gsm_map.om +MAP-ER-DataTypes gsm_map.er +MAP-SM-DataTypes gsm_map.sm +MAP-MS-DataTypes gsm_map.ms +MAP-LCS-DataTypes gsm_map.lcs +MAP-GR-DataTypes gsm_map.gr +MAP-CH-DataTypes gsm_map.ch + +MAP-Errors gsm_map +MAP-LocationServiceOperations gsm_map +MAP-Group-Call-Operations gsm_map +MAP-ShortMessageServiceOperations gsm_map +MAP-SupplementaryServiceOperations gsm_map +MAP-CallHandlingOperations gsm_map +MAP-OperationAndMaintenanceOperations gsm_map +MAP-MobileServiceOperations gsm_map +MAP-Protocol gsm_map +MAP-DialogueInformation gsm_map.dialogue +MAP-ApplicationContexts gsm_map +SS-DataTypes gsm_ss +SS-Operations gsm_ss +DummyMAP gsm_old +EricssonMAP gsm_map.ericsson + +Remote-Operations-Information-Objects ROS + +#.NO_EMIT ONLY_VALS +CallBarredParam +PW-RegistrationFailureCause +SystemFailureParam +ExtensionType +NumberPorted/_untag + +#.OMIT_ASSIGNMENT +Code +Priority +CommonComponentId +SubscriberId +GuidanceInfo +SS-InfoList +# Omitting SubscriberData makes CONTENT OF fail and InsertSubscriberDataArg will not get all its tags +# Not yet used Nokia extensions +SS-DataEmoInExt +EmoInCategoryKey +ANSIIsdArgExt +ANSISriResExt +PrefCarrierIdList +USSD-Extension +CosInfo +AnyTimePO-BarringArg +AnyTimePO-BarringRes +CarrierIdCode +COS-FeatureList +GprsBarring +COS-Feature +CustomerGroupID +SubGroupID +ClassOfServiceID +#.END +#.PDU +LCS-ClientID +ISDN-AddressString + +#.USE_VALS_EXT +GSMMAPOperationLocalvalue +OperationLocalvalue + +#.EXPORTS +AddressString +Add-GeographicalInformation +AgeOfLocationInformation +AlertingPattern +AreaEventInfo +BasicServiceCode +CallReferenceNumber +CCBS-Feature +CellGlobalIdOrServiceAreaIdOrLAI +CellGlobalIdOrServiceAreaIdFixedLength +CUG-CheckInfo +CUG-Index +CUG-Interlock +CUG-Info +CurrentPassword +D-CSI +DeferredLocationEventType +DefaultGPRS-Handling +DefaultSMS-Handling +EraseCC-EntryArg +EraseCC-EntryRes +Ext-BasicServiceCode +Ext-ForwOptions +Ext-GeographicalInformation EXTERN WS_DLL +Ext-NoRepCondTime +Ext-QoS-Subscribed +Ext2-QoS-Subscribed +Ext3-QoS-Subscribed +ExtensionContainer +ExternalSignalInfo +ForwardingOptions +GeographicalInformation +GetPasswordArg +GlobalCellId EXTERN WS_DLL +GPRSChargingID +GPRSMSClass +GSMMAPLocalErrorcode +GSN-Address +IMEI +IMSI EXTERN WS_DLL +InterrogateSS-Res +ISDN-AddressString EXTERN WS_DLL +ISDN-AddressString_PDU EXTERN WS_DLL +ISDN-SubaddressString +LAIFixedLength +LCSClientExternalID +LCS-ClientID +LCS-ClientID_PDU +LCSClientInternalID +LCSClientName +LCSClientType +LCSRequestorID +LCSCodeword +LCS-Priority +LCSServiceTypeID +LCS-ReferenceNumber +LCS-QoS +LocationInformation +LocationMethod +LocationType +LSAIdentity +MS-Classmark2 +NAEA-CIC +NetworkResource +NewPassword +NotificationToMSUser +O-CSI +O-BcsmCamelTDPCriteriaList +OfferedCamel4Functionalities +PositionMethodFailure-Diagnostic +ProtectedPayload +QoS-Subscribed +RAIdentity +RegisterCC-EntryRes +RegisterSS-Arg +SM-RP-DA +SM-RP-OA +SubscriberState +SecurityHeader +ServiceKey +SupportedCamelPhases +SupportedGADShapes +SuppressionOfAnnouncement +SS-Code +SS-Status +SS-Info +SS-ForBS-Code +TBCD-STRING +UnauthorizedLCSClient-Diagnostic +USSD-DataCodingScheme +USSD-String +USSD-Arg +USSD-Res +UU-Data +VelocityEstimate +#.END +#.REGISTER +MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS" + +# This table creates the value_sting to name GSM MAP operation codes and errors +# in file packet-camel-table.c which is included in the template file +# +#.TABLE_BODY OPERATION + { %(&operationCode)s, "%(_ident)s" }, +#.END + +#.TABLE2_BODY ERROR + { %(&errorCode)s, "%(_ident)s" }, +#.END + + +# Conformance for ROS stuff + +#.FN_BODY InvokeParameter + offset = dissect_invokeData(tree, tvb, offset, actx); + +#.FN_BODY ReturnResultParameter + offset = dissect_returnResultData(tree, tvb, offset, actx); + +#.FN_BODY ReturnErrorParameter + offset = dissect_returnErrorData(tree, tvb, offset, actx); + +#.FN_PARS GSMMAPOperationLocalvalue + + VAL_PTR = &opcode + +#.FN_BODY GSMMAPOperationLocalvalue + const char *opcode_string; + +%(DEFAULT_BODY)s + /* Retrieve opcode string and eventually update item value */ + opcode_string = gsm_map_opr_code(opcode, actx->created_item); + col_append_str(actx->pinfo->cinfo, COL_INFO, opcode_string); + col_append_str(actx->pinfo->cinfo, COL_INFO, " "); + +#.FN_PARS GSMMAPLocalErrorcode + + VAL_PTR = &errorCode +# End ROS +#---------------------------------------------------------------------------------------- + +#.FN_BODY PrivateExtension/extId FN_VARIANT = _str VAL_PTR = &actx->external.direct_reference +%(DEFAULT_BODY)s + actx->external.direct_ref_present = (actx->external.direct_reference != NULL) ? TRUE : FALSE; + +#.FN_BODY PrivateExtension/extType + proto_tree *ext_tree; + ext_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_gsm_map_extension_data, NULL, "Extension Data"); + if (actx->external.direct_ref_present){ + offset=call_ber_oid_callback(actx->external.direct_reference, tvb, offset, actx->pinfo, ext_tree, NULL); + }else{ + call_dissector(data_handle, tvb, actx->pinfo, ext_tree); + offset = tvb_reported_length_remaining(tvb,offset); + } + +#.FN_PARS AccessNetworkProtocolId + + VAL_PTR = &AccessNetworkProtocolId + +#.FN_BODY AddressString 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_gsm_map_isdn_address_string); + dissect_gsm_map_msisdn(parameter_tvb, actx->pinfo , subtree); + +#.FN_BODY IMSI VAL_PTR = ¶meter_tvb + tvbuff_t *parameter_tvb; + + offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, ¶meter_tvb); + + if (!parameter_tvb) + return offset; + if(tvb_reported_length(parameter_tvb)==0) + return offset; + + /* Hide the octet string default printout */ + PROTO_ITEM_SET_HIDDEN(actx->created_item); + dissect_e212_imsi(parameter_tvb, actx->pinfo, tree, 0, tvb_reported_length(parameter_tvb), FALSE); + + +#.FN_BODY TBCD-STRING VAL_PTR = ¶meter_tvb + tvbuff_t *parameter_tvb; + const char *digit_str; + proto_tree *subtree; + + %(DEFAULT_BODY)s + + if (!parameter_tvb) + return offset; + if(tvb_reported_length(parameter_tvb)==0) + return offset; + + subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_tbcd_digits); + digit_str = tvb_bcd_dig_to_wmem_packet_str(parameter_tvb, 0, -1, NULL, FALSE); + proto_tree_add_string(subtree, hf_gsm_map_TBCD_digits, parameter_tvb, 0, -1, digit_str); + +#---------------------------------------------------------------------------------------- +#.FN_BODY LongSignalInfo VAL_PTR = ¶meter_tvb +# +#7.6.9.1 AN-apdu +#This parameter includes one or two concatenated complete 3GPP TS 25.413 or 3GPP TS 48.006 [48] messages, as +#described in 3GPP TS 23.009 and 3GPP TS 29.010. The access network protocol ID indicates that the message or +#messages are according to either 3GPP TS 48.006 [48] or 3GPP TS 25.413. For the coding of the messages see 3GPP +#TS 25.413, 3GPP TS 48.006 [48] and 3GPP TS 48.008 [49]. + + tvbuff_t *parameter_tvb; + guint8 octet; + tvbuff_t *next_tvb; + proto_tree *subtree; + + +%(DEFAULT_BODY)s + + if (!parameter_tvb) + return offset; + + subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_LongSignalInfo); + + switch (AccessNetworkProtocolId){ + /* ts3G-48006 */ + case 1: + octet = tvb_get_guint8(parameter_tvb,0); + /* Discrimination parameter */ + proto_tree_add_item(subtree, hf_gsm_map_disc_par, parameter_tvb, 0,1,ENC_BIG_ENDIAN); + if ( octet == 0) {/* DISCRIMINATION TS 48 006(GSM 08.06 version 5.3.0) */ + /* Strip off discrimination and length */ + proto_tree_add_item(subtree, hf_gsm_map_len, parameter_tvb, 1,1,ENC_BIG_ENDIAN); + next_tvb = tvb_new_subset_remaining(parameter_tvb, 2); + call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree, + p_get_proto_data(actx->pinfo->pool, actx->pinfo, proto_gsm_map, actx->pinfo->curr_layer_num)); + }else if(octet==1){ + proto_tree_add_item(subtree, hf_gsm_map_dlci, parameter_tvb, 1,1,ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_map_len, parameter_tvb, 2,1,ENC_BIG_ENDIAN); + next_tvb = tvb_new_subset_remaining(parameter_tvb, 3); + call_dissector(dtap_handle, next_tvb, actx->pinfo, subtree); + } + break; + /* ts3G-25413 */ + case 2: + call_dissector(ranap_handle, parameter_tvb, actx->pinfo, tree); + break; + default: + break; + + } +# Set SENT/RECEIVED depending if ISDN-AddressString or AddressString is used. +# as it's a CHOICE only one is present. +#.FN_BODY SM-RP-OAold/serviceCentreAddressOA + actx->pinfo->p2p_dir = P2P_DIR_SENT; +%(DEFAULT_BODY)s + +#.FN_BODY SM-RP-OA/serviceCentreAddressOA + actx->pinfo->p2p_dir = P2P_DIR_SENT; +%(DEFAULT_BODY)s + +#.FN_BODY SM-RP-DAold/imsi + actx->pinfo->p2p_dir = P2P_DIR_SENT; +%(DEFAULT_BODY)s + +#.FN_BODY SM-RP-DAold/lmsi + actx->pinfo->p2p_dir = P2P_DIR_SENT; +%(DEFAULT_BODY)s + +#.FN_BODY SM-RP-DA/imsi + actx->pinfo->p2p_dir = P2P_DIR_SENT; +%(DEFAULT_BODY)s + +#.FN_BODY SM-RP-DA/lmsi + actx->pinfo->p2p_dir = P2P_DIR_SENT; +%(DEFAULT_BODY)s + +#.FN_BODY SM-RP-OAold/msisdn +actx->pinfo->p2p_dir = P2P_DIR_RECV; + %(DEFAULT_BODY)s + +#.FN_BODY SM-RP-OA/msisdn +actx->pinfo->p2p_dir = P2P_DIR_RECV; + %(DEFAULT_BODY)s + +#.FN_BODY SM-RP-DAold/serviceCentreAddressDA + actx->pinfo->p2p_dir = P2P_DIR_RECV; +%(DEFAULT_BODY)s + +#.FN_BODY SM-RP-DA/serviceCentreAddressDA + actx->pinfo->p2p_dir = P2P_DIR_RECV; +%(DEFAULT_BODY)s + +#.FN_BODY SignalInfo VAL_PTR = ¶meter_tvb + tvbuff_t *parameter_tvb; + + %(DEFAULT_BODY)s + actx->value_ptr = (void*)parameter_tvb; + + +#.FN_BODY SM-DeliveryFailureCause + /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */ + guint8 oct; +%(DEFAULT_BODY)s + + if (!actx->value_ptr) + return offset; + /* Detailed diagnostic information contains either a SMS-SUBMIT-REPORT or a SMS-DELIVERY-REPORT */ + oct = tvb_get_guint8((tvbuff_t*)actx->value_ptr, 0); + actx->pinfo->p2p_dir = ((oct & 0x03) == 0) ? P2P_DIR_RECV : P2P_DIR_SENT; + call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL); + +#.FN_BODY ForwardSM-Arg + + /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */ +%(DEFAULT_BODY)s + + if (!actx->value_ptr) + return offset; + if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) { + if (gsmmap_pdu_type == 1) { + actx->pinfo->p2p_dir = P2P_DIR_SENT; + } else { + actx->pinfo->p2p_dir = P2P_DIR_RECV; + } + } + call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL); + +#.FN_BODY MO-ForwardSM-Arg + + /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */ +%(DEFAULT_BODY)s + + if (!actx->value_ptr) + return offset; + if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) { + actx->pinfo->p2p_dir = P2P_DIR_RECV; + } + call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL); + +#.FN_BODY MO-ForwardSM-Res + + /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */ +%(DEFAULT_BODY)s + + if (!actx->value_ptr) + return offset; + if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) { + actx->pinfo->p2p_dir = P2P_DIR_SENT; + } + call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL); + +#.FN_BODY MT-ForwardSM-Arg + + /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */ +%(DEFAULT_BODY)s + + if (!actx->value_ptr) + return offset; + if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) { + actx->pinfo->p2p_dir = P2P_DIR_SENT; + } + call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL); + +#.FN_BODY MT-ForwardSM-Res + + /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */ +%(DEFAULT_BODY)s + + if (!actx->value_ptr) + return offset; + if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) { + actx->pinfo->p2p_dir = P2P_DIR_RECV; + } + call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL); + +#.FN_BODY MT-ForwardSM-VGCS-Arg + + /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */ +%(DEFAULT_BODY)s + + if (!actx->value_ptr) + return offset; + if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) { + actx->pinfo->p2p_dir = P2P_DIR_SENT; + } + call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL); + +#.FN_BODY MT-ForwardSM-VGCS-Res + + /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */ +%(DEFAULT_BODY)s + + if (!actx->value_ptr) + return offset; + if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) { + actx->pinfo->p2p_dir = P2P_DIR_RECV; + } + call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL); + +#.FN_BODY SS-Status VAL_PTR = ¶meter_tvb + + tvbuff_t *parameter_tvb; + guint8 octet; + +%(DEFAULT_BODY)s + + if (!parameter_tvb) + return offset; + + octet = tvb_get_guint8(parameter_tvb,0); + + proto_tree_add_uint(tree, hf_gsm_map_Ss_Status_unused, parameter_tvb, 0,1,octet); + if ((octet & 0x01)== 1) + proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_q_bit, parameter_tvb, 0,1,octet); + + proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_p_bit, parameter_tvb, 0,1,octet); + proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_r_bit, parameter_tvb, 0,1,octet); + proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_a_bit, parameter_tvb, 0,1,octet); + +#.FN_BODY Ext-SS-Status VAL_PTR = ¶meter_tvb + /* Note Ext-SS-Status can have more than one byte */ + + tvbuff_t *parameter_tvb; + guint8 octet; + +%(DEFAULT_BODY)s + + if (!parameter_tvb) + return offset; + + octet = tvb_get_guint8(parameter_tvb,0); + + proto_tree_add_uint(tree, hf_gsm_map_Ss_Status_unused, parameter_tvb, 0,1,octet); + if ((octet & 0x01)== 1) + proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_q_bit, parameter_tvb, 0,1,octet); + + proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_p_bit, parameter_tvb, 0,1,octet); + proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_r_bit, parameter_tvb, 0,1,octet); + proto_tree_add_boolean(tree, hf_gsm_map_Ss_Status_a_bit, parameter_tvb, 0,1,octet); + +#.END + +#.FN_BODY USSD-DataCodingScheme VAL_PTR = ¶meter_tvb + /*The structure of the USSD-DataCodingScheme is defined by + * the Cell Broadcast Data Coding Scheme as described in + * TS 3GPP TS 23.038 + * TODO: Should dissect_cbs_data_coding_scheme return encoding type? - like 7bit Alphabet + */ + tvbuff_t *parameter_tvb; + proto_tree *subtree; + +%(DEFAULT_BODY)s + if (!parameter_tvb) + return offset; + subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_cbs_data_coding); + dissect_cbs_data_coding_scheme(parameter_tvb, actx->pinfo, subtree, 0); + +#.FN_BODY USSD-String VAL_PTR = ¶meter_tvb + + tvbuff_t *parameter_tvb; + guint length; + proto_tree *subtree; + +%(DEFAULT_BODY)s + if (!parameter_tvb) + return offset; + + length = tvb_ensure_captured_length_remaining(parameter_tvb,0); + subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_ussd_string); + switch(sms_encoding){ + case SMS_ENCODING_7BIT: + case SMS_ENCODING_7BIT_LANG: + proto_tree_add_string(subtree, hf_gsm_map_ussd_string, parameter_tvb, 0, length, tvb_get_string_enc(wmem_packet_scope(), parameter_tvb, 0, length, ENC_3GPP_TS_23_038_7BITS|ENC_NA)); + break; + case SMS_ENCODING_8BIT: + /* XXX - ASCII, or some extended ASCII? */ + proto_tree_add_string(subtree, hf_gsm_map_ussd_string, parameter_tvb, 0, length, tvb_get_string_enc(wmem_packet_scope(), parameter_tvb, 0, length, ENC_ASCII|ENC_NA)); + break; + case SMS_ENCODING_UCS2: + case SMS_ENCODING_UCS2_LANG: + proto_tree_add_string(subtree, hf_gsm_map_ussd_string, parameter_tvb, 0, length, tvb_get_string_enc(wmem_packet_scope(), parameter_tvb, 0, length, ENC_UCS_2|ENC_BIG_ENDIAN)); + break; + default: + break; + } + +#.FN_FTR ForwardingOptions + + proto_tree_add_item(tree, hf_gsm_map_notification_to_forwarding_party, tvb, 0,1,ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_map_redirecting_presentation, tvb, 0,1,ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_map_notification_to_calling_party, tvb, 0,1,ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_map_forwarding_reason, tvb, 0,1,ENC_BIG_ENDIAN); +#.FN_FTR Ext-ForwFeature/forwardingOptions + + proto_tree_add_item(tree, hf_gsm_map_notification_to_forwarding_party, tvb, 0,1,ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_map_redirecting_presentation, tvb, 0,1,ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_map_notification_to_calling_party, tvb, 0,1,ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_map_forwarding_reason, tvb, 0,1,ENC_BIG_ENDIAN); + + +#.FN_BODY PDP-Type VAL_PTR = ¶meter_tvb + guint8 pdp_type_org; + tvbuff_t *parameter_tvb; + + +%(DEFAULT_BODY)s + + if (!parameter_tvb) + return offset; + proto_tree_add_item(tree, hf_gsm_map_pdp_type_org, parameter_tvb, 0,1,ENC_BIG_ENDIAN); + pdp_type_org = tvb_get_guint8(parameter_tvb,1); + switch (pdp_type_org){ + case 0: /* ETSI */ + proto_tree_add_item(tree, hf_gsm_map_etsi_pdp_type_number, parameter_tvb, 0,1,ENC_BIG_ENDIAN); + break; + case 1: /* IETF */ + proto_tree_add_item(tree, hf_gsm_map_ietf_pdp_type_number, parameter_tvb, 0,1,ENC_BIG_ENDIAN); + break; + default: + break; + } + +#.FN_BODY QoS-Subscribed VAL_PTR = ¶meter_tvb + + + tvbuff_t *parameter_tvb; + +%(DEFAULT_BODY)s + + if (!parameter_tvb) + return offset; + de_sm_qos(parameter_tvb, tree, actx->pinfo, 0, 3, NULL,0); + +#.FN_BODY Ext-QoS-Subscribed VAL_PTR = ¶meter_tvb + + tvbuff_t *parameter_tvb; + +%(DEFAULT_BODY)s + + if (!parameter_tvb) + return offset; + dissect_gsm_map_ext_qos_subscribed(tvb, actx->pinfo, tree, actx); + +#.FN_BODY GSN-Address VAL_PTR = ¶meter_tvb + + tvbuff_t *parameter_tvb; + guint8 octet; + proto_tree *subtree; + +%(DEFAULT_BODY)s + + if (!parameter_tvb) + return offset; + subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_pdptypenumber); + + octet = tvb_get_guint8(parameter_tvb,0); + switch(octet){ + case 0x04: /* IPv4 */ + proto_tree_add_item(subtree, hf_gsm_map_GSNAddress_IPv4, parameter_tvb, 1, 4, ENC_BIG_ENDIAN); + break; + case 0x50: /* IPv6 */ + proto_tree_add_item(subtree, hf_gsm_map_GSNAddress_IPv6, parameter_tvb, 1, 16, ENC_NA); + break; + default: + break; + } + +#.FN_BODY RAIdentity 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_gsm_map_RAIdentity); + de_gmm_rai(parameter_tvb, subtree, actx->pinfo, 0, 3, NULL,0); + +#.FN_BODY LAIFixedLength 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_gsm_map_LAIFixedLength); + dissect_e212_mcc_mnc(parameter_tvb, actx->pinfo, subtree, 0, E212_LAI, TRUE); + +#.FN_BODY RadioResourceInformation 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_gsm_map_RadioResourceInformation); + be_chan_type(parameter_tvb, subtree, actx->pinfo, 0, tvb_reported_length_remaining(tvb,0), NULL, 0); + +#.FN_BODY RANAP-ServiceHandover VAL_PTR = ¶meter_tvb + tvbuff_t *parameter_tvb; + asn1_ctx_t asn1_ctx; + +%(DEFAULT_BODY)s + + if (!parameter_tvb) + return offset; + + asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, TRUE, actx->pinfo); + dissect_ranap_Service_Handover(parameter_tvb, 0, &asn1_ctx, tree, hf_gsm_map_ranap_service_Handover); + +#.FN_BODY IntegrityProtectionInformation VAL_PTR = ¶meter_tvb + tvbuff_t *parameter_tvb; + asn1_ctx_t asn1_ctx; + +%(DEFAULT_BODY)s + + if (!parameter_tvb) + return offset; + + asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, TRUE, actx->pinfo); + dissect_ranap_IntegrityProtectionInformation(parameter_tvb, 0, &asn1_ctx, tree, hf_gsm_map_IntegrityProtectionInformation); + +#.FN_BODY EncryptionInformation VAL_PTR = ¶meter_tvb + tvbuff_t *parameter_tvb; + asn1_ctx_t asn1_ctx; + +%(DEFAULT_BODY)s + + if (!parameter_tvb) + return offset; + + asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, TRUE, actx->pinfo); + dissect_ranap_EncryptionInformation(parameter_tvb, 0, &asn1_ctx, tree, hf_gsm_map_EncryptionInformation); + +#.FN_PARS ProtocolId VAL_PTR = &ProtocolId +#.FN_BODY Bss-APDU + guint8 octet; + guint8 length; + tvbuff_t *next_tvb; + proto_tree *subtree; +/* +ETS 300 599: December 2000 (GSM 09.02 version 4.19.1) +5.6.9.1 BSS-apdu +This parameter includes one or two concatenated complete 08.06 messages, as described in GSM 03.09 +and GSM 09.10. The Protocol ID indicates that the message or messages are according to GSM 08.06. +For the coding of the messages see GSM 08.06 and GSM 08.08. +*/ + ProtocolId = 0xffffffff; +%(DEFAULT_BODY)s +if (!actx->value_ptr) + return offset; + subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_externalsignalinfo); + switch (ProtocolId){ + case 1: + /* gsm-0408 */ + /* As per comment abowe Individual IE:(s) will be found here in TLV format + * Unfortunatly a branch for each IE must be made to call the apropriate + * function + */ + /* Get tag */ + octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0); + proto_tree_add_item(subtree, hf_gsm_map_ie_tag, (tvbuff_t*)actx->value_ptr, 0,1,ENC_BIG_ENDIAN); + /* get length */ + length = tvb_get_guint8((tvbuff_t*)actx->value_ptr,1); + proto_tree_add_item(subtree, hf_gsm_map_len, (tvbuff_t*)actx->value_ptr, 1,1,ENC_BIG_ENDIAN); + /* Branch on tag */ + switch(octet){ + case 4: + /* Dissect the data part */ + de_bearer_cap((tvbuff_t*)actx->value_ptr, subtree, actx->pinfo, 2, length, NULL, 0); + /* TODO: There may be more than one IE */ + break; + default: + proto_tree_add_expert(subtree, actx->pinfo, &ei_gsm_map_undecoded, (tvbuff_t*)actx->value_ptr, 0, length); + break; + }/* switch(octet) */ + break; + case 2: + /* gsm-0806 */ + octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0); + /* Discrimination parameter */ + proto_tree_add_item(subtree, hf_gsm_map_disc_par, (tvbuff_t*)actx->value_ptr, 0,1,ENC_BIG_ENDIAN); + if ( octet == 0) {/* DISCRIMINATION TS 48 006(GSM 08.06 version 5.3.0) */ + /* Strip off discrimination and length */ + proto_tree_add_item(subtree, hf_gsm_map_len, (tvbuff_t*)actx->value_ptr, 1,1,ENC_BIG_ENDIAN); + next_tvb = tvb_new_subset_remaining((tvbuff_t*)actx->value_ptr, 2); + call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree, + p_get_proto_data(actx->pinfo->pool, actx->pinfo, proto_gsm_map, actx->pinfo->curr_layer_num)); + }else if(octet==1){ + proto_tree_add_item(subtree, hf_gsm_map_dlci, (tvbuff_t*)actx->value_ptr, 1,1,ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_map_len, (tvbuff_t*)actx->value_ptr, 2,1,ENC_BIG_ENDIAN); + next_tvb = tvb_new_subset_remaining((tvbuff_t*)actx->value_ptr, 3); + call_dissector(dtap_handle, next_tvb, actx->pinfo, subtree); + } + break; + case 3: + /* gsm-BSSMAP -- Value 3 is reserved and must not be used*/ + octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0); + if ( octet == 0) {/* DISCRIMINATION TS 48 006 */ + next_tvb = tvb_new_subset_remaining((tvbuff_t*)actx->value_ptr, 2); + call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree, + p_get_proto_data(actx->pinfo->pool, actx->pinfo, proto_gsm_map, actx->pinfo->curr_layer_num)); + } + break; + /* ets-300102-1 (~Q.931 ) */ + case 4: + octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0); + length = tvb_get_guint8((tvbuff_t*)actx->value_ptr,1); + if ( octet == 4 ) + dissect_q931_bearer_capability_ie((tvbuff_t*)actx->value_ptr, 2, length, subtree); + break; + default: + break; + }/*switch (ProtocolId)*/ + +#.FN_BODY ExternalSignalInfo +/* +-- Information about the internal structure is given in +-- clause 7.6.9. +7.6.9.4 External Signal Information +This parameter contains concatenated information elements (including tag and length) which are defined by a common +protocol version, preceded by the associated protocol ID. It is used to transport information of the indicated protocol via +MAP interfaces +*/ + guint8 octet; + guint8 length; + tvbuff_t *next_tvb; + proto_tree *subtree; + + ProtocolId = 0xffffffff; +%(DEFAULT_BODY)s +if (!actx->value_ptr) + return offset; + subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_externalsignalinfo); + switch (ProtocolId){ + case 1: + /* gsm-0408 */ + /* As per comment abowe Individual IE:(s) will be found here in TLV format + * Unfortunatly a branch for each IE must be made to call the apropriate + * function + */ + /* Get tag */ + octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0); + proto_tree_add_item(subtree, hf_gsm_map_ie_tag, (tvbuff_t*)actx->value_ptr, 0,1,ENC_BIG_ENDIAN); + /* get length */ + length = tvb_get_guint8((tvbuff_t*)actx->value_ptr,1); + proto_tree_add_item(subtree, hf_gsm_map_len, (tvbuff_t*)actx->value_ptr, 1,1,ENC_BIG_ENDIAN); + /* Branch on tag */ + switch(octet){ + case 4: + /* Dissect the data part */ + de_bearer_cap((tvbuff_t*)actx->value_ptr, subtree, actx->pinfo, 2, length, NULL, 0); + /* TODO: There may be more than one IE */ + break; + default: + proto_tree_add_expert(subtree, actx->pinfo, &ei_gsm_map_undecoded, (tvbuff_t*)actx->value_ptr, 0, length); + break; + }/* switch(octet) */ + break; + case 2: + /* gsm-0806 */ + octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0); + /* Discrimination parameter */ + proto_tree_add_item(subtree, hf_gsm_map_disc_par, (tvbuff_t*)actx->value_ptr, 0,1,ENC_BIG_ENDIAN); + if ( octet == 0) {/* DISCRIMINATION TS 48 006(GSM 08.06 version 5.3.0) */ + /* Strip off discrimination and length */ + proto_tree_add_item(subtree, hf_gsm_map_len, (tvbuff_t*)actx->value_ptr, 1,1,ENC_BIG_ENDIAN); + next_tvb = tvb_new_subset_remaining((tvbuff_t*)actx->value_ptr, 2); + call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree, + p_get_proto_data(actx->pinfo->pool, actx->pinfo, proto_gsm_map, actx->pinfo->curr_layer_num)); + }else if(octet==1){ + proto_tree_add_item(subtree, hf_gsm_map_dlci, (tvbuff_t*)actx->value_ptr, 1,1,ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_map_len, (tvbuff_t*)actx->value_ptr, 2,1,ENC_BIG_ENDIAN); + next_tvb = tvb_new_subset_remaining((tvbuff_t*)actx->value_ptr, 3); + call_dissector(dtap_handle, next_tvb, actx->pinfo, subtree); + } + break; + case 3: + /* gsm-BSSMAP TODO Is it correct to stripp off two first octets here?*/ + octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0); + if ( octet == 0) {/* DISCRIMINATION TS 48 006 */ + next_tvb = tvb_new_subset_remaining((tvbuff_t*)actx->value_ptr, 2); + call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree, + p_get_proto_data(actx->pinfo->pool, actx->pinfo, proto_gsm_map, actx->pinfo->curr_layer_num)); + } + break; + /* ets-300102-1 (~Q.931 ) */ + case 4: + octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0); + length = tvb_get_guint8((tvbuff_t*)actx->value_ptr,1); + if ( octet == 4 ) + dissect_q931_bearer_capability_ie((tvbuff_t*)actx->value_ptr, 2, length, subtree); + break; + default: + break; + }/*switch (ProtocolId)*/ + +#.FN_BODY GlobalCellId 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_gsm_map_GlobalCellId); + be_cell_id_aux(parameter_tvb, subtree, actx->pinfo, 0, tvb_reported_length_remaining(tvb,0), NULL, 0, 0); + +#.FN_BODY Ext-GeographicalInformation 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_gsm_map_GeographicalInformation); + dissect_geographical_description(parameter_tvb, actx->pinfo, subtree); + + +# APN ::= OCTET STRING (SIZE (2..63)) +# Octets are coded according to TS 3GPP TS 23.003 +# 9.1 Structure of APN +# : +# The APN consists of one or more labels. Each label is coded as a one octet length field followed by that number of +# octets coded as 8 bit ASCII characters. Following RFC 1035 [19] the labels shall consist only of the alphabetic +# characters (A-Z and a-z), digits (0-9) and the hyphen (-). Following RFC 1123 [20], the label shall begin and end with +# either an alphabetic character or a digit. The case of alphabetic characters is not significant. The APN is not terminated +# by a length byte of zero. +#.FN_BODY APN VAL_PTR = ¶meter_tvb + tvbuff_t *parameter_tvb; + proto_tree *subtree; + int length, name_len, tmp; + guint8 *apn_str = NULL; + +%(DEFAULT_BODY)s + if (!parameter_tvb) + return offset; + + length = tvb_reported_length(parameter_tvb); + name_len = tvb_get_guint8(parameter_tvb, 0); + apn_str = tvb_get_string_enc(wmem_packet_scope(), parameter_tvb, 1, length - 1, ENC_ASCII|ENC_NA); + if (name_len < length-1) { + for (;;) { + if (name_len >= length - 1) + break; + tmp = name_len; + name_len = name_len + apn_str[tmp] + 1; + apn_str[tmp] = '.'; + } + } + proto_item_append_text(actx->created_item, " - %%s", apn_str); + subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_apn_str); + proto_tree_add_string(subtree, hf_gsm_apn_str, parameter_tvb, 0, -1, apn_str); + + +#.FN_BODY LocationNumber VAL_PTR = ¶meter_tvb + tvbuff_t *parameter_tvb; + proto_tree *subtree; + const char *digit_str; + guint8 na; + guint8 np; +%(DEFAULT_BODY)s + if (!parameter_tvb) + return offset; + + subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_LocationNumber); + + proto_tree_add_item(subtree, hf_gsm_map_locationnumber_odd_even, tvb, 0, 1, ENC_BIG_ENDIAN); + na = tvb_get_guint8(tvb,0) & 0x7f; + proto_tree_add_item(subtree, hf_gsm_map_locationnumber_nai, tvb, 0, 1, ENC_BIG_ENDIAN); + + proto_tree_add_item(subtree, hf_gsm_map_locationnumber_inn, tvb, 1, 1, ENC_BIG_ENDIAN); + np = (tvb_get_guint8(tvb,1) & 0x70) >> 4; + proto_tree_add_item(subtree, hf_gsm_map_locationnumber_npi, tvb, 1, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_map_locationnumber_apri, tvb, 1, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_map_locationnumber_screening_ind, tvb, 1, 1, ENC_BIG_ENDIAN); + + digit_str = tvb_bcd_dig_to_wmem_packet_str(tvb, 2, -1, NULL, FALSE); + + proto_tree_add_string(subtree, hf_gsm_map_locationnumber_digits, tvb, 2, -1, digit_str); + + if ((na == 3) && (np==1))/*International Number & E164*/ + dissect_e164_cc(tvb, subtree, 2, E164_ENC_BCD); + +#.FN_BODY EnhancedCheckIMEI-Arg/locationInformation VAL_PTR = ¶meter_tvb + tvbuff_t *parameter_tvb; + proto_tree *subtree; + guint8 rat; +%(DEFAULT_BODY)s + if (parameter_tvb) { + subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_ericsson_locationInformation); + rat = tvb_get_guint8(parameter_tvb, 0); + proto_tree_add_uint(subtree, hf_gsm_map_ericsson_locationInformation_rat, parameter_tvb, 0, 1, rat); + switch (rat) { + case 0: + /* GSM */ + proto_tree_add_item(subtree, hf_gsm_map_ericsson_locationInformation_lac, parameter_tvb, 1, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_map_ericsson_locationInformation_ci, parameter_tvb, 3, 2, ENC_BIG_ENDIAN); + break; + case 1: + /* UMTS */ + proto_tree_add_item(subtree, hf_gsm_map_ericsson_locationInformation_lac, parameter_tvb, 1, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_map_ericsson_locationInformation_sac, parameter_tvb, 3, 2, ENC_BIG_ENDIAN); + break; + default: + break; + } + } + +#---------------------------------------------------------------------------------------- +#.TYPE_ATTR +SS-Code TYPE = FT_UINT8 DISPLAY = BASE_DEC STRINGS = VALS(ssCode_vals) +Teleservice TYPE = FT_UINT8 DISPLAY = BASE_DEC STRINGS = VALS(Teleservice_vals) +Bearerservice TYPE = FT_UINT8 DISPLAY = BASE_DEC STRINGS = VALS(Bearerservice_vals) +TeleserviceCode TYPE = FT_UINT8 DISPLAY = BASE_DEC STRINGS = VALS(Teleservice_vals) +BearerServiceCode TYPE = FT_UINT8 DISPLAY = BASE_DEC STRINGS = VALS(Bearerservice_vals) +Ext-TeleserviceCode TYPE = FT_UINT8 DISPLAY = BASE_DEC STRINGS = VALS(Teleservice_vals) +Ext-BearerServiceCode TYPE = FT_UINT8 DISPLAY = BASE_DEC STRINGS = VALS(Bearerservice_vals) +ChargingCharacteristics TYPE = FT_UINT16 DISPLAY = BASE_DEC BITMASK = 0x0f00 STRINGS = VALS(chargingcharacteristics_values) +RoutingInfo TYPE = FT_UINT32 DISPLAY = BASE_DEC STRINGS = VALS(gsm_map_ch_RoutingInfo_vals) + +#---------------------------------------------------------------------------------------- +#.FIELD_ATTR +RequestedInfo/imei ABBREV = imei_null + +#.END |