Update towards 48.008 8.4.0

svn path=/trunk/; revision=26689
This commit is contained in:
Anders Broman 2008-11-04 20:11:06 +00:00
parent 07dadee5dd
commit 2888252e85
1 changed files with 518 additions and 110 deletions

View File

@ -287,8 +287,8 @@ static const value_string gsm_a_be_cell_id_disc_vals[] = {
{ 8, "Intersystem Handover to UTRAN or cdma2000. PLMN-ID, LAC, and RNC-ID, are encoded to identify the target RNC."},
{ 9, "Intersystem Handover to UTRAN or cdma2000. The RNC-ID is coded to identify the target RNC."},
{ 10, "Intersystem Handover to UTRAN or cdma2000. LAC and RNC-ID are encoded to identify the target RNC."},
{ 11, "Reserved"},
{ 12, "Reserved"},
{ 11, "Serving Area Identity, SAI, is used to identify the Serving Area of UE within UTRAN or cdma2000"},
{ 12, "LAC, RNC-ID (or Extended RNC-ID) and Cell Identity, CI, is used to identify a UTRAN cell for cell load information"},
{ 13, "Reserved"},
{ 14, "Reserved"},
{ 15, "Reserved"},
@ -316,15 +316,32 @@ static int hf_gsm_a_bssmap_dlci_spare = -1;
static int hf_gsm_a_bssmap_dlci_sapi = -1;
static int hf_gsm_a_bssmap_cause = -1;
static int hf_gsm_a_bssmap_be_cell_id_disc = -1;
static int hf_gsm_a_bssmap_lsa_only = -1;
static int hf_gsm_a_bssmap_act = -1;
static int hf_gsm_a_bssmap_pref = -1;
static int hf_gsm_a_bssmap_lsa_inf_prio = -1;
static int hf_gsm_a_bssmap_seq_len = -1;
static int hf_gsm_a_bssmap_seq_no = -1;
static int hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc = -1;
static int hf_gsm_a_bssap_res_ind_method = -1;
static int hf_gsm_a_bssmap_ch_mode = -1;
static int hf_gsm_a_bssmap_channel = -1;
static int hf_gsm_a_bssmap_be_rnc_id = -1;
static int hf_gsm_a_bssmap_apdu_protocol_id = -1;
static int hf_gsm_a_bssmap_periodicity = -1;
static int hf_gsm_a_bssmap_sm = -1;
static int hf_gsm_a_bssmap_tarr = -1;
static int hf_gsm_a_bssmap_tot_no_of_fullr_ch = -1;
static int hf_gsm_a_bssmap_tot_no_of_hr_ch = -1;
static int hf_gsm_a_bssmap_smi = -1;
static int hf_gsm_a_bssmap_lsa_id = -1;
static int hf_gsm_a_bssmap_ep = -1;
static int hf_gsm_a_bssmap_lcs_pri = -1;
static int hf_gsm_a_bssmap_num_ms = -1;
static int hf_gsm_a_bssmap_talker_pri = -1;
static int hf_gsm_a_bssmap_paging_cause = -1;
static int hf_gsm_a_bssmap_paging_inf_flg = -1;
static int hf_gsm_a_bssmap_serv_ho_inf = -1;
static int hf_gsm_a_bssmap_spare_bits = -1;
static int hf_gsm_a_bssmap_tpind = -1;
static int hf_gsm_a_bssmap_asind_b2 = -1;
@ -332,11 +349,21 @@ static int hf_gsm_a_bssmap_asind_b3 = -1;
static int hf_gsm_a_bssmap_bss_res = -1;
static int hf_gsm_a_bssmap_tcp = -1;
static int hf_gsm_a_bssmap_filler_bits = -1;
static int hf_gsm_a_bssmap_aoip_trans_ipv4 = -1;
static int hf_gsm_a_bssmap_aoip_trans_ipv6 = -1;
static int hf_gsm_a_bssmap_aoip_trans_port = -1;
static int hf_gsm_a_bssmap_fi = -1;
static int hf_gsm_a_bssmap_tf = -1;
static int hf_gsm_a_bssmap_pi = -1;
static int hf_gsm_a_bssmap_pt = -1;
static int hf_gsm_a_bssap_speech_codec = -1;
static int hf_gsm_a_bssmap_call_id = -1;
/* Initialize the subtree pointers */
static gint ett_bssmap_msg = -1;
static gint ett_cell_list = -1;
static gint ett_dlci = -1;
static gint ett_codec_lst = -1;
static char a_bigbuf[1024];
@ -513,6 +540,10 @@ be_cic(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *ad
return(curr_offset - offset);
}
/*
* 3.2.2.3 Connection Release Requested
* No Data
*/
/*
* 3.2.2.4 Resource Available
@ -521,10 +552,18 @@ static guint8
be_res_avail(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
guint16 value;
int i;
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
for (i=0; i < 5; i++){
value = tvb_get_ntohl(tvb, curr_offset);
proto_tree_add_text(tree, tvb, curr_offset, len, "Number of full rate channels available in band %u %u",i+1,value);
curr_offset+=2;
proto_tree_add_text(tree, tvb, curr_offset, len, "Number of half rate channels available in band %u %u",i+1, value);
curr_offset+=2;
}
return(len);
@ -1299,6 +1338,10 @@ be_periodicity(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, g
/*
* 3.2.2.13 Extended Resource Indicator
*/
static const true_false_string bssmap_tarr_vals = {
"The total number of accessible channels is requested",
"No extra Resource Information is requested"
};
static guint8
be_ext_res_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
@ -1306,10 +1349,15 @@ be_ext_res_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, g
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 6, FALSE);
/* the Subsequent Mode field */
proto_tree_add_item(tree, hf_gsm_a_bssmap_sm, tvb, curr_offset, 1, FALSE);
/* Total Accessible Resource Requested field */
proto_tree_add_item(tree, hf_gsm_a_bssmap_tarr, tvb, curr_offset, 1, FALSE);
curr_offset++;
return(len);
return(curr_offset - offset);
}
/*
* 3.2.2.14 Total Resource Accessible
@ -1321,7 +1369,12 @@ be_tot_res_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, g
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
/* Total number of accessible full rate channels */
proto_tree_add_item(tree, hf_gsm_a_bssmap_tot_no_of_fullr_ch, tvb, curr_offset, 2, FALSE);
curr_offset+=2;
/* Total number of accessible half rate channels */
proto_tree_add_item(tree, hf_gsm_a_bssmap_tot_no_of_hr_ch, tvb, curr_offset, 2, FALSE);
curr_offset+=2;
return(len);
@ -1337,11 +1390,14 @@ be_lsa_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar
curr_offset = offset;
/* The LSA ID consists of 24 bits, numbered from 0 to 23, with bit 0 being the LSB. Bit 0 indicates whether the LSA is a
* PLMN significant number or a universal LSA. If the bit is set to 0 the LSA is a PLMN significant number; if it is set to
/* TS 23.003:
* The LSA ID consists of 24 bits, numbered from 0 to 23, with bit 0 being the LSB.
* Bit 0 indicates whether the LSA is a PLMN significant number or a universal LSA.
* If the bit is set to 0 the LSA is a PLMN significant number; if it is set to
* 1 it is a universal LSA.
*/
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
proto_tree_add_item(tree, hf_gsm_a_bssmap_lsa_id, tvb, curr_offset, 3, FALSE);
curr_offset+=3;
return(len);
@ -1358,7 +1414,16 @@ be_lsa_id_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, g
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 7, FALSE);
proto_tree_add_item(tree, hf_gsm_a_bssmap_ep, tvb, curr_offset, 1, FALSE);
curr_offset++;
/* LSA identification 1 - n */
while (curr_offset-offset < len){
proto_tree_add_item(tree, hf_gsm_a_bssmap_lsa_id, tvb, curr_offset, 3, FALSE);
curr_offset+=3;
}
return(len);
}
@ -1385,6 +1450,7 @@ be_cell_id_aux(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
/* FALLTHRU */
case 0x08: /* For intersystem handover from GSM to UMTS or cdma2000: */
case 0x0c: /* For identification of a UTRAN cell for cell load information: */
curr_offset = dissect_e212_mcc_mnc(tvb, tree, curr_offset);
/* FALLTHRU */
@ -1402,8 +1468,12 @@ be_cell_id_aux(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
case 0x09: /* For intersystem handover from GSM to UMTS or cdma2000: */
if ((disc == 0x08) ||(disc == 0x09) || (disc == 0x0a)){
/* RNC-ID */
if ((disc == 0x08) ||(disc == 0x09) || (disc == 0x0a)|| (disc == 0x0c)){
/* RNC-ID
* The octets 9-10 are coded as the RNC-ID (0..4095) or the
* Extended RNC-ID (4096..65535) specified in 3GPP TS 25.413 [31]:
* XXX is this a PER encoded number?
*/
value = tvb_get_ntohs(tvb, curr_offset);
proto_tree_add_item(tree, hf_gsm_a_bssmap_be_rnc_id, tvb, curr_offset, 2, FALSE);
@ -1446,7 +1516,12 @@ be_cell_id_aux(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
}
}
break;
case 0xb:
/* Serving Area Identity, SAI, is used to identify the Serving Area of UE
* within UTRAN or cdma2000.
*/
proto_tree_add_text(tree, tvb, curr_offset, len,"SAI");
break;
default:
proto_tree_add_text(tree, tvb, curr_offset, len,
"Cell ID - Unknown format");
@ -1589,6 +1664,12 @@ be_int_band(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gcha
/*
* 3.2.2.23 LSA Information
*/
static const true_false_string bssmap_lsa_only_value = {
"Access to the LSAs that are defined ",
"Allowing emergency call"
};
static guint8
be_lsa_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
@ -1596,8 +1677,23 @@ be_lsa_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gcha
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 7, FALSE);
proto_tree_add_item(tree, hf_gsm_a_bssmap_lsa_only, tvb, curr_offset, 1, FALSE);
curr_offset++;
while (curr_offset-offset < len){
/* LSA identification and attributes */
/* 8 7 6 5 4 3 2 1
* spare act pref priority
*/
proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 2, FALSE);
proto_tree_add_item(tree, hf_gsm_a_bssmap_act, tvb, curr_offset, 1, FALSE);
proto_tree_add_item(tree, hf_gsm_a_bssmap_pref, tvb, curr_offset, 1, FALSE);
proto_tree_add_item(tree, hf_gsm_a_bssmap_lsa_inf_prio, tvb, curr_offset, 1, FALSE);
curr_offset++;
proto_tree_add_item(tree, hf_gsm_a_bssmap_lsa_id, tvb, curr_offset, 3, FALSE);
curr_offset+=3;
}
return(len);
}
@ -1766,6 +1862,19 @@ be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
/*
* 3.2.2.27a Cell Identifier List Segment
*/
static const value_string gsm_a_bssap_cell_id_list_seg_cell_id_disc_vals[] = {
{ 0x0, "The whole Cell Global Identification, CGI, is used to identify the cells"},
{ 0x1, "Location Area Code, LAC, and Cell Identify, CI, is used to identify the cells within a given MCC and MNC"},
{ 0x2, "Cell Identity, CI, is used to identify the cells within a given MCC and MNC and LAC"},
{ 0x3, "No cell is associated with the transaction"},
{ 0x4, "Location Area Identification, LAI, is used to identify all cells within a Location Area"},
{ 0x5, "Location Area Code, LAC, is used to identify all cells within a location area"},
{ 0x6, "All cells on the BSS are identified"},
{ 0x7, "MCC and MNC, is used to identify all cells within the given MCC and MNC"},
{ 0, NULL }
};
static guint8
be_cell_id_list_seg(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
@ -1773,7 +1882,17 @@ be_cell_id_list_seg(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
/* Sequence Length */
proto_tree_add_item(tree, hf_gsm_a_bssmap_seq_len, tvb, curr_offset, 1, FALSE);
/* Sequence Number */
proto_tree_add_item(tree, hf_gsm_a_bssmap_seq_no, tvb, curr_offset, 1, FALSE);
curr_offset++;
proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE);
/* Cell identification discriminator */
proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, FALSE);
curr_offset++;
proto_tree_add_text(tree, tvb, curr_offset, len-2, "Not decoded yet");
return(len);
@ -1789,7 +1908,12 @@ be_cell_id_lst_seg_f_est_cells(tvbuff_t *tvb, proto_tree *tree, guint32 offset,
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE);
/* Cell identification discriminator */
proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, FALSE);
curr_offset++;
proto_tree_add_text(tree, tvb, curr_offset, len-1, "Not decoded yet");
return(len);
@ -1804,7 +1928,12 @@ be_cell_id_lst_seg_f_cell_tb_est(tvbuff_t *tvb, proto_tree *tree, guint32 offset
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE);
/* Cell identification discriminator */
proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, FALSE);
curr_offset++;
proto_tree_add_text(tree, tvb, curr_offset, len-1, "Not decoded yet");
return(len);
@ -1822,7 +1951,12 @@ be_cell_id_lst_seg_f_rel_cell(tvbuff_t *tvb, proto_tree *tree, guint32 offset, g
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE);
/* Cell identification discriminator */
proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, FALSE);
curr_offset++;
proto_tree_add_text(tree, tvb, curr_offset, len-1, "Not decoded yet");
return(len);
@ -1837,7 +1971,12 @@ be_cell_id_lst_seg_f_not_est_cell(tvbuff_t *tvb, proto_tree *tree, guint32 offse
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE);
/* Cell identification discriminator */
proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, FALSE);
curr_offset++;
proto_tree_add_text(tree, tvb, curr_offset, len-1, "Not decoded yet");
return(len);
@ -1849,32 +1988,24 @@ be_cell_id_lst_seg_f_not_est_cell(tvbuff_t *tvb, proto_tree *tree, guint32 offse
/*
* 3.2.2.29 Resource Indication Method
*/
static const value_string gsm_a_bssap_resource_indication_vals[] = {
{ 0x0, "Spontaneous resource information expected"},
{ 0x1, "One single resource information expected"},
{ 0x2, "Periodic resource information expected"},
{ 0x3, "No cell is associated with the transaction"},
{ 0x4, "No resource information expected"},
{ 0, NULL }
};
static guint8
be_res_ind_method(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
curr_offset = offset;
/*
The coding of the Resource Indication parameter is:
0000 the method i) of sub-clause 3.1.3.1 is selected;
0001 the method ii) of sub-clause 3.1.3.1 is selected;
0010 the method iii) of sub-clause 3.1.3.1 is selected;
0011 the method iv) of sub-clause 3.1.3.1 is selected.
All other values are reserved.
3.1.3.1
:
i) (Spontaneous resource information expected)...
:
ii) (One single resource information expected)...
:
iii) (Periodic resource information expected)...
:
iv) (No resource information expected)..
:
*/
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE);
proto_tree_add_item(tree, hf_gsm_a_bssap_res_ind_method, tvb, curr_offset, 1, FALSE);
curr_offset++;
return(len);
}
@ -1918,7 +2049,6 @@ be_diag(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *a
* [2] 3.2.2.33 Chosen Channel
*/
static const value_string gsm_a_bssmap_ch_mode_vals[] = {
{ 0, "reserved" },
{ 0, "no channel mode indication" },
{ 9, "speech (full rate or half rate)" },
{ 14, "data, 14.5 kbit/s radio interface rate" },
@ -1937,7 +2067,25 @@ static const value_string gsm_a_bssmap_ch_mode_vals[] = {
{ 15, "data, 29.0 kbit/s downlink and 43.5 kbit/s uplink" },
{ 0, NULL },
};
static const value_string gsm_a_bssmap_channel_vals[] = {
{ 0, "None(Current Channel Type 1 - Reserved)" },
{ 1, "SDCCH" },
{ 2, "Reserved" },
{ 3, "Reserved" },
{ 5, "Reserved" },
{ 6, "Reserved" },
{ 7, "Reserved" },
{ 8, "1 Full rate TCH" },
{ 9, "1 Half rate TCH" },
{ 10, "2 Full Rate TCHs" },
{ 11, "3 Full Rate TCHs" },
{ 12, "4 Full Rate TCHs" },
{ 13, "5 Full Rate TCHs" },
{ 14, "6 Full Rate TCHs" },
{ 15, "7 Full Rate TCHs" },
{ 4, "8 Full Rate TCHs" },
{ 0, NULL },
};
static guint8
be_chosen_chan(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
@ -1952,30 +2100,7 @@ be_chosen_chan(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, g
/* Channel mode */
proto_tree_add_item(tree, hf_gsm_a_bssmap_ch_mode, tvb, curr_offset, 1, FALSE);
switch (oct & 0x0f)
{
case 0: str = "None"; break;
case 1: str = "SDCCH"; break;
case 8: str = "1 Full rate TCH"; break;
case 9: str = "1 Half rate TCH"; break;
case 10: str = "2 Full Rate TCHs"; break;
case 11: str = "3 Full Rate TCHs"; break;
case 12: str = "4 Full Rate TCHs"; break;
case 13: str = "5 Full Rate TCHs"; break;
case 14: str = "6 Full Rate TCHs"; break;
case 15: str = "7 Full Rate TCHs"; break;
case 4: str = "8 Full Rate TCHs"; break;
default:
str = "Reserved";
break;
}
other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Channel: %s",
a_bigbuf,
str);
proto_tree_add_item(tree, hf_gsm_a_bssmap_channel, tvb, curr_offset, 1, FALSE);
curr_offset++;
@ -2220,39 +2345,15 @@ be_curr_chan_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, g
{
guint8 oct;
guint32 curr_offset;
const gchar *str;
curr_offset = offset;
oct = tvb_get_guint8(tvb, curr_offset);
/* Channel mode */
proto_tree_add_item(tree, hf_gsm_a_bssmap_ch_mode, tvb, curr_offset, 1, FALSE);
switch (oct & 0x0f)
{
case 0x01: str = "SDCCH"; break;
case 0x08: str = "1 Full rate TCH"; break;
case 0x09: str = "1 Half rate TCH"; break;
case 0x0a: str = "2 Full Rate TCHs"; break;
case 0x0b: str = "3 Full Rate TCHs"; break;
case 0x0c: str = "4 Full Rate TCHs"; break;
case 0x0d: str = "5 Full Rate TCHs"; break;
case 0x0e: str = "6 Full Rate TCHs"; break;
case 0x0f: str = "7 Full Rate TCHs"; break;
case 0x04: str = "8 Full Rate TCHs"; break;
default:
str = "Reserved";
break;
}
other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Channel: (%u) %s",
a_bigbuf,
oct & 0x0f,
str);
/* Channel */
proto_tree_add_item(tree, hf_gsm_a_bssmap_channel, tvb, curr_offset, 1, FALSE);
curr_offset++;
@ -2350,7 +2451,7 @@ be_speech_ver(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gc
return(curr_offset - offset);
}
/*
* 3.2.2.52 Assignment Requirement BE_ASS_REQ
* 3.2.2.52 Assignment Requirement
*/
static guint8
be_ass_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
@ -2384,6 +2485,33 @@ be_ass_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar
*/
/*
* 3.2.2.57 Configuration Evolution Indication
*/
static const value_string gsm_a_bssmap_smi_vals[] = {
{ 0, "No Modification is allowed" },
{ 1, "Modification is allowed and maximum number of TCH/F is 1" },
{ 2, "Modification is allowed and maximum number of TCH/F is 2" },
{ 3, "Modification is allowed and maximum number of TCH/F is 3" },
{ 4, "Modification is allowed and maximum number of TCH/F is 4" },
{ 5, "Reserved" },
{ 6, "Reserved" },
{ 7, "Reserved" },
{ 0, NULL },
};
static guint8
be_conf_evo_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
curr_offset = offset;
proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE);
/* Subsequent Modification Indication */
proto_tree_add_item(tree, hf_gsm_a_bssmap_smi, tvb, curr_offset, 1, FALSE);
return(len);
}
/*
* 3.2.2.58 Old BSS to New BSS information
* 3.2.2.59 (void)
* 3.2.2.60 LCS QoS
@ -2676,6 +2804,17 @@ be_seg(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *ad
/*
* 3.2.2.75 Service Handover
*/
static const value_string gsm_a_bssmap_serv_ho_inf_vals[] = {
{ 0, "Handover to UTRAN or cdma2000 should be performed - Handover to UTRAN or cdma2000 is preferred" },
{ 1, "Handover to UTRAN or cdma2000 should not be performed - Handover to GSM is preferred" },
{ 2, "Handover to UTRAN or cdma2000 shall not be performed - " },
{ 3, "no information available for service based handover" },
{ 4, "no information available for service based handover" },
{ 5, "no information available for service based handover" },
{ 6, "no information available for service based handover" },
{ 7, "no information available for service based handover" },
{ 0, NULL },
};
static guint8
be_serv_ho(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
@ -2683,8 +2822,10 @@ be_serv_ho(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len , "Not decoded yet");
/* Service Handover information */
proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 5, FALSE);
proto_tree_add_item(tree, hf_gsm_a_bssmap_serv_ho_inf, tvb, curr_offset+1, 1, FALSE);
curr_offset++;
return(len);
}
@ -2802,7 +2943,7 @@ be_sna_acc_inf(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, g
* If the VGCS/VBS flag is set to zero, the mobile station to be paged is not a member of any VGCS/VBS-group.
* If the VGCS/VBS flag is set to one, the mobile station to be paged is a member of a VGCS/VBS-group.
*/
static const true_false_string gbssmap_paging_inf_flg_value = {
static const true_false_string bssmap_paging_inf_flg_value = {
"A member of a VGCS/VBS-group",
"Not a member of any VGCS/VBS-group"
};
@ -2973,13 +3114,25 @@ be_sms_to_vgcs(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, g
return(len);
}
/*
* 3.2.2.93 VGCS talker mode
* 3.2.2.93 VGCS talker mode
*/
static guint8
be_vgcs_talker_mode(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
return(len);
}
/*
* 3.2.2.94 VGCS/VBS Cell Status
*/
/*
* 3.2.2.95 GANSS Assistance Data
* The GANSS Assistance Data octets 3 to n are coded as the Requested GANSS Data element of 3GPP TS 49.031 (BSSAP-LE)
*/
static guint8
be_ganss_ass_dta(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
@ -3042,6 +3195,7 @@ be_app_data_inf(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_,
}
/*
* 3.2.2.101 MSISDN
* Octets 3-12 contain the digits of an MSISDN, coded as in 3GPP TS 24.008, Calling party BCD number, octets 4 13.
*/
/*
* 3.2.2.102 AoIP Transport Layer Address
@ -3053,27 +3207,136 @@ be_aoip_trans_lay_add(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
/* This Information Element provides either an IPv4 or and IPv6 Address and UDP port value
* for the Transport Layer information of the connection end point.
* The Length differentiates between IPv4 and IPv6.
*/
switch(len){
case 6:
/* IPv4 */
proto_tree_add_item(tree, hf_gsm_a_bssmap_aoip_trans_ipv4, tvb, curr_offset, 4, FALSE);
curr_offset+=4;
break;
case 18:
/* IPv6 */
proto_tree_add_item(tree, hf_gsm_a_bssmap_aoip_trans_ipv6, tvb, curr_offset, 16, FALSE);
curr_offset+=16;
break;
default:
/* Bougus */
proto_tree_add_text(tree, tvb, curr_offset, len, "Bougus length %u",len);
return(len);
}
proto_tree_add_item(tree, hf_gsm_a_bssmap_aoip_trans_port, tvb, curr_offset, 2, FALSE);
curr_offset+=2;
return(len);
return(curr_offset - offset);
}
/*
* 3.2.2.103 Speech Codec List
*/
/*
FR_AMR is coded 0011.
S11, S13 and S15 are reserved and coded with zeroes.
HR_AMR is coded 0100.
S6 - S7 and S11 S15 are reserved and coded with zeroes.
OHR_AMR is coded 1011.
S11, S13 and S15 are reserved and coded with zeroes.
FR_AMR-WB is coded 1001.
S0 is set to 1. S1 - S7 are reserved and coded with zeroes.
OFR_AMR-WB is coded 1100.
S0, S2, S4 indicates the supported Codec Configurations. S1, S3, S5, S6, S7 are reserved and coded with zeroes.
OHR_AMR-WB is coded 1101.
S0 is set to 1. S1 - S7 are reserved and coded with zeroes.
8 7 6 5 4 3 2 1
FI PI PT TF Codec Type (FR_AMR-WB or OFR_AMR-WB or OHR_AMR-WB)
S7 S6 S5 S4 S3 S2 S1 S0
*/
static const true_false_string bssmap_fi_vals = {
"AoIP with compressed speech via RTP/UDP/IP is supported by the BSS/Preferred by the MSC",
"AoIP with Compressed speech via RTP/UDP/IP is not supported by the BSS/Not Preferred by the MSC"
};
static const true_false_string bssmap_tf_vals = {
"TFO supported by the BSS or TFO support is preferred by the MSC for this Codec Type"
"TFO is not supported by the BSS or TFO support is not preferred by the MSC for this Codec Type"
};
static const true_false_string bssmap_pi_vals = {
"Transport of PCM over A-Interface via RTP/UDP/IP is supported by the BSS or preferred by the MSC for this Codec Type"
"PCM over A interface with IP as transport is not supported by the BSS or not preferred by the MSC for this Codec Type"
};
static const true_false_string bssmap_pt_vals = {
"Transport of PCM over A-Interface via TDM is supported by the BSS or preferred by the MSC"
"PCM over A-Interface with TDM as transport is not supported by the BSS or not preferred by the MSC for this Codec Type"
};
static const value_string bssap_speech_codec_values[] = {
{ 0x03, "FR_AMR" },
{ 0x04, "HR_AMR" },
{ 0x0b, "OHR_AMR" },
{ 0x09, "FR_AMR-WB" },
{ 0x0c, "OFR_AMR-WB" },
{ 0x0d, "OHR_AMR-WB" },
{ 0, NULL }
};
static guint8
be_speech_codec_lst(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
guint32 curr_offset, consumed;
guint8 codec;
guint8 number = 0;
proto_item *item = NULL;
proto_tree *subtree = NULL;
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
while (curr_offset-offset < len){
number++;
consumed=0;
item = proto_tree_add_text(tree, tvb, curr_offset, 1, "Speech Codec Element %u",number);
subtree = proto_item_add_subtree(item, ett_codec_lst);
codec = tvb_get_guint8(tvb,curr_offset)&0x0f;
/* FI indicates Full IP */
proto_tree_add_item(subtree, hf_gsm_a_bssmap_fi, tvb, curr_offset, 1, FALSE);
/* TF indicates TFO support */
proto_tree_add_item(subtree, hf_gsm_a_bssmap_tf, tvb, curr_offset, 1, FALSE);
/* PI indicates PCMoIP */
proto_tree_add_item(subtree, hf_gsm_a_bssmap_pi, tvb, curr_offset, 1, FALSE);
/* PT indicates PCMoTDM */
proto_tree_add_item(subtree, hf_gsm_a_bssmap_pt, tvb, curr_offset, 1, FALSE);
/* Codec Type */
proto_tree_add_item(subtree, hf_gsm_a_bssap_speech_codec, tvb, curr_offset, 1, FALSE);
curr_offset++;
consumed++;
if((codec==3)||(codec==4)||(codec==0xb)){
/* FR_AMR is coded 0011.
* HR_AMR is coded 0100.
* OHR_AMR is coded 1011.
*/
proto_tree_add_text(subtree, tvb, curr_offset, 2, "S0 - S15");
curr_offset+=2;
consumed+=2;
}else{
/* FR_AMR-WB is coded 1001.
* OFR_AMR-WB is coded 1100.
* OHR_AMR-WB is coded 1101.
*/
proto_tree_add_text(subtree, tvb, curr_offset, 1, "S0 - S7");
curr_offset++;
consumed++;
}
proto_item_set_len(item, consumed);
}
return(len);
}
/*
* 3.2.2.104 Speech Codec
*/
static guint8
be_speech_codec(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
@ -3081,6 +3344,7 @@ be_speech_codec(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_,
curr_offset = offset;
/* Speech Codec Element 1 - n */
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
return(len);
@ -3095,9 +3359,15 @@ be_call_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
/* Call Identifier (least significant bits) octet 2
* Call Identifier octet 3
* Call Identifier octet 4
* Call Identifier (most significant bits) octet 5
*/
proto_tree_add_item(tree, hf_gsm_a_bssmap_call_id, tvb, curr_offset, 4, TRUE);
curr_offset+=4;
return(len);
return(curr_offset - offset);
}
/*
* 3.2.2.106 Call Identifier List
@ -3106,10 +3376,16 @@ static guint8
be_call_id_lst(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
guint32 consumed=0;
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet");
if (len==0){
proto_tree_add_text(tree, tvb, curr_offset, len, "all resources and references associated to all Call Identifiers in use between the BSC and the MSC need to be released");
}
while (curr_offset-offset < len){
proto_tree_add_item(tree, hf_gsm_a_bssmap_call_id, tvb, curr_offset, 4, TRUE);
curr_offset+=4;
}
return(len);
}
@ -3171,7 +3447,7 @@ guint8 (*bssmap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, gui
NULL /* no associated data */, /* Connection Release Requested */
de_d_gb_call_ref, /* Group Call Reference */
NULL, /* eMLPP Priority */
NULL, /* Configuration Evolution Indication */
be_conf_evo_ind, /* Configuration Evolution Indication */
NULL /* no decode required */, /* Old BSS to New BSS Information */
be_lsa_id, /* LSA Identifier */
be_lsa_id_list, /* LSA Identifier List */
@ -3210,7 +3486,7 @@ guint8 (*bssmap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, gui
be_talker_id, /* Talker Identity */
be_cell_id_list_seg, /* Cell Identifier List Segment */
be_sms_to_vgcs, /* SMS to VGCS */
NULL, /* VGCS Talker Mode */
be_vgcs_talker_mode, /* VGCS Talker Mode */
NULL, /* VGCS/VBS Cell Status */
be_cell_id_lst_seg_f_est_cells, /* Cell Identifier List Segment for established cells */
be_cell_id_lst_seg_f_cell_tb_est, /* Cell Identifier List Segment for cells to be established */
@ -5422,11 +5698,56 @@ proto_register_gsm_a_bssmap(void)
FT_UINT8,BASE_DEC, VALS(gsm_a_be_cell_id_disc_vals), 0x0f,
"Cell identification discriminator", HFILL }
},
{ &hf_gsm_a_bssmap_lsa_only,
{ "LSA only","ggsm_a_bssmap.lsa_only",
FT_BOOLEAN,8, TFS(&bssmap_lsa_only_value), 0x01,
"LSA only", HFILL }
},
{ &hf_gsm_a_bssmap_act,
{ "Active mode support","gsm_a_bssmap.act",
FT_BOOLEAN,8, NULL, 0x20,
"Active mode support", HFILL }
},
{ &hf_gsm_a_bssmap_pref,
{ "Preferential access","gsm_a_bssmap.pref",
FT_BOOLEAN,8, NULL, 0x10,
"Preferential access", HFILL }
},
{ &hf_gsm_a_bssmap_lsa_inf_prio,
{ "Priority","gsm_a_bssmap.lsa_inf_prio",
FT_UINT8,BASE_DEC, NULL, 0x0f,
"Priority", HFILL }
},
{ &hf_gsm_a_bssmap_seq_len,
{ "Sequence Length","gsm_a_bssmap.seq_len",
FT_UINT8,BASE_DEC, NULL, 0xf0,
"Sequence Length", HFILL }
},
{ &hf_gsm_a_bssmap_seq_no,
{ "Sequence Number","gsm_a_bssmap.seq_no",
FT_UINT8,BASE_DEC, NULL, 0xf,
"Sequence Number", HFILL }
},
{ &hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc,
{ "Cell identification discriminator","gsm_a_bssmap.cell_id_list_seg_cell_id_disc",
FT_UINT8,BASE_DEC, VALS(gsm_a_bssap_cell_id_list_seg_cell_id_disc_vals), 0xf,
"Cell identification discriminator", HFILL }
},
{ &hf_gsm_a_bssap_res_ind_method,
{ "Resource indication method","gsm_a_bssmap.res_ind_method",
FT_UINT8,BASE_DEC, VALS(gsm_a_bssap_resource_indication_vals), 0xf,
"Resource indication method", HFILL }
},
{ &hf_gsm_a_bssmap_ch_mode,
{ "Channel mode","gsm_a_bssmap.cch_mode",
FT_UINT8,BASE_DEC, VALS(gsm_a_bssmap_ch_mode_vals), 0xf0,
"Channel mode", HFILL }
},
{ &hf_gsm_a_bssmap_channel,
{ "Channel","gsm_a_bssmap.channel",
FT_UINT8,BASE_DEC, VALS(gsm_a_bssmap_channel_vals), 0x0f,
"Channel", HFILL }
},
{ &hf_gsm_a_bssmap_be_rnc_id,
{ "RNC-ID","gsm_a.be.rnc_id",
FT_UINT16,BASE_DEC, NULL, 0x0,
@ -5442,6 +5763,41 @@ proto_register_gsm_a_bssmap(void)
FT_UINT8, BASE_DEC, NULL, 0x0,
"Periodicity", HFILL }
},
{ &hf_gsm_a_bssmap_sm,
{ "Subsequent Mode","gsm_a_bssmap.sm",
FT_BOOLEAN,8, NULL, 0x02,
"Subsequent Mode", HFILL }
},
{ &hf_gsm_a_bssmap_tarr,
{ "Total Accessible Resource Requested","gsm_a_bssmap.tarr",
FT_BOOLEAN,8, NULL, 0x01,
"Total Accessible Resource Requested", HFILL }
},
{ &hf_gsm_a_bssmap_tot_no_of_fullr_ch,
{ "Total number of accessible full rate channels", "gsm_a_bssmap.tot_no_of_fullr_ch",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Total number of accessible full rate channels", HFILL }
},
{ &hf_gsm_a_bssmap_tot_no_of_hr_ch,
{ "Total number of accessible half rate channels", "gsm_a_bssmap.tot_no_of_hr_ch",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Total number of accessible half rate channels", HFILL }
},
{ &hf_gsm_a_bssmap_lsa_id,
{ "Identification of Localised Service Area", "gsm_a_bssmap.lsa_id",
FT_UINT24, BASE_HEX, NULL, 0x0,
"Identification of Localised Service Area", HFILL }
},
{ &hf_gsm_a_bssmap_ep,
{ "EP", "gsm_a_bssmap.ep",
FT_UINT8, BASE_DEC, NULL, 0x01,
"EP", HFILL }
},
{ &hf_gsm_a_bssmap_smi,
{ "Subsequent Modification Indication(SMI)", "gsm_a_bssmap.smi",
FT_UINT8, BASE_DEC, VALS(gsm_a_bssmap_smi_vals), 0x0f,
"Subsequent Modification Indication", HFILL }
},
{ &hf_gsm_a_bssmap_lcs_pri,
{ "Periodicity", "gsm_a_bssmap.lcs_pri",
FT_UINT8, BASE_DEC, VALS(lcs_priority_vals), 0x0,
@ -5464,9 +5820,15 @@ proto_register_gsm_a_bssmap(void)
},
{ &hf_gsm_a_bssmap_paging_inf_flg,
{ "VGCS/VBS flag","ggsm_a_bssmap.paging_inf_flg",
FT_BOOLEAN,8, TFS(&gbssmap_paging_inf_flg_value), 0x01,
FT_BOOLEAN,8, TFS(&bssmap_paging_inf_flg_value), 0x01,
"If 1, a member of a VGCS/VBS-group", HFILL }
},
{ &hf_gsm_a_bssmap_serv_ho_inf,
{ "Service Handover information", "gsm_a_bssmap.serv_ho_inf",
FT_UINT8, BASE_HEX, NULL, 0x07,
"Service Handover information", HFILL }
},
{ &hf_gsm_a_bssmap_spare_bits,
{ "Spare bit(s)", "gsm_a_bssmap.spare_bits",
FT_UINT8, BASE_HEX, NULL, 0x0,
@ -5502,16 +5864,62 @@ proto_register_gsm_a_bssmap(void)
FT_UINT8, BASE_DEC,NULL, 0x07,
"Filler Bits", HFILL }
},
{ &hf_gsm_a_bssmap_aoip_trans_ipv4,
{ "Transport Layer Address (IPv4)","gsm_a_bssmap.aoip_trans_ipv4",
FT_IPv4,BASE_NONE, NULL, 0x0,
"Transport Layer Address (IPv4)", HFILL }
},
{ &hf_gsm_a_bssmap_aoip_trans_ipv6,
{ "Transport Layer Address (IPv6)","gsm_a_bssmap.aoip_trans_ipv6",
FT_IPv6,BASE_NONE, NULL, 0x0,
"Transport Layer Address (IPv6)", HFILL }
},
{ &hf_gsm_a_bssmap_aoip_trans_port,
{ "UDP Port","gsm_a_bssmap.aoip_trans_port",
FT_UINT16, BASE_DEC,NULL, 0x0,
"UDP Port", HFILL }
},
{ &hf_gsm_a_bssmap_fi,
{ "FI(Full IP)","gsm_a_bssmap.fi",
FT_BOOLEAN,8, TFS(&bssmap_fi_vals), 0x80,
"FI(Full IP)", HFILL }
},
{ &hf_gsm_a_bssmap_tf,
{ "TF","gsm_a_bssmap.tf",
FT_BOOLEAN,8, TFS(&bssmap_tf_vals), 0x40,
"TF", HFILL }
},
{ &hf_gsm_a_bssmap_pi,
{ "PI","gsm_a_bssmap.pi",
FT_BOOLEAN,8, TFS(&bssmap_pi_vals), 0x20,
"PI", HFILL }
},
{ &hf_gsm_a_bssmap_pt,
{ "PT","gsm_a_bssmap.pt",
FT_BOOLEAN,8, TFS(&bssmap_pt_vals), 0x10,
"PT", HFILL }
},
{ &hf_gsm_a_bssap_speech_codec,
{ "Codec Type","gsm_a_bssmap.speech_codec",
FT_UINT8, BASE_DEC,VALS(bssap_speech_codec_values), 0x0f,
"Codec Type ", HFILL }
},
{ &hf_gsm_a_bssmap_call_id,
{ "Call Identifier","gsm_a_bssmap.callid",
FT_UINT32, BASE_DEC,NULL, 0x0,
"Call Identifier", HFILL }
},
};
/* Setup protocol subtree array */
#define NUM_INDIVIDUAL_ELEMS 3
#define NUM_INDIVIDUAL_ELEMS 4
static gint *ett[NUM_INDIVIDUAL_ELEMS + NUM_GSM_BSSMAP_MSG +
NUM_GSM_BSSMAP_ELEM];
ett[0] = &ett_bssmap_msg;
ett[1] = &ett_cell_list;
ett[2] = &ett_dlci;
ett[3] = &ett_codec_lst,
last_offset = NUM_INDIVIDUAL_ELEMS;