diff options
author | pascal <pascal@localhost> | 2012-05-20 20:56:42 +0000 |
---|---|---|
committer | pascal <pascal@localhost> | 2012-05-20 20:56:42 +0000 |
commit | 254fcdfe194a12a7c1e0dd119047858d21aa9d46 (patch) | |
tree | 9087f38df752319c4e444aa73641427784645783 /epan | |
parent | 42ec0ca701ac3b9c62dd90575a388b82da8e6224 (diff) |
Upgrade NAS dissector to Release 10 (v10.6.1)
svn path=/trunk/; revision=42728
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-gsm_a_common.c | 44 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_a_common.h | 6 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_a_dtap.c | 111 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_a_gm.c | 350 |
4 files changed, 415 insertions, 96 deletions
diff --git a/epan/dissectors/packet-gsm_a_common.c b/epan/dissectors/packet-gsm_a_common.c index 83da021fee..77d60087db 100644 --- a/epan/dissectors/packet-gsm_a_common.c +++ b/epan/dissectors/packet-gsm_a_common.c @@ -438,6 +438,14 @@ static const value_string vamos_level_vals[] = { { 0, NULL} }; +const value_string tighter_cap_level_vals[] = { + { 0, "TIGHTER not supported" }, + { 1, "TIGHTER supported for speech and signalling channels only" }, + { 2, "TIGHTER supported for speech and signalling channels and for GPRS and EGPRS, but not for EGPRS2" }, + { 3, "TIGHTER supported for speech and signalling channels and for GPRS, EGPRS and EGPRS2" }, + { 0, NULL} +}; + static const value_string gsm_a_rr_rxlev_vals [] = { { 0, "< -110 dBm"}, { 1, "-110 <= x < -109 dBm"}, @@ -651,6 +659,8 @@ static int hf_gsm_a_e_utra_meas_and_report_support = -1; static int hf_gsm_a_prio_based_resel_support = -1; static int hf_gsm_a_utra_csg_cells_reporting = -1; static int hf_gsm_a_vamos_level = -1; +static int hf_gsm_a_tighter_cap = -1; +static int hf_gsm_a_selective_ciph_down_sacch = -1; static int hf_gsm_a_geo_loc_type_of_shape = -1; static int hf_gsm_a_geo_loc_sign_of_lat = -1; @@ -2376,7 +2386,7 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, /* * [3] 10.5.1.7 Mobile Station Classmark 3 - * 3GPP TS 24.008 version 9.6.0 Release 9 + * 3GPP TS 24.008 version 10.6.1 Release 10 */ #define AVAILABLE_BITS_CHECK(n) \ bits_left = ((len + offset) << 3) - bit_offset; \ @@ -3031,6 +3041,24 @@ de_ms_cm_3(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, bit_offset = bit_offset + 2; /* + * Release 10 starts here + * + * < TIGHTER Capability : bit(2) > -- Release 10 starts here. + * Extract TIGHTER Capability + */ + AVAILABLE_BITS_CHECK(2); + proto_tree_add_bits_item(tree, hf_gsm_a_tighter_cap, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + + /* + * < Selective Ciphering of Downlink SACCH : bit > + * Extract Selective Ciphering of Downlink SACCH + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_selective_ciph_down_sacch, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* * Add spare bits until we reach an octet boundary */ bits_left = (((len + offset) << 3) - bit_offset) & 0x07; @@ -3253,6 +3281,7 @@ de_cs_domain_spec_sys_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, proto_tree_add_item(tree, hf_gsm_a_rr_t3212, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 7, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_gsm_a_att, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; @@ -3283,6 +3312,7 @@ de_ps_domain_spec_sys_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, proto_tree_add_item(tree, hf_gsm_a_gm_rac, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 6, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_gsm_a_nmo_1, tvb, curr_offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_gsm_a_nmo, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; @@ -3380,7 +3410,7 @@ static const true_false_string gsm_a_ext_periodic_timers_value = { }; static guint16 -de_ms_net_feat_sup(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +de_ms_net_feat_sup(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset, bit_offset; @@ -4100,6 +4130,16 @@ proto_register_gsm_a_common(void) FT_UINT8, BASE_DEC, VALS(vamos_level_vals), 0x00, NULL, HFILL} }, + { &hf_gsm_a_tighter_cap, + { "TIGHTER Capability", "gsm_a.classmark3.tighter_cap", + FT_UINT8, BASE_DEC, VALS(tighter_cap_level_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_selective_ciph_down_sacch, + { "Selective Ciphering of Downlink SACCH", "gsm_a.classmark3.selective_ciph_down_sacch", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x00, + NULL, HFILL} + }, { &hf_gsm_a_geo_loc_type_of_shape, { "Location estimate", "gsm_a.gad.location_estimate", FT_UINT8, BASE_DEC, VALS(type_of_shape_vals), 0xf0, diff --git a/epan/dissectors/packet-gsm_a_common.h b/epan/dissectors/packet-gsm_a_common.h index 0015b410eb..9c2579c397 100644 --- a/epan/dissectors/packet-gsm_a_common.h +++ b/epan/dissectors/packet-gsm_a_common.h @@ -753,6 +753,7 @@ extern const value_string gsm_a_qos_traff_hdl_pri_vals[]; extern const value_string gsm_a_type_of_number_values[]; extern const value_string gsm_a_numbering_plan_id_values[]; extern const value_string gsm_a_sms_vals[]; +extern const value_string tighter_cap_level_vals[]; extern value_string_ext gsm_a_rr_rxlev_vals_ext; extern const value_string gsm_a_gm_type_of_ciph_alg_vals[]; @@ -997,6 +998,7 @@ typedef enum DE_DAY_SAVING_TIME, /* Daylight Saving Time */ DE_EMERGENCY_NUM_LIST, /* Emergency Number List */ DE_ADD_UPD_PARAMS, /* Additional update parameters */ + DE_MM_TIMER, /* MM Timer */ /* Call Control Information Elements 10.5.4 */ DE_AUX_STATES, /* Auxiliary States */ DE_BEARER_CAP, /* Bearer Capability */ @@ -1096,7 +1098,9 @@ typedef enum DE_REQ_MS_INFO, /* [7] 10.5.5.25 Requested MS information */ DE_UE_NETWORK_CAP, /* [7] 10.5.5.26 UE network capability */ DE_EUTRAN_IRAT_INFO_CONTAINER, /* [7] 10.5.5.27 E-UTRAN inter RAT information container */ - DE_VOICE_DOMAIN_PREF, /* [7] 10.5.5.28 Voice domain preference and UE's usage setting */ + DE_VOICE_DOMAIN_PREF, /* [7] 10.5.5.28 Voice domain preference and UE's usage setting */ + DE_PTMSI_TYPE, /* [10] 10.5.5.29 P-TMSI type */ + DE_LAI_2, /* [10] 10.5.5.30 Location Area Identification 2 */ /* Session Management Information Elements [3] 10.5.6 */ DE_ACC_POINT_NAME, /* Access Point Name */ DE_NET_SAPI, /* Network Service Access Point Identifier */ diff --git a/epan/dissectors/packet-gsm_a_dtap.c b/epan/dissectors/packet-gsm_a_dtap.c index 2ebb95cb90..495735cc04 100644 --- a/epan/dissectors/packet-gsm_a_dtap.c +++ b/epan/dissectors/packet-gsm_a_dtap.c @@ -66,6 +66,12 @@ * Stage 3 * (3GPP TS 24.008 version 9.6.0 Release 9) * + * Reference [10] + * Mobile radio interface Layer 3 specification; + * Core network protocols; + * Stage 3 + * (3GPP TS 24.008 version 10.6.1 Release 10) + * * $Id$ * * Wireshark - Network traffic analyzer @@ -252,6 +258,7 @@ const value_string gsm_dtap_elem_strings[] = { { 0x00, "Daylight Saving Time" }, { 0x00, "Emergency Number List" }, { 0x00, "Additional update parameters" }, + { 0x00, "MM Timer" }, /* Call Control Information Elements 10.5.4 */ { 0x00, "Auxiliary States" }, /* 10.5.4.4 Auxiliary states */ { 0x00, "Bearer Capability" }, /* 10.5.4.4a Backup bearer capability */ @@ -431,7 +438,10 @@ static int hf_gsm_a_dtap_serv_cat_b4 = -1; static int hf_gsm_a_dtap_serv_cat_b3 = -1; static int hf_gsm_a_dtap_serv_cat_b2 = -1; static int hf_gsm_a_dtap_serv_cat_b1 = -1; +static int hf_gsm_a_dtap_csmo = -1; static int hf_gsm_a_dtap_csmt = -1; +static int hf_gsm_a_dtap_mm_timer_unit = -1; +static int hf_gsm_a_dtap_mm_timer_value = -1; static int hf_gsm_a_dtap_alerting_pattern = -1; static int hf_gsm_a_dtap_ccbs_activation = -1; static int hf_gsm_a_dtap_stream_identifier = -1; @@ -508,6 +518,7 @@ static gint ett_bc_oct_6f = -1; static gint ett_bc_oct_6g = -1; static gint ett_bc_oct_7 = -1; static gint ett_epc_ue_tl_a_lb_setup = -1; +static gint ett_mm_timer = -1; static char a_bigbuf[1024]; @@ -1073,7 +1084,12 @@ de_emerg_num_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 o /* * 10.5.3.14 Additional update parameters */ -static const true_false_string gsm_a_dtap_csmt_vals = { +static const true_false_string gsm_a_dtap_csmo_value = { + "CS fallback mobile originating call", + "No additional information" +}; + +static const true_false_string gsm_a_dtap_csmt_value = { "CS fallback mobile terminating call", "No additional information" }; @@ -1085,13 +1101,61 @@ de_add_upd_params(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint curr_offset = offset; - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 3, ENC_BIG_ENDIAN); + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 2, ENC_BIG_ENDIAN); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_csmo, tvb, (curr_offset<<3)+6, 1, ENC_BIG_ENDIAN); proto_tree_add_bits_item(tree, hf_gsm_a_dtap_csmt, tvb, (curr_offset<<3)+7, 1, ENC_BIG_ENDIAN); return(len); } /* + * 10.5.3.15 MM Timer + */ +static const value_string gsm_a_dtap_mm_timer_unit_vals[] = { + { 0x00, "value is incremented in multiples of 2 seconds" }, + { 0x01, "value is incremented in multiples of 1 minute" }, + { 0x02, "value is incremented in multiples of decihours" }, + { 0x07, "value indicates that the timer is deactivated" }, + { 0, NULL } +}; + +static guint16 +de_mm_timer(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint8 oct; + guint16 val; + const gchar *str; + proto_tree *subtree; + proto_item *item = NULL; + + oct = tvb_get_guint8(tvb, offset); + val = oct&0x1f; + + switch (oct>>5) + { + case 0: str = "sec"; val*=2; break; + case 1: str = "min"; break; + case 2: str = "min"; val*=6; break; + case 7: str = ""; + item = proto_tree_add_text(tree, tvb, offset, 1, + "MM Timer: timer is deactivated"); + break; + default: str = "min"; + } + + if (item == NULL) { + item = proto_tree_add_text(tree, tvb, offset, 1, + "MM Timer: %u %s", val, str); + } + + subtree = proto_item_add_subtree(item, ett_mm_timer); + proto_tree_add_item(subtree, hf_gsm_a_dtap_mm_timer_unit, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_a_dtap_mm_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN); + + return (1); +} + + /* * [3] 10.5.4.4 Auxiliary states */ static guint16 @@ -2723,7 +2787,8 @@ de_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset case 18: str = "No user responding"; break; case 19: str = "User alerting, no answer"; break; case 21: str = "Call rejected"; break; - case 22: str = "Number changed"; break; + case 22: str = "Call rejected due to feature at the destination"; break; + case 24: str = "Number changed"; break; case 25: str = "Pre-emption"; break; case 26: str = "Non selected user clearing"; break; case 27: str = "Destination out of order"; break; @@ -4180,6 +4245,7 @@ guint16 (*dtap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _ de_day_saving_time, /* Daylight Saving Time */ de_emerg_num_list, /* Emergency Number List */ de_add_upd_params, /* Additional update parameters */ + de_mm_timer, /* MM Timer */ /* Call Control Information Elements 10.5.4 */ de_aux_states, /* Auxiliary States */ de_bearer_cap, /* Bearer Capability */ @@ -4421,6 +4487,9 @@ dtap_mm_cm_reestab_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID, NULL); ELEM_OPT_TV(0x13, GSM_A_PDU_TYPE_COMMON, DE_LAI, NULL); + + ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL); + EXTRANEOUS_DATA_CHECK(curr_len, 0); } @@ -4462,6 +4531,8 @@ dtap_mm_cm_srvc_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui ELEM_MAND_V(GSM_A_PDU_TYPE_DTAP, DE_REJ_CAUSE, NULL); + ELEM_OPT_TLV(0x36, GSM_A_PDU_TYPE_DTAP, DE_MM_TIMER, " - T3246 value"); + EXTRANEOUS_DATA_CHECK(curr_len, 0); } @@ -4577,6 +4648,10 @@ dtap_mm_cm_srvc_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui ELEM_OPT_TV_SHORT(0x80, GSM_A_PDU_TYPE_COMMON, DE_PRIO, NULL); + ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_DTAP, DE_ADD_UPD_PARAMS, NULL); + + ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL); + EXTRANEOUS_DATA_CHECK(curr_len, 0); } @@ -4710,6 +4785,8 @@ dtap_mm_loc_upd_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui /* 34 Emergency Number List O TLV 5-50 10.5.3.13 */ ELEM_OPT_TLV(0x34, GSM_A_PDU_TYPE_DTAP, DE_EMERGENCY_NUM_LIST, NULL); + ELEM_OPT_TLV(0x35, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - Per MS T3212"); + EXTRANEOUS_DATA_CHECK(curr_len, 0); } @@ -4730,6 +4807,8 @@ dtap_mm_loc_upd_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui ELEM_MAND_V(GSM_A_PDU_TYPE_DTAP, DE_REJ_CAUSE, NULL); + ELEM_OPT_TLV(0x36, GSM_A_PDU_TYPE_DTAP, DE_MM_TIMER, " - T3246 value"); + EXTRANEOUS_DATA_CHECK(curr_len, 0); } @@ -4836,6 +4915,10 @@ dtap_mm_loc_upd_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui ELEM_OPT_TV_SHORT(0xc0, GSM_A_PDU_TYPE_DTAP, DE_ADD_UPD_PARAMS, NULL); + ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL); + + ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_COMMON, DE_MS_NET_FEAT_SUP, NULL); + EXTRANEOUS_DATA_CHECK(curr_len, 0); } @@ -5159,7 +5242,7 @@ dtap_cc_emerg_setup(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui ELEM_OPT_TLV(0x40, GSM_A_PDU_TYPE_DTAP, DE_SUP_CODEC_LIST, NULL); - ELEM_OPT_TLV(0x2e, GSM_A_PDU_TYPE_DTAP, DE_SERV_CAT, " Emergency"); + ELEM_OPT_TLV(0x2e, GSM_A_PDU_TYPE_DTAP, DE_SERV_CAT, " - Emergency category"); EXTRANEOUS_DATA_CHECK(curr_len, 0); } @@ -6619,9 +6702,24 @@ proto_register_gsm_a_dtap(void) FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } }, + { &hf_gsm_a_dtap_csmo, + { "CSMO", "gsm_a.dtap.csmo", + FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_dtap_csmo_value), 0x0, + NULL, HFILL } + }, { &hf_gsm_a_dtap_csmt, { "CSMT", "gsm_a.dtap.csmt", - FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_dtap_csmt_vals), 0x0, + FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_dtap_csmt_value), 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_mm_timer_unit, + { "Unit", "gsm_a.dtap.mm_timer_unit", + FT_UINT8, BASE_DEC, VALS(gsm_a_dtap_mm_timer_unit_vals), 0xe0, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_mm_timer_value, + { "Timer value", "gsm_a.dtap.mm_timer_value", + FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL } }, { &hf_gsm_a_dtap_alerting_pattern, @@ -6897,7 +6995,7 @@ proto_register_gsm_a_dtap(void) }; /* Setup protocol subtree array */ -#define NUM_INDIVIDUAL_ELEMS 20 +#define NUM_INDIVIDUAL_ELEMS 21 gint *ett[NUM_INDIVIDUAL_ELEMS + NUM_GSM_DTAP_MSG_MM + NUM_GSM_DTAP_MSG_CC + NUM_GSM_DTAP_MSG_SMS + NUM_GSM_DTAP_MSG_SS + NUM_GSM_DTAP_MSG_TP + @@ -6923,6 +7021,7 @@ proto_register_gsm_a_dtap(void) ett[17] = &ett_bc_oct_6g; ett[18] = &ett_bc_oct_7; ett[19] = &ett_epc_ue_tl_a_lb_setup; + ett[20] = &ett_mm_timer; last_offset = NUM_INDIVIDUAL_ELEMS; diff --git a/epan/dissectors/packet-gsm_a_gm.c b/epan/dissectors/packet-gsm_a_gm.c index 2550c709e7..7c0a25a6f0 100644 --- a/epan/dissectors/packet-gsm_a_gm.c +++ b/epan/dissectors/packet-gsm_a_gm.c @@ -178,6 +178,8 @@ const value_string gsm_gm_elem_strings[] = { { 0x00, "UE network capability" }, { 0x00, "E-UTRAN inter RAT information container" }, { 0x00, "Voice domain preference and UE's usage setting" }, + { 0x00, "P-TMSI type" }, + { 0x00, "Location Area Identification 2" }, /* Session Management Information Elements 10.5.6 */ { 0x00, "Access Point Name" }, { 0x00, "Network Service Access Point Identifier" }, @@ -302,15 +304,19 @@ static int hf_gsm_a_gm_otd_b = -1; static int hf_gsm_a_gm_gps_a = -1; static int hf_gsm_a_gm_gps_b = -1; static int hf_gsm_a_gm_gps_c = -1; +static int hf_gsm_a_gm_lcs_molr = -1; +static int hf_gsm_a_gm_mbms = -1; +static int hf_gsm_a_gm_ims_vops = -1; +static int hf_gsm_a_gm_emc_bs = -1; static int hf_gsm_a_gm_req_ms_info_irat = -1; static int hf_gsm_a_gm_req_ms_info_irat2 = -1; static int hf_gsm_a_gm_ue_usage_setting = -1; static int hf_gsm_a_gm_voice_domain_pref_for_eutran = -1; +static int hf_gsm_a_gm_ptmsi_type = -1; static int hf_gsm_a_sm_pdp_type_org = -1; static int hf_gsm_a_qos_mean_thr = -1; static int hf_gsm_a_qos_peak_thr = -1; static int hf_gsm_a_qos_prec_class = -1; -static int hf_gsm_a_qos_traf_handl_prio = -1; static int hf_gsm_a_qos_trans_delay = -1; static int hf_gsm_a_qos_signalling_ind = -1; static int hf_gsm_a_qos_source_stat_desc = -1; @@ -385,6 +391,10 @@ static int hf_gsm_a_gm_rac_emst_cap = -1; static int hf_gsm_a_gm_rac_mtti_cap = -1; static int hf_gsm_a_gm_rac_utra_csg_cell_report = -1; static int hf_gsm_a_gm_rac_eutra_csg_cell_report = -1; +static int hf_gsm_a_gm_rac_dtr_cap = -1; +static int hf_gsm_a_gm_rac_emsr_cap = -1; +static int hf_gsm_a_gm_rac_fast_down_freq_switch_cap = -1; +static int hf_gsm_a_gm_rac_tighter_cap = -1; static int hf_gsm_a_sm_ti_flag = -1; static int hf_gsm_a_sm_ext = -1; @@ -1042,10 +1052,10 @@ de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 o curr_offset++; NO_MORE_DATA_CHECK(len); - /* bit 8: PS inter-RAT HO to UTRAN Iu mode capability */ + /* bit 8: PS inter-RAT HO from GERAN to UTRAN Iu mode capability */ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_iu, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* bit 7: PS inter-RAT HO to E-UTRAN S1 mode capability */ + /* bit 7: PS inter-RAT HO from GERAN to E-UTRAN S1 mode capability */ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_s1, tvb, curr_offset, 1, ENC_BIG_ENDIAN); /* bit 6: EMM Combined procedures capability */ @@ -1060,7 +1070,7 @@ de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 o /* bit 3: EPC capability */ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_epc, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* bit 3: NF capability */ + /* bit 2: NF capability */ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_nf, tvb, curr_offset, 1, ENC_BIG_ENDIAN); /* bits 1: Spare bit */ @@ -2778,6 +2788,54 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gui bits_in_oct -= bits_needed; /* + * Release 10 + */ + + /* + * DTR Capability + */ + bits_needed = 1; + GET_DATA; + proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtr_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset += bits_needed; + curr_bits_length -= bits_needed; + oct <<= bits_needed; + bits_in_oct -= bits_needed; + + /* + * EMSR Capability + */ + bits_needed = 1; + GET_DATA; + proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_emsr_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset += bits_needed; + curr_bits_length -= bits_needed; + oct <<= bits_needed; + bits_in_oct -= bits_needed; + + /* + * Fast Downlink Frequency Switching Capability + */ + bits_needed = 1; + GET_DATA; + proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_fast_down_freq_switch_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset += bits_needed; + curr_bits_length -= bits_needed; + oct <<= bits_needed; + bits_in_oct -= bits_needed; + + /* + * TIGHTER Capability + */ + bits_needed = 2; + GET_DATA; + proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_tighter_cap, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset += bits_needed; + curr_bits_length -= bits_needed; + oct <<= bits_needed; + bits_in_oct -= bits_needed; + + /* * we are too long ... so jump over it */ while (curr_bits_length > 0) @@ -2806,7 +2864,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gui * [9] 10.5.5.14 */ static const range_string gmm_cause_vals[] = { - { 0x00, 0x01, "Protocol error, unspecified(Not def in v8.6.0)"}, + { 0x00, 0x01, "Protocol error, unspecified"}, { 0x02, 0x02, "IMSI unknown in HLR"}, { 0x03, 0x03, "Illegal MS"}, { 0x04, 0x04, "IMSI unknown in VLR"}, /* Annex G.1 */ @@ -2823,27 +2881,23 @@ static const range_string gmm_cause_vals[] = { { 0x0f, 0x0f, "No Suitable Cells In Location Area"}, { 0x10, 0x10, "MSC temporarily not reachable"}, { 0x11, 0x11, "Network failure"}, - { 0x12, 0x13, "Protocol error, unspecified(Not def in v8.6.0)"}, + { 0x12, 0x13, "Protocol error, unspecified"}, { 0x14, 0x14, "MAC failure"}, { 0x15, 0x15, "Synch failure"}, { 0x16, 0x16, "Congestion"}, { 0x17, 0x17, "GSM authentication unacceptable"}, - { 0x18, 0x18, "Protocol error, unspecified(Not def in v8.6.0)"}, + { 0x18, 0x18, "Protocol error, unspecified"}, { 0x19, 0x19, "Not authorized for this CSG"}, { 0x20, 0x20, "Service option not supported"}, /* Annex G.4 */ { 0x21, 0x21, "Requested service option not subscribed"}, /* Annex G.4 */ { 0x22, 0x22, "Service option temporarily out of order"}, /* Annex G.4 */ - - { 0x23, 0x25, "Protocol error, unspecified(Not def in v8.6.0)"}, - + { 0x23, 0x25, "Protocol error, unspecified"}, { 0x26, 0x26, "Call cannot be identified(non-GPRS services only)"}, /* Annex G.4 */ - { 0x27, 0x27, "Protocol error, unspecified(Not def in v8.6.0)"}, + { 0x27, 0x27, "Protocol error, unspecified"}, { 0x28, 0x28, "No PDP context activated"}, - { 0x29, 0x2f, "Protocol error, unspecified(Not def in v8.6.0)"}, + { 0x29, 0x2f, "Protocol error, unspecified"}, { 0x30, 0x3f, "Retry upon entry into a new cell"}, - - { 0x40, 0x5e, "Protocol error, unspecified(Not def in v8.6.0)"}, - + { 0x40, 0x5e, "Protocol error, unspecified"}, { 0x5f, 0x5f, "Semantically incorrect message"}, { 0x60, 0x60, "Invalid mandatory information"}, { 0x61, 0x61, "Message type non-existent or not implemented"}, @@ -2851,11 +2905,9 @@ static const range_string gmm_cause_vals[] = { { 0x63, 0x63, "Information element non-existent or not implemented"}, { 0x64, 0x64, "Conditional IE error"}, { 0x65, 0x65, "Message not compatible with the protocol state"}, - - { 0x66, 0x6e, "Protocol error, unspecified(Not def in v8.6.0)"}, - + { 0x66, 0x6e, "Protocol error, unspecified"}, { 0x6f, 0x6f, "Protocol error, unspecified"}, - { 0x70, 0xff, "Protocol error, unspecified(Not def in v8.6.0)"}, + { 0x70, 0xff, "Protocol error, unspecified"}, { 0, 0, NULL } }; /* NOTE 1 TS 124 008 V8.6.0 (2009-07) @@ -3133,33 +3185,31 @@ de_gmm_ps_lcs_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 o /* * [7] 10.5.5.23 */ +static const true_false_string gsm_a_gm_lcs_molr_value = { + "LCS-MOLR via PS domain supported", + "LCS-MOLR via PS domain not supported" +}; +static const true_false_string gsm_a_gm_ims_vops_value = { + "IMS voice over PS session supported in Iu mode, but not supported in A/Gb mode", + "IMS voice over PS session in Iu mode and A/Gb mode not supported" +}; +static const true_false_string gsm_a_gm_emc_bs_value = { + "Emergency bearer services supported in Iu mode, but not supported in A/Gb mode", + "Emergency bearer services in Iu mode and A/Gb mode not supported" +}; static guint16 de_gmm_net_feat_supp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { - guint8 oct; - guint32 curr_offset; - const gchar *str; + guint32 curr_offset; curr_offset = offset; - oct = tvb_get_guint8(tvb, curr_offset); - - switch (oct&8) - { - case 8: str = "LCS-MOLR via PS domain not supported"; break; - default: str ="LCS-MOLR via PS domain supported"; - } - - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "Network Feature Support: %s (%u)", - str, - (oct>>3)&1); - + proto_tree_add_item(tree, hf_gsm_a_gm_lcs_molr, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_gm_mbms, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_gm_ims_vops, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_gm_emc_bs, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; - /* no length check possible */ - return (curr_offset - offset); } @@ -3271,6 +3321,36 @@ de_gmm_voice_domain_pref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_ return len; } +/* [10] 10.5.5.29 P-TMSI type */ +static const true_false_string gsm_a_gm_ptmsi_type_value = { + "Mapped P-TMSI", + "Native P-TMSI" +}; + +static guint16 +de_gmm_ptmsi_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset, bit_offset; + + curr_offset = offset; + bit_offset = (curr_offset<<3)+4; + + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 3, ENC_BIG_ENDIAN); + bit_offset += 3; + proto_tree_add_bits_item(tree, hf_gsm_a_gm_ptmsi_type, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + curr_offset++; + + return (curr_offset - offset); +} +/* [10] 10.5.5.30 Location Area Identification 2 */ +static guint16 +de_gmm_lai_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len) +{ + /* The Location Area Identification 2 value is coded as octet 2 to 6 of the */ + /* Location Area Identification information element */ + return de_lai(tvb, tree, pinfo, offset, len, add_string, string_len); +} + /* * [7] 10.5.7.1 */ @@ -3718,15 +3798,17 @@ static const value_string gsm_a_sm_pco_ms2net_prot_vals[] = { { 0x03, "DNS Server IPv6 Address Request" }, { 0x04, "Not Supported" }, { 0x05, "MS Support of Network Requested Bearer Control indicator" }, - { 0x06, "Reserved" }, - { 0x07, "DSMIPv6 Home Agent Address Request" }, - { 0x08, "DSMIPv6 Home Network Prefix Request" }, - { 0x09, "DSMIPv6 IPv4 Home Agent Address Request" }, - { 0x0a, "IP address allocation via NAS signalling" }, - { 0x0b, "IPv4 address allocation via DHCPv4" }, - { 0x0c, "P-CSCF IPv4 Address Request" }, - { 0x0d, "DNS Server IPv4 Address Request" }, - { 0x0e, "MSISDN Request" }, + { 0x06, "Reserved" }, + { 0x07, "DSMIPv6 Home Agent Address Request" }, + { 0x08, "DSMIPv6 Home Network Prefix Request" }, + { 0x09, "DSMIPv6 IPv4 Home Agent Address Request" }, + { 0x0a, "IP address allocation via NAS signalling" }, + { 0x0b, "IPv4 address allocation via DHCPv4" }, + { 0x0c, "P-CSCF IPv4 Address Request" }, + { 0x0d, "DNS Server IPv4 Address Request" }, + { 0x0e, "MSISDN Request" }, + { 0x0f, "IFOM-Support-Request" }, + { 0x10, "IPv4 Link MTU Request" }, { 0, NULL } }; static const value_string gsm_a_sm_pco_net2ms_prot_vals[] = { @@ -3735,15 +3817,17 @@ static const value_string gsm_a_sm_pco_net2ms_prot_vals[] = { { 0x03, "DNS Server IPv6 Address" }, { 0x04, "Policy Control rejection code" }, { 0x05, "Selected Bearer Control Mode" }, - { 0x06, "Reserved" }, - { 0x07, "DSMIPv6 Home Agent Address" }, - { 0x08, "DSMIPv6 Home Network Prefix" }, - { 0x09, "DSMIPv6 IPv4 Home Agent Address" }, - { 0x0a, "Reserved" }, - { 0x0b, "Reserved" }, - { 0x0c, "P-CSCF IPv4 Address" }, - { 0x0d, "DNS Server IPv4 Address" }, - { 0x0e, "MSISDN" }, + { 0x06, "Reserved" }, + { 0x07, "DSMIPv6 Home Agent Address" }, + { 0x08, "DSMIPv6 Home Network Prefix" }, + { 0x09, "DSMIPv6 IPv4 Home Agent Address" }, + { 0x0a, "Reserved" }, + { 0x0b, "Reserved" }, + { 0x0c, "P-CSCF IPv4 Address" }, + { 0x0d, "DNS Server IPv4 Address" }, + { 0x0e, "MSISDN" }, + { 0x0f, "IFOM-Support" }, + { 0x10, "IPv4 Link MTU" }, { 0, NULL } }; @@ -3830,10 +3914,12 @@ de_sm_pco(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, g case 0x0006: case 0x000A: case 0x000B: + case 0x000F: break; case 0x0004: - if (link_dir == P2P_DIR_DL) { - proto_tree_add_text(tree, tvb, curr_offset, 1, "Reject Code: 0x%02x (%u)", e_len, e_len); + if ((link_dir == P2P_DIR_DL) && (e_len == 1)) { + oct = tvb_get_guint8(tvb, curr_offset); + proto_tree_add_text(tree, tvb, curr_offset, 1, "Reject Code: 0x%02x (%u)", oct, oct); } break; case 0x0005: @@ -3860,6 +3946,12 @@ de_sm_pco(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, g ip_to_str((guint8 *)&ipv4_addr)); } break; + case 0x0010: + if ((link_dir == P2P_DIR_DL) && (e_len == 2)) { + guint16 word = tvb_get_ntohs(tvb, curr_offset); + proto_tree_add_text(tree, tvb, curr_offset, 1, "IPv4 link MTU size: %u octets", word); + } + break; default: { if (e_len > 0) { @@ -4292,14 +4384,7 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, g proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_trans_delay, tvb, curr_offset, 1, oct, "%s (%u)", str, tmp_oct); - tmp_oct = oct & 0x03; - if (tmp_oct == 0) - str = "Subscribed traffic handling priority/reserved"; - else - str = ep_strdup_printf("Priority level %u", tmp_oct); - - proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_traf_handl_prio, tvb, - curr_offset, 1, oct, "%s (%u)", str, tmp_oct); + proto_tree_add_item(tree, hf_gsm_a_qos_traff_hdl_pri, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset += 1; NO_MORE_DATA_CHECK(len); @@ -4453,7 +4538,7 @@ static const value_string gsm_a_sm_cause_vals[] = { { 0x24, "Regular deactivation" }, { 0x25, "QoS not accepted" }, { 0x26, "Network failure" }, - { 0x27, "Reactivation required" }, + { 0x27, "Reactivation requested" }, { 0x28, "Feature not supported" }, { 0x29, "Semantic error in the TFT operation" }, { 0x2a, "Syntactical error in the TFT operation" }, @@ -4464,10 +4549,12 @@ static const value_string gsm_a_sm_cause_vals[] = { { 0x2f, "Multicast group membership time-out" }, { 0x2c, "Semantic errors in packet filter(s)" }, { 0x2d, "Syntactical errors in packet filter(s)" }, - { 0x30, "Activation rejected, BCM violation" }, + { 0x30, "Request rejected, BCM violation" }, { 0x32, "PDP type IPv4 only allowed" }, { 0x33, "PDP type IPv6 only allowed" }, { 0x34, "Single address bearers only allowed" }, + { 0x38, "Collision with network initiated request" }, + { 0x3c, "Bearer handling not supported" }, { 0x51, "Invalid transaction identifier value" }, { 0x5f, "Semantically incorrect message" }, { 0x60, "Invalid mandatory information" }, @@ -4480,6 +4567,7 @@ static const value_string gsm_a_sm_cause_vals[] = { { 0x70, "APN restriction value incompatible with active PDP context" }, { 0, NULL } }; +static value_string_ext gsm_a_sm_cause_vals_ext = VALUE_STRING_EXT_INIT(gsm_a_sm_cause_vals); static guint16 de_sm_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) @@ -4490,7 +4578,7 @@ de_sm_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 off oct = tvb_get_guint8(tvb, offset); /* SM Cause can be sent in both directions */ - str = val_to_str_const(oct, gsm_a_sm_cause_vals, + str = val_to_str_ext_const(oct, &gsm_a_sm_cause_vals_ext, "Protocol error, unspecified / Service option temporarily out of order"); proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause, tvb, @@ -4512,7 +4600,7 @@ de_sm_cause_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 o oct = tvb_get_guint8(tvb, offset); /* SM Cause 2 is sent only in the Network-to-MS direction */ - str = val_to_str_const(oct, gsm_a_sm_cause_vals, + str = val_to_str_ext_const(oct, &gsm_a_sm_cause_vals_ext, "Service option temporarily out of order"); proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause_2, tvb, @@ -5171,6 +5259,8 @@ guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_ NULL, /* UE network capability */ de_gmm_eutran_irat_info_container, /* E-UTRAN inter RAT information container */ de_gmm_voice_domain_pref, /* Voice domain preference and UE's usage setting */ + de_gmm_ptmsi_type, /* P-TMSI type */ + de_gmm_lai_2, /* Location Area Identification 2 */ /* Session Management Information Elements 10.5.6 */ de_sm_apn, /* Access Point Name */ de_sm_nsapi, /* Network Service Access Point Identifier */ @@ -5262,6 +5352,14 @@ dtap_gmm_attach_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 ELEM_OPT_TLV( 0x5D, GSM_A_PDU_TYPE_GM, DE_VOICE_DOMAIN_PREF, NULL); + ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL); + + ELEM_OPT_TV_SHORT(0xE0, GSM_A_PDU_TYPE_GM, DE_PTMSI_TYPE, NULL); + + ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_COMMON, DE_MS_NET_FEAT_SUP, NULL); + + ELEM_OPT_TLV(0x14, GSM_A_PDU_TYPE_GM, DE_LAI_2, " - Old location area identification"); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -5306,7 +5404,7 @@ dtap_gmm_attach_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 ELEM_OPT_TV( 0x25, GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL); - ELEM_OPT_TLV( 0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302"); + ELEM_OPT_TLV( 0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302 value"); ELEM_OPT_T( 0x8C, GSM_A_PDU_TYPE_GM, DE_CELL_NOT, NULL); @@ -5318,9 +5416,11 @@ dtap_gmm_attach_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 ELEM_OPT_TV_SHORT( 0xA0, GSM_A_PDU_TYPE_GM, DE_REQ_MS_INFO, NULL); - ELEM_OPT_TLV( 0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3319"); + ELEM_OPT_TLV( 0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3319 value"); + + ELEM_OPT_TLV( 0x38, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3323 value" ); - ELEM_OPT_TLV( 0x38, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3323" ); + ELEM_OPT_TLV(0x39, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3312 extended value"); EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -5365,7 +5465,9 @@ dtap_gmm_attach_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL); - ELEM_OPT_TLV( 0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302" ); + ELEM_OPT_TLV( 0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302 value" ); + + ELEM_OPT_TLV(0x3A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3346 value"); EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -5716,6 +5818,14 @@ dtap_gmm_rau_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 of ELEM_OPT_TLV( 0x5D, GSM_A_PDU_TYPE_GM, DE_VOICE_DOMAIN_PREF, NULL); + ELEM_OPT_TV_SHORT(0xE0, GSM_A_PDU_TYPE_GM, DE_PTMSI_TYPE, NULL); + + ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL); + + ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_COMMON, DE_MS_NET_FEAT_SUP, NULL); + + ELEM_OPT_TLV(0x14, GSM_A_PDU_TYPE_GM, DE_LAI_2, " - Old location area identification"); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -5756,7 +5866,7 @@ dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 of ELEM_OPT_TV( 0x25, GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL); - ELEM_OPT_TLV( 0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302" ); + ELEM_OPT_TLV( 0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302 value" ); ELEM_OPT_T( 0x8C, GSM_A_PDU_TYPE_GM, DE_CELL_NOT, NULL); @@ -5772,9 +5882,11 @@ dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 of ELEM_OPT_TV_SHORT( 0xA0, GSM_A_PDU_TYPE_GM, DE_REQ_MS_INFO, NULL); - ELEM_OPT_TLV( 0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3319"); + ELEM_OPT_TLV( 0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3319 value"); + + ELEM_OPT_TLV( 0x38, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3323 value"); - ELEM_OPT_TLV( 0x38, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3323"); + ELEM_OPT_TLV(0x39, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3312 extended value"); EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -5826,7 +5938,9 @@ dtap_gmm_rau_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 of ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, NULL); - ELEM_OPT_TLV( 0x26, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302" ); + ELEM_OPT_TLV(0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302 value"); + + ELEM_OPT_TLV(0x3A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3346 value"); EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -5914,6 +6028,8 @@ dtap_gmm_service_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint3 ELEM_OPT_TLV( 0x36, GSM_A_PDU_TYPE_GM, DE_UPLINK_DATA_STATUS, NULL); + ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -5957,6 +6073,8 @@ dtap_gmm_service_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint3 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL); + ELEM_OPT_TLV(0x3A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3346 value"); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -5992,6 +6110,8 @@ dtap_sm_act_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 ELEM_OPT_TV_SHORT( 0xA0, GSM_A_PDU_TYPE_GM, DE_REQ_TYPE, NULL); + ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -6034,6 +6154,8 @@ dtap_sm_act_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 ELEM_OPT_TLV( 0x39, GSM_A_PDU_TYPE_GM, DE_SM_CAUSE_2, " - SM cause"); + ELEM_OPT_TV_SHORT(0xB0 , GSM_A_PDU_TYPE_GM, DE_SM_CONNECTIVITY_TYPE, NULL); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -6059,6 +6181,8 @@ dtap_sm_act_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL); + ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3396 value"); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -6093,6 +6217,8 @@ dtap_sm_act_sec_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gui ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL); + ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -6156,6 +6282,8 @@ dtap_sm_act_sec_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gui ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL); + ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3396 value"); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -6278,6 +6406,8 @@ dtap_sm_mod_pdp_req_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guin ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL); + ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -6358,6 +6488,8 @@ dtap_sm_mod_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL); + ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3396 value"); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -6551,6 +6683,8 @@ dtap_sm_act_mbms_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint3 /* 35 MBMS protocol configuration options MBMS protocol configuration options 10.5.6.15 O TLV 3 - 253 */ ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL); + ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -6599,6 +6733,8 @@ dtap_sm_act_mbms_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint3 ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL); + ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3396 value"); + EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo); } @@ -7152,6 +7288,26 @@ proto_register_gsm_a_gm(void) FT_BOOLEAN, 8, TFS(&gsm_a_gm_gps_c_vals), 0x01, NULL, HFILL } }, + { &hf_gsm_a_gm_lcs_molr, + { "LCS-MOLR", "gsm_a.gm.lcs_molr", + FT_BOOLEAN, 8, TFS(&gsm_a_gm_lcs_molr_value), 0x08, + NULL, HFILL } + }, + { &hf_gsm_a_gm_mbms, + { "MBMS", "gsm_a.gm.mbms", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, + NULL, HFILL } + }, + { &hf_gsm_a_gm_ims_vops, + { "IMS VoPS", "gsm_a.gm.ims_vops", + FT_BOOLEAN, 8, TFS(&gsm_a_gm_ims_vops_value), 0x02, + "IMS voice over PS session indicator", HFILL } + }, + { &hf_gsm_a_gm_emc_bs, + { "EMC BS", "gsm_a.gm.emc_bs", + FT_BOOLEAN, 8, TFS(&gsm_a_gm_emc_bs_value), 0x01, + "Emergency bearer services indicator", HFILL } + }, { &hf_gsm_a_gm_req_ms_info_irat, { "I-RAT", "gsm_a.gm.req_ms_info_irat", FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_req_ms_info_irat_vals), 0x0, @@ -7172,6 +7328,11 @@ proto_register_gsm_a_gm(void) FT_UINT8, BASE_DEC, VALS(gsm_a_gm_voice_domain_pref_for_eutran_vals), 0x0, NULL, HFILL } }, + { &hf_gsm_a_gm_ptmsi_type, + { "P-TMSI type", "gsm_a.gm.ptmsi_type", + FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_ptmsi_type_value), 0x0, + NULL, HFILL } + }, { &hf_gsm_a_sm_pdp_type_org, { "PDP type organization", "gsm_a.sm.pdp_type_org", FT_UINT8, BASE_DEC, VALS(gsm_a_sm_pdp_type_org_vals), 0x0f, @@ -7192,11 +7353,6 @@ proto_register_gsm_a_gm(void) FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_qos_prec_class_vals), 0x07, NULL, HFILL } }, - { &hf_gsm_a_qos_traf_handl_prio, - { "Traffic handling priority", "gsm_a.qos.traf_handl_prio", - FT_UINT8, BASE_DEC, NULL, 0x03, - NULL, HFILL } - }, { &hf_gsm_a_qos_trans_delay, { "Transfer delay", "gsm_a.qos.trans_delay", FT_UINT8, BASE_DEC, NULL, 0xfc, @@ -7358,12 +7514,12 @@ proto_register_gsm_a_gm(void) NULL, HFILL } }, { &hf_gsm_a_gmm_net_cap_ps_irat_iu, - { "PS inter-RAT HO to UTRAN Iu mode capability", "gsm_a.gmm.net_cap.ps_irat_iu", + { "PS inter-RAT HO from GERAN to UTRAN Iu mode capability", "gsm_a.gmm.net_cap.ps_irat_iu", FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ps_irat_iu_vals), 0x80, NULL, HFILL } }, { &hf_gsm_a_gmm_net_cap_ps_irat_s1, - { "PS inter-RAT HO to E-UTRAN S1 mode capability", "gsm_a.gmm.net_cap.ps_irat_s1", + { "PS inter-RAT HO from GERAN to E-UTRAN S1 mode capability", "gsm_a.gmm.net_cap.ps_irat_s1", FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ps_irat_s1_vals), 0x40, NULL, HFILL } }, @@ -7673,15 +7829,35 @@ proto_register_gsm_a_gm(void) NULL, HFILL } }, { &hf_gsm_a_gm_rac_utra_csg_cell_report, - { "UTRA CSG Cells Reporting", "gsm_a.gm.rac.utra_csg_cell_report", + { "Reporting of UTRAN CSG cells in packet transfer mode", "gsm_a.gm.rac.utra_csg_cell_report", FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, NULL, HFILL } }, { &hf_gsm_a_gm_rac_eutra_csg_cell_report, - { "E-UTRA CSG Cells Reporting", "gsm_a.gm.rac.mtti_cap", + { "Reporting of E-UTRAN CSG cells in packet transfer mode", "gsm_a.gm.rac.eutra_csg_cell_report", FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, NULL, HFILL } }, + { &hf_gsm_a_gm_rac_dtr_cap, + { "Dynamic Timeslot Reduction Capability", "gsm_a.gm.rac.dtr_cap", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_gm_rac_emsr_cap, + { "Enhanced Multiplexing for Single RLC Entity Capability", "gsm_a.gm.rac.emsr_cap", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_gm_rac_fast_down_freq_switch_cap, + { "Fast Downlink Frequency Switching Capability", "gsm_a.gm.rac.fast_down_freq_switch_cap", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_gm_rac_tighter_cap, + { "TIGHTER Capability", "gsm_a.gm.rac.tighter_cap", + FT_UINT8, BASE_DEC, VALS(tighter_cap_level_vals), 0x0, + NULL, HFILL } + }, { &hf_gsm_a_sm_ti_flag, { "TI Flag", "gsm_a.sm.ti_flag", FT_BOOLEAN, 8, TFS(&gsm_a_sm_ti_flag_vals), 0x80, |