summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2008-11-04 20:03:19 +0000
committerAnders Broman <anders.broman@ericsson.com>2008-11-04 20:03:19 +0000
commit07dadee5dd2a532cca422362159dc1940e58dcfb (patch)
tree4d4da124fb13a95b063a527f795e82fb76be0c82
parent2207381990c25113abdf26b3f7035dceedd9fb67 (diff)
downloadwireshark-07dadee5dd2a532cca422362159dc1940e58dcfb.tar.gz
From Pascal Quantin:
The attached patch adds the following enhancements: - remove duplicated code for Reduced Frame Number computation, and solve guint64 issue in the same time (see bug 3028 for details) - BA Range IE decoding - BA List Pref IE decoding - UTRAN Frequency List IE decoding - Cell Selection Indicator after Release of all TCH and SDCCH IE decoding - UTRAN Classmark Change message decoding (with a call to RRC dissector to decode the INTER RAT HANDOVER INFO message) - add Inter System To UTRAN Handover Command message decoding As usual it compiles fine on Windows but I could not check on Linux. svn path=/trunk/; revision=26688
-rw-r--r--epan/dissectors/packet-gsm_a_common.h34
-rw-r--r--epan/dissectors/packet-gsm_a_rr.c616
2 files changed, 543 insertions, 107 deletions
diff --git a/epan/dissectors/packet-gsm_a_common.h b/epan/dissectors/packet-gsm_a_common.h
index 7bdc76a43f..8c6140cc5c 100644
--- a/epan/dissectors/packet-gsm_a_common.h
+++ b/epan/dissectors/packet-gsm_a_common.h
@@ -835,15 +835,11 @@ gm_elem_idx_t;
typedef enum
{
/* Radio Resource Management Information Elements 10.5.2, most are from 10.5.1 */
-/*
- * [3] 10.5.2.1a BA Range
- */
- DE_RR_CELL_CH_DSC, /* [3] 10.5.2.1b Cell Channel Description */
-
-/* [3] 10.5.2.1c BA List Pref
- * [3] 10.5.2.1d UTRAN Frequency List
- * [3] 10.5.2.1e Cell selection indicator after release of all TCH and SDCCH IE
- */
+ DE_RR_BA_RANGE, /* [3] 10.5.2.1a BA Range */
+ DE_RR_CELL_CH_DSC, /* [3] 10.5.2.1b Cell Channel Description */
+ DE_RR_BA_LIST_PREF, /* [3] 10.5.2.1c BA List Pref */
+ DE_RR_UTRAN_FREQ_LIST, /* [3] 10.5.2.1d UTRAN Frequency List */
+ DE_RR_CELL_SELECT_INDIC, /* [3] 10.5.2.1e Cell selection indicator after release of all TCH and SDCCH IE */
DE_RR_CELL_DSC, /* 10.5.2.2 RR Cell Description */
DE_RR_CELL_OPT_BCCH, /* [3] 10.5.2.3 Cell Options (BCCH) */
DE_RR_CELL_OPT_SACCH, /* [3] 10.5.2.3a Cell Options (SACCH) */
@@ -855,8 +851,8 @@ typedef enum
DE_RR_CH_DSC2, /* [3] 10.5.2.5a Channel Description 2 */
DE_RR_CH_MODE, /* [3] 10.5.2.6 Channel Mode */
DE_RR_CH_MODE2, /* [3] 10.5.2.7 Channel Mode 2 */
-/* [3] 10.5.2.7a UTRAN predefined configuration status information / START-CS / UE CapabilityUTRAN Classmark information element 218
- * [3] 10.5.2.7b (void) */
+ DE_RR_UTRAN_CM, /* [3] 10.5.2.7a UTRAN Classmark */
+/* [3] 10.5.2.7b (void) */
DE_RR_CM_ENQ_MASK, /* [3] 10.5.2.7c Classmark Enquiry Mask */
/* [3] 10.5.2.7d GERAN Iu Mode Classmark information element */
DE_RR_CHNL_NEEDED, /* [3] 10.5.2.8 Channel Needed
@@ -864,7 +860,7 @@ typedef enum
* [3] 10.5.2.8b Channel Request Description 2 */
DE_RR_CIP_MODE_SET, /* [3] 10.5.2.9 Cipher Mode Setting */
DE_RR_CIP_MODE_RESP, /* [3] 10.5.2.10 Cipher Response */
- DE_RR_CTRL_CH_DESC, /* [3] 10.5.2.11 Control Channel Description */
+ DE_RR_CTRL_CH_DESC, /* [3] 10.5.2.11 Control Channel Description */
/* [3] 10.5.2.11a DTM Information Details */
DE_RR_DYN_ARFCN_MAP, /* [3] 10.5.2.11b Dynamic ARFCN Mapping */
DE_RR_FREQ_CH_SEQ, /* [3] 10.5.2.12 Frequency Channel Sequence */
@@ -878,10 +874,10 @@ typedef enum
DE_RR_HO_REF, /* 10.5.2.15 Handover Reference */
- DE_RR_IA_REST_OCT, /* [3] 10.5.2.16 IA Rest Octets */
- DE_RR_IAR_REST_OCT, /* [3] 10.5.2.17 IAR Rest Octets */
- DE_RR_IAX_REST_OCT, /* [3] 10.5.2.18 IAX Rest Octets */
- DE_RR_L2_PSEUDO_LEN, /* [3] 10.5.2.19 L2 Pseudo Length */
+ DE_RR_IA_REST_OCT, /* [3] 10.5.2.16 IA Rest Octets */
+ DE_RR_IAR_REST_OCT, /* [3] 10.5.2.17 IAR Rest Octets */
+ DE_RR_IAX_REST_OCT, /* [3] 10.5.2.18 IAX Rest Octets */
+ DE_RR_L2_PSEUDO_LEN, /* [3] 10.5.2.19 L2 Pseudo Length */
DE_RR_MEAS_RES, /* [3] 10.5.2.20 Measurement Results */
/* [3] 10.5.2.20a GPRS Measurement Results */
DE_RR_MOB_ALL, /* [3] 10.5.2.21 Mobile Allocation */
@@ -951,9 +947,9 @@ typedef enum
DE_RR_SUS_CAU, /* [3] 10.5.2.47 Suspension Cause */
/* [3] 10.5.2.48 APDU ID
* [3] 10.5.2.49 APDU Flags
- * [3] 10.5.2.50 APDU Data
- * [3] 10.5.2.51 Handover To UTRAN Command
- * [3] 10.5.2.52 Handover To cdma2000 Command
+ * [3] 10.5.2.50 APDU Data */
+ DE_RR_HO_TO_UTRAN_CMD, /* [3] 10.5.2.51 Handover To UTRAN Command */
+/* [3] 10.5.2.52 Handover To cdma2000 Command
* [3] 10.5.2.53 (void)
* [3] 10.5.2.54 (void)
* [3] 10.5.2.55 (void)
diff --git a/epan/dissectors/packet-gsm_a_rr.c b/epan/dissectors/packet-gsm_a_rr.c
index 32cc11a85f..2800d115c0 100644
--- a/epan/dissectors/packet-gsm_a_rr.c
+++ b/epan/dissectors/packet-gsm_a_rr.c
@@ -67,6 +67,9 @@
#include "packet-e212.h"
#include "packet-ppp.h"
+static dissector_handle_t rrc_irat_ho_info_handle;
+static dissector_handle_t rrc_irat_ho_to_utran_cmd_handle;
+
#define PADDING_BYTE 0x2B
gboolean gsm_a_rr_is_bit_high(tvbuff_t *tvb, gint bit_offset)
@@ -186,34 +189,31 @@ const value_string gsm_a_dtap_msg_rr_strings[] = {
const value_string gsm_rr_elem_strings[] = {
/* Radio Resource Management Information Elements 10.5.2, most are from 10.5.1 */
-/*
- * [3] 10.5.2.1a BA Range
- */
+ { 0x00, "BA Range" }, /* [3] 10.5.2.1a BA Range */
{ 0x00, "Cell Channel Description" }, /* [3] 10.5.2.1b */
-/* [3] 10.5.2.1c BA List Pref
- * [3] 10.5.2.1d UTRAN Frequency List
- * [3] 10.5.2.1e Cell selection indicator after release of all TCH and SDCCH IE
- */
+ { 0x00, "BA List Pref" }, /* [3] 10.5.2.1c BA List Pref */
+ { 0x00, "UTRAN Frequency List" }, /* [3] 10.5.2.1d UTRAN Frequency List */
+ { 0x00, "Cell Selection Indicator after Release of all TCH and SDCCH" }, /* [3] 10.5.2.1e Cell selection indicator after release of all TCH and SDCCH IE */
{ 0x00, "Cell Description" }, /* 10.5.2.2 */
{ 0x00, "Cell Options (BCCH)" }, /* [3] 10.5.2.3 Cell Options (BCCH) */
{ 0x00, "Cell Options (SACCH)" }, /* [3] 10.5.2.3a Cell Options (SACCH) */
- { 0x00, "Cell Selection Parameters" }, /* [3] 10.5.2.4 Cell Selection Parameters */
+ { 0x00, "Cell Selection Parameters" }, /* [3] 10.5.2.4 Cell Selection Parameters */
/* [3] 10.5.2.4a (void) */
{ 0x00, "Channel Description" }, /* 10.5.2.5 */
{ 0x00, "Channel Description 2" }, /* 10.5.2.5a */
{ 0x00, "Channel Mode" }, /* [3] 10.5.2.6 */
{ 0x00, "Channel Mode 2" }, /* [3] 10.5.2.7 */
-/* [3] 10.5.2.7a UTRAN predefined configuration status information / START-CS / UE CapabilityUTRAN Classmark information element 218
- * [3] 10.5.2.7b (void) */
+ { 0x00, "UTRAN Classmark" }, /* [3] 10.5.2.7a */
+/* [3] 10.5.2.7b (void) */
{ 0x00, "Classmark Enquiry Mask" }, /* [3] 10.5.2.7c */
/* [3] 10.5.2.7d GERAN Iu Mode Classmark information element */
{ 0x00, "Channel Needed"}, /* [3] 10.5.2.8 */
/* [3] 10.5.2.8a (void) */
/* [3] 10.5.2.8b Channel Request Description 2 */
/* Pos 20 */
- { 0x00, "Cipher Mode Setting" }, /* [3] 10.5.2.9 */
- { 0x00, "Cipher Mode Response" }, /* [3] 10.5.2.10 */
+ { 0x00, "Cipher Mode Setting" }, /* [3] 10.5.2.9 */
+ { 0x00, "Cipher Mode Response" }, /* [3] 10.5.2.10 */
{ 0x00, "Control Channel Description" }, /* [3] 10.5.2.11 Control Channel Description */
/* [3] 10.5.2.11a DTM Information Details */
{ 0x00, "Dynamic ARFCN Mapping" }, /* [3] 10.5.2.11b */
@@ -222,13 +222,13 @@ const value_string gsm_rr_elem_strings[] = {
{ 0x00, "Frequency Short List" }, /* 10.5.2.14 */
{ 0x00, "Frequency Short List2" }, /* 10.5.2.14a */
/* [3] 10.5.2.14b Group Channel Description */
- { 0x00, "GPRS Resumption" }, /* [3] 10.5.2.14c GPRS Resumption */
- { 0x00, "GPRS Broadcast Information" }, /* [3] 10.5.2.14d GPRS broadcast information */
+ { 0x00, "GPRS Resumption" }, /* [3] 10.5.2.14c GPRS Resumption */
+ { 0x00, "GPRS Broadcast Information" }, /* [3] 10.5.2.14d GPRS broadcast information */
/* [3] 10.5.2.14e Enhanced DTM CS Release Indication */
{ 0x00, "Handover Reference" }, /* 10.5.2.15 */
{ 0x00, "IA Rest Octets" }, /* [3] 10.5.2.16 */
- { 0x00, "IAR Rest Octets" }, /* [3] 10.5.2.17 IAR Rest Octets */
- { 0x00, "IAX Rest Octets" }, /* [3] 10.5.2.18 IAX Rest Octets */
+ { 0x00, "IAR Rest Octets" }, /* [3] 10.5.2.17 IAR Rest Octets */
+ { 0x00, "IAX Rest Octets" }, /* [3] 10.5.2.18 IAX Rest Octets */
{ 0x00, "L2 Pseudo Length" }, /* [3] 10.5.2.19 */
{ 0x00, "Measurement Results" }, /* [3] 10.5.2.20 Measurement Results */
/*
@@ -261,14 +261,14 @@ const value_string gsm_rr_elem_strings[] = {
* [3] 10.5.2.26c (void)
* [3] 10.5.2.26d (void)
*/
- { 0x00, "NCC Permitted" }, /* [3] 10.5.2.27 NCC Permitted */
+ { 0x00, "NCC Permitted" }, /* [3] 10.5.2.27 NCC Permitted */
{ 0x00, "Power Command" }, /* 10.5.2.28 */
{ 0x00, "Power Command and access type" }, /* 10.5.2.28a */
{ 0x00, "RACH Control Parameters" }, /* [3] 10.5.2.29 RACH Control Parameters */
{ 0x00, "Request Reference" }, /* [3] 10.5.2.30 Request Reference */
{ 0x00, "RR Cause" }, /* 10.5.2.31 */
{ 0x00, "Synchronization Indication" }, /* 10.5.2.39 */
- { 0x00, "SI 1 Rest Octets" }, /* [3] 10.5.2.32 */
+ { 0x00, "SI 1 Rest Octets" }, /* [3] 10.5.2.32 */
/* [3] 10.5.2.33 SI 2bis Rest Octets */
{ 0x00, "SI 2ter Rest Octets" }, /* [3] 10.5.2.33a */
{ 0x00, "SI 2quater Rest Octets" }, /* [3] 10.5.2.33b */
@@ -296,16 +296,16 @@ const value_string gsm_rr_elem_strings[] = {
{ 0x00, "VGCS target mode Indication" }, /* [3] 10.5.2.42a */
/* Pos 40 */
{ 0x00, "VGCS Ciphering Parameters" }, /* [3] 10.5.2.42b */
- { 0x00, "Wait Indication" }, /* [3] 10.5.2.43 Wait Indication */
+ { 0x00, "Wait Indication" }, /* [3] 10.5.2.43 Wait Indication */
/* [3] 10.5.2.44 SI10 rest octets $(ASCI)$
* [3] 10.5.2.45 EXTENDED MEASUREMENT RESULTS
* [3] 10.5.2.46 Extended Measurement Frequency List */
{ 0x00, "Suspension Cause" }, /* [3] 10.5.2.47 */
/* [3] 10.5.2.48 APDU ID
* [3] 10.5.2.49 APDU Flags
- * [3] 10.5.2.50 APDU Data
- * [3] 10.5.2.51 Handover To UTRAN Command
- * [3] 10.5.2.52 Handover To cdma2000 Command
+ * [3] 10.5.2.50 APDU Data */
+ { 0x00, "Handover to UTRAN Command" }, /* [3] 10.5.2.51 Handover To UTRAN Command */
+/* [3] 10.5.2.52 Handover To cdma2000 Command
* [3] 10.5.2.53 (void)
* [3] 10.5.2.54 (void)
* [3] 10.5.2.55 (void)
@@ -360,6 +360,7 @@ const value_string gsm_rr_rest_octets_elem_strings[] = {
{ 0, "GPRS Cell Options Extension Information" },
{ 0, "GPRS Power Control Parameters" },
{ 0, "PBCCH Description" },
+ { 0, "GSM Description" },
{ 0, NULL }
};
@@ -419,6 +420,12 @@ int hf_gsm_a_rr_elem_id = -1;
static int hf_gsm_a_bcc = -1;
static int hf_gsm_a_ncc = -1;
static int hf_gsm_a_bcch_arfcn = -1;
+static int hf_gsm_a_rr_range_nb = -1;
+static int hf_gsm_a_rr_range_lower = -1;
+static int hf_gsm_a_rr_range_higher = -1;
+static int hf_gsm_a_rr_ba_list_pref_length = -1;
+static int hf_gsm_a_rr_ba_freq = -1;
+static int hf_gsm_a_rr_utran_freq_list_length = -1;
static int hf_gsm_a_rr_ho_ref_val = -1;
static int hf_gsm_a_rr_L2_pseudo_len = -1;
static int hf_gsm_a_rr_ba_used = -1;
@@ -524,6 +531,10 @@ static int hf_gsm_a_rr_cell_barr_access = -1;
static int hf_gsm_a_rr_re = -1;
static int hf_gsm_a_rr_acc = -1;
static int hf_gsm_a_rr_nch_position = -1;
+static int hf_gsm_a_rr_fdd_uarfcn = -1;
+static int hf_gsm_a_rr_bandwidth_fdd = -1;
+static int hf_gsm_a_rr_tdd_uarfcn = -1;
+static int hf_gsm_a_rr_bandwidth_tdd = -1;
static int hf_gsm_a_rr_qsearch_i = -1;
static int hf_gsm_a_rr_fdd_qoffset = -1;
static int hf_gsm_a_rr_fdd_qmin = -1;
@@ -632,9 +643,6 @@ static int hf_gsm_a_rr_sgsnr = -1;
static int hf_gsm_a_rr_si_status_ind = -1;
static int hf_gsm_a_rr_lb_ms_txpwr_max_cch = -1;
static int hf_gsm_a_rr_si2n_support = -1;
-static int hf_gsm_a_rr_t1prime = -1;
-static int hf_gsm_a_rr_t3 = -1;
-static int hf_gsm_a_rr_t2 = -1;
/* Initialize the subtree pointers */
static gint ett_ccch_msg = -1;
@@ -682,6 +690,7 @@ typedef enum
DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS_EXT_INFO,
DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS,
DE_RR_REST_OCTETS_PBCCH_DESC,
+ DE_RR_REST_OCTETS_GSM_DESC,
DE_RR_REST_OCTETS_NONE
}
rr_rest_octets_elem_idx_t;
@@ -693,6 +702,31 @@ gint ett_gsm_rr_rest_octets_elem[NUM_GSM_RR_REST_OCTETS_ELEM];
10.5.2 Radio Resource management information elements
* [3] 10.5.2.1a BA Range
*/
+guint8
+de_rr_ba_range(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset;
+ gint bit_offset;
+ guint8 value;
+
+ curr_offset = offset;
+ proto_tree_add_item(tree, hf_gsm_a_rr_range_nb, tvb, curr_offset, 1, FALSE);
+ value = tvb_get_guint8(tvb, curr_offset);
+ curr_offset += 1;
+ bit_offset = curr_offset << 3;
+ while (value)
+ {
+ proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_lower, tvb, bit_offset, 10, FALSE);
+ bit_offset += 10;
+ proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_higher, tvb, bit_offset, 10, FALSE);
+ bit_offset += 10;
+ value -= 1;
+ }
+
+ curr_offset += len - 1;
+ return (curr_offset - offset);
+}
+
/*
* [3] 10.5.2.1b Cell Channel Description
*/
@@ -928,8 +962,301 @@ de_rr_cell_ch_dsc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_
}
/*
* [3] 10.5.2.1c BA List Pref
+ */
+guint8
+de_rr_ba_list_pref(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset;
+ gint bit_offset;
+ guint8 value;
+
+ curr_offset = offset;
+ proto_tree_add_item(tree, hf_gsm_a_rr_ba_list_pref_length, tvb, curr_offset, 1, FALSE);
+ curr_offset += 1;
+ bit_offset = curr_offset << 3;
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ while (value)
+ {
+ proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_lower, tvb, bit_offset, 10, FALSE);
+ bit_offset += 10;
+ proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_higher, tvb, bit_offset, 10, FALSE);
+ bit_offset += 10;
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ }
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ while (value)
+ {
+ proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_freq, tvb, bit_offset, 10, FALSE);
+ bit_offset += 10;
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ }
+
+ curr_offset += len - 1;
+ return (curr_offset - offset);
+}
+
+/*
* [3] 10.5.2.1d UTRAN Frequency List
*/
+guint8
+de_rr_utran_freq_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset;
+ gint bit_offset;
+ guint8 value;
+
+ curr_offset = offset;
+ proto_tree_add_item(tree, hf_gsm_a_rr_utran_freq_list_length, tvb, curr_offset, 1, FALSE);
+ curr_offset += 1;
+ bit_offset = curr_offset << 3;
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ while (value)
+ {
+ proto_tree_add_bits_item(tree, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, FALSE);
+ bit_offset += 14;
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ }
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ while (value)
+ {
+ proto_tree_add_bits_item(tree, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, FALSE);
+ bit_offset += 14;
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ }
+
+ curr_offset += len - 1;
+ return (curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.2.1e Cell selection indicator after release of all TCH and SDCCH
+ */
+static const guint8
+convert_n_to_p[32] = { 0, 10, 19, 28, 26, 44, 52, 60, 67, 74, 81, 88, 95, 102, 109, 116,
+ 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+static const guint8
+convert_n_to_q[32] = { 0, 9, 17, 25, 32, 39, 46, 53, 59, 65, 71, 77, 83, 89, 95, 101,
+ 106, 111, 116, 121, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+guint8
+de_rr_cell_select_indic(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+{
+ proto_tree *subtree, *subtree2;
+ proto_item *item, *item2;
+ guint32 curr_offset;
+ gint bit_offset, bit_offset_sav, idx, xdd_cell_info, wsize, nwi, jwi, w[64], i, iused, xdd_indic0;
+ guint8 value, length;
+
+ curr_offset = offset;
+ length = tvb_get_guint8(tvb, curr_offset);
+ curr_offset += 1;
+ bit_offset = curr_offset << 3;
+ value = tvb_get_bits8(tvb,bit_offset,3);
+ bit_offset += 3;
+ switch (value)
+ {
+ case 0: /* GSM Description */
+ bit_offset_sav = bit_offset;
+ item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GSM_DESC].strptr);
+ subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GSM_DESC]);
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ while (value)
+ {
+ proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Band Indicator: %s",tvb_get_bits8(tvb,bit_offset,1) ? "1900" : "1800");
+ bit_offset += 1;
+ proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "ARFCN: %d", tvb_get_bits16(tvb,bit_offset,10,FALSE));
+ bit_offset += 10;
+ proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "BSIC: %d", tvb_get_bits8(tvb,bit_offset,6));
+ bit_offset += 6;
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ }
+ proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
+ break;
+ case 1: /* UTRAN FDD Description */
+ bit_offset_sav = bit_offset;
+ item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
+ subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]);
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ while (value)
+ {
+ if (tvb_get_bits8(tvb,bit_offset,1))
+ {
+ bit_offset += 1;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_fdd, tvb, bit_offset, 3, FALSE);
+ bit_offset += 3;
+ }
+ else
+ bit_offset += 1;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, FALSE);
+ bit_offset += 14;
+ if (tvb_get_bits8(tvb,bit_offset,1))
+ {
+ bit_offset += 1;
+ xdd_indic0 = tvb_get_bits8(tvb,bit_offset,1);
+ proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "FDD Indic0: %d", xdd_indic0);
+ bit_offset += 1;
+ idx = tvb_get_bits8(tvb,bit_offset,5);
+ proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Nr of FDD Cells : %d", idx);
+ bit_offset += 5;
+ idx = convert_n_to_p[idx];
+ item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, (idx>>3)+1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
+ subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD]);
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
+ if (xdd_indic0)
+ {
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Scrambling Code: %d", 0);
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Diversity: %d", 0);
+ }
+ if (idx)
+ {
+ wsize = 10;
+ nwi = 1;
+ jwi = 0;
+ i = 1;
+
+ while (idx > 0)
+ {
+ w[i] = tvb_get_bits16(tvb, bit_offset, wsize, FALSE);
+ bit_offset += wsize;
+ idx -= wsize;
+ if (w[i] == 0)
+ {
+ idx = 0;
+ break;
+ }
+ if (++jwi==nwi)
+ {
+ jwi = 0;
+ nwi <<= 1;
+ wsize--;
+ }
+ i++;
+ }
+ if (idx < 0)
+ {
+ bit_offset += idx;
+ }
+ iused = i-1;
+
+ for (i=1; i <= iused; i++)
+ {
+ xdd_cell_info = f_k(i, w, 1024);
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Scrambling Code: %d", xdd_cell_info & 0x01FF);
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Diversity: %d", (xdd_cell_info >> 9) & 0x01);
+ }
+ }
+ }
+ else
+ bit_offset += 1;
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ }
+ proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
+ break;
+ case 2: /* UTRAN TDD Description */
+ bit_offset_sav = bit_offset;
+ item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
+ subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]);
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ while (value)
+ {
+ if (tvb_get_bits8(tvb,bit_offset,1))
+ {
+ bit_offset += 1;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_tdd, tvb, bit_offset, 3, FALSE);
+ bit_offset += 3;
+ }
+ else
+ bit_offset += 1;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, FALSE);
+ bit_offset += 14;
+ if (tvb_get_bits8(tvb,bit_offset,1))
+ {
+ bit_offset += 1;
+ xdd_indic0 = tvb_get_bits8(tvb,bit_offset,1);
+ proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "TDD Indic0: %d", xdd_indic0);
+ bit_offset += 1;
+ idx = tvb_get_bits8(tvb,bit_offset,5);
+ proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Nr of TDD Cells : %d", idx);
+ bit_offset += 5;
+ idx = convert_n_to_q[idx];
+ item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, (idx>>3)+1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
+ subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD]);
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
+ if (xdd_indic0)
+ {
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Cell Parameter: %d", 0);
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Sync Case TSTD: %d", 0);
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Diversity TDD: %d", 0);
+ }
+ if (idx)
+ {
+ wsize = 9;
+ nwi = 1;
+ jwi = 0;
+ i = 1;
+
+ while (idx > 0)
+ {
+ w[i] = tvb_get_bits16(tvb, bit_offset, wsize, FALSE);
+ bit_offset += wsize;
+ idx -= wsize;
+ if (w[i] == 0)
+ {
+ idx = 0;
+ break;
+ }
+ if (++jwi==nwi)
+ {
+ jwi = 0;
+ nwi <<= 1;
+ wsize--;
+ }
+ i++;
+ }
+ if (idx < 0)
+ {
+ bit_offset += idx;
+ }
+ iused = i-1;
+
+ for (i=1; i <= iused; i++)
+ {
+ xdd_cell_info = f_k(i, w, 512);
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Cell Parameter: %d", xdd_cell_info & 0x07F);
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Sync Case TSTD: %d", (xdd_cell_info >> 7) & 0x01);
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Diversity TDD: %d", (xdd_cell_info >> 8) & 0x01);
+ }
+ }
+ }
+ else
+ bit_offset += 1;
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ }
+ proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
+ break;
+ default:
+ break;
+ }
+
+ curr_offset += length;
+ return (curr_offset - offset);
+}
+
/*
* [3] 10.5.2.2 Cell Description
*/
@@ -1371,8 +1698,30 @@ de_rr_ch_mode2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, g
}
/*
* [3] 10.5.2.7a UTRAN Classmark information element
+ */
+static guint8
+de_rr_utran_cm(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset;
+ tvbuff_t *rrc_irat_ho_info_tvb;
+ static packet_info p_info;
+
+ curr_offset = offset;
+ if (len)
+ {
+ rrc_irat_ho_info_tvb = tvb_new_subset(tvb, curr_offset, len, len);
+ if (rrc_irat_ho_info_handle)
+ call_dissector(rrc_irat_ho_info_handle, rrc_irat_ho_info_tvb, &p_info, tree);
+ }
+
+ curr_offset += len;
+ return(curr_offset - offset);
+}
+
+/*
* [3] 10.5.2.7b (void)
*/
+
/*
* [3] 10.5.2.7c Classmark Enquiry Mask
* Bit 8:
@@ -3143,13 +3492,13 @@ de_rr_si2ter_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]);
bit_offset += 2; /* skip '01' bits */
- proto_tree_add_text(subtree2,tvb, bit_offset>>3, 2, "FDD UARFCN: %d", tvb_get_bits16(tvb,bit_offset,14,FALSE));
+ proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, FALSE);
bit_offset += 14;
value = tvb_get_bits8(tvb,bit_offset,1);
bit_offset += 1;
if (value)
{
- proto_tree_add_text(subtree2,tvb, bit_offset>>3, 1, "Bandwidth FDD: %d", tvb_get_bits8(tvb,bit_offset,3));
+ proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_bandwidth_fdd, tvb, bit_offset, 3, FALSE);
bit_offset += 3;
}
proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
@@ -3162,13 +3511,13 @@ de_rr_si2ter_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]);
bit_offset += 2; /* skip '01' bits */
- proto_tree_add_text(subtree2,tvb, bit_offset>>3, 2, "TDD UARFCN: %d", tvb_get_bits16(tvb,bit_offset,14,FALSE));
+ proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, FALSE);
bit_offset += 14;
value = tvb_get_bits8(tvb,bit_offset,1);
bit_offset += 1;
if (value)
{
- proto_tree_add_text(subtree2,tvb, bit_offset>>3, 1, "Bandwidth TDD: %d", tvb_get_bits8(tvb,bit_offset,3));
+ proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_bandwidth_tdd, tvb, bit_offset, 3, FALSE);
bit_offset += 3;
}
proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
@@ -3351,14 +3700,6 @@ static const true_false_string gsm_a_rr_3g_ccn_active_value = {
"CCN towards 3G cells is disabled in the cell"
};
-static const guint8
-convert_n_to_p[32] = { 0, 10, 19, 28, 26, 44, 52, 60, 67, 74, 81, 88, 95, 102, 109, 116,
- 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-
-static const guint8
-convert_n_to_q[32] = { 0, 9, 17, 25, 32, 39, 46, 53, 59, 65, 71, 77, 83, 89, 95, 101,
- 106, 111, 116, 121, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-
static guint8
de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
@@ -3699,7 +4040,7 @@ de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
bit_offset += 1;
if (value)
{
- proto_tree_add_text(subtree3,tvb, bit_offset>>3, 1, "Bandwidth FDD: %d", tvb_get_bits8(tvb,bit_offset,3));
+ proto_tree_add_bits_item(subtree3, hf_gsm_a_rr_bandwidth_fdd, tvb, bit_offset, 3, FALSE);
bit_offset += 3;
}
value = tvb_get_bits8(tvb,bit_offset,1);
@@ -3707,7 +4048,7 @@ de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
while (value)
{
bit_offset += 1; /* skip a 0 bit */
- proto_tree_add_text(subtree3,tvb, bit_offset>>3, 2, "FDD UARFCN: %d", tvb_get_bits16(tvb,bit_offset,14,FALSE));
+ proto_tree_add_bits_item(subtree3, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, FALSE);
bit_offset += 14;
xdd_indic0 = tvb_get_bits8(tvb,bit_offset,1);
proto_tree_add_text(subtree3,tvb, bit_offset>>3, 1, "FDD Indic0: %d", xdd_indic0);
@@ -3778,7 +4119,7 @@ de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
bit_offset += 1;
if (value)
{
- proto_tree_add_text(subtree3,tvb, bit_offset>>3, 1, "Bandwidth TDD: %d", tvb_get_bits8(tvb,bit_offset,3));
+ proto_tree_add_bits_item(subtree3, hf_gsm_a_rr_bandwidth_tdd, tvb, bit_offset, 3, FALSE);
bit_offset += 3;
}
value = tvb_get_bits8(tvb,bit_offset,1);
@@ -3786,7 +4127,7 @@ de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
while (value)
{
bit_offset += 1; /* skip a 0 bit */
- proto_tree_add_text(subtree3,tvb, bit_offset>>3, 2, "TDD UARFCN: %d", tvb_get_bits16(tvb,bit_offset,14,FALSE));
+ proto_tree_add_bits_item(subtree3, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, FALSE);
bit_offset += 14;
xdd_indic0 = tvb_get_bits8(tvb,bit_offset,1);
proto_tree_add_text(subtree3,tvb, bit_offset>>3, 1, "TDD Indic0: %d", xdd_indic0);
@@ -5152,20 +5493,18 @@ static guint8
de_rr_starting_time(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
- gint bit_offset;
- guint64 t1prime, t2, t3;
+ guint16 rfn, fn;
curr_offset = offset;
- bit_offset = curr_offset << 3;
-
- proto_tree_add_bits_ret_val(tree, hf_gsm_a_rr_t1prime, tvb, bit_offset, 5, &t1prime, FALSE);
- bit_offset += 5;
- proto_tree_add_bits_ret_val(tree, hf_gsm_a_rr_t3, tvb, bit_offset, 6, &t3, FALSE);
- bit_offset += 6;
- proto_tree_add_bits_ret_val(tree, hf_gsm_a_rr_t2, tvb, bit_offset, 5, &t2, FALSE);
- bit_offset += 5;
- proto_tree_add_text(tree,tvb, curr_offset, 2, "FN mod 42432: %" G_GINT64_MODIFIER "u",51*((t3-t2)%26)+t3+51*26*t1prime);
- curr_offset = curr_offset + 2;
+
+ fn = tvb_get_ntohs(tvb,curr_offset);
+ rfn = reduced_frame_number(fn);
+ proto_tree_add_item(tree, hf_gsm_a_rr_T1prim, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_rr_T3, tvb, curr_offset, 2, FALSE);
+ curr_offset++;
+ proto_tree_add_item(tree, hf_gsm_a_rr_T2, tvb, curr_offset, 1, FALSE);
+ curr_offset++;
+ proto_tree_add_uint(tree, hf_gsm_a_rr_rfn, tvb, curr_offset-2, 2, rfn);
return(curr_offset - offset);
}
/*
@@ -5360,7 +5699,32 @@ de_rr_sus_cau(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gc
* [3] 10.5.2.48 APDU ID
* [3] 10.5.2.49 APDU Flags
* [3] 10.5.2.50 APDU Data
+ */
+
+/*
* [3] 10.5.2.51 Handover To UTRAN Command
+ */
+static guint8
+de_rr_ho_to_utran_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset;
+ tvbuff_t *rrc_irat_ho_to_utran_cmd_tvb;
+ static packet_info p_info;
+
+ curr_offset = offset;
+ if (len)
+ {
+ rrc_irat_ho_to_utran_cmd_tvb = tvb_new_subset(tvb, curr_offset, len, len);
+ if (rrc_irat_ho_to_utran_cmd_handle)
+ call_dissector(rrc_irat_ho_to_utran_cmd_handle, rrc_irat_ho_to_utran_cmd_tvb, &p_info, tree);
+ }
+
+ curr_offset += len;
+ return(curr_offset - offset);
+}
+
+
+/*
* [3] 10.5.2.52 Handover To cdma2000 Command
* [3] 10.5.2.53 (void)
* [3] 10.5.2.54 (void)
@@ -5430,14 +5794,12 @@ de_rr_ded_serv_inf(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U
guint8 (*rr_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len) = {
/* Radio Resource Management Information Elements 10.5.2, most are from 10.5.1 */
-/*
- * [3] 10.5.2.1a BA Range
- */
+
+ de_rr_ba_range, /* [3] 10.5.2.1a BA Range */
de_rr_cell_ch_dsc, /* [3] 10.5.2.1b Cell Channel Description */
-/* [3] 10.5.2.1c BA List Pref
- * [3] 10.5.2.1d UTRAN Frequency List
- * [3] 10.5.2.1e Cell selection indicator after release of all TCH and SDCCH IE
- */
+ de_rr_ba_list_pref, /* [3] 10.5.2.1c BA List Pref */
+ de_rr_utran_freq_list, /* [3] 10.5.2.1d UTRAN Frequency List */
+ de_rr_cell_select_indic, /* [3] 10.5.2.1e Cell selection indicator after release of all TCH and SDCCH IE */
de_rr_cell_dsc, /* 10.5.2.2 RR Cell Description */
de_rr_cell_opt_bcch, /* [3] 10.5.2.3 Cell Options (BCCH) */
de_rr_cell_opt_sacch, /* [3] 10.5.2.3a Cell Options (SACCH) */
@@ -5449,9 +5811,8 @@ guint8 (*rr_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
de_rr_ch_dsc2, /* [3] 10.5.2.5a RR Channel Description 2 */
de_rr_ch_mode, /* [3] 10.5.2.6 Channel Mode */
de_rr_ch_mode2, /* [3] 10.5.2.7 Channel Mode 2 */
-/*
- * [3] 10.5.2.7a UTRAN predefined configuration status information / START-CS / UE CapabilityUTRAN Classmark information element 218
- * [3] 10.5.2.7b (void) */
+ de_rr_utran_cm, /* [3] 10.5.2.7a UTRAN Classmark */
+/* [3] 10.5.2.7b (void) */
de_rr_cm_enq_mask, /* [3] 10.5.2.7c Classmark Enquiry Mask */
/* [3] 10.5.2.7d GERAN Iu Mode Classmark information element */
@@ -5479,7 +5840,7 @@ guint8 (*rr_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
de_rr_l2_pseudo_len, /*[3] 10.5.2.19 L2 Pseudo Length */
de_rr_meas_res, /* [3] 10.5.2.20 Measurement Results */
/*
- * [3] 10.5.2.20a GPRS Measurement Results
+ * [3] (void)
*/
de_rr_mob_all, /* [3] 10.5.2.21 Mobile Allocation */
de_rr_mob_time_diff, /* [3] 10.5.2.21a Mobile Time Difference */
@@ -5487,7 +5848,7 @@ guint8 (*rr_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
/* Pos 30 */
de_rr_mult_all, /* [3] 10.5.2.21b Multislot Allocation */
/*
- * [3] 10.5.2.21c NC mode
+ * [3] 10.5.2.21c (void)
*/
de_rr_neigh_cell_desc, /* [3] 10.5.2.22 Neighbour Cell Description */
de_rr_neigh_cell_desc2, /* [3] 10.5.2.22a Neighbour Cell Description 2 */
@@ -5551,9 +5912,9 @@ guint8 (*rr_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
de_rr_sus_cau, /* [3] 10.5.2.47 Suspension Cause */
/* [3] 10.5.2.48 APDU ID
* [3] 10.5.2.49 APDU Flags
- * [3] 10.5.2.50 APDU Data
- * [3] 10.5.2.51 Handover To UTRAN Command
- * [3] 10.5.2.52 Handover To cdma2000 Command
+ * [3] 10.5.2.50 APDU Data */
+ de_rr_ho_to_utran_cmd, /* [3] 10.5.2.51 Handover To UTRAN Command */
+/* [3] 10.5.2.52 Handover To cdma2000 Command
* [3] 10.5.2.53 (void)
* [3] 10.5.2.54 (void)
* [3] 10.5.2.55 (void)
@@ -5784,7 +6145,7 @@ dtap_rr_ch_rel(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE);
/* 73 BA Range BA Range 10.5.2.1a O TLV 6-7 */
- /* ELEM_OPT_TLV(0x73, GSM_A_PDU_TYPE_RR, DE_BA_RANGE, ""); */
+ ELEM_OPT_TLV(0x73, GSM_A_PDU_TYPE_RR, DE_RR_BA_RANGE, "");
/* 74 Group Channel Description Group Channel Description 10.5.2.14b O TLV 5-13 */
/* ELEM_OPT_TLV(0x74, GSM_A_PDU_TYPE_RR, DE_GRP_CH_DESC, ""); */
@@ -5796,14 +6157,17 @@ dtap_rr_ch_rel(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_RR, DE_RR_GPRS_RESUMPTION, "");
/* 75 BA List Pref BA List Pref 10.5.2.1c O TLV 3-? */
- /* ELEM_OPT_TLV(0x75, GSM_A_PDU_TYPE_RR, DE_BA_LIST_PREF, ""); */
+ ELEM_OPT_TLV(0x75, GSM_A_PDU_TYPE_RR, DE_RR_BA_LIST_PREF, "");
/* 76 UTRAN Freq List 10.5.2.1d O TLV 3-? */
- /* ELEM_OPT_TLV(0x75, GSM_A_PDU_TYPE_RR, DE_UTRAN_FREQ_LIST, ""); */
+ ELEM_OPT_TLV(0x76, GSM_A_PDU_TYPE_RR, DE_RR_UTRAN_FREQ_LIST, "");
/* 62 Cell Channel Description Cell Channel Description 10.5.2.1b O TV 17 */
ELEM_OPT_TV(0x62, GSM_A_PDU_TYPE_RR, DE_RR_CELL_CH_DSC, "");
+ /* 62 Cell selection indicator after release of all TCH and SDCCH 10.5.2.1e O TLV 4-? */
+ ELEM_OPT_TLV(0x77, GSM_A_PDU_TYPE_RR, DE_RR_CELL_SELECT_INDIC, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -5879,6 +6243,25 @@ dtap_rr_mm_cm_change(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
}
/*
+ * 9.1.11 UTRAN Classmark Change
+ */
+static void
+dtap_rr_utran_classmark_change(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ /* UTRAN Classmark 10.5.2.7a M LV 2-? */
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_UTRAN_CM, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
* 9.1.12 Classmark enquiry
*/
static void
@@ -6059,6 +6442,26 @@ dtap_rr_ho_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
}
+
+/*
+ * 9.1.15a Inter System To UTRAN Handover Command
+ */
+static void
+dtap_rr_inter_syst_to_utran_ho_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ /* UTRAN Classmark 10.5.2.51 M LV 2-? */
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_HO_TO_UTRAN_CMD, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
/* 3GPP TS 24.008 version 4.7.0 Release 4
* [3] 9.1.16
*/
@@ -6658,10 +7061,10 @@ static void (*dtap_msg_rr_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
NULL, /* Reserved */
- NULL, /* Utran Classmark Change */
+ dtap_rr_utran_classmark_change, /* Utran Classmark Change */
NULL, /* UE RAB Preconfiguration */
NULL, /* cdma2000 Classmark Change */
- NULL, /* Inter System to UTRAN Handover Command */
+ dtap_rr_inter_syst_to_utran_ho_cmd, /* Inter System to UTRAN Handover Command */
NULL, /* Inter System to cdma2000 Handover Command */
NULL, /* System Information Type 8 */
@@ -6978,6 +7381,36 @@ proto_register_gsm_a_rr(void)
FT_UINT16,BASE_DEC, NULL, 0x0,
"BCCH ARFCN", HFILL }
},
+ { &hf_gsm_a_rr_range_nb,
+ { "Number of Ranges","gsm_a.rr.range_nb",
+ FT_UINT8, BASE_DEC, NULL, 0xff,
+ "Number of Ranges", HFILL }
+ },
+ { &hf_gsm_a_rr_range_lower,
+ { "Range Lower","gsm_a.rr.range_lower",
+ FT_UINT16, BASE_DEC, NULL, 0x0000,
+ "ARFCN used as the lower limit of a range of frequencies to be used by the mobile station in cell selection (Range Lower)", HFILL }
+ },
+ { &hf_gsm_a_rr_range_higher,
+ { "Range Higher","gsm_a.rr.range_higher",
+ FT_UINT16, BASE_DEC, NULL, 0x0000,
+ "ARFCN used as the higher limit of a range of frequencies to be used by the mobile station in cell selection (Range Higher)", HFILL }
+ },
+ { &hf_gsm_a_rr_ba_list_pref_length,
+ { "Length of BA List Pref","gsm_a.rr.ba_list_pref_length",
+ FT_UINT8, BASE_DEC, NULL, 0xff,
+ "Length of BA List Pref", HFILL }
+ },
+ { &hf_gsm_a_rr_ba_freq,
+ { "BA Freq","gsm_a.rr.ba_freq",
+ FT_UINT16, BASE_DEC, NULL, 0x0000,
+ "ARFCN indicating a single frequency to be used by the mobile station in cell selection and reselection (BA Freq)", HFILL }
+ },
+ { &hf_gsm_a_rr_utran_freq_list_length,
+ { "Length of BA List Pref","gsm_a.rr.ba_list_pref_length",
+ FT_UINT8, BASE_DEC, NULL, 0xff,
+ "Length of BA List Pref", HFILL }
+ },
{ &hf_gsm_a_rr_ho_ref_val,
{ "Handover reference value","gsm_a.rr.ho_ref_val",
FT_UINT8,BASE_DEC, NULL, 0x0,
@@ -7503,6 +7936,26 @@ proto_register_gsm_a_rr(void)
FT_UINT8, BASE_DEC, VALS(gsm_a_rr_nch_position_vals), 0x00,
"NCH Position", HFILL }
},
+ { &hf_gsm_a_rr_fdd_uarfcn,
+ { "FDD UARFCN", "gsm_a.rr.fdd_uarfcn",
+ FT_UINT16, BASE_DEC, NULL, 0x0000,
+ "FDD UARFCN", HFILL }
+ },
+ { &hf_gsm_a_rr_bandwidth_fdd,
+ { "Bandwidth FDD", "gsm_a.rr.bandwidth_fdd",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ "Bandwidth FDD", HFILL }
+ },
+ { &hf_gsm_a_rr_tdd_uarfcn,
+ { "TDD UARFCN", "gsm_a.rr.tdd_uarfcn",
+ FT_UINT16, BASE_DEC, NULL, 0x0000,
+ "TDD UARFCN", HFILL }
+ },
+ { &hf_gsm_a_rr_bandwidth_tdd,
+ { "Bandwidth TDD", "gsm_a.rr.bandwidth_tdd",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ "Bandwidth TDD", HFILL }
+ },
{ &hf_gsm_a_rr_qsearch_i,
{ "Qsearch I", "gsm_a.rr.qsearch_i",
FT_UINT8, BASE_DEC, VALS(gsm_a_rr_qsearch_x_vals), 0x00,
@@ -8042,21 +8495,6 @@ proto_register_gsm_a_rr(void)
{ "SI2n Support", "gsm_a.rr.si2n_support",
FT_UINT8, BASE_DEC, VALS(gsm_a_rr_si2n_support_vals), 0x0,
"SI2n Support", HFILL }
- },
- { &hf_gsm_a_rr_t1prime,
- { "T1'", "gsm_a.rr.t1prime",
- FT_UINT8, BASE_DEC, NULL, 0x0,
- "T1'", HFILL }
- },
- { &hf_gsm_a_rr_t3,
- { "T3", "gsm_a.rr.t3",
- FT_UINT8, BASE_DEC, NULL, 0x0,
- "T3", HFILL }
- },
- { &hf_gsm_a_rr_t2,
- { "T2", "gsm_a.rr.t2",
- FT_UINT8, BASE_DEC, NULL, 0x0,
- "T2", HFILL }
}
};
@@ -8105,4 +8543,6 @@ proto_register_gsm_a_rr(void)
void
proto_reg_handoff_gsm_a_rr(void)
{
+ rrc_irat_ho_info_handle = find_dissector("rrc.irat.irat_ho_info");
+ rrc_irat_ho_to_utran_cmd_handle = find_dissector("rrc.irat.ho_to_utran_cmd");
}