diff options
author | Anders Broman <anders.broman@ericsson.com> | 2005-07-14 21:05:38 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2005-07-14 21:05:38 +0000 |
commit | a5e89b2793b805e6edc7a25c2d9b4aa05c0e1dc2 (patch) | |
tree | 28845ab3852be12d26e22d5ca8f8466b48317eb5 /epan | |
parent | 98a0c9a590a415d8f27127ec4057892f4833efd7 (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.c | 526 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_a.h | 24 | ||||
-rw-r--r-- | epan/dissectors/packet-gtp.c | 405 | ||||
-rw-r--r-- | epan/dissectors/packet-uma.c | 518 |
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", >p_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, |