* Mobile radio interface Layer 3 specification;
* Core network protocols;
* Stage 3
- * (3GPP TS 24.008 version 8.6.0 Release 8)
+ * (3GPP TS 24.008 version 9.6.0 Release 9)
*
* $Id$
*
#include <string.h>
#include <epan/packet.h>
+#include <epan/expert.h>
#include <epan/prefs.h>
#include <epan/tap.h>
#include <epan/asn1.h>
#include "packet-ber.h"
#include "packet-q931.h"
#include "packet-gsm_a_common.h"
-#include "packet-ipv6.h"
#include "packet-e212.h"
#include "packet-ppp.h"
{ 0x58, "Activate MBMS Context Reject" },
{ 0x59, "Request MBMS Context Activation" },
{ 0x5a, "Request MBMS Context Activation Reject" },
+ { 0x5b, "Request Secondary PDP Context Activation" },
+ { 0x5c, "Request Secondary PDP Context Activation Reject" },
+ { 0x5d, "Notification" },
{ 0, NULL }
};
{ 0x00, "MS Radio Access Capability" },
{ 0x00, "GMM Cause" },
{ 0x00, "Routing Area Identification" },
+ { 0x00, "Routing Area Identification 2" },
{ 0x00, "Update Result" },
{ 0x00, "Update Type" },
{ 0x00, "A&C Reference Number" },
{ 0x00, "PS LCS Capability" },
{ 0x00, "Network Feature Support" },
{ 0x00, "Inter RAT information container" },
+ { 0x00, "Requested MS information" },
+ { 0x00, "UE network capability" },
+ { 0x00, "E-UTRAN inter RAT information container" },
+ { 0x00, "Voice domain preference and UE's usage setting" },
/* Session Management Information Elements 10.5.6 */
{ 0x00, "Access Point Name" },
{ 0x00, "Network Service Access Point Identifier" },
{ 0x00, "Tear Down Indicator" },
{ 0x00, "Packet Flow Identifier" },
{ 0x00, "Traffic Flow Template" },
+ { 0x00, "Temporary Mobile Group Identity (TMGI)" },
+ { 0x00, "MBMS bearer capabilities" },
+ { 0x00, "MBMS protocol configuration options" },
+ { 0x00, "Enhanced network service access point identifier" },
+ { 0x00, "Request type" },
+ { 0x00, "Notification indicator" },
/* GPRS Common Information Elements 10.5.7 */
{ 0x00, "PDP Context Status" },
{ 0x00, "Radio Priority" },
{ 0x00, "GPRS Timer 2" },
{ 0x00, "Radio Priority 2"},
{ 0x00, "MBMS context status"},
+ { 0x00, "Uplink data status"},
{ 0x00, "Spare Nibble"},
{ 0, NULL }
};
static int hf_gsm_a_tft_op_code = -1;
static int hf_gsm_a_tft_e_bit = -1;
static int hf_gsm_a_tft_pkt_flt = -1;
+static int hf_gsm_a_tft_pkt_flt_id = -1;
+static int hf_gsm_a_tft_pkt_flt_dir = -1;
static int hf_gsm_a_sm_ip4_address = -1;
static int hf_gsm_a_sm_ip4_mask = -1;
static int hf_gsm_a_sm_ip6_address = -1;
static int hf_gsm_a_tft_port_high = -1;
static int hf_gsm_a_tft_security = -1;
static int hf_gsm_a_tft_traffic_mask = -1;
+static int hf_gsm_a_tft_flow_label_type = -1;
+static int hf_gsm_a_tft_param_id = -1;
static int hf_gsm_a_gm_acc_tech_type = -1;
static int hf_gsm_a_gm_acc_cap_struct_len = -1;
static int hf_gsm_a_gm_sms_value = -1;
static int hf_gsm_a_gm_sm_value = -1;
static int hf_gsm_a_gm_sm_ext = -1;
+static int hf_gsm_a_gm_link_dir = -1;
static int hf_gsm_a_gm_cause = -1;
static int hf_gsm_a_gm_fop = -1;
static int hf_gsm_a_gm_update_type = -1;
static int hf_gsm_a_gm_gprs_timer_unit = -1;
static int hf_gsm_a_gm_gprs_timer_value = -1;
+static int hf_gsm_a_gm_nsapi_5_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_6_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_7_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_8_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_9_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_10_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_11_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_12_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_13_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_14_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_15_ul_stat = -1;
+static int hf_gsm_a_gm_pco_pid = -1;
static int hf_gsm_a_gm_type_of_identity = -1;
static int hf_gsm_a_gm_rac = -1;
static int hf_gsm_a_gm_apc = -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_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_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_sm_llc_sapi = -1;
static int hf_gsm_a_sm_tdi = -1;
static int hf_gsm_a_sm_packet_flow_id = -1;
+static int hf_gsm_a_sm_tmgi = -1;
+static int hf_gsm_a_sm_enh_nsapi = -1;
+static int hf_gsm_a_sm_req_type = -1;
+static int hf_gsm_a_sm_notif_ind = -1;
+static int hf_gsm_a_gm_rac_ctrled_early_cm_sending = -1;
+static int hf_gsm_a_gm_rac_pseudo_sync = -1;
+static int hf_gsm_a_gm_rac_vgcs = -1;
+static int hf_gsm_a_gm_rac_vbs = -1;
+static int hf_gsm_a_gm_rac_multislot_capability = -1;
+static int hf_gsm_a_gm_rac_hscsd_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_gprs_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_gprs_ext_dyn_alloc_cap = -1;
+static int hf_gsm_a_gm_rac_ecsd_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_egprs_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_egprs_ext_dyn_alloc_cap = -1;
+static int hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_single_slt_dtm = -1;
+static int hf_gsm_a_gm_rac_dtm_egprs_multi_slot_cls_pres = -1;
+static int hf_gsm_a_gm_rac_dtm_egprs_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_8psk_pow_cap_pres = -1;
+static int hf_gsm_a_gm_rac_comp_int_meas_cap = -1;
+static int hf_gsm_a_gm_rel_lev_ind = -1;
+static int hf_gsm_a_gm_rac_geran_feat_pkg = -1;
+static int hf_gsm_a_gm_rac_umts_fdd_cap = -1;
+static int hf_gsm_a_gm_rac_umts_384_tdd_ra_cap = -1;
+static int hf_gsm_a_gm_rac_cdma2000_cap = -1;
+static int hf_gsm_a_gm_rac_umts_128_tdd_ra_cap = -1;
+static int hf_gsm_a_gm_rac_mod_based_multi_slot_class_support = -1;
+static int hf_gsm_a_gm_rac_geran_iu_mode_cap = -1;
+static int hf_gsm_a_gm_rac_flo_iu_cap = -1;
+static int hf_gsm_a_gm_rac_mult_tbf_cap = -1;
+static int hf_gsm_a_gm_rac_down_adv_rec_perf = -1;
+static int hf_gsm_a_gm_rac_ext_rlc_mac_ctrl_msg_seg_cap = -1;
+static int hf_gsm_a_gm_rac_dtm_enh_cap = -1;
+static int hf_gsm_a_gm_rac_dtm_gprs_high_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_dtm_egprs_high_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_ps_ho_cap = -1;
+static int hf_gsm_a_gm_rac_dtm_ho_cap = -1;
+static int hf_gsm_a_gm_rac_multi_slot_cap_red_down_dual_carrier = -1;
+static int hf_gsm_a_gm_rac_down_dual_carrier_dtm_cap = -1;
+static int hf_gsm_a_gm_rac_flex_ts_assign = -1;
+static int hf_gsm_a_gm_rac_gan_ps_ho_cap = -1;
+static int hf_gsm_a_gm_rac_rlc_non_pers_mode = -1;
+static int hf_gsm_a_gm_rac_reduced_lat_cap = -1;
+static int hf_gsm_a_gm_rac_ul_egprs2 = -1;
+static int hf_gsm_a_gm_rac_dl_egprs2 = -1;
+static int hf_gsm_a_gm_rac_eutra_fdd_support = -1;
+static int hf_gsm_a_gm_rac_eutra_tdd_support = -1;
+static int hf_gsm_a_gm_rac_geran_to_eutra_support_in_geran_ptm = -1;
+static int hf_gsm_a_gm_rac_prio_based_resel_support = -1;
+static int hf_gsm_a_gm_rac_alt_efta_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_efta_multi_slot_cap_red_down_dual_carrier = -1;
+static int hf_gsm_a_gm_rac_ind_up_layer_pdu_start_cap_for_rlc_um = -1;
+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_sm_ti_flag = -1;
+static int hf_gsm_a_sm_ext = -1;
static int hf_gsm_a_gmm_net_cap_gea1 = -1;
static int hf_gsm_a_gmm_net_cap_smdch = -1;
static int hf_gsm_a_gmm_net_cap_lcs = -1;
static int hf_gsm_a_gmm_net_cap_ps_irat_iu = -1;
static int hf_gsm_a_gmm_net_cap_ps_irat_s1 = -1;
-static int hf_gsm_a_gmm_net_cap_csfb = -1;
+static int hf_gsm_a_gmm_net_cap_comb_proc = -1;
static int hf_gsm_a_gmm_net_cap_isr = -1;
static int hf_gsm_a_gmm_net_cap_srvcc_to_geran = -1;
static int hf_gsm_a_gmm_net_cap_epc = -1;
+static int hf_gsm_a_gmm_net_cap_nf = -1;
/* Initialize the subtree pointers */
static gint ett_tc_component = -1;
static gint ett_gmm_update_type = -1;
static gint ett_gmm_radio_cap = -1;
static gint ett_gmm_network_cap = -1;
+static gint ett_gsm_a_gm_msrac_multislot_capability = -1;
static gint ett_gmm_rai = -1;
static gint ett_gmm_gprs_timer = -1;
static dissector_handle_t data_handle;
static dissector_handle_t rrc_irat_ho_info_handle;
+static dissector_handle_t lte_rrc_ue_eutra_cap_handle;
static dissector_table_t gprs_sm_pco_subdissector_table; /* GPRS SM PCO PPP Protocols */
};
static guint16
-de_gmm_attach_res(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_attach_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
- proto_tree_add_item(tree, hf_gsm_a_gm_fop, tvb, offset, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_gm_res_of_attach, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gm_fop, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_gm_res_of_attach, tvb, offset, 1, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
};
static guint16
-de_gmm_attach_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_attach_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
proto_item *tf = NULL;
proto_tree *tf_tree = NULL;
- proto_tree_add_bits_item(tree, hf_gsm_a_gm_ciph_key_seq_num, tvb, offset << 3, 4, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_ciph_key_seq_num, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
tf = proto_tree_add_text(tree,
tvb, offset, 1,
tf_tree = proto_item_add_subtree(tf, ett_gmm_attach_type );
- proto_tree_add_item(tf_tree, hf_gsm_a_gm_for, tvb, offset, 1, FALSE);
- proto_tree_add_item(tf_tree, hf_gsm_a_gm_type_of_attach, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tf_tree, hf_gsm_a_gm_for, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tf_tree, hf_gsm_a_gm_type_of_attach, tvb, offset, 1, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
/*
* [9] 10.5.5.3 Ciphering algorithm
*/
-static const value_string gsm_a_gm_type_of_ciph_alg_vals[] = {
+const value_string gsm_a_gm_type_of_ciph_alg_vals[] = {
{ 0x00, "ciphering not used" },
{ 0x01, "GPRS Encryption Algorithm GEA/1" },
{ 0x02, "GPRS Encryption Algorithm GEA/2" },
};
static guint16
-de_gmm_ciph_alg(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ciph_alg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_gm_type_of_ciph_alg, tvb, offset, 1, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_gm_type_of_ciph_alg, tvb, offset, 1, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
};
static guint16
-de_gmm_tmsi_stat(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_tmsi_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_gm_tmsi_flag, tvb, offset, 1, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_gm_tmsi_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
* [7] 10.5.5.5
*/
static guint16
-de_gmm_detach_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_detach_type(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;
{ 0, 0, NULL },
};
guint16
-de_gmm_drx_param(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_drx_param(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;
proto_tree_add_text(tf_tree,
tvb, curr_offset, 1,
"Split PG Cycle Code: %s (%u)",
- str,
+ str,
oct);
curr_offset++;
- 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);
+ proto_tree_add_item(tf_tree, hf_gsm_a_gmm_cn_spec_drs_cycle_len_coef, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tf_tree, hf_gsm_a_gmm_split_on_ccch, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tf_tree, hf_gsm_a_gmm_non_drx_timer, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset++;
};
static guint16
-de_gmm_ftostby(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ftostby(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 bit_offset;
/* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE LOWER NIBBLE */
bit_offset = (offset << 3) + 4;
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, FALSE);
- proto_tree_add_bits_item(tree, hf_gsm_a_gm_force_to_standby, tvb, bit_offset + 1, 3, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_force_to_standby, tvb, bit_offset + 1, 3, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
* [9] 10.5.5.7 Force to standby (higher nibble)
*/
static guint16
-de_gmm_ftostby_h(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ftostby_h(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 bit_offset;
/* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
bit_offset = offset << 3;
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, FALSE);
- proto_tree_add_bits_item(tree, hf_gsm_a_gm_force_to_standby, tvb, bit_offset + 1, 3, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_force_to_standby, tvb, bit_offset + 1, 3, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
* [7] 10.5.5.8
*/
static guint16
-de_gmm_ptmsi_sig(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ptmsi_sig(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;
proto_item *curr_item;
curr_offset = offset;
-
- curr_item= proto_tree_add_item(tree,hf_gsm_a_ptmsi_sig,tvb,curr_offset,3,FALSE);
+
+ curr_item= proto_tree_add_item(tree,hf_gsm_a_ptmsi_sig,tvb,curr_offset,3,ENC_BIG_ENDIAN);
proto_item_append_text(curr_item,"%s",add_string ? add_string : "");
curr_offset+=3;
* [7] 10.5.5.8a
*/
static guint16
-de_gmm_ptmsi_sig2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len _U_)
+de_gmm_ptmsi_sig2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len _U_)
{
guint32 curr_offset;
proto_item *curr_item;
curr_offset = offset;
- curr_item= proto_tree_add_item(tree,hf_gsm_a_ptmsi_sig2,tvb,curr_offset,3,FALSE);
+ curr_item= proto_tree_add_item(tree,hf_gsm_a_ptmsi_sig2,tvb,curr_offset,3,ENC_BIG_ENDIAN);
proto_item_append_text(curr_item,"%s",add_string ? add_string : "");
curr_offset+=3;
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
return(curr_offset - offset);
}
};
static guint16
-de_gmm_ident_type2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ident_type2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_gm_type_of_identity, tvb, offset, 1, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_gm_type_of_identity, tvb, offset, 1, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
};
static guint16
-de_gmm_imeisv_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_imeisv_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 bit_offset;
/* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
bit_offset = offset << 3;
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, FALSE);
- proto_tree_add_bits_item(tree, hf_gsm_a_gm_imeisv_req, tvb, bit_offset + 1, 3, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_imeisv_req, tvb, bit_offset + 1, 3, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
* [7] 10.5.5.11
*/
static guint16
-de_gmm_rec_npdu_lst(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_gmm_rec_npdu_lst(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
guint curr_len;
} while ( curr_len > 1 );
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
return(curr_offset - offset);
}
"PS inter-RAT HO to E-UTRAN S1 mode not supported"
};
-static const true_false_string gsm_a_gmm_net_cap_csfb_vals = {
- "Mobile station supports CS fallback",
- "Mobile station does not support CS fallback"
+static const true_false_string gsm_a_gmm_net_cap_comb_proc_vals = {
+ "Mobile station supports EMM combined procedures",
+ "Mobile station does not support EMM combined procedures"
};
static const true_false_string gsm_a_gmm_net_cap_isr_vals = {
"EPC not supported"
};
+static const true_false_string gsm_a_gmm_net_cap_nf_vals = {
+ "Mobile station supports the notification procedure",
+ "Mobile station does not support the notification procedure"
+};
+
guint16
-de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
proto_tree *subtree;
proto_item *item;
curr_offset = offset;
-
+
/* bit 8: GEA1 */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_gea1, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_gea1, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
/* bit 7: SM capabilities via dedicated channels */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smdch, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smdch, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
/* bit 6: SM capabilities via GPRS channels */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smgprs, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smgprs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
/* bit 5: UCS2 support */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ucs2, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ucs2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
/* bits 4 3: SS Screening Indicator */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ss_scr_ind, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ss_scr_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
/* bit 2: SoLSA Capability */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_solsa, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_solsa, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
/* bit 1 */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_rev, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_rev, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset++;
NO_MORE_DATA_CHECK(len);
/* bit 8: PFC feature mode */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_pfc, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_pfc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
/* bits 7 6 5 4 3 2: Extended GEA bits */
- item = proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ext_gea_bits, tvb, curr_offset, 1, FALSE);
+ item = proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ext_gea_bits, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
subtree = proto_item_add_subtree(item, ett_gmm_network_cap);
- proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea2, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea3, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea4, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea5, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea6, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea7, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea3, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea4, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea5, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea6, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea7, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
- /* bit 1: LCS VA capability */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_lcs, tvb, curr_offset, 1, FALSE);
+ /* bit 1: LCS VA capability */
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_lcs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset++;
NO_MORE_DATA_CHECK(len);
/* bit 8: PS inter-RAT HO to UTRAN Iu mode capability */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_iu, tvb, curr_offset, 1, FALSE);
+ 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 */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_s1, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_s1, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
- /* bit 6: CSFB Capability */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_csfb, tvb, curr_offset, 1, FALSE);
+ /* bit 6: EMM Combined procedures capability */
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_comb_proc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
/* bit 5: ISR support */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_isr, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_isr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
/* bit 4: SRVCC to GERAN/UTRAN capability */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_srvcc_to_geran, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_srvcc_to_geran, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
/* bit 3: EPC capability */
- proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_epc, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_epc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+
+ /* bit 3: NF capability */
+ proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_nf, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
- /* bits 2 1: Spare bits */
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+6, 2, FALSE);
+ /* bits 1: Spare bit */
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+7, 1, ENC_BIG_ENDIAN);
curr_offset++;
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
return(curr_offset - offset);
}
{ 0, NULL }
};
+static const true_false_string gsm_a_gm_vgcs = {
+ "VGCS capability and notifications wanted",
+ "no VGCS capability or no notifications wanted"
+};
+
+static const true_false_string gsm_a_gm_vbs = {
+ "VBS capability and notifications wanted",
+ "no VBS capability or no notifications wanted"
+};
+
+static const value_string gsm_a_gm_multi_slot_vals[] = {
+ { 0x00, "Not specified" },
+ { 0x01, "Max Rx-Slot/TDMA:1 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:2 Tta:3 Ttb:2 Tra:4 Trb:2 Type:1" },
+ { 0x02, "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1" },
+ { 0x03, "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1" },
+ { 0x04, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1" },
+ { 0x05, "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1" },
+ { 0x06, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1" },
+ { 0x07, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1" },
+ { 0x08, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1" },
+ { 0x09, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1" },
+ { 0x0a, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1" },
+ { 0x0b, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1" },
+ { 0x0c, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:5 Tta:2 Ttb:1 Tra:2 Trb:1 Type:1" },
+ { 0x0d, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
+ { 0x0e, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
+ { 0x0f, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
+ { 0x10, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:2 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
+ { 0x11, "Max Rx-Slot/TDMA:7 Max Tx-Slot/TDMA:7 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:1 Trb:0 Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
+ { 0x12, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:8 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:0 Tra:0 Trb:0 Type:2" },
+ { 0x13, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+ { 0x14, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+ { 0x15, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+ { 0x16, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+ { 0x17, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+ { 0x18, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+ { 0x19, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+ { 0x1a, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+ { 0x1b, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+ { 0x1c, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+ { 0x1d, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:8 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+ { 0x1e, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
+ { 0x1f, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
+ { 0x20, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
+ { 0x21, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
+ { 0x22, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
+ { 0x23, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+ { 0x24, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+ { 0x25, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+ { 0x26, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+ { 0x27, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+ { 0x28, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+ { 0x29, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+ { 0x2a, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+ { 0x2b, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+ { 0x2c, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+ { 0x2d, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+ { 0, NULL }
+};
+
+static const value_string gsm_a_gm_dtm_gprs_multi_slot_class_vals[] = {
+ { 0x00, "Unused. If received, the network shall interpret this as Multislot class 5" },
+ { 0x01, "Multislot class 5 supported" },
+ { 0x02, "Multislot class 9 supported" },
+ { 0x03, "Multislot class 11 supported" },
+ { 0, NULL }
+};
+
+static const true_false_string gsm_a_gm_revision_level_indicator = {
+ "The ME is Release '99 onwards",
+ "The ME is Release '98 or older"
+};
+
+static const value_string gsm_a_gm_down_adv_rec_perf_vals[] = {
+ { 0x00, "Downlink Advanced Receiver Performance not supported" },
+ { 0x01, "Downlink Advanced Receiver Performance - phase I supported" },
+ { 0x02, "Downlink Advanced Receiver Performance - phase II supported" },
+ { 0, NULL }
+};
+
+static const true_false_string gsm_a_gm_dtm_enh_cap = {
+ "The mobile station supports enhanced DTM CS establishment and enhanced DTM CS release procedures",
+ "The mobile station does not support enhanced DTM CS establishment and enhanced DTM CS release procedures"
+};
+
+static const value_string gsm_a_gm_dtm_gprs_high_multi_slot_class_vals[] = {
+ { 0x00, "Unused. If received, the network shall interpret this as 'Multislot class 31 or 36 supported'" },
+ { 0x01, "Multislot class 31 or 36 supported" },
+ { 0x02, "Multislot class 32 or 37 supported" },
+ { 0x03, "Multislot class 33 or 38 supported" },
+ { 0x04, "Multislot class 41 supported" },
+ { 0x05, "Multislot class 42 supported" },
+ { 0x06, "Multislot class 43 supported" },
+ { 0x07, "Multislot class 44 supported" },
+ { 0, NULL }
+};
+
+static const value_string gsm_a_gm_multi_slot_cap_red_down_dual_carrier_vals[] = {
+ { 0x00, "No reduction" },
+ { 0x01, "The MS supports 1 timeslot fewer than the maximum number of receive timeslots" },
+ { 0x02, "The MS supports 2 timeslots fewer than the maximum number of receive timeslots" },
+ { 0x03, "The MS supports 3 timeslots fewer than the maximum number of receive timeslots" },
+ { 0x04, "The MS supports 4 timeslots fewer than the maximum number of receive timeslots" },
+ { 0x05, "The MS supports 5 timeslots fewer than the maximum number of receive timeslots" },
+ { 0x06, "The MS supports 6 timeslots fewer than the maximum number of receive timeslots" },
+ { 0x07, "Reserved for future use" },
+ { 0, NULL }
+};
+
+static const value_string gsm_a_gm_ul_egprs2_vals[] = {
+ { 0x00, "The mobile station does not support either EGPRS2-A or EGPRS2-B in the uplink" },
+ { 0x01, "The mobile station supports EGPRS2-A in the uplink" },
+ { 0x02, "The mobile station supports both EGPRS2-A and EGPRS2-B in the uplink" },
+ { 0x03, "This value is not used in this release/version of the specifications. If received it shall be interpreted as 'The mobile station supports both EGPRS2-A and EGPRS2-B in the uplink'" },
+ { 0, NULL }
+};
+
+static const value_string gsm_a_gm_dl_egprs2_vals[] = {
+ { 0x00, "The mobile station does not support either EGPRS2-A or EGPRS2-B in the downlink" },
+ { 0x01, "The mobile station supports EGPRS2-A in the downlink" },
+ { 0x02, "The mobile station supports both EGPRS2-A and EGPRS2-B in the downlink" },
+ { 0x03, "This value is not used in this release/version of the specifications. If received it shall be interpreted as 'The mobile station supports both EGPRS2-A and EGPRS2-B in the downlink'" },
+ { 0, NULL }
+};
+
+static const value_string gsm_a_gm_geran_to_eutra_support_in_geran_ptm_vals[] = {
+ { 0x00, "None" },
+ { 0x01, "E-UTRAN Neighbour Cell measurements and MS autonomous cell reselection to E-UTRAN supported" },
+ { 0x02, "CCN towards E-UTRAN, E-UTRAN Neighbour Cell measurement reporting and Network controlled cell reselection to E-UTRAN supported in addition to capabilities indicated by '01'" },
+ { 0x03, "PS Handover to E-UTRAN supported in addition to capabilities indicated by '01' and '10'" },
+ { 0, NULL }
+};
+
+static const value_string gsm_a_gm_alt_efta_multi_slot_class_vals[] = {
+ { 0x00, "No Alternative EFTA multislot class is indicated. Use (DTM) EGPRS (high) multislot class only" },
+ { 0x01, "Alternative EFTA multislot class is Multislot class 19" },
+ { 0x02, "Alternative EFTA multislot class is Multislot class 20" },
+ { 0x03, "Alternative EFTA multislot class is Multislot class 21" },
+ { 0x04, "Alternative EFTA multislot class is Multislot class 22" },
+ { 0x05, "Alternative EFTA multislot class is Multislot class 23" },
+ { 0x06, "Alternative EFTA multislot class is Multislot class 24" },
+ { 0x07, "Alternative EFTA multislot class is Multislot class 25" },
+ { 0x08, "Alternative EFTA multislot class is Multislot class 26" },
+ { 0x09, "Alternative EFTA multislot class is Multislot class 27" },
+ { 0x0a, "Alternative EFTA multislot class is Multislot class 28" },
+ { 0x0b, "Alternative EFTA multislot class is Multislot class 29" },
+ { 0x0c, "Unused" },
+ { 0x0d, "Unused" },
+ { 0x0e, "Unused" },
+ { 0x0f, "Unused" },
+ { 0, NULL }
+};
+
guint16
-de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
guint curr_len;
int bit_offset;
- proto_item *tf = NULL;
- proto_tree *tf_tree = NULL;
+ proto_item *tf = NULL, *mc_item = NULL;
+ proto_tree *tf_tree = NULL, *mc_tree = NULL;
guint32 oct;
guchar bits_in_oct;
guchar bits_needed;
guchar acc_type;
guint value;
const gchar *str;
- /** XXX: AFAIT only the first 32 entries of the following are actually used. Is this a bug someplace ?? */
- static const gchar *multi_slot_str[64] = {
- "Not specified", /* 00 */
- "Max Rx-Slot/TDMA:1 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:2 Tta:3 Ttb:2 Tra:4 Trb:2 Type:1", /* 01 */
- "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1", /* 02 */
- "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1", /* 03 */
- "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1", /* 04 */
- "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1", /* 05 */
- "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1", /* 06 */
- "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1", /* 07 */
- "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1", /* 08 */
- "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1", /* 09 */
- "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1", /* 10 */
- "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1", /* 11 */
- "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:5 Tta:2 Ttb:1 Tra:2 Trb:1 Type:1", /* 12 */
- "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)", /* 13 */
- "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)", /* 14 */
- "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)", /* 15 */
- "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:2 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)", /* 16 */
- "Max Rx-Slot/TDMA:7 Max Tx-Slot/TDMA:7 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:1 Trb:0 Type:2 (a: 1 with frequency hopping, 0 otherwise)", /* 17 */
- "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:8 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:0 Tra:0 Trb:0 Type:2", /* 18 */
- "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 19 */
- "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 20 */
- "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 21 */
- "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 22 */
- "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 23 */
- "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 24 */
- "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 25 */
- "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 26 */
- "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 27 */
- "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 28 */
- "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:8 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 29 */
- "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1", /* 30 */
- "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1", /* 31 */
- "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1", /* 32 */
- "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1", /* 33 */
- "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1", /* 34 */
- "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 35 */
- "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 36 */
- "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 37 */
- "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 38 */
- "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 39 */
- "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 40 */
- "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 41 */
- "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 42 */
- "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 43 */
- "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 44 */
- "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 45 */
- "Not specified", /* 46 */
- "Not specified", /* 47 */
- "Not specified", /* 48 */
- "Not specified", /* 49 */
- "Not specified", /* 50 */
- "Not specified", /* 51 */
- "Not specified", /* 52 */
- "Not specified", /* 53 */
- "Not specified", /* 54 */
- "Not specified", /* 55 */
- "Not specified", /* 56 */
- "Not specified", /* 57 */
- "Not specified", /* 58 */
- "Not specified", /* 59 */
- "Not specified", /* 60 */
- "Not specified", /* 61 */
- "Not specified", /* 62 */
- "Not specified", /* 63 */
- };
guint indx = 0;
guchar dtm_gprs_mslot = 0;
guchar dtm_egprs_mslot = 4;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_in_oct -= bits_needed;
-
+ bit_offset++;
+
if (( curr_len*8 + bits_in_oct ) < 11 )
break;
curr_bits_length = 11;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_in_oct -= bits_needed;
+ bit_offset++;
break;
}
}
acc_type = oct>>(32-bits_needed);
- proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_tech_type, tvb, bit_offset, 4, FALSE);
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_tech_type, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
bit_offset+=4;
curr_bits_length -= bits_needed;
GET_DATA;
bits_length = curr_bits_length = oct>>(32-bits_needed);
- proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_cap_struct_len, tvb, bit_offset, 7, FALSE);
+
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_cap_struct_len, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
proto_item_set_len(tf, (bits_length>>3)+1);
/* This is already done - length doesn't contain this field
curr_bits_length -= bits_needed;
acc_type = oct>>(32-bits_needed);
- proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_cap_struct_len, tvb, bit_offset, 7, FALSE);
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_cap_struct_len, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
bit_offset+=4;
curr_bits_length -= bits_needed;
{
/* 0 GSM P
* 1 GSM E
- * 2 GSM R
+ * 2 GSM R
* 5 GSM 450
* 6 GSM 480
* 7 GSM 850
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_in_oct -= bits_needed;
-
+
for (i=1; i<= 7 ; i++ )
{
/*
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="controlled early Classmark Sending option is not implemented"; break;
- case 0x01: str="controlled early Classmark Sending option is implemented"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "Controlled early Classmark Sending: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ctrled_early_cm_sending, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="PS capability not present"; break;
- case 0x01: str="PS capability present"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "Pseudo Synchronisation: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_pseudo_sync, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="no VGCS capability or no notifications wanted"; break;
- case 0x01: str="VGCS capability and notifications wanted"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "Voice Group Call Service: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_vgcs, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="no VBS capability or no notifications wanted"; break;
- case 0x01: str="VBS capability and notifications wanted"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "Voice Broadcast Service: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_vbs, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- if ((oct>>(32-bits_needed))==0)
- {
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "Multislot capability: Same values apply for parameters as in the immediately preceding Access capabilities field within this IE (%u)",oct>>(32-bits_needed));
- bit_offset++;
- curr_bits_length -= bits_needed;
- oct <<= bits_needed;
- bits_in_oct -= bits_needed;
- }
- else
- {
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "Multislot capability: Multislot capability struct available (%u)",oct>>(32-bits_needed));
- bit_offset++;
+ value = oct>>(32-bits_needed);
- curr_bits_length -= bits_needed;
- oct <<= bits_needed;
- bits_in_oct -= bits_needed;
+ mc_item = proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_multislot_capability, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+ /* analyse bits */
+ if (value==1)
+ {
+ mc_tree = proto_item_add_subtree(mc_item, ett_gsm_a_gm_msrac_multislot_capability);
/*
* HSCSD multislot class?
*/
/* analyse bits */
if ((oct>>(32-bits_needed))==0)
{
- proto_tree_add_text(tf_tree,
+ proto_tree_add_text(mc_tree,
tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
"HSCSD multislot class: Bits are not available (%u)",oct>>(32-bits_needed));
bit_offset++;
bits_needed = 5;
GET_DATA;
- /* analyse bits */
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "HSCSD multislot class: %s (%u)",multi_slot_str[oct>>(32-bits_needed)],oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_hscsd_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
bit_offset+=5;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
/* analyse bits */
if ((oct>>(32-bits_needed))==0)
{
- proto_tree_add_text(tf_tree,
+ proto_tree_add_text(mc_tree,
tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
"GPRS multislot class: Bits are not available (%u)",oct>>(32-bits_needed));
bit_offset++;
bits_needed = 5;
GET_DATA;
- /* analyse bits */
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "GPRS multislot class: %s (%u)",multi_slot_str[oct>>(32-bits_needed)],oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_gprs_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
bit_offset+=5;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="Extended Dynamic Allocation Capability for GPRS is not implemented"; break;
- case 0x01: str="Extended Dynamic Allocation Capability for GPRS is implemented"; break;
- default: str="This should not happen";
- }
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "GPRS Extended Dynamic Allocation Capability: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_gprs_ext_dyn_alloc_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
/* analyse bits */
if ((oct>>(32-bits_needed))==0)
{
- proto_tree_add_text(tf_tree,
+ proto_tree_add_text(mc_tree,
tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
"SMS/SM values: Bits are not available (%u)",oct>>(32-bits_needed));
bit_offset++;
GET_DATA;
/* analyse bits */
- proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_sms_value, tvb, bit_offset, 4, FALSE);
+ proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_sms_value, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
bit_offset+=4;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
GET_DATA;
/* analyse bits */
- proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_sm_value, tvb, bit_offset, 4, FALSE);
+ proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_sm_value, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
bit_offset+=4;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
/* analyse bits */
if ((oct>>(32-bits_needed))==0)
{
- proto_tree_add_text(tf_tree,
+ proto_tree_add_text(mc_tree,
tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
"ECSD multislot class: Bits are not available (%u)",oct>>(32-bits_needed));
bit_offset++;
bits_needed = 5;
GET_DATA;
- /* analyse bits */
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "ECSD multislot class: %s (%u)",multi_slot_str[oct>>(32-bits_needed)],oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ecsd_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
bit_offset+=5;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
/* analyse bits */
if ((oct>>(32-bits_needed))==0)
{
- proto_tree_add_text(tf_tree,
+ proto_tree_add_text(mc_tree,
tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
"EGPRS multislot class: Bits are not available (%u)",oct>>(32-bits_needed));
curr_bits_length -= bits_needed;
bits_needed = 5;
GET_DATA;
- /* analyse bits */
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "EGPRS multislot class: %s (%u)",multi_slot_str[oct>>(32-bits_needed)],oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_egprs_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
bit_offset+=5;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="Extended Dynamic Allocation Capability for EGPRS is not implemented"; break;
- case 0x01: str="Extended Dynamic Allocation Capability for EGPRS is implemented"; break;
- default: str="This should not happen";
- }
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "EGPRS Extended Dynamic Allocation Capability: %s (%u)",str, oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_egprs_ext_dyn_alloc_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
/* analyse bits */
if ((oct>>(32-bits_needed))==0)
{
- proto_tree_add_text(tf_tree,
+ proto_tree_add_text(mc_tree,
tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
"DTM GPRS Multi Slot Class: Bits are not available (%u)",oct>>(32-bits_needed));
bit_offset++;
/* analyse bits */
dtm_gprs_mslot = oct>>(32-bits_needed);
- switch ( oct>>(32-bits_needed) )
- {
- case 0: str="Unused. If received, the network shall interpret this as Multislot class 5"; break;
- case 1: str="Multislot class 5 supported"; break;
- case 2: str="Multislot class 9 supported"; break;
- case 3: str="Multislot class 11 supported"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "DTM GPRS Multi Slot Class: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
bit_offset+=2;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="Single Slot DTM not supported"; break;
- case 0x01: str="Single Slot DTM supported"; break;
- default: str="This should not happen";
- }
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "Single Slot DTM: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_rac_single_slt_dtm, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
/* analyse bits */
dtm_egprs_mslot = oct>>(32-bits_needed);
+ proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_rac_dtm_egprs_multi_slot_cls_pres, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
- if ((oct>>(32-bits_needed))==0)
- {
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "DTM EGPRS Multi Slot Class: Bits are not available (%u)",oct>>(32-bits_needed));
- bit_offset++;
- curr_bits_length -= bits_needed;
- oct <<= bits_needed;
- bits_in_oct -= bits_needed;
- }
- else
+ if ((oct>>(32-bits_needed))==1)
{
- curr_bits_length -= bits_needed;
- oct <<= bits_needed;
- bits_in_oct -= bits_needed;
- bit_offset++;
-
/*
* DTM EGPRS Multi Slot Class
*/
bits_needed = 2;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0: str="Unused. If received, the network shall interpret this as Multislot class 5"; break;
- case 1: str="Multislot class 5 supported"; break;
- case 2: str="Multislot class 9 supported"; break;
- case 3: str="Multislot class 11 supported"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "DTM EGPRS Multi Slot Class: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_egprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
bit_offset+=2;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_8psk_pow_cap_pres, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
/* analyse bits */
- if ((oct>>(32-bits_needed))==0)
- {
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "8PSK Power Capability: Bits are not available (%u)",oct>>(32-bits_needed));
- bit_offset++;
- curr_bits_length -= bits_needed;
- oct <<= bits_needed;
- bits_in_oct -= bits_needed;
- }
- else
+ if ((oct>>(32-bits_needed))==1)
{
- curr_bits_length -= bits_needed;
- oct <<= bits_needed;
- bits_in_oct -= bits_needed;
- bit_offset++;
-
/*
* 8PSK Power Capability
*/
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="COMPACT Interference Measurement Capability is not implemented"; break;
- case 0x01: str="COMPACT Interference Measurement Capability is implemented"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "COMPACT Interference Measurement Capability: %s (%u)", str, oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_comp_int_meas_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="The ME is Release 98 or older"; break;
- case 0x01: str="The ME is Release 99 onwards"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "Revision Level Indicator: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rel_lev_ind, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="UMTS FDD not supported"; break;
- case 0x01: str="UMTS FDD supported"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "UMTS FDD Radio Access Technology Capability: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_umts_fdd_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="UMTS 3.84 Mcps TDD not supported"; break;
- case 0x01: str="UMTS 3.84 Mcps TDD supported"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "UMTS 3.84 Mcps TDD Radio Access Technology Capability: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_umts_384_tdd_ra_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="CDMA 2000 not supported"; break;
- case 0x01: str="CDMA 2000 supported"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "CDMA 2000 Radio Access Technology Capability: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_cdma2000_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="UMTS 1.28 Mcps TDD not supported"; break;
- case 0x01: str="UMTS 1.28 Mcps TDD supported"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "UMTS 1.28 Mcps TDD Radio Access Technology Capability: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_umts_128_tdd_ra_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="GERAN feature package 1 not supported"; break;
- case 0x01: str="GERAN feature package 1 supported"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "GERAN Feature Package 1: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_feat_pkg, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
/*
* Extended DTM (E)GPRS Multi Slot Class
*/
+
bits_needed = 1;
GET_DATA;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_in_oct -= bits_needed;
+ bit_offset++;
/*
* Extended DTM GPRS Multi Slot Class
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="Modulation based multislot class not supported"; break;
- case 0x01: str="Modulation based multislot class supported"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "Modulation based multislot class support: %s (%u)",str,oct>>(32-bits_needed));
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_mod_based_multi_slot_class_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset++;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_needed = 1;
GET_DATA;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
+ value = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_iu_mode_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;
+ if (value)
{
- case 0x00: str="GERAN Iu mode not supported"; break;
- case 0x01: str="GERAN Iu mode supported"; break;
+ /* GERAN Iu Mode Capabilities struct present */
+ bits_needed = 4;
+ GET_DATA;
+ value = tvb_get_bits8(tvb, bit_offset, 4);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+ if (value)
+ {
+ /*
+ * FLO Iu Capability
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_flo_iu_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;
+ value--;
+
+ /* skip spare bits */
+ bit_offset+=value;
+ curr_bits_length -= value;
+ oct <<= value;
+ bits_in_oct -= value;
+ }
+ }
+
+ /*
+ * GMSK Multislot Power Profile
+ */
+ bits_needed = 2;
+ GET_DATA;
+
+ /* analyse bits */
+ switch ( oct>>(32-bits_needed) )
+ {
+ case 0x00: str="GMSK_MULTISLOT_POWER_PROFILE 0"; break;
+ case 0x01: str="GMSK_MULTISLOT_POWER_PROFILE 1"; break;
+ case 0x02: str="GMSK_MULTISLOT_POWER_PROFILE 2"; break;
+ case 0x03: str="GMSK_MULTISLOT_POWER_PROFILE 3"; break;
default: str="This should not happen";
}
proto_tree_add_text(tf_tree,
tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "GERAN Iu Mode Capability: %s (%u)",str,oct>>(32-bits_needed));
- bit_offset++;
+ "GMSK Multislot Power Profile: %s (%u)",str,oct>>(32-bits_needed));
+ bit_offset+=2;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_in_oct -= bits_needed;
/*
- * GMSK/8-PSK Multislot Power Profile
+ * 8-PSK Multislot Power Profile
*/
- bits_needed = 1;
+ bits_needed = 2;
GET_DATA;
/* analyse bits */
+ switch ( oct>>(32-bits_needed) )
+ {
+ case 0x00: str="8-PSK_MULTISLOT_POWER_PROFILE 0"; break;
+ case 0x01: str="8-PSK_MULTISLOT_POWER_PROFILE 1"; break;
+ case 0x02: str="8-PSK_MULTISLOT_POWER_PROFILE 2"; break;
+ case 0x03: str="8-PSK_MULTISLOT_POWER_PROFILE 3"; break;
+ default: str="This should not happen";
+ }
+
+ proto_tree_add_text(tf_tree,
+ tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
+ "8-PSK Multislot Power Profile: %s (%u)",str,oct>>(32-bits_needed));
+ bit_offset+=2;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * Release 6
+ */
+
+ /*
+ * Multiple TBF Capability
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_mult_tbf_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;
+
+ /*
+ * Downlink Advanced Receiver Performance
+ */
+ bits_needed = 2;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_down_adv_rec_perf, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * Extended RLC/MAC Control Message Segmentation Capability
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ext_rlc_mac_ctrl_msg_seg_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;
+
+ /*
+ * DTM Enhancements Capability
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_enh_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;
+
+ /*
+ * DTM GPRS High Multi Slot Class & DTM EGPRS High Multi Slot Class
+ */
+ bits_needed = 1;
+ GET_DATA;
if ((oct>>(32-bits_needed))==0)
{
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "GMSK/8-PSK Multislot Power Profile: Bits are not available (%u)",oct>>(32-bits_needed));
- bit_offset++;
+ bit_offset+=bits_needed;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
- bits_in_oct -= bits_needed;
+ bits_in_oct -= bits_needed;
}
else
{
+ bit_offset+=bits_needed;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_in_oct -= bits_needed;
- bit_offset++;
/*
- * GMSK Multislot Power Profile
+ * DTM GPRS High Multi Slot Class
*/
- bits_needed = 2;
+ bits_needed = 3;
GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_gprs_high_multi_slot_class, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
+ bits_needed = 1;
+ GET_DATA;
+ if ((oct>>(32-bits_needed))==0)
{
- case 0x00: str="GMSK_MULTISLOT_POWER_PROFILE 0"; break;
- case 0x01: str="GMSK_MULTISLOT_POWER_PROFILE 1"; break;
- case 0x02: str="GMSK_MULTISLOT_POWER_PROFILE 2"; break;
- case 0x03: str="GMSK_MULTISLOT_POWER_PROFILE 3"; break;
- default: str="This should not happen";
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
}
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "GMSK Multislot Power Profile: %s (%u)",str,oct>>(32-bits_needed));
- bit_offset+=2;
+ else
+ {
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * DTM EGPRS High Multi Slot Class
+ */
+ bits_needed = 3;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_egprs_high_multi_slot_class, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+ }
+ }
+
+ /*
+ * PS Handover Capability
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ps_ho_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;
+
+ /*
+ * Release 7
+ */
+
+ /*
+ * DTM Handover Capability
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_ho_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;
+
+ /*
+ * Multislot Capability Reduction for Downlink Dual Carrier & Downlink Dual Carrier for DTM Capability
+ */
+ bits_needed = 1;
+ GET_DATA;
+ if ((oct>>(32-bits_needed))==0)
+ {
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+ }
+ else
+ {
+ bit_offset+=bits_needed;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_in_oct -= bits_needed;
/*
- * 8-PSK Multislot Power Profile
+ * Multislot Capability Reduction for Downlink Dual Carrier
*/
- bits_needed = 2;
+ bits_needed = 3;
GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_multi_slot_cap_red_down_dual_carrier, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
- /* analyse bits */
- switch ( oct>>(32-bits_needed) )
- {
- case 0x00: str="8-PSK_MULTISLOT_POWER_PROFILE 0"; break;
- case 0x01: str="8-PSK_MULTISLOT_POWER_PROFILE 1"; break;
- case 0x02: str="8-PSK_MULTISLOT_POWER_PROFILE 2"; break;
- case 0x03: str="8-PSK_MULTISLOT_POWER_PROFILE 3"; break;
- default: str="This should not happen";
- }
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
- "8-PSK Multislot Power Profile: %s (%u)",str,oct>>(32-bits_needed));
- bit_offset+=2;
+ /*
+ * Downlink Dual Carrier for DTM Capability
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_down_dual_carrier_dtm_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;
+ }
+
+ /*
+ * Flexible Timeslot Assignment
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_flex_ts_assign, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * GAN PS Handover Capability
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_gan_ps_ho_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;
+
+ /*
+ * RLC Non-persistent Mode
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_rlc_non_pers_mode, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * Reduced Latency Capability
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_reduced_lat_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;
+
+ /*
+ * Uplink EGPRS2
+ */
+ bits_needed = 2;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ul_egprs2, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * Downlink EGPRS2
+ */
+ bits_needed = 2;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dl_egprs2, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * Release 8
+ */
+
+ /*
+ * E-UTRA FDD support
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_fdd_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * E-UTRA TDD support
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_tdd_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * GERAN to E-UTRA support in GERAN packet transfer mode
+ */
+ bits_needed = 2;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_to_eutra_support_in_geran_ptm, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * Priority-based reselection support
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_prio_based_resel_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * Release 9
+ */
+
+ /*
+ * Enhanced Flexible Timeslot Assignment
+ */
+ bits_needed = 1;
+ GET_DATA;
+ if ((oct>>(32-bits_needed))==0)
+ {
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+ }
+ else
+ {
+ bit_offset+=bits_needed;
curr_bits_length -= bits_needed;
oct <<= bits_needed;
bits_in_oct -= bits_needed;
+ /*
+ * Alternative EFTA Multislot Class
+ */
+ bits_needed = 4;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_alt_efta_multi_slot_class, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * EFTA Multislot Capability Reduction for Downlink Dual Carrier
+ */
+ bits_needed = 3;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_efta_multi_slot_cap_red_down_dual_carrier, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
}
+
+ /*
+ * Indication of Upper Layer PDU Start Capability for RLC UM
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ind_up_layer_pdu_start_cap_for_rlc_um, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * EMST Capability
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_emst_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;
+
+ /*
+ * MTTI Capability
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_mtti_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;
+
+ /*
+ * UTRA CSG Cells Reporting
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_utra_csg_cell_report, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset+=bits_needed;
+ curr_bits_length -= bits_needed;
+ oct <<= bits_needed;
+ bits_in_oct -= bits_needed;
+
+ /*
+ * E-UTRA CSG Cells Reporting
+ */
+ bits_needed = 1;
+ GET_DATA;
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_csg_cell_report, tvb, bit_offset, 1, 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
bits_in_oct -= bits_needed;
}
+
} while ( 1 );
curr_offset+= curr_len;
-
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
return(curr_offset - offset);
}
{ 0x70, 0xff, "Protocol error, unspecified(Not def in v8.6.0)"},
{ 0, 0, NULL }
};
-/* NOTE 1 TS 124 008 V8.6.0 (2009-07)
+/* NOTE 1 TS 124 008 V8.6.0 (2009-07)
"Any other value received by the mobile station shall be treated as 0110 1111, "Protocol
error, unspecified". Any other value received by the network shall be treated as
0110 1111, "Protocol error, unspecified".
/* NOTE: The listed reject cause values are defined in annex G. */
static guint16
-de_gmm_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_cause(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;
curr_offset = offset;
- proto_tree_add_item(tree, hf_gsm_a_gm_cause, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_gm_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset++;
* [7] 10.5.5.15 Routing area identification
*/
guint16
-de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
proto_tree *subtree;
proto_item *item;
mcc,mnc,lac,rac);
subtree = proto_item_add_subtree(item, ett_gmm_rai);
- dissect_e212_mcc_mnc(tvb, gsm_a_dtap_pinfo, subtree, offset);
+ dissect_e212_mcc_mnc(tvb, pinfo, subtree, offset, TRUE);
- proto_tree_add_item(subtree, hf_gsm_a_lac, tvb, curr_offset+3, 2, FALSE);
- proto_tree_add_item(subtree, hf_gsm_a_gm_rac, tvb, curr_offset+5, 1, FALSE);
+ proto_tree_add_item(subtree, hf_gsm_a_lac, tvb, curr_offset+3, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_gsm_a_gm_rac, tvb, curr_offset+5, 1, ENC_BIG_ENDIAN);
curr_offset+=6;
+ if (add_string)
+ {
+ if (add_string[0] == '\0')
+ {
+ g_snprintf(add_string, string_len, " - RAI: %x-%x-%u-%u", mcc,mnc,lac,rac);
+ }
+ }
+
/* no length check possible */
return(curr_offset - offset);
}
+/*
+ * [7] 10.5.5.15a Routing area identification 2
+ */
+static guint16
+de_gmm_rai2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+{
+ /* The routing area identification 2 value is coded as octet 2 to 7 of the Routing area identification information element. */
+ return de_gmm_rai(tvb, tree, pinfo, offset, len, add_string, string_len);
+}
+
/*
* [7] 10.5.5.17
*/
static guint16
-de_gmm_update_res(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_update_res(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;
};
static guint16
-de_gmm_update_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_update_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
proto_item *tf = NULL;
proto_tree *tf_tree = NULL;
- proto_tree_add_bits_item(tree, hf_gsm_a_gm_ciph_key_seq_num, tvb, offset << 3, 4, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_ciph_key_seq_num, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
tf = proto_tree_add_text(tree,
tvb, offset, 1,
tf_tree = proto_item_add_subtree(tf, ett_gmm_update_type );
- proto_tree_add_item(tf_tree, hf_gsm_a_gm_for, tvb, offset, 1, FALSE);
- proto_tree_add_item(tf_tree, hf_gsm_a_gm_update_type, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tf_tree, hf_gsm_a_gm_for, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tf_tree, hf_gsm_a_gm_update_type, tvb, offset, 1, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
* [9] 10.5.5.19 A&C reference number (lower nibble)
*/
static guint16
-de_gmm_ac_ref_nr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ac_ref_nr(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
/* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE LOWER NIBBLE */
- proto_tree_add_bits_item(tree, hf_gsm_a_gm_ac_ref_nr, tvb, (offset << 3) + 4, 4, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_ac_ref_nr, tvb, (offset << 3) + 4, 4, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
* [9] 10.5.5.19 A&C reference number (higher nibble)
*/
static guint16
-de_gmm_ac_ref_nr_h(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ac_ref_nr_h(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
/* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
- proto_tree_add_bits_item(tree, hf_gsm_a_gm_ac_ref_nr, tvb, offset << 3, 4, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_ac_ref_nr, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
};
static guint16
-de_gmm_service_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_service_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 bit_offset;
bit_offset = offset << 3;
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset += 1;
- proto_tree_add_bits_item(tree, hf_gsm_a_gm_serv_type, tvb, bit_offset, 3, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_serv_type, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
bit_offset += 3;
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
bit_offset += 1;
- proto_tree_add_bits_item(tree, hf_gsm_a_gm_ciph_key_seq_num, tvb, bit_offset, 3, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_ciph_key_seq_num, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
};
static guint16
-de_gmm_ps_lcs_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ps_lcs_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
curr_offset = offset;
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 2, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_gm_apc, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_gm_otd_a, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_gm_otd_b, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_gm_gps_a, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_gm_gps_b, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_gm_gps_c, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_gm_apc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_gm_otd_a, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_gm_otd_b, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_gm_gps_a, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_gm_gps_b, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_gm_gps_c, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset++;
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
return(curr_offset - offset);
}
* [7] 10.5.5.23
*/
static guint16
-de_gmm_net_feat_supp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+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;
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_text(tree,
+ tvb, curr_offset, 1,
+ "Network Feature Support: %s (%u)",
+ str,
+ (oct>>3)&1);
+
+ curr_offset++;
+
+ /* no length check possible */
+
+ return(curr_offset - offset);
+}
+
+/* [7] 10.5.5.24 Inter RAT information container */
+static guint16
+de_gmm_rat_info_container(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset;
+ tvbuff_t *rrc_irat_ho_info_tvb;
+
+ curr_offset = offset;
+
+/* The value part of the Inter RAT information container information element is the INTER RAT HANDOVER INFO as
+defined in 3GPP TS 25.331 [23c]. If this field includes padding bits, they are defined in 3GPP TS 25.331 [23c].*/
+ rrc_irat_ho_info_tvb = tvb_new_subset(tvb, curr_offset, len, len);
+ if (rrc_irat_ho_info_handle)
+ call_dissector(rrc_irat_ho_info_handle, rrc_irat_ho_info_tvb,pinfo , tree);
+ else
+ proto_tree_add_text(tree, tvb, curr_offset, len,"INTER RAT HANDOVER INFO - Not decoded");
+
+ return len;
+
+}
+
+/* [7] 10.5.5.25 Requested MS information */
+static const true_false_string gsm_a_gm_req_ms_info_irat_vals = {
+ "Inter RAT information container IE requested",
+ "Inter RAT information container IE not requested"
+};
+static const true_false_string gsm_a_gm_req_ms_info_irat2_vals = {
+ "E-UTRAN inter RAT information container IE requested",
+ "E-UTRAN inter RAT information container IE not requested"
+};
+
+static guint16
+de_gmm_req_ms_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset;
+ guint32 bit_offset;
+ curr_offset = offset;
+ bit_offset = (curr_offset<<3)+4;
+
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_req_ms_info_irat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_req_ms_info_irat2, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+ bit_offset+=2;
curr_offset++;
- /* no length check possible */
-
- return(curr_offset - offset);
+ return len;
}
-/* [7] 10.5.5.24 Inter RAT information container */
+/* [7] 10.5.5.26 UE network capability
+ * See subclause 9.9.3.x in 3GPP TS 24.301 [120].
+ */
+
+/* [7] 10.5.5.27 E-UTRAN inter RAT information container */
static guint16
-de_gmm_rat_info_container(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_gmm_eutran_irat_info_container(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
- tvbuff_t *rrc_irat_ho_info_tvb;
+ tvbuff_t *lte_rrc_ue_eutra_cap_tvb;
curr_offset = offset;
-/* The value part of the Inter RAT information container information element is the INTER RAT HANDOVER INFO as
-defined in 3GPP TS 25.331 [23c]. If this field includes padding bits, they are defined in 3GPP TS 25.331 [23c].*/
- rrc_irat_ho_info_tvb = tvb_new_subset(tvb, curr_offset, len, len);
- if (rrc_irat_ho_info_handle)
- call_dissector(rrc_irat_ho_info_handle, rrc_irat_ho_info_tvb, gsm_a_dtap_pinfo , tree);
+/* The value part of the E-UTRAN inter RAT information container information element
+ is formatted and coded according to the UE-EUTRA-Capability IE defined in 3GPP TS 36.331 [129]*/
+ lte_rrc_ue_eutra_cap_tvb = tvb_new_subset(tvb, curr_offset, len, len);
+ if (lte_rrc_ue_eutra_cap_handle)
+ call_dissector(lte_rrc_ue_eutra_cap_handle, lte_rrc_ue_eutra_cap_tvb, pinfo, tree);
else
- proto_tree_add_text(tree, tvb, curr_offset, len,"INTER RAT HANDOVER INFO - Not decoded");
+ proto_tree_add_text(tree, tvb, curr_offset, len,"E-UTRAN Inter RAT information container - Not decoded");
return len;
+}
+
+/* [7] 10.5.5.28 Voice domain preference and UE's usage setting */
+static const true_false_string gsm_a_gm_ue_usage_setting_vals = {
+ "Data centric",
+ "Voice centric"
+};
+static const value_string gsm_a_gm_voice_domain_pref_for_eutran_vals[] = {
+ {0x0, "CS Voice only"},
+ {0x1, "IMS PS Voice only"},
+ {0x2, "CS voice preferred, IMS PS Voice as secondary"},
+ {0x3, "IMS PS voice preferred, CS Voice as secondary"},
+ { 0, NULL }
+};
+
+static guint16
+de_gmm_voice_domain_pref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset;
+ guint32 bit_offset;
+
+ curr_offset = offset;
+ bit_offset = curr_offset<<3;
+
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
+ bit_offset+=5;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_ue_usage_setting, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_voice_domain_pref_for_eutran, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+ bit_offset+=2;
+ curr_offset++;
+ return len;
}
/*
* [7] 10.5.7.1
*/
static guint16
-de_gc_context_stat(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gc_context_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint8 oct;
guint16 pdp_nr;
curr_offset++;
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
return(curr_offset - offset);
}
* [7] 10.5.7.2
*/
static guint16
-de_gc_radio_prio(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gc_radio_prio(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;
};
static guint16
-de_gc_timer(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gc_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;
str);
subtree = proto_item_add_subtree(item, ett_gmm_gprs_timer);
- proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer_unit, tvb, offset, 1, FALSE);
- proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer_value, tvb, offset, 1, FALSE);
+ proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
* [7] 10.5.7.4
*/
static guint16
-de_gc_timer2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string, int string_len _U_)
+de_gc_timer2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string, int string_len _U_)
{
guint8 oct;
guint16 val;
* [7] 10.5.7.5
*/
static guint16
-de_gc_radio_prio2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gc_radio_prio2(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;
* [8] 10.5.7.6 MBMS context status
*/
static guint16
-de_gc_mbms_context_stat(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_gc_mbms_context_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
- guint8 oct, i, j;
+ guint i;
+ guint8 oct, j;
proto_item *tf = NULL;
proto_tree *tf_tree = NULL;
return(len);
}
+
+/*
+ * [8] 10.5.7.7 Uplink data status
+ */
+static const true_false_string gsm_a_gm_nsapi_ul_stat_vals = {
+ "uplink data are pending for the preserved PDP context",
+ "no uplink data are pending for the preserved PDP context or the PDP context is PDP-INACTIVE or is PDP-ACTIVE with a RAB already established"
+};
+
+static guint16
+de_gc_uplink_data_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset;
+ guint32 bit_offset;
+
+ curr_offset = offset;
+ bit_offset = curr_offset<<3;
+
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_7_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_6_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_5_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
+ bit_offset+=5;
+ curr_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_15_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_14_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_13_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_12_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_11_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_10_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_9_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_8_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ curr_offset++;
+
+ return(len);
+}
+
/*
* [7] 10.5.6.1
*/
-#define MAX_APN_LENGTH 50
+#define MAX_APN_LENGTH 100
guint16
-de_sm_apn(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len _U_)
+de_sm_apn(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len _U_)
{
guint32 curr_offset;
guint curr_len;
- const guint8 *cptr;
guint8 str[MAX_APN_LENGTH+1];
- cptr = tvb_get_ptr(tvb, offset, len);
-
curr_offset = offset;
/* init buffer and copy it */
memset ( str , 0 , MAX_APN_LENGTH );
- memcpy ( str , cptr , len<MAX_APN_LENGTH?len:MAX_APN_LENGTH );
+ tvb_memcpy(tvb, str, offset, len<MAX_APN_LENGTH?len:MAX_APN_LENGTH);
curr_len = 0;
while (( curr_len < len ) && ( curr_len < MAX_APN_LENGTH ))
curr_offset+= len;
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
return(curr_offset - offset);
}
* [7] 10.5.6.2
*/
static guint16
-de_sm_nsapi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string, int string_len _U_)
+de_sm_nsapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string, int string_len _U_)
{
guint8 oct;
guint32 curr_offset;
/*
* [7] 10.5.6.3 Protocol configuration options
*/
-#if 0
static const value_string gsm_a_sm_pco_ms2net_prot_vals[] = {
- { 0x01, "P-CSCF Address Request" },
+ { 0x01, "P-CSCF IPv6 Address Request" },
{ 0x02, "IM CN Subsystem Signaling Flag" },
- { 0x03, "DNS Server Address Request" },
+ { 0x03, "DNS Server IPv6 Address Request" },
{ 0x04, "Not Supported" },
{ 0x05, "MS Support of Network Requested Bearer Control indicator" },
{ 0x06, "Reserved" },
{ 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" },
{ 0, NULL }
};
static const value_string gsm_a_sm_pco_net2ms_prot_vals[] = {
- { 0x01, "P-CSCF Address" },
+ { 0x01, "P-CSCF IPv6 Address" },
{ 0x02, "IM CN Subsystem Signaling Flag" },
- { 0x03, "DNS Server Address" },
+ { 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" },
{ 0, NULL }
};
-#endif
+
+static const value_string gsm_a_gm_link_dir_vals[] = {
+ { -1, "Unknown" },
+ { 0x0, "MS to network" },
+ { 0x1, "Network to MS" },
+ { 0, NULL }
+};
+
guint16
-de_sm_pco(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_pco(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
+ proto_item *generated_item = NULL;
guint32 curr_offset;
guint curr_len;
guchar oct;
struct e_in6_addr ipv6_addr;
+ int link_dir;
curr_len = len;
curr_offset = offset;
oct = tvb_get_guint8(tvb, curr_offset);
- proto_tree_add_item(tree, hf_gsm_a_gm_sm_ext, tvb, curr_offset, 1, FALSE);
- proto_tree_add_text(tree,tvb, curr_offset, 1, "Configuration Protocol: PPP (%u)",oct&0x0f);
+ link_dir = pinfo->link_dir;
+ generated_item =proto_tree_add_int(tree, hf_gsm_a_gm_link_dir, tvb, curr_offset, 0, link_dir);
+ PROTO_ITEM_SET_GENERATED(generated_item);
+
+
+ /* 1 ext 0 0 0 0 Spare Configuration protocol */
+ proto_tree_add_item(tree, hf_gsm_a_gm_sm_ext, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ /* Configuration protocol (octet 3)
+ * Bits
+ * 3 2 1
+ * 0 0 0 PPP for use with IP PDP type or IP PDN type (see 3GPP TS 24.301 [120])
+ *
+ * All other values are interpreted as PPP in this version of the protocol.
+ * (3GPP TS 24.008 version 9.4.0 Release 9)
+ */
+ proto_tree_add_text(tree,tvb, curr_offset, 1, "Configuration Protocol: PPP (%u)",oct&0x07);
curr_len--;
curr_offset++;
tvbuff_t *l3_tvb;
dissector_handle_t handle = NULL;
+ /* Protocol ID 1 octet 4
+ * octet 5
+ * Length of protocol ID 1 contents octet 6
+ * Protocol ID 1 contents octet 7
+ */
+
prot = tvb_get_ntohs(tvb,curr_offset);
- e_len = tvb_get_guint8(tvb, curr_offset+2);
- curr_len-=3;
- curr_offset+=3;
+ proto_tree_add_uint_format(tree, hf_gsm_a_gm_pco_pid, tvb, curr_offset, 2, (guint32)prot,
+ "Protocol or Container ID: %s (%u)",
+ link_dir ?
+ val_to_str_const((guint32)prot, gsm_a_sm_pco_net2ms_prot_vals, val_to_str_ext_const(prot, &ppp_vals_ext, "Unknown")) :
+ val_to_str_const((guint32)prot, gsm_a_sm_pco_ms2net_prot_vals, val_to_str_ext_const(prot, &ppp_vals_ext, "Unknown")),
+ (guint32)prot);
+
+ curr_len-=2;
+ curr_offset+=2;
+ e_len = tvb_get_guint8(tvb, curr_offset);
+ proto_tree_add_text(tree,tvb, curr_offset, 1, "Length: 0x%02x (%u)", e_len , e_len);
+ curr_len-=1;
+ curr_offset+=1;
switch ( prot )
{
case 0x0001:
{
- if (e_len == 0) {
- proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Parameter: (%u) P-CSCF Address Request" , prot );
- } else {
- proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Parameter: (%u) P-CSCF Address" , prot );
- }
- proto_tree_add_text(tree,tvb, curr_offset-1, 1, "Length: 0x%02x (%u)", e_len , e_len);
-
if (e_len > 0) {
tvb_get_ipv6(tvb, curr_offset, &ipv6_addr);
proto_tree_add_text(tree,
break;
}
case 0x0002:
- proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Parameter: (%u) IM CN Subsystem Signaling Flag" , prot );
- proto_tree_add_text(tree,tvb, curr_offset-1, 1, "Length: 0x%02x (%u)", e_len , e_len);
break;
case 0x0003:
{
- if (e_len == 0) {
- proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Parameter: (%u) DNS Server Address Request" , prot );
- } else {
- proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Parameter: (%u) DNS Server Address" , prot );
- }
- proto_tree_add_text(tree,tvb, curr_offset-1, 1, "Length: 0x%02x (%u)", e_len , e_len);
-
if (e_len > 0) {
tvb_get_ipv6(tvb, curr_offset, &ipv6_addr);
proto_tree_add_text(tree,
break;
}
case 0x0004:
- proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Parameter: (%u) Policy Control rejection code" , prot );
- proto_tree_add_text(tree,tvb, curr_offset-1, 1, "Length: 0x%02x (%u)", e_len , e_len);
oct = tvb_get_guint8(tvb, curr_offset);
proto_tree_add_text(tree,tvb, curr_offset, 1, "Reject Code: 0x%02x (%u)", e_len , e_len);
break;
default:
{
- handle = dissector_get_port_handle ( gprs_sm_pco_subdissector_table , prot );
+ handle = dissector_get_uint_handle ( gprs_sm_pco_subdissector_table , prot );
if ( handle != NULL )
{
- proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Protocol: %s (%u)" ,
- val_to_str(prot, ppp_vals, "Unknown"), prot);
- proto_tree_add_text(tree,tvb, curr_offset-1, 1, "Length: 0x%02x (%u)", e_len , e_len);
/*
* dissect the embedded message
*/
l3_tvb = tvb_new_subset(tvb, curr_offset, e_len, e_len);
- call_dissector(handle, l3_tvb , gsm_a_dtap_pinfo , tree );
+ /* In this case we do not want the columns updated */
+ col_set_writable(pinfo->cinfo, FALSE);
+ call_dissector(handle, l3_tvb , pinfo , tree );
+ col_set_writable(pinfo->cinfo, TRUE);
}
else
{
- proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Protocol/Parameter: (%u) unknown" , prot );
- proto_tree_add_text(tree,tvb, curr_offset-1, 1, "Length: 0x%02x (%u)", e_len , e_len);
/*
* dissect the embedded DATA message
*/
l3_tvb = tvb_new_subset(tvb, curr_offset, e_len, e_len);
- call_dissector(data_handle, l3_tvb, gsm_a_dtap_pinfo , tree);
+ call_dissector(data_handle, l3_tvb, pinfo , tree);
}
}
}
}
curr_offset+= curr_len;
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
return(curr_offset - offset);
}
};
static guint16
-de_sm_pdp_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_pdp_addr(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
- guint curr_len;
const gchar *str;
guchar pdp_type_org, pdp_type_num;
- curr_len = len;
curr_offset = offset;
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 4, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_sm_pdp_type_org, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_sm_pdp_type_org, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
pdp_type_org = tvb_get_guint8(tvb, curr_offset) & 0x0f;
curr_offset += 1;
if (pdp_type_org == 0 )
{
+ /* ETSI allocated address */
switch (pdp_type_num)
{
case 0x00: str="Reserved, used in earlier version of this protocol"; break;
}
else if (pdp_type_org == 1)
{
+ /* IETF allocated addres */
switch (pdp_type_num)
{
case 0x21: str="IPv4 address"; break;
else if ((pdp_type_num == 0) && (pdp_type_org == 0x0f))
str="Empty";
else
- str="Not specified";
+ str="Not specified";
proto_tree_add_text(tree,
tvb, curr_offset, 1,
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"Dynamic addressing");
-
+ curr_offset += 1;
return(curr_offset - offset);
}
else if ( len == 2 )
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"No PDP address is included");
-
+ curr_offset += 1;
return(curr_offset - offset);
}
curr_offset += 1;
- if (pdp_type_org == 1)
+ if (pdp_type_org == 1)
switch (pdp_type_num)
{
case 0x57:
- proto_tree_add_item(tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,FALSE);
+ proto_tree_add_item(tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,ENC_NA);
curr_offset+=16;
break;
case 0x8d:
- proto_tree_add_item(tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,FALSE);
+ proto_tree_add_item(tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,ENC_BIG_ENDIAN);
curr_offset+=4;
- proto_tree_add_item(tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,FALSE);
+ proto_tree_add_item(tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,ENC_NA);
curr_offset+=16;
break;
default:
- proto_tree_add_item(tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,FALSE);
+ proto_tree_add_item(tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,ENC_BIG_ENDIAN);
curr_offset+=4;
}
-
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
return(curr_offset - offset);
}
}
guint16
-de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_qos(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
guchar oct, tmp_oct;
curr_offset = offset;
/* Octet 3 */
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 2, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_qos_delay_cls, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_qos_reliability_cls, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_qos_delay_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_qos_reliability_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset+= 1;
/* Octet 4 */
oct = tvb_get_guint8(tvb, curr_offset);
- proto_tree_add_item(tree, hf_gsm_a_qos_peak_thr, tvb, curr_offset, 1, FALSE);
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3) + 4, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_qos_prec_class, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_qos_peak_thr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3) + 4, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_qos_prec_class, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset+= 1;
/* Octet 5 */
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_qos_mean_thr, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_qos_mean_thr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset+= 1;
NO_MORE_DATA_CHECK(len);
/* Octet 6 */
- proto_tree_add_item(tree, hf_gsm_a_qos_traffic_cls, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_qos_del_order, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_qos_del_of_err_sdu, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_qos_traffic_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_qos_del_order, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_qos_del_of_err_sdu, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset+= 1;
NO_MORE_DATA_CHECK(len);
default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
}
- proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_upl, tvb,
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_upl, tvb,
curr_offset, 1, oct, "%s (%u)", str, oct);
curr_offset+= 1;
default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
}
- proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_downl, tvb,
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_downl, tvb,
curr_offset, 1, oct, "%s (%u)", str, oct);
curr_offset+= 1;
NO_MORE_DATA_CHECK(len);
/* Octet 10 */
- proto_tree_add_item(tree, hf_gsm_a_qos_ber, tvb, curr_offset, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_qos_sdu_err_rat, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_qos_ber, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_qos_sdu_err_rat, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset+= 1;
NO_MORE_DATA_CHECK(len);
str = ep_strdup_printf("%u ms", temp32);
}
- proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_trans_delay, tvb,
+ 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;
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,
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_traf_handl_prio, tvb,
curr_offset, 1, oct, "%s (%u)", str, tmp_oct);
curr_offset+= 1;
default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
}
- proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_upl, tvb,
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_upl, tvb,
curr_offset, 1, oct, "%s (%u)", str, oct);
curr_offset+= 1;
default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
}
- proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_downl, tvb,
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_downl, tvb,
curr_offset, 1, oct, "%s (%u)", str, oct);
curr_offset+= 1;
/* Ocet 14 */
oct = tvb_get_guint8(tvb, curr_offset);
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_qos_signalling_ind, tvb , curr_offset, 1, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_qos_signalling_ind, tvb , curr_offset, 1, ENC_BIG_ENDIAN);
tmp_oct = oct & 7;
if (tmp_oct == 0x01)
else
str = "unknown";
- proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_source_stat_desc, tvb,
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_source_stat_desc, tvb,
curr_offset, 1, oct, "%s (%u)", str, tmp_oct);
curr_offset+= 1;
else
str = ep_strdup_printf("%u kbps", temp32);
}
- proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_downl_ext, tvb,
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_downl_ext, tvb,
curr_offset, 1, oct, "%s (%u)", str, oct);
curr_offset+= 1;
else
str = ep_strdup_printf("%u kbps", temp32);
}
- proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_downl_ext, tvb,
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_downl_ext, tvb,
curr_offset, 1, oct, "%s (%u)", str, oct);
curr_offset+= 1;
else
str = ep_strdup_printf("%u kbps", temp32);
}
- proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_upl_ext, tvb,
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_upl_ext, tvb,
curr_offset, 1, oct, "%s (%u)", str, oct);
curr_offset+= 1;
else
str = ep_strdup_printf("%u kbps", temp32);
}
- proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_upl_ext, tvb,
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_upl_ext, tvb,
curr_offset, 1, oct, "%s (%u)", str, oct);
curr_offset+= 1;
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
return(curr_offset - offset);
}
};
static guint16
-de_sm_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+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_)
{
guint8 oct;
const gchar *str;
oct = tvb_get_guint8(tvb, offset);
- str = match_strval(oct, gsm_a_sm_cause_vals);
/* SM Cause can be sent in both directions */
- if (!str)
- str = "Protocol error, unspecified / Service option temporarily out of order";
+ str = val_to_str_const(oct, gsm_a_sm_cause_vals,
+ "Protocol error, unspecified / Service option temporarily out of order");
proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause, tvb,
offset, 1, oct, "%s (%u)", str, oct);
* [9] 10.5.6.6a SM cause 2
*/
static guint16
-de_sm_cause_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_cause_2(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;
const gchar *str;
oct = tvb_get_guint8(tvb, offset);
- str = match_strval(oct, gsm_a_sm_cause_vals);
/* SM Cause 2 is sent only in the Network-to-MS direction */
- if (!str)
- str = "Service option temporarily out of order";
+ str = val_to_str_const(oct, gsm_a_sm_cause_vals,
+ "Service option temporarily out of order");
proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause_2, tvb,
offset, 1, oct, "%s (%u)", str, oct);
/*
* [7] 10.5.6.7
*/
+
+static const true_false_string gsm_a_sm_ti_flag_vals = {
+ "The message is sent to the side that originates the TI",
+ "The message is sent from the side that originates the TI"
+};
+
static guint16
-de_sm_linked_ti(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_linked_ti(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
guint curr_len;
gchar oct;
-
- static const gchar *ti_flag[2]={
- "The message is sent from the side that originates the TI" ,
- "The message is sent to the side that originates the TI" };
-
curr_len = len;
curr_offset = offset;
oct = tvb_get_guint8(tvb, curr_offset);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "TI flag: %s (%u)",ti_flag[oct>>7],oct>>7);
+ proto_tree_add_item(tree, hf_gsm_a_sm_ti_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
+
+ /* The TI value and the TI flag occupy bits 5 - 7 and bit 8 of the first octet respectively.
+ * The extended TI shall not be used unless TI values of 7 or greater are needed.
+ * Where the extended TI is used, the TI IE includes a second octet. The TI value in the first octet is ignored, and the TI
+ * value is encoded in bits 7-1 of the second octet.
+ */
if ( curr_len > 1 )
{
+ curr_offset++;
oct = tvb_get_guint8(tvb, curr_offset);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"TI value: 0x%02x (%u)",oct&0x7f,oct&0x7f);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "ext: 0x%02x (%u)",oct>>7,oct>>7);
+ proto_tree_add_item(tree, hf_gsm_a_sm_ext, tvb, offset, 1, ENC_BIG_ENDIAN);
+ curr_offset++;
}
else
{
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"TI value: 0x%02x (%u)",(oct>>4)&7,(oct>>4)&7);
+ curr_offset++;
}
- curr_offset+= curr_len;
-
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
return(curr_offset - offset);
}
};
static guint16
-de_sm_sapi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_sapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, offset << 3, 4, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_sm_llc_sapi, tvb, offset, 1, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_sm_llc_sapi, tvb, offset, 1, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
};
static guint16
-de_sm_tear_down(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_tear_down(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_sm_tdi, tvb, offset, 1, FALSE);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_sm_tdi, tvb, offset, 1, ENC_BIG_ENDIAN);
/* no length check possible */
return(1);
};
guint16
-de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
-
+ guint value;
+
curr_offset = offset;
- proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, offset << 3, 1, FALSE);
- proto_tree_add_item(tree, hf_gsm_a_sm_packet_flow_id, tvb, offset, 1, FALSE);
-
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ value = tvb_get_guint8(tvb,curr_offset);
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_sm_packet_flow_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ curr_offset++;
+
+ if (add_string)
+ g_snprintf(add_string, string_len, " - %s", rval_to_str(value, gsm_a_sm_packet_flow_id_vals, "Unknown"));
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
return(curr_offset - offset);
}
};
static const true_false_string gsm_a_tft_e_bit = {
- "parameters list is included",
- "parameters list is not included"
+ "Parameters list is included",
+ "Parameters list is not included"
};
+static const value_string gsm_a_tft_pkt_flt_dir_vals[] = {
+ { 0, "Pre Rel-7 TFT filter"},
+ { 1, "Downlink only"},
+ { 2, "Uplink only"},
+ { 3, "Bidirectional"},
+ { 0, NULL }
+};
-static guint16
-de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+static const value_string gsm_a_tft_param_id_vals[] = {
+ { 1, "Authorization Token"},
+ { 2, "Flow Identifier"},
+ { 3, "Packet Filter Identifier"},
+ { 0, NULL }
+};
+
+guint16
+de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
guint curr_len;
guchar count;
guchar oct;
gint pf_length;
- gint pf_identifier;
+ gint i;
gint pack_component_type;
+ gint param;
curr_len = len;
curr_offset = offset;
pkt_fil_count = oct&0x0f;
e_bit = (oct>>4)&1;
- proto_tree_add_item(tree,hf_gsm_a_tft_op_code,tvb,curr_offset,1,FALSE);
- proto_tree_add_item(tree,hf_gsm_a_tft_e_bit,tvb,curr_offset,1,FALSE);
- proto_tree_add_item(tree,hf_gsm_a_tft_pkt_flt,tvb,curr_offset,1,FALSE);
+ proto_tree_add_item(tree,hf_gsm_a_tft_op_code,tvb,curr_offset,1,ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree,hf_gsm_a_tft_e_bit,tvb,curr_offset,1,ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree,hf_gsm_a_tft_pkt_flt,tvb,curr_offset,1,ENC_BIG_ENDIAN);
curr_offset++;
curr_len--;
{
if ((curr_offset-offset)<1) {
proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data");
- return(curr_offset-offset);
+ return(len);
}
- oct = tvb_get_guint8(tvb, curr_offset);
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tf_tree, hf_gsm_a_tft_pkt_flt_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset++;
curr_len--;
-
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1, 1,
- "Packet filter identifier: 0x%02x (%u)",oct,oct );
+ count++;
}
else /* create new, Add packet filters or Replace packet filters */
{
if ((curr_offset-offset)<1) {
proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data");
- return(curr_offset-offset);
+ return(len);
}
- pf_identifier = tvb_get_guint8(tvb, curr_offset);
+ proto_tree_add_bits_item(tf_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tf_tree, hf_gsm_a_tft_pkt_flt_dir, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tf_tree, hf_gsm_a_tft_pkt_flt_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset++;
curr_len--;
- proto_tree_add_text(tf_tree,
- tvb, curr_offset-1, 1,
- "Packet filter identifier: %u (%u)",pf_identifier, pf_identifier);
-
if ((curr_offset-offset)<1) {
proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data");
- return(curr_offset-offset);
+ return(len);
}
oct = tvb_get_guint8(tvb, curr_offset);
curr_offset++;
proto_tree_add_text(tf_tree,
tvb, curr_offset-1, 1,
- "Packet evaluation precedence: 0x%02x (%u)",oct,oct );
+ "Packet evaluation precedence: 0x%02x (%u)",oct,oct );
- if ((curr_offset-offset)<1) { proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data"); return(curr_offset-offset);}
+ if ((curr_offset-offset)<1) { proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data"); return(len);}
pf_length = tvb_get_guint8(tvb, curr_offset);
curr_offset++;
curr_len--;
proto_tree_add_text(tf_tree,
tvb, curr_offset-1, 1,
- "Packet filter length: 0x%02x (%u)",pf_length,pf_length );
+ "Packet filter length: 0x%02x (%u)",pf_length,pf_length );
/* New tree for component */
/* Dissect Packet filter Component */
/* while ( filter_len > 1 ) */
/* packet filter component type identifier: */
- if (pf_length > 0 ){
+ while (pf_length > 0 ){
if ((curr_offset-offset)<1) {
proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data");
- return(curr_offset-offset);
+ return(len);
}
pack_component_type = tvb_get_guint8(tvb, curr_offset);
curr_offset++;
curr_len--;
+ pf_length--;
tf=proto_tree_add_text(tf_tree,tvb, curr_offset-1, 1,"Packet filter component type identifier: ");
comp_tree = proto_item_add_subtree(tf, ett_sm_tft );
switch ( pack_component_type ){
-
+
case 0x10:
- str="IPv4 source address type";
- proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,FALSE);
+ str="IPv4 remote address type";
+ proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,ENC_BIG_ENDIAN);
curr_offset+=4;
curr_len-=4;
- proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip4_mask,tvb,curr_offset,4,FALSE);
+ proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip4_mask,tvb,curr_offset,4,ENC_BIG_ENDIAN);
curr_offset+=4;
curr_len-=4;
+ pf_length-=8;
break;
case 0x20:
- str="IPv6 source address type";
- proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,FALSE);
+ str="IPv6 remote address type";
+ proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,ENC_NA);
curr_offset+=16;
curr_len-=16;
- proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip6_mask,tvb,curr_offset,16,FALSE);
+ proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip6_mask,tvb,curr_offset,16,ENC_NA);
curr_offset+=16;
curr_len-=16;
+ pf_length-=32;
break;
case 0x30:
str="Protocol identifier/Next header type";
- proto_tree_add_item(comp_tree,hf_gsm_a_tft_protocol_header,tvb,curr_offset,1,FALSE);
+ proto_tree_add_item(comp_tree,hf_gsm_a_tft_protocol_header,tvb,curr_offset,1,ENC_BIG_ENDIAN);
curr_offset+=1;
curr_len-=1;
+ pf_length-=1;
break;
case 0x40:
- str="Single destination port type";
- proto_tree_add_item(comp_tree,hf_gsm_a_tft_port,tvb,curr_offset,2,FALSE);
+ str="Single local port type";
+ proto_tree_add_item(comp_tree,hf_gsm_a_tft_port,tvb,curr_offset,2,ENC_BIG_ENDIAN);
curr_offset+=2;
curr_len-=2;
+ pf_length-=2;
+ break;
case 0x41:
- str="Destination port range type";
- proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_low,tvb,curr_offset,2,FALSE);
- proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_high,tvb,curr_offset,2,FALSE);
- curr_offset+=4;
+ str="Local port range type";
+ proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_low,tvb,curr_offset,2,ENC_BIG_ENDIAN);
+ curr_offset+=2;
+ proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_high,tvb,curr_offset,2,ENC_BIG_ENDIAN);
+ curr_offset+=2;
curr_len-=4;
+ pf_length-=4;
break;
case 0x50:
- str="Single source port type";
- proto_tree_add_item(comp_tree,hf_gsm_a_tft_port,tvb,curr_offset,2,FALSE);
+ str="Single remote port type";
+ proto_tree_add_item(comp_tree,hf_gsm_a_tft_port,tvb,curr_offset,2,ENC_BIG_ENDIAN);
curr_offset+=2;
curr_len-=2;
+ pf_length-=2;
+ break;
+
+ case 0x51:
+ str="Remote port range type";
+ proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_low,tvb,curr_offset,2,ENC_BIG_ENDIAN);
+ curr_offset+=2;
+ proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_high,tvb,curr_offset,2,ENC_BIG_ENDIAN);
+ curr_offset+=2;
+ curr_len-=4;
+ pf_length-=4;
+ break;
+
+ case 0x60:
+ str="Security parameter index type";
+ proto_tree_add_item(comp_tree,hf_gsm_a_tft_security,tvb,curr_offset,4,ENC_BIG_ENDIAN);
+ curr_offset+=4;
+ curr_len-=4;
+ pf_length-=4;
+ break;
+
+
+ case 0x70:
+ str="Type of service/Traffic class type";
+ proto_tree_add_item(comp_tree,hf_gsm_a_qos_traffic_cls,tvb,curr_offset,1,ENC_BIG_ENDIAN);
+ curr_offset++;
+ proto_tree_add_item(comp_tree,hf_gsm_a_tft_traffic_mask,tvb,curr_offset,1,ENC_BIG_ENDIAN);
+ curr_offset++;
+ curr_len-=2;
+ pf_length-=2;
+ break;
+
+ case 0x80:
+ str="Flow label type";
+ proto_tree_add_bits_item(comp_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(comp_tree,hf_gsm_a_tft_flow_label_type,tvb,curr_offset,3,ENC_BIG_ENDIAN);
+ curr_offset+=3;
+ curr_len-=3;
+ pf_length-=3;
break;
- case 0x51:
- str="Source port range type";
- proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_low,tvb,curr_offset,2,FALSE);
- proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_high,tvb,curr_offset,2,FALSE);
- curr_offset+=4;
- curr_len-=4;
- break;
+ default:
+ str="not specified";
+ curr_offset+=pf_length;
+ curr_len-=pf_length;
+ pf_length=0;
+ }
+ proto_item_append_text(tf, "%s (%u)", str, pack_component_type);
+ }
+ count++;
+ }
+ }
+
+ /* The parameters list contains a variable number of parameters that might need to be
+ * transferred in addition to the packet filters. If the parameters list is included, the E
+ * bit is set to 1; otherwise, the E bit is set to 0.
+ */
+ if ((e_bit == 1) && curr_len) {
+ count = 0;
+ while (curr_len) {
+ pf_length = tvb_get_guint8(tvb, curr_offset+1);
+ tf = proto_tree_add_text(tree, tvb, curr_offset, pf_length+2, "Parameter %d" ,count);
+ tf_tree = proto_item_add_subtree(tf, ett_sm_tft );
+ param = tvb_get_guint8(tvb, curr_offset);
+ proto_tree_add_item(tf_tree, hf_gsm_a_tft_param_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+ curr_offset += 2;
+ curr_len -= 2;
+ switch (param) {
+ case 0x01:
+ proto_tree_add_text(tf_tree, tvb, curr_offset, pf_length, "Authorization token value: 0x%s",
+ tvb_bytes_to_str(tvb, curr_offset, pf_length));
+ break;
+
+ case 0x02:
+ proto_tree_add_text(tf_tree, tvb, curr_offset, 2, "Media Component number value: 0x%x",
+ tvb_get_bits16(tvb, curr_offset<<3, 16, ENC_BIG_ENDIAN));
+ proto_tree_add_text(tf_tree, tvb, curr_offset+2, 2, "IP flow number: 0x%x",
+ tvb_get_bits16(tvb, (curr_offset+2)<<3, 16, ENC_BIG_ENDIAN));
+ break;
+
+ case 0x03:
+ for (i = 0; i < pf_length; i++) {
+ proto_tree_add_text(tf_tree, tvb, curr_offset+i, 1, "Packet filter identifier %d: %d",
+ i, tvb_get_guint8(tvb, curr_offset+i));
+ }
+ break;
+
+ default:
+ proto_tree_add_text(tf_tree, tvb, curr_offset, pf_length, "Parameter content: 0x%s",
+ tvb_bytes_to_str(tvb, curr_offset, pf_length));
+ break;
+ }
+ curr_offset += pf_length;
+ curr_len -= pf_length;
+ count++;
+ }
+ }
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
+
+ return(len);
+}
+
+/*
+ * [9] 10.5.6.13 Temporary Mobile Group Identity (TMGI)
+ */
+static guint16
+de_sm_tmgi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ proto_tree_add_item(tree, hf_gsm_a_sm_tmgi, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
+ curr_offset += 3;
+
+ NO_MORE_DATA_CHECK(len);
+ curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, curr_offset, TRUE);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * [9] 10.5.6.14 MBMS bearer capabilities
+ */
+static guint16
+de_sm_mbms_bearer_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset, temp32;
+ guint8 oct;
+ const gchar *str;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ switch (oct)
+ {
+ case 0x00: str="Subscribed maximum bit rate for downlink/reserved"; break;
+ case 0xff: str="0 kbps"; break;
+ default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
+ }
+
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_downl, tvb,
+ curr_offset, 1, oct, "%s (%u)", str, oct);
+ curr_offset+= 1;
+
+ NO_MORE_DATA_CHECK(len);
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ if (oct == 0x00)
+ str = "Use the value indicated by the Maximum bit rate for downlink";
+ else
+ {
+ temp32 = qos_calc_ext_bitrate(oct);
+ if (temp32 % 1000 == 0)
+ str = ep_strdup_printf("%u Mbps", temp32 / 1000);
+ else
+ str = ep_strdup_printf("%u kbps", temp32);
+ }
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_downl_ext, tvb,
+ curr_offset, 1, oct, "%s (%u)", str, oct);
+
+ curr_offset+= 1;
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * [9] 10.5.6.15 MBMS protocol configuration options
+ */
+static guint16
+de_sm_mbms_prot_conf_opt(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset;
+
+ curr_offset = offset;
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 8, ENC_BIG_ENDIAN);
+ curr_offset++;
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * [9] 10.5.6.16 Enhanced network service access point identifier
+ */
+static guint16
+de_sm_enh_nsapi(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;
+ const gchar *str;
+
+ oct = tvb_get_guint8(tvb, offset);
+
+ if(oct < 0x80)
+ str = "Reserved";
+ else if (oct < 0xff)
+ str = ep_strdup_printf("NSAPI %u for Multimedia Broadcast/Multicast Service (MBMS) Multicast mode", oct);
+ else
+ str = "Reserved for use by lower layers in the p2p radio bearer allocation message for MBMS Broadcast mode";
+
+
+ proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_enh_nsapi, tvb,
+ offset, 1, oct, "%s (%u)", str, oct);
+
+ /* no length check possible */
+ return(1);
+}
+
+/*
+ * [9] 10.5.6.17 Request type
+ */
+static const value_string gsm_a_sm_req_type_vals[] = {
+ { 0x01, "Initial request" },
+ { 0x02, "Handover" },
+ { 0x03, "Unused. If received, the network shall interpret this as \"Initial request\"." },
+ { 0, NULL }
+};
+
+static guint16
+de_sm_req_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+{
+ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset<<3) + 4, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_gsm_a_sm_req_type, tvb, offset, 1, ENC_BIG_ENDIAN);
- case 0x60:
- str="Security parameter index type";
- proto_tree_add_item(comp_tree,hf_gsm_a_tft_security,tvb,curr_offset,4,FALSE);
- curr_offset+=4;
- curr_len-=4;
- break;
+ /* no length check possible */
+ return(1);
+}
+/*
+ * [9] 10.5.6.18 Notification indicator
+ */
+static const value_string gsm_a_sm_notif_ind_vals[] = {
+ { 0x0, "Reserved"},
+ { 0x1, "SRVCC handover cancelled, IMS session re-establishment required"},
+ { 0, NULL }
+};
- case 0x70:
- str="Type of service/Traffic class type";
- proto_tree_add_item(comp_tree,hf_gsm_a_qos_traffic_cls,tvb,curr_offset,1,FALSE);
- proto_tree_add_item(comp_tree,hf_gsm_a_tft_traffic_mask,tvb,curr_offset,1,FALSE);
- curr_offset+=2;
- curr_len-=2;
- break;
+static guint16
+de_sm_notif_ind(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;
- case 0x80:
- str="Flow label type";
- proto_tree_add_item(comp_tree,hf_gsm_a_tft_traffic_mask,tvb,curr_offset,1,FALSE);
- curr_offset+=3;
- curr_len-=3;
- break;
+ curr_offset = offset;
- default:
- str="not specified";
- }
- proto_item_append_text(tf, "%s (%u)", str, pack_component_type);
- count++;
- }
- }
- }
+ proto_tree_add_item(tree, hf_gsm_a_sm_notif_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
- /* The parameters list contains a variable number of parameters that might need to be
- * transferred in addition to the packet filters. If the parameters list is included, the E
- * bit is set to 1; otherwise, the E bit is set to 0.
- */
- if (e_bit == 1){
- proto_tree_add_text(tf_tree, tvb, curr_offset, 1, "Note: Possible Authorization Token/Flow Identifier not decoded yet");
- }
- return(curr_offset - offset);
+ return(len);
}
-guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len) = {
+
+guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string, int string_len) = {
/* GPRS Mobility Management Information Elements 10.5.5 */
de_gmm_attach_res, /* Attach Result */
de_gmm_attach_type, /* Attach Type */
de_gmm_ms_radio_acc_cap,/* MS Radio Access Capability */
de_gmm_cause, /* GMM Cause */
de_gmm_rai, /* Routing Area Identification */
+ de_gmm_rai2, /* Routing Area Identification 2 */
de_gmm_update_res, /* Update Result */
de_gmm_update_type, /* Update Type */
de_gmm_ac_ref_nr, /* A&C Reference Number */
de_gmm_ps_lcs_cap, /* PS LCS Capability */
de_gmm_net_feat_supp, /* Network Feature Support */
de_gmm_rat_info_container, /* Inter RAT information container */
+ de_gmm_req_ms_info, /* Requested MS information */
+ 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 */
/* Session Management Information Elements 10.5.6 */
de_sm_apn, /* Access Point Name */
de_sm_nsapi, /* Network Service Access Point Identifier */
de_sm_tear_down, /* Tear Down Indicator */
de_sm_pflow_id, /* Packet Flow Identifier */
de_sm_tflow_temp, /* Traffic Flow Template */
+ de_sm_tmgi, /* Temporary Mobile Group Identity (TMGI) */
+ de_sm_mbms_bearer_cap, /* MBMS bearer capabilities */
+ de_sm_mbms_prot_conf_opt, /* MBMS protocol configuration options */
+ de_sm_enh_nsapi, /* Enhanced network service access point identifier */
+ de_sm_req_type, /* Request type */
+ de_sm_notif_ind, /* Notification indicator */
/* GPRS Common Information Elements 10.5.7 */
de_gc_context_stat, /* PDP Context Status */
de_gc_radio_prio, /* Radio Priority */
de_gc_timer2, /* GPRS Timer 2 */
de_gc_radio_prio2, /* Radio Priority 2 */
de_gc_mbms_context_stat,/* 10.5.7.6 MBMS context status */
+ de_gc_uplink_data_stat, /* 10.5.7.7 Uplink data status */
NULL, /* NONE */
};
* [7] 9.4.1
*/
static void
-dtap_gmm_attach_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_attach_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+ pinfo->p2p_dir = P2P_DIR_RECV;
ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_MS_NET_CAP, NULL);
/* Included in attach type
- ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM, NULL);
curr_offset--;
curr_len++;
*/
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ATTACH_TYPE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ATTACH_TYPE, NULL);
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_DRX_PARAM );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_DRX_PARAM, NULL);
ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID , NULL);
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, " - Old routing area identification");
ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP , NULL);
ELEM_OPT_TLV( 0x33 , GSM_A_PDU_TYPE_GM, DE_PS_LCS_CAP , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ ELEM_OPT_TLV(0x11, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
+
+ ELEM_OPT_TLV(0x20, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_3, NULL);
+
+ ELEM_OPT_TLV(0x40, GSM_A_PDU_TYPE_DTAP, DE_SUP_CODEC_LIST, NULL);
+
+ ELEM_OPT_TLV(0x58, NAS_PDU_TYPE_EMM, DE_EMM_UE_NET_CAP, NULL);
+
+ ELEM_OPT_TLV(0x1A, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Additional mobile identity");
+
+ ELEM_OPT_TLV(0x1B, GSM_A_PDU_TYPE_GM, DE_RAI_2, " - Additional old routing area identification");
+
+ ELEM_OPT_TLV(0x5D, GSM_A_PDU_TYPE_GM, DE_VOICE_DOMAIN_PREF, NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.2
*/
static void
-dtap_gmm_attach_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_attach_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+ pinfo->p2p_dir = P2P_DIR_SENT;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, NULL);
curr_len++;
curr_offset--;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ATTACH_RES );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ATTACH_RES, NULL);
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, NULL);
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO_2 );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO_2, " - Radio priority for TOM8");
curr_len++;
curr_offset--;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, " - Radio priority for SMS");
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
ELEM_OPT_TV( 0x19 , GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG, NULL);
ELEM_OPT_TLV( 0x34 , GSM_A_PDU_TYPE_DTAP, DE_EMERGENCY_NUM_LIST , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ 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( 0x38 , GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2 , " - T3323" );
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.3
*/
static void
-dtap_gmm_attach_com(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_attach_com(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
-/* guint32 consumed; */
+ guint32 consumed;
guint curr_len;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+ pinfo->p2p_dir = P2P_DIR_RECV;
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ ELEM_OPT_TLV(0x27, GSM_A_PDU_TYPE_GM, DE_RAT_INFO_CONTAINER, " - Inter RAT handover information");
+
+ ELEM_OPT_TLV(0x2B, GSM_A_PDU_TYPE_GM, DE_EUTRAN_IRAT_INFO_CONTAINER, " - E-UTRAN inter RAT handover information");
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.4
*/
static void
-dtap_gmm_attach_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_attach_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+ pinfo->p2p_dir = P2P_DIR_SENT;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE );
+ 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" );
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.5
*/
static void
-dtap_gmm_detach_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_detach_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+ pinfo->p2p_dir = P2P_DIR_SENT;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, NULL);
/* Force to standy might be wrong - To decode it correct, we need the direction */
curr_len++;
curr_offset--;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_DETACH_TYPE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_DETACH_TYPE, NULL);
ELEM_OPT_TV( 0x25 , GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE , NULL);
ELEM_OPT_TLV( 0x18 , GSM_A_PDU_TYPE_COMMON, DE_MID , " - P-TMSI" );
- ELEM_OPT_TLV( 0x19 , GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG , NULL);
+ ELEM_OPT_TLV( 0x19 , GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG_2 , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.6
*/
static void
-dtap_gmm_detach_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_detach_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+ pinfo->p2p_dir = P2P_DIR_RECV;
if ( curr_len != 0 )
{
- ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, NULL);
curr_len++;
curr_offset--;
-
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND );
+
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, NULL);
}
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.7
*/
static void
-dtap_gmm_ptmsi_realloc_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_ptmsi_realloc_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+ pinfo->p2p_dir = P2P_DIR_SENT;
ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID , " - Allocated P-TMSI" );
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
- ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, NULL);
curr_len++;
curr_offset--;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, NULL);
- ELEM_OPT_TV( 0x19 , GSM_A_PDU_TYPE_COMMON, DE_MID , " - P-TMSI Signature" );
+ ELEM_OPT_TV( 0x19 , GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG , " - P-TMSI Signature" );
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.8
*/
static void
-dtap_gmm_ptmsi_realloc_com(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_ptmsi_realloc_com(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
/* guint32 consumed; */
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+ pinfo->p2p_dir = P2P_DIR_RECV;
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.9
*/
static void
-dtap_gmm_auth_ciph_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_auth_ciph_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+ pinfo->p2p_dir = P2P_DIR_SENT;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_IMEISV_REQ );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_IMEISV_REQ, NULL);
curr_offset--;
curr_len++;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_CIPH_ALG );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_CIPH_ALG, NULL);
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_AC_REF_NUM_H );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_AC_REF_NUM_H, NULL);
curr_offset--;
curr_len++;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, NULL);
ELEM_OPT_TV( 0x21 , GSM_A_PDU_TYPE_DTAP, DE_AUTH_PARAM_RAND , NULL);
if ( curr_len == 0 )
{
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
return;
}
-
+
ELEM_OPT_TLV( 0x28 , GSM_A_PDU_TYPE_DTAP, DE_AUTH_PARAM_AUTN , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.10
*/
static void
-dtap_gmm_auth_ciph_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_auth_ciph_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+ pinfo->p2p_dir = P2P_DIR_RECV;
- ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, NULL);
curr_offset--;
curr_len++;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_AC_REF_NUM );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_AC_REF_NUM, NULL);
ELEM_OPT_TV( 0x22 , GSM_A_PDU_TYPE_DTAP, DE_AUTH_RESP_PARAM , NULL);
ELEM_OPT_TLV( 0x29 , GSM_A_PDU_TYPE_DTAP, DE_AUTH_RESP_PARAM_EXT , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.11
*/
static void
-dtap_gmm_auth_ciph_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_auth_ciph_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint curr_len;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+ pinfo->p2p_dir = P2P_DIR_SENT;
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.10a
*/
static void
-dtap_gmm_auth_ciph_fail(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_auth_ciph_fail(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+ pinfo->p2p_dir = P2P_DIR_RECV;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
ELEM_OPT_TLV( 0x30 , GSM_A_PDU_TYPE_DTAP, DE_AUTH_FAIL_PARAM , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.12
*/
static void
-dtap_gmm_ident_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_ident_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint curr_len;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+ pinfo->p2p_dir = P2P_DIR_SENT;
/* If the half octect that are about to get decoded is the LAST in the octetstream, the macro will call return BEFORE we get a chance to fix the index. The end result will be that the first half-octet will be decoded but not the last. */
#if 0
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ID_TYPE_2 );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ID_TYPE_2, NULL);
curr_offset--;
curr_len++;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, NULL);
#endif
- elem_v(tvb, tree, GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, curr_offset);
- elem_v(tvb, tree, GSM_A_PDU_TYPE_GM, DE_ID_TYPE_2, curr_offset);
+ elem_v(tvb, tree, pinfo, GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, curr_offset, NULL);
+ elem_v(tvb, tree, pinfo, GSM_A_PDU_TYPE_GM, DE_ID_TYPE_2, curr_offset, NULL);
curr_offset+=1;
curr_len-=1;
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.13
*/
static void
-dtap_gmm_ident_res(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_ident_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+ pinfo->p2p_dir = P2P_DIR_RECV;
ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.14
*/
static void
-dtap_gmm_rau_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_rau_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+ pinfo->p2p_dir = P2P_DIR_RECV;
/* is included in update type
- ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM, NULL);
curr_offset--;
curr_len++;
*/
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_UPD_TYPE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_UPD_TYPE, NULL);
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, " - Old routing area identification");
ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP , NULL);
ELEM_OPT_TLV( 0x33 , GSM_A_PDU_TYPE_GM, DE_PS_LCS_CAP , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ ELEM_OPT_TLV(0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS, NULL);
+
+ ELEM_OPT_TLV(0x58, NAS_PDU_TYPE_EMM, DE_EMM_UE_NET_CAP, NULL);
+
+ ELEM_OPT_TLV(0x1A, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Additional mobile identity");
+
+ ELEM_OPT_TLV(0x1B, GSM_A_PDU_TYPE_GM, DE_RAI_2, " - Additional old routing area identification");
+
+ ELEM_OPT_TLV(0x11, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
+
+ ELEM_OPT_TLV(0x20, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_3, NULL);
+
+ ELEM_OPT_TLV(0x40, GSM_A_PDU_TYPE_DTAP, DE_SUP_CODEC_LIST, NULL);
+
+ ELEM_OPT_TLV(0x5D, GSM_A_PDU_TYPE_GM, DE_VOICE_DOMAIN_PREF, NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.15
*/
static void
-dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+ pinfo->p2p_dir = P2P_DIR_SENT;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_UPD_RES );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_UPD_RES, NULL);
curr_offset--;
curr_len++;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, NULL);
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Periodic RA update timer");
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
ELEM_OPT_TV( 0x19 , GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG , NULL);
ELEM_OPT_TLV( 0x18 , GSM_A_PDU_TYPE_COMMON, DE_MID , " - Allocated P-TMSI");
- ELEM_OPT_TLV( 0x23 , GSM_A_PDU_TYPE_COMMON, DE_MID , NULL);
+ ELEM_OPT_TLV( 0x23 , GSM_A_PDU_TYPE_COMMON, DE_MID , " - MS identity");
ELEM_OPT_TLV( 0x26 , GSM_A_PDU_TYPE_GM, DE_REC_N_PDU_NUM_LIST , NULL);
ELEM_OPT_TLV( 0x34 , GSM_A_PDU_TYPE_DTAP, DE_EMERGENCY_NUM_LIST , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ ELEM_OPT_TLV(0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
+
+ 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(0x38 , GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2 , " - T3323");
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.16
*/
static void
-dtap_gmm_rau_com(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_rau_com(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+ pinfo->p2p_dir = P2P_DIR_RECV;
/* [7] 10.5.5.11 */
ELEM_OPT_TLV( 0x26 , GSM_A_PDU_TYPE_GM, DE_REC_N_PDU_NUM_LIST , NULL);
/* Inter RAT information container 10.5.5.24 TS 24.008 version 6.8.0 Release 6 */
- /*TO DO: Implement */
- ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_RAT_INFO_CONTAINER , NULL);
+ ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_RAT_INFO_CONTAINER , " - Inter RAT handover information");
+
+ ELEM_OPT_TLV(0x2B, GSM_A_PDU_TYPE_GM, DE_EUTRAN_IRAT_INFO_CONTAINER, " - E-UTRAN inter RAT handover information");
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.17
*/
static void
-dtap_gmm_rau_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_rau_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+ pinfo->p2p_dir = P2P_DIR_SENT;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
- ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, NULL);
curr_offset--;
curr_len++;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND );
+ 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" );
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.18
*/
static void
-dtap_gmm_status(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [8] 9.4.19 GMM Information
*/
static void
-dtap_gmm_information(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_information(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+ pinfo->p2p_dir = P2P_DIR_SENT;
ELEM_OPT_TLV( 0x43 , GSM_A_PDU_TYPE_DTAP, DE_NETWORK_NAME , " - Full Name" );
ELEM_OPT_TLV( 0x49 , GSM_A_PDU_TYPE_DTAP, DE_DAY_SAVING_TIME , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.20
*/
static void
-dtap_gmm_service_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_service_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+ pinfo->p2p_dir = P2P_DIR_RECV;
/* Is included in SRVC TYPE
- ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM, NULL);
curr_offset--;
curr_len++;
*/
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SRVC_TYPE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SRVC_TYPE, NULL);
/* P-TMSI Mobile station identity 10.5.1.4 M LV 6 */
ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
/* MBMS context status 10.5.7.6 TLV 2 - 18 */
ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ ELEM_OPT_TLV(0x36, GSM_A_PDU_TYPE_GM, DE_UPLINK_DATA_STATUS, NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.21
*/
static void
-dtap_gmm_service_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_service_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+ pinfo->p2p_dir = P2P_DIR_SENT;
ELEM_OPT_TLV( 0x32 , GSM_A_PDU_TYPE_GM, DE_PDP_CONTEXT_STAT , NULL);
/* MBMS context status 10.5.7.6 TLV 2 - 18 */
ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [7] 9.4.22
*/
static void
-dtap_gmm_service_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_service_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+ pinfo->p2p_dir = P2P_DIR_SENT;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [8] 9.5.1 Activate PDP context request
+ * Direction: MS to network
*/
static void
-dtap_sm_act_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* MS to network */
+ pinfo->link_dir = P2P_DIR_UL;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_NET_SAPI );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Requested NSAPI");
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI");
ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - Requested QoS" );
ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ ELEM_OPT_TV_SHORT(0xA0, GSM_A_PDU_TYPE_GM, DE_REQ_TYPE, NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [9] 9.5.2 Activate PDP context accept
+ * Direction: network to MS
*/
static void
-dtap_sm_act_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* Network to MS*/
+ pinfo->link_dir = P2P_DIR_DL;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI");
ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - Negotiated QoS" );
#if 0
/* This is done automatically */
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE, NULL);
curr_offset--;
curr_len++;
#endif
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, NULL);
- ELEM_OPT_TLV( 0x2B , GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , NULL);
+ ELEM_OPT_TLV( 0x2B , GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - PDP address");
ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
ELEM_OPT_TLV( 0x34 , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
- ELEM_OPT_TLV( 0x39 , GSM_A_PDU_TYPE_GM, DE_SM_CAUSE_2, NULL );
+ ELEM_OPT_TLV( 0x39 , GSM_A_PDU_TYPE_GM, DE_SM_CAUSE_2, " - SM cause");
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [8] 9.5.3 Activate PDP context reject
+ * Direction: network to MS
*/
static void
-dtap_sm_act_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* Network to MS*/
+ pinfo->link_dir = P2P_DIR_DL;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [8] 9.5.4 Activate Secondary PDP Context Request
+ * Direction: MS to network
*/
static void
-dtap_sm_act_sec_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_sec_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* MS to Network */
+ pinfo->link_dir = P2P_DIR_UL;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_NET_SAPI );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Requested NSAPI");
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI");
ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - Requested QoS" );
ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
- * [7] 9.5.5
+ * [7] 9.5.5 Activate Secondary PDP Context Accept
+ * Direction: network to MS
*/
static void
-dtap_sm_act_sec_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_sec_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* Network to MS*/
+ pinfo->link_dir = P2P_DIR_DL;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI");
ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - Negotiated QoS" );
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO);
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, NULL);
#if 0
/* This is done automatically */
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE );
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE, NULL);
curr_offset--;
curr_len++;
#endif
ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
* [8] 9.5.6 Activate Secondary PDP Context Reject
+ * Direction: network to MS
+ */
+static void
+dtap_sm_act_sec_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* Network to MS*/
+ pinfo->link_dir = P2P_DIR_DL;
+
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
+
+ ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
+
+/*
+ * [8] 9.5.7 Request PDP context activation
+ * Direction: network to MS
+ */
+static void
+dtap_sm_req_pdp_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* Network to MS*/
+ pinfo->link_dir = P2P_DIR_DL;
+
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - Offered PDP address" );
+
+ ELEM_OPT_TLV( 0x28 , GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME , NULL);
+
+ ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
+
+/*
+ * [8] 9.5.8 Request PDP context activation reject
+ * Direction: MS to network
+ */
+static void
+dtap_sm_req_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* MS to Network */
+ pinfo->link_dir = P2P_DIR_UL;
+
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
+
+ ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
+
+/*
+ * [8] 9.5.9 Modify PDP context request (Network to MS direction)
+ * Direction: network to MS
+ */
+static void
+dtap_sm_mod_pdp_req_net(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* Network to MS */
+ pinfo->link_dir = P2P_DIR_DL;
+
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM,DE_RAD_PRIO, NULL);
+#if 0
+ /* This is done automatically */
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE, NULL);
+ curr_offset--;
+ curr_len++;
+#endif
+
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI");
+
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - New QoS" );
+
+ ELEM_OPT_TLV( 0x2B , GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - PDP address");
+
+ ELEM_OPT_TLV( 0x34 , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
+
+ ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+
+ ELEM_OPT_TLV(0x36 , GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE , NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
+
+/*
+ * [8] 9.5.10 Modify PDP context request (MS to network direction)
+ * Direction: MS to network
+ */
+static void
+dtap_sm_mod_pdp_req_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* MS to Network */
+ pinfo->link_dir = P2P_DIR_UL;
+
+ ELEM_OPT_TV( 0x32 , GSM_A_PDU_TYPE_GM, DE_LLC_SAPI , " - Requested LLC SAPI" );
+
+ ELEM_OPT_TLV( 0x30 , GSM_A_PDU_TYPE_GM, DE_QOS , " - Requested new QoS" );
+
+ ELEM_OPT_TLV( 0x31 , GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE , " - New TFT" );
+
+ ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
+
+/*
+ * [8] 9.5.11 Modify PDP context accept (MS to network direction)
+ * Direction: MS to network
+ */
+static void
+dtap_sm_mod_pdp_acc_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* MS to Network */
+ pinfo->link_dir = P2P_DIR_UL;
+
+ ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
+
+/*
+ * [8] 9.5.12 Modify PDP context accept (Network to MS direction)
+ * Direction: Network to MS
+ */
+static void
+dtap_sm_mod_pdp_acc_net(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* Network to MS */
+ pinfo->link_dir = P2P_DIR_DL;
+
+ ELEM_OPT_TLV( 0x30 , GSM_A_PDU_TYPE_GM, DE_QOS , " - Negotiated QoS" );
+
+ ELEM_OPT_TV( 0x32 , GSM_A_PDU_TYPE_GM, DE_LLC_SAPI , " - Negotiated LLC SAPI" );
+
+ ELEM_OPT_TV_SHORT ( 0x80 , GSM_A_PDU_TYPE_GM , DE_RAD_PRIO , " - New radio priority" );
+
+ ELEM_OPT_TLV( 0x34 , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
+
+ ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
+
+/*
+ * [8] 9.5.13 Modify PDP Context Reject
+ * Direction: both
+ */
+static void
+dtap_sm_mod_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ /* Network or the MS */
+ pinfo->link_dir = LINK_DIR_UNKNOWN;
+
+
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
+
+ ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
+
+/*
+ * [8] 9.5.14 Deactivate PDP context request
+ * Direction: both
*/
static void
-dtap_sm_act_sec_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_deact_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->link_dir = LINK_DIR_UNKNOWN;
+
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+ ELEM_OPT_TV_SHORT( 0x90 , GSM_A_PDU_TYPE_GM , DE_TEAR_DOWN_IND , NULL);
ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ /* MBMS context status 10.5.7.6 TLV 2 - 18 */
+ ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
- * [8] 9.5.7 Request PDP context activation
+ * [8] 9.5.15 Deactivate PDP context accept
+ * Direction: both
*/
static void
-dtap_sm_req_pdp_act(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_deact_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
-
- ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - Offered PDP address" );
-
- ELEM_OPT_TLV( 0x28 , GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME , NULL);
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->link_dir = LINK_DIR_UNKNOWN;
ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ /* MBMS context status 10.5.7.6 TLV 2 - 18 */
+ ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
- * [8] 9.5.8 Request PDP context activation reject
+ * [8] 9.5.15a Request Secondary PDP Context Activation
+ * Direction: network to MS
*/
static void
-dtap_sm_req_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_req_sec_pdp_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->link_dir = P2P_DIR_DL;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+ /* Required QoS Quality of service 10.5.6.5 M LV 13-17 */
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - Required QoS");
- ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+ /* Linked TI Linked TI 10.5.6.7 M LV 2-3 */
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_LINKED_TI , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ /* 36 TFT Traffic Flow Template 10.5.6.12 O TLV 3-257 */
+ ELEM_OPT_TLV(0x36, GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE, NULL);
+
+ /* 27 Protocol configuration options Protocol configuration options 10.5.6.3 O TLV 3 - 253 */
+ ELEM_OPT_TLV(0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
- * [8] 9.5.9 Modify PDP context request (Network to MS direction)
+ * [8] 9.5.15b Request Secondary PDP Context Activation Reject
+ * Direction: MS to network
*/
static void
-dtap_sm_mod_pdp_req_net(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_req_sec_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
-
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM,DE_RAD_PRIO);
-#if 0
- /* This is done automatically */
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE );
- curr_offset--;
- curr_len++;
-#endif
-
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
-
- ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - New QoS" );
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->link_dir = P2P_DIR_UL;
- ELEM_OPT_TLV( 0x2B , GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , NULL);
+ /* SM cause SM cause 10.5.6.6 M V 1 */
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
- ELEM_OPT_TLV( 0x34 , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
-
- ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+ /* 27 Protocol configuration options Protocol configuration options 10.5.6.3 O TLV 3 - 253 */
+ ELEM_OPT_TLV(0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
- * [8] 9.5.10 Modify PDP context request (MS to network direction)
+ * [8] 9.5.16a Notification
+ * Direction: network to MS
*/
static void
-dtap_sm_mod_pdp_req_ms(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_notif(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
-
- ELEM_OPT_TV( 0x32 , GSM_A_PDU_TYPE_GM, DE_LLC_SAPI , " - Requested LLC SAPI" );
-
- ELEM_OPT_TLV( 0x30 , GSM_A_PDU_TYPE_GM, DE_QOS , " - Requested new QoS" );
-
- ELEM_OPT_TLV( 0x31 , GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE , " - New TFT" );
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->link_dir = P2P_DIR_DL;
- ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_SM_NOTIF_IND, NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
- * [8] 9.5.11 Modify PDP context accept (MS to network direction)
+ * [8] 9.5.21 SM Status
+ * Direction: both
*/
static void
-dtap_sm_mod_pdp_acc_ms(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->link_dir = LINK_DIR_UNKNOWN;
- ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
- * [8] 9.5.12 Modify PDP context accept (Network to MS direction)
+ * [9] 9.5.22 Activate MBMS Context Request
+ * Direction: MS to network
*/
static void
-dtap_sm_mod_pdp_acc_net(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_mbms_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->p2p_dir = P2P_DIR_RECV;
- ELEM_OPT_TLV( 0x30 , GSM_A_PDU_TYPE_GM, DE_QOS , " - Negotiated QoS" );
+ /* Requested MBMS NSAPI Enhanced Network service access point identifier 10.5.6.16 M V */
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ENH_NSAPI, " - Requested MBMS NSAPI");
- ELEM_OPT_TV( 0x32 , GSM_A_PDU_TYPE_GM, DE_LLC_SAPI , " - Negotiated LLC SAPI" );
+ /* Requested LLC SAPI LLC service access point identifier 10.5.6.9 M V 1 */
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI");
- ELEM_OPT_TV_SHORT ( 0x80 , GSM_A_PDU_TYPE_GM , DE_RAD_PRIO , " - New radio priority" );
+ /* Supported MBMS bearer capabilities MBMS bearer capabilities 10.5.6.14 M LV 2 - 3 */
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_MBMS_BEARER_CAP , NULL );
- ELEM_OPT_TLV( 0x34 , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
+ /* Requested multicast address Packet data protocol address 10.5.6.4 M LV 3 - 19 */
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - Requested multicast address" );
- ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+ /* Access point name Access point name 10.5.6.1 M LV 2 - 101 */
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME , NULL );
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ /* 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);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
- * [8] 9.5.13 Modify PDP Context Reject
+ * [9] 9.5.23 Activate MBMS Context Accept
+ * Direction: network to MS
*/
static void
-dtap_sm_mod_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_mbms_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->p2p_dir = P2P_DIR_SENT;
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_TMGI, NULL);
- ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI");
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT , NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
- * [8] 9.5.14 Deactivate PDP context request
+ * [9] 9.5.24 Activate MBMS Context Reject
+ * Direction: network to MS
*/
static void
-dtap_sm_deact_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_mbms_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
-
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
-
- ELEM_OPT_TV_SHORT( 0x90 , GSM_A_PDU_TYPE_GM , DE_TEAR_DOWN_IND , NULL);
+ pinfo->p2p_dir = P2P_DIR_SENT;
- ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
- /* MBMS context status 10.5.7.6 TLV 2 - 18 */
- ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
+ ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT , NULL);
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
- * [8] 9.5.15 Deactivate PDP context accept
+ * [9] 9.5.25 Request MBMS Context Activation
+ * Direction: network to MS
*/
static void
-dtap_sm_deact_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_req_mbms_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+ pinfo->p2p_dir = P2P_DIR_SENT;
- ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Linked NSAPI");
- /* MBMS context status 10.5.7.6 TLV 2 - 18 */
- ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - Offered multicast address" );
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
+ ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME , NULL );
+
+ ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT , NULL);
+
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
}
/*
- * [8] 9.5.21 SM Status
+ * [8] 9.5.26 Request MBMS Context Activation Reject
+ * Direction: MS to network
*/
static void
-dtap_sm_status(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_req_mbms_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
curr_offset = offset;
curr_len = len;
- gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
-
- ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
-
- EXTRANEOUS_DATA_CHECK(curr_len, 0);
-}
-
-/*
- * [8] 9.5.22 Activate MBMS Context Request
- */
-
- /* Requested MBMS NSAPI Enhanced Network service access point identifier 10.5.6.15 M V */
- /* Requested LLC SAPI LLC service access point identifier 10.5.6.9 M V 1 */
- /* Supported MBMS bearer capabilities MBMS bearer capabilities 10.5.6.14 M LV 2 - 3 */
- /* Requested multicast address Packet data protocol address 10.5.6.4 M LV 3 - 19 */
- /* Access point name Access point name 10.5.6.1 M LV 2 - 101 */
- /* 35 MBMS protocol configuration options MBMS protocol configuration options 10.5.6.15 O TLV 3 - 253 */
-
-/*
- * [8] 9.5.23 Activate MBMS Context Accept
- */
+ pinfo->p2p_dir = P2P_DIR_RECV;
-/*
- * [8] 9.5.24 Activate MBMS Context Reject
- */
+ ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
-/*
- * [8] 9.5.25 Request MBMS Context Activation
- */
+ ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT , NULL);
-/*
- * [8] 9.5.26 Request MBMS Context Activation Reject
- */
+ EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
#define NUM_GSM_DTAP_MSG_GMM (sizeof(gsm_a_dtap_msg_gmm_strings)/sizeof(value_string))
static gint ett_gsm_dtap_msg_gmm[NUM_GSM_DTAP_MSG_GMM];
-static void (*dtap_msg_gmm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
+static void (*dtap_msg_gmm_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len) = {
dtap_gmm_attach_req, /* Attach Request */
dtap_gmm_attach_acc, /* Attach Accept */
dtap_gmm_attach_com, /* Attach Complete */
#define NUM_GSM_DTAP_MSG_SM (sizeof(gsm_a_dtap_msg_sm_strings)/sizeof(value_string))
static gint ett_gsm_dtap_msg_sm[NUM_GSM_DTAP_MSG_SM];
-static void (*dtap_msg_sm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
+static void (*dtap_msg_sm_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len) = {
dtap_sm_act_pdp_req, /* Activate PDP Context Request */
dtap_sm_act_pdp_acc, /* Activate PDP Context Accept */
dtap_sm_act_pdp_rej, /* Activate PDP Context Reject */
NULL, /* Reserved: was allocated in earlier phases of the protocol */
NULL, /* Reserved: was allocated in earlier phases of the protocol */
dtap_sm_status, /* SM Status */
- NULL, /* Activate MBMS Context Request */
- NULL, /* Activate MBMS Context Accept */
- NULL, /* Activate MBMS Context Reject */
- NULL, /* Request MBMS Context Activation */
- NULL, /* Request MBMS Context Activation Reject */
+ dtap_sm_act_mbms_req, /* Activate MBMS Context Request */
+ dtap_sm_act_mbms_acc, /* Activate MBMS Context Accept */
+ dtap_sm_act_mbms_rej, /* Activate MBMS Context Reject */
+ dtap_sm_req_mbms_act, /* Request MBMS Context Activation */
+ dtap_sm_req_mbms_rej, /* Request MBMS Context Activation Reject */
+ dtap_sm_req_sec_pdp_act, /* Request Secondary PDP Context Activation */
+ dtap_sm_req_sec_pdp_act_rej,/* Request Secondary PDP Context Activation Reject */
+ dtap_sm_notif, /* Notification */
NULL, /* NONE */
};
},
{ &hf_gsm_a_qos_del_order,
{ "Delivery order", "gsm_a.qos.del_order",
- FT_UINT8, BASE_DEC, VALS(gsm_a_qos_traffic_cls_vals), 0x18,
+ FT_UINT8, BASE_DEC, VALS(gsm_a_qos_del_order_vals), 0x18,
NULL, HFILL }
},
{ &hf_gsm_a_qos_del_of_err_sdu,
{ "Delivery of erroneous SDUs", "gsm_a.qos.del_of_err_sdu",
- FT_UINT8, BASE_DEC, VALS(gsm_a_qos_del_of_err_sdu_vals), 0x03,
+ FT_UINT8, BASE_DEC, VALS(gsm_a_qos_del_of_err_sdu_vals), 0x07,
NULL, HFILL }
},
{ &hf_gsm_a_qos_ber,
FT_UINT8, BASE_DEC, NULL, 0x0f,
NULL, HFILL }
},
+ { &hf_gsm_a_tft_pkt_flt_dir,
+ { "Packet filter direction", "gsm_a.tft.pkt_flt_dir",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_tft_pkt_flt_dir_vals), 0x30,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_tft_pkt_flt_id,
+ { "Packet filter identifier", "gsm_a.tft.pkt_flt_id",
+ FT_UINT8, BASE_DEC, NULL, 0x0f,
+ NULL, HFILL }
+ },
{ &hf_gsm_a_sm_ip4_address,
- { "IPv4 adress", "gsm_a.sm.ip4_address",
+ { "IPv4 address", "gsm_a.sm.ip4_address",
FT_IPv4, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
NULL, HFILL }
},
{ &hf_gsm_a_sm_ip6_address,
- { "IPv6 adress", "gsm_a.sm.ip6_address",
+ { "IPv6 address", "gsm_a.sm.ip6_address",
FT_IPv6, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_gsm_a_sm_ip6_mask,
- { "IPv6 adress mask", "gsm_a.sm.ip6_mask",
+ { "IPv6 address mask", "gsm_a.sm.ip6_mask",
FT_IPv6, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
NULL, HFILL }
},
{ &hf_gsm_a_tft_port,
- { "Port", "gsm_a.tft.port",
+ { "Port", "gsm_a.tft.port",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
+ { &hf_gsm_a_tft_flow_label_type,
+ { "Flow Label Type", "gsm_a.tft.flow_label_type",
+ FT_UINT24, BASE_HEX, NULL, 0x0FFFFF,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_tft_param_id,
+ { "Parameter identifier", "gsm_a.tft.param_id",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_tft_param_id_vals), 0x0,
+ NULL, HFILL }
+ },
{ &hf_gsm_a_ptmsi_sig,
{ "P-TMSI Signature", "gsm_a.ptmsi_sig",
FT_UINT24, BASE_HEX, NULL, 0x0,
FT_UINT8, BASE_HEX, NULL, 0x80,
NULL, HFILL }
},
+ { &hf_gsm_a_gm_link_dir,
+ { "Link direction", "gsm_a.gm.link_dir",
+ FT_INT32, BASE_DEC, VALS(gsm_a_gm_link_dir_vals), 0x0,
+ NULL, HFILL }
+ },
{ &hf_gsm_a_gm_cause,
{ "gmm Cause", "gsm_a.gm.cause",
FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gmm_cause_vals), 0x0,
FT_UINT8, BASE_DEC, NULL, 0x1f,
NULL, HFILL }
},
+ { &hf_gsm_a_gm_nsapi_5_ul_stat,
+ { "NSAPI(5) uplink status", "gsm_a.gm.nsapi_5_ul_stat",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_nsapi_6_ul_stat,
+ { "NSAPI(6) uplink status", "gsm_a.gm.nsapi_6_ul_stat",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_nsapi_7_ul_stat,
+ { "NSAPI(7) uplink status", "gsm_a.gm.nsapi_7_ul_stat",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_nsapi_8_ul_stat,
+ { "NSAPI(8) uplink status", "gsm_a.gm.nsapi_8_ul_stat",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_nsapi_9_ul_stat,
+ { "NSAPI(9) uplink status", "gsm_a.gm.nsapi_9_ul_stat",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_nsapi_10_ul_stat,
+ { "NSAPI(10) uplink status", "gsm_a.gm.nsapi_10_ul_stat",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_nsapi_11_ul_stat,
+ { "NSAPI(11) uplink status", "gsm_a.gm.nsapi_11_ul_stat",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_nsapi_12_ul_stat,
+ { "NSAPI(12) uplink status", "gsm_a.gm.nsapi_12_ul_stat",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_nsapi_13_ul_stat,
+ { "NSAPI(13) uplink status", "gsm_a.gm.nsapi_13_ul_stat",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_nsapi_14_ul_stat,
+ { "NSAPI(14) uplink status", "gsm_a.gm.nsapi_14_ul_stat",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_nsapi_15_ul_stat,
+ { "NSAPI(15) uplink status", "gsm_a.gm.nsapi_15_ul_stat",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_pco_pid,
+ { "Protocol or Container ID", "gsm_a.gm.pco_pid",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
{ &hf_gsm_a_gm_type_of_identity,
{ "Type of identity", "gsm_a.gm.type_of_identity",
FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_identity_vals), 0x07,
FT_BOOLEAN, 8, TFS(&gsm_a_gm_gps_c_vals), 0x01,
NULL, HFILL }
},
+ { &hf_gsm_a_gm_req_ms_info_irat,
+ { "I-RAT","gsm_a.gm.req_ms_info_irat",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_req_ms_info_irat_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_req_ms_info_irat2,
+ { "I-RAT2","gsm_a.gm.req_ms_info_irat2",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_req_ms_info_irat2_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_ue_usage_setting,
+ { "UE's usage setting","gsm_a.gm.ue_usage_setting",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_ue_usage_setting_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_voice_domain_pref_for_eutran,
+ { "Voice domain preference for E-UTRAN","gsm_a.gm.voice_domain_pref_for_eutran",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_voice_domain_pref_for_eutran_vals), 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,
FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ps_irat_s1_vals), 0x40,
NULL, HFILL }
},
- { &hf_gsm_a_gmm_net_cap_csfb,
- { "CSFB Capability", "gsm_a.gmm.net_cap.csfb",
- FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_csfb_vals), 0x20,
+ { &hf_gsm_a_gmm_net_cap_comb_proc,
+ { "EMM Combined procedures capability", "gsm_a.gmm.net_cap.comb_proc",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_comb_proc_vals), 0x20,
NULL, HFILL }
},
{ &hf_gsm_a_gmm_net_cap_isr,
FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_epc_vals), 0x04,
NULL, HFILL }
},
- };
+ { &hf_gsm_a_gmm_net_cap_nf,
+ { "NF Capability", "gsm_a.gmm.net_cap.nf",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_nf_vals), 0x02,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_sm_tmgi,
+ { "Temporary Mobile Group Identity (TMGI)", "gsm_a.sm.tmgi",
+ FT_UINT24, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_sm_enh_nsapi,
+ { "Enhanced NSAPI", "gsm_a.sm.enh_nsapi",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_sm_req_type,
+ { "Request type", "gsm_a.sm.req_type",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_sm_req_type_vals), 0x07,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_sm_notif_ind,
+ { "Notification indicator value", "gsm_a.sm.notif_ind",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_sm_notif_ind_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_ctrled_early_cm_sending,
+ { "Controlled early Classmark Sending", "gsm_a.gm.rac.comp_int_meas_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_implemented_not_implemented), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_pseudo_sync,
+ { "Pseudo Synchronisation", "gsm_a.gm.rac.pseudo_sync",
+ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_vgcs,
+ { "Voice Group Call Service", "gsm_a.gm.rac.vgcs",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_vgcs), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_vbs,
+ { "Voice Broadcast Service", "gsm_a.gm.rac.vbs",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_vbs), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_multislot_capability,
+ { "Multislot capability struct", "gsm_a.gm.rac.multislot_capability",
+ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_hscsd_multi_slot_class,
+ { "HSCSD multislot class", "gsm_a.gm.rac.hscsd_multi_slot_class",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_gprs_multi_slot_class,
+ { "GPRS multislot class", "gsm_a.gm.rac.gprs_multi_slot_class",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_gprs_ext_dyn_alloc_cap,
+ { "GPRS Extended Dynamic Allocation Capability", "gsm_a.gm.rac.gprs_ext_dyn_alloc_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_implemented_not_implemented), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_ecsd_multi_slot_class,
+ { "ECSD multislot class", "gsm_a.gm.rac.ecsd_multi_slot_class",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_egprs_multi_slot_class,
+ { "EGPRS multislot class", "gsm_a.gm.rac.egprs_multi_slot_class",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_egprs_ext_dyn_alloc_cap,
+ { "EGPRS Extended Dynamic Allocation Capability", "gsm_a.gm.rac.egprs_ext_dyn_alloc_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_implemented_not_implemented), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class,
+ { "DTM GPRS Multi Slot Class", "gsm_a.gm.rac.dtm_gprs_multi_slot_class",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_multi_slot_class_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_single_slt_dtm,
+ { "Single Slot DTM", "gsm_a.gm.rac.single_slt_dtm",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_dtm_egprs_multi_slot_cls_pres,
+ { "DTM EGPRS Multi Slot Class", "gsm_a.gm.rac.dtm_egprs_multi_slot_cls_pres",
+ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_dtm_egprs_multi_slot_class,
+ { "DTM EGPRS Multi Slot Class", "gsm_a.gm.rac.dtm_egprs_multi_slot_class",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_multi_slot_class_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_8psk_pow_cap_pres,
+ { "8PSK Power Capability Bits", "gsm_a.gm.rac.8psk_pow_cap_pres",
+ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_comp_int_meas_cap,
+ { "COMPACT Interference Measurement Capability", "gsm_a.gm.rac.comp_int_meas_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_implemented_not_implemented), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rel_lev_ind,
+ { "Revision Level Indicator", "gsm_a.gm.rel_lev_ind",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_revision_level_indicator), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_umts_fdd_cap,
+ { "UMTS FDD Radio Access Technology Capability", "gsm_a.gm.rac.umts_fdd_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_umts_384_tdd_ra_cap,
+ { "UMTS 3.84 Mcps TDD Radio Access Technology Capability", "gsm_a.gm.rac.umts_384_tdd_ra_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_cdma2000_cap,
+ { "CDMA 2000 Radio Access Technology Capability", "gsm_a.gm.rac.cdma2000_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_umts_128_tdd_ra_cap,
+ { "UMTS 1.28 Mcps TDD Radio Access Technology Capability", "gsm_a.gm.rac.umts_128_tdd_ra_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_geran_feat_pkg,
+ { "GERAN Feature Package 1", "gsm_a.gm.rac.geran_feat_pkg",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_mod_based_multi_slot_class_support,
+ { "Modulation based multislot class support", "gsm_a.gm.rac.mod_based_multi_slot_class_support",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_geran_iu_mode_cap,
+ { "GERAN Iu mode", "gsm_a.gm.rac.geran_iu_mode_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_flo_iu_cap,
+ { "FLO Iu Capability", "gsm_a.gm.rac.flo_iu_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_mult_tbf_cap,
+ { "Multiple TBF Capability", "gsm_a.gm.rac.mult_tbf_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_down_adv_rec_perf,
+ { "Downlink Advanced Receiver Performance", "gsm_a.gm.rac.down_adv_rec_perf",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_down_adv_rec_perf_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_ext_rlc_mac_ctrl_msg_seg_cap,
+ { "Extended RLC/MAC Control Message Segmentation Capability", "gsm_a.gm.rac.ext_rlc_mac_ctrl_msg_seg_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_dtm_enh_cap,
+ { "DTM Enhancements Capability", "gsm_a.gm.rac.dtm_enh_cap",
+ FT_BOOLEAN, 8, TFS(&gsm_a_gm_dtm_enh_cap), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_dtm_gprs_high_multi_slot_class,
+ { "DTM GPRS High Multi Slot Class", "gsm_a.gm.rac.dtm_gprs_high_multi_slot_class",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_high_multi_slot_class_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_dtm_egprs_high_multi_slot_class,
+ { "DTM EGPRS High Multi Slot Class", "gsm_a.gm.rac.dtm_egprs_high_multi_slot_class",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_high_multi_slot_class_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_ps_ho_cap,
+ { "PS Handover Capability", "gsm_a.gm.rac.ps_ho_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_dtm_ho_cap,
+ { "DTM Handover Capability", "gsm_a.gm.rac.dtm_ho_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_multi_slot_cap_red_down_dual_carrier,
+ { "Multislot Capability Reduction for Downlink Dual Carrier", "gsm_a.gm.rac.multi_slot_cap_red_down_dual_carrier",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_cap_red_down_dual_carrier_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_down_dual_carrier_dtm_cap,
+ { "Downlink Dual Carrier for DTM Capability", "gsm_a.gm.rac.down_dual_carrier_dtm_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_flex_ts_assign,
+ { "Flexible Timeslot Assignment", "gsm_a.gm.rac.flex_ts_assign",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_gan_ps_ho_cap,
+ { "GAN PS Handover Capability", "gsm_a.gm.rac.gan_ps_ho_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_rlc_non_pers_mode,
+ { "RLC Non-persistent Mode", "gsm_a.gm.rac.rlc_non_pers_mode",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_reduced_lat_cap,
+ { "Reduced Latency Capability", "gsm_a.gm.rac.reduced_lat_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_ul_egprs2,
+ { "Uplink EGPRS2", "gsm_a.gm.rac.ul_egprs2",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_ul_egprs2_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_dl_egprs2,
+ { "Downlink EGPRS2", "gsm_a.gm.rac.dl_egprs2",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dl_egprs2_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_eutra_fdd_support,
+ { "E-UTRA FDD support", "gsm_a.gm.rac.eutra_fdd_support",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_eutra_tdd_support,
+ { "E-UTRA TDD support", "gsm_a.gm.rac.eutra_tdd_support",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_geran_to_eutra_support_in_geran_ptm,
+ { "GERAN to E-UTRA support in GERAN packet transfer mode", "gsm_a.gm.rac.geran_to_eutra_support_in_geran_ptm",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_geran_to_eutra_support_in_geran_ptm_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_prio_based_resel_support,
+ { "Priority-based reselection support", "gsm_a.gm.rac.prio_based_resel_support",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_alt_efta_multi_slot_class,
+ { "Alternative EFTA Multislot Class", "gsm_a.gm.rac.alt_efta_multi_slot_class",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_alt_efta_multi_slot_class_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_efta_multi_slot_cap_red_down_dual_carrier,
+ { "EFTA Multislot Capability Reduction for Downlink Dual Carrier", "gsm_a.gm.rac.efta_multi_slot_cap_red_down_dual_carrier",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_cap_red_down_dual_carrier_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_ind_up_layer_pdu_start_cap_for_rlc_um,
+ { "Indication of Upper Layer PDU Start Capability for RLC UM", "gsm_a.gm.rac.ind_up_layer_pdu_start_cap_for_rlc_um",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_emst_cap,
+ { "Enhanced Multiplexing for Single TBF Capability", "gsm_a.gm.rac.emst_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_mtti_cap,
+ { "Multiple TTI Capability", "gsm_a.gm.rac.mtti_cap",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_gm_rac_utra_csg_cell_report,
+ { "UTRA CSG Cells Reporting", "gsm_a.gm.rac.utra_csg_cell_report",
+ FT_BOOLEAN, 8, 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",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 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,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_sm_ext,
+ { "Extension", "gsm_a.sm.ext",
+ FT_BOOLEAN, 8, NULL, 0x80,
+ NULL, HFILL }
+ },
+};
/* Setup protocol subtree array */
-#define NUM_INDIVIDUAL_ELEMS 17
+#define NUM_INDIVIDUAL_ELEMS 18
gint *ett[NUM_INDIVIDUAL_ELEMS +
NUM_GSM_DTAP_MSG_GMM + NUM_GSM_DTAP_MSG_SM +
NUM_GSM_GM_ELEM];
ett[14] = &ett_sm_tft;
ett[15] = &ett_gmm_gprs_timer;
ett[16] = &ett_gmm_network_cap;
+ ett[17] = &ett_gsm_a_gm_msrac_multislot_capability;
last_offset = NUM_INDIVIDUAL_ELEMS;
{
data_handle = find_dissector("data");
rrc_irat_ho_info_handle = find_dissector("rrc.irat.irat_ho_info");
+ lte_rrc_ue_eutra_cap_handle = find_dissector("lte-rrc.ue_eutra_cap");
}