forked from osmocom/wireshark
Unpack and display digits, Decode SS-status.
svn path=/trunk/; revision=13175
This commit is contained in:
parent
a4a33b58e7
commit
84a6808dca
|
@ -1323,7 +1323,7 @@ EraseCC-EntryRes ::= SEQUENCE {
|
|||
RoutingInfoForSMArg ::= SEQUENCE {
|
||||
msisdn [0] IMPLICIT Msisdn,
|
||||
sm-RP-PRI [1] IMPLICIT BOOLEAN,
|
||||
serviceCentreAddress [2] IMPLICIT OCTET STRING ( SIZE( 1 .. 20 ) ),
|
||||
serviceCentreAddress [2] IMPLICIT ServiceCentreAddress,
|
||||
extensionContainer [6] IMPLICIT ExtensionContainer OPTIONAL,
|
||||
... ,
|
||||
gprsSupportIndicator [7] IMPLICIT NULL OPTIONAL,
|
||||
|
@ -1377,17 +1377,18 @@ Mo-forwardSM-Res ::= SEQUENCE {
|
|||
|
||||
Sm-RP-OA ::= CHOICE {
|
||||
msisdn [2] IMPLICIT Msisdn,
|
||||
serviceCentreAddressOA [4] IMPLICIT OCTET STRING ( SIZE( 1 .. 20 ) ),
|
||||
serviceCentreAddressOA [4] IMPLICIT ServiceCentreAddress,
|
||||
noSM-RP-OA [5] IMPLICIT NULL}
|
||||
|
||||
Sm-RP-DA ::= CHOICE {
|
||||
imsi [0] IMPLICIT Imsi,
|
||||
lmsi [1] IMPLICIT Lmsi,
|
||||
serviceCentreAddressDA [4] IMPLICIT OCTET STRING ( SIZE( 1 .. 20 ) ),
|
||||
serviceCentreAddressDA [4] IMPLICIT ServiceCentreAddress,
|
||||
noSM-RP-DA [5] IMPLICIT NULL
|
||||
}
|
||||
|
||||
Sm-RP-UI ::= OCTET STRING ( SIZE( 1 .. 200 ) )
|
||||
ServiceCentreAddress ::= OCTET STRING ( SIZE( 1 .. 20 ) )
|
||||
|
||||
--mt-forwardSM OPERATION
|
||||
-- ARGUMENT
|
||||
|
@ -1429,7 +1430,7 @@ Sm-DeliveryOutcome ::= ENUMERATED {
|
|||
-- ARGUMENT
|
||||
ReportSM-DeliveryStatusArg ::= SEQUENCE {
|
||||
msisdn Msisdn,
|
||||
serviceCentreAddress OCTET STRING ( SIZE( 1 .. 20 ) ),
|
||||
serviceCentreAddress ServiceCentreAddress,
|
||||
sm-DeliveryOutcome Sm-DeliveryOutcome,
|
||||
absentSubscriberDiagnosticSM [0] IMPLICIT INTEGER ( 0 .. 255 ) OPTIONAL,
|
||||
extensionContainer [1] IMPLICIT ExtensionContainer OPTIONAL,
|
||||
|
@ -1467,7 +1468,7 @@ InformServiceCentreArg ::= SEQUENCE {
|
|||
-- ARGUMENT
|
||||
AlertServiceCentreArg ::= SEQUENCE {
|
||||
msisdn Msisdn,
|
||||
serviceCentreAddress OCTET STRING ( SIZE( 1 .. 20 ) ),
|
||||
serviceCentreAddress ServiceCentreAddress,
|
||||
... }
|
||||
-- ERRORS {
|
||||
-- systemFailure localValue : 34,
|
||||
|
|
|
@ -29,6 +29,83 @@ RequestedInfo/subscriberState subscriberStateFlag
|
|||
*/
|
||||
|
||||
dissector_try_port(sms_dissector_table, 0, tpdu_tvb, pinfo, top_tree);
|
||||
#.END
|
||||
#----------------------------------------------------------------------------------------
|
||||
#.FN_BODY Imsi
|
||||
|
||||
tvbuff_t *parameter_tvb;
|
||||
char *digit_str;
|
||||
|
||||
offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
||||
¶meter_tvb);
|
||||
|
||||
digit_str = unpack_digits(parameter_tvb, 0);
|
||||
|
||||
proto_tree_add_string(tree, hf_gsm_map_imsi_digits, parameter_tvb, 1, -1, digit_str);
|
||||
g_free(digit_str);
|
||||
|
||||
|
||||
#.END
|
||||
#----------------------------------------------------------------------------------------
|
||||
#.FN_BODY ServiceCentreAddress
|
||||
|
||||
tvbuff_t *parameter_tvb;
|
||||
char *digit_str;
|
||||
|
||||
offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
||||
¶meter_tvb);
|
||||
|
||||
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);
|
||||
g_free(digit_str);
|
||||
|
||||
|
||||
#.END
|
||||
#----------------------------------------------------------------------------------------
|
||||
#.FN_BODY Msisdn
|
||||
|
||||
tvbuff_t *parameter_tvb;
|
||||
char *digit_str;
|
||||
|
||||
offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
||||
¶meter_tvb);
|
||||
|
||||
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_misdn_digits, parameter_tvb, 1, -1, digit_str);
|
||||
g_free(digit_str);
|
||||
|
||||
|
||||
#.END
|
||||
#----------------------------------------------------------------------------------------
|
||||
#.FN_BODY Ss-Status
|
||||
|
||||
tvbuff_t *parameter_tvb;
|
||||
guint8 octet;
|
||||
|
||||
offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
||||
¶meter_tvb);
|
||||
|
||||
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
|
||||
#----------------------------------------------------------------------------------------
|
||||
#.TYPE_ATTR
|
||||
|
|
|
@ -57,7 +57,18 @@ static int hf_gsm_map_invoke = -1; /* InvokePDU */
|
|||
static int hf_gsm_map_returnResult = -1; /* InvokePDU */
|
||||
static int hf_gsm_map_returnResult_result = -1;
|
||||
static int hf_gsm_map_getPassword = -1;
|
||||
static int hf_gsm_map_currentPassword = -1;
|
||||
static int hf_gsm_map_currentPassword = -1;
|
||||
static int hf_gsm_map_extension = -1;
|
||||
static int hf_gsm_map_nature_of_number = -1;
|
||||
static int hf_gsm_map_number_plan = -1;
|
||||
static int hf_gsm_map_misdn_digits = -1;
|
||||
static int hf_gsm_map_servicecentreaddress_digits = -1;
|
||||
static int hf_gsm_map_imsi_digits = -1;
|
||||
static int hf_gsm_map_Ss_Status_unused = -1;
|
||||
static int hf_gsm_map_Ss_Status_q_bit = -1;
|
||||
static int hf_gsm_map_Ss_Status_p_bit = -1;
|
||||
static int hf_gsm_map_Ss_Status_r_bit = -1;
|
||||
static int hf_gsm_map_Ss_Status_a_bit = -1;
|
||||
#include "packet-gsm_map-hf.c"
|
||||
|
||||
/* Initialize the subtree pointers */
|
||||
|
@ -85,64 +96,38 @@ static guint global_tcap_itu_ssn4 = 9;
|
|||
/* Global variables */
|
||||
static proto_tree *top_tree;
|
||||
|
||||
static int dissect_invokeCmd(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset);
|
||||
static char*
|
||||
unpack_digits(tvbuff_t *tvb, int offset){
|
||||
|
||||
typedef struct dgt_set_t
|
||||
{
|
||||
unsigned char out[15];
|
||||
}
|
||||
dgt_set_t;
|
||||
int length;
|
||||
guint8 octet;
|
||||
int i=0;
|
||||
char *digit_str;
|
||||
|
||||
static dgt_set_t Dgt_msid = {
|
||||
{
|
||||
/* 0 1 2 3 4 5 6 7 8 9 a b c d e */
|
||||
'0','1','2','3','4','5','6','7','8','9','?','?','?','?','?'
|
||||
}
|
||||
};
|
||||
length = tvb_length(tvb);
|
||||
digit_str = g_malloc(length-offset+1);
|
||||
|
||||
/*
|
||||
* Unpack BCD input pattern into output ASCII pattern
|
||||
*
|
||||
* Input Pattern is supplied using the same format as the digits
|
||||
*
|
||||
* Returns: length of unpacked pattern
|
||||
*/
|
||||
static int
|
||||
my_dgt_tbcd_unpack(
|
||||
char *out, /* ASCII pattern out */
|
||||
guchar *in, /* packed pattern in */
|
||||
int num_octs, /* Number of octets to unpack */
|
||||
dgt_set_t *dgt /* Digit definitions */
|
||||
)
|
||||
{
|
||||
int cnt = 0;
|
||||
unsigned char i;
|
||||
while ( offset < length ){
|
||||
|
||||
while (num_octs)
|
||||
{
|
||||
/*
|
||||
* unpack first value in byte
|
||||
*/
|
||||
i = *in++;
|
||||
*out++ = dgt->out[i & 0x0f];
|
||||
cnt++;
|
||||
octet = tvb_get_guint8(tvb,offset);
|
||||
digit_str[i] = ((octet & 0x0f) + 0x30);
|
||||
i++;
|
||||
|
||||
/*
|
||||
* unpack second value in byte
|
||||
*/
|
||||
i >>= 4;
|
||||
/*
|
||||
* unpack second value in byte
|
||||
*/
|
||||
octet = octet >> 4;
|
||||
|
||||
if (i == 0x0f) /* odd number bytes - hit filler */
|
||||
break;
|
||||
if (octet == 0x0f) /* odd number bytes - hit filler */
|
||||
break;
|
||||
|
||||
*out++ = dgt->out[i];
|
||||
cnt++;
|
||||
num_octs--;
|
||||
}
|
||||
digit_str[i] = ((octet & 0x0f) + 0x30);
|
||||
i++;
|
||||
offset++;
|
||||
|
||||
*out = '\0';
|
||||
|
||||
return(cnt);
|
||||
}
|
||||
digit_str[i]= '\0';
|
||||
return digit_str;
|
||||
}
|
||||
|
||||
|
||||
|
@ -242,6 +227,53 @@ const value_string gsm_map_opr_code_strings[] = {
|
|||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const true_false_string gsm_map_extension_value = {
|
||||
"No Extension",
|
||||
"Extension"
|
||||
};
|
||||
static const value_string gsm_map_nature_of_number_values[] = {
|
||||
{ 0x00, "unknown" },
|
||||
{ 0x01, "International Number" },
|
||||
{ 0x02, "National Significant Number" },
|
||||
{ 0x03, "Network Specific Number" },
|
||||
{ 0x04, "Subscriber Number" },
|
||||
{ 0x05, "Reserved" },
|
||||
{ 0x06, "Abbreviated Number" },
|
||||
{ 0x07, "Reserved for extension" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
static const value_string gsm_map_number_plan_values[] = {
|
||||
{ 0x00, "unknown" },
|
||||
{ 0x01, "ISDN/Telephony Numbering (Rec ITU-T E.164)" },
|
||||
{ 0x02, "spare" },
|
||||
{ 0x03, "Data Numbering (ITU-T Rec. X.121)" },
|
||||
{ 0x04, "Telex Numbering (ITU-T Rec. F.69)" },
|
||||
{ 0x05, "spare" },
|
||||
{ 0x06, "Land Mobile Numbering (ITU-T Rec. E.212)" },
|
||||
{ 0x07, "spare" },
|
||||
{ 0x08, "National Numbering" },
|
||||
{ 0x09, "Private Numbering" },
|
||||
{ 0x0f, "Reserved for extension" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const true_false_string gsm_map_Ss_Status_q_bit_values = {
|
||||
"Quiescent",
|
||||
"Operative"
|
||||
};
|
||||
static const true_false_string gsm_map_Ss_Status_p_values = {
|
||||
"Provisioned",
|
||||
"Not Provisioned"
|
||||
};
|
||||
static const true_false_string gsm_map_Ss_Status_r_values = {
|
||||
"Registered",
|
||||
"Not Registered"
|
||||
};
|
||||
static const true_false_string gsm_map_Ss_Status_a_values = {
|
||||
"Active",
|
||||
"not Active"
|
||||
};
|
||||
|
||||
static guint32 opcode=0;
|
||||
|
||||
static int
|
||||
|
@ -958,7 +990,50 @@ void proto_register_gsm_map(void) {
|
|||
{ "Password", "gsm_map.password",
|
||||
FT_UINT8, BASE_DEC, VALS(gsm_map_GetPasswordArg_vals), 0,
|
||||
"Password", HFILL }},
|
||||
|
||||
{ &hf_gsm_map_extension,
|
||||
{ "Extension", "gsm_map.extension",
|
||||
FT_BOOLEAN, 8, TFS(&gsm_map_extension_value), 0x80,
|
||||
"Extension", HFILL }},
|
||||
{ &hf_gsm_map_nature_of_number,
|
||||
{ "Nature of number", "gsm_map.nature_of_number",
|
||||
FT_UINT8, BASE_HEX, VALS(gsm_map_nature_of_number_values), 0x70,
|
||||
"ature of number", HFILL }},
|
||||
{ &hf_gsm_map_number_plan,
|
||||
{ "Number plan", "gsm_map.number_plan",
|
||||
FT_UINT8, BASE_HEX, VALS(gsm_map_number_plan_values), 0x0f,
|
||||
"Number plan", HFILL }},
|
||||
{ &hf_gsm_map_misdn_digits,
|
||||
{ "Misdn digits", "gsm_map.misdn_digits",
|
||||
FT_STRING, BASE_NONE, NULL, 0,
|
||||
"Misdn digits", HFILL }},
|
||||
{ &hf_gsm_map_servicecentreaddress_digits,
|
||||
{ "ServiceCentreAddress digits", "gsm_map.servicecentreaddress_digits",
|
||||
FT_STRING, BASE_NONE, NULL, 0,
|
||||
"ServiceCentreAddress digits", HFILL }},
|
||||
{ &hf_gsm_map_imsi_digits,
|
||||
{ "Imsi digits", "gsm_map.imsi_digits",
|
||||
FT_STRING, BASE_NONE, NULL, 0,
|
||||
"Imsi digits", HFILL }},
|
||||
{ &hf_gsm_map_Ss_Status_unused,
|
||||
{ "Unused", "gsm_map.unused",
|
||||
FT_UINT8, BASE_HEX, NULL, 0xf0,
|
||||
"Unused", HFILL }},
|
||||
{ &hf_gsm_map_Ss_Status_q_bit,
|
||||
{ "Q bit", "gsm_map.ss_status_q_bit",
|
||||
FT_BOOLEAN, 8, TFS(&gsm_map_Ss_Status_q_bit_values), 0x08,
|
||||
"Q bit", HFILL }},
|
||||
{ &hf_gsm_map_Ss_Status_p_bit,
|
||||
{ "P bit", "gsm_map.ss_status_p_bit",
|
||||
FT_BOOLEAN, 8, TFS(&gsm_map_Ss_Status_p_values), 0x04,
|
||||
"P bit", HFILL }},
|
||||
{ &hf_gsm_map_Ss_Status_r_bit,
|
||||
{ "R bit", "ss_status_r_bit",
|
||||
FT_BOOLEAN, 8, TFS(&gsm_map_Ss_Status_r_values), 0x02,
|
||||
"R bit", HFILL }},
|
||||
{ &hf_gsm_map_Ss_Status_a_bit,
|
||||
{ "A bit", "ss_status_a_bit",
|
||||
FT_BOOLEAN, 8, TFS(&gsm_map_Ss_Status_a_values), 0x01,
|
||||
"A bit", HFILL }},
|
||||
|
||||
#include "packet-gsm_map-hfarr.c"
|
||||
};
|
||||
|
@ -1002,6 +1077,7 @@ void proto_register_gsm_map(void) {
|
|||
register_ber_oid_name("0.4.0.0.1.0.14.2","itu-t(0) identified-organization(4) etsi(0) mobileDomain(0) gsm-Network(1) map-ac(0) infoRetrieval(14) version2(2)" );
|
||||
register_ber_oid_name("0.4.0.0.1.0.14.1","itu-t(0) identified-organization(4) etsi(0) mobileDomain(0) gsm-Network(1) map-ac(0) infoRetrieval(14) version1(1)" );
|
||||
register_ber_oid_name("0.4.0.0.1.0.15.1","itu-t(0) identified-organization(4) etsi(0) mobileDomain(0) gsm-Network(1) map-ac(0) interVlrInfoRetrieval(15) version2(2)" );
|
||||
register_ber_oid_name("0.4.0.0.1.0.16.3","itu-t(0) identified-organization(4) etsi(0) mobileDomain(0) gsm-Network(1) map-ac(0) subscriberDataMngt(16) version3(3)" );
|
||||
register_ber_oid_name("0.4.0.0.1.0.16.2","itu-t(0) identified-organization(4) etsi(0) mobileDomain(0) gsm-Network(1) map-ac(0) subscriberDataMngt(16) version2(2)" );
|
||||
register_ber_oid_name("0.4.0.0.1.0.16.1","itu-t(0) identified-organization(4) etsi(0) mobileDomain(0) gsm-Network(1) map-ac(0) subscriberDataMngt(16) version1(1)" );
|
||||
register_ber_oid_name("0.4.0.0.1.0.17.2","itu-t(0) identified-organization(4) etsi(0) mobileDomain(0) gsm-Network(1) map-ac(0) tracing(17) version2(2)" );
|
||||
|
|
Loading…
Reference in New Issue