aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--asn1/gsmmap/gsmmap.cnf36
-rw-r--r--asn1/gsmmap/packet-gsm_map-template.c3
-rw-r--r--epan/dissectors/packet-e164.c174
-rw-r--r--epan/dissectors/packet-e164.h1
4 files changed, 210 insertions, 4 deletions
diff --git a/asn1/gsmmap/gsmmap.cnf b/asn1/gsmmap/gsmmap.cnf
index f2128a7f8a..4e5b9b7443 100644
--- a/asn1/gsmmap/gsmmap.cnf
+++ b/asn1/gsmmap/gsmmap.cnf
@@ -223,19 +223,33 @@ Component
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;
- 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);
+ 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(tree, hf_gsm_map_isdn_address_digits, parameter_tvb, 1, -1, digit_str);
+ 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;
@@ -250,12 +264,20 @@ Component
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);
@@ -264,6 +286,12 @@ Component
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
diff --git a/asn1/gsmmap/packet-gsm_map-template.c b/asn1/gsmmap/packet-gsm_map-template.c
index e45643ec20..a6c259e18c 100644
--- a/asn1/gsmmap/packet-gsm_map-template.c
+++ b/asn1/gsmmap/packet-gsm_map-template.c
@@ -47,6 +47,7 @@
#include "packet-gsm_map.h"
#include "packet-gsm_a.h"
#include "packet-tcap.h"
+#include "packet-e164.h"
#include "packet-e212.h"
#include "packet-smpp.h"
#include "packet-gsm_sms.h"
@@ -127,6 +128,7 @@ static gint ett_gsm_map_ext_qos_subscribed = -1;
static gint ett_gsm_map_pdptypenumber = -1;
static gint ett_gsm_map_RAIdentity = -1;
static gint ett_gsm_map_LAIFixedLength = -1;
+static gint ett_gsm_map_isdn_address_string = -1;
#include "packet-gsm_map-ett.c"
@@ -1922,6 +1924,7 @@ void proto_register_gsm_map(void) {
&ett_gsm_map_pdptypenumber,
&ett_gsm_map_RAIdentity,
&ett_gsm_map_LAIFixedLength,
+ &ett_gsm_map_isdn_address_string,
#include "packet-gsm_map-ettarr.c"
};
diff --git a/epan/dissectors/packet-e164.c b/epan/dissectors/packet-e164.c
index 6e449c6be0..2eb56cc38d 100644
--- a/epan/dissectors/packet-e164.c
+++ b/epan/dissectors/packet-e164.c
@@ -392,6 +392,180 @@ dissect_e164_number(tvbuff_t *tvb, proto_tree *tree, int offset,
}
}
+void
+dissect_e164_cc(tvbuff_t *tvb, proto_tree *tree, int offset, gboolean bcd_coded){
+
+ int cc_offset;
+ guint8 address_digit_pair;
+ guint16 id_code;
+ guint8 cc_length;
+ guint8 length;
+ guint16 cc;
+
+ cc_offset = offset;
+ address_digit_pair = tvb_get_guint8(tvb, cc_offset);
+
+ if(!bcd_coded){
+ /* Dissect country code after removing non significant zeros */
+ while ( address_digit_pair == 0 ) {
+ cc_offset = cc_offset + 1;
+ address_digit_pair = tvb_get_guint8(tvb, cc_offset);
+ }
+ cc = tvb_get_ntohs(tvb, cc_offset);
+ if (( address_digit_pair & 0xf0 ) != 0 ){
+ cc = cc >> 4;
+ }
+ }else{
+ cc = address_digit_pair &0x0f;
+ cc = cc << 4;
+ cc = cc | (address_digit_pair &0xf0)>>4;
+ cc = cc << 4;
+ cc_offset = cc_offset + 1;
+ address_digit_pair = tvb_get_guint8(tvb, cc_offset);
+ cc = cc | address_digit_pair &0x0f;
+
+ }
+
+ switch ( cc & 0x0f00 ) {
+
+ case 0x0:
+ cc_length = 1;
+ break;
+
+ case 0x0100:
+ cc_length = 1;
+ break;
+
+ case 0x0200:
+ switch ( cc & 0x00f0 ) {
+ case 0:
+ case 7 :
+ cc_length = 2;
+ break;
+ default :
+ cc_length = 3;
+ break;
+ }
+ break;
+
+ case 0x0300 :
+ switch ( cc & 0x00f0 ) {
+ case 0 :
+ case 0x10 :
+ case 0x20 :
+ case 0x30 :
+ case 0x40 :
+ case 0x60 :
+ case 0x90 :
+ cc_length = 2;
+ break;
+ default :
+ cc_length = 3;
+ break;
+ }
+ break;
+ case 0x0400 :
+ switch ( cc & 0x00f0 ) {
+ case 0x20 :
+ cc_length = 3;
+ break;
+ default :
+ cc_length = 2;
+ break;
+ }
+ break;
+
+ case 0x0500 :
+ switch ( cc & 0x00f0 ) {
+ case 0 :
+ case 0x90 :
+ cc_length = 3;
+ break;
+ default :
+ cc_length = 2;
+ break;
+ }
+ break;
+
+ case 0x0600 :
+ switch ( cc & 0x00f0 ) {
+ case 0x70 :
+ case 0x80 :
+ case 0x90 :
+ cc_length = 3;
+ break;
+ default :
+ cc_length = 2;
+ break;
+ }
+ break;
+
+ case 0x0700 : cc_length = 1;
+ break;
+
+ case 0x0800 :
+ switch ( cc & 0x00f0 ) {
+ case 0x10:
+ case 0x20:
+ case 0x40:
+ case 0x60:
+ cc_length = 2;
+ break;
+ default :
+ cc_length = 3;
+ break;
+ }
+ break;
+
+ case 0x0900 :
+ switch ( cc & 0x00f0 ) {
+ case 0 :
+ case 0x10 :
+ case 0x20 :
+ case 0x30 :
+ case 0x40 :
+ case 0x50 :
+ case 0x80 :
+ cc_length = 2;
+ break;
+ default :
+ cc_length = 3;
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }/* End switch cc */
+
+ switch ( cc_length ) {
+ case 0x1 :
+ cc = cc >> 8;
+ length = 1;
+ break;
+ case 0x2 :
+ cc = cc >> 4;
+ length = 1;
+ break;
+ default:
+ length = 2;
+ break;
+ }/* end switch cc_length */
+
+ proto_tree_add_text(tree,tvb, cc_offset, length,"Country Code: %x %s length %u",cc,
+ val_to_str(cc,E164_country_code_value,"unknown (%x)"),cc_length);
+ switch ( cc ) {
+ case 0x882 :
+ id_code = tvb_get_ntohs(tvb, cc_offset + 1);
+ id_code = (id_code & 0x0fff) >> 4;
+ proto_tree_add_text(tree,tvb, (cc_offset + 1), 2,"Identification Code: %x %s ",id_code,
+ val_to_str(id_code,E164_International_Networks_vals,"unknown (%x)"));
+ break;
+ default:;
+ }
+
+}
+
/*
* Register the protocol with Ethereal.
*
diff --git a/epan/dissectors/packet-e164.h b/epan/dissectors/packet-e164.h
index a9d2ced989..b2d18997fa 100644
--- a/epan/dissectors/packet-e164.h
+++ b/epan/dissectors/packet-e164.h
@@ -47,4 +47,5 @@ typedef struct {
extern void dissect_e164_number(tvbuff_t *tvb, proto_tree *tree, int offset, int length,
e164_info_t e164_info);
+extern void dissect_e164_cc(tvbuff_t *tvb, proto_tree *tree, int offset, gboolean bcd_coded);
#endif