aboutsummaryrefslogtreecommitdiffstats
path: root/asn1/gsmmap
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2005-01-26 20:07:35 +0000
committerAnders Broman <anders.broman@ericsson.com>2005-01-26 20:07:35 +0000
commit84a6808dca6f1ad3083f680854d98607e866e1a4 (patch)
treef4c7cbe28b1c0819dea145518a39367c26138682 /asn1/gsmmap
parenta4a33b58e781ee40638050d08d419b28e74fa0ef (diff)
Unpack and display digits, Decode SS-status.
svn path=/trunk/; revision=13175
Diffstat (limited to 'asn1/gsmmap')
-rw-r--r--asn1/gsmmap/GSMMAP.asn11
-rw-r--r--asn1/gsmmap/gsmmap.cnf77
-rw-r--r--asn1/gsmmap/packet-gsm_map-template.c184
3 files changed, 213 insertions, 59 deletions
diff --git a/asn1/gsmmap/GSMMAP.asn b/asn1/gsmmap/GSMMAP.asn
index 517c64f612..995b774c15 100644
--- a/asn1/gsmmap/GSMMAP.asn
+++ b/asn1/gsmmap/GSMMAP.asn
@@ -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,
diff --git a/asn1/gsmmap/gsmmap.cnf b/asn1/gsmmap/gsmmap.cnf
index aae5f4c875..15d41e83c0 100644
--- a/asn1/gsmmap/gsmmap.cnf
+++ b/asn1/gsmmap/gsmmap.cnf
@@ -31,6 +31,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,
+ &parameter_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,
+ &parameter_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,
+ &parameter_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,
+ &parameter_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
Ss-Code TYPE = FT_UINT8 DISPLAY = BASE_DEC STRINGS = VALS(ssCode_vals)
Teleservice TYPE = FT_UINT8 DISPLAY = BASE_DEC STRINGS = VALS(Teleservice_vals)
diff --git a/asn1/gsmmap/packet-gsm_map-template.c b/asn1/gsmmap/packet-gsm_map-template.c
index 574ede1ab7..405ade3c72 100644
--- a/asn1/gsmmap/packet-gsm_map-template.c
+++ b/asn1/gsmmap/packet-gsm_map-template.c
@@ -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++;
-
- /*
- * unpack second value in byte
- */
- i >>= 4;
-
- if (i == 0x0f) /* odd number bytes - hit filler */
- break;
-
- *out++ = dgt->out[i];
- cnt++;
- num_octs--;
- }
+ octet = tvb_get_guint8(tvb,offset);
+ digit_str[i] = ((octet & 0x0f) + 0x30);
+ i++;
+
+ /*
+ * unpack second value in byte
+ */
+ octet = octet >> 4;
+
+ if (octet == 0x0f) /* odd number bytes - hit filler */
+ break;
- *out = '\0';
+ digit_str[i] = ((octet & 0x0f) + 0x30);
+ i++;
+ offset++;
- 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)" );