aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2005-07-14 21:05:38 +0000
committerAnders Broman <anders.broman@ericsson.com>2005-07-14 21:05:38 +0000
commita5e89b2793b805e6edc7a25c2d9b4aa05c0e1dc2 (patch)
tree28845ab3852be12d26e22d5ca8f8466b48317eb5 /epan
parent98a0c9a590a415d8f27127ec4057892f4833efd7 (diff)
Packet-gtp.c - Fix up decoding of the rest of the IE:s use routines from packet-gsm_a.c
Packet-uma.c Let packet-gsm_a handle som IE dissection. Packet-gsm.a add some IE dissection and export some routines. svn path=/trunk/; revision=14918
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-gsm_a.c526
-rw-r--r--epan/dissectors/packet-gsm_a.h24
-rw-r--r--epan/dissectors/packet-gtp.c405
-rw-r--r--epan/dissectors/packet-uma.c518
4 files changed, 510 insertions, 963 deletions
diff --git a/epan/dissectors/packet-gsm_a.c b/epan/dissectors/packet-gsm_a.c
index 126a86a623..b8fc0e6a7c 100644
--- a/epan/dissectors/packet-gsm_a.c
+++ b/epan/dissectors/packet-gsm_a.c
@@ -547,9 +547,9 @@ static const value_string gsm_dtap_elem_strings[] = {
{ 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)
- * [3] 10.5.2.7c Classmark Enquiry Mask
- * [3] 10.5.2.7d GERAN Iu Mode Classmark information element
+ * [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
* [3] 10.5.2.8 Channel Needed
* [3] 10.5.2.8a (void)
* [3] 10.5.2.8b Channel Request Description 2 */
@@ -637,9 +637,9 @@ static const value_string gsm_dtap_elem_strings[] = {
/* [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
- * [3] 10.5.2.47 Suspension Cause
- * [3] 10.5.2.48 APDU ID
+ * [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
@@ -980,7 +980,7 @@ static const value_string oddevenind_vals[] = {
};
/* RR cause value (octet 2) TS 44.018 6.11.0*/
-static const value_string RR_cause_vals[] = {
+static const value_string gsm_a_rr_RR_cause_vals[] = {
{ 0, "Normal event"},
{ 1, "Abnormal release, unspecified"},
{ 2, "Abnormal release, channel unacceptable"},
@@ -1003,17 +1003,21 @@ static const value_string RR_cause_vals[] = {
{ 0x6f, "Protocol error unspecified"},
{ 0, NULL }
};
-
-static const gchar *cell_disc_str[] = {
- "The whole Cell Global Identification, CGI, is used to identify the cells",
- "Location Area Code, LAC, and Cell Identify, CI, is used to identify the cells",
- "Cell Identity, CI, is used to identify the cells",
- "No cell is associated with the transaction",
- "Location Area Identification, LAI, is used to identify all cells within a Location Area",
- "Location Area Code, LAC, is used to identify all cells within a location area",
- "All cells on the BSS are identified"
+/* Cell identification discriminator */
+static const value_string gsm_a_rr_cell_id_disc_vals[] = {
+ { 0, "The whole Cell Global Identification, CGI, is used to identify the cells."},
+ { 1, "Location Area Code, LAC, and Cell Identify, CI, is used to identify the cells."},
+ { 2, "Cell Identity, CI, is used to identify the cells."},
+ { 3, "No cell is associated with the transaction."},
+ { 4, "Location Area Identification, LAI, is used to identify all cells within a Location Area."},
+ { 5, "Location Area Code, LAC, is used to identify all cells within a location area."},
+ { 6, "All cells on the BSS are identified."},
+ { 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."},
+ { 0, NULL }
};
-#define NUM_CELL_DISC_STR (sizeof(cell_disc_str)/sizeof(gchar *))
+
#define DTAP_PD_MASK 0x0f
#define DTAP_SKIP_MASK 0xf0
@@ -1113,6 +1117,17 @@ static int hf_gsm_a_rr_tlli = -1;
static int hf_gsm_a_rr_target_mode = -1;
static int hf_gsm_a_rr_group_cipher_key_number = -1;
static int hf_gsm_a_rr_last_segment = -1;
+static int hf_gsm_a_gmm_split_on_ccch = -1;
+static int hf_gsm_a_gmm_non_drx_timer = -1;
+static int hf_gsm_a_gmm_cn_spec_drs_cycle_len_coef = -1;
+static int hf_gsm_a_rr_RR_cause = -1;
+static int hf_gsm_a_be_cell_id_disc = -1;
+static int hf_gsm_a_be_rnc_id = -1;
+static int hf_gsm_a_rr_cm_cng_msg_req = -1;
+static int hf_gsm_a_rr_utran_cm_cng_msg_req = -1;
+static int hf_gsm_a_rr_cdma200_cm_cng_msg_req = -1;
+static int hf_gsm_a_rr_geran_iu_cm_cng_msg_req = -1;
+static int hf_gsm_a_rr_suspension_cause = -1;
/* Initialize the subtree pointers */
static gint ett_bssmap_msg = -1;
@@ -2214,6 +2229,9 @@ be_cell_id_aux(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
/* FALLTHRU */
case 0x04:
+ /* FALLTHRU */
+
+ case 0x08: /* For intersystem handover from GSM to UMTS or cdma2000: */
octs[0] = tvb_get_guint8(tvb, curr_offset);
octs[1] = tvb_get_guint8(tvb, curr_offset + 1);
octs[2] = tvb_get_guint8(tvb, curr_offset + 2);
@@ -2232,19 +2250,37 @@ be_cell_id_aux(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
case 0x01:
case 0x05:
+ case 0x0a: /*For intersystem handover from GSM to UMTS or cdma2000: */
/* LAC */
value = tvb_get_ntohs(tvb, curr_offset);
- proto_tree_add_uint(tree, hf_gsm_a_cell_lac, tvb,
- curr_offset, 2, value);
+ proto_tree_add_item(tree, hf_gsm_a_cell_lac, tvb, curr_offset, 2, FALSE);
curr_offset += 2;
sprintf(add_string, " - LAC (0x%04x)", value);
- if ((disc == 0x04) || (disc == 0x05)) break;
+ case 0x09: /* For intersystem handover from GSM to UMTS or cdma2000: */
+
+ if ((disc == 0x08) ||(disc == 0x09) || (disc == 0x0a)){
+ /* RNC-ID */
+ value = tvb_get_ntohs(tvb, curr_offset);
+ proto_tree_add_item(tree, hf_gsm_a_be_rnc_id, tvb, curr_offset, 2, FALSE);
+
+ if (add_string[0] == '\0')
+ {
+ sprintf(add_string, " - RNC-ID (%u)", value);
+ }
+ else
+ {
+ sprintf(add_string, "%s/RNC-ID (%u)", add_string, value);
+ }
+ break;
+ }
+
+ if ((disc == 0x04) || (disc == 0x05) || (disc == 0x08)) break;
/* FALLTHRU */
@@ -2300,25 +2336,8 @@ be_cell_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
"%s : Spare",
a_bigbuf);
- disc = oct & 0x0f;
-
- if (disc >= (gint) NUM_CELL_DISC_STR)
- {
- str = "Unknown";
- }
- else
- {
- str = cell_disc_str[disc];
- }
-
- other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Cell Identification Discriminator: (%u) %s",
- a_bigbuf,
- disc,
- str);
-
+ proto_tree_add_item(tree, hf_gsm_a_be_cell_id_disc, tvb, curr_offset, 1, FALSE);
+ disc = oct&0x0f;
curr_offset++;
NO_MORE_DATA_CHECK(len);
@@ -2500,7 +2519,7 @@ be_down_dtx_flag(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
/*
* [2] 3.2.2.27
*/
-static guint8
+guint8
be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint8 oct;
@@ -2522,25 +2541,8 @@ be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
"%s : Spare",
a_bigbuf);
- disc = oct & 0x0f;
-
- if (disc >= (gint) NUM_CELL_DISC_STR)
- {
- str = "Unknown";
- }
- else
- {
- str = cell_disc_str[disc];
- }
-
- other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Cell Identification Discriminator: (%u) %s",
- a_bigbuf,
- disc,
- str);
-
+ disc = oct & 0x0f;
+ proto_tree_add_item(tree, hf_gsm_a_be_cell_id_disc, tvb, curr_offset, 1, FALSE);
curr_offset++;
NO_MORE_DATA_CHECK(len);
@@ -3073,9 +3075,9 @@ typedef enum
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)
- * [3] 10.5.2.7c Classmark Enquiry Mask
- * [3] 10.5.2.7d GERAN Iu Mode Classmark information element
+ * [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
* [3] 10.5.2.8 Channel Needed
* [3] 10.5.2.8a (void)
* [3] 10.5.2.8b Channel Request Description 2 */
@@ -3086,15 +3088,6 @@ typedef enum
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 */
DE_RR_FREQ_LIST, /* [3] 10.5.2.13 Frequency List */
-
-/* [3] 10.5.2.13.1 General description
- * [3] 10.5.2.13.2 Bit map 0 format
- * [3] 10.5.2.13.3 Range 1024 format
- * [3] 10.5.2.13.4 Range 512 format
- * [3] 10.5.2.13.5 Range 256 format
- * [3] 10.5.2.13.6 Range 128 format
- * [3] 10.5.2.13.7 Variable bit map format
- */
DE_RR_FREQ_SHORT_LIST, /* [3] 10.5.2.14 Frequency Short List */
DE_RR_FREQ_SHORT_LIST2, /* [3] 10.5.2.14a Frequency Short List 2 */
/* [3] 10.5.2.14b Group Channel Description
@@ -3175,9 +3168,9 @@ typedef enum
/* [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
- * [3] 10.5.2.47 Suspension Cause
- * [3] 10.5.2.48 APDU ID
+ * [3] 10.5.2.46 Extended Measurement Frequency List */
+ 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
@@ -3318,6 +3311,7 @@ de_cell_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
curr_offset = offset;
curr_offset +=
+ /* Is this correct???? - Anders Broman */
be_cell_id_aux(tvb, tree, offset, len, add_string, 0x02);
/* no length check possible */
@@ -3328,7 +3322,7 @@ de_cell_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
/*
* [3] 10.5.1.3
*/
-static guint8
+guint8
de_lai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint8 octs[3];
@@ -3343,12 +3337,6 @@ de_lai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_st
add_string = add_string;
curr_offset = offset;
- octs[0] = tvb_get_guint8(tvb, curr_offset);
- octs[1] = tvb_get_guint8(tvb, curr_offset + 1);
- octs[2] = tvb_get_guint8(tvb, curr_offset + 2);
-
- mcc_mnc_aux(octs, mcc, mnc);
-
item =
proto_tree_add_text(tree,
tvb, curr_offset, 5,
@@ -3356,6 +3344,13 @@ de_lai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_st
subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_LAI]);
+ octs[0] = tvb_get_guint8(tvb, curr_offset);
+ octs[1] = tvb_get_guint8(tvb, curr_offset + 1);
+ octs[2] = tvb_get_guint8(tvb, curr_offset + 2);
+
+ mcc_mnc_aux(octs, mcc, mnc);
+
+
proto_tree_add_text(subtree,
tvb, curr_offset, 3,
"Mobile Country Code (MCC): %s, Mobile Network Code (MNC): %s",
@@ -3384,7 +3379,7 @@ de_lai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_st
/*
* [3] 10.5.1.4
*/
-static guint8
+guint8
de_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint8 oct;
@@ -3599,21 +3594,15 @@ de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
/*
* [3] 10.5.1.6
*/
-static guint8
+guint8
de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
- guint8 oct;
guint32 curr_offset;
add_string = add_string;
curr_offset = offset;
- oct = tvb_get_guint8(tvb, curr_offset);
- other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Spare",
- a_bigbuf);
+ proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, FALSE);
proto_tree_add_item(tree, hf_gsm_a_MSC_rev, tvb, curr_offset, 1, FALSE);
@@ -3627,13 +3616,7 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
NO_MORE_DATA_CHECK(len);
- oct = tvb_get_guint8(tvb, curr_offset);
-
- other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Spare",
- a_bigbuf);
+ proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, FALSE);
proto_tree_add_item(tree, hf_gsm_a_ps_sup_cap, tvb, curr_offset, 1, FALSE);
@@ -3652,8 +3635,6 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
NO_MORE_DATA_CHECK(len);
- oct = tvb_get_guint8(tvb, curr_offset);
-
/* CM3 (octet 5, bit 8) */
proto_tree_add_item(tree, hf_gsm_a_CM3, tvb, curr_offset, 1, FALSE);
/* LCS VA capability (LCS value added location request notification capability) (octet 5,bit 6) */
@@ -3934,7 +3915,7 @@ de_rr_cell_ch_dsc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
/*
* [3] 10.5.2.2 Cell Description
*/
-static guint8
+guint8
de_rr_cell_dsc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
proto_tree *subtree;
@@ -4036,7 +4017,7 @@ static const value_string gsm_a_rr_channel_mode_vals[] = {
{ 0, NULL }
};
-static guint8
+guint8
de_rr_ch_mode(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint32 curr_offset;
@@ -4085,7 +4066,58 @@ de_rr_ch_mode2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
/*
* [3] 10.5.2.7a UTRAN Classmark information element
* [3] 10.5.2.7b (void)
+ */
+/*
* [3] 10.5.2.7c Classmark Enquiry Mask
+ * Bit 8:
+ * 0 CLASSMARK CHANGE message is requested
+ * 1 CLASSMARK CHANGE message is not requested
+ * Bits 7-5 . 5
+ * 000 UTRAN CLASSMARK CHANGE message including status on predefined configurations (i.e. Sequence Description) is requested
+ * 111 UTRAN CLASSMARK CHANGE message including status on predefined configurations (i.e. Sequence Description) is not requested.
+ * All other values shall not be sent. If received, they shall be interpreted as '000'.
+ * Bit 4:
+ * 0 CDMA2000 CLASSMARK CHANGE message requested
+ * 1 CDMA2000 CLASSMARK CHANGE message not requested.
+ * Bit 3:
+ * 0 GERAN IU MODE CLASSMARK CHANGE message requested
+ * 1 GERAN IU MODE CLASSMARK CHANGE message not requested.
+ * Bits 2 - 1: spare(0).
+ */
+static const true_false_string gsm_a_msg_req_value = {
+ "message is not requested",
+ "message is requested"
+};
+static const value_string gsm_a_rr_utran_cm_cng_msg_req_vals[] = {
+{ 0x0, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
+{ 0x1, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
+{ 0x2, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
+{ 0x3, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
+{ 0x4, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
+{ 0x5, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
+{ 0x6, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
+{ 0x7, "message including status on predefined configurations (i.e. Sequence Description) is not requested."},
+ { 0, NULL }
+};
+guint8
+de_rr_cm_enq_mask(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+ guint32 curr_offset;
+
+ len = len;
+ add_string = add_string;
+ curr_offset = offset;
+
+ proto_tree_add_item(tree, hf_gsm_a_rr_cm_cng_msg_req, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_rr_utran_cm_cng_msg_req, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_rr_cdma200_cm_cng_msg_req, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_rr_geran_iu_cm_cng_msg_req, tvb, curr_offset, 1, FALSE);
+
+ curr_offset = curr_offset + 1;
+
+ return(curr_offset - offset);
+}
+/*
* [3] 10.5.2.8 Channel Needed
* [3] 10.5.2.8a Channel Request Description
* [3] 10.5.2.8b Channel Request Description 2
@@ -4105,7 +4137,7 @@ static const value_string gsm_a_rr_sc_vals[] = {
* 4 3 2
*/
-static guint8
+guint8
de_rr_cip_mode_set(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint32 curr_offset;
@@ -4584,24 +4616,16 @@ de_rr_pow_cmd_and_acc_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guin
/*
* [3] 10.5.2.31
*/
-static guint8
+guint8
de_rr_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
- guint8 oct;
guint32 curr_offset;
len = len;
add_string = add_string;
curr_offset = offset;
- oct = tvb_get_guint8(tvb, curr_offset);
-
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "RR Cause value: 0x%02x (%u) %s",
- oct,
- oct,
- val_to_str(oct, RR_cause_vals, "Reserved, treat as Normal event"));
+ proto_tree_add_item(tree, hf_gsm_a_rr_RR_cause, tvb, curr_offset, 1, FALSE);
curr_offset++;
@@ -4730,8 +4754,9 @@ de_rr_time_diff(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
}
/*
* [3] 10.5.2.41a TLLI
+ * The TLLI is encoded as a binary number with a length of 4 octets. TLLI is defined in 3GPP TS 23.003
*/
-static guint8
+guint8
de_rr_tlli(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint32 curr_offset;
@@ -4801,7 +4826,36 @@ de_rr_vgcs_cip_par(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, g
* [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
+ */
+/*
* [3] 10.5.2.47 Suspension Cause
+ */
+/*Suspension cause value (octet 2)*/
+static const value_string gsm_a_rr_suspension_cause_vals[] = {
+ { 0, "Emergency call, mobile originating call or call re-establishment"},
+ { 1, "Location Area Update"},
+ { 2, "MO Short message service"},
+ { 3, "Other procedure which can be completed with an SDCCH"},
+ { 4, "MO Voice broadcast or group call"},
+ { 5, "Mobile terminating CS connection"},
+ { 6, "DTM not supported in the cell"},
+ { 0, NULL }
+};
+guint8
+de_rr_sus_cau(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+ guint32 curr_offset;
+
+ len = len;
+ add_string = add_string;
+ curr_offset = offset;
+
+ proto_tree_add_item(tree, hf_gsm_a_rr_suspension_cause, tvb, curr_offset, 1, FALSE);
+
+ curr_offset = curr_offset + 1;
+ return(curr_offset - offset);
+}
+/*
* [3] 10.5.2.48 APDU ID
* [3] 10.5.2.49 APDU Flags
* [3] 10.5.2.50 APDU Data
@@ -8242,8 +8296,67 @@ de_gmm_detach_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, g
/*
* [7] 10.5.5.6
+ *
+ * SPLIT on CCCH, octet 3 (bit 4)
+ * 0 Split pg cycle on CCCH is not supported by the mobile station
+ * 1 Split pg cycle on CCCH is supported by the mobile station
*/
-static guint8
+static const true_false_string gsm_a_gmm_split_on_ccch_value = {
+ "Split pg cycle on CCCH is supported by the mobile station",
+ "Split pg cycle on CCCH is not supported by the mobile station"
+};
+
+/* non-DRX timer, octet 3
+ * bit
+ * 3 2 1
+ */
+static const value_string gsm_a_gmm_non_drx_timer_strings[] = {
+ { 0x00, "no non-DRX mode after transfer state" },
+ { 0x01, "max. 1 sec non-DRX mode after transfer state" },
+ { 0x02, "max. 2 sec non-DRX mode after transfer state" },
+ { 0x03, "max. 4 sec non-DRX mode after transfer state" },
+ { 0x04, "max. 8 sec non-DRX mode after transfer state" },
+ { 0x05, "max. 16 sec non-DRX mode after transfer state" },
+ { 0x06, "max. 32 sec non-DRX mode after transfer state" },
+ { 0x07, "max. 64 sec non-DRX mode after transfer state" },
+ { 0, NULL },
+};
+/*
+ * CN Specific DRX cycle length coefficient, octet 3
+ * bit
+ * 8 7 6 5 Iu mode specific
+ * 0 0 0 0 CN Specific DRX cycle length coefficient not specified by the MS, ie. the
+ * system information value 'CN domain specific DRX cycle length' is used.
+ * (Ref 3GPP TS 25.331)
+ * 0 1 1 0 CN Specific DRX cycle length coefficient 6
+ * 0 1 1 1 CN Specific DRX cycle length coefficient 7
+ * 1 0 0 0 CN Specific DRX cycle length coefficient 8
+ * 1 0 0 1 CN Specific DRX cycle length coefficient 9
+ * All other values shall be interpreted as "CN Specific DRX cycle length coefficient not
+ * specified by the MS " by this version of the protocol.
+ * NOTE: In Iu mode this field (octet 3 bits 8 to 5) is used, but was spare in earlier
+ * versions of this protocol.
+ */
+static const value_string gsm_a_gmm_cn_spec_drs_cycle_len_coef_strings[] = {
+ { 0x00, "CN Specific DRX cycle length coefficient not specified by the MS" },
+ { 0x01, "CN Specific DRX cycle length coefficient not specified by the MS" },
+ { 0x02, "CN Specific DRX cycle length coefficient not specified by the MS" },
+ { 0x03, "CN Specific DRX cycle length coefficient not specified by the MS" },
+ { 0x04, "CN Specific DRX cycle length coefficient not specified by the MS" },
+ { 0x05, "CN Specific DRX cycle length coefficient not specified by the MS" },
+ { 0x06, "CN Specific DRX cycle length coefficient 6" },
+ { 0x07, "CN Specific DRX cycle length coefficient 7" },
+ { 0x08, "CN Specific DRX cycle length coefficient 8" },
+ { 0x09, "CN Specific DRX cycle length coefficient 9" },
+ { 0x0a, "CN Specific DRX cycle length coefficient not specified by the MS" },
+ { 0x0b, "CN Specific DRX cycle length coefficient not specified by the MS" },
+ { 0x0c, "CN Specific DRX cycle length coefficient not specified by the MS" },
+ { 0x0d, "CN Specific DRX cycle length coefficient not specified by the MS" },
+ { 0x0e, "CN Specific DRX cycle length coefficient not specified by the MS" },
+ { 0x0f, "CN Specific DRX cycle length coefficient not specified by the MS" },
+ { 0, NULL },
+};
+guint8
de_gmm_drx_param(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint8 oct;
@@ -8251,14 +8364,14 @@ de_gmm_drx_param(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
gchar *str;
gchar str_val[]="00";
proto_item *tf = NULL;
- proto_tree *tf_tree = NULL;
+ proto_tree *tf_tree = NULL;
len = len;
add_string = add_string;
curr_offset = offset;
tf = proto_tree_add_text(tree,
- tvb, curr_offset, 1,
+ tvb, curr_offset, 2,
"DRX Parameter");
tf_tree = proto_item_add_subtree(tf, ett_gmm_drx );
@@ -8314,54 +8427,9 @@ de_gmm_drx_param(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
str);
curr_offset++;
-
- oct = tvb_get_guint8(tvb, curr_offset);
-
- switch(oct&8)
- {
- case 8: str="Split pg cycle on CCCH is not supported by the mobile station"; break;
- default: str="Split pg cycle on CCCH is supported by the mobile station";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset, 1,
- "Split on CCCH: (%u) %s",
- (oct>>3&1),
- str);
-
- switch(oct&7)
- {
- case 0: str="no non-DRX mode after transfer state"; break;
- case 1: str="max. 1 sec non-DRX mode after transfer state"; break;
- case 2: str="max. 2 sec non-DRX mode after transfer state"; break;
- case 3: str="max. 4 sec non-DRX mode after transfer state"; break;
- case 4: str="max. 8 sec non-DRX mode after transfer state"; break;
- case 5: str="max. 16 sec non-DRX mode after transfer state"; break;
- case 6: str="max. 32 sec non-DRX mode after transfer state"; break;
- case 7: str="max. 64 sec non-DRX mode after transfer state"; break;
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset, 1,
- "Non-DRX timer: (%u) %s",
- oct&7,
- str);
-
- switch(oct>>4)
- {
- case 0: str="CN Specific DRX cycle length coefficient not specifiedb by the MS, ie. the system information value >CN domain specific DRX cycle length< is used.(Ref 3GPP TS 25.331)"; break;
- case 6: str="CN Specific DRX cycle length coefficient 6"; break;
- case 7: str="CN Specific DRX cycle length coefficient 7"; break;
- case 8: str="CN Specific DRX cycle length coefficient 8"; break;
- case 9: str="CN Specific DRX cycle length coefficient 9"; break;
- default: str="CN Specific DRX cycle length coefficient not specified by the MS";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset, 1,
- "CN Specific DRX cycle length coefficient: (%u) %s",
- oct>>4,
- str);
+ proto_tree_add_item(tf_tree, hf_gsm_a_gmm_cn_spec_drs_cycle_len_coef, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tf_tree, hf_gsm_a_gmm_split_on_ccch, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tf_tree, hf_gsm_a_gmm_non_drx_timer, tvb, curr_offset, 1, FALSE);
curr_offset++;
@@ -8638,7 +8706,7 @@ de_gmm_rec_npdu_lst(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len,
/*
* [7] 10.5.5.12
*/
-static guint8
+guint8
de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint8 oct;
@@ -8680,6 +8748,7 @@ de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
oct = tvb_get_guint8(tvb, curr_offset);
curr_len--;
+ /* bit 8 */
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"GEA1: (%u) %s",
@@ -8687,6 +8756,7 @@ de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
answer_gea[oct>>7]);
oct<<=1;
+ /* bit 7 */
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"SM capabilities via dedicated channels: (%u) %s",
@@ -8694,6 +8764,7 @@ de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
answer_smdch[oct>>7]);
oct<<=1;
+ /* bit 6 */
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"SM capabilities via GPRS channels: (%u) %s",
@@ -8701,13 +8772,15 @@ de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
answer_smgprs[oct>>7]);
oct<<=1;
+ /* bit 5 */
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"UCS2 support: (%u) %s",
oct>>7,
answer_ucs2[oct>>7]);
oct<<=1;
-
+
+ /* bit 4 3 */
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"SS Screening Indicator: (%u) %s",
@@ -8715,6 +8788,7 @@ de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
answer_ssid[oct>>6]);
oct<<=2;
+ /* bit 2 */
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"SoLSA Capability: (%u) %s",
@@ -8722,6 +8796,7 @@ de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
answer_solsa[oct>>7]);
oct<<=1;
+ /* bit 1 */
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"Revision level indicator: (%u) %s",
@@ -10239,7 +10314,7 @@ de_gmm_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
/*
* [7] 10.5.5.15
*/
-static guint8
+guint8
de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint32 mcc;
@@ -10247,6 +10322,8 @@ de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
guint32 lac;
guint32 rac;
guint32 curr_offset;
+ proto_item *tf = NULL;
+ proto_tree *gmm_rai_tree = NULL;
len = len;
add_string = add_string;
@@ -10263,10 +10340,10 @@ de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
lac |= tvb_get_guint8(tvb, curr_offset+4);
rac = tvb_get_guint8(tvb, curr_offset+5);
- proto_tree_add_text(tree,
- tvb, curr_offset, 6,
- "Routing area identification: %x-%x-%x-%x",
- mcc,mnc,lac,rac);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 6,
+ "Routing area identification: %x-%x-%x-%x",
+ mcc,mnc,lac,rac);
curr_offset+=6;
@@ -11865,13 +11942,24 @@ de_sm_tear_down(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
/*
* [7] 10.5.6.11
*/
-static guint8
+/* Packet Flow Identifier value (octet 3) */
+static const value_string gsm_a_packet_flow_id_vals[] = {
+ { 0, "Best Effort"},
+ { 1, "Signaling"},
+ { 2, "SMS"},
+ { 3, "TOM8"},
+ { 4, "reserved"},
+ { 5, "reserved"},
+ { 6, "reserved"},
+ { 7, "reserved"},
+ { 0, NULL }
+};
+guint8
de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint32 curr_offset;
guint curr_len;
guchar oct;
- gchar *str;
curr_len = len;
add_string = add_string;
@@ -11879,22 +11967,10 @@ de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
oct = tvb_get_guint8(tvb, curr_offset);
- switch ( oct&0x7f )
- {
- case 0x00: str="Best Effort"; break;
- case 0x01: str="Signaling"; break;
- case 0x02: str="SMS"; break;
- case 0x03: str="TOM8"; break;
- case 0x04: str="reserved"; break;
- case 0x05: str="reserved"; break;
- case 0x06: str="reserved"; break;
- case 0x07: str="reserved"; break;
- default: str="dynamically assigned"; break;
- }
-
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "Packet Flow Identifier: (%u) %s",oct&0x7f,str);
+ "Packet Flow Identifier: (%u) %s",oct&0x7f,
+ val_to_str(oct&0x7f, gsm_a_packet_flow_id_vals, "dynamically assigned (%u)"));
curr_offset+= curr_len;
@@ -12340,9 +12416,10 @@ static guint8 (*dtap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
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)
- * [3] 10.5.2.7c Classmark Enquiry Mask
- * [3] 10.5.2.7d GERAN Iu Mode Classmark information element
+ * [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
* [3] 10.5.2.8 Channel Needed
* [3] 10.5.2.8a (void)
* [3] 10.5.2.8b Channel Request Description 2 */
@@ -12430,9 +12507,9 @@ static guint8 (*dtap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
/* [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
- * [3] 10.5.2.47 Suspension Cause
- * [3] 10.5.2.48 APDU ID
+ * [3] 10.5.2.46 Extended Measurement Frequency List */
+ 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
@@ -14830,7 +14907,7 @@ dtap_mm_tmsi_realloc_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
/*
* [3] 9.1.15
*/
-static void
+void
dtap_rr_ho_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
{
guint32 curr_offset;
@@ -18209,7 +18286,7 @@ proto_register_gsm_a(void)
},
{ &hf_gsm_a_b8spare,
{ "Spare","gsm_a.spareb8",
- FT_BOOLEAN,8, NULL, 0x80,
+ FT_UINT8,BASE_DEC, NULL, 0x80,
"Spare", HFILL }
},
{ &hf_gsm_a_rr_pow_cmd_atc,
@@ -18319,9 +18396,64 @@ proto_register_gsm_a(void)
"Group cipher key number", HFILL }
},
{ &hf_gsm_a_rr_last_segment,
- { "Last Segment ","gsm_a.rr.last_segment",
+ { "Last Segment","gsm_a.rr.last_segment",
FT_BOOLEAN,8, TFS(&gsm_a_rr_last_segment_value), 0x01,
- "Last Segment ", HFILL }
+ "Last Segment", HFILL }
+ },
+ { &hf_gsm_a_gmm_split_on_ccch,
+ { "SPLIT on CCCH","gsm_a.gmm.split_on_ccch",
+ FT_BOOLEAN,8, TFS(&gsm_a_gmm_split_on_ccch_value), 0x08,
+ "SPLIT on CCCH", HFILL }
+ },
+ { &hf_gsm_a_gmm_non_drx_timer,
+ { "Non-DRX timer","gsm_a.gmm.non_drx_timer",
+ FT_UINT8,BASE_DEC, VALS(gsm_a_gmm_non_drx_timer_strings), 0x07,
+ "Non-DRX timer", HFILL }
+ },
+ { &hf_gsm_a_gmm_cn_spec_drs_cycle_len_coef,
+ { "CN Specific DRX cycle length coefficient","gsm_a.gmm.cn_spec_drs_cycle_len_coef",
+ FT_UINT8,BASE_DEC, VALS(gsm_a_gmm_cn_spec_drs_cycle_len_coef_strings), 0xf0,
+ "CN Specific DRX cycle length coefficient", HFILL }
+ },
+ { &hf_gsm_a_rr_RR_cause,
+ { "RR cause value","gsm_a.rr.RRcause",
+ FT_UINT8,BASE_DEC, VALS(gsm_a_rr_RR_cause_vals), 0x0,
+ "RR cause value", HFILL }
+ },
+ { &hf_gsm_a_be_cell_id_disc,
+ { "Cell identification discriminator","gsm_a.be.cell_id_disc",
+ FT_UINT8,BASE_DEC, VALS(gsm_a_rr_cell_id_disc_vals), 0x0f,
+ "Cell identificationdiscriminator", HFILL }
+ },
+ { &hf_gsm_a_be_rnc_id,
+ { "RNC-ID","gsm_a.be.rnc_id",
+ FT_UINT16,BASE_DEC, NULL, 0x0,
+ "RNC-ID", HFILL }
+ },
+ { &hf_gsm_a_rr_cm_cng_msg_req,
+ { "CLASSMARK CHANGE","gsm_a.rr_cm_cng_msg_req",
+ FT_BOOLEAN,8, TFS(&gsm_a_msg_req_value), 0x80,
+ "CLASSMARK CHANGE ", HFILL }
+ },
+ { &hf_gsm_a_rr_utran_cm_cng_msg_req,
+ { "UTRAN CLASSMARK CHANGE","gsm_a.rr_utran_cm_cng_msg_req",
+ FT_UINT8,BASE_DEC, VALS(gsm_a_rr_utran_cm_cng_msg_req_vals), 0x70,
+ "UTRAN CLASSMARK CHANGE", HFILL }
+ },
+ { &hf_gsm_a_rr_cdma200_cm_cng_msg_req,
+ { "CDMA2000 CLASSMARK CHANGE ","gsm_a.rr_cdma200_cm_cng_msg_req",
+ FT_BOOLEAN,8, TFS(&gsm_a_msg_req_value), 0x08,
+ "CDMA2000 CLASSMARK CHANGE ", HFILL }
+ },
+ { &hf_gsm_a_rr_geran_iu_cm_cng_msg_req,
+ { "GERAN IU MODE CLASSMARK CHANGE","gsm_a.rr_geran_iu_cm_cng_msg_req",
+ FT_BOOLEAN,8, TFS(&gsm_a_msg_req_value), 0x04,
+ "GERAN IU MODE CLASSMARK CHANGE", HFILL }
+ },
+ { &hf_gsm_a_rr_suspension_cause,
+ { "Suspension cause value","gsm_a.rr.suspension_cause",
+ FT_UINT8,BASE_DEC, VALS(gsm_a_rr_suspension_cause_vals), 0x0,
+ "Suspension cause value", HFILL }
},
};
diff --git a/epan/dissectors/packet-gsm_a.h b/epan/dissectors/packet-gsm_a.h
index b222cba9c0..8480e1ad5f 100644
--- a/epan/dissectors/packet-gsm_a.h
+++ b/epan/dissectors/packet-gsm_a.h
@@ -59,7 +59,31 @@ typedef struct _gsm_a_tap_rec_t {
} gsm_a_tap_rec_t;
void dissect_bssmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+
+guint8 de_lai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+guint8 de_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+
+guint8 be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+
+guint8 de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+
guint8 de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+guint8 de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+
+guint8 de_gmm_drx_param(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+guint8 de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+guint8 de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+
+guint8 de_rr_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+guint8 de_rr_cip_mode_set(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+guint8 de_rr_cell_dsc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+guint8 de_rr_ch_mode(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+guint8 de_rr_cm_enq_mask(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+guint8 de_rr_tlli(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+guint8 de_rr_sus_cau(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string);
+
+void dtap_rr_ho_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len);
+
/*
* the following allows TAP code access to the messages
* without having to duplicate it. With MSVC and a
diff --git a/epan/dissectors/packet-gtp.c b/epan/dissectors/packet-gtp.c
index c1aa3f3c6a..4c4877463d 100644
--- a/epan/dissectors/packet-gtp.c
+++ b/epan/dissectors/packet-gtp.c
@@ -40,6 +40,8 @@
#include "packet-gtp.h"
#include "packet-ipv6.h"
#include "packet-ppp.h"
+#include "packet-bssap.h"
+#include "packet-gsm_a.h"
static dissector_table_t ppp_subdissector_table;
@@ -171,6 +173,13 @@ static int hf_gtp_user_addr_pdp_org = -1;
static int hf_gtp_user_addr_pdp_type = -1;
static int hf_gtp_user_ipv4 = -1;
static int hf_gtp_user_ipv6 = -1;
+static int hf_gtp_security_mode = -1;
+static int hf_gtp_no_of_vectors = -1;
+static int hf_gtp_cipher_algorithm = -1;
+static int hf_gtp_cksn_ksi = -1;
+static int hf_gtp_cksn = -1;
+static int hf_gtp_ksi = -1;
+
/* Initialize the subtree pointers */
static gint ett_gtp = -1;
@@ -203,7 +212,8 @@ static gint ett_gtp_rel_pack = -1;
static gint ett_gtp_can_pack = -1;
static gint ett_gtp_data_resp = -1;
static gint ett_gtp_priv_ext = -1;
-
+static gint ett_gtp_net_cap = -1;
+
static gboolean gtp_tpdu = TRUE;
static gboolean gtp_over_tcp = TRUE;
static gboolean gtp_etsi_order = FALSE;
@@ -225,6 +235,11 @@ static const value_string ver_types[] = {
{ 7, "None" },
{ 0, NULL }
};
+static const value_string pt_types[] = {
+ { 0, "GTP'" },
+ { 1, "GTP" },
+ { 0, NULL }
+};
#define GTP_PT_MASK 0x10
#define GTP_SPARE1_MASK 0x0E
@@ -984,6 +999,19 @@ static const value_string mm_sec_modep[] = {
{ 0, NULL }
};
+static const value_string gtp_cipher_algorithm[] = {
+ { 0, "No ciphering" },
+ { 1, "GEA/1" },
+ { 2, "GEA/2" },
+ { 3, "GEA/3" },
+ { 4, "GEA/4" },
+ { 5, "GEA/5" },
+ { 6, "GEA/6" },
+ { 7, "GEA/7" },
+ { 0, NULL }
+};
+
+
#define MM_PROTO_GROUP_CALL_CONTROL 0x00
#define MM_PROTO_BROADCAST_CALL_CONTROL 0x01
#define MM_PROTO_PDSS1 0x02
@@ -996,192 +1024,6 @@ static const value_string mm_sec_modep[] = {
#define MM_PROTO_SESSION_MGMT 0x0A
#define MM_PROTO_NON_CALL_RELATED 0x0B
-static const value_string mm_proto_disc[] = {
- { MM_PROTO_GROUP_CALL_CONTROL, "Group call control" },
- { MM_PROTO_BROADCAST_CALL_CONTROL, "Broadcast call control" },
- { MM_PROTO_PDSS1, "PDSS1" },
- { MM_PROTO_CALL_CONTROL, "Call control; call related SS messages" },
- { MM_PROTO_PDSS2, "PDSS2" },
- { MM_PROTO_MM_NON_GPRS, "Mobility Management messages for non-GPRS services" },
- { MM_PROTO_RR_MGMT, "Radio Resource management messages" },
- { MM_PROTO_MM_GPRS, "Mobility Management messages for GPRS services" },
- { MM_PROTO_SMS, "SMS" },
- { MM_PROTO_SESSION_MGMT, "Session Management messages" },
- { MM_PROTO_NON_CALL_RELATED, "Non-call related SS messages" },
- { 0, NULL }
-};
-
-static const value_string mm_rr_mess[] = {
- { 0x3C, "RR initialization request" },
- { 0x3B, "Additional assignment" },
- { 0x3F, "Immediate assignment" },
- { 0x39, "Immediate assignment extended" },
- { 0x3A, "Immediate assignment reject" },
-
- { 0x35, "Ciphering mode command" },
- { 0x32, "Ciphering mode complete" },
-
- { 0x30, "Configuration change command" },
- { 0x31, "Configuration change ack" },
- { 0x33, "Configuration change reject" },
-
- { 0x2E, "Assignment command" },
- { 0x29, "Assignment complete" },
- { 0x2F, "Assigment failure" },
- { 0x2B, "Handover command" },
- { 0x2C, "Handover complete" },
- { 0x28, "Handover failure" },
- { 0x2D, "Physical information" },
-
- { 0x08, "RR-cell change order" },
- { 0x23, "PDCH assignment command" },
-
- { 0x0D, "Channel release" },
- { 0x0A, "Partial release" },
- { 0x0F, "PArtial release complete" },
-
- { 0x21, "Paging request type 1" },
- { 0x22, "Paging request type 2" },
- { 0x24, "Paging request type 3" },
- { 0x27, "Paging response" },
- { 0x20, "Notification/NCH" },
- { 0x25, "Notification/FACCH" },
- { 0x26, "Reserved" },
- { 0x0B, "Reserved" },
-
- { 0x18, "System information type 8" },
- { 0x19, "System information type 1" },
- { 0x1A, "System information type 2" },
- { 0x1B, "System information type 3" },
- { 0x1C, "System information type 4" },
- { 0x1D, "System information type 5" },
- { 0x1E, "System information type 6" },
- { 0x1F, "System information type 7" },
-
- { 0x02, "System information type 2bis" },
- { 0x03, "System information type 2ter" },
- { 0x05, "System information type 5bis" },
- { 0x06, "System information type 5ter" },
- { 0x04, "System information 9" },
- { 0x00, "System information 13" },
- { 0x01, "System information 14" },
-
- { 0x3D, "System information type 16" },
- { 0x3E, "System information type 17" },
-
- { 0x10, "Channel mode modify" },
- { 0x12, "RR status" },
- { 0x17, "Channel mode modify ack" },
- { 0x14, "Frequency redefinition" },
- { 0x15, "Measurement report" },
- { 0x16, "Classmark change" },
- { 0x13, "Classmark enquiry" },
- { 0x36, "Extended measurement report" },
- { 0x37, "Extended measurement order" },
- { 0x34, "GPRS suspension request" },
-
- { 0x09, "VGCS uplink grant" },
- { 0x0E, "Uplink release" },
- { 0x0C, "Uplink free" },
- { 0x2A, "Uplink busy" },
- { 0x11, "Talker indication" },
-
- { 0, NULL }
-};
-
-static const value_string mm_mm_mess[] = {
- { 0x01, "IMSI DETACH INDICATION" },
- { 0x02, "LOCATION UPDATING ACCEPT" },
- { 0x04, "LOCATION UPDATING REJECT" },
- { 0x08, "LOCATION UPDATING REQUEST" },
- { 0x11, "AUTHENTICATION REJECT" },
- { 0x12, "AUTHENTICATION REQUEST" },
- { 0x14, "AUTHENTICATION RESPONSE" },
- { 0x18, "IDENTITY REQUEST" },
- { 0x19, "IDENTITY RESPONSE" },
- { 0x1A, "TMSI REALLOCATION COMMAND" },
- { 0x1B, "TMSI REALLOCATION COMPLETE" },
- { 0x21, "CM SERVICE ACCEPT" },
- { 0x22, "CM SERVICE REJECT" },
- { 0x23, "CM SERVICE ABORT" },
- { 0x24, "CM SERVICE REQUEST" },
- { 0x25, "CM SERVICE PROMPT" },
- { 0x26, "NOTIFICATION RESPONSE" },
- { 0x28, "CM RE-ESTABLISHMENT REQUEST" },
- { 0x29, "ABORT" },
- { 0x30, "MM NULL" },
- { 0x31, "MM STATUS" },
- { 0x32, "MM INFORMATION" },
- { 0, NULL }
-};
-
-static const value_string mm_cc_mess[] = {
- { 0x00, "escape to nationally specific" },
-/*{ 0 x 0 0, "- - - Call establishment messages:" },*/
- { 0x01, "ALERTING" },
- { 0x08, "CALL CONFIRMED" },
- { 0x02, "CALL PROCEEDING" },
- { 0x07, "CONNECT" },
- { 0x0F, "CONNECT ACKNOWLEDGE" },
- { 0x0E, "EMERGENCY SETUP" },
- { 0x03, "PROGRESS" },
- { 0x04, "CC-ESTABLISHMENT" },
- { 0x06, "CC-ESTABLISHMENT CONFIRMED" },
- { 0x0B, "RECALL" },
- { 0x09, "START CC" },
- { 0x05, "SETUP" },
-/*{ 0 x 0 1, "- - - Call information phase messages:" },*/
- { 0x17, "MODIFY" },
- { 0x1F, "MODIFY COMPLETE" },
- { 0x13, "MODIFY REJECT" },
- { 0x10, "USER INFORMATION" },
- { 0x18, "HOLD" },
- { 0x19, "HOLD ACKNOWLEDGE" },
- { 0x1A, "HOLD REJECT" },
- { 0x1C, "RETRIEVE" },
- { 0x1D, "RETRIEVE ACKNOWLEDGE" },
- { 0x1E, "RETRIEVE REJECT" },
-/*{ 0 x 1 0, "- - - Call clearing messages:" },*/
- { 0x25, "DISCONNECT" },
- { 0x2D, "RELEASE" },
- { 0x2A, "RELEASE COMPLETE" },
-/*{ 0 x 1 1, "- - - Miscellaneous messages:" },*/
- { 0x39, "CONGESTION CONTROL" },
- { 0x3E, "NOTIFY" },
- { 0x3D, "STATUS" },
- { 0x34, "STATUS ENQUIRY" },
- { 0x35, "START DTMF" },
- { 0x31, "STOP DTMF" },
- { 0x32, "STOP DTMF ACKNOWLEDGE" },
- { 0x36, "START DTMF ACKNOWLEDGE" },
- { 0x37, "START DTMF REJECT" },
- { 0x3A, "FACILITY" },
- { 0, NULL }
-};
-
-static const value_string mm_gprs_mess[] = {
- { 0x01, "Attach request" },
- { 0x02, "Attach accept" },
- { 0x03, "Attach complete" },
- { 0x04, "Attach reject" },
- { 0x05, "Detach request" },
- { 0x06, "Detach accept" },
- { 0x08, "Routing area update request" },
- { 0x09, "Routing area update accept" },
- { 0x0A, "Routing area update complete" },
- { 0x0B, "Routing area update reject" },
- { 0x10, "P-TMSI reallocation command" },
- { 0x11, "P-TMSI reallocation complete" },
- { 0x12, "Authentication and ciphering req" },
- { 0x13, "Authentication and ciphering resp" },
- { 0x14, "Authentication and ciphering rej" },
- { 0x15, "Identity request" },
- { 0x16, "Identity response" },
- { 0x20, "GMM status" },
- { 0x21, "GMM information" },
- { 0, NULL }
-};
-
static const value_string tft_code_type[] = {
{ 0, "Spare" },
{ 1, "Create new TFT" },
@@ -1200,6 +1042,7 @@ static dissector_handle_t ipv6_handle;
static dissector_handle_t ppp_handle;
static dissector_handle_t data_handle;
static dissector_handle_t gtpcdr_handle;
+static dissector_table_t bssap_pdu_type_table=NULL;
static int decode_gtp_cause (tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree);
static int decode_gtp_imsi (tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree);
@@ -2909,10 +2752,14 @@ decode_quintuplet(tvbuff_t *tvb, int offset, proto_tree *tree, guint16 count) {
static int
decode_gtp_mm_cntxt(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree) {
- guint16 length, quint_len, net_cap, con_len;
- guint8 cksn, count, sec_mode, cipher, trans_id, proto_disc, message, drx_split, drx_len, drx_ccch, non_drx_timer;
+ guint16 length, quint_len, con_len;
+ guint8 cksn, count, sec_mode, len;
proto_tree *ext_tree_mm;
proto_item *te;
+ proto_item *tf = NULL;
+ proto_tree *tf_tree = NULL;
+ tvbuff_t *l3_tvb;
+
te = proto_tree_add_text(tree, tvb, offset, 1, val_to_str(GTP_EXT_MM_CNTXT, gtp_val, "Unknown message"));
ext_tree_mm = proto_item_add_subtree(te, ett_gtp_mm);
@@ -2926,27 +2773,18 @@ decode_gtp_mm_cntxt(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tre
/* Octet 5 */
sec_mode = (tvb_get_guint8(tvb, offset+4) >> 6) & 0x03;
count = (tvb_get_guint8(tvb, offset+4) >> 3) & 0x07;
- cipher = tvb_get_guint8(tvb, offset+4) & 0x07;
proto_tree_add_text(ext_tree_mm, tvb, offset+1, 2, "Length: %x", length);
- if (gtp_version != 0) {
- proto_tree_add_text(ext_tree_mm, tvb, offset+4, 1, "Security type: %u (%s)", sec_mode,
- val_to_str(sec_mode, mm_sec_modep, "Unknown"));
- } else {
+ if (gtp_version == 0)
sec_mode = 1;
- }
-
switch (sec_mode) {
case 0: /* Used cipher value, UMTS keys and Quintuplets */
- proto_tree_add_text(ext_tree_mm, tvb, offset+3, 1, "Ciphering Key Sequence Number(CKSN)/Key Set Identifier(KSI): %u", cksn);
- proto_tree_add_text(ext_tree_mm, tvb, offset+4, 1, "No of Quintuplets: %u", count);
- if (cipher == 0) {
- proto_tree_add_text(ext_tree_mm, tvb, offset+4, 1, "Ciphering: no ciphering");
- } else {
- proto_tree_add_text(ext_tree_mm, tvb, offset+4, 1, "Ciphering: GEA/%u", cipher);
- }
+ proto_tree_add_item(ext_tree_mm, hf_gtp_cksn_ksi, tvb, offset+3, 1, FALSE);
+ proto_tree_add_item(ext_tree_mm, hf_gtp_security_mode, tvb, offset+4, 1, FALSE);
+ proto_tree_add_item(ext_tree_mm, hf_gtp_no_of_vectors, tvb, offset+4, 1, FALSE);
+ proto_tree_add_item(ext_tree_mm, hf_gtp_cipher_algorithm, tvb, offset+4, 1, FALSE);
proto_tree_add_text(ext_tree_mm, tvb, offset+5, 16, "Ciphering key CK: %s", tvb_bytes_to_str(tvb, offset+5, 16));
proto_tree_add_text(ext_tree_mm, tvb, offset+21, 16, "Integrity key IK: %s", tvb_bytes_to_str(tvb, offset+21, 16));
quint_len = tvb_get_ntohs(tvb, offset+37);
@@ -2957,21 +2795,21 @@ decode_gtp_mm_cntxt(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tre
break;
case 1: /* GSM key and triplets */
- proto_tree_add_text(ext_tree_mm, tvb, offset+3, 1, "Ciphering Key Sequence Number(CKSN): %u", cksn);
- proto_tree_add_text(ext_tree_mm, tvb, offset+4, 1, "No of triplets: %u", count);
- if (cipher == 0) {
- proto_tree_add_text(ext_tree_mm, tvb, offset+4, 1, "Ciphering: no ciphering");
- } else {
- proto_tree_add_text(ext_tree_mm, tvb, offset+4, 1, "Ciphering: GEA/%u", cipher);
- }
+ proto_tree_add_item(ext_tree_mm, hf_gtp_cksn, tvb, offset+3, 1, FALSE);
+ if (gtp_version != 0)
+ proto_tree_add_item(ext_tree_mm, hf_gtp_security_mode, tvb, offset+4, 1, FALSE);
+
+ proto_tree_add_item(ext_tree_mm, hf_gtp_no_of_vectors, tvb, offset+4, 1, FALSE);
+ proto_tree_add_item(ext_tree_mm, hf_gtp_cipher_algorithm, tvb, offset+4, 1, FALSE);
proto_tree_add_text(ext_tree_mm, tvb, offset+5, 8, "Ciphering key Kc: %s", tvb_bytes_to_str(tvb, offset+5, 8));
offset = offset + decode_triplet(tvb, offset+13, ext_tree_mm, count) + 14;
break;
case 2: /* UMTS key and quintuplets */
- proto_tree_add_text(ext_tree_mm, tvb, offset+3, 1, "Key Set Identifier(KSI): %u", cksn);
- proto_tree_add_text(ext_tree_mm, tvb, offset+4, 1, "No of Quintuplets: %u", count);
+ proto_tree_add_item(ext_tree_mm, hf_gtp_ksi, tvb, offset+3, 1, FALSE);
+ proto_tree_add_item(ext_tree_mm, hf_gtp_security_mode, tvb, offset+4, 1, FALSE);
+ proto_tree_add_item(ext_tree_mm, hf_gtp_no_of_vectors, tvb, offset+4, 1, FALSE);
proto_tree_add_text(ext_tree_mm, tvb, offset+5, 16, "Ciphering key CK: %s", tvb_bytes_to_str(tvb, offset+5, 16));
proto_tree_add_text(ext_tree_mm, tvb, offset+21, 16, "Integrity key IK: %s", tvb_bytes_to_str(tvb, offset+21, 16));
quint_len = tvb_get_ntohs(tvb, offset+37);
@@ -2981,13 +2819,10 @@ decode_gtp_mm_cntxt(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tre
break;
case 3: /* GSM key and quintuplets */
- proto_tree_add_text(ext_tree_mm, tvb, offset+3, 1, "Ciphering Key Sequence Number(CKSN): %u", cksn);
- proto_tree_add_text(ext_tree_mm, tvb, offset+4, 1, "No of Quintuplets: %u", count);
- if (cipher == 0) {
- proto_tree_add_text(ext_tree_mm, tvb, offset+4, 1, "Ciphering: no ciphering");
- } else {
- proto_tree_add_text(ext_tree_mm, tvb, offset+4, 1, "Ciphering: GEA/%u", cipher);
- }
+ proto_tree_add_item(ext_tree_mm, hf_gtp_cksn, tvb, offset+3, 1, FALSE);
+ proto_tree_add_item(ext_tree_mm, hf_gtp_security_mode, tvb, offset+4, 1, FALSE);
+ proto_tree_add_item(ext_tree_mm, hf_gtp_no_of_vectors, tvb, offset+4, 1, FALSE);
+ proto_tree_add_item(ext_tree_mm, hf_gtp_cipher_algorithm, tvb, offset+4, 1, FALSE);
proto_tree_add_text(ext_tree_mm, tvb, offset+5, 8, "Ciphering key Kc: %s", tvb_bytes_to_str(tvb, offset+5, 8));
quint_len = tvb_get_ntohs(tvb, offset+13);
proto_tree_add_text(ext_tree_mm, tvb, offset+13, 2, "Quintuplets length: 0x%x (%u)", quint_len, quint_len);
@@ -2999,63 +2834,42 @@ decode_gtp_mm_cntxt(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tre
break;
}
+/*
+ * 3GPP TS 24.008 10.5.5.6 ( see packet-gsm_a.c )
+ */
+ de_gmm_drx_param(tvb, ext_tree_mm, offset, 2, NULL);
+ offset = offset +2;
- drx_split = tvb_get_guint8(tvb, offset);
- drx_len = (tvb_get_guint8(tvb, offset+1) >> 4) & 0x0F;
- drx_ccch = (tvb_get_guint8(tvb, offset+1) >> 3) & 0x01;
- non_drx_timer = tvb_get_guint8(tvb, offset+1) & 0x07;
-
- net_cap = tvb_get_ntohs(tvb, offset+2);
- con_len = tvb_get_ntohs(tvb, offset+4);
+ len = tvb_get_guint8(tvb, offset);
+ tf = proto_tree_add_text(ext_tree_mm,
+ tvb, offset, len+1,
+ "MS Network Capability");
- proto_tree_add_text(ext_tree_mm, tvb, offset, 1, "DRX: split PG cycle code: %u", drx_split);
- proto_tree_add_text(ext_tree_mm, tvb, offset+1, 1, "DRX: CN specific DRX cycle length coefficient: %u", drx_len);
- proto_tree_add_text(ext_tree_mm, tvb, offset+1, 1, "DRX: split PG cycle on CCCH supported by MS: %s", yesno[drx_ccch]);
- if (non_drx_timer == 0) {
- proto_tree_add_text(ext_tree_mm, tvb, offset+1, 1, "DRX: no non-DRX mode after transfer state");
- } else {
- proto_tree_add_text(ext_tree_mm, tvb, offset+1, 1, "DRX: max sec non-DRX mode after transfer state: 2^%u", non_drx_timer-1);
- }
+ tf_tree = proto_item_add_subtree(tf, ett_gtp_net_cap);
- proto_tree_add_text(ext_tree_mm, tvb, offset+2, 2, "MS network capability: %u", net_cap);
- proto_tree_add_text(ext_tree_mm, tvb, offset+4, 2, "Container length: %u", con_len);
+ proto_tree_add_text(tf_tree, tvb, offset, 1, "Length of MS network capability contents: %u", len);
- if (con_len > 0) {
- trans_id = (tvb_get_guint8(tvb, offset+6) >> 4) & 0x0F;
- proto_tree_add_text(ext_tree_mm, tvb, offset+6, 1, "Transaction identifier: 0x%x", trans_id);
- proto_disc = tvb_get_guint8(tvb, offset+6) & 0x0F;
- proto_tree_add_text(ext_tree_mm, tvb, offset+6, 1, "Protocol discriminator: 0x%x (%s)", proto_disc,
- val_to_str(proto_disc, mm_proto_disc, "Unknown"));
- message = tvb_get_guint8(tvb, offset+7);
- switch (message) {
-
- case MM_PROTO_RR_MGMT:
- proto_tree_add_text(ext_tree_mm, tvb, offset+7, 1, "Message type: 0x%02x (%s)", message,
- val_to_str(message, mm_rr_mess, "Unknown"));
- break;
-
- case MM_PROTO_MM_NON_GPRS:
- proto_tree_add_text(ext_tree_mm, tvb, offset+7, 1, "Message type: 0x%02x (%s)", message,
- val_to_str(message, mm_mm_mess, "Unknown"));
- break;
+ offset++;
+/*
+ * GPP TS 24.008 10.5.5.12 ( see packet-gsm_a.c )
+ */
+ de_gmm_ms_net_cap(tvb, tf_tree, offset, len, NULL);
+ offset = offset +len;
- case MM_PROTO_CALL_CONTROL:
- case MM_PROTO_GROUP_CALL_CONTROL:
- case MM_PROTO_BROADCAST_CALL_CONTROL:
- proto_tree_add_text(ext_tree_mm, tvb, offset+7, 1, "Message type: 0x%02x (%s)", message,
- val_to_str(message, mm_cc_mess, "Unknown"));
- break;
+/* Container contains one or several optional information elements as described in the clause 'Overview',
+ * from the clause 'General message format and information elements coding' in 3GPP TS 24.008.
+ * The IMEISV shall, if available, be included in the Container.
+ */
- case MM_PROTO_MM_GPRS:
- proto_tree_add_text(ext_tree_mm, tvb, offset+7, 1, "Message type: 0x%02x (%s)", message,
- val_to_str(message, mm_gprs_mess, "Unknown"));
- break;
+ con_len = tvb_get_ntohs(tvb, offset);
+ proto_tree_add_text(ext_tree_mm, tvb, offset, 2, "Container length: %u", con_len);
+ offset = offset + 2;
- default:
- proto_tree_add_text(ext_tree_mm, tvb, offset+7, 1, "Message type: 0x%02x", message);
- break;
- }
- /* XXX - dissect additional IEs from GSM L3 message */
+ if (con_len > 0) {
+
+ l3_tvb = tvb_new_subset(tvb, offset,con_len, con_len );
+ if (!dissector_try_port(bssap_pdu_type_table,BSSAP_PDU_TYPE_DTAP, l3_tvb, pinfo, ext_tree_mm))
+ call_dissector(data_handle, l3_tvb, pinfo, ext_tree_mm);
}
return 3+length;
@@ -4467,9 +4281,21 @@ proto_register_gtp(void)
{ &hf_gtp_ext_id, { "Extension identifier", "gtp.ext_id", FT_UINT16, BASE_DEC, NULL, 0, "Extension Identifier", HFILL }},
{ &hf_gtp_ext_val, { "Extension value", "gtp.ext_val", FT_STRING, BASE_DEC, NULL, 0, "Extension Value", HFILL }},
{ &hf_gtp_flags, { "Flags", "gtp.flags", FT_UINT8, BASE_HEX, NULL, 0, "Ver/PT/Spare...", HFILL }},
- { &hf_gtp_flags_ver, { "Version", "gtp.flags.version", FT_UINT8, BASE_DEC, VALS(ver_types), GTP_VER_MASK, "GTP Version", HFILL }},
- { &hf_gtp_flags_pt, { "Protocol type", "gtp.flags.payload", FT_UINT8, BASE_DEC, NULL, GTP_PT_MASK, "Protocol Type", HFILL }},
- { &hf_gtp_flags_spare1, { "Reserved", "gtp.flags.reserved", FT_UINT8, BASE_DEC, NULL, GTP_SPARE1_MASK, "Reserved (shall be sent as '111' )", HFILL }},
+ { &hf_gtp_flags_ver,
+ { "Version", "gtp.flags.version",
+ FT_UINT8, BASE_DEC, VALS(ver_types), GTP_VER_MASK,
+ "GTP Version", HFILL }
+ },
+ { &hf_gtp_flags_pt,
+ { "Protocol type", "gtp.flags.payload",
+ FT_UINT8, BASE_DEC, VALS(pt_types), GTP_PT_MASK,
+ "Protocol Type", HFILL }
+ },
+ { &hf_gtp_flags_spare1,
+ { "Reserved", "gtp.flags.reserved",
+ FT_UINT8, BASE_DEC, NULL, GTP_SPARE1_MASK,
+ "Reserved (shall be sent as '111' )", HFILL }
+ },
{ &hf_gtp_flags_snn, { "Is SNDCP N-PDU included?", "gtp.flags.snn", FT_BOOLEAN, 8, TFS(&yes_no_tfs), GTP_SNN_MASK, "Is SNDCP N-PDU LLC Number included? (1 = yes, 0 = no)", HFILL }},
{ &hf_gtp_flags_spare2, { "Reserved", "gtp.flags.reserved", FT_UINT8, BASE_DEC, NULL, GTP_SPARE2_MASK, "Reserved (shall be sent as '1' )", HFILL }},
{ &hf_gtp_flags_e, { "Is Next Extension Header present?", "gtp.flags.e", FT_BOOLEAN, 8, TFS(&yes_no_tfs), GTP_E_MASK, "Is Next Extension Header present? (1 = yes, 0 = no)", HFILL }},
@@ -4558,6 +4384,36 @@ proto_register_gtp(void)
{ &hf_gtp_user_addr_pdp_type, { "PDP type number", "gtp.user_addr_pdp_type", FT_UINT8, BASE_HEX, VALS (pdp_type), 0, "PDP type", HFILL }},
{ &hf_gtp_user_ipv4, { "End user address IPv4", "gtp.user_ipv4", FT_IPv4, BASE_DEC, NULL, 0, "End user address IPv4", HFILL }},
{ &hf_gtp_user_ipv6, { "End user address IPv6", "gtp.user_ipv6", FT_IPv6, BASE_HEX, NULL, 0, "End user address IPv6", HFILL }},
+ { &hf_gtp_security_mode,
+ { "Security Mode", "gtp.security_mode",
+ FT_UINT8, BASE_DEC, VALS(mm_sec_modep), 0xc0,
+ "Security Mode", HFILL }
+ },
+ { &hf_gtp_no_of_vectors,
+ { "No of Vectors", "gtp.no_of_vectors",
+ FT_UINT8, BASE_DEC, NULL, 0x38,
+ "No of Vectors", HFILL }
+ },
+ { &hf_gtp_cipher_algorithm,
+ { "Cipher Algorithm", "gtp.no_of_vectors",
+ FT_UINT8, BASE_DEC, VALS(gtp_cipher_algorithm), 0x07,
+ "Cipher Algorithm", HFILL }
+ },
+ { &hf_gtp_cksn_ksi,
+ { "Ciphering Key Sequence Number (CKSN)/Key Set Identifier (KSI)", "gtp.cksn_ksi",
+ FT_UINT8, BASE_DEC, NULL, 0x07,
+ "CKSN/KSI", HFILL }
+ },
+ { &hf_gtp_cksn,
+ { "Ciphering Key Sequence Number (CKSN)", "gtp.cksn_ksi",
+ FT_UINT8, BASE_DEC, NULL, 0x07,
+ "CKSN", HFILL }
+ },
+ { &hf_gtp_ksi,
+ { "Key Set Identifier (KSI)", "gtp.cksn_ksi",
+ FT_UINT8, BASE_DEC, NULL, 0x07,
+ "KSI", HFILL }
+ },
};
static gint *ett_gtp_array[] = {
@@ -4591,6 +4447,7 @@ proto_register_gtp(void)
&ett_gtp_can_pack,
&ett_gtp_data_resp,
&ett_gtp_priv_ext,
+ &ett_gtp_net_cap,
};
module_t *gtp_module;
@@ -4613,7 +4470,7 @@ proto_register_gtp(void)
prefs_register_obsolete_preference(gtp_module, "ppp_reorder");
/* This preference can be used to disable the dissection of GTP over TCP. Most of the Wireless operators uses GTP over UDP.
- * The preference is set to TRUE by default fo rbackward compatibility
+ * The preference is set to TRUE by default forbackward compatibility
*/
prefs_register_bool_preference(gtp_module, "dissect_gtp_over_tcp", "Dissect GTP over TCP", "Dissect GTP over TCP", &gtp_over_tcp);
@@ -4662,4 +4519,6 @@ proto_reg_handoff_gtp(void)
ppp_handle = find_dissector("ppp");
data_handle = find_dissector("data");
gtpcdr_handle = find_dissector("gtpcdr");
+ bssap_pdu_type_table = find_dissector_table("bssap.pdu_type");
+
}
diff --git a/epan/dissectors/packet-uma.c b/epan/dissectors/packet-uma.c
index e882f7a80b..a1918f0e90 100644
--- a/epan/dissectors/packet-uma.c
+++ b/epan/dissectors/packet-uma.c
@@ -131,12 +131,8 @@ static int hf_uma_urr_ECMP = -1;
static int hf_uma_urr_RE = -1;
static int hf_uma_urr_PFCFM = -1;
static int hf_uma_urr_3GECS = -1;
-static int hf_uma_urr_cell_id_disc = -1;
-static int hf_uma_urr_RNC_ID = -1;
-static int hf_uma_urr_ci = -1;
static int hf_uma_urr_bcc = -1;
static int hf_uma_urr_ncc = -1;
-static int hf_uma_urr_bcch_arfcn = -1;
static int hf_uma_urr_TU3907_timer = -1;
static int hf_uma_urr_GSM_RR_state = -1;
static int hf_uma_urr_UMA_band = -1;
@@ -149,31 +145,10 @@ static int hf_uma_urr_communication_port = -1;
static int hf_uma_urr_L3_Message = -1;
static int hf_uma_urr_L3_protocol_discriminator = -1;
static int hf_uma_urr_channel_mode = -1;
-static int hf_uma_urr_MSC2_rev = -1;
-static int hf_uma_urr_ES_IND = -1;
-static int hf_uma_urr_A5_1_algorithm_sup = -1;
-static int hf_uma_urr_RF_power_capability = -1;
-static int hf_uma_urr_ps_sup_cap = -1;
-static int hf_uma_urr_SS_screening_indicator = -1;
-static int hf_uma_urr_SM_capability = -1;
-static int hf_uma_urr_VBS_notification_rec = -1;
-static int hf_uma_urr_VGCS_notification_rec = -1;
-static int hf_uma_urr_FC_frequency_cap = -1;
-static int hf_uma_urr_CM3 = -1;
-static int hf_uma_urr_LCS_VA_cap = -1;
-static int hf_uma_urr_UCS2_treatment = -1;
-static int hf_uma_urr_SoLSA = -1;
-static int hf_uma_urr_CMSP = -1;
-static int hf_uma_urr_A5_3_algorithm_sup= -1;
-static int hf_uma_urr_A5_2_algorithm_sup = -1;
-static int hf_uma_urr_RR_cause = -1;
static int hf_uma_urr_sc = -1;
static int hf_uma_urr_algorithm_id = -1;
static int hf_uma_urr_GPRS_resumption = -1;
static int hf_uma_urr_ULQI = -1;
-static int hf_uma_urr_TLLI = -1;
-static int hf_uma_urr_packet_flow_id = -1;
-static int hf_uma_urr_suspension_cause = -1;
static int hf_uma_urr_TU3920_timer = -1;
static int hf_uma_urr_rate = -1;
static int hf_uma_urr_precedence = -1;
@@ -599,30 +574,7 @@ static const value_string MSC2_rev_vals[] = {
{ 3, "Reserved for future use"},
{ 0, NULL }
};
-/* RR cause value (octet 2) */
-static const value_string RR_cause_vals[] = {
- { 0, "Normal event"},
- { 1, "Abnormal release, unspecified"},
- { 2, "Abnormal release, channel unacceptable"},
- { 3, "Abnormal release, timer expired"},
- { 4, "Abnormal release, no activity on the radio path"},
- { 5, "Preemptive release"},
- { 6, "UTRAN configuration unknown"},
- { 8, "Handover impossible, timing advance out of range"},
- { 9, "Channel mode unacceptable"},
- { 10, "Frequency not implemented"},
- { 13, "Originator or talker leaving group call area"},
- { 12, "Lower layer failure"},
- { 0x41, "Call already cleared"},
- { 0x5f, "Semantically incorrect message"},
- { 0x60, "Invalid mandatory information"},
- { 0x61, "Message type non-existent or not implemented"},
- { 0x62, "Message type not compatible with protocol state"},
- { 0x64, "Conditional IE error"},
- { 0x65, "No cell allocation available"},
- { 0x6f, "Protocol error unspecified"},
- { 0, NULL }
-};
+
/* Register Reject Cause (octet 3) */
static const value_string register_reject_cause_vals[] = {
{ 0, "Network Congestion"},
@@ -660,133 +612,6 @@ static const value_string protocol_discriminator_vals[] = {
{0xf, "Reserved for tests procedures described in 3GPP TS 44.014 [5a] and 3GPP TS 34.109 [17a]."},
{ 0, NULL }
};
-/* Channel Mode */
-static const value_string channel_mode_vals[] = {
-{ 0x00, "signalling only"},
-{ 0x01, "speech full rate or half rate version 1(GSM FR or GSM HR)"},
-{ 0x21, "speech full rate or half rate version 2(GSM EFR)"},
-{ 0x41, "speech full rate or half rate version 3(FR AMR or HR AMR)"},
-{ 0x81, "speech full rate or half rate version 4(OFR AMR-WB or OHR AMR-WB)"},
-{ 0x82, "speech full rate or half rate version 5(FR AMR-WB )"},
-{ 0x83, "speech full rate or half rate version 6(OHR AMR )"},
-{ 0x61, "data, 43.5 kbit/s (downlink)+14.5 kbps (uplink)"},
-{ 0x62, "data, 29.0 kbit/s (downlink)+14.5 kbps (uplink)"},
-{ 0x64, "data, 43.5 kbit/s (downlink)+29.0 kbps (uplink)"},
-{ 0x67, "data, 14.5 kbit/s (downlink)+43.5 kbps (uplink)"},
-{ 0x65, "data, 14.5 kbit/s (downlink)+29.0 kbps (uplink)"},
-{ 0x66, "data, 29.0 kbit/s (downlink)+43.5 kbps (uplink)"},
-{ 0x27, "data, 43.5 kbit/s radio interface rate"},
-{ 0x63, "data, 32.0 kbit/s radio interface rate"},
-{ 0x43, "data, 29.0 kbit/s radio interface rate"},
-{ 0x0f, "data, 14.5 kbit/s radio interface rate"},
-{ 0x03, "data, 12.0 kbit/s radio interface rate"},
-{ 0x0b, "data, 6.0 kbit/s radio interface rate"},
-{ 0x13, "data, 3.6 kbit/s radio interface rate"},
- { 0, NULL }
-};
-/* ES IND (octet 3, bit 5) "Controlled Early Classmark Sending" option implementation */
-static const value_string ES_IND_vals[] = {
- { 0, "Controlled Early Classmark Sending option is not implemented in the MS"},
- { 1, "Controlled Early Classmark Sending option is implemented in the MS"},
- { 0, NULL }
-};
-/* A5/1 algorithm supported (octet 3, bit 4 */
-static const value_string A5_1_algorithm_sup_vals[] = {
- { 0, "encryption algorithm A5/1 available"},
- { 1, "encryption algorithm A5/1 not available"},
- { 0, NULL }
-};
-/* RF Power Capability (Octet 3) */
-static const value_string RF_power_capability_vals[] = {
- { 0, "class 1"},
- { 1, "class 2"},
- { 2, "class 3"},
- { 3, "class 4"},
- { 4, "class 5"},
- { 7, "RF Power capability is irrelevant in this information element"},
- { 0, NULL }
-};
-/* PS capability (pseudo-synchronization capability) (octet 4) */
-static const value_string ps_sup_cap_vals[] = {
- { 0, "PS capability not present"},
- { 1, "PS capability present"},
- { 0, NULL }
-};
-/* SS Screening Indicator (octet 4)defined in 3GPP TS 24.080 */
-static const value_string SS_screening_indicator_vals[] = {
- { 0, "Default value of phase 1"},
- { 1, "Capability of handling of ellipsis notation and phase 2 error handling "},
- { 2, "For future use"},
- { 3, "For future use"},
- { 0, NULL }
-};
-/* SM capability (MT SMS pt to pt capability) (octet 4)*/
-static const value_string SM_capability_vals[] = {
- { 0, "Mobile station does not support mobile terminated point to point SMS"},
- { 1, "Mobile station supports mobile terminated point to point SMS"},
- { 0, NULL }
-};
-/* VBS notification reception (octet 4) */
-static const value_string VBS_notification_rec_vals[] = {
- { 0, "no VBS capability or no notifications wanted"},
- { 1, "VBS capability and notifications wanted"},
- { 0, NULL }
-};
-/* VGCS notification reception (octet 4) */
-static const value_string VGCS_notification_rec_vals[] = {
- { 0, "no VGCS capability or no notifications wanted"},
- { 1, "VGCS capability and notifications wanted"},
- { 0, NULL }
-};
-/* FC Frequency Capability (octet 4 ) */
-static const value_string FC_frequency_cap_vals[] = {
- { 0, "The MS does not support the E-GSM or R-GSM band"},
- { 1, "The MS does support the E-GSM or R-GSM "},
- { 0, NULL }
-};
-/* CM3 (octet 5, bit 8) */
-static const value_string CM3_vals[] = {
- { 0, "The MS does not support any options that are indicated in CM3"},
- { 1, "The MS supports options that are indicated in classmark 3 IE"},
- { 0, NULL }
-};
-/* LCS VA capability (LCS value added location request notification capability) (octet 5,bit 6) */
-static const value_string LCS_VA_cap_vals[] = {
- { 0, "LCS value added location request notification capability not supported"},
- { 1, "LCS value added location request notification capability supported"},
- { 0, NULL }
-};
-/* UCS2 treatment (octet 5, bit 5) */
-static const value_string UCS2_treatment_vals[] = {
- { 0, "the ME has a preference for the default alphabet"},
- { 1, "the ME has no preference between the use of the default alphabet and the use of UCS2"},
- { 0, NULL }
-};
-/* SoLSA (octet 5, bit 4) */
-static const value_string SoLSA_vals[] = {
- { 0, "The ME does not support SoLSA"},
- { 1, "The ME supports SoLSA"},
- { 0, NULL }
-};
-/* CMSP: CM Service Prompt (octet 5, bit 3) */
-static const value_string CMSP_vals[] = {
- { 0, "Network initiated MO CM connection request not supported"},
- { 1, "Network initiated MO CM connection request supported for at least one CM protocol"},
- { 0, NULL }
-};
-/* A5/3 algorithm supported (octet 5, bit 2) */
-static const value_string A5_3_algorithm_sup_vals[] = {
- { 0, "encryption algorithm A5/3 available"},
- { 1, "encryption algorithm A5/3 not available"},
- { 0, NULL }
-};
-
-/* A5/2 algorithm supported (octet 5, bit 1) */
-static const value_string A5_2_algorithm_sup_vals[] = {
- { 0, "encryption algorithm A5/2 available"},
- { 1, "encryption algorithm A5/3 not available"},
- { 0, NULL }
-};
/* algorithm identifier
* If SC=1 then:
@@ -834,17 +659,7 @@ static const value_string packet_flow_id_vals[] = {
{ 3, "TOM8"},
{ 0, NULL }
};
-/*Suspension cause value (octet 2)*/
-static const value_string suspension_cause_vals[] = {
- { 0, "Emergency call, mobile originating call or call re-establishment"},
- { 1, "Location Area Update"},
- { 2, "MO Short message service"},
- { 3, "Other procedure which can be completed with an SDCCH"},
- { 4, "MO Voice broadcast or group call"},
- { 5, "Mobile terminating CS connection"},
- { 6, "DTM not supported in the cell"},
- { 0, NULL }
-};
+
static const value_string precedence_vals[] = {
{ 0, "Radio priority 1"},
{ 1, "Radio priority 2"},
@@ -1042,6 +857,7 @@ dissect_mcc_mnc(tvbuff_t *tvb, proto_tree *urr_ie_tree, int offset){
}
proto_tree_add_uint(urr_ie_tree, hf_uma_urr_mcc , tvb, start_offset, 2, mcc );
proto_tree_add_uint(urr_ie_tree, hf_uma_urr_mnc , tvb, start_offset + 1, 2, mnc );
+ offset++;
return offset;
}
static int
@@ -1053,13 +869,8 @@ dissect_uma_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
guint8 ie_value;
guint16 ie_len = 0;
guint8 octet;
- guint8 mobile_identity_type;
proto_item *urr_ie_item;
proto_tree *urr_ie_tree;
- char digit_str[16]; /* Max no of digits = 15 */
- guint16 i,n;
- guint16 num_digits;
- guint16 bcch_arfcn;
const guint8 *haddr;
char *string;
guint16 GPRS_user_data_transport_UDP_port,UNC_tcp_port,RTP_UDP_port,RTCP_UDP_port, communication_port;
@@ -1100,61 +911,13 @@ dissect_uma_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
}
switch(ie_value){
- case 1: /* Mobile Identity */
- octet = tvb_get_guint8(tvb,ie_offset);
- mobile_identity_type = octet & 0x7;
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_mobile_identity_type, tvb, ie_offset, 1, FALSE);
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_odde_even_ind, tvb, ie_offset, 1, FALSE);
-
- i = 0;
- n = 0;
- num_digits = 1 + ((ie_len-1) * 2);
- if ((octet & 0x8) == 0 ) num_digits--; /* Even number of digits */
- octet = octet >> 4;
- digit_str[i] = octet + 0x30;
- n++;
- i++;
- while ( i < 16 ){
- octet = tvb_get_guint8(tvb,ie_offset+n);
- digit_str[i] = ( octet & 0xf ) + 0x30;
- if ( i == num_digits-1){
- i++;
- digit_str[i] = '\0';
- break;
- }
- i++;
- digit_str[i] = ( octet >> 4 ) + 0x30;
- if ( i == num_digits-1){
- i++;
- digit_str[i] = '\0';
- break;
- }
- i++;
- n++;
- }
- switch(mobile_identity_type){
- case 1:
- /*IMSI*/
- proto_tree_add_string(urr_ie_tree, hf_uma_urr_imsi, tvb, ie_offset, ie_len, digit_str);
- break;
- case 2:
- /*IMEI*/
- proto_tree_add_string(urr_ie_tree, hf_uma_urr_imei, tvb, ie_offset, ie_len, digit_str);
- break;
- case 3:
- /*IMEISV*/
- proto_tree_add_string(urr_ie_tree, hf_uma_urr_imeisv, tvb, ie_offset, ie_len, digit_str);
- break;
- case 4 :
- /*TMSI/P-TMSI*/
- proto_tree_add_string(urr_ie_tree, hf_uma_urr_tmsi_p_tmsi, tvb, ie_offset, ie_len, digit_str);
- break;
- default: /*No Identity*/
- proto_tree_add_text(urr_ie_tree, tvb, ie_offset, ie_len,"No Identity");
-
- break;
- }
- break;
+ case 1:
+ /* Mobile Identity
+ * The rest of the IE is coded as in [TS 24.008] not including IEI and
+ * length, if present.(10.5.1.4)
+ */
+ de_mid(tvb, urr_ie_tree, offset, ie_len, "");
+ break;
case 2:
/* UMA Release Indicator */
@@ -1181,10 +944,8 @@ dissect_uma_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
/* Location Area Identification
* The rest of the IE is coded as in [TS 24.008] not including IEI and
* length, if present.
- *
- * Mobile country code MCC */
- ie_offset = dissect_mcc_mnc(tvb, urr_ie_tree, ie_offset);
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_lac, tvb, ie_offset, 2, FALSE);
+ */
+ de_lai(tvb, urr_ie_tree, offset, ie_len, "");
break;
case 6:
/* GSM Coverage Indicator */
@@ -1239,11 +1000,7 @@ dissect_uma_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
/* UMA Cell Description
* The rest of the IE is coded as in [TS 44.018], Cell Description IE, not including IEI and length, if present
*/
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_bcc, tvb, ie_offset, 1, FALSE);
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_ncc, tvb, ie_offset, 1, FALSE);
- bcch_arfcn = (tvb_get_guint8(tvb,ie_offset) & 0xc0) << 2;
- bcch_arfcn = bcch_arfcn | tvb_get_guint8(tvb,ie_offset+1);
- proto_tree_add_uint(urr_ie_tree, hf_uma_urr_bcch_arfcn , tvb, ie_offset, 2, bcch_arfcn );
+ de_rr_cell_dsc(tvb, urr_ie_tree, ie_offset, ie_len, "");
break;
case 14:
/* UMA Control Channel Description
@@ -1274,60 +1031,8 @@ dissect_uma_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
case 15:
/* Cell Identifier List
* The rest of the IE is coded as in [TS 48.008], not including IEI and length, if present
- *
- * Cell identification discriminator
*/
- octet = tvb_get_guint8(tvb,ie_offset);
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_cell_id_disc, tvb, ie_offset, 1, FALSE);
- ie_offset++;
- /* TODO make a proper loop over the list, once an example trace is avalable */
- switch (octet & 0xf){
- case 0:
- ie_offset = dissect_mcc_mnc(tvb, urr_ie_tree, ie_offset);
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_lac, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset +2;
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_ci, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset + 2;
- break;
- case 1:
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_lac, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset + 2;
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_ci, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset + 2;
- break;
- case 2:
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_ci, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset + 2;
- break;
- case 4:
- ie_offset = dissect_mcc_mnc(tvb, urr_ie_tree, ie_offset);
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_lac, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset +2;
- break;
- case 5:
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_lac, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset + 2;
- case 8:
- ie_offset = dissect_mcc_mnc(tvb, urr_ie_tree, ie_offset);
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_lac, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset +2;
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_RNC_ID, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset + 2;
- break;
- case 9:
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_RNC_ID, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset + 2;
- break;
- case 10:
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_lac, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset + 2;
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_RNC_ID, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset + 2;
- break;
- default:
- proto_tree_add_text(urr_ie_tree,tvb,offset+1,ie_len,"Unknown Cell identification discriminator");
- break;
- }
+ be_cell_id_list(tvb, urr_ie_tree, offset, ie_len, "");
break;
case 16: /* TU3907 Timer */
proto_tree_add_item(urr_ie_tree, hf_uma_urr_TU3907_timer, tvb, ie_offset, 2, FALSE);
@@ -1337,11 +1042,7 @@ dissect_uma_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
break;
case 18: /* Routing Area Identification */
/* The rest of the IE is coded as in [TS 24.008] not including IEI and length, if present.*/
- ie_offset = dissect_mcc_mnc(tvb, urr_ie_tree, ie_offset);
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_lac, tvb, ie_offset, 2, FALSE);
- ie_offset = ie_offset +2;
- /*Routing area code */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_RAC, tvb, ie_offset, 1, FALSE);
+ de_gmm_rai(tvb, urr_ie_tree, offset, ie_len, "");
break;
case 19: /* UMA Band */
proto_tree_add_item(urr_ie_tree, hf_uma_urr_UMA_band, tvb, ie_offset, 1, FALSE);
@@ -1378,72 +1079,32 @@ dissect_uma_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
/* Channel Mode
* The rest of the IE is coded as in [TS 44.018], not including IEI and length, if present
*/
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_channel_mode, tvb, ie_offset, ie_len, FALSE);
+ de_rr_ch_mode(tvb, urr_ie_tree, offset, ie_len, "");
break;
case 28:
/* Mobile Station Classmark 2
* The rest of the IE is coded as in [TS 24.008], not including IEI and length, if present
*/
- /* Revision level bit 7 6 */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_MSC2_rev, tvb, ie_offset, 1, FALSE);
- /* ES IND (octet 3, bit 5) "Controlled Early Classmark Sending" option implementation */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_ES_IND, tvb, ie_offset, 1, FALSE);
- /* A5/1 algorithm supported (octet 3, bit 4) */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_A5_1_algorithm_sup, tvb, ie_offset, 1, FALSE);
- /* RF Power Capability (Octet 3) */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_RF_power_capability, tvb, ie_offset, 1, FALSE);
- ie_offset++;
- /* PS capability (pseudo-synchronization capability) (octet 4) */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_ps_sup_cap, tvb, ie_offset, 1, FALSE);
- /* SS Screening Indicator (octet 4)defined in 3GPP TS 24.080 */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_SS_screening_indicator, tvb, ie_offset, 1, FALSE);
- /* SM capability (MT SMS pt to pt capability) (octet 4)*/
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_SM_capability, tvb, ie_offset, 1, FALSE);
- /* VBS notification reception (octet 4) */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_VBS_notification_rec, tvb, ie_offset, 1, FALSE);
- /*VGCS notification reception (octet 4)*/
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_VGCS_notification_rec, tvb, ie_offset, 1, FALSE);
- /* FC Frequency Capability (octet 4 ) */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_FC_frequency_cap, tvb, ie_offset, 1, FALSE);
- ie_offset++;
- /* CM3 (octet 5, bit 8) */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_CM3, tvb, ie_offset, 1, FALSE);
- /* LCS VA capability (LCS value added location request notification capability) (octet 5,bit 6) */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_LCS_VA_cap, tvb, ie_offset, 1, FALSE);
- /* UCS2 treatment (octet 5, bit 5) */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_UCS2_treatment, tvb, ie_offset, 1, FALSE);
- /* SoLSA (octet 5, bit 4) */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_SoLSA, tvb, ie_offset, 1, FALSE);
- /* CMSP: CM Service Prompt (octet 5, bit 3) */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_CMSP, tvb, ie_offset, 1, FALSE);
- /* A5/3 algorithm supported (octet 5, bit 2) */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_A5_3_algorithm_sup, tvb, ie_offset, 1, FALSE);
- /* A5/2 algorithm supported (octet 5, bit 1) */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_A5_2_algorithm_sup, tvb, ie_offset, 1, FALSE);
+ de_ms_cm_2(tvb, urr_ie_tree, ie_offset, ie_len, "");
break;
case 29:
/* RR Cause
* The rest of the IE is coded as in [TS 44.018], not including IEI and length, if present
*/
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_RR_cause, tvb, ie_offset, 1, FALSE);
+ de_rr_cause(tvb, urr_ie_tree, ie_offset, 1, "");
break;
case 30:
/* Cipher Mode Setting
* Note: The coding of fields SC and algorithm identifier is defined in [44.018]
* as part of the Cipher Mode Setting IE.
*/
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_sc, tvb, ie_offset, 1, FALSE);
- octet = tvb_get_guint8(tvb,ie_offset);
- if ( (octet & 1) == 1){ /* Start ciphering */
- /* algorithm identifier */
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_algorithm_id, tvb, ie_offset, 1, FALSE);
- }
+ de_rr_cip_mode_set(tvb, urr_ie_tree, offset, ie_len, "");
break;
case 31:
/* GPRS Resumption
* If the target RAT is GERAN, the rest of the IE is coded as HANDOVER COMMAND message in [TS 44.018]
*/
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_GPRS_resumption, tvb, ie_offset, 1, FALSE);
+ dtap_rr_ho_cmd(tvb, urr_ie_tree, offset, ie_len);
break;
case 32:
/* Handover From UMAN Command
@@ -1459,22 +1120,22 @@ dissect_uma_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
case 34:
/* TLLI
* The rest of the IE is coded as in [TS 44.018], not including IEI and length, if present.
- * [TS 44.018]:
+ * [TS 44.018]:10.5.2.41a
* The TLLI is encoded as a binary number with a length of 4 octets. TLLI is defined in 3GPP TS 23.003
*/
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_TLLI, tvb, ie_offset, 1, FALSE);
+ de_rr_tlli(tvb, urr_ie_tree, offset, ie_len, "");
break;
case 35:
/* Packet Flow Identifier
* The rest of the IE is coded as in [TS 24.008], not including IEI and length, if present.
*/
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_packet_flow_id, tvb, ie_offset, 1, FALSE);
+ de_sm_pflow_id(tvb, urr_ie_tree, offset, ie_len, "");
break;
case 36:
/* Suspension Cause
* The rest of the IE is coded as in [TS 44.018], not including IEI and length, if present.
*/
- proto_tree_add_item(urr_ie_tree, hf_uma_urr_suspension_cause, tvb, ie_offset, 1, FALSE);
+ de_rr_sus_cau(tvb, urr_ie_tree, offset, ie_len, "");
break;
case 37: /* TU3920 Timer */
proto_tree_add_item(urr_ie_tree, hf_uma_urr_TU3920_timer, tvb, ie_offset, 2, FALSE);
@@ -1651,6 +1312,7 @@ dissect_uma_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
/* Classmark Enquiry Mask
* The rest of the IE is the Classmark Enquiry Mask coded as in [TS 44.018], not including IEI and length, if present
*/
+ de_rr_cm_enq_mask(tvb, urr_ie_tree, offset, ie_len, "");
break;
case 66:
/* UTRAN Cell Identifier List
@@ -2258,21 +1920,6 @@ proto_register_uma(void)
FT_UINT8,BASE_DEC, VALS(Three_GECS_vals), 0x10,
"3GECS, 3G Early Classmark Sending Restriction", HFILL }
},
- { &hf_uma_urr_cell_id_disc,
- { "Cell identification discriminator","uma.urr.cell_id_disc",
- FT_UINT8,BASE_DEC, VALS(cell_id_disc_vals), 0x0f,
- "Cell identificationdiscriminator", HFILL }
- },
- { &hf_uma_urr_ci,
- { "Cell identification ","uma.urr.ci",
- FT_UINT16,BASE_DEC, NULL, 0x0,
- "Cell identification ", HFILL }
- },
- { &hf_uma_urr_RNC_ID,
- { "RNC-ID","uma.urr.rnc_id",
- FT_UINT16,BASE_DEC, NULL, 0x0,
- "RNC-ID", HFILL }
- },
{ &hf_uma_urr_bcc,
{ "BCC","uma.urr.bcc",
FT_UINT8,BASE_DEC, NULL, 0x07,
@@ -2283,11 +1930,6 @@ proto_register_uma(void)
FT_UINT8,BASE_DEC, NULL, 0x38,
"NCC", HFILL }
},
- { &hf_uma_urr_bcch_arfcn,
- { "BCCH ARFCN(RF channel number)","uma.urr.bcch_arfcn",
- FT_UINT16,BASE_DEC, NULL, 0x0,
- "BCCH ARFCN", HFILL }
- },
{ &hf_uma_urr_TU3907_timer,
{ "TU3907 Timer value(seconds)","uma.urr.tu3907",
FT_UINT16,BASE_DEC, NULL, 0x0,
@@ -2343,101 +1985,6 @@ proto_register_uma(void)
FT_UINT8,BASE_DEC, VALS(protocol_discriminator_vals), 0x0f,
"Protocol discriminator", HFILL }
},
- { &hf_uma_urr_channel_mode,
- { "Channel Mode","uma.urr.channel_mode",
- FT_UINT8,BASE_DEC, VALS(channel_mode_vals), 0x0,
- "Channel Mode", HFILL }
- },
- { &hf_uma_urr_MSC2_rev,
- { "Revision Level","uma.urr.MSC2_rev",
- FT_UINT8,BASE_DEC, VALS(gsm_a_msc_rev_vals), 0x60,
- "Revision level", HFILL }
- },
- { &hf_uma_urr_ES_IND,
- { "ES IND","uma.urr.MSC2_rev",
- FT_UINT8,BASE_DEC, VALS(ES_IND_vals), 0x20,
- "ES IND", HFILL }
- },
- { &hf_uma_urr_A5_1_algorithm_sup,
- { "A5/1 algorithm supported","uma.urr.MSC2_rev",
- FT_UINT8,BASE_DEC, VALS(A5_1_algorithm_sup_vals), 0x10,
- "A5/1 algorithm supported ", HFILL }
- },
- { &hf_uma_urr_RF_power_capability,
- { "RF Power Capability","uma.urr.MSC2_rev",
- FT_UINT8,BASE_DEC, VALS(RF_power_capability_vals), 0x07,
- "RF Power Capability", HFILL }
- },
- { &hf_uma_urr_ps_sup_cap,
- { "PS capability (pseudo-synchronization capability)","uma.urr.ps_sup_cap",
- FT_UINT8,BASE_DEC, VALS(ps_sup_cap_vals), 0x40,
- "PS capability (pseudo-synchronization capability)", HFILL }
- },
- { &hf_uma_urr_SS_screening_indicator,
- { "SS Screening Indicator","uma.urr.SS_screening_indicator",
- FT_UINT8,BASE_DEC, VALS(SS_screening_indicator_vals), 0x30,
- "SS Screening Indicator", HFILL }
- },
- { &hf_uma_urr_SM_capability,
- { "SM capability (MT SMS pt to pt capability)","uma.urr.SM_cap",
- FT_UINT8,BASE_DEC, VALS(SM_capability_vals), 0x08,
- "SM capability (MT SMS pt to pt capability)", HFILL }
- },
- { &hf_uma_urr_VBS_notification_rec,
- { "VBS notification reception ","uma.urr.VBS_notification_rec",
- FT_UINT8,BASE_DEC, VALS(VBS_notification_rec_vals), 0x04,
- "VBS notification reception ", HFILL }
- },
- { &hf_uma_urr_VGCS_notification_rec,
- { "VGCS notification reception ","uma.urr.VGCS_notification_rec",
- FT_UINT8,BASE_DEC, VALS(VGCS_notification_rec_vals), 0x02,
- "VGCS notification reception", HFILL }
- },
- { &hf_uma_urr_FC_frequency_cap,
- { "FC Frequency Capability","uma.urr.FC_frequency_cap",
- FT_UINT8,BASE_DEC, VALS(FC_frequency_cap_vals), 0x01,
- "FC Frequency Capability", HFILL }
- },
- { &hf_uma_urr_CM3,
- { "CM3","uma.urr.CM3",
- FT_UINT8,BASE_DEC, VALS(CM3_vals), 0x01,
- "CM3", HFILL }
- },
- { &hf_uma_urr_LCS_VA_cap,
- { "LCS VA capability (LCS value added location request notification capability) ","uma.urr.LCS_VA_cap",
- FT_UINT8,BASE_DEC, VALS(LCS_VA_cap_vals), 0x80,
- "LCS VA capability (LCS value added location request notification capability) ", HFILL }
- },
- { &hf_uma_urr_UCS2_treatment,
- { "UCS2 treatment ","uma.urr.UCS2_treatment",
- FT_UINT8,BASE_DEC, VALS(UCS2_treatment_vals), 0x10,
- "UCS2 treatment ", HFILL }
- },
- { &hf_uma_urr_SoLSA,
- { "SoLSA","uma.urr.SoLSA",
- FT_UINT8,BASE_DEC, VALS(SoLSA_vals), 0x08,
- "SoLSA", HFILL }
- },
- { &hf_uma_urr_CMSP,
- { "CMSP: CM Service Prompt ","uma.urr.CMSP",
- FT_UINT8,BASE_DEC, VALS(CMSP_vals), 0x04,
- "CMSP: CM Service Prompt ", HFILL }
- },
- { &hf_uma_urr_A5_3_algorithm_sup,
- { "A5/3 algorithm supported ","uma.urr.A5_3_algorithm_sup",
- FT_UINT8,BASE_DEC, VALS(A5_3_algorithm_sup_vals), 0x02,
- "A5/3 algorithm supported ", HFILL }
- },
- { &hf_uma_urr_A5_2_algorithm_sup,
- { "A5/2 algorithm supported ","uma.urr.A5_2_algorithm_sup",
- FT_UINT8,BASE_DEC, VALS(A5_2_algorithm_sup_vals), 0x01,
- "A5/2 algorithm supported ", HFILL }
- },
- { &hf_uma_urr_RR_cause,
- { "RR cause value","uma.urr.RRcause",
- FT_UINT8,BASE_DEC, VALS(RR_cause_vals), 0x0,
- "RR cause value", HFILL }
- },
{ &hf_uma_urr_sc,
{ "SC","uma.urr.SC",
FT_UINT8,BASE_DEC, VALS(SC_vals), 0x1,
@@ -2458,21 +2005,6 @@ proto_register_uma(void)
FT_UINT8,BASE_DEC, VALS(ULQI_vals), 0x0f,
"ULQI, UL Quality Indication", HFILL }
},
- { &hf_uma_urr_TLLI,
- { "Temporary Logical Link Identifier","uma.urr.tlli",
- FT_BYTES,BASE_DEC, NULL, 0x0,
- "Temporary Logical Link Identifier", HFILL }
- },
- { &hf_uma_urr_packet_flow_id,
- { "Packet Flow Identifier value","uma.urr.packet_flow_id",
- FT_UINT8,BASE_DEC, VALS(packet_flow_id_vals), 0x7f,
- "Packet Flow Identifier value", HFILL }
- },
- { &hf_uma_urr_suspension_cause,
- { "Suspension cause value","uma.urr.suspension_cause",
- FT_UINT8,BASE_DEC, VALS(suspension_cause_vals), 0x0,
- "Suspension cause value", HFILL }
- },
{ &hf_uma_urr_TU3920_timer,
{ "TU3920 Timer value(seconds)","uma.urr.tu3920",
FT_UINT16,BASE_DEC, NULL, 0x0,