diff options
author | Guy Harris <guy@alum.mit.edu> | 2003-09-09 09:14:55 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2003-09-09 09:14:55 +0000 |
commit | 8b5b480bf659ca442801cc8ab44af0ebd69b119c (patch) | |
tree | be456ae6ca86da15ae83aec548c477abea67aa1f /packet-bssgp.c | |
parent | 4605a6b5b38117a21f0268a5ed352b2209d1a170 (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.c | 175 |
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 */ |