aboutsummaryrefslogtreecommitdiffstats
path: root/packet-bssgp.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2003-09-09 09:14:55 +0000
committerGuy Harris <guy@alum.mit.edu>2003-09-09 09:14:55 +0000
commit8b5b480bf659ca442801cc8ab44af0ebd69b119c (patch)
treebe456ae6ca86da15ae83aec548c477abea67aa1f /packet-bssgp.c
parent4605a6b5b38117a21f0268a5ed352b2209d1a170 (diff)
Display the odd/even indicator in an IMSI.
Display the identity as a separate item. Clean up white space. svn path=/trunk/; revision=8430
Diffstat (limited to 'packet-bssgp.c')
-rw-r--r--packet-bssgp.c175
1 files changed, 102 insertions, 73 deletions
diff --git a/packet-bssgp.c b/packet-bssgp.c
index 27fe076e77..eb25d59cc0 100644
--- a/packet-bssgp.c
+++ b/packet-bssgp.c
@@ -2,7 +2,7 @@
* Routines for BSSGP (BSS GPRS Protocol ETSI GSM 08.18 version 6.7.1 TS 101 343 ) dissection
* Copyright 2000, Josef Korelus <jkor@quick.cz>
*
- * $Id: packet-bssgp.c,v 1.2 2003/09/06 07:10:56 guy Exp $
+ * $Id: packet-bssgp.c,v 1.3 2003/09/09 09:14:55 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -90,6 +90,7 @@
#define QOSO5T 0x10
#define QOSO5A 0x08
#define LOW3B 0x07
+#define ODD_EVEN_INDIC 0x08
/*GSM 08.18 version 6.7.1 table 11.27*/
static const value_string tab_bssgp_pdu_type[] = {
@@ -188,14 +189,20 @@ static const value_string bssgp_cause[] = {
{ 0x26, "PDU not compatible with protocol state" },
{ 0x27, "Protocol error-unspecified" },
{ 0, NULL },
- };
+};
+
+#define TOI_IMSI 0x01
+#define TOI_IMEI 0x02
+#define TOI_IMEISV 0x03
+#define TOI_TMSI_P_TMSI 0x04
+#define TOI_NO_IDENTITY 0x00
static const value_string type_of_identity[] = {
- { 0x1 , "IMSI" },
- { 0x2 , "IMEI" },
- { 0x3 , "IMEISV" },
- { 0x4 , "TMSI/P-TMSI" },
- { 0x0 , "No identity" },
+ { TOI_IMSI, "IMSI" },
+ { TOI_IMEI, "IMEI" },
+ { TOI_IMEISV, "IMEISV" },
+ { TOI_TMSI_P_TMSI, "TMSI/P-TMSI" },
+ { TOI_NO_IDENTITY, "No identity" },
{ 0, NULL },
};
static const value_string radio_cause[] = {
@@ -252,6 +259,7 @@ static int hf_bssgp_cause = -1;
static int hf_bssgp_cid = -1;
static int hf_bssgp_imsi = -1;
static int hf_bssgp_imsi_toi = -1;
+static int hf_bssgp_imsi_even_odd_indic = -1;
static int hf_bssgp_imsi_lsix = -1;
static int hf_bssgp_tlli = -1;
/*static int hf_bssgp_tag = -1;
@@ -983,7 +991,7 @@ return len+2;
*/
static int dcd_bssgp_imsi(tvbuff_t *tvb, int offset, dec_fu_param_stru_t *dprm_p){
- guint8 hnum=0, nextb=0, first_b=0, toi=0, i, k;
+ guint8 nextb=0, first_b=0, toi=0, i, k;
guint8 num=0,code=0,len=0;
char buf[17],imsi_mccn[6],imsi_val[11], toibuf[9];
proto_item *ti=NULL, *ti2=NULL;
@@ -991,21 +999,40 @@ static int dcd_bssgp_imsi(tvbuff_t *tvb, int offset, dec_fu_param_stru_t *dprm_p
len = tvb_get_guint8(tvb,offset+1) & 0x7f;
first_b = tvb_get_guint8(tvb,offset+2);
- toi = first_b;
- num = first_b >> 4;
- toi = toi & LOW3B;
- if (toi == 1 ){
- buf[0] = num ^ 0x30;
- for (i=1;i<len;i++){
+ if (dprm_p->tree){
+ code = tvb_get_guint8(tvb,offset);
+ decode_bitfield_value(toibuf,toi,LOW3B,8);
+ ti = proto_tree_add_text(dprm_p->tree,tvb,offset,len+2 ,"IMSI");
+ imsi_tree = proto_item_add_subtree(ti, ett_bssgp_imsi);
+ proto_tree_add_uint_format(imsi_tree,hf_bssgp_ietype,tvb,offset,1,code,"IE type: %s %#.2x",match_strval(code,bssgp_iei),code);
+ proto_tree_add_text(imsi_tree,tvb,offset+1,1,"Length:%u",len);
+ }
+ toi = first_b & LOW3B;
+ switch (toi) {
+
+ case TOI_IMSI:
+ case TOI_IMEI:
+ case TOI_IMEISV:
+ num = first_b >> 4;
+ buf[0] = num + '0';
+ for (i=1,k=1;i<len;i++){
nextb = tvb_get_guint8(tvb, offset+2+i);
- hnum = nextb;
- hnum = hnum >> 4;
num = nextb & 0x0f;
- k = 2*i;
- buf[k] = hnum ^ 0x30;
- buf[k-1] = num ^ 0x30;
- buf[k+1] = '\0';
- switch (k){
+ buf[k] = num + '0';
+ k++;
+ if (i < len - 1 || (first_b & ODD_EVEN_INDIC)) {
+ /*
+ * Either this isn't the last octet
+ * of the number, or it is, but there's
+ * an odd number of digits, so the last
+ * nibble is part of the number.
+ */
+ num = nextb >> 4;
+ buf[k] = num + '0';
+ k++;
+ }
+ buf[k] = '\0';
+ switch (i*2){
case 4:
memcpy(&imsi_mccn,&buf,6);
break;
@@ -1016,21 +1043,22 @@ static int dcd_bssgp_imsi(tvbuff_t *tvb, int offset, dec_fu_param_stru_t *dprm_p
}
if (check_col((dprm_p->pinfo)->cinfo, COL_INFO)){
- col_append_fstr( (dprm_p->pinfo)->cinfo, COL_INFO, ", %s: %s %s",match_strval(toi,type_of_identity),imsi_mccn, imsi_val );
- }
+ col_append_fstr( (dprm_p->pinfo)->cinfo, COL_INFO,
+ ", %s: %s %s",
+ val_to_str(toi,type_of_identity,"Unknown TOI (0x%x)"),
+ imsi_mccn, imsi_val );
+ }
if (dprm_p->tree){
- code = tvb_get_guint8(tvb,offset);
- decode_bitfield_value(toibuf,toi,LOW3B,8);
- ti = proto_tree_add_text(dprm_p->tree,tvb,offset,len+2 ,"IMSI: %s", buf);
- imsi_tree = proto_item_add_subtree(ti, ett_bssgp_imsi);
- proto_tree_add_uint_format(imsi_tree,hf_bssgp_ietype,tvb,offset,1,code,"IE type: %s %#.2x",match_strval(code,bssgp_iei),code);
- proto_tree_add_text(imsi_tree,tvb,offset+1,1,"Length:%u",len);
- ti2 = proto_tree_add_string_format(imsi_tree,hf_bssgp_imsi,tvb,offset+2,len,buf,"IMSI: %s",buf);
+ proto_item_append_text(ti, ": %s", buf);
+ ti2 = proto_tree_add_text(imsi_tree,tvb,offset+2,len,"Mobile identity: %s",buf);
imsi_stru_tree = proto_item_add_subtree( ti2, ett_bssgp_imsi_stru_tree);
- proto_tree_add_uint_format(imsi_stru_tree,hf_bssgp_imsi_toi,tvb,offset+2,1,toi,"%s %s", toibuf, match_strval(toi,type_of_identity));
- proto_tree_add_string_hidden(imsi_tree,hf_bssgp_imsi_lsix,tvb,offset+2,len,imsi_val);
+ proto_tree_add_uint(imsi_stru_tree,hf_bssgp_imsi_toi,tvb,offset+2,1,first_b);
+ proto_tree_add_boolean(imsi_stru_tree,hf_bssgp_imsi_even_odd_indic,tvb,offset+2,1,first_b);
+ proto_tree_add_string(imsi_stru_tree,hf_bssgp_imsi,tvb,offset+2,len,buf);
+ proto_tree_add_string_hidden(imsi_stru_tree,hf_bssgp_imsi_lsix,tvb,offset+2,len,imsi_val);
}
+ break;
}
return len+2;
}
@@ -1191,9 +1219,9 @@ static int dcd_bssgp_qos(tvbuff_t *tvb, int offset, dec_fu_param_stru_t *dprm_p)
opet = tvb_get_guint8(tvb,offset+disp);
disp++;
if (dprm_p->tree){
- bps = 100*blr/8;
- decode_bitfield_value(buf,opet,LOW3B,8);
- pre = opet & LOW3B;
+ bps = 100*blr/8;
+ decode_bitfield_value(buf,opet,LOW3B,8);
+ pre = opet & LOW3B;
ti = proto_tree_add_text(dprm_p->tree,tvb,offset,len+disp,"QoS Profile IE");
qos_tree = proto_item_add_subtree(ti,ett_bssgp_qos);
switch (dprm_p->type){
@@ -1538,46 +1566,47 @@ proto_register_bssgp(void)
{"C/R bit","bssgp.qos.cr",FT_BOOLEAN,8, TFS(&cr_string),QOSO5CR,"The SDU contains LLC ACK/SACK command/responce frame type",HFILL }},
{&hf_bssgp_qos_t,
{"T bit", "bssgp.qos.t", FT_BOOLEAN, 8, TFS( &t_string) , QOSO5T, "The SDU contains signaling/data" , HFILL}},
-
{&hf_bssgp_qos_a,
{"A bit" , "bssgp.qos.a" , FT_BOOLEAN,8, TFS( &a_string), QOSO5A, "Radio interface uses ARQ/UNITDATA functionality",HFILL}},
- {&hf_bssgp_qos_prec,
- {"Precedence", "bssgp.qos.prec", FT_UINT8,BASE_HEX ,VALS(prec_both), 0x0,"Precedence coding", HFILL }},
- {&hf_bssgp_pdu_lifetime,
- {"PDU Lifetime","bssgp.lft", FT_UINT16, BASE_HEX, NULL, 0x0, "PDU Lifetime for PDU inside the BSS",HFILL}},
- {&hf_bssgp_imsi,
- {"IMSI","bssgp.imsi", FT_STRING, BASE_DEC, NULL, 0x0, "International Mobile Subscriber Identity",HFILL}},
- {&hf_bssgp_imsi_toi,
- { "Mobile idetity", "bssgp.mobid", FT_UINT8, BASE_HEX, VALS(type_of_identity), 0x0, "Type of mobile identity",HFILL }},
- {&hf_bssgp_imsi_lsix,
- {"IMSI last ten numbers","bssgp.imsi.last10num",FT_STRING, BASE_DEC, NULL, 0x0, "Last ten numbers of IMSI",HFILL}},
- {&hf_bssgp_bvc_buck_size,
- {"Bmax(in 100 oct incr)","bssgp.bmax", FT_UINT16, BASE_HEX, NULL, 0x0, "BVC Bucket Size in 100 octet increments",HFILL}},
- {&hf_bssgp_buck_leak_rate,
- {"Bucket Leak Rate","bssgp.R", FT_UINT16, BASE_HEX, NULL, 0x0, "Bucket Leak Rate in 100 bits/sec increments",HFILL}},
- {&hf_bssgp_bmax_def_ms,
- {"Bmax default MS","bssgp.bmaxms", FT_UINT16, BASE_HEX, NULL, 0x0, "Default bucket size in 100 octetsincrement for an MS",HFILL}},
- {&hf_bssgp_r_defau_ms,
- {"R default MS","bssgp.Rms", FT_UINT16, BASE_HEX,NULL, 0x0, "Dfeault bucket leak rate to be applied to a flow control bucket for an MS", HFILL}},
- {&hf_bssgp_bvci,
- {"BVCI","bssgp.bvci",FT_UINT16, BASE_HEX, NULL, 0x0, "BSSGP Virtual Connection Identifier", HFILL}},
- {&hf_bssgp_cause,
- {"Cause","bssgp.cause", FT_UINT8, BASE_HEX, NULL,0x0, " Cause information element indicates the reason for an exception condition",HFILL }},
- {&hf_bssgp_bvci_new,{"BVCI(New)","bssgp.bvci.new",FT_UINT16, BASE_HEX, NULL, 0x0, "BSSGP Virtual Connection Identifier", HFILL}},
- {&hf_bssgp_frdsc,
- {"LLC frames discarded","bssgp.llcdisc.frames", FT_UINT8, BASE_HEX, NULL, 0x0,"LLC frames that have been discarded inside BSS", HFILL}},
- {&hf_bssgp_noaff,
- {"Number of octets affected","bssgp.noaff", FT_UINT24, BASE_HEX,NULL,0x0,"It indicates,for MS,the number of octets transferred or deleted by BSS",HFILL}},
- {&hf_bssgp_radio_cause,
- {"Radio Cause","bssgp.racase", FT_UINT8, BASE_HEX, NULL, 0x0, "Reason for an exception condition on the radio interface",HFILL}},
- {&hf_bssgp_ra_mccmnc,
- {"MCC and MNC","bssgp.ra.mccmnc", FT_STRING, BASE_DEC, NULL, 0x0, "Mobile country code and Mobile network code", HFILL}},
- {&hf_bssgp_ra_lac,
- {"LAC","bssgp.ra.lac",FT_UINT16, BASE_HEX, NULL, 0x0, "Location area code",HFILL }},
- {&hf_bssgp_ra_rac,
- {"RAC","bssgp.ra.rac",FT_UINT8, BASE_HEX, NULL, 0x0, "Routing area code", HFILL }},
- {&hf_bssgp_cid,
- {"Cell id","bssgp.cid",FT_UINT16, BASE_HEX, NULL, 0x0, "Cell identity", HFILL }},
+ {&hf_bssgp_qos_prec,
+ {"Precedence", "bssgp.qos.prec", FT_UINT8,BASE_HEX ,VALS(prec_both), 0x0,"Precedence coding", HFILL }},
+ {&hf_bssgp_pdu_lifetime,
+ {"PDU Lifetime","bssgp.lft", FT_UINT16, BASE_HEX, NULL, 0x0, "PDU Lifetime for PDU inside the BSS",HFILL}},
+ {&hf_bssgp_imsi,
+ {"IMSI","bssgp.imsi", FT_STRING, BASE_DEC, NULL, 0x0, "International Mobile Subscriber Identity",HFILL}},
+ {&hf_bssgp_imsi_toi,
+ { "Type of Mobile identity", "bssgp.mobid", FT_UINT8, BASE_HEX, VALS(type_of_identity), LOW3B, "Type of mobile identity",HFILL }},
+ {&hf_bssgp_imsi_even_odd_indic,
+ { "Odd/even indication", "bssgp.oei", FT_BOOLEAN, 8, TFS(&imsi_odd_even), ODD_EVEN_INDIC, "Odd/even indication",HFILL }},
+ {&hf_bssgp_imsi_lsix,
+ {"IMSI last ten numbers","bssgp.imsi.last10num",FT_STRING, BASE_NONE, NULL, 0x0, "Last ten numbers of IMSI",HFILL}},
+ {&hf_bssgp_bvc_buck_size,
+ {"Bmax(in 100 oct incr)","bssgp.bmax", FT_UINT16, BASE_HEX, NULL, 0x0, "BVC Bucket Size in 100 octet increments",HFILL}},
+ {&hf_bssgp_buck_leak_rate,
+ {"Bucket Leak Rate","bssgp.R", FT_UINT16, BASE_HEX, NULL, 0x0, "Bucket Leak Rate in 100 bits/sec increments",HFILL}},
+ {&hf_bssgp_bmax_def_ms,
+ {"Bmax default MS","bssgp.bmaxms", FT_UINT16, BASE_HEX, NULL, 0x0, "Default bucket size in 100 octetsincrement for an MS",HFILL}},
+ {&hf_bssgp_r_defau_ms,
+ {"R default MS","bssgp.Rms", FT_UINT16, BASE_HEX,NULL, 0x0, "Dfeault bucket leak rate to be applied to a flow control bucket for an MS", HFILL}},
+ {&hf_bssgp_bvci,
+ {"BVCI","bssgp.bvci",FT_UINT16, BASE_HEX, NULL, 0x0, "BSSGP Virtual Connection Identifier", HFILL}},
+ {&hf_bssgp_cause,
+ {"Cause","bssgp.cause", FT_UINT8, BASE_HEX, NULL,0x0, " Cause information element indicates the reason for an exception condition",HFILL }},
+ {&hf_bssgp_bvci_new,{"BVCI(New)","bssgp.bvci.new",FT_UINT16, BASE_HEX, NULL, 0x0, "BSSGP Virtual Connection Identifier", HFILL}},
+ {&hf_bssgp_frdsc,
+ {"LLC frames discarded","bssgp.llcdisc.frames", FT_UINT8, BASE_HEX, NULL, 0x0,"LLC frames that have been discarded inside BSS", HFILL}},
+ {&hf_bssgp_noaff,
+ {"Number of octets affected","bssgp.noaff", FT_UINT24, BASE_HEX,NULL,0x0,"It indicates,for MS,the number of octets transferred or deleted by BSS",HFILL}},
+ {&hf_bssgp_radio_cause,
+ {"Radio Cause","bssgp.racase", FT_UINT8, BASE_HEX, NULL, 0x0, "Reason for an exception condition on the radio interface",HFILL}},
+ {&hf_bssgp_ra_mccmnc,
+ {"MCC and MNC","bssgp.ra.mccmnc", FT_STRING, BASE_DEC, NULL, 0x0, "Mobile country code and Mobile network code", HFILL}},
+ {&hf_bssgp_ra_lac,
+ {"LAC","bssgp.ra.lac",FT_UINT16, BASE_HEX, NULL, 0x0, "Location area code",HFILL }},
+ {&hf_bssgp_ra_rac,
+ {"RAC","bssgp.ra.rac",FT_UINT8, BASE_HEX, NULL, 0x0, "Routing area code", HFILL }},
+ {&hf_bssgp_cid,
+ {"Cell id","bssgp.cid",FT_UINT16, BASE_HEX, NULL, 0x0, "Cell identity", HFILL }},
};
/* Setup protocol subtree array */