Decode the 3GPP MSISDN AVP using the E.164 routines.

Rename dissect_e164_utf8_number() to dissect_e164_msisdn() and give it an
'encoding' argument.

Change-Id: I49cf5d2b24b44a0e69427ceae331f378024391c5
Reviewed-on: https://code.wireshark.org/review/3796
Reviewed-by: Jeff Morriss <jeff.morriss.ws@gmail.com>
This commit is contained in:
Jeff Morriss 2014-08-22 15:14:00 -04:00
parent 923ba9d312
commit 2d74838e47
4 changed files with 20 additions and 33 deletions

View File

@ -517,7 +517,7 @@ dissect_diameter_subscription_id_data(tvbuff_t *tvb, packet_info *pinfo, proto_t
return str_len;
case SUBSCRIPTION_ID_TYPE_E164:
str_len = tvb_reported_length(tvb);
dissect_e164_utf8_number(tvb, tree, 0, str_len);
dissect_e164_msisdn(tvb, tree, 0, str_len, E164_ENC_UTF8);
return str_len;
break;
}

View File

@ -34,7 +34,6 @@
#include <epan/asn1.h>
#include "packet-diameter.h"
#include "packet-gsm_map.h"
#include "packet-gsm_a_common.h"
#include "packet-e164.h"
#include "packet-e212.h"
@ -49,7 +48,6 @@ static int proto_diameter_3gpp = -1;
static int hf_diameter_3gpp_timezone = -1;
static int hf_diameter_3gpp_timezone_adjustment = -1;
static int hf_diameter_3gpp_visited_nw_id = -1;
static int hf_diameter_3gpp_msisdn = -1;
static int hf_diameter_3gpp_path = -1;
static int hf_diameter_3gpp_contact = -1;
/* static int hf_diameter_3gpp_user_data = -1; */
@ -58,7 +56,6 @@ static int hf_diameter_3gpp_mbms_required_qos_prio = -1;
static int hf_diameter_3gpp_tmgi = -1;
static int hf_diameter_3gpp_service_ind = -1;
static int hf_diameter_mbms_service_id = -1;
static int hf_diameter_address_digits = -1;
static int hf_diameter_3gpp_spare_bits = -1;
static int hf_diameter_3gpp_uar_flags_flags = -1;
static int hf_diameter_3gpp_uar_flags_flags_bit0 = -1;
@ -168,8 +165,8 @@ static int hf_diameter_3gpp_idr_flags_bit6 = -1;
static int hf_diameter_3gpp_ipv6addr = -1;
static int hf_diameter_3gpp_mbms_abs_time_ofmbms_data_tfer = -1;
static int hf_diameter_3gpp_udp_port = -1;
static gint diameter_3gpp_path_ett = -1;
static gint diameter_3gpp_msisdn_ett = -1;
static gint diameter_3gpp_feature_list_ett = -1;
static gint diameter_3gpp_uar_flags_ett = -1;
static gint diameter_3gpp_tmgi_ett = -1;
@ -528,22 +525,12 @@ dissect_diameter_3gpp_contact(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree
static int
dissect_diameter_3gpp_msisdn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_)
{
proto_item *item;
proto_tree *sub_tree;
int offset = 0;
const char *digit_str;
int length = tvb_reported_length(tvb);
item = proto_tree_add_item(tree, hf_diameter_3gpp_msisdn, tvb, offset, length, ENC_NA);
sub_tree = proto_item_add_subtree(item,diameter_3gpp_msisdn_ett);
dissect_e164_cc(tvb, sub_tree, offset, E164_ENC_BCD);
digit_str = unpack_digits(tvb, 1);
proto_tree_add_string(sub_tree, hf_diameter_address_digits, tvb, 1, -1, digit_str);
return tvb_reported_length(tvb);
dissect_e164_msisdn(tvb, tree, offset, length, E164_ENC_BCD);
return length;
}
/* AVP Code: 702 User-Data
@ -1125,11 +1112,6 @@ proto_register_diameter_3gpp(void)
FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_diameter_3gpp_msisdn,
{ "MSISDN", "diameter.3gpp.msisdn",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
#if 0
{ &hf_diameter_3gpp_user_data,
{ "User data", "diameter.3gpp.user_data",
@ -1162,11 +1144,6 @@ proto_register_diameter_3gpp(void)
FT_UINT24, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_diameter_address_digits,
{ "Address digits", "diameter.3gpp.address_digits",
FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_diameter_3gpp_spare_bits,
{ "Spare bit(s)", "diameter.3gpp.spare_bits",
FT_UINT32, BASE_HEX, NULL, 0x0,
@ -1721,7 +1698,6 @@ proto_register_diameter_3gpp(void)
/* Setup protocol subtree array */
static gint *ett[] = {
&diameter_3gpp_path_ett,
&diameter_3gpp_msisdn_ett,
&diameter_3gpp_uar_flags_ett,
&diameter_3gpp_feature_list_ett,
&diameter_3gpp_tmgi_ett,

View File

@ -684,18 +684,29 @@ dissect_e164_cc(tvbuff_t *tvb, proto_tree *tree, int offset, e164_encoding_t enc
}
const gchar *
dissect_e164_utf8_number(tvbuff_t *tvb, proto_tree *tree, int offset, int length)
dissect_e164_msisdn(tvbuff_t *tvb, proto_tree *tree, int offset, int length, e164_encoding_t encoding)
{
proto_item *pi;
proto_tree *subtree;
gchar *msisdn_str;
const gchar *msisdn_str;
switch (encoding) {
case E164_ENC_UTF8:
msisdn_str = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length, ENC_UTF_8);
break;
case E164_ENC_BCD:
msisdn_str = tvb_bcd_dig_to_wmem_packet_str(tvb, offset, length, NULL, FALSE);
break;
case E164_ENC_BINARY:
default:
DISSECTOR_ASSERT_NOT_REACHED();
}
msisdn_str = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length, ENC_UTF_8);
pi = proto_tree_add_string(tree, hf_E164_number, tvb, offset, length, msisdn_str);
subtree = proto_item_add_subtree(pi, ett_e164_msisdn);
dissect_e164_cc(tvb, subtree, offset, E164_ENC_UTF8);
dissect_e164_cc(tvb, subtree, offset, encoding);
return msisdn_str;
}

View File

@ -51,5 +51,5 @@ typedef enum {
extern void dissect_e164_number(tvbuff_t *tvb, proto_tree *tree, int offset, int length, e164_info_t e164_info);
WS_DLL_PUBLIC void dissect_e164_cc(tvbuff_t *tvb, proto_tree *tree, int offset, e164_encoding_t encoding);
WS_DLL_PUBLIC const gchar * dissect_e164_utf8_number(tvbuff_t *tvb, proto_tree *tree, int offset, int length);
WS_DLL_PUBLIC const gchar * dissect_e164_msisdn(tvbuff_t *tvb, proto_tree *tree, int offset, int length, e164_encoding_t encoding);
#endif