diff options
-rw-r--r-- | asn1/gsmmap/gsmmap.cnf | 36 | ||||
-rw-r--r-- | asn1/gsmmap/packet-gsm_map-template.c | 3 | ||||
-rw-r--r-- | epan/dissectors/packet-e164.c | 174 | ||||
-rw-r--r-- | epan/dissectors/packet-e164.h | 1 |
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 |