# gsm_map.cnf # gsm_map conformation file # $Id$ #.MODULE_IMPORT #.EXPORTS AddressString Add-GeographicalInformation AgeOfLocationInformation AlertingPattern AreaEventInfo CCBS-Feature CellGlobalIdOrServiceAreaIdFixedLength CUG-Index CUG-Interlock CUG-Info CurrentPassword DeferredLocationEventType EraseCC-EntryArg EraseCC-EntryRes Ext-BasicServiceCode Ext-GeographicalInformation Ext-QoS-Subscribed Ext2-QoS-Subscribed ExtensionContainer GeographicalInformation GetPasswordArg GPRSChargingID GSN-Address IMEI IMSI InterrogateSS-Res ISDN-AddressString ISDN-SubaddressString LAIFixedLength LCSClientExternalID LCSClientName LCSRequestorID LCSCodeword LCSServiceTypeID LCS-ReferenceNumber LCS-QoS LocationInformation LocationType LSAIdentity MS-Classmark2 NewPassword NotificationToMSUser OfferedCamel4Functionalities ProtectedPayload QoS-Subscribed RAIdentity RegisterCC-EntryRes RegisterSS-Arg SubscriberState SecurityHeader SupportedCamelPhases SupportedGADShapes SS-Code SS-Status SS-Info SS-ForBS-Code USSD-DataCodingScheme USSD-String Ussd-Arg Ussd-Res UU-Data LocalErrorcode #.PDU #.NO_EMIT #.TYPE_RENAME #.FIELD_RENAME Ext-SS-Info/ss-Data ext-ss-Data RequestedInfo/subscriberState subscriberState-flg RequestedSubscriptionInfo/supportedVLR-CAMEL-Phases supportedVLR-CAMEL-Phases_flg RequestedSubscriptionInfo/supportedSGSN-CAMEL-Phases supportedSGSN-CAMEL-Phases_flg PrepareGroupCallArg/teleservice ext-teleservice BasicServiceCode/teleservice teleservice-code PDP-ContextInfo/qos-Subscribed ext-qos-Subscribed AccessNetworkSignalInfo/signalInfo longsignalInfo Ext-SS-Info/callBarringInfo ext-callBarringInfo RequestedInfo/locationInformation locationInformation_flg RequestedInfo/imei imei_flg Ext-ForwFeature/forwardingOptions ext-forwardingOptions Ext-SS-Info/forwardingInfo ext-forwardingInfo RegisterSS-Arg/forwardedToNumber forwardedToNumber_addr ModificationRequestFor-CF-Info/forwardedToNumber forwardedToNumber_addr Ext-ForwFeature/basicService ext-basicService Ext-CallBarringFeature/basicService ext-basicService CUG-Feature/basicService ext-basicService SendRoutingInfoRes/basicService ext-basicService ModificationRequestFor-CF-Info/basicService ext-basicService ModificationRequestFor-CB-Info/basicService ext-basicService SendRoutingInfoArg/basicServiceGroup ext-basicServiceGroup ResumeCallHandlingArg/basicServiceGroup ext-basicServiceGroup Ext-ForwFeature/ss-Status ext-ss-Status Ext-CallBarringFeature/ss-Status ext-ss-Status Ext-SS-Data/ss-Status ext-ss-Status LCS-PrivacyClass/ss-Status ext-ss-Status MOLR-Class/ss-Status ext-ss-Status MC-SS-Info/ss-Status ext-ss-Status ModificationRequestFor-CF-Info/ss-Status ext-ss-Status ModificationRequestFor-CB-Info/ss-Status ext-ss-Status SS-Data/basicServiceGroupList ext-basicServiceGroupList InterrogateSS-Res/basicServiceGroupList ext-basicServiceGroupList Ext-CallBarInfo/callBarringFeatureList ext-callBarringFeatureList CallBarringData/callBarringFeatureList ext-callBarringFeatureList Ext-CallBarringInfoFor-CSE/callBarringFeatureList ext-callBarringFeatureList Ext-ForwInfo/forwardingFeatureList ext-forwardingFeatureList CallForwardingData/forwardingFeatureList ext-forwardingFeatureList Ext-ForwardingInfoFor-CSE/forwardingFeatureList ext-forwardingFeatureList Ext-ForwFeature/noReplyConditionTime ext-noReplyConditionTime ModificationRequestFor-CF-Info/noReplyConditionTime ext-noReplyConditionTime ReturnError/errorCode returnErrorCode ERROR/localValue localErrorcode OPERATION/localValue operationLocalvalue #---------------------------------------------------------------------------------------- #.PDU Component #.FN_BODY InvokeParameter offset = dissect_invokeData(pinfo, tree, tvb, offset); #.FN_BODY ReturnResultParameter offset = dissect_returnResultData(pinfo, tree, tvb, offset); #.FN_BODY ReturnErrorParameter offset = dissect_returnErrorData(pinfo, tree, tvb, offset); #.FN_PARS OperationLocalvalue VAL_PTR = &opcode #.FN_BODY OperationLocalvalue %(DEFAULT_BODY)s if (check_col(pinfo->cinfo, COL_INFO)){ col_append_fstr(pinfo->cinfo, COL_INFO, val_to_str(opcode, gsm_map_opr_code_strings, "Unknown GSM-MAP (%%u)")); } #.FN_PARS LocalErrorcode VAL_PTR = &errorCode #.FN_PARS Sm-RP-UI VAL_PTR = &tpdu_tvb #.FN_BODY Sm-RP-UI tvbuff_t *tpdu_tvb; %(DEFAULT_BODY)s /* * dissect the embedded TPDU message */ if (!tpdu_tvb) return offset; dissector_try_port(sms_dissector_table, 0, tpdu_tvb, pinfo, top_tree); #.END #---------------------------------------------------------------------------------------- #.FN_PARS IMSI VAL_PTR = ¶meter_tvb #.FN_BODY IMSI tvbuff_t *parameter_tvb; char *digit_str; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; digit_str = unpack_digits(parameter_tvb, 0); proto_tree_add_string(tree, hf_gsm_map_imsi_digits, parameter_tvb, 0, -1, digit_str); #.END #---------------------------------------------------------------------------------------- #.FN_PARS ServiceCentreAddress VAL_PTR = ¶meter_tvb #.FN_BODY ServiceCentreAddress tvbuff_t *parameter_tvb; char *digit_str; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; proto_tree_add_item(tree, hf_gsm_map_extension, parameter_tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_nature_of_number, parameter_tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_number_plan, parameter_tvb, 0,1,FALSE); digit_str = unpack_digits(parameter_tvb, 1); proto_tree_add_string(tree, hf_gsm_map_servicecentreaddress_digits, parameter_tvb, 1, -1, digit_str); pinfo->p2p_dir = P2P_DIR_SENT; #.END #---------------------------------------------------------------------------------------- #.FN_PARS ISDN-AddressString VAL_PTR = ¶meter_tvb #.FN_BODY ISDN-AddressString tvbuff_t *parameter_tvb; char *digit_str; guint8 octet; guint8 na; guint8 np; proto_item *item; proto_tree *subtree; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; item = get_ber_last_created_item(); subtree = proto_item_add_subtree(item, ett_gsm_map_isdn_address_string); proto_tree_add_item(subtree, hf_gsm_map_extension, parameter_tvb, 0,1,FALSE); proto_tree_add_item(subtree, hf_gsm_map_nature_of_number, parameter_tvb, 0,1,FALSE); proto_tree_add_item(subtree, hf_gsm_map_number_plan, parameter_tvb, 0,1,FALSE); digit_str = unpack_digits(parameter_tvb, 1); proto_tree_add_string(subtree, hf_gsm_map_isdn_address_digits, parameter_tvb, 1, -1, digit_str); octet = tvb_get_guint8(parameter_tvb,0); na = (octet & 0x70)>>4; np = octet & 0x0f; if ((na == 1) && (np==1))/*International Number & E164*/ dissect_e164_cc(parameter_tvb, subtree, 1, TRUE); pinfo->p2p_dir = P2P_DIR_RECV; #.END #---------------------------------------------------------------------------------------- #.FN_PARS AddressString VAL_PTR = ¶meter_tvb #.FN_BODY AddressString tvbuff_t *parameter_tvb; char *digit_str; guint8 octet; guint8 na; guint8 np; proto_item *item; proto_tree *subtree; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; item = get_ber_last_created_item(); subtree = proto_item_add_subtree(item, ett_gsm_map_isdn_address_string); proto_tree_add_item(tree, hf_gsm_map_extension, parameter_tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_nature_of_number, parameter_tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_number_plan, parameter_tvb, 0,1,FALSE); digit_str = unpack_digits(parameter_tvb, 1); proto_tree_add_string(tree, hf_gsm_map_address_digits, parameter_tvb, 1, -1, digit_str); octet = tvb_get_guint8(parameter_tvb,0); na = (octet & 0x70)>>4; np = octet & 0x0f; if ((na == 1) && (np==1))/*International Number & E164*/ dissect_e164_cc(parameter_tvb, subtree, 1, TRUE); #---------------------------------------------------------------------------------------- #.FN_PARS SS-Status VAL_PTR = ¶meter_tvb #.FN_BODY SS-Status 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_PARS Ext-SS-Status VAL_PTR = ¶meter_tvb #.FN_BODY Ext-SS-Status /* 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_PARS ProtocolId VAL_PTR = &protocolId #---------------------------------------------------------------------------------------- #.FN_PARS AccessNetworkProtocolId VAL_PTR = &AccessNetworkProtocolId #---------------------------------------------------------------------------------------- #.FN_PARS SignalInfo VAL_PTR = ¶meter_tvb #.FN_BODY SignalInfo tvbuff_t *parameter_tvb; guint8 octet; guint8 length; tvbuff_t *next_tvb; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; switch (protocolId){ /* gsm-0408 */ case 1: break; /* gsm-0806 */ case 2: break; /* gsm-BSSMAP TODO Is it correct to stripp off two first octets here?*/ case 3: octet = tvb_get_guint8(parameter_tvb,0); length = tvb_get_guint8(parameter_tvb,1); if ( octet == 0) {/* DISCRIMINATION TS 48 006 */ next_tvb = tvb_new_subset(parameter_tvb, 2, -1, -1); dissect_bssmap(next_tvb, pinfo, tree); } break; /* ets-300102-1 (~Q.931 ) */ case 4: octet = tvb_get_guint8(parameter_tvb,0); length = tvb_get_guint8(parameter_tvb,1); if ( octet == 4 ) dissect_q931_bearer_capability_ie(parameter_tvb, 2, length, tree); break; default: break; } #---------------------------------------------------------------------------------------- #.FN_PARS LongSignalInfo VAL_PTR = ¶meter_tvb #.FN_BODY LongSignalInfo tvbuff_t *parameter_tvb; guint8 octet; guint8 length; tvbuff_t *next_tvb; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; switch (AccessNetworkProtocolId){ /* ts3G-48006 */ case 1: octet = tvb_get_guint8(parameter_tvb,0); length = tvb_get_guint8(parameter_tvb,1); if ( octet == 0) {/* DISCRIMINATION TS 48 006 */ /* gsm-BSSMAP? */ next_tvb = tvb_new_subset(parameter_tvb, 2, -1, -1); dissect_bssmap(next_tvb, pinfo, tree); } break; /* ts3G-25413 */ case 2: break; default: break; } #---------------------------------------------------------------------------------------- #.FN_BODY USSD-DataCodingScheme guint8 octet; guint8 length; tvbuff_t *next_tvb; octet = tvb_get_guint8(tvb,0); length = tvb_get_guint8(tvb,1); if ( octet == 4) { next_tvb = tvb_new_subset(tvb, 2, -1, -1); smpp_handle_dcs(tree, next_tvb, &offset); } #.END #---------------------------------------------------------------------------------------- #.FN_BODY USSD-String guint8 octet; guint8 length; guint8 out_len; /* XXX - The maximum item label length is 240. Does this really need to be 1024? */ static char bigbuf[1024]; octet = tvb_get_guint8(tvb,0); length = tvb_get_guint8(tvb,1); out_len = gsm_sms_char_7bit_unpack(0, length, sizeof(bigbuf), tvb_get_ptr(tvb, offset+2, length), bigbuf); bigbuf[out_len] = '\0'; gsm_sms_char_ascii_decode(bigbuf, bigbuf, out_len); bigbuf[1023] = '\0'; proto_tree_add_text(tree, tvb, offset+2, length, "USSD String: %%s", bigbuf); #.END #---------------------------------------------------------------------------------------- #.FN_BODY PrivateExtension/extType proto_tree_add_text(tree, tvb, offset, -1, "Extension Data"); if (obj_id){ offset=call_ber_oid_callback(obj_id, tvb, offset, pinfo, tree); }else{ call_dissector(data_handle, tvb, pinfo, tree); offset = tvb_length_remaining(tvb,offset); } #.END #.FN_FTR ForwardingOptions proto_tree_add_item(tree, hf_gsm_map_notification_to_forwarding_party, tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_redirecting_presentation, tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_notification_to_calling_party, tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_forwarding_reason, tvb, 0,1,FALSE); #.FN_FTR Ext-ForwFeature/forwardingOptions proto_tree_add_item(tree, hf_gsm_map_notification_to_forwarding_party, tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_redirecting_presentation, tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_notification_to_calling_party, tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_forwarding_reason, tvb, 0,1,FALSE); #.FN_PARS PDP-Type VAL_PTR = ¶meter_tvb #.FN_BODY PDP-Type 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,FALSE); 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,FALSE); break; case 1: /* IETF */ proto_tree_add_item(tree, hf_gsm_map_ietf_pdp_type_number, parameter_tvb, 0,1,FALSE); break; default: break; } #.FN_PARS QoS-Subscribed VAL_PTR = ¶meter_tvb #.FN_BODY QoS-Subscribed tvbuff_t *parameter_tvb; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; de_sm_qos(parameter_tvb, tree, 0, 3, NULL,0); #.FN_PARS Ext-QoS-Subscribed VAL_PTR = ¶meter_tvb #.FN_BODY Ext-QoS-Subscribed tvbuff_t *parameter_tvb; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; dissect_gsm_map_ext_qos_subscribed(tvb, pinfo, tree); #.FN_PARS GSN-Address VAL_PTR = ¶meter_tvb #.FN_BODY GSN-Address tvbuff_t *parameter_tvb; guint8 octet; proto_item *item; proto_tree *subtree; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; item = get_ber_last_created_item(); subtree = proto_item_add_subtree(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, tvb_length_remaining(parameter_tvb, 1), FALSE); break; case 0x50: /* IPv4 */ proto_tree_add_item(subtree, hf_gsm_map_GSNAddress_IPv4, parameter_tvb, 1, tvb_length_remaining(parameter_tvb, 1), FALSE); break; default: break; } #.FN_PARS RAIdentity VAL_PTR = ¶meter_tvb #.FN_BODY RAIdentity tvbuff_t *parameter_tvb; proto_item *item; proto_tree *subtree; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; item = get_ber_last_created_item(); subtree = proto_item_add_subtree(item, ett_gsm_map_RAIdentity); de_gmm_rai(parameter_tvb, subtree, 0, 3, NULL,0); #.FN_PARS LAIFixedLength VAL_PTR = ¶meter_tvb #.FN_BODY LAIFixedLength tvbuff_t *parameter_tvb; proto_item *item; proto_tree *subtree; %(DEFAULT_BODY)s if (!parameter_tvb) return offset; item = get_ber_last_created_item(); subtree = proto_item_add_subtree(item, ett_gsm_map_LAIFixedLength); dissect_e212_mcc_mnc(parameter_tvb, subtree, 0); #.FN_PARS OBJECT_IDENTIFIER FN_VARIANT = _str VAL_PTR = &obj_id #---------------------------------------------------------------------------------------- #.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) #.END