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>
1012 lines
31 KiB
INI
1012 lines
31 KiB
INI
#.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
|
|
SubscriberData
|
|
|
|
#.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_NEW
|
|
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_NEW
|
|
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_PARS PrivateExtension/extId FN_VARIANT = _str VAL_PTR = &obj_id
|
|
|
|
#.FN_BODY PrivateExtension/extType
|
|
proto_tree *ext_tree;
|
|
ext_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_gsm_map_extention_data, NULL, "Extension Data");
|
|
if (obj_id){
|
|
offset=call_ber_oid_callback(obj_id, 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;
|
|
|
|
%(DEFAULT_BODY)s
|
|
|
|
if (!parameter_tvb)
|
|
return offset;
|
|
if(tvb_reported_length(parameter_tvb)==0)
|
|
return offset;
|
|
|
|
digit_str = tvb_bcd_dig_to_wmem_packet_str(parameter_tvb, 0, -1, NULL, FALSE);
|
|
proto_tree_add_string(tree, 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);
|
|
dissect_bssmap(next_tvb, actx->pinfo, subtree);
|
|
}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;
|
|
|
|
%(DEFAULT_BODY)s
|
|
if (!parameter_tvb)
|
|
return offset;
|
|
|
|
length = tvb_ensure_captured_length_remaining(parameter_tvb,0);
|
|
switch(sms_encoding){
|
|
case SMS_ENCODING_7BIT:
|
|
case SMS_ENCODING_7BIT_LANG:
|
|
proto_tree_add_string(tree, 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(tree, 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(tree, 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, tvb_reported_length_remaining(parameter_tvb, 1), ENC_BIG_ENDIAN);
|
|
break;
|
|
case 0x50: /* IPv4 */
|
|
proto_tree_add_item(subtree, hf_gsm_map_GSNAddress_IPv4, parameter_tvb, 1, tvb_reported_length_remaining(parameter_tvb, 1), ENC_BIG_ENDIAN);
|
|
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, 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);
|
|
dissect_bssmap(next_tvb, actx->pinfo, subtree);
|
|
}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);
|
|
dissect_bssmap(next_tvb, actx->pinfo, subtree);
|
|
}
|
|
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);
|
|
dissect_bssmap(next_tvb, actx->pinfo, subtree);
|
|
}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);
|
|
dissect_bssmap(next_tvb, actx->pinfo, subtree);
|
|
}
|
|
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(tree, hf_gsm_map_locationnumber_digits, tvb, 2, -1, digit_str);
|
|
|
|
if ((na == 3) && (np==1))/*International Number & E164*/
|
|
dissect_e164_cc(tvb, tree, 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
|