/* packet-nas_5gs.c * Routines for Non-Access-Stratum (NAS) protocol for Evolved Packet System (EPS) dissection * * Copyright 2018-2019, Anders Broman * * Wireshark - Network traffic analyzer * By Gerald Combs * Copyright 1998 Gerald Combs * * SPDX-License-Identifier: GPL-2.0-or-later * * References: 3GPP TS 24.501 15.1.0 */ #include "config.h" #include #include #include #include #include #include #include "packet-gsm_a_common.h" #include "packet-e212.h" #include "packet-http.h" void proto_register_nas_5gs(void); void proto_reg_handoff_nas_5gs(void); static gboolean g_nas_5gs_null_decipher = FALSE; static int dissect_nas_5gs_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, void* data); static int dissect_nas_5gs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data); static guint16 de_nas_5gs_cmn_dnn(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_); static dissector_handle_t nas_5gs_handle = NULL; static dissector_handle_t eap_handle = NULL; static dissector_handle_t nas_eps_handle = NULL; static dissector_handle_t nas_eps_plain_handle = NULL; static dissector_handle_t lpp_handle = NULL; static dissector_handle_t gsm_a_dtap_handle; #define PNAME "Non-Access-Stratum 5GS (NAS)PDU" #define PSNAME "NAS-5GS" #define PFNAME "nas-5gs" static int proto_json = -1; static int proto_nas_5gs = -1; int hf_nas_5gs_common_elem_id = -1; int hf_nas_5gs_mm_elem_id = -1; int hf_nas_5gs_sm_elem_id = -1; int hf_nas_5gs_updp_elem_id = -1; static int hf_nas_5gs_epd = -1; static int hf_nas_5gs_spare_b7 = -1; static int hf_nas_5gs_spare_b6 = -1; static int hf_nas_5gs_spare_b5 = -1; static int hf_nas_5gs_spare_b4 = -1; static int hf_nas_5gs_spare_b3 = -1; static int hf_nas_5gs_spare_b2 = -1; static int hf_nas_5gs_spare_b1 = -1; static int hf_nas_5gs_rfu_b2; static int hf_nas_5gs_rfu_b1; static int hf_nas_5gs_rfu_b0; static int hf_nas_5gs_security_header_type = -1; static int hf_nas_5gs_msg_auth_code = -1; static int hf_nas_5gs_seq_no = -1; static int hf_nas_5gs_mm_msg_type = -1; static int hf_nas_5gs_sm_msg_type = -1; static int hf_nas_5gs_updp_msg_type = -1; static int hf_nas_5gs_proc_trans_id = -1; static int hf_nas_5gs_spare_half_octet = -1; static int hf_nas_5gs_pdu_session_id = -1; static int hf_nas_5gs_msg_elems = -1; static int hf_nas_5gs_mm_for = -1; static int hf_nas_5gs_cmn_dnn = -1; static int hf_nas_5gs_mm_sms_requested = -1; static int hf_nas_5gs_mm_5gs_reg_type = -1; static int hf_nas_5gs_mm_tsc = -1; static int hf_nas_5gs_mm_nas_key_set_id = -1; static int hf_nas_5gs_mm_tsc_h1 = -1; static int hf_nas_5gs_mm_nas_key_set_id_h1 = -1; static int hf_nas_5gs_mm_5gmm_cause = -1; static int hf_nas_5gs_mm_pld_cont_type = -1; static int hf_nas_5gs_mm_sst = -1; static int hf_nas_5gs_mm_sd = -1; static int hf_nas_5gs_mm_mapped_conf_sst = -1; static int hf_nas_5gs_mm_mapped_conf_ssd = -1; static int hf_nas_5gs_mm_switch_off = -1; static int hf_nas_5gs_mm_re_reg_req = -1; static int hf_nas_5gs_mm_acc_type = -1; static int hf_nas_5gs_mm_raai_b0 = -1; static int hf_nas_5gs_mm_conf_upd_ind_ack_b0 = -1; static int hf_nas_5gs_mm_conf_upd_ind_red_b1 = -1; static int hf_nas_5gs_mm_nas_sec_algo_enc = -1; static int hf_nas_5gs_mm_nas_sec_algo_ip = -1; static int hf_nas_5gs_mm_s1_mode_b0 = -1; static int hf_nas_5gs_mm_ho_attach_b1 = -1; static int hf_nas_5gs_mm_lpp_cap_b2 = -1; static int hf_nas_5gs_mm_type_id = -1; static int hf_nas_5gs_mm_odd_even = -1; static int hf_nas_5gs_mm_length = -1; static int hf_nas_5gs_mm_pld_cont = -1; static int hf_nas_5gs_mm_req_type = -1; static int hf_nas_5gs_mm_serv_type = -1; static int hf_nas_5gs_mm_5g_ea0 = -1; static int hf_nas_5gs_mm_128_5g_ea1 = -1; static int hf_nas_5gs_mm_128_5g_ea2 = -1; static int hf_nas_5gs_mm_128_5g_ea3 = -1; static int hf_nas_5gs_mm_5g_ea4 = -1; static int hf_nas_5gs_mm_5g_ea5 = -1; static int hf_nas_5gs_mm_5g_ea6 = -1; static int hf_nas_5gs_mm_5g_ea7 = -1; static int hf_nas_5gs_mm_5g_ia0 = -1; static int hf_nas_5gs_mm_5g_128_ia1 = -1; static int hf_nas_5gs_mm_5g_128_ia2 = -1; static int hf_nas_5gs_mm_5g_128_ia3 = -1; static int hf_nas_5gs_mm_5g_ia4 = -1; static int hf_nas_5gs_mm_5g_ia5 = -1; static int hf_nas_5gs_mm_5g_ia6 = -1; static int hf_nas_5gs_mm_5g_ia7 = -1; static int hf_nas_5gs_mm_eea0 = -1; static int hf_nas_5gs_mm_128eea1 = -1; static int hf_nas_5gs_mm_128eea2 = -1; static int hf_nas_5gs_mm_eea3 = -1; static int hf_nas_5gs_mm_eea4 = -1; static int hf_nas_5gs_mm_eea5 = -1; static int hf_nas_5gs_mm_eea6 = -1; static int hf_nas_5gs_mm_eea7 = -1; static int hf_nas_5gs_mm_eia0 = -1; static int hf_nas_5gs_mm_128eia1 = -1; static int hf_nas_5gs_mm_128eia2 = -1; static int hf_nas_5gs_mm_eia3 = -1; static int hf_nas_5gs_mm_eia4 = -1; static int hf_nas_5gs_mm_eia5 = -1; static int hf_nas_5gs_mm_eia6 = -1; static int hf_nas_5gs_mm_eia7 = -1; static int hf_nas_5gs_mm_n1_mode_reg_b1 = -1; static int hf_nas_5gs_mm_s1_mode_reg_b0 = -1; static int hf_nas_5gs_mm_sal_al_t = -1; static int hf_nas_5gs_mm_sal_t_li = -1; static int hf_nas_5gs_mm_sal_num_e = -1; static int hf_nas_5gs_pdu_ses_sts_psi_7_b7 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_6_b6 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_5_b5 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_4_b4 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_3_b3 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_2_b2 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_1_b1 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_0_b0 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_15_b7 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_14_b6 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_13_b5 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_12_b4 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_11_b3 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_10_b2 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_9_b1 = -1; static int hf_nas_5gs_pdu_ses_sts_psi_8_b0 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_7_b7 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_6_b6 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_5_b5 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_4_b4 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_3_b3 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_2_b2 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_1_b1 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_0_b0 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_15_b7 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_14_b6 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_13_b5 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_12_b4 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_11_b3 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_10_b2 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_9_b1 = -1; static int hf_nas_5gs_pdu_ses_rect_res_psi_8_b0 = -1; static int hf_nas_5gs_ul_data_sts_psi_7_b7 = -1; static int hf_nas_5gs_ul_data_sts_psi_6_b6 = -1; static int hf_nas_5gs_ul_data_sts_psi_5_b5 = -1; static int hf_nas_5gs_ul_data_sts_psi_4_b4 = -1; static int hf_nas_5gs_ul_data_sts_psi_3_b3 = -1; static int hf_nas_5gs_ul_data_sts_psi_2_b2 = -1; static int hf_nas_5gs_ul_data_sts_psi_1_b1 = -1; static int hf_nas_5gs_ul_data_sts_psi_0_b0 = -1; static int hf_nas_5gs_ul_data_sts_psi_15_b7 = -1; static int hf_nas_5gs_ul_data_sts_psi_14_b6 = -1; static int hf_nas_5gs_ul_data_sts_psi_13_b5 = -1; static int hf_nas_5gs_ul_data_sts_psi_12_b4 = -1; static int hf_nas_5gs_ul_data_sts_psi_11_b3 = -1; static int hf_nas_5gs_ul_data_sts_psi_10_b2 = -1; static int hf_nas_5gs_ul_data_sts_psi_9_b1 = -1; static int hf_nas_5gs_ul_data_sts_psi_8_b0 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_7_b7 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_6_b6 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_5_b5 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_4_b4 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_3_b3 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_2_b2 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_1_b1 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_0_b0 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_15_b7 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_14_b6 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_13_b5 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_12_b4 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_11_b3 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_10_b2 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_9_b1 = -1; static int hf_nas_5gs_allow_pdu_ses_sts_psi_8_b0 = -1; static int hf_nas_5gs_sm_pdu_session_type = -1; static int hf_nas_5gs_sm_sc_mode = -1; static int hf_nas_5gs_sm_sel_sc_mode = -1; static int hf_nas_5gs_sm_rqos_b0 = -1; static int hf_nas_5gs_sm_5gsm_cause = -1; static int hf_nas_5gs_sm_int_prot_max_data_rate_ul = -1; static int hf_nas_5gs_sm_int_prot_max_data_rate_dl = -1; static int hf_nas_5gs_sm_pdu_ses_type = -1; static int hf_nas_5gs_sm_pdu_addr_inf_ipv4 = -1; static int hf_nas_5gs_sm_pdu_addr_inf_ipv6 = -1; static int hf_nas_5gs_sm_qos_rule_id = -1; static int hf_nas_5gs_sm_length = -1; static int hf_nas_5gs_sm_rop = -1; static int hf_nas_5gs_sm_dqr = -1; static int hf_nas_5gs_sm_nof_pkt_filters = -1; static int hf_nas_5gs_sm_pkt_flt_id = -1; static int hf_nas_5gs_sm_pkt_flt_dir = -1; static int hf_nas_5gs_sm_pf_len = -1; static int hf_nas_5gs_sm_pf_type = -1; static int hf_nas_5gs_sm_e = -1; static int hf_nas_5gs_sm_nof_params = -1; static int hf_nas_5gs_sm_param_id = -1; static int hf_nas_5gs_sm_param_len = -1; static int hf_nas_5gs_sm_qos_rule_precedence = -1; static int hf_nas_5gs_sm_pal_cont = -1; static int hf_nas_5gs_sm_qfi = -1; static int hf_nas_5gs_sm_mapd_eps_b_cont_id = -1; static int hf_nas_5gs_sm_mapd_eps_b_cont_opt_code = -1; static int hf_nas_5gs_sm_qos_des_flow_opt_code = -1; static int hf_nas_5gs_sm_mapd_eps_b_cont_DEB = -1; static int hf_nas_5gs_sm_mapd_eps_b_cont_E = -1; static int hf_nas_5gs_sm_mapd_eps_b_cont_num_eps_parms = -1; static int hf_nas_5gs_sm_mapd_eps_b_cont_E_mod = -1; static int hf_nas_5gs_sm_mapd_eps_b_cont_param_id = -1; static int hf_nas_5gs_sm_unit_for_session_ambr_dl = -1; static int hf_nas_5gs_sm_session_ambr_dl = -1; static int hf_nas_5gs_sm_unit_for_session_ambr_ul = -1; static int hf_nas_5gs_sm_session_ambr_ul = -1; static int hf_nas_5gs_sm_all_ssc_mode_b0 = -1; static int hf_nas_5gs_sm_all_ssc_mode_b1 = -1; static int hf_nas_5gs_sm_all_ssc_mode_b2 = -1; static int hf_nas_5gs_addr_mask_ipv4 = -1; static int hf_nas_5gs_protocol_identifier_or_next_hd = -1; static int hf_nas_5gs_mm_rinmr = -1; static int hf_nas_5gs_mm_hdp = -1; static int hf_nas_5gs_mm_dcni = -1; static int hf_nas_5gs_mm_nssci = -1; static int hf_nas_5gs_mm_nssai_inc_mode = -1; static int hf_nas_5gs_mm_ue_usage_setting = -1; static int hf_nas_5gs_mm_ng_ran_rcu = -1; static int hf_nas_5gs_mm_5gs_drx_param = -1; static int ett_nas_5gs = -1; static int ett_nas_5gs_mm_nssai = -1; static int ett_nas_5gs_mm_pdu_ses_id = -1; static int ett_nas_5gs_sm_qos_rules = -1; static int ett_nas_5gs_sm_qos_params = -1; static int ett_nas_5gs_plain = -1; static int ett_nas_5gs_sec = -1; static int ett_nas_5gs_mm_part_sal = -1; static int ett_nas_5gs_mm_part_tal = -1; static int ett_nas_5gs_sm_mapd_eps_b_cont = -1; static int ett_nas_5gs_sm_mapd_eps_b_cont_params_list = -1; static int ett_nas_5gs_enc = -1; static int ett_nas_5gs_mm_ladn_indic = -1; static int ett_nas_5gs_mm_sor = -1; static int ett_nas_5gs_sm_pkt_filter_components = -1; static int ett_nas_5gs_updp_ue_policy_section_mgm_lst = -1; static int ett_nas_5gs_updp_ue_policy_section_mgm_sublst = -1; static int ett_nas_5gs_ue_policies_ursp = -1; static int ett_nas_5gs_ursp_traff_desc = -1; static int ett_nas_5gs_ursp_r_sel_desc_cont = -1; static int hf_nas_5gs_mm_abba = -1; static int hf_nas_5gs_mm_supi_fmt = -1; static int hf_nas_5gs_mm_routing_indicator = -1; static int hf_nas_5gs_mm_prot_scheme_id = -1; static int hf_nas_5gs_mm_pki = -1; static int hf_nas_5gs_mm_supi_null_scheme = -1; static int hf_nas_5gs_mm_scheme_output = -1; static int hf_nas_5gs_mm_suci_nai = -1; static int hf_nas_5gs_mm_imei = -1; static int hf_nas_5gs_mm_imeisv = -1; static int hf_nas_5gs_mm_reg_res_sms_allowed = -1; static int hf_nas_5gs_mm_reg_res_res = -1; static int hf_nas_5gs_amf_region_id = -1; static int hf_nas_5gs_amf_set_id = -1; static int hf_nas_5gs_amf_pointer = -1; static int hf_nas_5gs_5g_tmsi = -1; static int hf_nas_5gs_mm_precedence = -1; static int hf_nas_5gs_mm_sms_indic_sai = -1; static int hf_nas_5gs_nw_feat_sup_mpsi_b7 = -1; static int hf_nas_5gs_nw_feat_sup_ims_iwk_n26_b6 = -1; static int hf_nas_5gs_nw_feat_sup_ims_emf_b5b4 = -1; static int hf_nas_5gs_nw_feat_sup_ims_emc_b3b2 = -1; static int hf_nas_5gs_nw_feat_sup_ims_vops_b1b0 = -1; static int hf_nas_5gs_tac = -1; static int hf_nas_5gs_mm_tal_t_li = -1; static int hf_nas_5gs_mm_tal_num_e = -1; static int hf_nas_5gs_sm_mapd_eps_b_cont_eps_param_cont = -1; static int hf_nas_5gs_sm_max_nb_sup_pkt_flt_nb = -1; static int hf_nas_5gs_sm_max_nb_sup_pkt_flt_spare = -1; static int hf_nas_5gs_kacf = -1; static int hf_nas_5gs_ncc = -1; static int hf_nas_5gs_sor_hdr0_ack = -1; static int hf_nas_5gs_sor_hdr0_list_type = -1; static int hf_nas_5gs_sor_hdr0_list_ind = -1; static int hf_nas_5gs_sor_hdr0_sor_data_type = -1; static int hf_nas_5gs_sor_mac_iue = -1; static int hf_nas_5gs_sor_mac_iausf = -1; static int hf_nas_5gs_counter_sor = -1; static int hf_nas_5gs_sor_sec_pkt = -1; static int hf_nas_5gs_acces_tech_o1_b7 = -1; static int hf_nas_5gs_acces_tech_o1_b6 = -1; static int hf_nas_5gs_acces_tech_o1_b5 = -1; static int hf_nas_5gs_acces_tech_o1_b4 = -1; static int hf_nas_5gs_acces_tech_o1_b3 = -1; static int hf_nas_5gs_acces_tech_o2_b7 = -1; static int hf_nas_5gs_acces_tech_o2_b6 = -1; static int hf_nas_5gs_acces_tech_o2_b5 = -1; static int hf_nas_5gs_acces_tech_o2_b4 = -1; static int hf_nas_5gs_acces_tech_o2_b3 = -1; static int hf_nas_5gs_acces_tech_o2_b2 = -1; static int hf_nas_5gs_single_port_type = -1; static int hf_nas_5gs_updp_ue_pol_sect_sublst_len = -1; static int hf_nas_5gs_updp_instr_len = -1; static int hf_nas_5gs_updp_upsc = -1; static int hf_nas_5gs_updp_policy_len = -1; static int hf_nas_5gs_updp_ue_policy_part_type = -1; static int hf_nas_5gs_updp_ue_policy_part_cont = -1; static int hf_nas_5gs_ursp_rule_len = -1; static int hf_nas_5gs_ursp_rule_prec = -1; static int hf_nas_5gs_ursp_traff_desc_lst_len = -1; static int hf_nas_5gs_ursp_traff_desc = -1; static int hf_nas_5gs_ursp_r_sel_desc_lst_len = -1; static int hf_nas_5gs_ursp_r_sel_desc_lst = -1; static int hf_nas_5gs_ursp_traff_desc_ipv4 = -1; static int hf_nas_5gs_ursp_traff_desc_ipv4_mask = -1; static int hf_nas_5gs_ursp_traff_desc_next_hdr = -1; static int hf_nas_5gs_ursp_traff_desc_len = -1; static int hf_nas_5gs_ursp_r_sel_des_prec = -1; static int hf_nas_5gs_ursp_r_sel_des_cont_len = -1; static int hf_nas_5gs_ursp_ursp_r_sel_desc_comp_type = -1; static int hf_nas_5gs_ursp_r_sel_desc_dnn_len = -1; static expert_field ei_nas_5gs_extraneous_data = EI_INIT; static expert_field ei_nas_5gs_unknown_pd = EI_INIT; static expert_field ei_nas_5gs_mm_unknown_msg_type = EI_INIT; static expert_field ei_nas_5gs_sm_unknown_msg_type = EI_INIT; static expert_field ei_nas_5gs_updp_unknown_msg_type = EI_INIT; static expert_field ei_nas_5gs_msg_not_dis = EI_INIT; static expert_field ei_nas_5gs_ie_not_dis = EI_INIT; static expert_field ei_nas_5gs_missing_mandatory_elemen = EI_INIT; static expert_field ei_nas_5gs_dnn_too_long = EI_INIT; static expert_field ei_nas_5gs_unknown_value = EI_INIT; static expert_field ei_nas_5gs_num_pkt_flt = EI_INIT; static expert_field ei_nas_5gs_not_diss = EI_INIT; #define NAS_5GS_PLAN_NAS_MSG 0 static void disect_nas_5gs_updp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, int offset); static const value_string nas_5gs_security_header_type_vals[] = { { 0, "Plain NAS message, not security protected"}, { 1, "Integrity protected"}, { 2, "Integrity protected and ciphered"}, { 3, "Integrity protected with new 5GS security context"}, { 4, "Integrity protected and ciphered with new 5GS security context"}, { 0, NULL } }; #define TGPP_PD_5GMM 0x7e #define TGPP_PD_5GSM 0x2e static const value_string nas_5gs_epd_vals[] = { { 0x00, "Group call control" }, { 0x01, "Broadcast call control" }, { 0x02, "EPS session management messages" }, { 0x03, "Call Control; call related SS messages" }, { 0x04, "GPRS Transparent Transport Protocol (GTTP)" }, { 0x05, "Mobility Management messages" }, { 0x06, "Radio Resources Management messages" }, { 0x07, "EPS mobility management messages" }, { 0x08, "GPRS mobility management messages" }, { 0x09, "SMS messages" }, { 0x0a, "GPRS session management messages" }, { 0x0b, "Non call related SS messages" }, { 0x0c, "Location services specified in 3GPP TS 44.071" }, { 0x0d, "Unknown" }, /*{0x0e, "Reserved for extension of the PD to one octet length "},*/ { 0x0f, "Tests procedures described in 3GPP TS 44.014, 3GPP TS 34.109 and 3GPP TS 36.509" }, { TGPP_PD_5GSM, "5G session management messages" }, { TGPP_PD_5GMM, "5G mobility management messages" }, { 0, NULL } }; struct nas5gs_private_data { guint32 payload_container_type; }; static struct nas5gs_private_data* nas5gs_get_private_data(packet_info *pinfo) { struct nas5gs_private_data *nas5gs_data = (struct nas5gs_private_data*)p_get_proto_data(pinfo->pool, pinfo, proto_nas_5gs, pinfo->curr_layer_num); if (!nas5gs_data) { nas5gs_data = wmem_new0(pinfo->pool, struct nas5gs_private_data); nas5gs_data->payload_container_type = 0; p_add_proto_data(pinfo->pool, pinfo, proto_nas_5gs, pinfo->curr_layer_num, nas5gs_data); } return nas5gs_data; } static guint32 get_ext_ambr_unit(guint32 unit, const char **unit_str) { guint32 mult; if (unit == 0) { mult = 1; *unit_str = "Unit value 0, Illegal"; return mult; } unit = unit - 1; if (unit <= 0x05) { mult = pow4(guint32, unit); *unit_str = "Kbps"; } else if (unit <= 0x0a) { mult = pow4(guint32, unit - 0x05); *unit_str = "Mbps"; } else if (unit <= 0x0e) { mult = pow4(guint32, unit - 0x07); *unit_str = "Gbps"; } else if (unit <= 0x14) { mult = pow4(guint32, unit - 0x0c); *unit_str = "Tbps"; } else if (unit <= 0x19) { mult = pow4(guint32, unit - 0x11); *unit_str = "Pbps"; } else { mult = 256; *unit_str = "Pbps"; } return mult; } /* * 9.11.3 5GS mobility management (5GMM) information elements */ /* * 9.11.3.1 5GMM capability */ static guint16 de_nas_5gs_mm_5gmm_cap(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; static const int * flags[] = { &hf_nas_5gs_spare_b7, &hf_nas_5gs_spare_b6, &hf_nas_5gs_spare_b5, &hf_nas_5gs_spare_b4, &hf_nas_5gs_spare_b3, &hf_nas_5gs_mm_lpp_cap_b2, &hf_nas_5gs_mm_ho_attach_b1, &hf_nas_5gs_mm_s1_mode_b0, NULL }; curr_offset = offset; proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, flags, ENC_BIG_ENDIAN); curr_offset++; EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_nas_5gs_extraneous_data); return (curr_offset - offset); } /* * 9.11.3.2 5GMM cause */ static const value_string nas_5gs_mm_cause_vals[] = { { 0x03, "Illegal UE" }, { 0x05, "PEI not accepted" }, { 0x06, "Illegal ME" }, { 0x07, "5GS services not allowed" }, { 0x09, "UE identity cannot be derived by the network" }, { 0x0a, "Implicitly deregistered" }, { 0x0b, "PLMN not allowed" }, { 0x0c, "Tracking area not allowed" }, { 0x0d, "Roaming not allowed in this tracking area" }, { 0x0f, "No suitable cells in tracking area" }, { 0x14, "MAC failure" }, { 0x15, "Synch failure" }, { 0x16, "Congestion" }, { 0x17, "UE security capabilities mismatch" }, { 0x18, "Security mode rejected, unspecified" }, { 0x1a, "Non-5G authentication unacceptable" }, { 0x1b, "N1 mode not allowed" }, { 0x1c, "Restricted service area" }, { 0x2b, "LADN not available" }, { 0x41, "Maximum number of PDU sessions reached" }, { 0x43, "Insufficient resources for specific slice and DNN" }, { 0x45, "Insufficient resources for specific slice" }, { 0x47, "ngKSI already in use" }, { 0x48, "Non-3GPP access to 5GCN not allowed" }, { 0x49, "Serving network not authorized" }, { 0x5a, "Payload was not forwarded" }, { 0x5b, "DNN not supported or not subscribed in the slice" }, { 0x5c, "Insufficient user-plane resources for the PDU session" }, { 0x5f, "Semantically incorrect message" }, { 0x60, "Invalid mandatory information" }, { 0x61, "Message type non-existent or not implemented" }, { 0x62, "Message type not compatible with the protocol state" }, { 0x63, "Information element non-existent or not implemented" }, { 0x64, "Conditional IE error" }, { 0x65, "Message not compatible with the protocol state" }, { 0x6f, "Protocol error, unspecified" }, { 0, NULL } }; static guint16 de_nas_5gs_mm_5gmm_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 cause; proto_tree_add_item_ret_uint(tree, hf_nas_5gs_mm_5gmm_cause, tvb, offset, 1, ENC_BIG_ENDIAN, &cause); col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)", val_to_str_const(cause, nas_5gs_mm_cause_vals, "Unknown")); return 1; } static const value_string nas_5gs_mm_drx_vals[] = { { 0x0, "DRX value not specified" }, { 0x1, "DRX cycle parameter T = 32" }, { 0x2, "DRX cycle parameter T = 64" }, { 0x3, "DRX cycle parameter T = 128" }, { 0x4, "DRX cycle parameter T = 256" }, { 0, NULL } }; /* 9.11.3.2A 5GS DRX parameters*/ static guint16 de_nas_5gs_mm_5gs_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_) { proto_tree_add_item(tree, hf_nas_5gs_mm_5gs_drx_param, tvb, offset, 1, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.3 5GS identity type */ static guint16 de_nas_5gs_mm_5gs_identity_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_item(tree, hf_nas_5gs_mm_type_id, tvb, offset, 1, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.4 5GS mobile identity */ static const value_string nas_5gs_mm_type_id_vals[] = { { 0x0, "No identity" }, { 0x1, "SUCI" }, { 0x2, "5G-GUTI" }, { 0x3, "IMEI" }, { 0x4, "5G-S-TMSI" }, { 0x5, "IMEISV" }, { 0, NULL } }; static true_false_string nas_5gs_odd_even_tfs = { "Odd number of identity digits", "Even number of identity digits" }; static const value_string nas_5gs_mm_supi_fmt_vals[] = { { 0x0, "IMSI" }, { 0x1, "Network Specific Identifier" }, { 0, NULL } }; static const value_string nas_5gs_mm_prot_scheme_id_vals[] = { { 0x0, "NULL scheme" }, { 0x1, "ECIES scheme profile A" }, { 0x2, "ECIES scheme profile B" }, { 0, NULL } }; static guint16 de_nas_5gs_mm_5gs_mobile_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { guint8 oct, type_id, supi_fmt; guint32 scheme_id; tvbuff_t * new_tvb; const char *digit_str, *route_id_str; static const int * flags_odd_even_tid[] = { &hf_nas_5gs_mm_odd_even, &hf_nas_5gs_mm_type_id, NULL }; static const int * flags_supi_fmt_tid[] = { &hf_nas_5gs_spare_b7, &hf_nas_5gs_mm_supi_fmt, &hf_nas_5gs_spare_b3, &hf_nas_5gs_mm_type_id, NULL }; oct = tvb_get_guint8(tvb, offset); type_id = oct & 0x07; switch (type_id) { case 0: proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags_odd_even_tid, ENC_BIG_ENDIAN); break; case 1: /* SUCI */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags_supi_fmt_tid, ENC_BIG_ENDIAN); offset++; supi_fmt = oct & 0x70; if (supi_fmt == 0) { /* IMSI */ /* MCC digit 2 MCC digit 1 * MNC digit 3 MCC digit 3 * MNC digit 2 MNC digit 1 */ offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, offset, E212_NONE, TRUE); /* Routing indicator octet 8-9 */ new_tvb = tvb_new_subset_length(tvb, offset, 2); route_id_str = tvb_bcd_dig_to_wmem_packet_str(new_tvb, 0, -1, NULL, FALSE); proto_tree_add_string(tree, hf_nas_5gs_mm_routing_indicator, new_tvb, 0, -1, route_id_str); offset += 2; /* Protection scheme id octet 10 */ proto_tree_add_item_ret_uint(tree, hf_nas_5gs_mm_prot_scheme_id, tvb, offset, 1, ENC_BIG_ENDIAN, &scheme_id); offset += 1; /* Home network public key identifier octet 11 */ proto_tree_add_item(tree, hf_nas_5gs_mm_pki, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; /* Scheme output octet 12-x */ if (scheme_id == 0) { new_tvb = tvb_new_subset_length(tvb, offset, len - 8); digit_str = tvb_bcd_dig_to_wmem_packet_str(new_tvb, 0, -1, NULL, FALSE); proto_tree_add_string(tree, hf_nas_5gs_mm_supi_null_scheme, new_tvb, 0, -1, digit_str); } else { proto_tree_add_item(tree, hf_nas_5gs_mm_scheme_output, tvb, offset, len - 8, ENC_NA); } } else if (supi_fmt == 1) { /* NAI */ proto_tree_add_item(tree, hf_nas_5gs_mm_suci_nai, tvb, offset, len - 1, ENC_UTF_8 | ENC_NA); } else { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_unknown_value, tvb, offset, len - 1); } break; case 2: /* 5G-GUTI*/ proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags_odd_even_tid, ENC_BIG_ENDIAN); offset++; /* MCC digit 2 MCC digit 1 * MNC digit 3 MCC digit 3 * MNC digit 2 MNC digit 1 */ offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, offset, E212_NONE, TRUE); /* AMF Region ID octet 7 */ proto_tree_add_item(tree, hf_nas_5gs_amf_region_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; /* AMF Set ID octet 8 */ proto_tree_add_item(tree, hf_nas_5gs_amf_set_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset++; /* AMF AMF Pointer AMF Set ID (continued) */ proto_tree_add_item(tree, hf_nas_5gs_amf_pointer, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(tree, hf_nas_5gs_5g_tmsi, tvb, offset, 4, ENC_BIG_ENDIAN); break; case 3: /* IMEI */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags_odd_even_tid, ENC_BIG_ENDIAN); new_tvb = tvb_new_subset_length(tvb, offset, len); digit_str = tvb_bcd_dig_to_wmem_packet_str(new_tvb, 0, -1, NULL, TRUE); proto_tree_add_string(tree, hf_nas_5gs_mm_imei, new_tvb, 0, -1, digit_str); break; case 4: /*5G-S-TMSI*/ proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags_odd_even_tid, ENC_BIG_ENDIAN); offset++; /* AMF Set ID */ proto_tree_add_item(tree, hf_nas_5gs_amf_set_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset++; /* AMF Pointer AMF Set ID (continued) */ proto_tree_add_item(tree, hf_nas_5gs_amf_pointer, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(tree, hf_nas_5gs_5g_tmsi, tvb, offset, 4, ENC_BIG_ENDIAN); break; case 5: /* IMEISV */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags_odd_even_tid, ENC_BIG_ENDIAN); new_tvb = tvb_new_subset_length(tvb, offset, len); digit_str = tvb_bcd_dig_to_wmem_packet_str(new_tvb, 0, -1, NULL, TRUE); proto_tree_add_string(tree, hf_nas_5gs_mm_imeisv, new_tvb, 0, -1, digit_str); break; default: proto_tree_add_item(tree, hf_nas_5gs_mm_type_id, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_unknown_value, tvb, offset, len); break; } return len; } /* * 9.11.3.5 5GS network feature support */ static const value_string nas_5gs_nw_feat_sup_ims_vops_values[] = { { 0x0, "IMS voice over PS session not supported" }, { 0x1, "IMS voice over PS session supported over 3GPP access" }, { 0x2, "IMS voice over PS session supported over non - 3GPP access" }, { 0x3, "Reserved" }, { 0, NULL } }; static const value_string nas_5gs_nw_feat_sup_emc_values[] = { { 0x0, "Emergency services not supported" }, { 0x1, "Emergency services supported in NR connected to 5GCN only" }, { 0x2, "Emergency services supported in E-UTRA connected to 5GCN only" }, { 0x3, "Emergency services supported in NR connected to 5GCN and E-UTRA connected to 5GCN" }, { 0, NULL } }; static const value_string nas_5gs_nw_feat_sup_emf_values[] = { { 0x0, "Emergency services fallback not supported" }, { 0x1, "Emergency services fallback supported in NR connected to 5GCN only" }, { 0x2, "Emergency services fallback supported in E-UTRA connected to 5GCN only" }, { 0x3, "mergency services fallback supported in NR connected to 5GCN and E-UTRA connected to 5GCN" }, { 0, NULL } }; static const true_false_string tfs_nas_5gs_nw_feat_sup_mpsi = { "Access identity 1 valid in RPLMN or equivalent PLMN", "Access identity 1 not valid in RPLMN or equivalent PLMN" }; static guint16 de_nas_5gs_mm_5gs_nw_feat_sup(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_nw_feat_sup_mpsi_b7, &hf_nas_5gs_nw_feat_sup_ims_iwk_n26_b6, &hf_nas_5gs_nw_feat_sup_ims_emf_b5b4, &hf_nas_5gs_nw_feat_sup_ims_emc_b3b2, &hf_nas_5gs_nw_feat_sup_ims_vops_b1b0, NULL }; /* MPSI IWK N26 EMF EMC IMS VoPS octet 3*/ proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return len; } /* * 9.11.3.6 5GS registration result */ static const value_string nas_5gs_mm_reg_res_values[] = { { 0x1, "3GPP access" }, { 0x2, "Non-3GPP access" }, { 0x3, "3GPP access and non-3GPP access" }, { 0, NULL } }; static guint16 de_nas_5gs_mm_5gs_reg_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { /* 0 Spare 0 Spare 0 Spare 0 Spare SMS allowed 5GS registration result value */ proto_tree_add_item(tree, hf_nas_5gs_mm_reg_res_sms_allowed, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_nas_5gs_mm_reg_res_res, tvb, offset, 1, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.7 5GS registration type */ static const value_string nas_5gs_registration_type_values[] = { { 0x1, "initial registration" }, { 0x2, "mobility registration updating" }, { 0x3, "periodic registration updating" }, { 0x4, "emergency registration" }, { 0x7, "reserved" }, { 0, NULL } }; static true_false_string nas_5gs_for_tfs = { "Follow-on request pending", "No follow-on request pending" }; static const int * nas_5gs_registration_type_flags[] = { &hf_nas_5gs_mm_for, &hf_nas_5gs_mm_5gs_reg_type, NULL }; static guint16 de_nas_5gs_mm_5gs_reg_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { /* FOR SMS requested 5GS registration type value octet 3*/ proto_tree_add_bitmask_list(tree, tvb, offset, 1, nas_5gs_registration_type_flags, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.8 5GS tracking area identity */ static guint16 de_nas_5gs_mm_5gs_ta_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { /* MCC digit 2 MCC digit 1 Octet 2*/ /* MNC digit 3 MCC digit 3 Octet 3*/ /* MNC digit 2 MNC digit 1 Octet 4*/ /* TAC Octet 5 - 7 */ guint32 curr_offset; curr_offset = offset; curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, curr_offset, E212_TAI, TRUE); proto_tree_add_item(tree, hf_nas_5gs_tac, tvb, curr_offset, 3, ENC_BIG_ENDIAN); curr_offset += 3; return(curr_offset - offset); } /* * 9.11.3.9 5GS tracking area identity list */ static const value_string nas_5gs_mm_tal_t_li_values[] = { { 0x00, "list of TACs belonging to one PLMN, with non-consecutive TAC values" }, { 0x01, "list of TACs belonging to one PLMN, with consecutive TAC values" }, { 0x02, "list of TAIs belonging to different PLMNs" }, { 0, NULL } }; static const value_string nas_5gs_mm_tal_num_e[] = { { 0x00, "1 element" }, { 0x01, "2 elements" }, { 0x02, "3 elements" }, { 0x03, "4 elements" }, { 0x04, "5 elements" }, { 0x05, "6 elements" }, { 0x06, "7 elements" }, { 0x07, "8 elements" }, { 0x08, "9 elements" }, { 0x09, "10 elements" }, { 0x0a, "11 elements" }, { 0x0b, "12 elements" }, { 0x0c, "13 elements" }, { 0x0d, "14 elements" }, { 0x0e, "15 elements" }, { 0x0f, "16 elements" }, { 0, NULL } }; static guint16 de_nas_5gs_mm_5gs_ta_id_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree *sub_tree; proto_item *item; static const int * flags[] = { &hf_nas_5gs_mm_tal_t_li, &hf_nas_5gs_mm_tal_num_e, NULL }; guint num_par_tal = 1; guint32 curr_offset = offset; guint32 start_offset; guint8 tal_head, tal_t_li, tal_num_e; /*Partial tracking area list*/ while ((curr_offset - offset) < len) { start_offset = curr_offset; sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, ett_nas_5gs_mm_part_tal, &item, "Partial tracking area list %u", num_par_tal); /*Head of Partial tracking area list*/ /* Type of list Number of elements octet 1 */ tal_head = tvb_get_guint8(tvb, curr_offset); tal_t_li = (tal_head & 0x60) >> 5; tal_num_e = (tal_head & 0x1f) + 1; proto_tree_add_bitmask_list(sub_tree, tvb, curr_offset, 1, flags, ENC_BIG_ENDIAN); curr_offset++; switch (tal_t_li) { case 0: /*octet 2 MCC digit2 MCC digit1*/ /*octet 3 MNC digit3 MCC digit3*/ /*octet 4 MNC digit2 MNC digit1*/ dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, curr_offset, E212_NONE, FALSE); curr_offset += 3; while (tal_num_e > 0) { proto_tree_add_item(sub_tree, hf_nas_5gs_tac, tvb, curr_offset, 3, ENC_BIG_ENDIAN); curr_offset += 3; tal_num_e--; } break; case 1: /*octet 2 MCC digit2 MCC digit1*/ /*octet 3 MNC digit3 MCC digit3*/ /*octet 4 MNC digit2 MNC digit1*/ dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, curr_offset, E212_NONE, FALSE); curr_offset += 3; /*octet 5 TAC 1*/ proto_tree_add_item(sub_tree, hf_nas_5gs_tac, tvb, curr_offset, 3, ENC_BIG_ENDIAN); curr_offset+=3; break; case 2: while (tal_num_e > 0) { /*octet 2 MCC digit2 MCC digit1*/ /*octet 3 MNC digit3 MCC digit3*/ /*octet 4 MNC digit2 MNC digit1*/ dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, curr_offset, E212_NONE, FALSE); curr_offset += 3; /*octet 5 TAC 1*/ proto_tree_add_item(sub_tree, hf_nas_5gs_tac, tvb, curr_offset, 3, ENC_BIG_ENDIAN); curr_offset += 3; tal_num_e--; } break; case 3: dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, curr_offset, E212_NONE, FALSE); curr_offset += 3; break; default: proto_tree_add_expert(sub_tree, pinfo, &ei_nas_5gs_unknown_value, tvb, curr_offset, len - 1); } /*calculate the length of IE?*/ proto_item_set_len(item, curr_offset - start_offset); /*calculate the number of Partial tracking area list*/ num_par_tal++; } return len; } /* * 9.11.3.9A 5GS update type */ static true_false_string tfs_nas5gs_sms_requested = { "SMS over NAS supported", "SMS over NAS not supported" }; static guint16 de_nas_5gs_mm_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_) { static const int * flags[] = { &hf_nas_5gs_spare_b3, &hf_nas_5gs_spare_b2, &hf_nas_5gs_mm_ng_ran_rcu, &hf_nas_5gs_mm_sms_requested, NULL }; proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.10 ABBA */ static guint16 de_nas_5gs_mm_abba(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree_add_item(tree, hf_nas_5gs_mm_abba, tvb, offset, len, ENC_BIG_ENDIAN); return len; } /* * 9.11.3.11 Access type */ static const int* nas_5gs_mm_access_type_flags[] = { &hf_nas_5gs_spare_b3, &hf_nas_5gs_spare_b2, &hf_nas_5gs_mm_acc_type, NULL }; static guint16 de_nas_5gs_mm_access_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_bitmask_list(tree, tvb, offset, 1, nas_5gs_mm_access_type_flags, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.12 Additional 5G security information */ static guint16 de_nas_5gs_mm_add_5g_sec_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_spare_b3, &hf_nas_5gs_spare_b2, &hf_nas_5gs_mm_rinmr, &hf_nas_5gs_mm_hdp, NULL }; proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.13 Allowed PDU session status */ static true_false_string tfs_nas_5gs_allow_pdu_ses_sts_psi = { "user-plane resources of corresponding PDU session can be re-established over 3GPP access", "user-plane resources of corresponding PDU session is not allowed to be re-established over 3GPP access" }; static guint16 de_nas_5gs_mm_allow_pdu_ses_sts(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { int curr_offset; static const int * psi_0_7_flags[] = { &hf_nas_5gs_allow_pdu_ses_sts_psi_7_b7, &hf_nas_5gs_allow_pdu_ses_sts_psi_6_b6, &hf_nas_5gs_allow_pdu_ses_sts_psi_5_b5, &hf_nas_5gs_allow_pdu_ses_sts_psi_4_b4, &hf_nas_5gs_allow_pdu_ses_sts_psi_3_b3, &hf_nas_5gs_allow_pdu_ses_sts_psi_2_b2, &hf_nas_5gs_allow_pdu_ses_sts_psi_1_b1, &hf_nas_5gs_allow_pdu_ses_sts_psi_0_b0, NULL }; static const int * psi_8_15_flags[] = { &hf_nas_5gs_allow_pdu_ses_sts_psi_15_b7, &hf_nas_5gs_allow_pdu_ses_sts_psi_14_b6, &hf_nas_5gs_allow_pdu_ses_sts_psi_13_b5, &hf_nas_5gs_allow_pdu_ses_sts_psi_12_b4, &hf_nas_5gs_allow_pdu_ses_sts_psi_11_b3, &hf_nas_5gs_allow_pdu_ses_sts_psi_10_b2, &hf_nas_5gs_allow_pdu_ses_sts_psi_9_b1, &hf_nas_5gs_allow_pdu_ses_sts_psi_8_b0, NULL }; curr_offset = offset; proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, psi_0_7_flags, ENC_BIG_ENDIAN); curr_offset++; proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, psi_8_15_flags, ENC_BIG_ENDIAN); curr_offset++; EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_nas_5gs_extraneous_data); return (curr_offset - offset); } /* * 9.11.3.14 Authentication failure parameter */ /* See subclause 10.5.3.2.2 in 3GPP TS 24.008 */ /* * 9.11.3.15 Authentication parameter AUTN */ /* See subclause 10.5.3.1 in 3GPP TS 24.008 [8].*/ /* * 9.11.3.16 Authentication parameter RAND */ /* See subclause 10.5.3.1 in 3GPP TS 24.008 [8]. */ /* * 9.11.3.17 Authentication response parameter */ /* See subclause 9.9.3.4 in 3GPP TS 24.301 [15].*/ /* * 9.11.3.18 Configuration update indication */ static guint16 de_nas_5gs_mm_conf_upd_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_spare_b3, &hf_nas_5gs_spare_b2, &hf_nas_5gs_mm_conf_upd_ind_red_b1, &hf_nas_5gs_mm_conf_upd_ind_ack_b0, NULL }; proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.19 Daylight saving time */ /* See subclause 10.5.3.12 in 3GPP TS 24.008 */ /* * 9.11.3.20 De-registration type */ static const true_false_string nas_5gs_mm_switch_off_tfs = { "Switch off", "Normal de-registration" }; static const true_false_string nas_5gs_mm_re_reg_req_tfs = { "re-registration required", "re-registration not required" }; static const value_string nas_5gs_mm_acc_type_vals[] = { { 0x1, "3GPP access"}, { 0x2, "Non-3GPP access"}, { 0x3, "3GPP access and non-3GPP access"}, { 0, NULL } }; static guint16 de_nas_5gs_mm_de_reg_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { /* Switch off Re-registration required Access type */ proto_tree_add_item(tree, hf_nas_5gs_mm_switch_off, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_nas_5gs_mm_re_reg_req, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_nas_5gs_mm_acc_type, tvb, offset, 1, ENC_BIG_ENDIAN); return 1; } /* 9.11.3.21 Void*/ /* 9.11.3.22 Void*/ /* * 9.11.3.23 Emergency number list */ /* See subclause 10.5.3.13 in 3GPP TS 24.008 */ /* * 9.11.3.24 EPS NAS message container */ static guint16 de_nas_5gs_mm_eps_nas_msg_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { /* an EPS NAS message as specified in 3GPP TS 24.301 */ if (nas_eps_handle) { col_append_str(pinfo->cinfo, COL_PROTOCOL, "/"); col_set_fence(pinfo->cinfo, COL_PROTOCOL); call_dissector(nas_eps_handle, tvb_new_subset_length(tvb, offset, len), pinfo, tree); } return len; } /* * 9.11.3.25 EPS NAS security algorithms */ /* See subclause 9.9.3.23 in 3GPP TS 24.301 */ /* * 9.11.3.26 Extended emergency number list */ /* See subclause 9.9.3.37A in 3GPP TS 24.301 */ /* 9.11.3.27 Void*/ /* * 9.11.3.28 IMEISV request */ /* See subclause 10.5.5.10 in 3GPP TS 24.008 */ /* * 9.11.3.29 LADN indication */ static guint16 de_nas_5gs_mm_ladn_indic(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree *sub_tree; proto_item *item; int i = 1; guint32 length; guint32 curr_offset; curr_offset = offset; while ((curr_offset - offset) < len) { sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 2, ett_nas_5gs_mm_ladn_indic, &item, "LADN DNN value %u", i); /*LADN DNN value is coded as the length and value part of DNN information element as specified in subclause 9.11.2.1A starting with the second octet*/ proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_mm_length, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &length); curr_offset++; curr_offset += de_nas_5gs_cmn_dnn(tvb, sub_tree, pinfo, curr_offset, length, NULL, 0); proto_item_set_len(item, length + 1); i++; } return len; } /* * 9.11.3.30 LADN information */ static guint16 de_nas_5gs_mm_ladn_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree *sub_tree; proto_item *item; int i = 1; guint32 length; guint32 curr_offset; curr_offset = offset; while ((curr_offset - offset) < len) { sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 2, ett_nas_5gs_mm_ladn_indic, &item, "LADN %u", i); /* DNN value (octet 5 to octet m): * LADN DNN value is coded as the length and value part of DNN information element as specified in * subclause 9.11.2.1A starting with the second octet */ proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_mm_length, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &length); curr_offset++; curr_offset += de_nas_5gs_cmn_dnn(tvb, sub_tree, pinfo, curr_offset, length, NULL, 0); /* 5GS tracking area identity list (octet m+1 to octet a): * 5GS tracking area identity list field is coded as the length and the value part of the * 5GS Tracking area identity list information element as specified in subclause 9.11.3.9 * starting with the second octet */ proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_mm_length, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &length); curr_offset++; curr_offset += de_nas_5gs_mm_5gs_ta_id_list(tvb, sub_tree, pinfo, curr_offset, length, NULL, 0); proto_item_set_len(item, curr_offset - offset); i++; } return len; } /* * 9.11.3.31 MICO indication */ static const true_false_string tfs_nas_5gs_raai = { "all PLMN registration area allocated", "all PLMN registration area not allocated" }; static guint16 de_nas_5gs_mm_mico_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_spare_b3, &hf_nas_5gs_spare_b2, &hf_nas_5gs_spare_b1, &hf_nas_5gs_mm_raai_b0, NULL }; proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return 1; } static const true_false_string nas_5gs_mm_tsc_tfs = { "Mapped security context (for KSIASME)", "Native security context (for KSIAMF)" }; /* * 9.11.3.32 NAS key set identifier */ static guint16 de_nas_5gs_mm_nas_key_set_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_mm_tsc, &hf_nas_5gs_mm_nas_key_set_id, NULL }; /* NAS key set identifier IEI TSC NAS key set identifier */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.33 NAS message container */ static guint16 de_nas_5gs_mm_nas_msg_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { /* The purpose of the NAS message container IE is to encapsulate a plain 5GS NAS message. */ /* a NAS message without NAS security heade */ dissect_nas_5gs(tvb_new_subset_length(tvb, offset, len), pinfo, tree, NULL); return len; } /* * 9.11.3.34 NAS security algorithms */ static const value_string nas_5gs_mm_type_of_ip_algo_vals[] = { { 0x0, "5G-IA0 (null integrity protection algorithm)"}, { 0x1, "128-5G-IA1"}, { 0x2, "128-5G-IA2"}, { 0x3, "128-5G-IA3"}, { 0x4, "5G-IA4"}, { 0x5, "5G-IA5"}, { 0x6, "5G-IA6"}, { 0x7, "5G-IA7"}, { 0, NULL } }; static const value_string nas_5gs_mm_type_of_enc_algo_vals[] = { { 0x0, "5G-EA0 (null ciphering algorithm)"}, { 0x1, "128-5G-EA1"}, { 0x2, "128-5G-EA2"}, { 0x3, "128-5G-EA3"}, { 0x4, "5G-EA4"}, { 0x5, "5G-EA5"}, { 0x6, "5G-EA6"}, { 0x7, "5G-EA7"}, { 0, NULL } }; static guint16 de_nas_5gs_mm_nas_sec_algo(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_mm_nas_sec_algo_enc, &hf_nas_5gs_mm_nas_sec_algo_ip, NULL }; proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.35 Network name */ /* See subclause 10.5.3.5a in 3GPP TS 24.008 */ /* * 9.11.3.36 Network slicing indication */ static const true_false_string nas_5gs_mm_dcni_tfs = { "Requested NSSAI created from default configured NSSAI", "Requested NSSAI not created from default configured NSSAI" }; static guint16 de_nas_5gs_mm_nw_slicing_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_spare_b3, &hf_nas_5gs_spare_b2, &hf_nas_5gs_mm_dcni, &hf_nas_5gs_mm_nssci, NULL }; proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return len; } /* * 9.11.3.37 NSSAI */ static guint16 de_nas_5gs_mm_nssai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree *sub_tree; proto_item *item; int i = 1; guint32 length; guint32 curr_offset; curr_offset = offset; while ((curr_offset - offset) < len) { sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 2, ett_nas_5gs_mm_nssai, &item, "S-NSSAI %u", i); proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_mm_length, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &length); curr_offset++; curr_offset += de_nas_5gs_cmn_s_nssai(tvb, sub_tree, pinfo, curr_offset, length, NULL, 0); proto_item_set_len(item, length + 1); i++; } return len; } /* * 9.11.3.37A NSSAI inclusion mode */ static const value_string nas_5gs_mm_nssai_inc_mode_vals[] = { { 0x00, "A" }, { 0x01, "B" }, { 0x02, "C" }, { 0x03, "D" }, { 0, NULL } }; static guint16 de_nas_5gs_mm_nssai_inc_mode(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_spare_b3, &hf_nas_5gs_spare_b2, &hf_nas_5gs_mm_nssai_inc_mode, NULL }; proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return len; } /* * 9.11.3.38 Operator-defined access category definitions */ static guint16 de_nas_5gs_mm_op_def_acc_cat_def(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree *sub_tree; proto_item *item; int i = 1; guint32 length; guint32 curr_offset; curr_offset = offset; while ((curr_offset - offset) < len) { sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 2, ett_nas_5gs_mm_nssai, &item, "Operator-defined access category definition %u", i); proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_mm_length, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &length); curr_offset++; /* Precedence value */ proto_tree_add_item(sub_tree, hf_nas_5gs_mm_precedence, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; /* PSAC 0 Spare 0 Spare Operator-defined access category number */ /* Length of criteria */ /* Criteria */ /* 0 Spare 0 Spare 0 Spare Standardized access category */ proto_tree_add_expert(sub_tree, pinfo, &ei_nas_5gs_not_diss, tvb, curr_offset, length - 1); curr_offset += length; proto_item_set_len(item, length + 1); i++; } return len; } /* * 9.11.3.39 Payload container */ static guint16 de_nas_5gs_mm_pld_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { struct nas5gs_private_data *nas5gs_data = nas5gs_get_private_data(pinfo); switch (nas5gs_data->payload_container_type) { case 1: /* N1 SM information */ dissect_nas_5gs_common(tvb_new_subset_length(tvb, offset, len), pinfo, tree, 0, NULL); break; case 2: /* SMS */ if (gsm_a_dtap_handle) { call_dissector(gsm_a_dtap_handle, tvb_new_subset_length(tvb, offset, len), pinfo, tree); } else { proto_tree_add_item(tree, hf_nas_5gs_mm_pld_cont, tvb, offset, len, ENC_NA); } break; case 3: /* LPP */ if (lpp_handle) { call_dissector(lpp_handle, tvb_new_subset_length(tvb, offset, len), pinfo, tree); } else { proto_tree_add_item(tree, hf_nas_5gs_mm_pld_cont, tvb, offset, len, ENC_NA); } break; case 5: /* UE policy container */ disect_nas_5gs_updp(tvb_new_subset_length(tvb, offset, len), pinfo, tree, 0); break; default: proto_tree_add_item(tree, hf_nas_5gs_mm_pld_cont, tvb, offset, len, ENC_NA); break; } return len; } /* * 9.11.3.40 Payload container type */ static const value_string nas_5gs_mm_pld_cont_type_vals[] = { { 0x01, "N1 SM information" }, { 0x02, "SMS" }, { 0x03, "LTE Positioning Protocol (LPP) message container" }, { 0x04, "SOR transparent container" }, { 0x05, "UE policy container" }, { 0x06, "UE parameters update transparent container" }, { 0x0f, "Multiple payloads" }, { 0, NULL } }; static guint16 de_nas_5gs_mm_pld_cont_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { struct nas5gs_private_data *nas5gs_data = nas5gs_get_private_data(pinfo); proto_tree_add_item_ret_uint(tree, hf_nas_5gs_mm_pld_cont_type, tvb, offset, 1, ENC_BIG_ENDIAN, &nas5gs_data->payload_container_type); return 1; } /* * 9.11.3.41 PDU session identity 2 */ static guint16 de_nas_5gs_mm_pdu_ses_id_2(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_nas_5gs_pdu_session_id, tvb, offset, 1, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.42 PDU session reactivation result */ static true_false_string tfs_nas_5gs_pdu_ses_rect_res_psi = { "1", "0" }; static guint16 de_nas_5gs_mm_pdu_ses_react_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { int curr_offset; static const int * psi_0_7_flags[] = { &hf_nas_5gs_pdu_ses_rect_res_psi_7_b7, &hf_nas_5gs_pdu_ses_rect_res_psi_6_b6, &hf_nas_5gs_pdu_ses_rect_res_psi_5_b5, &hf_nas_5gs_pdu_ses_rect_res_psi_4_b4, &hf_nas_5gs_pdu_ses_rect_res_psi_3_b3, &hf_nas_5gs_pdu_ses_rect_res_psi_2_b2, &hf_nas_5gs_pdu_ses_rect_res_psi_1_b1, &hf_nas_5gs_pdu_ses_rect_res_psi_0_b0, NULL }; static const int * psi_8_15_flags[] = { &hf_nas_5gs_pdu_ses_rect_res_psi_15_b7, &hf_nas_5gs_pdu_ses_rect_res_psi_14_b6, &hf_nas_5gs_pdu_ses_rect_res_psi_13_b5, &hf_nas_5gs_pdu_ses_rect_res_psi_12_b4, &hf_nas_5gs_pdu_ses_rect_res_psi_11_b3, &hf_nas_5gs_pdu_ses_rect_res_psi_10_b2, &hf_nas_5gs_pdu_ses_rect_res_psi_9_b1, &hf_nas_5gs_pdu_ses_rect_res_psi_8_b0, NULL }; curr_offset = offset; proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, psi_0_7_flags, ENC_BIG_ENDIAN); curr_offset++; proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, psi_8_15_flags, ENC_BIG_ENDIAN); curr_offset++; EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_nas_5gs_extraneous_data); return (curr_offset - offset); } /* * 9.11.3.43 PDU session reactivation result error cause */ static guint16 de_nas_5gs_mm_pdu_ses_react_res_err_c(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 = offset; /*Partial service area list*/ while ((curr_offset - offset) < len) { proto_tree_add_item(tree, hf_nas_5gs_pdu_session_id, tvb, offset, 1, ENC_BIG_ENDIAN); curr_offset++; proto_tree_add_item(tree, hf_nas_5gs_mm_5gmm_cause, tvb, offset, 1, ENC_BIG_ENDIAN); curr_offset++; } return len; } /* * 9.11.3.44 PDU session status */ static true_false_string tfs_nas_5gs_pdu_ses_sts_psi = { "Not PDU SESSION INACTIVE", "PDU SESSION INACTIVE" }; static guint16 de_nas_5gs_mm_pdu_ses_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { int curr_offset; static const int * psi_0_7_flags[] = { &hf_nas_5gs_pdu_ses_sts_psi_7_b7, &hf_nas_5gs_pdu_ses_sts_psi_6_b6, &hf_nas_5gs_pdu_ses_sts_psi_5_b5, &hf_nas_5gs_pdu_ses_sts_psi_4_b4, &hf_nas_5gs_pdu_ses_sts_psi_3_b3, &hf_nas_5gs_pdu_ses_sts_psi_2_b2, &hf_nas_5gs_pdu_ses_sts_psi_1_b1, &hf_nas_5gs_pdu_ses_sts_psi_0_b0, NULL }; static const int * psi_8_15_flags[] = { &hf_nas_5gs_pdu_ses_sts_psi_15_b7, &hf_nas_5gs_pdu_ses_sts_psi_14_b6, &hf_nas_5gs_pdu_ses_sts_psi_13_b5, &hf_nas_5gs_pdu_ses_sts_psi_12_b4, &hf_nas_5gs_pdu_ses_sts_psi_11_b3, &hf_nas_5gs_pdu_ses_sts_psi_10_b2, &hf_nas_5gs_pdu_ses_sts_psi_9_b1, &hf_nas_5gs_pdu_ses_sts_psi_8_b0, NULL }; curr_offset = offset; proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, psi_0_7_flags, ENC_BIG_ENDIAN); curr_offset++; proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, psi_8_15_flags, ENC_BIG_ENDIAN); curr_offset++; EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_nas_5gs_extraneous_data); return (curr_offset - offset); } /* * 9.11.3.45 PLMN list */ /* See subclause 10.5.1.13 in 3GPP TS 24.008 */ /* * 9.11.3.46 Rejected NSSAI */ static guint16 de_nas_5gs_mm_rej_nssai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* * 9.11.3.47 Request type */ static const value_string nas_5gs_mm_req_type_vals[] = { { 0x01, "Initial request" }, { 0x02, "Existing PDU session" }, { 0x03, "Initial emergency request" }, { 0x04, "Existing emergency PDU session" }, { 0x05, "Modification request" }, { 0x07, "Reserved" }, { 0, NULL } }; static guint16 de_nas_5gs_mm_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_item(tree, hf_nas_5gs_mm_req_type, tvb, offset, 1, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.48 S1 UE network capability */ /* See subclause 9.9.3.34 in 3GPP TS 24.301 */ /* * 9.11.3.48A S1 UE security capability */ /*See subclause 9.9.3.36 in 3GPP TS 24.301 */ /* * 9.11.3.49 Service area list */ static true_false_string tfs_nas_5gs_sal_al_t = { "TAIs in the list are in the non-allowed area", "TAIs in the list are in the allowed area" }; static const value_string nas_5gs_mm_sal_t_li_values[] = { { 0x00, "list of TACs belonging to one PLMN, with non-consecutive TAC values" }, { 0x01, "list of TACs belonging to one PLMN, with consecutive TAC values" }, { 0x02, "list of TAIs belonging to different PLMNs" }, { 0x03, "All TAIs belonging to the PLMN are in the allowed area" }, { 0, NULL } }; static guint16 de_nas_5gs_mm_sal(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree *sub_tree; proto_item *item; static const int * flags_sal[] = { &hf_nas_5gs_mm_sal_al_t, &hf_nas_5gs_mm_sal_t_li, &hf_nas_5gs_mm_sal_num_e, NULL }; guint num_par_sal = 1; guint32 curr_offset = offset; guint32 start_offset; guint8 sal_head, sal_t_li, sal_num_e; /*Partial service area list*/ while ((curr_offset - offset) < len) { start_offset = curr_offset; sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, ett_nas_5gs_mm_part_sal, &item, "Partial service area list %u", num_par_sal); /*Head of Partial service area list*/ /* Allowed type Type of list Number of elements octet 1 */ sal_head = tvb_get_guint8(tvb, curr_offset); sal_t_li = (sal_head & 0x60) >> 5; sal_num_e = (sal_head & 0x1f) + 1; proto_tree_add_bitmask_list(sub_tree, tvb, curr_offset, 1, flags_sal, ENC_BIG_ENDIAN); curr_offset++; switch (sal_t_li) { case 0: /*octet 2 MCC digit2 MCC digit1*/ /*octet 3 MNC digit3 MCC digit3*/ /*octet 4 MNC digit2 MNC digit1*/ dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, curr_offset, E212_NONE, FALSE); curr_offset += 3; while (sal_num_e > 0) { proto_tree_add_item(sub_tree, hf_nas_5gs_tac, tvb, curr_offset, 3, ENC_BIG_ENDIAN); curr_offset += 3; sal_num_e--; } break; case 1: /*octet 2 MCC digit2 MCC digit1*/ /*octet 3 MNC digit3 MCC digit3*/ /*octet 4 MNC digit2 MNC digit1*/ dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, curr_offset, E212_NONE, FALSE); curr_offset += 3; /*octet 5 TAC 1*/ proto_tree_add_item(sub_tree, hf_nas_5gs_tac, tvb, curr_offset, 3, ENC_BIG_ENDIAN); curr_offset+=3; break; case 2: while (sal_num_e > 0) { /*octet 2 MCC digit2 MCC digit1*/ /*octet 3 MNC digit3 MCC digit3*/ /*octet 4 MNC digit2 MNC digit1*/ dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, curr_offset, E212_NONE, FALSE); curr_offset += 3; /*octet 5 TAC 1*/ proto_tree_add_item(sub_tree, hf_nas_5gs_tac, tvb, curr_offset, 3, ENC_BIG_ENDIAN); curr_offset += 3; sal_num_e--; } break; case 3: dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, curr_offset, E212_NONE, FALSE); curr_offset += 3; break; default: proto_tree_add_expert(sub_tree, pinfo, &ei_nas_5gs_unknown_value, tvb, curr_offset, len - 1); } /*calculate the length of IE?*/ proto_item_set_len(item, curr_offset - start_offset); /*calculate the number of Partial service area list*/ num_par_sal++; } return len; } /* * 9.11.3.50 Service type */ /* Used inline as H1 (Upper nibble)*/ static const value_string nas_5gs_mm_serv_type_vals[] = { { 0x00, "Signalling" }, { 0x01, "Data" }, { 0x02, "Mobile terminated services" }, { 0x03, "Emergency services" }, { 0x04, "Emergency services fallback" }, { 0x05, "High priority access" }, { 0, NULL } }; /* * 9.11.3.50A SMS indication */ static guint16 de_nas_5gs_mm_sms_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_spare_b3, &hf_nas_5gs_spare_b2, &hf_nas_5gs_spare_b1, &hf_nas_5gs_mm_sms_indic_sai, NULL }; proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return len; } /* * 9.11.3.51 SOR transparent container */ static true_false_string tfs_nas_5gs_list_type = { "PLMN ID and access technology list", "Secured packet" }; static true_false_string tfs_nas_5gs_list_ind = { "List of preferred PLMN/access technology combinations is provided", "No list of preferred PLMN/access technology combinations is provided" }; static true_false_string tfs_nas_5gs_sor_data_type = { "Carries acknowledgement of successful reception of the steering of roaming information", "Carries steering of roaming information" }; static guint16 de_nas_5gs_mm_sor_trasp_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { /* Layout differs depending on SOR data type*/ static const int * flags_dt0[] = { &hf_nas_5gs_spare_b7, &hf_nas_5gs_spare_b6, &hf_nas_5gs_spare_b5, &hf_nas_5gs_spare_b4, &hf_nas_5gs_sor_hdr0_ack, &hf_nas_5gs_sor_hdr0_list_type, &hf_nas_5gs_sor_hdr0_list_ind, &hf_nas_5gs_sor_hdr0_sor_data_type, NULL }; static const int * flags_dt1[] = { &hf_nas_5gs_spare_b7, &hf_nas_5gs_spare_b6, &hf_nas_5gs_spare_b5, &hf_nas_5gs_spare_b4, &hf_nas_5gs_spare_b3, &hf_nas_5gs_spare_b2, &hf_nas_5gs_spare_b1, &hf_nas_5gs_sor_hdr0_sor_data_type, NULL }; /* 3GPP TS 31.102 [22] subclause 4.2.5 */ static const int * flags_acces_tech_1[] = { &hf_nas_5gs_acces_tech_o1_b7, &hf_nas_5gs_acces_tech_o1_b6, &hf_nas_5gs_acces_tech_o1_b5, &hf_nas_5gs_acces_tech_o1_b4, &hf_nas_5gs_acces_tech_o1_b3, &hf_nas_5gs_rfu_b2, &hf_nas_5gs_rfu_b1, &hf_nas_5gs_rfu_b0, NULL }; static const int * flags_acces_tech_2[] = { &hf_nas_5gs_acces_tech_o2_b7, &hf_nas_5gs_acces_tech_o2_b6, &hf_nas_5gs_acces_tech_o2_b5, &hf_nas_5gs_acces_tech_o2_b4, &hf_nas_5gs_acces_tech_o2_b3, &hf_nas_5gs_acces_tech_o2_b2, &hf_nas_5gs_rfu_b1, &hf_nas_5gs_rfu_b0, NULL }; proto_tree *sub_tree; guint8 oct, data_type, list_type; guint32 curr_offset = offset; int i = 1; oct = tvb_get_guint8(tvb, offset); data_type = oct & 0x01; if (data_type == 0) { /* SOR header octet 4*/ proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, flags_dt0, ENC_BIG_ENDIAN); curr_offset++; list_type = (oct & 0x4) >> 2; /* SOR-MAC-IAUSF octet 5-20 */ proto_tree_add_item(tree, hf_nas_5gs_sor_mac_iausf, tvb, curr_offset, 16, ENC_NA); curr_offset += 16; /* CounterSOR octet 21-22 */ proto_tree_add_item(tree, hf_nas_5gs_counter_sor, tvb, curr_offset, 2, ENC_BIG_ENDIAN); curr_offset += 2; if (list_type == 0) { /* Secured packet octet 23* - 2048* */ proto_tree_add_item(tree, hf_nas_5gs_sor_sec_pkt, tvb, curr_offset, len - 19, ENC_NA); curr_offset = curr_offset + (len - 19); } else { /* PLMN ID and access technology list octet 23*-102* */ while ((curr_offset - offset) < len) { sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, ett_nas_5gs_mm_sor, NULL, "List item %u", i); /* The PLMN ID and access technology list consists of PLMN ID and access technology identifier * and are coded as specified in 3GPP TS 31.102 [22] subclause 4.2.5 * PLMN * Contents: * - Mobile Country Code (MCC) followed by the Mobile Network Code (MNC). * Coding: * - according to TS 24.008 [9]. */ /* PLMN ID 1 octet 23*- 25* */ curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, curr_offset, E212_NONE, FALSE); curr_offset += 3; /* access technology identifier 1 octet 26*- 27* */ proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, flags_acces_tech_1, ENC_BIG_ENDIAN); curr_offset++; proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, flags_acces_tech_2, ENC_BIG_ENDIAN); curr_offset++; i++; } } } else { /* SOR header octet 4*/ proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, flags_dt1, ENC_BIG_ENDIAN); curr_offset++; /* SOR-MAC-IUE octet 5 - 20*/ proto_tree_add_item(tree, hf_nas_5gs_sor_mac_iue, tvb, curr_offset, 16, ENC_NA); curr_offset+=16; } EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_nas_5gs_extraneous_data); return (curr_offset - offset); } /* * 9.11.3.52 Time zone */ /* See subclause 10.5.3.8 in 3GPP TS 24.008 */ /* * 9.11.3.53 Time zone and time */ /* See subclause 10.5.3.9 in 3GPP TS 24.00*/ /* * 9.11.3.53A UE parameters update transparent container */ static guint16 de_nas_5gs_mm_ue_par_upd_trasnsp_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* * 9.11.3.54 UE security capability */ static guint16 de_nas_5gs_mm_ue_sec_cap(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; static const int * oct3_flags[] = { &hf_nas_5gs_mm_5g_ea0, &hf_nas_5gs_mm_128_5g_ea1, &hf_nas_5gs_mm_128_5g_ea2, &hf_nas_5gs_mm_128_5g_ea3, &hf_nas_5gs_mm_5g_ea4, &hf_nas_5gs_mm_5g_ea5, &hf_nas_5gs_mm_5g_ea6, &hf_nas_5gs_mm_5g_ea7, NULL }; static const int * oct4_flags[] = { &hf_nas_5gs_mm_5g_ia0, &hf_nas_5gs_mm_5g_128_ia1, &hf_nas_5gs_mm_5g_128_ia2, &hf_nas_5gs_mm_5g_128_ia3, &hf_nas_5gs_mm_5g_ia4, &hf_nas_5gs_mm_5g_ia5, &hf_nas_5gs_mm_5g_ia6, &hf_nas_5gs_mm_5g_ia7, NULL }; static const int * oct5_flags[] = { &hf_nas_5gs_mm_eea0, &hf_nas_5gs_mm_128eea1, &hf_nas_5gs_mm_128eea2, &hf_nas_5gs_mm_eea3, &hf_nas_5gs_mm_eea4, &hf_nas_5gs_mm_eea5, &hf_nas_5gs_mm_eea6, &hf_nas_5gs_mm_eea7, NULL }; static const int * oct6_flags[] = { &hf_nas_5gs_mm_eia0, &hf_nas_5gs_mm_128eia1, &hf_nas_5gs_mm_128eia2, &hf_nas_5gs_mm_eia3, &hf_nas_5gs_mm_eia4, &hf_nas_5gs_mm_eia5, &hf_nas_5gs_mm_eia6, &hf_nas_5gs_mm_eia7, NULL }; curr_offset = offset; /* 5G-EA0 128-5G-EA1 128-5G-EA2 128-5G-EA3 5G-EA4 5G-EA5 5G-EA6 5G-EA7 octet 3 */ proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, oct3_flags, ENC_NA); curr_offset++; /* 5G-IA0 128-5G-IA1 128-5G-IA2 128-5G-IA3 5G-IA4 5G-IA5 5G-IA6 5G-IA7 octet 4 */ proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, oct4_flags, ENC_NA); curr_offset++; if (len == 2) { return len; } /* EEA0 128-EEA1 128-EEA2 128-EEA3 EEA4 EEA5 EEA6 EEA7 octet 5 */ proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, oct5_flags, ENC_NA); curr_offset++; /* EIA0 128-EIA1 128-EIA2 128-EIA3 EIA4 EIA5 EIA6 EIA7 octet 6 */ proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, oct6_flags, ENC_NA); return len; } /* * 9.11.3.55 UE's usage setting */ static true_false_string tfs_nas_5gs_mm_ue_usage_setting = { "Data centric", "Voice centric" }; static guint16 de_nas_5gs_mm_ue_usage_set(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_spare_b3, &hf_nas_5gs_spare_b2, &hf_nas_5gs_spare_b1, &hf_nas_5gs_mm_ue_usage_setting, NULL }; proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return len; } /* * 9.11.3.56 UE status */ static true_false_string tfs_nas_5gs_mm_n1_mod = { "UE is in 5GMM-REGISTERED state", "UE is not in 5GMM-REGISTERED state" }; static true_false_string tfs_nas_5gs_mm_s1_mod = { "UE is in EMM-REGISTERED state", "UE is not in EMM-REGISTERED state" }; static guint16 de_nas_5gs_mm_ue_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_spare_b7, &hf_nas_5gs_spare_b6, &hf_nas_5gs_spare_b5, &hf_nas_5gs_spare_b4, &hf_nas_5gs_spare_b3, &hf_nas_5gs_spare_b2, &hf_nas_5gs_mm_n1_mode_reg_b1, &hf_nas_5gs_mm_s1_mode_reg_b0, NULL }; /* 0 Spare 0 Spare 0 Spare 0 Spare 0 Spare 0 Spare 0 Spare S1 mode reg */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return 1; } /* * 9.11.3.57 Uplink data status */ static true_false_string tfs_nas_5gs_ul_data_sts_psi = { "uplink data are pending", "no uplink data are pending" }; static guint16 de_nas_5gs_mm_ul_data_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { int curr_offset; static const int * psi_0_7_flags[] = { &hf_nas_5gs_ul_data_sts_psi_7_b7, &hf_nas_5gs_ul_data_sts_psi_6_b6, &hf_nas_5gs_ul_data_sts_psi_5_b5, &hf_nas_5gs_ul_data_sts_psi_4_b4, &hf_nas_5gs_ul_data_sts_psi_3_b3, &hf_nas_5gs_ul_data_sts_psi_2_b2, &hf_nas_5gs_ul_data_sts_psi_1_b1, &hf_nas_5gs_ul_data_sts_psi_0_b0, NULL }; static const int * psi_8_15_flags[] = { &hf_nas_5gs_ul_data_sts_psi_15_b7, &hf_nas_5gs_ul_data_sts_psi_14_b6, &hf_nas_5gs_ul_data_sts_psi_13_b5, &hf_nas_5gs_ul_data_sts_psi_12_b4, &hf_nas_5gs_ul_data_sts_psi_11_b3, &hf_nas_5gs_ul_data_sts_psi_10_b2, &hf_nas_5gs_ul_data_sts_psi_9_b1, &hf_nas_5gs_ul_data_sts_psi_8_b0, NULL }; curr_offset = offset; proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, psi_0_7_flags, ENC_BIG_ENDIAN); curr_offset++; proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, psi_8_15_flags, ENC_BIG_ENDIAN); curr_offset++; EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_nas_5gs_extraneous_data); return (curr_offset - offset); } /* * 9.11.4 5GS session management (5GSM) information elements */ /* * 9.11.4.1 5GSM capability */ static guint16 de_nas_5gs_sm_5gsm_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_spare_b7, &hf_nas_5gs_spare_b6, &hf_nas_5gs_spare_b5, &hf_nas_5gs_spare_b4, &hf_nas_5gs_spare_b3, &hf_nas_5gs_spare_b2, &hf_nas_5gs_spare_b1, &hf_nas_5gs_sm_rqos_b0, NULL }; proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return 1; } /* * 9.11.4.2 5GSM cause */ const value_string nas_5gs_sm_cause_vals[] = { { 0x1a, "Insufficient resources" }, { 0x1b, "Missing or unknown DNN" }, { 0x1c, "Unknown PDU session type" }, { 0x1d, "User authentication or authorization failed" }, { 0x1f, "Request rejected, unspecified" }, { 0x22, "Service option temporarily out of order" }, { 0x23, "PTI already in use" }, { 0x24, "Regular deactivation" }, { 0x27, "Reactivation requested" }, { 0x2b, "Invalid PDU session identity" }, { 0x2c, "Semantic errors in packet filter(s)" }, { 0x2d, "Syntactical error in packet filter(s)" }, { 0x2e, "Out of LADN service area" }, { 0x2f, "PTI mismatch" }, { 0x32, "PDU session type Ipv4 only allowed" }, { 0x33, "PDU session type Ipv6 only allowed" }, { 0x36, "PDU session does not exist" }, { 0x43, "Insufficient resources for specific slice and DNN" }, { 0x44, "Not supported SSC mode" }, { 0x45, "Insufficient resources for specific slice" }, { 0x46, "Missing or unknown DNN in a slice" }, { 0x51, "Invalid PTI value" }, { 0x52, "Maximum data rate per UE for user-plane integrity protection is too low" }, { 0x53, "Semantic error in the QoS operation" }, { 0x54, "Syntactical error in the QoS operation" }, { 0x55, "Invalid mapped EPS bearer identity" }, { 0x5f, "Semantically incorrect message" }, { 0x60, "Invalid mandatory information" }, { 0x61, "Message type non - existent or not implemented" }, { 0x62, "Message type not compatible with the protocol state" }, { 0x63, "Information element non - existent or not implemented" }, { 0x64, "Conditional IE error" }, { 0x65, "Message not compatible with the protocol state" }, { 0x6f, "Protocol error, unspecified" }, { 0, NULL } }; static guint16 de_nas_5gs_sm_5gsm_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 cause; proto_tree_add_item_ret_uint(tree, hf_nas_5gs_sm_5gsm_cause, tvb, offset, 1, ENC_BIG_ENDIAN, &cause); col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)", val_to_str_const(cause, nas_5gs_sm_cause_vals, "Unknown")); return 1; } /* * 9.11.4.3 Always-on PDU session indication */ static guint16 de_nas_5gs_sm_always_on_pdu_ses_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* * 9.11.4.4 Always-on PDU session requested */ static guint16 de_nas_5gs_sm_always_on_pdu_ses_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* * 9.11.4.5 Allowed SSC mode */ static guint16 de_nas_5gs_sm_5gsm_allowed_ssc_mode(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_spare_b3, &hf_nas_5gs_sm_all_ssc_mode_b2, &hf_nas_5gs_sm_all_ssc_mode_b1, &hf_nas_5gs_sm_all_ssc_mode_b0, NULL }; proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN); return 1; } /* * 9.11.4.6 Extended protocol configuration options */ /* See subclause 10.5.6.3A in 3GPP TS 24.008 */ /* * 9.11.4.7 Integrity protection maximum data rate */ static const value_string nas_5gs_sm_int_prot_max_data_rate_vals[] = { { 0x0, "64 kbps" }, { 0xff, "Full data rate" }, { 0, NULL } }; static guint16 de_nas_5gs_sm_int_prot_max_data_rte(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { /* Maximum data rate per UE for user-plane integrity protection for uplink */ proto_tree_add_item(tree, hf_nas_5gs_sm_int_prot_max_data_rate_ul, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; /* Maximum data rate per UE for user-plane integrity protection for downlink */ proto_tree_add_item(tree, hf_nas_5gs_sm_int_prot_max_data_rate_dl, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; return 2; } /* * 9.11.4.8 Mapped EPS bearer contexts */ static const value_string nas_5gs_sm_mapd_eps_b_cont_opt_code_vals[] = { { 0x0, "Reserved" }, { 0x01, "Create new EPS bearer" }, { 0x02, "Delete existing EPS bearer" }, { 0x03, "Modify existing EPS bearer" }, { 0, NULL } }; static const value_string nas_5gs_sm_mapd_eps_b_cont_DEB_vals[] = { { 0x0, "the EPS bearer is not the default EPS bearer." }, { 0x01, "the EPS bearer is the default EPS bearer" }, { 0, NULL } }; static const value_string nas_5gs_sm_mapd_eps_b_cont_E_vals[] = { { 0x0, "parameters list is not included" }, { 0x01, "parameters list is included" }, { 0, NULL } }; static const value_string nas_5gs_sm_mapd_eps_b_cont_E_Modify_vals[] = { { 0x0, "previously provided parameters list extension" }, { 0x01, "previously provided parameters list replacement" }, { 0, NULL } }; static const value_string nas_5gs_sm_mapd_eps_b_cont_param_id_vals[] = { { 0x01, "Mapped EPS QoS parameters" }, { 0x02, "Mapped extended EPS QoS parameters" }, { 0x03, "Traffic flow template" }, { 0x04, "APN-AMBR" }, { 0x05, "extended APN-AMBR" }, { 0, NULL } }; static guint16 de_nas_5gs_sm_mapped_eps_b_cont(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 * sub_tree, *sub_tree1; guint32 num_cont, length, opt_code, num_eps_parms, param_id; proto_item * item; guint i, curr_len; curr_len = len; curr_offset = offset; num_cont = 1; static const int * mapd_eps_b_cont_flags[] = { &hf_nas_5gs_sm_mapd_eps_b_cont_opt_code, &hf_nas_5gs_sm_mapd_eps_b_cont_DEB, &hf_nas_5gs_sm_mapd_eps_b_cont_E, &hf_nas_5gs_sm_mapd_eps_b_cont_num_eps_parms, NULL }; static const int * mapd_eps_b_cont_flags_modify[] = { &hf_nas_5gs_sm_mapd_eps_b_cont_opt_code, &hf_nas_5gs_sm_mapd_eps_b_cont_DEB, &hf_nas_5gs_sm_mapd_eps_b_cont_E_mod, &hf_nas_5gs_sm_mapd_eps_b_cont_num_eps_parms, NULL }; /* The IE contains a number of Mapped EPS bearer context */ while ((curr_offset - offset) < len) { /* Figure 9.11.4.5.2: Mapped EPS bearer context */ sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, ett_nas_5gs_sm_mapd_eps_b_cont, &item, "Mapped EPS bearer context %u", num_cont); /* EPS bearer identity */ proto_tree_add_item(sub_tree, hf_nas_5gs_sm_mapd_eps_b_cont_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; curr_len--; /* Length of Mapped EPS bearer context*/ proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_sm_length, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &length); curr_offset += 2; curr_len -= 2; /* 8 7 6 5 4 3 2 1 */ /* operation code | DEB | E | number of EPS params */ proto_item_set_len(item, length + 3); num_eps_parms = tvb_get_guint8(tvb, curr_offset); opt_code = num_eps_parms & 0xc0; num_eps_parms = num_eps_parms & 0x0f; /* operation code = 3 Modify existing EPS bearer */ if (opt_code == 3) { proto_tree_add_bitmask_list(sub_tree, tvb, curr_offset, 1, mapd_eps_b_cont_flags_modify, ENC_BIG_ENDIAN); } else { proto_tree_add_bitmask_list(sub_tree, tvb, curr_offset, 1, mapd_eps_b_cont_flags, ENC_BIG_ENDIAN); } curr_offset++; curr_len--; i = 1; /* EPS parameters list */ while (num_eps_parms > 0) { sub_tree1 = proto_tree_add_subtree_format(sub_tree, tvb, curr_offset, -1, ett_nas_5gs_sm_mapd_eps_b_cont_params_list, &item, "EPS parameter %u", i); /* EPS parameter identifier */ proto_tree_add_item_ret_uint(sub_tree1, hf_nas_5gs_sm_mapd_eps_b_cont_param_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN, ¶m_id); proto_item_append_text(item, " - %s", val_to_str_const(param_id, nas_5gs_sm_mapd_eps_b_cont_param_id_vals, "Unknown")); curr_offset++; curr_len--; /*length of the EPS parameter contents field */ proto_tree_add_item_ret_uint(sub_tree1, hf_nas_5gs_sm_length, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &length); curr_offset++; curr_len--; proto_item_set_len(item, length + 3); /*content of the EPS parameter contents field */ switch (param_id) { case 1: /* 01H (Mapped EPS QoS parameters) */ de_esm_qos(tvb, sub_tree1, pinfo, curr_offset, length, NULL, 0); break; case 2: /* 02H (Mapped extended EPS QoS parameters) */ de_esm_ext_eps_qos(tvb, sub_tree1, pinfo, curr_offset, length, NULL, 0); break; case 3: /* 03H (Traffic flow template)*/ de_sm_tflow_temp(tvb, sub_tree1, pinfo, curr_offset, length, NULL, 0); break; case 4: /* 04H (APN-AMBR) */ de_esm_apn_aggr_max_br(tvb, sub_tree1, pinfo, curr_offset, length, NULL, 0); break; case 5: /* 05H (extended APN-AMBR). */ de_esm_ext_apn_agr_max_br(tvb, sub_tree1, pinfo, curr_offset, length, NULL, 0); break; default: proto_tree_add_item(sub_tree1, hf_nas_5gs_sm_mapd_eps_b_cont_eps_param_cont, tvb, curr_offset, length, ENC_NA); break; } curr_offset +=length; curr_len -= length; i++; num_eps_parms--; } num_cont++; } return len; } /* * 9.11.4.9 Maximum number of supported packet filters */ static guint16 de_nas_5gs_sm_max_num_sup_pkt_flt(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { static const int * flags[] = { &hf_nas_5gs_sm_max_nb_sup_pkt_flt_nb, &hf_nas_5gs_sm_max_nb_sup_pkt_flt_spare, NULL }; proto_tree_add_bitmask_list(tree, tvb, offset, 2, flags, ENC_BIG_ENDIAN); return 2; } /* * 9.11.4.10 PDU address */ static const value_string nas_5gs_sm_pdu_ses_type_vals[] = { { 0x1, "IPv4" }, { 0x2, "IPv6" }, { 0x3, "IPv4v6" }, { 0, NULL } }; static guint16 de_nas_5gs_sm_pdu_address(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_item *ti; guint32 value; /* 0 Spare 0 Spare 0 Spare 0 Spare PDU session type value */ ti = proto_tree_add_item_ret_uint(tree, hf_nas_5gs_sm_pdu_ses_type, tvb, offset, 1, ENC_BIG_ENDIAN, &value); offset++; /* PDU address information */ switch (value) { case 1: /* IPv4 */ proto_tree_add_item(tree, hf_nas_5gs_sm_pdu_addr_inf_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN); break; case 2: /* If the PDU session type value indicates IPv6, the PDU address information in octet 4 to octet 11 * contains an interface identifier for the IPv6 link local address. */ proto_tree_add_item(tree, hf_nas_5gs_sm_pdu_addr_inf_ipv6, tvb, offset, 8, ENC_NA); break; case 3: /* If the PDU session type value indicates IPv4v6, the PDU address information in octet 4 to octet 11 * contains an interface identifier for the IPv6 link local address and in octet 12 to octet 15 * contains an IPv4 address. */ proto_tree_add_item(tree, hf_nas_5gs_sm_pdu_addr_inf_ipv6, tvb, offset, 8, ENC_NA); offset += 8; proto_tree_add_item(tree, hf_nas_5gs_sm_pdu_addr_inf_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN); break; default: expert_add_info(pinfo, ti, &ei_nas_5gs_unknown_value); break; } return len; } /* * 9.11.4.11 PDU session type */ static const value_string nas_5gs_pdu_session_type_values[] = { { 0x1, "IPv4" }, { 0x2, "Ipv6" }, { 0x3, "Ipv4v6" }, { 0x4, "Unstructured" }, { 0x5, "Ethernet" }, { 0, NULL } }; static guint16 de_nas_5gs_sm_pdu_session_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_item(tree, hf_nas_5gs_sm_pdu_session_type, tvb, offset, 1, ENC_BIG_ENDIAN); return 1; } /* * 9.11.4.12 QoS flow descriptions */ static const value_string nas_5gs_sm_qos_des_flow_opt_code_vals[] = { { 0x00, "Reserved" }, { 0x01, "Create new QoS flow description" }, { 0x02, "Delete existing QoS flow description" }, { 0x03, "Modify existing QoS flow description" }, { 0, NULL } }; static const value_string nas_5gs_sm_param_id_values[] = { { 0x01, "5QI" }, { 0x02, "GFBR uplink" }, { 0x03, "GFBR downlink" }, { 0x04, "MFBR uplink" }, { 0x05, "MFBR downlink" }, { 0x06, "Averaging window" }, { 0x07, "EPS bearer identity" }, { 0, NULL } }; guint16 de_nas_5gs_sm_qos_flow_des(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree *sub_tree, *sub_tree2; proto_item *item; int i = 1, j = 1; guint32 param_len, param_id; guint32 curr_offset, start_offset; guint8 num_param; guint32 unit, mult, ambr_val; const char *unit_str; static const int * param_flags[] = { &hf_nas_5gs_sm_e, &hf_nas_5gs_sm_nof_params, NULL }; curr_offset = offset; while ((curr_offset - offset) < len) { /* QoS fow description */ sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, ett_nas_5gs_sm_qos_params, &item, "QoS flow description %u", i); /* 0 0 QFI */ proto_tree_add_item(sub_tree, hf_nas_5gs_sm_qfi, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset += 1; /* Operation code */ proto_tree_add_item(sub_tree, hf_nas_5gs_sm_qos_des_flow_opt_code, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; /* 0 Spare E Number of parameters */ j = 1; num_param = tvb_get_guint8(tvb, curr_offset); num_param = num_param & 0x3f; proto_tree_add_bitmask_list(sub_tree, tvb, curr_offset, 1, param_flags, ENC_BIG_ENDIAN); curr_offset++; while (num_param > 0) { /* Parameter list */ sub_tree2 = proto_tree_add_subtree_format(sub_tree, tvb, curr_offset, -1, ett_nas_5gs_sm_qos_rules, &item, "Parameter %u", j); start_offset = curr_offset; /* Parameter identifier */ proto_tree_add_item_ret_uint(sub_tree2, hf_nas_5gs_sm_param_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN, ¶m_id); proto_item_append_text(item, " - %s", val_to_str_const(param_id, nas_5gs_sm_param_id_values, "Unknown")); curr_offset++; /* Length of parameter contents */ proto_tree_add_item_ret_uint(sub_tree2, hf_nas_5gs_sm_param_len, tvb, curr_offset, 1, ENC_BIG_ENDIAN, ¶m_len); curr_offset++; /*parameter content*/ switch (param_id) { /* 01H (5QI)*/ case 0x01: proto_tree_add_item(sub_tree2, hf_nas_5gs_sm_pal_cont, tvb, curr_offset, param_len, ENC_BIG_ENDIAN); curr_offset += param_len; break; /* 02H (GFBR uplink); 04H (MFBR uplink);*/ case 0x02: case 0x04: /* Unit for Session-AMBR for uplink */ proto_tree_add_item_ret_uint(sub_tree2, hf_nas_5gs_sm_unit_for_session_ambr_ul, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &unit); curr_offset++; /* Session-AMBR for downlink */ mult = get_ext_ambr_unit(unit, &unit_str); ambr_val = tvb_get_ntohs(tvb, curr_offset); proto_tree_add_uint_format_value(sub_tree2, hf_nas_5gs_sm_session_ambr_ul, tvb, curr_offset, param_len - 1, ambr_val, "%u %s (%u)", ambr_val * mult, unit_str, ambr_val); curr_offset += (param_len - 1); break; /* 03H (GFBR downlink); 05H (MFBR downlink);*/ case 0x03: case 0x05: /* Unit for Session-AMBR for uplink */ proto_tree_add_item_ret_uint(sub_tree2, hf_nas_5gs_sm_unit_for_session_ambr_dl, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &unit); curr_offset++; /* Session-AMBR for downlink*/ mult = get_ext_ambr_unit(unit, &unit_str); ambr_val = tvb_get_ntohs(tvb, curr_offset); proto_tree_add_uint_format_value(sub_tree2, hf_nas_5gs_sm_session_ambr_dl, tvb, curr_offset, param_len - 1, ambr_val, "%u %s (%u)", ambr_val * mult, unit_str, ambr_val); curr_offset += (param_len - 1); break; default: proto_tree_add_item(sub_tree2, hf_nas_5gs_sm_pal_cont, tvb, curr_offset, param_len, ENC_BIG_ENDIAN); curr_offset += param_len; break; } num_param--; j++; proto_item_set_len(item, curr_offset - start_offset); } i++; } return len; } /* * 9.11.4.13 QoS rules */ static true_false_string tfs_nas_5gs_sm_dqr = { "The QoS rule is the default QoS rule", "The QoS rule is not the default QoS rule" }; static const value_string nas_5gs_rule_operation_code_values[] = { { 0x0, "Reserved" }, { 0x1, "Create new QoS rule" }, { 0x2, "Delete existing QoS rule" }, { 0x3, "Modify existing QoS rule and add packet filters" }, { 0x4, "Modify existing QoS rule and replace packet filters" }, { 0x5, "Modify existing QoS rule and delete packet filters" }, { 0x6, "Modify existing QoS rule without modifying packet filters" }, { 0x7, "Reserved" }, { 0, NULL } }; static const value_string nas_5gs_sm_pf_type_values[] = { { 0x01, "Match-all type" }, { 0x10, "IPv4 remote address type" }, { 0x11, "IPv4 local address type" }, { 0x21, "IPv6 remote address/prefix length type" }, { 0x23, "IPv6 local address/prefix length type" }, { 0x30, "Protocol identifier/Next header type" }, { 0x40, "Single local port type" }, { 0x41, "Local port range type" }, { 0x50, "Single remote port type" }, { 0x51, "Remote port range type" }, { 0x60, "Security parameter index type" }, { 0x70, "Type of service/Traffic class type" }, { 0x80, "Flow label type" }, { 0x81, "Destination MAC address type" }, { 0x82, "Source MAC address type" }, { 0x83, "802.1Q C-TAG VID type" }, { 0x84, "802.1Q S-TAG VID type" }, { 0x85, "802.1Q C-TAG PCP/DEI type" }, { 0x86, "802.1Q S-TAG PCP/DEI type" }, { 0x87, "Ethertype type" }, { 0, NULL } }; static const value_string nas_5gs_sm_pkt_flt_dir_values[] = { { 0x00, "Reserved" }, { 0x01, "Downlink only" }, { 0x02, "Uplink only" }, { 0x03, "Bidirectional" }, { 0, NULL } }; static const value_string nas_5gs_rule_param_cont[] = { { 0x0, "Reserved" }, { 0x01, "5QI 1" }, { 0x02, "5QI 2" }, { 0x03, "5QI 3" }, { 0x04, "5QI 4" }, { 0x05, "5QI 5" }, { 0x06, "5QI 6" }, { 0x07, "5QI 7" }, { 0x08, "5QI 8" }, { 0x09, "5QI 9" }, { 0, NULL } }; guint16 de_nas_5gs_sm_qos_rules(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree *sub_tree, *sub_tree2, *sub_tree3; proto_item *item, *item2; int i = 1, j, k = 1; guint32 qos_rule_id, pf_len, pf_type, pfc_len; guint32 length, curr_offset, start_offset; guint8 num_pkt_flt, rop; static const int * pkt_flt_flags[] = { &hf_nas_5gs_sm_rop, &hf_nas_5gs_sm_dqr, &hf_nas_5gs_sm_nof_pkt_filters, NULL }; curr_offset = offset; while ((curr_offset - offset) < len) { /* QoS Rule */ sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, ett_nas_5gs_sm_qos_rules, &item, "QoS rule %u", i); /* QoS rule identifier Octet 4*/ proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_sm_qos_rule_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &qos_rule_id); curr_offset += 1; /* Length of QoS rule Octet 5 - 6*/ proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_sm_length, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &length); curr_offset += 2; proto_item_set_len(item, length + 3); /* Rule operation code DQR bit Number of packet filters */ num_pkt_flt = tvb_get_guint8(tvb, curr_offset); rop = num_pkt_flt >> 5; num_pkt_flt = num_pkt_flt & 0x0f; proto_tree_add_bitmask_list(sub_tree, tvb, curr_offset, 1, pkt_flt_flags, ENC_BIG_ENDIAN); curr_offset++; /* For the "delete existing QoS rule" operation and for the "modify existing QoS rule without modifying packet filters" * operation, the number of packet filters shall be coded as 0. */ if ((rop == 0) || (rop == 7)) { /* Reserved */ proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_unknown_value, tvb, curr_offset, length - 1); i++; curr_offset += (length - 1); continue; } if ((rop == 2) || (rop == 6)) { if (num_pkt_flt != 0) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_num_pkt_flt, tvb, curr_offset, length - 1); i++; curr_offset += (length - 1); continue; } } /* Packet filter list */ j = 1; while (num_pkt_flt > 0) { sub_tree2 = proto_tree_add_subtree_format(sub_tree, tvb, curr_offset, -1, ett_nas_5gs_sm_qos_rules, &item, "Packet filter %u", j); start_offset = curr_offset; if (rop == 5) { /* modify existing QoS rule and delete packet filters */ /* 0 0 0 0 Packet filter identifier x*/ proto_tree_add_item(sub_tree2, hf_nas_5gs_sm_pkt_flt_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; } else { /* "create new QoS rule", or "modify existing QoS rule and add packet filters" * or "modify existing QoS rule and replace packet filters" */ /* 0 0 Packet filter direction 1 Packet filter identifier 1*/ proto_tree_add_item(sub_tree2, hf_nas_5gs_sm_pkt_flt_dir, tvb, curr_offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(sub_tree2, hf_nas_5gs_sm_pkt_flt_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; /* Length of packet filter contents */ proto_tree_add_item_ret_uint(sub_tree2, hf_nas_5gs_sm_pf_len, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &pf_len); curr_offset++; k = 1; /* Packet filter contents */ while (pf_len > 0) { sub_tree3 = proto_tree_add_subtree_format(sub_tree2, tvb, curr_offset, -1, ett_nas_5gs_sm_pkt_filter_components, &item2, "Packet filter component %u", k); /* Each packet filter component shall be encoded as a sequence of a one octet packet filter component type identifier * and a fixed length packet filter component value field. * The packet filter component type identifier shall be transmitted first. */ proto_tree_add_item_ret_uint(sub_tree3, hf_nas_5gs_sm_pf_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &pf_type); curr_offset++; /* Packet filter length contains the length of component type and content */ pf_len--; switch (pf_type) { case 1: /* Match-all type * . If the "match-all type" packet filter component is present in the packet filter, no other packet filter * component shall be present in the packet filter and the length of the packet filter contents field shall * be set to one. */ pfc_len = 0; break; case 16: /* For "IPv4 remote address type", the packet filter component value field shall be encoded as a sequence * of a four octet IPv4 address field and a four octet IPv4 address mask field. * The IPv4 address field shall be transmitted first. */ case 17: /* For "IPv4 local address type", the packet filter component value field shall be encoded as defined * for "IPv4 remote address type" */ proto_tree_add_item(sub_tree3, hf_nas_5gs_sm_pdu_addr_inf_ipv4, tvb, curr_offset, 4, ENC_BIG_ENDIAN); curr_offset += 4; proto_tree_add_item(sub_tree3, hf_nas_5gs_addr_mask_ipv4, tvb, curr_offset, 4, ENC_BIG_ENDIAN); curr_offset += 4; pfc_len = 8; break; case 48: proto_tree_add_item(sub_tree3, hf_nas_5gs_protocol_identifier_or_next_hd, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; pfc_len = 1; break; case 64: /* Single local port type */ proto_tree_add_item(sub_tree3, hf_nas_5gs_single_port_type, tvb, curr_offset, 2, ENC_BIG_ENDIAN); curr_offset += 2; pfc_len = 2; break; case 80: /* Single remote port type */ proto_tree_add_item(sub_tree3, hf_nas_5gs_single_port_type, tvb, curr_offset, 2, ENC_BIG_ENDIAN); curr_offset += 2; pfc_len = 2; break; default: proto_tree_add_expert(sub_tree3, pinfo, &ei_nas_5gs_not_diss, tvb, curr_offset, pf_len); curr_offset += pf_len; pfc_len = pf_len; break; } pf_len -= pfc_len; k++; proto_item_set_len(item2, pfc_len + 1); } } num_pkt_flt--; j++; proto_item_set_len(item, curr_offset - start_offset); } /* QoS rule precedence (octet z+1) * For the "delete existing QoS rule" operation, the QoS rule precedence value field shall not be included. * For the "create new QoS rule" operation, the QoS rule precedence value field shall be included. */ if (rop != 2) { /* Delete existing QoS rule */ proto_tree_add_item(sub_tree, hf_nas_5gs_sm_qos_rule_precedence, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; } /* QoS flow identifier (QFI) (bits 6 to 1 of octet z+2) * For the "delete existing QoS rule" operation, the QoS flow identifier value field shall not be included. * For the "create new QoS rule" operation, the QoS flow identifier value field shall be included. */ /* Segregation bit (bit 7 of octet z+2) */ proto_tree_add_item(sub_tree, hf_nas_5gs_sm_qfi, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset += 1; i++; } return len; } /* * 9.11.4.14 Session-AMBR */ static const value_string nas_5gs_sm_unit_for_session_ambr_values[] = { { 0x00, "value is not used" }, { 0x01, "value is incremented in multiples of 1 Kbps" }, { 0x02, "value is incremented in multiples of 4 Kbps" }, { 0x03, "value is incremented in multiples of 16 Kbps" }, { 0x04, "value is incremented in multiples of 64 Kbps" }, { 0x05, "value is incremented in multiples of 256 kbps" }, { 0x06, "value is incremented in multiples of 1 Mbps" }, { 0x07, "value is incremented in multiples of 4 Mbps" }, { 0x08, "value is incremented in multiples of 16 Mbps" }, { 0x09, "value is incremented in multiples of 64 Mbps" }, { 0x0a, "value is incremented in multiples of 256 Mbps" }, { 0x0b, "value is incremented in multiples of 1 Gbps" }, { 0x0c, "value is incremented in multiples of 4 Gbps" }, { 0x0d, "value is incremented in multiples of 16 Gbps" }, { 0x0e, "value is incremented in multiples of 64 Gbps" }, { 0x0f, "value is incremented in multiples of 256 Gbps" }, { 0x10, "value is incremented in multiples of 1 Tbps" }, { 0x11, "value is incremented in multiples of 4 Tbps" }, { 0x12, "value is incremented in multiples of 16 Tbps" }, { 0x13, "value is incremented in multiples of 64 Tbps" }, { 0x14, "value is incremented in multiples of 256 Tbps" }, { 0x15, "value is incremented in multiples of 1 Pbps" }, { 0x16, "value is incremented in multiples of 4 Pbps" }, { 0x17, "value is incremented in multiples of 16 Pbps" }, { 0x18, "value is incremented in multiples of 64 Pbps" }, { 0x19, "value is incremented in multiples of 256 Pbps" }, { 0, NULL } }; guint16 de_nas_5gs_sm_session_ambr(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { guint32 unit, mult, ambr_val; const char *unit_str; /* Unit for Session-AMBR for downlink */ proto_tree_add_item_ret_uint(tree, hf_nas_5gs_sm_unit_for_session_ambr_dl, tvb, offset, 1, ENC_BIG_ENDIAN, &unit); offset++; /* Session-AMBR for downlink (octets 4 and 5) */ mult = get_ext_ambr_unit(unit, &unit_str); ambr_val = tvb_get_ntohs(tvb, offset); proto_tree_add_uint_format_value(tree, hf_nas_5gs_sm_session_ambr_dl, tvb, offset, 2, ambr_val, "%u %s (%u)", ambr_val * mult, unit_str, ambr_val); offset += 2; proto_tree_add_item_ret_uint(tree, hf_nas_5gs_sm_unit_for_session_ambr_ul, tvb, offset, 1, ENC_NA, &unit); offset++; mult = get_ext_ambr_unit(unit, &unit_str); ambr_val = tvb_get_ntohs(tvb, offset); proto_tree_add_uint_format_value(tree, hf_nas_5gs_sm_session_ambr_ul, tvb, offset, 2, ambr_val, "%u %s (%u)", ambr_val * mult, unit_str, ambr_val); return len; } /* * 9.11.4.15 SM PDU DN request container */ /* The SM PDU DN request container contains a DN-specific identity of the UE in the network access identifier (NAI) format */ static guint16 de_nas_5gs_sm_pdu_dn_req_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* * 9.11.4.16 SSC mode */ static const value_string nas_5gs_sc_mode_values[] = { { 0x1, "SSC mode 1" }, { 0x2, "SSC mode 2" }, { 0x3, "SSC mode 3" }, { 0, NULL } }; static guint16 de_nas_5gs_sm_ssc_mode(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_nas_5gs_sm_sc_mode, tvb, offset, 1, ENC_BIG_ENDIAN); return 1; } /* * 9.10.2 Common information elements */ /* 9.10.2.1 Additional information*/ static guint16 de_nas_5gs_cmn_add_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* * 9.11.2.1A DNN */ static guint16 de_nas_5gs_cmn_dnn(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; guint8 *str; proto_item *pi; curr_offset = offset; /* A DNN value field contains an APN as defined in 3GPP TS 23.003 */ str = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, len, ENC_ASCII | ENC_NA); curr_len = 0; while (curr_len < len) { guint step = str[curr_len]; str[curr_len] = '.'; curr_len += step + 1; } /* Highlight bytes including the first length byte */ pi = proto_tree_add_string(tree, hf_nas_5gs_cmn_dnn, tvb, curr_offset, len, str + 1); if (len > 100) { expert_add_info(pinfo, pi, &ei_nas_5gs_dnn_too_long); } curr_offset += len; EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_nas_5gs_extraneous_data); return (curr_offset - offset); } /* 9.10.2.2 EAP message*/ static guint16 de_nas_5gs_cmn_eap_msg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { /* EAP message as specified in IETF RFC 3748 */ if (eap_handle) { col_append_str(pinfo->cinfo, COL_PROTOCOL, "/"); col_set_fence(pinfo->cinfo, COL_PROTOCOL); call_dissector(eap_handle, tvb_new_subset_length(tvb, offset, len), pinfo, tree); } return len; } /* 9.10.2.3 GPRS timer */ /* See subclause 10.5.7.3 in 3GPP TS 24.008 */ /* 9.10.2.4 GPRS timer 2*/ /* See subclause 10.5.7.4 in 3GPP TS 24.008 */ /* 9.10.2.5 GPRS timer 3*/ /* 9.11.2.6 Intra N1 mode NAS transparent container*/ static guint16 de_nas_5gs_cmn_intra_n1_mode_nas_trans_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* 9.10.2.7 N1 mode to S1 mode NAS transparent containe */ static guint16 de_nas_5gs_cmn_n1_to_s1_mode_trans_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* 9.10.2.8 S-NSSAI */ guint16 de_nas_5gs_cmn_s_nssai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { /* SST octet 3 * This field contains the 8 bit SST value. The coding of the SST value part is defined in 3GPP TS 23.003 */ proto_tree_add_item(tree, hf_nas_5gs_mm_sst, tvb, offset, 1, ENC_BIG_ENDIAN); if (len == 1) { return len; } offset += 1; /* SD octet 4 - octet 6* */ proto_tree_add_item(tree, hf_nas_5gs_mm_sd, tvb, offset, 3, ENC_BIG_ENDIAN); if (len == 4) { return len; } offset += 3; /* Mapped configured SST octet 7* */ proto_tree_add_item(tree, hf_nas_5gs_mm_mapped_conf_sst, tvb, offset, 1, ENC_BIG_ENDIAN); if (len == 5) { return len; } offset += 1; /* Mapped configured SD octet 8 - octet 10* */ proto_tree_add_item(tree, hf_nas_5gs_mm_mapped_conf_ssd, tvb, offset, 3, ENC_BIG_ENDIAN); return len; } /* 9.10.2.9 S1 mode to N1 mode NAS transparent container */ static guint16 de_nas_5gs_cmn_s1_to_n1_mode_trans_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* * Note this enum must be of the same size as the element decoding list */ typedef enum { DE_NAS_5GS_CMN_ADD_INF, /* 9.10.2.1 Additional information*/ DE_NAS_5GS_CMN_DNN, /* 9.10.2.1A DNN*/ DE_NAS_5GS_CMN_EAP_MESSAGE, /* 9.10.2.2 EAP message*/ DE_NAS_5GS_CMN_GPRS_TIMER, /* 9.10.2.3 GPRS timer */ DE_NAS_5GS_CMN_GPRS_TIMER2, /* 9.10.2.4 GPRS timer 2*/ DE_NAS_5GS_CMN_GPRS_TIMER3, /* 9.10.2.5 GPRS timer 3*/ DE_NAS_5GS_CMN_INTRA_N1_MODE_NAS_TRANS_CONT, /* 9.11.2.6 Intra N1 mode NAS transparent container*/ DE_NAS_5GS_CMN_N1_TO_S1_MODE_TRANS_CONT, /* 9.10.2.7 N1 mode to S1 mode NAS transparent containe */ DE_NAS_5GS_CMN_S_NSSAI, /* 9.10.2.8 S-NSSAI */ DE_NAS_5GS_CMN_S1_TO_N1_MODE_TRANS_CONT, /* 9.10.2.9 S1 mode to N1 mode NAS transparent container */ DE_NAS_5GS_COMMON_NONE /* NONE */ } nas_5gs_common_elem_idx_t; static const value_string nas_5gs_common_elem_strings[] = { { DE_NAS_5GS_CMN_ADD_INF, "Additional information" }, /* 9.10.2.1 Additional information*/ { DE_NAS_5GS_CMN_DNN, "DNN" }, /* 9.10.2.1A DNN*/ { DE_NAS_5GS_CMN_EAP_MESSAGE, "EAP message" }, /* 9.10.2.2 EAP message*/ { DE_NAS_5GS_CMN_GPRS_TIMER, "GPRS timer" }, /* 9.10.2.3 GPRS timer*/ { DE_NAS_5GS_CMN_GPRS_TIMER2, "GPRS timer 2" }, /* 9.10.2.4 GPRS timer 2*/ { DE_NAS_5GS_CMN_GPRS_TIMER3, "GPRS timer 3" }, /* 9.10.2.5 GPRS timer 3*/ { DE_NAS_5GS_CMN_INTRA_N1_MODE_NAS_TRANS_CONT, "Intra N1 mode NAS transparent container" }, /* 9.11.2.6 Intra N1 mode NAS transparent container*/ { DE_NAS_5GS_CMN_N1_TO_S1_MODE_TRANS_CONT, "N1 mode to S1 mode NAS transparent container" }, /* 9.10.2.7 N1 mode to S1 mode NAS transparent container */ { DE_NAS_5GS_CMN_S_NSSAI, "S-NSSAI" }, /* 9.10.2.8 S-NSSAI */ { DE_NAS_5GS_CMN_S1_TO_N1_MODE_TRANS_CONT, "S1 mode to N1 mode NAS transparent container" }, /* 9.10.2.9 S1 mode to N1 mode NAS transparent container */ { 0, NULL } }; value_string_ext nas_5gs_common_elem_strings_ext = VALUE_STRING_EXT_INIT(nas_5gs_common_elem_strings); #define NUM_NAS_5GS_COMMON_ELEM (sizeof(nas_5gs_common_elem_strings)/sizeof(value_string)) gint ett_nas_5gs_common_elem[NUM_NAS_5GS_COMMON_ELEM]; guint16(*nas_5gs_common_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len) = { /* 9.10.2 Common information elements */ de_nas_5gs_cmn_add_inf, /* 9.10.2.1 Additional information*/ de_nas_5gs_cmn_dnn, /* 9.10.2.1A DNN*/ de_nas_5gs_cmn_eap_msg, /* 9.10.2.2 EAP message*/ NULL, /* 9.10.2.3 GPRS timer*/ NULL, /* 9.10.2.4 GPRS timer 2*/ NULL, /* 9.10.2.5 GPRS timer 3*/ de_nas_5gs_cmn_intra_n1_mode_nas_trans_cont, /* 9.11.2.6 Intra N1 mode NAS transparent container*/ de_nas_5gs_cmn_n1_to_s1_mode_trans_cont, /* 9.10.2.7 N1 mode to S1 mode NAS transparent containe */ de_nas_5gs_cmn_s_nssai, /* 9.10.2.8 S-NSSAI */ de_nas_5gs_cmn_s1_to_n1_mode_trans_cont, /* 9.10.2.9 S1 mode to N1 mode NAS transparent container */ NULL, /* NONE */ }; /* * 9.11.3 5GS mobility management (5GMM) information elements */ #if 0 typedef enum { DE_NAS_5GS_MM_5GMM_CAP, /* 9.11.3.1 5GMM capability*/ DE_NAS_5GS_MM_5GMM_CAUSE, /* 9.11.3.2 5GMM cause*/ DE_NAS_5GS_MM_5GS_DRX_PARAM, /* 9.11.3.2A 5GS DRX parameters*/ DE_NAS_5GS_MM_5GS_IDENTITY_TYPE, /* 9.11.3.3 5GS identity type*/ DE_NAS_5GS_MM_5GS_MOBILE_ID, /* 9.11.3.4 5GS mobile identity*/ DE_NAS_5GS_MM_5GS_NW_FEAT_SUP, /* 9.11.3.5 5GS network feature support*/ DE_NAS_5GS_MM_5GS_REG_RES, /* 9.11.3.6 5GS registration result*/ DE_NAS_5GS_MM_5GS_REG_TYPE, /* 9.11.3.7 5GS registration type*/ DE_NAS_5GS_MM_5GS_TA_ID, /* 9.11.3.8 5GS tracking area identity */ DE_NAS_5GS_MM_5GS_TA_ID_LIST, /* 9.11.3.9 5GS tracking area identity list */ DE_NAS_5GS_MM_UPDATE_TYPE, /* 9.11.3.9A 5GS update type */ DE_NAS_5GS_MM_ABBA, /* 9.11.3.10 ABBA */ DE_NAS_5GS_MM_ACCESS_TYPE, /* 9.11.3.11 Access type */ DE_NAS_5GS_MM_ADD_5G_SEC_INF, /* 9.11.3.12 Additional 5G security information */ DE_NAS_5GS_MM_ALLOW_PDU_SES_STS, /* 9.11.3.13 Allowed PDU session status*/ DE_NAS_5GS_MM_AUT_FAIL_PAR, /* 9.11.3.14 Authentication failure parameter */ DE_NAS_5GS_MM_AUT_PAR_AUTN, /* 9.11.3.15 Authentication parameter AUTN*/ DE_NAS_5GS_MM_AUT_PAR_RAND, /* 9.11.3.16 Authentication parameter RAND*/ DE_NAS_5GS_MM_AUT_RESP_PAR, /* 9.11.3.17 Authentication response parameter */ DE_NAS_5GS_MM_CONF_UPD_IND, /* 9.11.3.18 Configuration update indication*/ DE_NAS_5GS_MM_DLGT_SAVING_TIME, /* 9.11.3.19 Daylight saving time*/ DE_NAS_5GS_MM_DE_REG_TYPE, /* 9.11.3.20 De-registration type*/ /* 9.11.3.21 Void */ /* 9.11.3.22 Void*/ DE_NAS_5GS_MM_EMRG_NR_LIST, /* 9.11.3.23 Emergency number list */ DE_NAS_5GS_MM_EPS_NAS_MSG_CONT, /* 9.11.3.24 EPS NAS message container */ DE_NAS_5GS_MM_EPS_NAS_SEC_ALGO, /* 9.11.3.25 EPS NAS security algorithms */ DE_NAS_5GS_MM_EXT_EMERG_NUM_LIST, /* 9.11.3.26 Extended emergency number list */ /* 9.11.3.27 Void*/ DE_NAS_5GS_MM_IMEISV_REQ, /* 9.11.3.28 IMEISV request*/ DE_NAS_5GS_MM_LADN_INDIC, /* 9.11.3.29 LADN indication*/ DE_NAS_5GS_MM_LADN_INF, /* 9.11.3.30 LADN information */ DE_NAS_5GS_MM_MICO_IND, /* 9.11.3.31 MICO indication*/ DE_NAS_5GS_MM_NAS_KEY_SET_ID, /* 9.11.3.32 NAS key set identifier*/ DE_NAS_5GS_MM_NAS_MSG_CONT, /* 9.11.3.33 NAS message container*/ DE_NAS_5GS_MM_NAS_SEC_ALGO, /* 9.11.3.34 NAS security algorithms*/ DE_NAS_5GS_MM_NW_NAME, /* 9.11.3.35 Network name*/ DE_NAS_5GS_MM_NW_SLICING_IND, /* 9.11.3.36 Network slicing indication */ DE_NAS_5GS_MM_NSSAI, /* 9.11.3.37 NSSAI*/ DE_NAS_5GS_MM_NSSAI_INC_MODE, /* 9.11.3.37A NSSAI inclusion mode */ DE_NAS_5GS_MM_OP_DEF_ACC_CAT_DEF, /* 9.11.3.38 Operator-defined access category definitions */ DE_NAS_5GS_MM_PLD_CONT, /* 9.11.3.39 Payload container*/ DE_NAS_5GS_MM_PLD_CONT_TYPE, /* 9.11.3.40 Payload container type*/ DE_NAS_5GS_MM_PDU_SES_ID_2, /* 9.11.3.41 PDU session identity 2 */ DE_NAS_5GS_MM_PDU_SES_REACT_RES, /* 9.11.3.42 PDU session reactivation result*/ DE_NAS_5GS_MM_PDU_SES_REACT_RES_ERR_C, /* 9.11.3.43 PDU session reactivation result error cause */ DE_NAS_5GS_MM_PDU_SES_STATUS, /* 9.11.3.44 PDU session status */ DE_NAS_5GS_MM_PLMN_LIST, /* 9.11.3.45 PLMN list*/ DE_NAS_5GS_MM_REJ_NSSAI, /* 9.11.3.46 Rejected NSSAI*/ DE_NAS_5GS_MM_REQ_TYPE, /* 9.11.3.47 Request type */ DE_NAS_5GS_MM_S1_UE_NW_CAP, /* 9.11.3.48 S1 UE network capability*/ DE_NAS_5GS_MM_S1_UE_SEC_CAP, /* 9.11.3.48A S1 UE security capability*/ DE_NAS_5GS_MM_SAL, /* 9.11.3.49 Service area list*/ DE_NAS_5GS_MM_SERV_TYPE, /* 9.11.3.50 Service type,*/ /* Used inline Half octet IE*/ DE_NAS_5GS_MM_SMS_IND, /* 9.11.3.50A SMS indication */ DE_NAS_5GS_MM_SOR_TRASP_CONT, /* 9.11.3.51 SOR transparent container */ DE_NAS_5GS_MM_TZ, /* 9.11.3.52 Time zone*/ DE_NAS_5GS_MM_TZ_AND_T, /* 9.11.3.53 Time zone and time*/ DE_NAS_5GS_MM_UE_PAR_UPD_TRASNSP_CONT, /* 9.11.3.53A UE parameters update transparent container */ DE_NAS_5GS_MM_UE_SEC_CAP, /* 9.11.3.54 UE security capability*/ DE_NAS_5GS_MM_UE_USAGE_SET, /* 9.11.3.55 UE's usage setting */ DE_NAS_5GS_MM_UE_STATUS, /* 9.11.3.56 UE status */ DE_NAS_5GS_MM_UL_DATA_STATUS, /* 9.11.3.57 Uplink data status */ DE_NAS_5GS_MM_NONE /* NONE */ } nas_5gs_mm_elem_idx_t; #endif static const value_string nas_5gs_mm_elem_strings[] = { { DE_NAS_5GS_MM_5GMM_CAP, "5GMM capability" }, /* 9.11.3.1 5GMM capability*/ { DE_NAS_5GS_MM_5GMM_CAUSE, "5GMM cause" }, /* 9.11.3.2 5GMM cause*/ { DE_NAS_5GS_MM_5GS_DRX_PARAM, "5GS DRX parameters" }, /* 9.11.3.2A 5GS DRX parameters*/ { DE_NAS_5GS_MM_5GS_IDENTITY_TYPE, "5GS identity type" }, /* 9.11.3.3 5GS identity type*/ { DE_NAS_5GS_MM_5GS_MOBILE_ID, "5GS mobile identity" }, /* 9.11.3.4 5GS mobile identity*/ { DE_NAS_5GS_MM_5GS_NW_FEAT_SUP, "5GS network feature support" }, /* 9.11.3.5 5GS network feature support*/ { DE_NAS_5GS_MM_5GS_REG_RES, "5GS registration result" }, /* 9.11.3.6 5GS registration result*/ { DE_NAS_5GS_MM_5GS_REG_TYPE, "5GS registration type" }, /* 9.11.3.7 5GS registration type*/ { DE_NAS_5GS_MM_5GS_TA_ID, "5GS tracking area identity" }, /* 9.11.3.8 5GS tracking area identity */ { DE_NAS_5GS_MM_5GS_TA_ID_LIST, "5GS tracking area identity list" }, /* 9.11.3.9 5GS tracking area identity list*/ { DE_NAS_5GS_MM_UPDATE_TYPE, "5GS update type" }, /* 9.11.3.9A 5GS update type */ { DE_NAS_5GS_MM_ABBA, "ABBA" }, /* 9.11.3.10 ABBA */ { DE_NAS_5GS_MM_ACCESS_TYPE, "Access type" }, /* 9.11.3.11 Access type */ { DE_NAS_5GS_MM_ADD_5G_SEC_INF, "Additional 5G security information" }, /* 9.11.3.12 Additional 5G security information */ { DE_NAS_5GS_MM_ALLOW_PDU_SES_STS, "Allowed PDU session status" }, /* 9.11.3.13 Allowed PDU session status*/ { DE_NAS_5GS_MM_AUT_FAIL_PAR, "Authentication failure parameter" }, /* 9.11.3.14 Authentication failure parameter*/ { DE_NAS_5GS_MM_AUT_PAR_AUTN, "Authentication parameter AUTN" }, /* 9.11.3.15 Authentication parameter AUTN*/ { DE_NAS_5GS_MM_AUT_PAR_RAND, "Authentication parameter RAND" }, /* 9.11.3.16 Authentication parameter RAND*/ { DE_NAS_5GS_MM_AUT_RESP_PAR, "Authentication response parameter" }, /* 9.11.3.17 Authentication response parameter*/ { DE_NAS_5GS_MM_CONF_UPD_IND, "Configuration update indication" }, /* 9.11.3.18 Configuration update indication*/ { DE_NAS_5GS_MM_DLGT_SAVING_TIME, "Daylight saving time" }, /* 9.11.3.19 Daylight saving time*/ { DE_NAS_5GS_MM_DE_REG_TYPE, "De-registration type" }, /* 9.11.3.20 De-registration type*/ /* 9.11.3.21 Void */ /* 9.11.3.22 Void*/ { DE_NAS_5GS_MM_EMRG_NR_LIST, "Emergency number list" }, /* 9.11.3.23 Emergency number list*/ { DE_NAS_5GS_MM_EPS_NAS_MSG_CONT, "EPS NAS message container" }, /* 9.11.3.24 EPS NAS message container*/ { DE_NAS_5GS_MM_EPS_NAS_SEC_ALGO, "EPS NAS security algorithms" }, /* 9.11.3.25 EPS NAS security algorithms*/ { DE_NAS_5GS_MM_EXT_EMERG_NUM_LIST, "Extended emergency number list" }, /* 9.11.3.26 Extended emergency number list */ /* 9.11.3.27 Void*/ { DE_NAS_5GS_MM_IMEISV_REQ, "IMEISV request" }, /* 9.11.3.28 IMEISV request*/ { DE_NAS_5GS_MM_LADN_INDIC, "LADN indication" }, /* 9.11.3.29 LADN indication*/ { DE_NAS_5GS_MM_LADN_INF, "LADN information" }, /* 9.11.3.30 LADN information*/ { DE_NAS_5GS_MM_MICO_IND, "MICO indication" }, /* 9.11.3.31 MICO indication*/ { DE_NAS_5GS_MM_NAS_KEY_SET_ID, "NAS key set identifier" }, /* 9.11.3.32 NAS key set identifier*/ { DE_NAS_5GS_MM_NAS_MSG_CONT, "NAS message container" }, /* 9.11.3.33 NAS message container*/ { DE_NAS_5GS_MM_NAS_SEC_ALGO, "NAS security algorithms" }, /* 9.11.3.34 NAS security algorithms*/ { DE_NAS_5GS_MM_NW_NAME, "Network name" }, /* 9.11.3.35 Network name*/ { DE_NAS_5GS_MM_NW_SLICING_IND, "Network slicing indication" }, /* 9.11.3.36 Network slicing indication */ { DE_NAS_5GS_MM_NSSAI, "NSSAI" }, /* 9.11.3.37 NSSAI*/ { DE_NAS_5GS_MM_NSSAI_INC_MODE, "NSSAI inclusion mode" }, /* 9.11.3.37A NSSAI inclusion mode */ { DE_NAS_5GS_MM_OP_DEF_ACC_CAT_DEF, "Operator-defined access category definitions" },/* 9.11.3.38 Operator-defined access category definitions */ { DE_NAS_5GS_MM_PLD_CONT, "Payload container" }, /* 9.11.3.39 Payload container*/ { DE_NAS_5GS_MM_PLD_CONT_TYPE, "Payload container type" }, /* 9.11.3.40 Payload container type*/ { DE_NAS_5GS_MM_PDU_SES_ID_2, "PDU session identity 2" }, /* 9.11.3.42 PDU session identity 2*/ { DE_NAS_5GS_MM_PDU_SES_REACT_RES, "PDU session reactivation result" }, /* 9.11.3.43 PDU session reactivation result*/ { DE_NAS_5GS_MM_PDU_SES_REACT_RES_ERR_C, "PDU session reactivation result error cause" }, /* 9.11.3.43 PDU session reactivation result error cause*/ { DE_NAS_5GS_MM_PDU_SES_STATUS, "PDU session status" }, /* 9.11.3.44 PDU session status*/ { DE_NAS_5GS_MM_PLMN_LIST, "PLMN list" }, /* 9.11.3.45 PLMN list*/ { DE_NAS_5GS_MM_REJ_NSSAI, "Rejected NSSAI" }, /* 9.11.3.46 Rejected NSSAI*/ { DE_NAS_5GS_MM_REQ_TYPE, "Request type" }, /* 9.11.3.47 Request type*/ { DE_NAS_5GS_MM_S1_UE_NW_CAP, "S1 UE network capability" }, /* 9.11.3.48 S1 UE network capability*/ { DE_NAS_5GS_MM_S1_UE_SEC_CAP, "S1 UE security capability" }, /* 9.11.3.48A S1 UE security capability*/ { DE_NAS_5GS_MM_SAL, "Service area list" }, /* 9.11.3.49 Service area list*/ { DE_NAS_5GS_MM_SERV_TYPE, "Service type" }, /* 9.11.3.50 Service type*/ { DE_NAS_5GS_MM_SMS_IND, "SMS indication" }, /* 9.11.3.50A SMS indication */ { DE_NAS_5GS_MM_SOR_TRASP_CONT, "SOR transparent container" }, /* 9.11.3.51 SOR transparent container */ { DE_NAS_5GS_MM_TZ, "Time zone" }, /* 9.11.3.52 Time zone*/ { DE_NAS_5GS_MM_TZ_AND_T, "Time zone and time" }, /* 9.11.3.53 Time zone and time*/ { DE_NAS_5GS_MM_UE_PAR_UPD_TRASNSP_CONT, "UE parameters update transparent container" }, /* 9.11.3.53A UE parameters update transparent container */ { DE_NAS_5GS_MM_UE_SEC_CAP, "UE security capability" }, /* 9.11.3.54 UE security capability*/ { DE_NAS_5GS_MM_UE_USAGE_SET, "UE's usage setting" }, /* 9.11.3.55 UE's usage setting*/ { DE_NAS_5GS_MM_UE_STATUS, "UE status" }, /* 9.11.3.56 UE status*/ { DE_NAS_5GS_MM_UL_DATA_STATUS, "Uplink data status" }, /* 9.11.3.57 Uplink data status*/ { 0, NULL } }; value_string_ext nas_5gs_mm_elem_strings_ext = VALUE_STRING_EXT_INIT(nas_5gs_mm_elem_strings); #define NUM_NAS_5GS_MM_ELEM (sizeof(nas_5gs_mm_elem_strings)/sizeof(value_string)) gint ett_nas_5gs_mm_elem[NUM_NAS_5GS_MM_ELEM]; guint16(*nas_5gs_mm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len) = { /* 9.11.3 5GS mobility management (5GMM) information elements */ de_nas_5gs_mm_5gmm_cap, /* 9.11.3.1 5GMM capability*/ de_nas_5gs_mm_5gmm_cause, /* 9.11.3.2 5GMM cause*/ de_nas_5gs_mm_5gs_drx_param, /* 9.11.3.2A 5GS DRX parameters*/ de_nas_5gs_mm_5gs_identity_type, /* 9.11.3.3 5GS identity type*/ de_nas_5gs_mm_5gs_mobile_id, /* 9.11.3.4 5GS mobile identity*/ de_nas_5gs_mm_5gs_nw_feat_sup, /* 9.11.3.5 5GS network feature support*/ de_nas_5gs_mm_5gs_reg_res, /* 9.11.3.6 5GS registration result*/ de_nas_5gs_mm_5gs_reg_type, /* 9.11.3.7 5GS registration type*/ de_nas_5gs_mm_5gs_ta_id, /* 9.11.3.8 5GS tracking area identity */ de_nas_5gs_mm_5gs_ta_id_list, /* 9.11.3.9 5GS tracking area identity list */ de_nas_5gs_mm_update_type, /* 9.11.3.9A 5GS update type */ de_nas_5gs_mm_abba, /* 9.11.3.10 ABBA */ de_nas_5gs_mm_access_type, /* 9.11.3.11 Access type */ de_nas_5gs_mm_add_5g_sec_inf, /* 9.11.3.12 Additional 5G security information */ de_nas_5gs_mm_allow_pdu_ses_sts, /* 9.11.3.13 Allowed PDU session status*/ NULL, /* 9.11.3.14 Authentication failure parameter */ NULL, /* 9.11.3.15 Authentication parameter AUTN*/ NULL, /* 9.11.3.16 Authentication parameter RAND*/ NULL, /* 9.11.3.17 Authentication response parameter */ de_nas_5gs_mm_conf_upd_ind, /* 9.11.3.18 Configuration update indication*/ NULL, /* 9.11.3.19 Daylight saving time*/ de_nas_5gs_mm_de_reg_type, /* 9.11.3.20 De-registration type*/ /* 9.11.3.21 Void */ /* 9.11.3.22 Void*/ NULL, /* 9.11.3.23 Emergency number list*/ de_nas_5gs_mm_eps_nas_msg_cont, /* 9.11.3.24 EPS NAS message container*/ NULL, /* 9.11.3.25 EPS NAS security algorithms*/ NULL, /* 9.11.3.26 Extended emergency number list*/ /* 9.11.3.27 Void*/ NULL, /* 9.11.3.28 IMEISV request*/ de_nas_5gs_mm_ladn_indic, /* 9.11.3.29 LADN indication*/ de_nas_5gs_mm_ladn_inf, /* 9.11.3.30 LADN information*/ de_nas_5gs_mm_mico_ind, /* 9.11.3.31 MICO indication*/ de_nas_5gs_mm_nas_key_set_id, /* 9.11.3.32 NAS key set identifier*/ de_nas_5gs_mm_nas_msg_cont, /* 9.11.3.33 NAS message container*/ de_nas_5gs_mm_nas_sec_algo, /* 9.11.3.34 NAS security algorithms*/ NULL, /* 9.11.3.35 Network name*/ de_nas_5gs_mm_nw_slicing_ind, /* 9.11.3.36 Network slicing indication */ de_nas_5gs_mm_nssai, /* 9.11.3.37 NSSAI*/ de_nas_5gs_mm_nssai_inc_mode, /* 9.11.3.37A NSSAI inclusion mode */ de_nas_5gs_mm_op_def_acc_cat_def, /* 9.11.3.38 Operator-defined access category definitions */ de_nas_5gs_mm_pld_cont, /* 9.11.3.39 Payload container*/ de_nas_5gs_mm_pld_cont_type, /* 9.11.3.40 Payload container type*/ de_nas_5gs_mm_pdu_ses_id_2, /* 9.11.3.41 PDU session identity 2*/ de_nas_5gs_mm_pdu_ses_react_res, /* 9.11.3.42 PDU session reactivation result*/ de_nas_5gs_mm_pdu_ses_react_res_err_c, /* 9.11.3.43 PDU session reactivation result error cause */ de_nas_5gs_mm_pdu_ses_status, /* 9.11.3.44 PDU session status*/ NULL, /* 9.11.3.45 PLMN list*/ de_nas_5gs_mm_rej_nssai, /* 9.11.3.46 Rejected NSSAI*/ de_nas_5gs_mm_req_type, /* 9.11.3.47 Request type*/ NULL, /* 9.11.3.48 S1 UE network capability*/ NULL, /* 9.11.3.48A S1 UE security capability*/ de_nas_5gs_mm_sal, /* 9.11.3.49 Service area list*/ NULL, /* 9.11.3.50 Service type*/ /* Used Inline Half octet IE */ de_nas_5gs_mm_sms_ind, /* 9.11.3.50A SMS indication */ de_nas_5gs_mm_sor_trasp_cont, /* 9.11.3.51 SOR transparent container */ NULL, /* 9.11.3.52 Time zone*/ NULL, /* 9.11.3.53 Time zone and time*/ de_nas_5gs_mm_ue_par_upd_trasnsp_cont, /* 9.11.3.53A UE parameters update transparent container */ de_nas_5gs_mm_ue_sec_cap, /* 9.11.3.54 UE security capability*/ de_nas_5gs_mm_ue_usage_set, /* 9.11.3.55 UE's usage setting*/ de_nas_5gs_mm_ue_status, /* 9.11.3.56 UE status*/ de_nas_5gs_mm_ul_data_status, /* 9.11.3.57 Uplink data status*/ NULL, /* NONE */ }; /* * 9.11.4 5GS session management (5GSM) information elements */ typedef enum { DE_NAS_5GS_SM_5GSM_CAP, /* 9.11.4.1 5GSM capability */ DE_NAS_5GS_SM_5GSM_CAUSE, /* 9.11.4.2 5GSM cause */ DE_NAS_5GS_SM_ALWAYS_ON_PDU_SES_IND, /* 9.11.4.3 Always-on PDU session indication */ DE_NAS_5GS_SM_ALWAYS_ON_PDU_SES_REQ, /* 9.11.4.4 Always-on PDU session requested */ DE_NAS_5GS_SM_5GSM_ALLOWED_SSC_MODE, /* 9.11.4.5 Allowed SSC mode */ DE_NAS_5GS_SM_EXT_PROT_CONF_OPT, /* 9.11.4.6 Extended protocol configuration options */ DE_NAS_5GS_SM_INT_PROT_MAX_DATA_RTE, /* 9.11.4.7 Integrity protection maximum data rate */ DE_NAS_5GS_SM_MAPPED_EPS_B_CONT, /* 9.11.4.8 Mapped EPS bearer contexts */ DE_NAS_5GS_SM_MAX_NUM_SUP_PKT_FLT, /* 9.11.4.9 Maximum number of supported packet filters */ DE_NAS_5GS_SM_PDU_ADDRESS, /* 9.11.4.10 PDU address */ DE_NAS_5GS_SM_PDU_SESSION_TYPE, /* 9.11.4.11 PDU session type */ DE_NAS_5GS_SM_QOS_FLOW_DES, /* 9.11.4.12 QoS flow descriptions */ DE_NAS_5GS_SM_QOS_RULES, /* 9.11.4.13 QoS rules */ DE_NAS_5GS_SM_SESSION_AMBR, /* 9.11.4.14 Session-AMBR */ DE_NAS_5GS_SM_PDU_DN_REQ_CONT, /* 9.11.4.15 SM PDU DN request container */ DE_NAS_5GS_SM_SSC_MODE, /* 9.11.4.16 SSC mode */ DE_NAS_5GS_SM_NONE /* NONE */ } nas_5gs_sm_elem_idx_t; static const value_string nas_5gs_sm_elem_strings[] = { { DE_NAS_5GS_SM_5GSM_CAP, "5GSM capability" }, /* 9.11.4.1 5GSM capability */ { DE_NAS_5GS_SM_5GSM_CAUSE, "5GSM cause" }, /* 9.11.4.2 5GSM cause */ { DE_NAS_5GS_SM_ALWAYS_ON_PDU_SES_IND, "Always-on PDU session indication" }, /* 9.11.4.3 Always-on PDU session indication */ { DE_NAS_5GS_SM_ALWAYS_ON_PDU_SES_REQ, "Always-on PDU session requested" }, /* 9.11.4.4 Always-on PDU session requested */ { DE_NAS_5GS_SM_5GSM_ALLOWED_SSC_MODE, "Allowed SSC mode" }, /* 9.11.4.5 Allowed SSC mode */ { DE_NAS_5GS_SM_EXT_PROT_CONF_OPT, "Extended protocol configuration options" }, /* 9.11.4.6 Extended protocol configuration options */ { DE_NAS_5GS_SM_INT_PROT_MAX_DATA_RTE, "Integrity protection maximum data rate" }, /* 9.11.4.7 Integrity protection maximum data rate */ { DE_NAS_5GS_SM_MAPPED_EPS_B_CONT, "Mapped EPS bearer contexts" }, /* 9.11.4.8 Mapped EPS bearer contexts */ { DE_NAS_5GS_SM_MAX_NUM_SUP_PKT_FLT, "Maximum number of supported packet filters" }, /* 9.11.4.9 Maximum number of supported packet filters */ { DE_NAS_5GS_SM_PDU_ADDRESS, "PDU address" }, /* 9.11.4.10 PDU address */ { DE_NAS_5GS_SM_PDU_SESSION_TYPE, "PDU session type" }, /* 9.11.4.11 PDU session type */ { DE_NAS_5GS_SM_QOS_FLOW_DES, "QoS flow descriptions" }, /* 9.11.4.12 QoS flow descriptions */ { DE_NAS_5GS_SM_QOS_RULES, "QoS rules" }, /* 9.11.4.13 QoS rules */ { DE_NAS_5GS_SM_SESSION_AMBR, "Session-AMBR" }, /* 9.11.4.14 Session-AMBR */ { DE_NAS_5GS_SM_PDU_DN_REQ_CONT, "SM PDU DN request container" }, /* 9.11.4.15 SM PDU DN request container */ { DE_NAS_5GS_SM_SSC_MODE, "SSC mode" }, /* 9.11.4.16 SSC mode */ { 0, NULL } }; value_string_ext nas_5gs_sm_elem_strings_ext = VALUE_STRING_EXT_INIT(nas_5gs_sm_elem_strings); #define NUM_NAS_5GS_SM_ELEM (sizeof(nas_5gs_sm_elem_strings)/sizeof(value_string)) gint ett_nas_5gs_sm_elem[NUM_NAS_5GS_SM_ELEM]; guint16(*nas_5gs_sm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len) = { /* 5GS session management (5GSM) information elements */ de_nas_5gs_sm_5gsm_cap, /* 9.11.4.1 5GSM capability */ de_nas_5gs_sm_5gsm_cause, /* 9.11.4.2 5GSM cause */ de_nas_5gs_sm_always_on_pdu_ses_ind, /* 9.11.4.3 Always-on PDU session indication */ de_nas_5gs_sm_always_on_pdu_ses_req, /* 9.11.4.4 Always-on PDU session requested */ de_nas_5gs_sm_5gsm_allowed_ssc_mode, /* 9.11.4.5 Allowed SSC mode */ NULL, /* 9.11.4.6 Extended protocol configuration options */ de_nas_5gs_sm_int_prot_max_data_rte, /* 9.11.4.7 Integrity protection maximum data rate */ de_nas_5gs_sm_mapped_eps_b_cont, /* 9.11.4.8 Mapped EPS bearer contexts */ de_nas_5gs_sm_max_num_sup_pkt_flt, /* 9.11.4.9 Maximum number of supported packet filters */ de_nas_5gs_sm_pdu_address, /* 9.11.4.10 PDU address */ de_nas_5gs_sm_pdu_session_type, /* 9.11.4.11 PDU session type */ de_nas_5gs_sm_qos_flow_des, /* 9.11.4.12 QoS flow descriptions */ de_nas_5gs_sm_qos_rules, /* 9.11.4.13 QoS rules */ de_nas_5gs_sm_session_ambr, /* 9.11.4.14 Session-AMBR */ de_nas_5gs_sm_pdu_dn_req_cont, /* 9.11.4.15 SM PDU DN request container */ de_nas_5gs_sm_ssc_mode, /* 9.11.4.16 SSC mode */ NULL, /* NONE */ }; /* Gap fill msg decoding*/ static void nas_5gs_exp_not_dissected_yet(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_msg_not_dis, tvb, offset, len); } /* * 8.2.1 Authentication request */ static void nas_5gs_mm_authentication_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /*ngKSI NAS key set identifier 9.11.3.29 M V 1/2 */ /* Spare half octet Spare half octet 9.5 M V 1/2 H1 */ proto_tree_add_item(tree, hf_nas_5gs_spare_half_octet, tvb, curr_offset, 1, ENC_BIG_ENDIAN); ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NAS_KEY_SET_ID, " - ngKSI", ei_nas_5gs_missing_mandatory_elemen); /* ABBA ABBA 9.11.3.10 M LV 3-n */ ELEM_MAND_LV(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_ABBA, NULL, ei_nas_5gs_missing_mandatory_elemen); /*21 Authentication parameter RAND (5G authentication challenge) Authentication parameter RAND 9.11.3.13 O TV 17*/ ELEM_OPT_TV(0x21, GSM_A_PDU_TYPE_DTAP, DE_AUTH_PARAM_RAND, " - 5G authentication challenge"); /*20 Authentication parameter AUTN (5G authentication challenge) Authentication parameter AUTN 9.11.3.14 O TLV 18*/ ELEM_OPT_TLV(0x20, GSM_A_PDU_TYPE_DTAP, DE_AUTH_PARAM_AUTN, " - 5G authentication challenge"); /*78 EAP message EAP message 9.10.2.2 O TLV-E 7-1503 */ ELEM_OPT_TLV_E(0x78, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* *8.2.2 Authentication response */ static void nas_5gs_mm_authentication_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* 2D Authentication response parameter Authentication response parameter 9.11.3.15 O TLV 6-18 */ ELEM_OPT_TLV( 0x2d, NAS_PDU_TYPE_EMM, DE_EMM_AUTH_RESP_PAR, NULL); /* 78 EAP message EAP message 9.10.2.2 O TLV-E 7-1503 */ ELEM_OPT_TLV_E(0x78, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.3 Authentication result */ static void nas_5gs_mm_authentication_result(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* ngKSI NAS key set identifier 9.11.3.27 M V 1/2 Spare half octet Spare half octet 9.5 M V 1/2 H1 */ proto_tree_add_item(tree, hf_nas_5gs_spare_half_octet, tvb, curr_offset, 1, ENC_BIG_ENDIAN); ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NAS_KEY_SET_ID, " - ngKSI", ei_nas_5gs_missing_mandatory_elemen); /* EAP message EAP message 9.11.2.2 M LV-E 7-1503 */ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL, ei_nas_5gs_missing_mandatory_elemen); /* 38 ABBA ABBA 9.11.3.10 O TLV 4-n */ ELEM_OPT_TLV(0x38, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_ABBA, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.4 Authentication failure */ static void nas_5gs_mm_authentication_failure(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* 5GMM cause 5GMM cause 9.11.3.2 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GMM_CAUSE, NULL, ei_nas_5gs_missing_mandatory_elemen); /* 30 Authentication failure parameter Authentication failure parameter 9.11.3.14 O TLV 16 */ ELEM_OPT_TLV(0x30, GSM_A_PDU_TYPE_DTAP, DE_AUTH_FAIL_PARAM, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.5 Authentication reject */ static void nas_5gs_mm_authentication_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* 78 EAP message EAP message 9.11.2.2 O TLV-E 7-1503 */ ELEM_OPT_TLV_E(0x78, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.6 Registration request */ static const int * nas_5gs_registration_req_flags[] = { &hf_nas_5gs_mm_tsc_h1, &hf_nas_5gs_mm_nas_key_set_id_h1, &hf_nas_5gs_mm_for, &hf_nas_5gs_mm_5gs_reg_type, NULL }; static void nas_5gs_mm_registration_req(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; /* Direction: UE to network */ pinfo->link_dir = P2P_DIR_UL; /* Initalize the private struct */ nas5gs_get_private_data(pinfo); /* 5GS registration type 5GS registration type 9.11.3.7 M V 1/2 H0*/ /* ngKSI NAS key set identifier 9.11.3.32 M V 1/2 H1*/ proto_tree_add_bitmask_list(tree, tvb, offset, 1, nas_5gs_registration_req_flags, ENC_BIG_ENDIAN); curr_offset++; curr_len--; /* Mobile identity 5GS mobile identity 9.11.3.4 M LV-E 6-n*/ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_MOBILE_ID, NULL, ei_nas_5gs_missing_mandatory_elemen); /*C- Non-current native NAS KSI NAS key set identifier 9.11.3.32 O TV 1*/ ELEM_OPT_TV_SHORT(0xc0, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NAS_KEY_SET_ID, " - native KSI"); /*10 5GMM capability 5GMM capability 9.11.3.1 O TLV 3-15*/ ELEM_OPT_TLV(0x10, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GMM_CAP, NULL); /*2E UE security capability UE security capability 9.11.3.54 O TLV 4-10*/ ELEM_OPT_TLV(0x2e, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_UE_SEC_CAP, NULL); /*2F Requested NSSAI NSSAI 9.11.3.37 O TLV 4-74*/ ELEM_OPT_TLV(0x2f, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NSSAI, " - Requested NSSAI"); /*52 Last visited registered TAI 5GS tracking area identity 9.11.3.8 O TV 7 */ ELEM_OPT_TV(0x52, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_TA_ID, " - Last visited registered TAI"); /*17 S1 UE network capability S1 UE network capability 9.11.3.48 O TLV 4-15 */ ELEM_OPT_TLV(0x17, NAS_PDU_TYPE_EMM, DE_EMM_UE_NET_CAP, NULL); /*40 Uplink data status Uplink data status 9.11.3.57 O TLV 4-34 */ ELEM_OPT_TLV(0x40, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_UL_DATA_STATUS, NULL); /*50 PDU session status PDU session status 9.11.3.44 O TLV 4-34 */ ELEM_OPT_TLV(0x50, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PDU_SES_STATUS, NULL); /*B- MICO indication MICO indication 9.11.3.31 O TV 1*/ ELEM_OPT_TV_SHORT(0xb0, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_MICO_IND, NULL); /*2B UE status UE status 9.11.3.56 O TLV 3*/ ELEM_OPT_TLV(0x2b, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_UE_STATUS, NULL); /*77 Additional GUTI 5GS mobile identity 9.11.3.4 O TLV-E 14 */ ELEM_OPT_TLV_E(0x77, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_MOBILE_ID, " - Additional GUTI"); /*25 Allowed PDU session status Allowed PDU session status 9.11.3.13 O TLV 4 - 34 */ ELEM_OPT_TLV(0x25, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_ALLOW_PDU_SES_STS, NULL); /*18 UE's usage setting UE's usage setting 9.11.3.55 O TLV 3 */ ELEM_OPT_TLV(0x18, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_UE_USAGE_SET, NULL); /*51 Requested DRX parameters 5GS DRX parameters 9.11.3.2A O TLV 3 */ ELEM_OPT_TLV(0x51, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_DRX_PARAM, " - Requested DRX parameters"); /*70 EPS NAS message container EPS NAS message container 9.11.3.24 O TLV-E 4-n */ ELEM_OPT_TLV_E(0x70, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_EPS_NAS_MSG_CONT, NULL); /* 74 LADN indication LADN indication 9.11.3.29 O TLV-E 3-811 */ ELEM_OPT_TLV_E(0x74, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_LADN_INF, NULL); /* 8- Payload container type Payload container type 9.11.3.40 O TV 1 */ ELEM_OPT_TV_SHORT(0x80, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PLD_CONT_TYPE, NULL); /* 7B Payload container Payload container 9.11.3.39 O TLV-E 4-65538 */ ELEM_OPT_TLV_E(0x7B, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PLD_CONT, NULL); /* 9- Network slicing indication Network slicing indication 9.11.3.36 O TV 1 */ ELEM_OPT_TV_SHORT(0x90, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NW_SLICING_IND, NULL); /* 53 5GS update type 5GS update type 9.11.3.9A O TLV 3 */ ELEM_OPT_TLV(0x53, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_UPDATE_TYPE, NULL); /* 71 NAS message container NAS message container 9.11.3.33 O TLV-E 4-n */ ELEM_OPT_TLV_E(0x71, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NAS_MSG_CONT, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.7 Registration accept */ static void nas_5gs_mm_registration_accept(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* 5GS registration result 5GS registration result 9.11.3.6 M LV 2*/ ELEM_MAND_LV(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_REG_RES, NULL, ei_nas_5gs_missing_mandatory_elemen); /*77 5G-GUTI 5GS mobile identity 9.11.3.4 O TLV-E 14 */ ELEM_OPT_TLV_E(0x77, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_MOBILE_ID, " - 5G-GUTI"); /*4A Equivalent PLMNs PLMN list 9.11.3.33 O TLV 5-47*/ ELEM_OPT_TLV(0x4a, GSM_A_PDU_TYPE_COMMON, DE_PLMN_LIST, " - Equivalent PLMNs"); /*54 TAI list Tracking area identity list 9.11.3.9 O TLV 8-98*/ ELEM_OPT_TLV(0x54, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_TA_ID_LIST, NULL); /*15 Allowed NSSAI NSSAI 9.11.3.28 O TLV 4-74*/ ELEM_OPT_TLV(0x15, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NSSAI, " - Allowed NSSAI"); /*11 Rejected NSSAI Rejected NSSAI 9.11.3.35 O TLV 4-42*/ ELEM_OPT_TLV(0x11, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_REJ_NSSAI, NULL); /*31 Configured NSSAI NSSAI 9.11.3.34 O TLV 4-146 */ ELEM_OPT_TLV(0x31, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NSSAI, " - Configured NSSAI"); /*21 5GS network feature support 5GS network feature support 9.11.3.5 O TLV 3-5 */ ELEM_OPT_TLV(0x21, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_NW_FEAT_SUP, NULL); /*50 PDU session status PDU session status 9.10.2.2 O TLV 4*/ ELEM_OPT_TLV(0x50, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PDU_SES_STATUS, NULL); /*26 PDU session reactivation result PDU session reactivation result 9.11.3.32 O TLV 4-32*/ ELEM_OPT_TLV(0x26, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PDU_SES_REACT_RES, NULL); /*72 PDU session reactivation result error cause PDU session reactivation result error cause 9.11.3.40 O TLV-E 5-515*/ ELEM_OPT_TLV_E(0x72, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PDU_SES_REACT_RES_ERR_C, NULL); /*79 LADN information LADN information 9.11.3.19 O TLV-E 11-1579*/ ELEM_OPT_TLV_E(0x79, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_LADN_INF, NULL); /*B- MICO indication MICO indication 9.11.3.21 O TV 1*/ ELEM_OPT_TV_SHORT(0xb0, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_MICO_IND, NULL); /* 9- Network slicing indication Network slicing indication 9.11.3.36 O TV 1 */ ELEM_OPT_TV_SHORT(0x90, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NW_SLICING_IND, NULL); /*27 Service area list Service area list 9.11.3.47 O TLV 6-194*/ ELEM_OPT_TLV(0x27, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_SAL, NULL); /*5E T3512 value GPRS timer 3 9.11.3.21 O TLV 3*/ ELEM_OPT_TLV(0x5E, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3512 value"); /*5D Non-3GPP de-registration timer value GPRS timer 2 9.11.3.20 O TLV 3*/ ELEM_OPT_TLV(0x5D, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - Non-3GPP de-registration timer value"); /*16 T3502 value GPRS timer 2 9.10.2.4 O TLV 3*/ ELEM_OPT_TLV(0x16, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3502 value"); /*34 Emergency number list Emergency number list 9.11.3.17 O TLV 5-50*/ ELEM_OPT_TLV(0x34, GSM_A_PDU_TYPE_DTAP, DE_EMERGENCY_NUM_LIST, NULL); /*7A Extended emergency number list Extended emergency number list 9.11.3.24 O TLV TBD*/ ELEM_OPT_TLV(0x7A, NAS_PDU_TYPE_EMM, DE_EMM_EXT_EMERG_NUM_LIST, NULL); /*73 SOR transparent container SOR transparent container 9.11.3.51 O TLV-E 20-2048 */ ELEM_OPT_TLV_E(0x73, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_SOR_TRASP_CONT, NULL); /*78 EAP message EAP message 9.10.2.2 O TLV-E 7-1503 */ ELEM_OPT_TLV_E(0x78, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL); /* A- NSSAI inclusion mode NSSAI inclusion mode 9.11.3.37A O TV 1 */ ELEM_OPT_TV_SHORT(0xA0, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NSSAI_INC_MODE, NULL); /* 76 Operator-defined access category definitions Operator-defined access category definitions 9.11.3.38 O TLV-E 3-TBD */ ELEM_OPT_TLV_E(0x76, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_OP_DEF_ACC_CAT_DEF, NULL); /* 51 Negotiated DRX parameters 5GS DRX parameters 9.11.3.2A O TLV 3 */ ELEM_OPT_TLV(0x51, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_DRX_PARAM, " - Negotiated DRX parameters"); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.8 Registration complete */ static void nas_5gs_mm_registration_complete(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint curr_len; curr_offset = offset; curr_len = len; /* 73 SOR transparent container SOR transparent container 9.11.3.51 O TLV-E 20-2048 */ EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.9 Registration reject */ static void nas_5gs_mm_registration_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* 5GMM cause 5GMM cause 9.11.3.2 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GMM_CAUSE, NULL, ei_nas_5gs_missing_mandatory_elemen); /* 5F T3346 value GPRS timer 2 9.11.3.16 O TLV 3 */ ELEM_OPT_TLV(0x5F, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3346 value"); /* 16 T3502 value GPRS timer 2 9.10.2.4 O TLV 3 */ ELEM_OPT_TLV(0x16, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3502 value"); /* 78 EAP message EAP message 9.10.2.2 O TLV-E 7-1503 */ ELEM_OPT_TLV_E(0x78, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.10 UL NAS transport */ static void nas_5gs_mm_ul_nas_transp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; /* Direction: UE to network */ pinfo->link_dir = P2P_DIR_UL; curr_offset = offset; curr_len = len; /* Initalize the private struct */ nas5gs_get_private_data(pinfo); /*Payload container type Payload container type 9.11.3.31 M V 1/2 */ /*Spare half octet Spare half octet 9.5 M V 1/2*/ proto_tree_add_item(tree, hf_nas_5gs_spare_half_octet, tvb, curr_offset, 1, ENC_BIG_ENDIAN); ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PLD_CONT_TYPE, NULL, ei_nas_5gs_missing_mandatory_elemen); /*Payload container Payload container 9.11.3.30 M LV-E 3-65537*/ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PLD_CONT, NULL, ei_nas_5gs_missing_mandatory_elemen); /*12 PDU session ID PDU session identity 2 9.11.3.41 C TV 2 */ ELEM_OPT_TV(0x12, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PDU_SES_ID_2, " - PDU session ID"); /*59 Old PDU session ID PDU session identity 2 9.11.3.37 O TV 2 */ ELEM_OPT_TV(0x59, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PDU_SES_ID_2, " - Old PDU session ID"); /*8- Request type Request type 9.11.3.42 O TV 1 */ ELEM_OPT_TV_SHORT(0x80, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_REQ_TYPE, NULL); /*22 S-NSSAI S-NSSAI 9.11.3.37 O TLV 3-10 */ ELEM_OPT_TLV(0x22, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_S_NSSAI, NULL); /*25 DNN DNN 9.11.2.1A O TLV 3-102 */ ELEM_OPT_TLV(0x25, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_DNN, NULL); /*24 Additional information Additional information 9.10.2.1 O TLV 3-n */ ELEM_OPT_TLV(0x24, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_ADD_INF, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.11 DL NAS transport */ static void nas_5gs_mm_dl_nas_transp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; /* Direction: network to UE */ curr_offset = offset; curr_len = len; /* Initalize the private struct */ nas5gs_get_private_data(pinfo); /*Payload container type Payload container type 9.11.3.40 M V 1/2 H0*/ /*Spare half octet Spare half octet 9.5 M V 1/2 H1*/ proto_tree_add_item(tree, hf_nas_5gs_spare_half_octet, tvb, curr_offset, 1, ENC_BIG_ENDIAN); ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PLD_CONT_TYPE, NULL, ei_nas_5gs_missing_mandatory_elemen); /*Payload container Payload container 9.11.3.39 M LV-E 3-65537*/ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PLD_CONT, NULL, ei_nas_5gs_missing_mandatory_elemen); /*12 PDU session ID PDU session identity 2 9.11.3.37 C TV 2 */ ELEM_OPT_TV(0x12, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PDU_SES_ID_2, " - PDU session ID"); /*24 Additional information Additional information 9.10.2.1 O TLV 3-n*/ ELEM_OPT_TLV(0x24, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_ADD_INF, NULL); /*58 5GMM cause 5GMM cause 9.11.3.2 O TV 2 */ ELEM_OPT_TV(0x58, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GMM_CAUSE, NULL); /*37 Back-off timer value GPRS timer 3 9.10.2.5 O TLV 3 */ ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - Back-off timer value"); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.12 De-registration request (UE originating de-registration) */ static void nas_5gs_mm_de_reg_req_ue_orig(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* De-registration type De-registration type 9.11.3.18 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_DE_REG_TYPE, NULL, ei_nas_5gs_missing_mandatory_elemen); /* ngKSI NAS key set identifier 9.11.3.32 M V 1/2 H1 */ /*5GS mobile identity 5GS mobile identity 9.11.3.4 M LV-E 6-n */ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_MOBILE_ID, NULL, ei_nas_5gs_missing_mandatory_elemen); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.13 De-registration accept (UE originating de-registration) */ /* No data */ /* * 8.2.14 De-registration request (UE terminated de-registration) */ static void nas_5gs_mm_de_registration_req_ue_term(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* De-registration type De-registration type 9.11.3.20 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_DE_REG_TYPE, NULL, ei_nas_5gs_missing_mandatory_elemen); /* Spare half octet Spare half octet 9.5 M V 1/2 */ /* 58 5GMM cause 5GMM cause 9.11.3.2 O TV 2 */ ELEM_OPT_TV(0x58, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GMM_CAUSE, NULL); /* 5F T3346 value GPRS timer 2 9.11.2.4 O TLV 3 */ ELEM_OPT_TLV(0x5F, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3346 value"); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.15 De-registration accept (UE terminated de-registration) */ /* No data */ /* * 8.2.16 Service request */ static void nas_5gs_mm_service_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* ngKSI NAS key set identifier 9.11.3.29 M V 1/2 */ /* Service type Service type 9.11.3.46 M V 1/2 */ proto_tree_add_item(tree, hf_nas_5gs_mm_serv_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NAS_KEY_SET_ID, " - ngKSI", ei_nas_5gs_missing_mandatory_elemen); /* 5G-S-TMSI 5GS mobile identity 9.11.3.4 M LV 6 */ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_MOBILE_ID, NULL, ei_nas_5gs_missing_mandatory_elemen); /*40 Uplink data status Uplink data status 9.11.3.53 O TLV 4 - 34*/ ELEM_OPT_TLV(0x40, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_UL_DATA_STATUS, NULL); /*50 PDU session status PDU session status 9.11.3.40 O TLV 4 - 34*/ ELEM_OPT_TLV(0x50, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PDU_SES_STATUS, NULL); /*25 Allowed PDU session status Allowed PDU session status 9.11.3.11 O TLV 4 - 34*/ ELEM_OPT_TLV(0x25, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_ALLOW_PDU_SES_STS, NULL); /* 71 NAS message container NAS message container 9.11.3.33 O TLV-E 4-n */ ELEM_OPT_TLV_E(0x71, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NAS_MSG_CONT, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.17 Service accept */ static void nas_5gs_mm_service_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /*50 PDU session status PDU session status 9.11.3.44 O TLV 4-34*/ ELEM_OPT_TLV(0x50, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PDU_SES_STATUS, NULL); /*26 PDU session reactivation result PDU session reactivation result 9.11.3.42 O TLV 4-32*/ ELEM_OPT_TLV(0x26, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PDU_SES_REACT_RES, NULL); /*72 PDU session reactivation result error cause PDU session reactivation result error cause 9.11.3.43 O TLV-E 5-515 */ ELEM_OPT_TLV_E(0x72, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_MM_PDU_SES_REACT_RES_ERR_C, NULL); /*78 EAP message EAP message 9.11.2.2 O TLV-E 7-1503*/ ELEM_OPT_TLV_E(0x78, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.18 Service reject */ static void nas_5gs_mm_service_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* 5GMM cause 5GMM cause 9.11.3.2 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GMM_CAUSE, NULL, ei_nas_5gs_missing_mandatory_elemen); /*50 PDU session status PDU session status 9.11.3.44 O TLV 4*/ ELEM_OPT_TLV(0x50, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PDU_SES_STATUS, NULL); /* 5F T3346 value GPRS timer 2 9.11.2.4 O TLV 3 */ ELEM_OPT_TLV(0x5F, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3346 value"); /* 78 EAP message EAP message 9.11.2.2 O TLV-E 7-1503 */ ELEM_OPT_TLV_E(0x78, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.19 Configuration update command */ static void nas_5gs_mm_conf_upd_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /*D- Configuration update indication Configuration update indication 9.11.3.16 O TV 1 */ ELEM_OPT_TV_SHORT(0xD0, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_CONF_UPD_IND, NULL); /*77 5G-GUTI 5GS mobile identity 9.11.3.4 O TLV TBD*/ ELEM_OPT_TLV_E(0x77, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_MOBILE_ID, NULL); /*54 TAI list Tracking area identity list 9.11.3.45 O TLV 8-98*/ ELEM_OPT_TLV(0x54, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_TA_ID_LIST, NULL); /*15 Allowed NSSAI NSSAI 9.11.3.28 O TLV 4-74*/ ELEM_OPT_TLV(0x15, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NSSAI, " - Allowed NSSAI"); /*27 Service area list Service area list 9.11.3.39 O TLV 6-194 */ ELEM_OPT_TLV(0x70, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_SAL, NULL); /*43 Full name for network Network name 9.11.3.26 O TLV 3-n*/ ELEM_OPT_TLV(0x43, GSM_A_PDU_TYPE_DTAP, DE_NETWORK_NAME, " - Full name for network"); /*45 Short name for network Network name 9.11.3.26 O TLV 3-n*/ ELEM_OPT_TLV(0x45, GSM_A_PDU_TYPE_DTAP, DE_NETWORK_NAME, " - Short Name"); /*46 Local time zone Time zone 9.11.3.46 O TV 2*/ ELEM_OPT_TV(0x46, GSM_A_PDU_TYPE_DTAP, DE_TIME_ZONE, " - Local"); /*47 Universal time and local time zone Time zone and time 9.11.3.47 O TV 8*/ ELEM_OPT_TV(0x47, GSM_A_PDU_TYPE_DTAP, DE_TIME_ZONE_TIME, " - Universal Time and Local Time Zone"); /*49 Network daylight saving time Daylight saving time 9.11.3.11 O TLV 3*/ ELEM_OPT_TLV(0x49, GSM_A_PDU_TYPE_DTAP, DE_DAY_SAVING_TIME, NULL); /*79 LADN information LADN information 9.11.3.19 O TLV-E 11-1579*/ ELEM_OPT_TLV_E(0x79, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_LADN_INF, NULL); /*B- MICO indication MICO indication 9.11.3.21 O TV 1*/ ELEM_OPT_TV_SHORT(0xB0, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_MICO_IND, NULL); /*31 Configured NSSAI NSSAI 9.11.3.28 O TLV 4-74*/ ELEM_OPT_TLV(0x31, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NSSAI, " - Configured NSSAI"); /*11 Rejected NSSAI Rejected NSSAI 9.11.3.42 O TLV 4-42*/ ELEM_OPT_TLV(0x11, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_REJ_NSSAI, NULL); /* 76 Operator-defined access category definitions Operator-defined access category definitions 9.11.3.38 O TLV-E 3-TBD */ ELEM_OPT_TLV_E(0x76, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_OP_DEF_ACC_CAT_DEF, NULL); /* F- SMS indication SMS indication 9.10.3.50A O TV 1 */ ELEM_OPT_TV_SHORT(0xF0, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_SMS_IND, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.20 Configuration update complete */ static void nas_5gs_mm_conf_update_comp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint curr_len; curr_offset = offset; curr_len = len; /* No Data */ EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.21 Identity request */ static void nas_5gs_mm_id_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Identity type 5GS identity type 9.11.3.3 M V 1/2 */ /* Spare half octet Spare half octet 9.5 M V 1/2 */ proto_tree_add_item(tree, hf_nas_5gs_spare_half_octet, tvb, curr_offset, 1, ENC_BIG_ENDIAN); ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_IDENTITY_TYPE, NULL, ei_nas_5gs_missing_mandatory_elemen); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.22 Identity response */ static void nas_5gs_mm_id_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Mobile identity 5GS mobile identity 9.11.3.4 M LV-E 3-n */ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_MOBILE_ID, NULL, ei_nas_5gs_missing_mandatory_elemen); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.23 Notification */ static void nas_5gs_mm_notification(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Access type Access type 9.11.3.11 M V 1/2 DE_NAS_5GS_MM_ACCESS_TYPE */ /* Spare half octet Spare half octet 9.5 M V 1/2 */ proto_tree_add_item(tree, hf_nas_5gs_spare_half_octet, tvb, curr_offset, 1, ENC_BIG_ENDIAN); ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_ACCESS_TYPE, NULL, ei_nas_5gs_missing_mandatory_elemen); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.24 Notification response */ static void nas_5gs_mm_notification_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* 50 PDU session status PDU session status 9.11.3.40 O TLV 4-34 */ ELEM_OPT_TLV(0x50, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_PDU_SES_STATUS, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.25 Security mode command */ static void nas_5gs_mm_sec_mode_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: network to UE */ /*Selected NAS security algorithms NAS security algorithms 9.11.3.34 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NAS_SEC_ALGO, NULL, ei_nas_5gs_missing_mandatory_elemen); /*ngKSI NAS key set identifier 9.11.3.32 M V 1/2 */ /* Spare half octet Spare half octet 9.5 M V 1/2 */ proto_tree_add_item(tree, hf_nas_5gs_spare_half_octet, tvb, curr_offset, 1, ENC_BIG_ENDIAN); ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NAS_KEY_SET_ID, " - ngKSI", ei_nas_5gs_missing_mandatory_elemen); /*Replayed UE security capabilities UE security capability 9.11.3.54 M LV 3-5*/ ELEM_MAND_LV(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_UE_SEC_CAP, " - Replayed UE security capabilities", ei_nas_5gs_missing_mandatory_elemen); /*E- IMEISV request IMEISV request 9.11.3.28 O TV 1*/ ELEM_OPT_TV_SHORT(0xE0, NAS_PDU_TYPE_EMM, DE_EMM_IMEISV_REQ, NULL); /*57 Selected EPS NAS security algorithms EPS NAS security algorithms 9.11.3.25 O TV 2 */ ELEM_OPT_TV(0x57, NAS_PDU_TYPE_EMM, DE_EMM_NAS_SEC_ALGS, " - Selected EPS NAS security algorithms"); /*36 Additional 5G security information Additional 5G security information 9.11.3.12 O TLV 3 */ ELEM_OPT_TLV(0x36, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_ADD_5G_SEC_INF, NULL); /*78 EAP message EAP message 9.10.2.2 O TLV-E 7*/ ELEM_OPT_TLV_E(0x78, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL); /*38 ABBA ABBA 9.11.3.10 O TLV 4-n */ ELEM_OPT_TLV(0x38, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_ABBA, NULL); /*19 Replayed S1 UE security capabilities S1 UE security capability 9.11.3.48A O TLV 4-7 */ ELEM_OPT_TLV(0x19, NAS_PDU_TYPE_EMM, DE_EMM_UE_SEC_CAP, " - Replayed S1 UE security capabilities"); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.26 Security mode complete */ static void nas_5gs_mm_sec_mode_comp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* 77 IMEISV 5G mobile identity 9.11.3.4 O TLV-E 11 */ ELEM_OPT_TLV_E(0x77, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GS_MOBILE_ID, NULL); /* 71 NAS message container NAS message container 9.11.3.33 O TLV-E 4-n */ ELEM_OPT_TLV_E(0x71, NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_NAS_MSG_CONT, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.27 Security mode reject */ static void nas_5gs_mm_sec_mode_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* 5GMM cause 5GMM cause 9.11.3.2 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GMM_CAUSE, NULL, ei_nas_5gs_missing_mandatory_elemen); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.2.28 Security protected 5GS NAS message */ /* * 8.2.29 5GMM status */ static void nas_5gs_mm_5gmm_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: both*/ /* 5GMM cause 5GMM cause 9.11.3.2 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_MM, DE_NAS_5GS_MM_5GMM_CAUSE, NULL, ei_nas_5gs_missing_mandatory_elemen); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* 8.3 5GS session management messages */ /* * 8.3.1 PDU session establishment request */ static void nas_5gs_sm_pdu_ses_est_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: UE to network */ pinfo->link_dir = P2P_DIR_UL; /*Integrity protection maximum data rate Integrity protection maximum data rate 9.11.4.7 M V 2*/ ELEM_MAND_V(NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_INT_PROT_MAX_DATA_RTE, NULL, ei_nas_5gs_missing_mandatory_elemen); /*9- PDU session type PDU session type 9.11.4.5 O TV 1*/ ELEM_OPT_TV_SHORT(0x90, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_PDU_SESSION_TYPE, NULL); /*A- SSC mode SSC mode 9.11.4.9 O TV 1*/ ELEM_OPT_TV_SHORT(0xa0, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_SSC_MODE, NULL); /*28 5GSM capability 5GSM capability 9.11.4.10 O TLV 3-15 */ ELEM_OPT_TLV(0x28, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAP, NULL); /*55 Maximum number of supported packet filter Maximum number of suuported packet filter 9.11.4.9 O TV 3*/ ELEM_OPT_TV(0x55, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_MAX_NUM_SUP_PKT_FLT, NULL); /*39 SM PDU DN request container SM PDU DN request container 9.11.4.15 O TLV 3-255 */ /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV-E 4-65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.2 PDU session establishment accept */ static void nas_5gs_sm_pdu_ses_est_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: network to UE */ pinfo->link_dir = P2P_DIR_DL; proto_tree_add_item(tree, hf_nas_5gs_sm_sel_sc_mode, tvb, offset, 1, ENC_BIG_ENDIAN); /*Selected PDU session type PDU session type 9.11.4.5 M V 1/2 H0*/ ELEM_MAND_V(NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_PDU_SESSION_TYPE, " - Selected PDU session type", ei_nas_5gs_missing_mandatory_elemen); /*Selected SSC mode SSC mode 9.11.4.9 M V 1/2 H1*/ /*Authorized QoS rules QoS rules 9.11.4.6 M LV-E 2-65537 DE_NAS_5GS_SM_QOS_RULES*/ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_QOS_RULES, " - Authorized QoS rules", ei_nas_5gs_missing_mandatory_elemen); /*Session AMBR Session-AMBR 9.11.4.14 M LV 7 */ ELEM_MAND_LV(NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_SESSION_AMBR, NULL, ei_nas_5gs_missing_mandatory_elemen); /*59 5GSM cause 5GSM cause 9.11.4.2 O TV 2*/ ELEM_OPT_TV(0x59, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAUSE, NULL); /*29 PDU address PDU address 9.11.4.4 O TLV 7 */ ELEM_OPT_TLV(0x29, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_PDU_ADDRESS, NULL); /*56 RQ timer value GPRS timer 9.10.2.3 O TV 2*/ ELEM_OPT_TV(0x56, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - RQ timer value"); /*22 S-NSSAI S-NSSAI 9.11.3.37 O TLV 3-6*/ ELEM_OPT_TLV(0x22, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_S_NSSAI, NULL); /* 8- Always-on PDU session indication Always-on PDU session indication 9.11.4.3 O TV 1 */ ELEM_OPT_TV_SHORT(0x80, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_ALWAYS_ON_PDU_SES_IND, NULL); /* 75 Mapped EPS bearer contexts Mapped EPS bearer contexts 9.11.4.9 O TLV-E 7-65538 */ ELEM_OPT_TLV_E(0x75, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_MAPPED_EPS_B_CONT, NULL); /*78 EAP message EAP message 9.11.3.14 O TLV-E 7-1503*/ ELEM_OPT_TLV_E(0x78, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL); /*79 Authorized QoS flow descriptions QoS flow descriptions 9.11.4.12 O TLV-E 6-65538 */ ELEM_OPT_TLV_E(0x79, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_QOS_FLOW_DES, " - Authorized"); /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV-E 4-65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); /* 25 DNN DNN 9.11.2.1A O TLV 3-102 */ ELEM_OPT_TLV(0x25, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_DNN, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.3 PDU session establishment reject */ static void nas_5gs_sm_pdu_ses_est_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: network to UE */ pinfo->link_dir = P2P_DIR_DL; /* 5GSM cause 5GSM cause 9.11.4.2 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAUSE, " - ESM cause", ei_nas_5gs_missing_mandatory_elemen); /*37 Back-off timer value GPRS timer 3 9.10.2.5 O TLV 3 */ ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - Back-off timer value"); /*F- Allowed SSC mode Allowed SSC mode 9.11.4.3 O TV 1*/ ELEM_OPT_TV_SHORT(0xF0, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_ALLOWED_SSC_MODE, NULL); /*78 EAP message EAP message 9.11.3.14 O TLV - E 7 - 1503*/ ELEM_OPT_TLV_E(0x78, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL); /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV - E 4 - 65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.4 PDU session authentication command */ static void nas_5gs_sm_pdu_ses_auth_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: network to UE */ pinfo->link_dir = P2P_DIR_DL; /*EAP message EAP message 9.11.2.2 M LV-E 6-1502 */ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL, ei_nas_5gs_missing_mandatory_elemen); /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV - E 4 - 65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.5 PDU session authentication complete */ static void nas_5gs_sm_pdu_ses_auth_comp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: UE to network */ pinfo->link_dir = P2P_DIR_UL; /*EAP message EAP message 9.11.2.2 M LV-E 6-1502 */ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL, ei_nas_5gs_missing_mandatory_elemen); /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV - E 4 - 65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.6 PDU session authentication result */ #if 0 static void nas_5gs_sm_pdu_ses_auth_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: network to UE */ pinfo->link_dir = P2P_DIR_DL; /*EAP message EAP message 9.11.2.2 M LV-E 6-1502 */ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL, ei_nas_5gs_missing_mandatory_elemen); /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV - E 4 - 65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } #endif /* *8.3.7 PDU session modification request */ static void nas_5gs_sm_pdu_ses_mod_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: UE to network */ pinfo->link_dir = P2P_DIR_UL; /* 28 5GSM capability 5GSM capability 9.11.4.10 O TLV 3-15 */ ELEM_OPT_TLV(0x28, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAP, NULL); /* 59 5GSM cause 5GSM cause 9.11.4.2 O TV 2 */ ELEM_OPT_TLV(0x59, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAUSE, NULL); /*55 Maximum number of suuported packet filter Maximum number of suuported packet filter 9.11.4.6 O TV 3*/ ELEM_OPT_TV(0x55, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_MAX_NUM_SUP_PKT_FLT, NULL); /* B- Always-on PDU session requested Always-on PDU session requested 9.11.4.4 O TV 1 */ ELEM_OPT_TV_SHORT(0xB0, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_ALWAYS_ON_PDU_SES_REQ, NULL); /* 13 Integrity protection maximum data rate Integrity protection maximum data rate 9.11.4.7 O TV 3 */ ELEM_OPT_TV(0x13, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_INT_PROT_MAX_DATA_RTE, NULL); /*7A Requested QoS rules QoS rules 9.11.4.6 O TLV-E 3-65538 */ ELEM_OPT_TLV_E(0x7A, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_QOS_RULES, " - Requested QoS rules"); /* 79 Requested QoS flow descriptions QoS flow descriptions 9.11.4.12 O TLV-E 5-65538 */ ELEM_OPT_TLV_E(0x79, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_QOS_FLOW_DES, " - Authorized"); /* 75 Mapped EPS bearer contexts Mapped EPS bearer contexts 9.11.4.8 O TLV-E 7-65538 */ ELEM_OPT_TLV_E(0x75, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_MAPPED_EPS_B_CONT, NULL); /* 7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV - E 4 - 65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.8 PDU session modification reject */ static void nas_5gs_sm_pdu_ses_mod_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: network to UE */ pinfo->link_dir = P2P_DIR_DL; /* 5GSM cause 5GSM cause 9.11.4.1 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAUSE, NULL, ei_nas_5gs_missing_mandatory_elemen); /*37 Back-off timer value GPRS timer 3 9.11.3.21 O TLV 3 */ ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - Back-off timer value"); /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV - E 4 - 65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.9 PDU session modification command */ static void nas_5gs_sm_pdu_ses_mod_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: network to UE */ pinfo->link_dir = P2P_DIR_DL; /*59 5GSM cause 5GSM cause 9.11.4.2 O TV 2*/ ELEM_OPT_TV(0x59, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAUSE, NULL); /*2A Session AMBR Session-AMBR 9.11.4.14 O TLV 8*/ ELEM_OPT_TLV(0x2A, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_SESSION_AMBR, NULL); /*56 RQ timer value GPRS timer 9.11.4.3 O TV 2*/ ELEM_OPT_TV(0x56, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - PDU session release time"); /* 8- Always-on PDU session indication Always-on PDU session indication 9.11.4.3 O TV 1 */ ELEM_OPT_TV_SHORT(0x80, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_ALWAYS_ON_PDU_SES_IND, NULL); /*7A Authorized QoS rules QoS rules 9.11.4.6 O TLV-E 3-65538*/ ELEM_OPT_TLV_E(0x7A, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_QOS_RULES, " - Authorized QoS rules"); /*75 Mapped EPS bearer contexts Mapped EPS bearer contexts 9.11.4.5 O TLV-E 7-65538*/ ELEM_OPT_TLV_E(0x75, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_MAPPED_EPS_B_CONT, NULL); /*79 Authorized QoS flow descriptions QoS flow descriptions 9.11.4.12 O TLV-E 6-65538*/ ELEM_OPT_TLV_E(0x79, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_QOS_FLOW_DES, " - Authorized"); /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV-E 4-65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.10 PDU session modification complete */ static void nas_5gs_sm_pdu_ses_mod_comp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: UE to network */ pinfo->link_dir = P2P_DIR_UL; /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV - E 4 - 65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); /*59 5GSM cause 5GSM cause 9.11.4.2 O TV 2*/ ELEM_OPT_TV(0x59, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAUSE, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.11 PDU session modification command reject */ static void nas_5gs_sm_pdu_ses_mod_com_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: UE to network */ pinfo->link_dir = P2P_DIR_UL; /* 5GSM cause 5GSM cause 9.11.4.1 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAUSE, NULL, ei_nas_5gs_missing_mandatory_elemen); /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV - E 4 - 65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.12 PDU session release request */ static void nas_5gs_sm_pdu_ses_rel_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: UE to network */ pinfo->link_dir = P2P_DIR_UL; /* 59 5GSM cause 5GSM cause 9.11.4.2 O TV 2 */ ELEM_OPT_TV(0x59, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAUSE, NULL); /* 7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV - E 4 - 65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.13 PDU session release reject */ static void nas_5gs_sm_pdu_ses_rel_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: network to UE */ pinfo->link_dir = P2P_DIR_DL; /* 5GSM cause 5GSM cause 9.11.4.1 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAUSE, NULL, ei_nas_5gs_missing_mandatory_elemen); /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV - E 4 - 65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.14 PDU session release command */ static void nas_5gs_sm_pdu_ses_rel_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: network to UE */ pinfo->link_dir = P2P_DIR_DL; /* 5GSM cause 5GSM cause 9.11.4.2 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAUSE, NULL, ei_nas_5gs_missing_mandatory_elemen); /*37 Back-off timer value GPRS timer 3 9.11.3.21 O TLV 3 */ ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - Back-off timer value"); /*78 EAP message EAP message 9.10.2.2 O TLV - E 7 - 1503*/ ELEM_OPT_TLV_E(0x78, NAS_5GS_PDU_TYPE_COMMON, DE_NAS_5GS_CMN_EAP_MESSAGE, NULL); /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV - E 4 - 65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.15 PDU session release complete */ static void nas_5gs_sm_pdu_ses_rel_comp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: UE to network */ pinfo->link_dir = P2P_DIR_UL; /* 59 5GSM cause 5GSM cause 9.11.4.2 O TV 2 */ ELEM_OPT_TV(0x59, NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAUSE, NULL); /*7B Extended protocol configuration options Extended protocol configuration options 9.11.4.2 O TLV - E 4 - 65538*/ ELEM_OPT_TLV_E(0x7B, NAS_PDU_TYPE_ESM, DE_ESM_EXT_PCO, NULL); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* * 8.3.16 5GSM status */ static void nas_5gs_sm_5gsm_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; /* Direction: both */ /* 5GSM cause 5GSM cause 9.11.4.1 M V 1 */ ELEM_MAND_V(NAS_5GS_PDU_TYPE_SM, DE_NAS_5GS_SM_5GSM_CAUSE, NULL, ei_nas_5gs_missing_mandatory_elemen); EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_nas_5gs_extraneous_data); } /* Traffic descriptor component type identifier */ static const value_string nas_5gs_ursp_traff_desc_component_type_values[] = { { 0x01, "Match-all type" }, { 0x08, "OS Id + OS App Id type" }, { 0x10, "IPv4 remote address type" }, { 0x21, "IPv6 remote address/prefix length type" }, { 0x30, "Protocol identifier/next header type" }, { 0x50, "Single remote port type" }, { 0x51, "Remote port range type" }, { 0x60, "Security parameter index type" }, { 0x70, "Type of service/traffic class type" }, { 0x80, "Flow label type" }, { 0x81, "Destination MAC address type" }, { 0x83, "802.1Q C-TAG VID type" }, { 0x84, "802.1Q S-TAG VID type" }, { 0x85, "802.1Q C-TAG PCP/DEI type" }, { 0x86, "802.1Q S-TAG PCP/DEI type" }, { 0x87, "Ethertype type" }, { 0x88, "DNN type" }, { 0x90, "Connection capabilities type" }, { 0x91, "Destination FQDN" }, { 0xa0, "OS App Id type" }, { 0, NULL } }; static void de_nas_5gs_ursp_traff_desc(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree) { int len = tvb_reported_length(tvb); guint32 traff_desc; int offset = 0; /* Traffic descriptor (octets v+5 to w) The traffic descriptor field is of variable size and contains a variable number (at least one) of traffic descriptor components. Each traffic descriptor component shall be encoded as a sequence of one octet traffic descriptor component type identifier and a traffic descriptor component value field. The traffic descriptor component type identifier shall be transmitted first. */ while (offset < len) { proto_tree_add_item_ret_uint(tree, hf_nas_5gs_ursp_traff_desc, tvb, offset, 1, ENC_BIG_ENDIAN, &traff_desc); offset++; switch (traff_desc) { case 1: /* Match-all type*/ return; /* For "OS Id + OS App Id type", the traffic descriptor component value field shall be encoded as a sequence of a sixteen octet OS Id field, a one octet OS App Id length field, and an OS App Id field. The OS Id field shall be transmitted first. The OS Id field contains a Universally Unique IDentifier (UUID) as specified in IETF RFC 4122 [16]. */ case 0x10: /* IPv4 remote address type */ /* For "IPv4 remote address type", the traffic descriptor component value field shall be encoded as a sequence of a four octet IPv4 address field and a four octet IPv4 address mask field. The IPv4 address field shall be transmitted first. */ proto_tree_add_item(tree, hf_nas_5gs_ursp_traff_desc_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; proto_tree_add_item(tree, hf_nas_5gs_ursp_traff_desc_ipv4_mask, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; break; /* For "IPv6 remote address/prefix length type", the traffic descriptor component value field shall be encoded as a sequence of a sixteen octet IPv6 address field and one octet prefix length field. The IPv6 address field shall be transmitted first. */ case 0x30: /* Protocol identifier/next header type*/ /* For "protocol identifier/next header type", the traffic descriptor component value field shall be encoded as one octet which specifies the IPv4 protocol identifier or Ipv6 next header. */ proto_tree_add_item(tree, hf_nas_5gs_ursp_traff_desc_next_hdr, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; break; /* For "single remote port type", the traffic descriptor component value field shall be encoded as two octets which specify a port number. For "remote port range type", the traffic descriptor component value field shall be encoded as a sequence of a two octet port range low limit field and a two octet port range high limit field. The port range low limit field shall be transmitted first. For "security parameter index type", the traffic descriptor component value field shall be encoded as four octets which specify the IPSec security parameter index. For "type of service/traffic class type", the traffic descriptor component value field shall be encoded as a sequence of a one octet type-of-service/traffic class field and a one octet type-of-service/traffic class mask field. The type-of-service/traffic class field shall be transmitted first. For "flow label type", the traffic descriptor component value field shall be encoded as three octets which specify the IPv6 flow label. The bits 8 through 5 of the first octet shall be spare whereas the remaining 20 bits shall contain the IPv6 flow label. For "destination MAC address type", the traffic descriptor component value field shall be encoded as 6 octets which specify a MAC address. For "802.1Q C-TAG VID type", the traffic descriptor component value field shall be encoded as two octets which specify the VID of the customer-VLAN tag (C-TAG). The bits 8 through 5 of the first octet shall be spare whereas the remaining 12 bits shall contain the VID. For "802.1Q S-TAG VID type", the traffic descriptor component value field shall be encoded as two octets which specify the VID of the service-VLAN tag (S-TAG). The bits 8 through 5 of the first octet shall be spare whereas the remaining 12 bits shall contain the VID. For "802.1Q C-TAG PCP/DEI type", the traffic descriptor component value field shall be encoded as one octet which specifies the 802.1Q C-TAG PCP and DEI. The bits 8 through 5 of the octet shall be spare, and the bits 4 through 2 contain the PCP and bit 1 contains the DEI. For "802.1Q S-TAG PCP/DEI type", the traffic descriptor component value field shall be encoded as one octet which specifies the 802.1Q S-TAG PCP. The bits 8 through 5 of the octet shall be spare, and the bits 4 through 2 contain the PCP and bit 1 contains the DEI. For "ethertype type", the traffic descriptor component value field shall be encoded as two octets which specify an ethertype. For "DNN type", the traffic descriptor component value field shall be encoded as a sequence of a one octet DNN length field and a DNN value field of a variable size. The DNN value contains an APN as defined in 3GPP TS 23.003 [4]. For "connection capabilities” type, the traffic descriptor component value field shall be encoded as a sequence of one octet for number of network capabilities followed by one or more octets, each containing a connection capability identifier encoded as follows: Bits 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 1 IMS 0 0 0 0 0 0 1 0 MMS 0 0 0 0 0 1 0 0 SUPL 0 0 0 0 1 0 0 0 Internet All other values are spare. If received they shall be interpreted as unknown. For "destination FQDN" type, the traffic descriptor component value field shall be encoded as a sequence of one octet destination FQDN length field and a destination FQDN value of variable size. The destination FQDN value field shall be encoded as defined in IETF RFC 1035 [12]. For "OS App Id type", the traffic descriptor component value field shall be encoded as a one octet OS App Id length field and an OS App Id field. */ default: proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, -1); return; } } } /* Route selection descriptor contents (octets b+5 to c) The route selection descriptor contents field is of variable size and contains a variable number (at least one) of route selection descriptor components. Each route selection descriptor component shall be encoded as a sequence of a one octet route selection descriptor component type identifier and a route selection descriptor component value field. The route selection descriptor component type identifier shall be transmitted first. Route selection descriptor component type identifier Bits 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 1 SSC mode type 0 0 0 0 0 0 1 0 S-NSSAI type 0 0 0 0 0 1 0 0 DNN type 0 0 0 0 1 0 0 0 PDU session type type 0 0 0 1 0 0 0 0 Preferred access type type 0 0 0 1 0 0 0 1 Multi-access preference type 0 0 1 0 0 0 0 0 Non-seamless non-3GPP offload indication type All other values are spare. If received they shall be interpreted as unknown. */ static const value_string nas_5gs_ursp_r_sel_desc_comp_type_values[] = { { 0x01, "SSC mode" }, { 0x02, "S-NSSAI" }, { 0x04, "DNN" }, { 0x08, "PDU session type" }, { 0x10, "Preferred access type" }, { 0x11, "Multi-access preference" }, { 0x20, "Non-seamless non-3GPP offload indication" }, { 0, NULL } }; static void de_nas_5gs_ursp_r_sel_desc(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree) { int len = tvb_reported_length(tvb); guint32 type_id; int offset = 0; guint32 length; while (offset < len) { /* Route selection descriptor component type identifier */ proto_tree_add_item_ret_uint(tree, hf_nas_5gs_ursp_ursp_r_sel_desc_comp_type, tvb, offset, 1, ENC_BIG_ENDIAN, &type_id); offset++; switch (type_id) { case 0x01: /* SSC mode*/ /* For "SSC mode type", the route selection descriptor component value field shall be encoded as a one octet SSC mode field. The bits 8 through 4 of the octet shall be spare, and the bits 3 through 1 shall be encoded as the value part of the SSC mode information element defined in subclause 9.11.4.16 of 3GPP TS 24.501. The "SSC mode type" route selection descriptor component shall not appear more than once in the route selection descriptor.*/ proto_tree_add_item(tree, hf_nas_5gs_sm_sc_mode, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; break; case 0x02: /* S-NSSAI type*/ /* For "S-NSSAI type", the route selection descriptor component value field shall be encoded as a sequence of a one octet S-NSSAI length field and an S-NSSAI value field of a variable size. The S-NSSAI value shall be encoded as the value part of NSSAI information element defined in subclause 9.11.3.37 of 3GPP TS 24.501 [11].*/ proto_tree_add_item_ret_uint(tree, hf_nas_5gs_mm_length, tvb, offset, 1, ENC_BIG_ENDIAN, &length); offset++; de_nas_5gs_cmn_s_nssai(tvb, tree, pinfo, offset, length, NULL, 0); offset += length; break; case 0x04: /* DNN */ /* For "DNN type", the route selection descriptor component value field shall be encoded as a sequence of a one octet DNN length field and a DNN value field of a variable size. The DNN value contains an APN as defined in 3GPP TS 23.003.*/ proto_tree_add_item_ret_uint(tree, hf_nas_5gs_ursp_r_sel_desc_dnn_len, tvb, offset, 1, ENC_BIG_ENDIAN, &length); offset++; de_nas_5gs_cmn_dnn(tvb, tree, pinfo, offset, length, NULL, 0); offset += length; break; case 0x08: /* PDU session type*/ /* For "PDU session type type", the route selection descriptor component value field shall be encoded as a one octet PDU session type field. The bits 8 through 4 of the octet shall be spare, and the bits 3 through 1 shall be encoded as the value part of the PDU session type information element defined in subclause 9.11.4.11 of 3GPP TS 24.501. The "PDU session type type" route selection descriptor component shall not appear more than once in the route selection descriptor.*/ proto_tree_add_item(tree, hf_nas_5gs_sm_pdu_session_type, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; break; case 0x10: /* preferred access type type */ /* For "preferred access type type", the route selection descriptor component value field shall be encoded as a one octet preferred access type field. The bits 8 through 3 shall be spare, and the bits 2 and 1 shall be encoded as the value part of the access type information element defined in subclause 9.11.3.11 of 3GPP TS 24.501. The "preferred access type type" route selection descriptor component shall not appear more than once in the route selection descriptor.*/ proto_tree_add_bitmask_list(tree, tvb, offset, 1, nas_5gs_mm_access_type_flags, ENC_BIG_ENDIAN); offset++; break; case 0x11: /* Multi-access preference */ /* For "multi-access preference type", the route selection descriptor component value field shall be of zero length. The "multi-access preference type" route selection descriptor component shall not appear more than once in the route selection descriptor. The "multi-access preference type" route selection descriptor component in the route selection descriptor indicates the multi-access preference.*/ break; case 0x20: /* non-seamless non-3GPP offload indication type */ /* For "non-seamless non-3GPP offload indication type", the route selection descriptor component shall not include the route selection descriptor component value field. The "non-seamless non-3GPP offload indication type" route selection descriptor component shall not appear more than once in the route selection descriptor. If the "non-seamless non-3GPP offload indication type" route selection descriptor component is included in a route selection descriptor, there shall be no route selection descriptor component with a type other than "non-seamless non-3GPP offload indication type" in the route selection descriptor.*/ break; default: proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, -1); return; } } } /* Dissect UE policy part encoded as specified in 3GPP TS 24.526 */ static void de_nas_5gs_ue_policies_ursp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree) { proto_tree* sub_tree, * traff_desc_sub_tree, *r_sel_tree, *r_sel_desc_sub_tree; proto_item* item; guint32 len = tvb_reported_length(tvb); guint32 curr_offset = 0, offset; guint32 list_len, traff_desc_len, r_sel_desc_lst_len, r_sel_desc_len, r_sel_desc_cont_len; int i = 0; while ((curr_offset) < len) { i++; sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, ett_nas_5gs_ue_policies_ursp, &item, "URSP rule %u", i); /* Length of URSP rule octet v octet v+1 */ proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_ursp_rule_len, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &list_len); proto_item_set_len(item, list_len + 2); curr_offset += 2; /* Precedence value of URSP rule octet v+2 */ proto_tree_add_item(sub_tree, hf_nas_5gs_ursp_rule_prec, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset += 1; /* Length of traffic descriptor octet v+3 octet v+4 */ proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_ursp_traff_desc_lst_len, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &traff_desc_len); curr_offset += 2; /* Traffic descriptor octet v+5 octet w */ traff_desc_sub_tree = proto_tree_add_subtree(sub_tree, tvb, curr_offset, traff_desc_len, ett_nas_5gs_ursp_traff_desc, NULL, "Traffic descriptor"); de_nas_5gs_ursp_traff_desc(tvb_new_subset_length(tvb, curr_offset, traff_desc_len), pinfo, traff_desc_sub_tree); curr_offset += traff_desc_len; /* Length of route selection descriptor list octet w+1 octet w+2 */ proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_ursp_r_sel_desc_lst_len, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &r_sel_desc_lst_len); curr_offset += 2; /* Route selection descriptor list */ offset = curr_offset; proto_tree_add_item(sub_tree, hf_nas_5gs_ursp_r_sel_desc_lst, tvb, curr_offset, r_sel_desc_lst_len, ENC_NA); int j = 0; while ((curr_offset - offset) < r_sel_desc_lst_len) { j++; r_sel_tree = proto_tree_add_subtree_format(sub_tree, tvb, curr_offset, -1, ett_nas_5gs_ue_policies_ursp, &item, "Route selection descriptor %u", j); /* Length of route selection descriptor octet b octet b+1 */ proto_tree_add_item_ret_uint(r_sel_tree, hf_nas_5gs_ursp_traff_desc_len, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &r_sel_desc_len); curr_offset += 2; /* Precedence value of route selection descriptor octet b + 2 */ proto_tree_add_item(r_sel_tree, hf_nas_5gs_ursp_r_sel_des_prec, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; /* Length of route selection descriptor contents octet b + 3 octet b + 4 */ proto_tree_add_item_ret_uint(r_sel_tree, hf_nas_5gs_ursp_r_sel_des_cont_len, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &r_sel_desc_cont_len); curr_offset += 2; /* Route selection descriptor contents octet b+5 octet c */ r_sel_desc_sub_tree = proto_tree_add_subtree(r_sel_tree, tvb, curr_offset, r_sel_desc_cont_len, ett_nas_5gs_ursp_r_sel_desc_cont, NULL, "Route selection descriptor contents"); de_nas_5gs_ursp_r_sel_desc(tvb_new_subset_length(tvb, curr_offset, r_sel_desc_cont_len), pinfo, r_sel_desc_sub_tree); curr_offset += r_sel_desc_cont_len; } curr_offset = offset + r_sel_desc_lst_len; } } /* D.6.2 UE policy section management list */ static const value_string nas_5gs_updp_ue_policy_part_type_vals[] = { { 0x0, "Reserved"}, { 0x1, "URSP"}, { 0x2, "ANDSP"}, { 0, NULL } }; static guint16 de_nas_5gs_updp_ue_policy_section_mgm_lst(tvbuff_t* tvb, proto_tree* tree, packet_info* pinfo, guint32 offset, guint len, gchar* add_string _U_, int string_len _U_) { proto_tree *sub_tree, *sub_tree2, *sub_tree3; proto_item* item; guint32 curr_offset = offset; guint32 sub_list_len, instr_len, policy_len; /* UE policy section management list contents Octet 4 - Octet z*/ while ((curr_offset - offset) < len) { int i = 0; /* UE policy section management sublist (PLMN X) */ i++; sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, ett_nas_5gs_updp_ue_policy_section_mgm_lst, &item, "UE policy section management sublist (PLMN %u)", i); /* Length of UE policy section management sublist */ proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_updp_ue_pol_sect_sublst_len, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &sub_list_len); proto_item_set_len(item, sub_list_len + 2); curr_offset += 2; /* MCC digit 2 MCC digit 1 * MNC digit 3 MCC digit 3 * MNC digit 2 MNC digit 1 */ curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, curr_offset, E212_NONE, TRUE); /* UE policy section management sublist contents*/ /* Instruction X */ int j = 1; sub_list_len = sub_list_len - 3; while (sub_list_len > 0){ sub_tree2 = proto_tree_add_subtree_format(sub_tree, tvb, curr_offset, -1, ett_nas_5gs_updp_ue_policy_section_mgm_sublst, &item, "Instruction %u", j); /* Instruction contents length */ proto_tree_add_item_ret_uint(sub_tree2, hf_nas_5gs_updp_instr_len, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &instr_len); curr_offset += 2; /* UPSC */ proto_tree_add_item(sub_tree2, hf_nas_5gs_updp_upsc, tvb, curr_offset, 2, ENC_BIG_ENDIAN); curr_offset += 2; proto_item_set_len(item, instr_len + 2); /* UE policy section contents */ sub_list_len = sub_list_len - instr_len - 2; instr_len = instr_len - 2; int k = 1; while (instr_len > 0) { guint32 ue_policy_type; sub_tree3 = proto_tree_add_subtree_format(sub_tree2, tvb, curr_offset, -1, ett_nas_5gs_updp_ue_policy_section_mgm_sublst, &item, "UE policy part %u", k); /* UE policy part contents length */ proto_tree_add_item_ret_uint(sub_tree3, hf_nas_5gs_updp_policy_len, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &policy_len); curr_offset += 2; proto_item_set_len(item, policy_len + 2); /* UE policy part type */ proto_tree_add_item_ret_uint(sub_tree3, hf_nas_5gs_updp_ue_policy_part_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &ue_policy_type); curr_offset++; /* UE policy part contents, This field contains a UE policy part encoded as specified in 3GPP TS 24.526 */ switch (ue_policy_type) { case 1: /* 5.2 Encoding of UE policy part type URSP */ de_nas_5gs_ue_policies_ursp(tvb_new_subset_length(tvb, curr_offset, policy_len - 1), pinfo, sub_tree3); break; default: proto_tree_add_item(sub_tree3, hf_nas_5gs_updp_ue_policy_part_cont, tvb, curr_offset, policy_len - 1, ENC_NA); break; } curr_offset += (policy_len - 1); instr_len = instr_len - (policy_len + 2); k++; } j++; } } return len; } /* D.6.3 UE policy section management result */ static guint16 de_nas_5gs_updp_ue_policy_section_mgm_res(tvbuff_t* tvb, proto_tree* tree, packet_info* pinfo, guint32 offset, guint len, gchar* add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* D.6.4 UPSI list */ static guint16 de_nas_5gs_updp_upsi_list(tvbuff_t* tvb, proto_tree* tree, packet_info* pinfo, guint32 offset, guint len, gchar* add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* D.6.5 UE policy classmark */ static guint16 de_nas_5gs_updp_ue_policy_cm(tvbuff_t* tvb, proto_tree* tree, packet_info* pinfo, guint32 offset, guint len, gchar* add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* D.6.6 UE OS Id */ static guint16 de_nas_5gs_updp_ue_os_id(tvbuff_t* tvb, proto_tree* tree, packet_info* pinfo, guint32 offset, guint len, gchar* add_string _U_, int string_len _U_) { proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len); return len; } /* D.6 Information elements coding */ typedef enum { DE_NAS_5GS_UPDP_UE_POLICY_SECTION_MGM_LST, /* D.6.2 UE policy section management list */ DE_NAS_5GS_UPDP_UE_POLICY_SECTION_MGM_RES, /* D.6.3 UE policy section management result */ DE_NAS_5GS_UPDP_UPSI_LIST, /* D.6.4 UPSI list */ DE_NAS_5GS_UPDP_UE_POLICY_CM, /* D.6.5 UE policy classmark */ DE_NAS_5GS_UPDP_UE_OS_ID, /* D.6.6 UE OS Id */ DE_NAS_5GS_UPDP_NONE /* NONE */ } nas_5gs_updp_elem_idx_t; static const value_string nas_5gs_updp_elem_strings[] = { { DE_NAS_5GS_UPDP_UE_POLICY_SECTION_MGM_LST, "UE policy section management list" }, /* D.6.2 UE policy section management list */ { DE_NAS_5GS_UPDP_UE_POLICY_SECTION_MGM_RES, "UE policy section management result" }, /* D.6.3 UE policy section management result */ { DE_NAS_5GS_UPDP_UPSI_LIST, "UPSI list" }, /* D.6.4 UPSI list */ { DE_NAS_5GS_UPDP_UE_POLICY_CM, "UE policy classmark" }, /* D.6.5 UE policy classmark */ { DE_NAS_5GS_UPDP_UE_OS_ID, "UE OS Id" }, /* D.6.6 UE OS Id */ { 0, NULL } }; value_string_ext nas_5gs_updp_elem_strings_ext = VALUE_STRING_EXT_INIT(nas_5gs_updp_elem_strings); #define NUM_NAS_5GS_UPDP_ELEM (sizeof(nas_5gs_updp_elem_strings)/sizeof(value_string)) gint ett_nas_5gs_updp_elem[NUM_NAS_5GS_UPDP_ELEM]; guint16(*nas_5gs_updp_elem_fcn[])(tvbuff_t* tvb, proto_tree* tree, packet_info* pinfo, guint32 offset, guint len, gchar* add_string, int string_len) = { /* 5GS session management (5GSM) information elements */ de_nas_5gs_updp_ue_policy_section_mgm_lst, /* D.6.2 UE policy section management list */ de_nas_5gs_updp_ue_policy_section_mgm_res, /* D.6.3 UE policy section management result */ de_nas_5gs_updp_upsi_list, /* D.6.4 UPSI list */ de_nas_5gs_updp_ue_policy_cm, /* D.6.5 UE policy classmark */ de_nas_5gs_updp_ue_os_id, /* D.6.6 UE OS Id */ NULL, /* NONE */ }; /* D.5.1 Manage UE policy command */ static void nas_5gs_updp_manage_ue_policy_cmd(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; /* Direction: network to UE */ pinfo->link_dir = P2P_DIR_DL; /* UE policy section management list UE policy section management list D.6.2 M LV-E 11-65537 */ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_UPDP, DE_NAS_5GS_UPDP_UE_POLICY_SECTION_MGM_LST, NULL, ei_nas_5gs_missing_mandatory_elemen); } /* D.5.2 Manage UE policy complete */ /* Direction: UE to network No data */ static void nas_5gs_updp_manage_ue_policy_cmd_cmpl(tvbuff_t* tvb _U_, proto_tree* tree _U_, packet_info* pinfo, guint32 offset _U_, guint len _U_) { /* Direction: UE to network */ pinfo->link_dir = P2P_DIR_UL; /* No data */ } /* D.5.3 Manage UE policy command reject*/ static void nas_5gs_updp_manage_ue_policy_cmd_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; /* Direction: UE to network */ pinfo->link_dir = P2P_DIR_UL; /* UE policy section management result UE policy section management result D.6.3 M LV-E 11-65537 */ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_UPDP, DE_NAS_5GS_UPDP_UE_POLICY_SECTION_MGM_RES, NULL, ei_nas_5gs_missing_mandatory_elemen); } /* D.5.4 UE state indication */ static void nas_5gs_updp_ue_state_indication(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; /* Direction: UE to network */ pinfo->link_dir = P2P_DIR_UL; /* UPSI list UPSI list D.6.4 M LV-E 9-65537*/ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_UPDP, DE_NAS_5GS_UPDP_UPSI_LIST, NULL, ei_nas_5gs_missing_mandatory_elemen); /* UE policy classmark UE policy classmark D.6.5 M LV 2 - 4*/ ELEM_MAND_LV(NAS_5GS_PDU_TYPE_UPDP, DE_NAS_5GS_UPDP_UE_POLICY_CM, NULL, ei_nas_5gs_missing_mandatory_elemen); /* XX UE OS Id OS Id D.6.6 O TLV 18 - 242*/ /*ELEM_OPT_TLV(0xff, NAS_5GS_PDU_TYPE_UPDP, DE_NAS_5GS_UPDP_UE_OS_ID, NULL);*/ /* UE policy section management result UE policy section management result D.6.3 M LV-E 11-65537 */ ELEM_MAND_LV_E(NAS_5GS_PDU_TYPE_UPDP, DE_NAS_5GS_UPDP_UE_POLICY_SECTION_MGM_RES, NULL, ei_nas_5gs_missing_mandatory_elemen); } /* 9.7 Message type */ /* 5GS mobility management messages */ static const value_string nas_5gs_mm_message_type_vals[] = { { 0x41, "Registration request"}, { 0x42, "Registration accept"}, { 0x43, "Registration complete"}, { 0x44, "Registration reject"}, { 0x45, "Deregistration request (UE originating)"}, { 0x46, "Deregistration accept (UE originating)"}, { 0x47, "Deregistration request (UE terminated)"}, { 0x48, "Deregistration accept (UE terminated)"}, { 0x49, "Not used in current version"}, { 0x4a, "Not used in current version" }, { 0x4b, "Not used in current version" }, { 0x4c, "Service request"}, { 0x4d, "Service reject"}, { 0x4e, "Service accept"}, { 0x4f, "Not used in current version" }, { 0x50, "Not used in current version" }, { 0x51, "Not used in current version" }, { 0x52, "Not used in current version" }, { 0x53, "Not used in current version" }, { 0x54, "Configuration update command"}, { 0x55, "Configuration update complete"}, { 0x56, "Authentication request"}, { 0x57, "Authentication response"}, { 0x58, "Authentication reject"}, { 0x59, "Authentication failure"}, { 0x5a, "Authentication result"}, { 0x5b, "Identity request"}, { 0x5c, "Identity response"}, { 0x5d, "Security mode command"}, { 0x5e, "Security mode complete"}, { 0x5f, "Security mode reject"}, { 0x60, "Not used in current version" }, { 0x61, "Not used in current version" }, { 0x62, "Not used in current version" }, { 0x63, "Not used in current version" }, { 0x64, "5GMM status"}, { 0x65, "Notification"}, { 0x66, "Notification response" }, { 0x67, "UL NAS transport"}, { 0x68, "DL NAS transport"}, { 0, NULL } }; static value_string_ext nas_5gs_mm_msg_strings_ext = VALUE_STRING_EXT_INIT(nas_5gs_mm_message_type_vals); #define NUM_NAS_5GS_MM_MSG (sizeof(nas_5gs_mm_message_type_vals)/sizeof(value_string)) static gint ett_nas_5gs_mm_msg[NUM_NAS_5GS_MM_MSG]; static void(*nas_5gs_mm_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len) = { nas_5gs_mm_registration_req, /* 0x41 Registration request */ nas_5gs_mm_registration_accept, /* 0x42 Registration accept */ nas_5gs_mm_registration_complete, /* 0x43 Registration complete */ nas_5gs_mm_registration_rej, /* 0x44 Registration reject */ nas_5gs_mm_de_reg_req_ue_orig, /* 0x45 Deregistration request (UE originating) */ NULL, /* 0x46 Deregistration accept (UE originating) No data*/ nas_5gs_mm_de_registration_req_ue_term, /* 0x47 Deregistration request (UE terminated) */ NULL, /* 0x48 Deregistration accept (UE terminated) No data */ nas_5gs_exp_not_dissected_yet, /* 0x49 Not used in current version */ nas_5gs_exp_not_dissected_yet, /* 0x4a Not used in current version */ nas_5gs_exp_not_dissected_yet, /* 0x4b Not used in current version */ nas_5gs_mm_service_req, /* 0x4c Service request */ nas_5gs_mm_service_rej, /* 0x4d Service reject */ nas_5gs_mm_service_acc, /* 0x4e Service accept */ nas_5gs_exp_not_dissected_yet, /* 0x4f Not used in current version */ nas_5gs_exp_not_dissected_yet, /* 0x50 Not used in current version */ nas_5gs_exp_not_dissected_yet, /* 0x51 Not used in current version */ nas_5gs_exp_not_dissected_yet, /* 0x52 Not used in current version */ nas_5gs_exp_not_dissected_yet, /* 0x53 Not used in current version */ nas_5gs_mm_conf_upd_cmd, /* 0x54 Configuration update command */ nas_5gs_mm_conf_update_comp, /* 0x55 Configuration update complete */ nas_5gs_mm_authentication_req, /* 0x56 Authentication request */ nas_5gs_mm_authentication_resp, /* 0x57 Authentication response */ nas_5gs_mm_authentication_rej, /* 0x58 Authentication reject */ nas_5gs_mm_authentication_failure, /* 0x59 Authentication failure */ nas_5gs_mm_authentication_result, /* 0x5a Authentication result */ nas_5gs_mm_id_req, /* 0x5b Identity request */ nas_5gs_mm_id_resp, /* 0x5c Identity response */ nas_5gs_mm_sec_mode_cmd, /* 0x5d Security mode command */ nas_5gs_mm_sec_mode_comp, /* 0x5e Security mode complete */ nas_5gs_mm_sec_mode_rej, /* 0x5f Security mode reject */ nas_5gs_exp_not_dissected_yet, /* 0x60 Not used in current version */ nas_5gs_exp_not_dissected_yet, /* 0x61 Not used in current version */ nas_5gs_exp_not_dissected_yet, /* 0x62 Not used in current version */ nas_5gs_exp_not_dissected_yet, /* 0x63 Not used in current version */ nas_5gs_mm_5gmm_status, /* 0x64 5GMM status */ nas_5gs_mm_notification, /* 0x65 Notification */ nas_5gs_mm_notification_resp, /* 0x66 Notification */ nas_5gs_mm_ul_nas_transp, /* 0x67 UL NAS transport */ nas_5gs_mm_dl_nas_transp, /* 0x68 DL NAS transport */ NULL, /* NONE */ }; /* 5GS session management messages */ static const value_string nas_5gs_sm_message_type_vals[] = { { 0xc1, "PDU session establishment request"}, { 0xc2, "PDU session establishment accept"}, { 0xc3, "PDU session establishment reject"}, { 0xc4, "Not used in current version"}, { 0xc5, "PDU session authentication command"}, { 0xc6, "PDU session authentication complete" }, { 0xc7, "PDU session authentication result" }, { 0xc8, "Not used in current version" }, { 0xc9, "PDU session modification request"}, { 0xca, "PDU session modification reject"}, { 0xcb, "PDU session modification command"}, { 0xcc, "PDU session modification complete" }, { 0xcd, "PDU session modification command reject"}, { 0xce, "Not used in current version" }, { 0xcf, "Not used in current version" }, { 0xd0, "Not used in current version" }, { 0xd1, "PDU session release request"}, { 0xd2, "PDU session release reject"}, { 0xd3, "PDU session release command"}, { 0xd4, "PDU session release complete"}, { 0xd5, "Not used in current version" }, { 0xd6, "5GSM status"}, { 0, NULL } }; static value_string_ext nas_5gs_sm_msg_strings_ext = VALUE_STRING_EXT_INIT(nas_5gs_sm_message_type_vals); #define NUM_NAS_5GS_SM_MSG (sizeof(nas_5gs_sm_message_type_vals)/sizeof(value_string)) static gint ett_nas_5gs_sm_msg[NUM_NAS_5GS_SM_MSG]; static void(*nas_5gs_sm_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len) = { nas_5gs_sm_pdu_ses_est_req, /* 0xc1 PDU session establishment request */ nas_5gs_sm_pdu_ses_est_acc, /* 0xc2 PDU session establishment accept */ nas_5gs_sm_pdu_ses_est_rej, /* 0xc3 PDU session establishment reject */ nas_5gs_exp_not_dissected_yet, /* 0xc4 Not used in current version */ nas_5gs_sm_pdu_ses_auth_cmd, /* 0xc5 PDU session authentication command */ nas_5gs_sm_pdu_ses_auth_comp, /* 0xc6 PDU session authentication complete */ nas_5gs_exp_not_dissected_yet, /* 0xc7 Not used in current version */ nas_5gs_exp_not_dissected_yet, /* 0xc8 Not used in current version */ nas_5gs_sm_pdu_ses_mod_req, /* 0xc9 PDU session modification request */ nas_5gs_sm_pdu_ses_mod_rej, /* 0xca PDU session modification reject */ nas_5gs_sm_pdu_ses_mod_cmd, /* 0xcb PDU session modification command */ nas_5gs_sm_pdu_ses_mod_comp, /* 0xcc PDU session modification complete */ nas_5gs_sm_pdu_ses_mod_com_rej, /* 0xcd PDU session modification command reject */ nas_5gs_exp_not_dissected_yet, /* 0xce Not used in current version */ nas_5gs_exp_not_dissected_yet, /* 0xcf Not used in current version */ nas_5gs_exp_not_dissected_yet, /* 0xd0 Not used in current version */ nas_5gs_sm_pdu_ses_rel_req, /* 0xd1 PDU session release request */ nas_5gs_sm_pdu_ses_rel_rej, /* 0xd2 PDU session release reject */ nas_5gs_sm_pdu_ses_rel_cmd, /* 0xd3 PDU session release command */ nas_5gs_sm_pdu_ses_rel_comp, /* 0xd4 PDU session release complete */ nas_5gs_exp_not_dissected_yet, /* 0xd5 Not used in current version */ nas_5gs_sm_5gsm_status, /* 0xd6 5GSM status */ NULL, /* NONE */ }; /* Table D.6.1.1: UE policy delivery service message type */ static const value_string nas_5gs_updp_msg_strings[] = { { 0x0, "Reserved"}, { 0x1, "MANAGE UE POLICY COMMAND"}, { 0x2, "MANAGE UE POLICY COMPLETE"}, { 0x3, "MANAGE UE POLICY COMMAND REJECT"}, { 0x4, "UE STATE INDICATION"}, { 0, NULL } }; static value_string_ext nas_5gs_updp_msg_strings_ext = VALUE_STRING_EXT_INIT(nas_5gs_updp_msg_strings); #define NUM_NAS_5GS_UPDP_MSG (sizeof(nas_5gs_updp_msg_strings)/sizeof(value_string)) static gint ett_nas_5gs_updp_msg[NUM_NAS_5GS_UPDP_MSG]; static void(*nas_5gs_updp_msg_fcn[])(tvbuff_t* tvb, proto_tree* tree, packet_info* pinfo, guint32 offset, guint len) = { nas_5gs_exp_not_dissected_yet, /* 0x0 Reserved */ nas_5gs_updp_manage_ue_policy_cmd, /* 0x1 MANAGE UE POLICY COMMAND */ nas_5gs_updp_manage_ue_policy_cmd_cmpl,/* 0x2 MANAGE UE POLICY COMPLETE */ nas_5gs_updp_manage_ue_policy_cmd_rej, /* 0x3 MANAGE UE POLICY COMMAND REJECT */ nas_5gs_updp_ue_state_indication, /* 0x4 UE STATE INDICATION */ NULL, /* NONE */ }; static void get_nas_5gsmm_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *msg_fcn_p) { gint idx; *msg_str = try_val_to_str_idx_ext((guint32)(oct & 0xff), &nas_5gs_mm_msg_strings_ext, &idx); *hf_idx = hf_nas_5gs_mm_msg_type; if (*msg_str != NULL) { *ett_tree = ett_nas_5gs_mm_msg[idx]; *msg_fcn_p = nas_5gs_mm_msg_fcn[idx]; } return; } static void get_nas_5gssm_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *msg_fcn_p) { gint idx; *msg_str = try_val_to_str_idx_ext((guint32)(oct & 0xff), &nas_5gs_sm_msg_strings_ext, &idx); *hf_idx = hf_nas_5gs_sm_msg_type; if (*msg_str != NULL) { *ett_tree = ett_nas_5gs_sm_msg[idx]; *msg_fcn_p = nas_5gs_sm_msg_fcn[idx]; } return; } static void get_nas_5gs_updp_msg_params(guint8 oct, const gchar** msg_str, int* ett_tree, int* hf_idx, msg_fcn* msg_fcn_p) { gint idx; *msg_str = try_val_to_str_idx_ext((guint32)(oct & 0xff), &nas_5gs_updp_msg_strings_ext, &idx); *hf_idx = hf_nas_5gs_updp_msg_type; if (*msg_str != NULL) { *ett_tree = ett_nas_5gs_updp_msg[idx]; *msg_fcn_p = nas_5gs_updp_msg_fcn[idx]; } return; } static void dissect_nas_5gs_sm_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) { const gchar *msg_str; guint32 len; gint ett_tree; int hf_idx; void(*msg_fcn_p)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len); guint8 oct; len = tvb_reported_length(tvb); /* Message type IE*/ oct = tvb_get_guint8(tvb, offset); msg_fcn_p = NULL; ett_tree = -1; hf_idx = -1; msg_str = NULL; get_nas_5gssm_msg_params(oct, &msg_str, &ett_tree, &hf_idx, &msg_fcn_p); if (msg_str) { col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, msg_str); } else { proto_tree_add_expert_format(tree, pinfo, &ei_nas_5gs_sm_unknown_msg_type, tvb, offset, 1, "Unknown Message Type 0x%02x", oct); return; } /* * Add NAS message name */ proto_tree_add_item(tree, hf_idx, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; /* * decode elements */ if (msg_fcn_p == NULL) { if (tvb_reported_length_remaining(tvb, offset)) { proto_tree_add_item(tree, hf_nas_5gs_msg_elems, tvb, offset, len - offset, ENC_NA); } } else { (*msg_fcn_p)(tvb, tree, pinfo, offset, len - offset); } } static void disect_nas_5gs_mm_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) { const gchar *msg_str; guint32 len; gint ett_tree; int hf_idx; void(*msg_fcn_p)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len); guint8 oct; len = tvb_reported_length(tvb); /* Message type IE*/ oct = tvb_get_guint8(tvb, offset); msg_fcn_p = NULL; ett_tree = -1; hf_idx = -1; msg_str = NULL; get_nas_5gsmm_msg_params(oct, &msg_str, &ett_tree, &hf_idx, &msg_fcn_p); if (msg_str) { col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, msg_str); } else { proto_tree_add_expert_format(tree, pinfo, &ei_nas_5gs_mm_unknown_msg_type, tvb, offset, 1, "Unknown Message Type 0x%02x", oct); return; } /* * Add NAS message name */ proto_tree_add_item(tree, hf_idx, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; /* * decode elements */ if (msg_fcn_p == NULL) { if (tvb_reported_length_remaining(tvb, offset)) { proto_tree_add_item(tree, hf_nas_5gs_msg_elems, tvb, offset, len - offset, ENC_NA); } } else { (*msg_fcn_p)(tvb, tree, pinfo, offset, len - offset); } } /* UPDP */ /* D.6.1 UE policy delivery service message type */ static void disect_nas_5gs_updp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, int offset) { const gchar* msg_str; guint32 len; gint ett_tree; int hf_idx; void(*msg_fcn_p)(tvbuff_t * tvb, proto_tree * tree, packet_info * pinfo, guint32 offset, guint len); guint8 oct; len = tvb_reported_length(tvb); /* 9.6 Procedure transaction identity * Bits 1 to 8 of the third octet of every 5GSM message contain the procedure transaction identity. * The procedure transaction identity and its use are defined in 3GPP TS 24.007 * XXX Only 5GSM ? */ proto_tree_add_item(tree, hf_nas_5gs_proc_trans_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; /* Message type IE*/ oct = tvb_get_guint8(tvb, offset); msg_fcn_p = NULL; ett_tree = -1; hf_idx = -1; msg_str = NULL; get_nas_5gs_updp_msg_params(oct, &msg_str, &ett_tree, &hf_idx, &msg_fcn_p); if (msg_str) { col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, msg_str); } else { proto_tree_add_expert_format(tree, pinfo, &ei_nas_5gs_updp_unknown_msg_type, tvb, offset, 1, "Unknown Message Type 0x%02x", oct); return; } /* * Add PDCP message name */ proto_tree_add_item(tree, hf_idx, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; /* * decode elements */ if (msg_fcn_p == NULL) { if (tvb_reported_length_remaining(tvb, offset)) { proto_tree_add_item(tree, hf_nas_5gs_msg_elems, tvb, offset, len - offset, ENC_NA); } } else { (*msg_fcn_p)(tvb, tree, pinfo, offset, len - offset); } } const value_string nas_5gs_pdu_session_id_vals[] = { { 0x00, "No PDU session identity assigned" }, { 0x01, "Reserved" }, { 0x02, "Reserved" }, { 0x03, "Reserved" }, { 0x04, "Reserved" }, { 0x05, "PDU session identity value 5" }, { 0x06, "PDU session identity value 6" }, { 0x07, "PDU session identity value 7" }, { 0x08, "PDU session identity value 8" }, { 0x09, "PDU session identity value 9" }, { 0x0a, "PDU session identity value 10" }, { 0x0b, "PDU session identity value 11" }, { 0x0c, "PDU session identity value 12" }, { 0x0d, "PDU session identity value 13" }, { 0x0e, "PDU session identity value 14" }, { 0x0f, "PDU session identity value 15" }, { 0, NULL } }; static int dissect_nas_5gs_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, void* data _U_) { proto_tree *sub_tree; guint32 epd; /* Plain NAS 5GS Message */ sub_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nas_5gs_plain, NULL, "Plain NAS 5GS Message"); /* Extended protocol discriminator octet 1 */ proto_tree_add_item_ret_uint(sub_tree, hf_nas_5gs_epd, tvb, offset, 1, ENC_BIG_ENDIAN, &epd); offset++; /* Security header type associated with a spare half octet; or * PDU session identity octet 2 */ switch (epd) { case TGPP_PD_5GMM: /* 9.5 Spare half octet * Bits 5 to 8 of the second octet of every 5GMM message contains the spare half octet * which is filled with spare bits set to zero. */ proto_tree_add_item(sub_tree, hf_nas_5gs_spare_half_octet, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(sub_tree, hf_nas_5gs_security_header_type, tvb, offset, 1, ENC_BIG_ENDIAN); break; case TGPP_PD_5GSM: /* 9.4 PDU session identity * Bits 1 to 8 of the second octet of every 5GSM message contain the PDU session identity IE. * The PDU session identity and its use to identify a message flow are defined in 3GPP TS 24.007 */ proto_tree_add_item(sub_tree, hf_nas_5gs_pdu_session_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; /* 9.6 Procedure transaction identity * Bits 1 to 8 of the third octet of every 5GSM message contain the procedure transaction identity. * The procedure transaction identity and its use are defined in 3GPP TS 24.007 * XXX Only 5GSM ? */ proto_tree_add_item(sub_tree, hf_nas_5gs_proc_trans_id, tvb, offset, 1, ENC_BIG_ENDIAN); break; default: proto_tree_add_expert_format(sub_tree, pinfo, &ei_nas_5gs_unknown_pd, tvb, offset, -1, "Not a NAS 5GS PD %u (%s)", epd, val_to_str_const(epd, nas_5gs_epd_vals, "Unknown")); return 0; } offset++; switch (epd) { case TGPP_PD_5GMM: /* 5GS mobility management messages */ disect_nas_5gs_mm_msg(tvb, pinfo, sub_tree, offset); break; case TGPP_PD_5GSM: /* 5GS session management messages. */ dissect_nas_5gs_sm_msg(tvb, pinfo, sub_tree, offset); break; default: DISSECTOR_ASSERT_NOT_REACHED(); break; } return tvb_reported_length(tvb); } static int dissect_nas_5gs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { proto_item *item; proto_tree *nas_5gs_tree, *sub_tree; int offset = 0; guint8 seq_hdr_type, ext_pd; /* make entry in the Protocol column on summary display */ col_append_sep_str(pinfo->cinfo, COL_PROTOCOL, "/", "NAS-5GS"); item = proto_tree_add_item(tree, proto_nas_5gs, tvb, 0, -1, ENC_NA); nas_5gs_tree = proto_item_add_subtree(item, ett_nas_5gs); /* Extended protocol discriminator octet 1 */ ext_pd = tvb_get_guint8(tvb, offset); if (ext_pd == TGPP_PD_5GSM) { return dissect_nas_5gs_common(tvb, pinfo, nas_5gs_tree, offset, data); } /* Security header type associated with a spare half octet; or * PDU session identity octet 2 */ /* Determine if it's a plain 5GS NAS Message or not */ seq_hdr_type = tvb_get_guint8(tvb, offset + 1); if (seq_hdr_type == NAS_5GS_PLAN_NAS_MSG) { return dissect_nas_5gs_common(tvb, pinfo, nas_5gs_tree, offset, data); } /* Security protected NAS 5GS message*/ sub_tree = proto_tree_add_subtree(nas_5gs_tree, tvb, offset, 7, ett_nas_5gs_sec, NULL, "Security protected NAS 5GS message"); /* Extended protocol discriminator octet 1 */ proto_tree_add_item(sub_tree, hf_nas_5gs_epd, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; /* Security header type associated with a spare half octet octet 2 */ proto_tree_add_item(sub_tree, hf_nas_5gs_spare_half_octet, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(sub_tree, hf_nas_5gs_security_header_type, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; /* Message authentication code octet 3 - 6 */ proto_tree_add_item(sub_tree, hf_nas_5gs_msg_auth_code, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; /* Sequence number octet 7 */ proto_tree_add_item(sub_tree, hf_nas_5gs_seq_no, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; /* XXX Check if encryted or not and if not call dissect_nas_5gs_common()*/ if (g_nas_5gs_null_decipher) { return dissect_nas_5gs_common(tvb, pinfo, nas_5gs_tree, offset, data); } else { proto_tree_add_subtree(nas_5gs_tree, tvb, offset, -1, ett_nas_5gs_enc, NULL, "Encrypted data"); } return tvb_reported_length(tvb); } static true_false_string nas_5gs_kacf_tfs = { "A new K_AMF has been calculated by the network", "A new K_AMF has not been calculated by the network" }; void de_nas_5gs_intra_n1_mode_nas_transparent_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_) { int offset = 0; static const int * flags[] = { &hf_nas_5gs_spare_b7, &hf_nas_5gs_spare_b6, &hf_nas_5gs_spare_b5, &hf_nas_5gs_kacf, &hf_nas_5gs_mm_tsc, &hf_nas_5gs_mm_nas_key_set_id, NULL }; proto_tree_add_item(tree, hf_nas_5gs_msg_auth_code, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; proto_tree_add_item(tree, hf_nas_5gs_mm_nas_sec_algo_enc, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_nas_5gs_mm_nas_sec_algo_ip, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_NA); offset++; proto_tree_add_item(tree, hf_nas_5gs_seq_no, tvb, offset, 1, ENC_BIG_ENDIAN); } void de_nas_5gs_n1_mode_to_s1_mode_nas_transparent_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_) { proto_tree_add_item(tree, hf_nas_5gs_seq_no, tvb, 0, 1, ENC_BIG_ENDIAN); } void de_nas_5gs_s1_mode_to_n1_mode_nas_transparent_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_) { int offset = 0; static const int * oct8_flags[] = { &hf_nas_5gs_spare_b7, &hf_nas_5gs_ncc, &hf_nas_5gs_mm_tsc, &hf_nas_5gs_mm_nas_key_set_id, NULL }; static const int * oct9_flags[] = { &hf_nas_5gs_mm_5g_ea0, &hf_nas_5gs_mm_128_5g_ea1, &hf_nas_5gs_mm_128_5g_ea2, &hf_nas_5gs_mm_128_5g_ea3, &hf_nas_5gs_mm_5g_ea4, &hf_nas_5gs_mm_5g_ea5, &hf_nas_5gs_mm_5g_ea6, &hf_nas_5gs_mm_5g_ea7, NULL }; static const int * oct10_flags[] = { &hf_nas_5gs_mm_5g_ia0, &hf_nas_5gs_mm_5g_128_ia1, &hf_nas_5gs_mm_5g_128_ia2, &hf_nas_5gs_mm_5g_128_ia3, &hf_nas_5gs_mm_5g_ia4, &hf_nas_5gs_mm_5g_ia5, &hf_nas_5gs_mm_5g_ia6, &hf_nas_5gs_mm_5g_ia7, NULL }; static const int * oct11_flags[] = { &hf_nas_5gs_mm_eea0, &hf_nas_5gs_mm_128eea1, &hf_nas_5gs_mm_128eea2, &hf_nas_5gs_mm_eea3, &hf_nas_5gs_mm_eea4, &hf_nas_5gs_mm_eea5, &hf_nas_5gs_mm_eea6, &hf_nas_5gs_mm_eea7, NULL }; static const int * oct12_flags[] = { &hf_nas_5gs_mm_eia0, &hf_nas_5gs_mm_128eia1, &hf_nas_5gs_mm_128eia2, &hf_nas_5gs_mm_eia3, &hf_nas_5gs_mm_eia4, &hf_nas_5gs_mm_eia5, &hf_nas_5gs_mm_eia6, &hf_nas_5gs_mm_eia7, NULL }; proto_tree_add_item(tree, hf_nas_5gs_msg_auth_code, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; proto_tree_add_item(tree, hf_nas_5gs_mm_nas_sec_algo_enc, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_nas_5gs_mm_nas_sec_algo_ip, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_bitmask_list(tree, tvb, offset, 1, oct8_flags, ENC_NA); offset++; proto_tree_add_bitmask_list(tree, tvb, offset, 1, oct9_flags, ENC_NA); offset++; proto_tree_add_bitmask_list(tree, tvb, offset, 1, oct10_flags, ENC_NA); offset++; if (tvb_reported_length_remaining(tvb, offset) > 0) { proto_tree_add_bitmask_list(tree, tvb, offset, 1, oct11_flags, ENC_NA); offset++; proto_tree_add_bitmask_list(tree, tvb, offset, 1, oct12_flags, ENC_NA); } } /* 3GPP TS 29.518 chapter 6.1.6.4.2 */ static int dissect_nas_5gs_media_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { int ret; char *json_data; const char *n1_msg_class, *str; jsmntok_t *tokens, *cur_tok; dissector_handle_t subdissector; tvbuff_t* json_tvb = (tvbuff_t*)p_get_proto_data(pinfo->pool, pinfo, proto_json, 0); http_message_info_t *message_info = (http_message_info_t *)data; if (!json_tvb || !message_info || !message_info->content_id) return 0; json_data = tvb_get_string_enc(wmem_packet_scope(), json_tvb, 0, tvb_reported_length(json_tvb), ENC_UTF_8|ENC_NA); ret = json_parse(json_data, NULL, 0); if (ret < 0) return 0; tokens = wmem_alloc_array(wmem_packet_scope(), jsmntok_t, ret); if (json_parse(json_data, tokens, ret) < 0) return 0; cur_tok = json_get_object(json_data, tokens, "n1MessageContainer"); if (!cur_tok) return 0; n1_msg_class = json_get_string(json_data, cur_tok, "n1MessageClass"); if (!n1_msg_class) return 0; cur_tok = json_get_object(json_data, cur_tok, "n1MessageContent"); if (!cur_tok) return 0; str = json_get_string(json_data, cur_tok, "contentId"); if (!str || strcmp(str, message_info->content_id)) return 0; if (!strcmp(n1_msg_class, "5GMM") || !strcmp(n1_msg_class, "SM")) { subdissector = nas_5gs_handle; } else if (!strcmp(n1_msg_class, "LPP")) { subdissector = lpp_handle; } else if (!strcmp(n1_msg_class, "SMS")) { /* how to know the direction? */ subdissector = NULL; } else if (!strcmp(n1_msg_class, "UPDP")) { /* UD policy delivery service */ disect_nas_5gs_updp(tvb, pinfo, tree, 0); return tvb_captured_length(tvb);; } else { subdissector = NULL; } if (subdissector) { call_dissector_with_data(subdissector, tvb, pinfo, tree, NULL); return tvb_captured_length(tvb); } else { return 0; } } void proto_register_nas_5gs(void) { /* List of fields */ static hf_register_info hf[] = { { &hf_nas_5gs_epd, { "Extended protocol discriminator", "nas_5gs.epd", FT_UINT8, BASE_DEC, VALS(nas_5gs_epd_vals), 0x0, NULL, HFILL } }, { &hf_nas_5gs_spare_b7, { "Spare", "nas_5gs.spare_b7", FT_UINT8, BASE_DEC, NULL, 0x80, NULL, HFILL } }, { &hf_nas_5gs_spare_b6, { "Spare", "nas_5gs.spare_b6", FT_UINT8, BASE_DEC, NULL, 0x40, NULL, HFILL } }, { &hf_nas_5gs_spare_b5, { "Spare", "nas_5gs.spare_b5", FT_UINT8, BASE_DEC, NULL, 0x20, NULL, HFILL } }, { &hf_nas_5gs_spare_b4, { "Spare", "nas_5gs.spare_b4", FT_UINT8, BASE_DEC, NULL, 0x10, NULL, HFILL } }, { &hf_nas_5gs_spare_b3, { "Spare", "nas_5gs.spare_b3", FT_UINT8, BASE_DEC, NULL, 0x08, NULL, HFILL } }, { &hf_nas_5gs_spare_b2, { "Spare", "nas_5gs.spare_b2", FT_UINT8, BASE_DEC, NULL, 0x04, NULL, HFILL } }, { &hf_nas_5gs_spare_b1, { "Spare", "nas_5gs.spare_b1", FT_UINT8, BASE_DEC, NULL, 0x02, NULL, HFILL } }, { &hf_nas_5gs_rfu_b2, { "Reserved for Future Use(RFU)", "nas_5gs.rfu.b2", FT_UINT8, BASE_DEC, NULL, 0x04, NULL, HFILL } }, { &hf_nas_5gs_rfu_b1, { "Reserved for Future Use(RFU)", "nas_5gs.rfu.b1", FT_UINT8, BASE_DEC, NULL, 0x02, NULL, HFILL } }, { &hf_nas_5gs_rfu_b0, { "Reserved for Future Use(RFU)", "nas_5gs.rfu.b0", FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL } }, { &hf_nas_5gs_security_header_type, { "Security header type", "nas_5gs.security_header_type", FT_UINT8, BASE_DEC, VALS(nas_5gs_security_header_type_vals), 0x0f, NULL, HFILL } }, { &hf_nas_5gs_msg_auth_code, { "Message authentication code", "nas_5gs.msg_auth_code", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_seq_no, { "Sequence number", "nas_5gs.seq_no", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_msg_type, { "Message type", "nas_5gs.mm.message_type", FT_UINT8, BASE_HEX | BASE_EXT_STRING, &nas_5gs_mm_msg_strings_ext, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_msg_type, { "Message type", "nas_5gs.sm.message_type", FT_UINT8, BASE_HEX | BASE_EXT_STRING, &nas_5gs_sm_msg_strings_ext, 0x0, NULL, HFILL } }, { &hf_nas_5gs_updp_msg_type, { "Message type", "nas_5gs.updp.message_type", FT_UINT8, BASE_HEX | BASE_EXT_STRING, &nas_5gs_updp_msg_strings_ext, 0x0, NULL, HFILL } }, { &hf_nas_5gs_common_elem_id, { "Element ID", "nas_5gs.common.elem_id", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_nas_5gs_mm_elem_id, { "Element ID", "nas_5gs.mm.elem_id", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_nas_5gs_sm_elem_id, { "Element ID", "nas_5gs.sm.elem_id", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_nas_5gs_updp_elem_id, { "Element ID", "nas_5gs.updp.elem_id", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL } }, { &hf_nas_5gs_proc_trans_id, { "Procedure transaction identity", "nas_5gs.proc_trans_id", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_spare_half_octet, { "Spare Half Octet", "nas_5gs.spare_half_octet", FT_UINT8, BASE_DEC, NULL, 0xf0, NULL, HFILL } }, { &hf_nas_5gs_pdu_session_id, { "PDU session identity", "nas_5gs.pdu_session_id", FT_UINT8, BASE_DEC, VALS(nas_5gs_pdu_session_id_vals), 0x0, NULL, HFILL } }, { &hf_nas_5gs_msg_elems, { "Message Elements", "nas_5gs.message_elements", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_cmn_dnn, { "DNN", "nas_5gs.cmn.dnn", FT_STRING, BASE_NONE, NULL,0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_for, { "Follow-On Request bit (FOR)", "nas_5gs.mm.for", FT_BOOLEAN, 8, TFS(&nas_5gs_for_tfs), 0x08, NULL, HFILL } }, { &hf_nas_5gs_mm_sms_requested, { "SMS requested", "nas_5gs.mm.sms_requested", FT_BOOLEAN, 8, TFS(&tfs_nas5gs_sms_requested), 0x01, NULL, HFILL } }, { &hf_nas_5gs_mm_5gs_reg_type, { "5GS registration type", "nas_5gs.mm.5gs_reg_type", FT_UINT8, BASE_DEC, VALS(nas_5gs_registration_type_values), 0x07, NULL, HFILL } }, { &hf_nas_5gs_mm_tsc, { "Type of security context flag (TSC)", "nas_5gs.mm.tsc", FT_BOOLEAN, 8, TFS(&nas_5gs_mm_tsc_tfs), 0x08, NULL, HFILL } }, { &hf_nas_5gs_mm_nas_key_set_id, { "NAS key set identifier", "nas_5gs.mm.nas_key_set_id", FT_UINT8, BASE_DEC, NULL, 0x07, NULL, HFILL } }, { &hf_nas_5gs_mm_tsc_h1, { "Type of security context flag (TSC)", "nas_5gs.mm.tsc.h1", FT_BOOLEAN, 8, TFS(&nas_5gs_mm_tsc_tfs), 0x80, NULL, HFILL } }, { &hf_nas_5gs_mm_nas_key_set_id_h1, { "NAS key set identifier", "nas_5gs.mm.nas_key_set_id.h1", FT_UINT8, BASE_DEC, NULL, 0x70, NULL, HFILL } }, { &hf_nas_5gs_mm_5gmm_cause, { "5GMM cause", "nas_5gs.mm.5gmm_cause", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_cause_vals), 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_pld_cont_type, { "Payload container type", "nas_5gs.mm.pld_cont_type", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_pld_cont_type_vals), 0x0f, NULL, HFILL } }, { &hf_nas_5gs_mm_sst, { "Slice/service type (SST)", "nas_5gs.mm.sst", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_sd, { "Slice differentiator (SD)", "nas_5gs.mm.mm_sd", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_mapped_conf_sst, { "Mapped configured SST", "nas_5gs.mm.mapped_conf_sst", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_mapped_conf_ssd, { "Mapped configured SD", "nas_5gs.mm.mapped_conf_ssd", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_switch_off, { "Switch off", "nas_5gs.mm.switch_off", FT_BOOLEAN, 8, TFS(&nas_5gs_mm_switch_off_tfs), 0x08, NULL, HFILL } }, { &hf_nas_5gs_mm_re_reg_req, { "Re-registration required", "nas_5gs.mm.re_reg_req", FT_BOOLEAN, 8, TFS(&nas_5gs_mm_re_reg_req_tfs), 0x04, NULL, HFILL } }, { &hf_nas_5gs_mm_acc_type, { "Access type", "nas_5gs.mm.acc_type", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_acc_type_vals), 0x03, NULL, HFILL } }, { &hf_nas_5gs_mm_raai_b0, { "Registration Area Allocation Indication (RAAI)", "nas_5gs.mm.raai_b0", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_raai), 0x01, NULL, HFILL } }, { &hf_nas_5gs_mm_conf_upd_ind_ack_b0, { "Acknowledgement", "nas_5gs.mm.conf_upd_ind.ack", FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x01, NULL, HFILL } }, { &hf_nas_5gs_mm_conf_upd_ind_red_b1, { "Registration", "nas_5gs.mm.conf_upd_ind.red", FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x02, NULL, HFILL } }, { &hf_nas_5gs_mm_nas_sec_algo_enc, { "Type of ciphering algorithm", "nas_5gs.mm.nas_sec_algo_enc", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_type_of_enc_algo_vals), 0xf0, NULL, HFILL } }, { &hf_nas_5gs_mm_nas_sec_algo_ip, { "Type of integrity protection algorithm", "nas_5gs.mm.nas_sec_algo_ip", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_type_of_ip_algo_vals), 0x0f, NULL, HFILL } }, { &hf_nas_5gs_mm_s1_mode_b0, { "S1 mode", "nas_5gs.mm.s1_mode_b0", FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x01, NULL, HFILL } }, { &hf_nas_5gs_mm_ho_attach_b1, { "HO attach", "nas_5gs.mm.ho_attach_b1", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL } }, { &hf_nas_5gs_mm_lpp_cap_b2, { "LTE Positioning Protocol (LPP) capability", "nas_5gs.mm.lpp_cap_b2", FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x04, NULL, HFILL } }, { &hf_nas_5gs_mm_type_id, { "Type of identity", "nas_5gs.mm.type_id", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_type_id_vals), 0x07, NULL, HFILL } }, { &hf_nas_5gs_mm_odd_even, { "Odd/even indication","nas_5gs.mm.odd_even", FT_BOOLEAN, 8, TFS(&nas_5gs_odd_even_tfs), 0x08, NULL, HFILL } }, { &hf_nas_5gs_mm_length, { "Length", "nas_5gs.mm.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_abba, { "ABBA Contents", "nas_5gs.mm.abba_contents", FT_UINT16, BASE_HEX, NULL, 0x00, NULL, HFILL } }, { &hf_nas_5gs_mm_pld_cont, { "Payload container", "nas_5gs.mm.pld_cont", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_req_type, { "Request type", "nas_5gs.mm.req_typ", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_req_type_vals), 0x0f, NULL, HFILL } }, { &hf_nas_5gs_mm_serv_type, { "Service type", "nas_5gs.mm.serv_type", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_serv_type_vals), 0x70, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_ea0, { "5G-EA0","nas_5gs.mm.5g_ea0", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80, NULL, HFILL } }, { &hf_nas_5gs_mm_128_5g_ea1, { "128-5G-EA1","nas_5gs.mm.128_5g_ea1", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, NULL, HFILL } }, { &hf_nas_5gs_mm_128_5g_ea2, { "128-5G-EA2","nas_5gs.mm.128_5g_ea2", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL } }, { &hf_nas_5gs_mm_128_5g_ea3, { "128-5G-EA3","nas_5gs.mm.128_5g_ea3", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_ea4, { "5G-EA4","nas_5gs.mm.5g_ea4", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_ea5, { "5G-EA5","nas_5gs.mm.5g_ea5", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_ea6, { "5G-EA6","nas_5gs.mm.5g_ea6", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_ea7, { "5G-EA7","nas_5gs.mm.5g_ea7", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_ia0, { "5G-IA0","nas_5gs.mm.ia0", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_128_ia1, { "128-5G-IA1","nas_5gs.mm.5g_128_ia1", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_128_ia2, { "128-5G-IA2","nas_5gs.mm.5g_128_ia2", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_128_ia3, { "128-5G-IA3","nas_5gs.mm.5g_128_ia4", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_ia4, { "5G-IA4","nas_5gs.mm.5g_128_ia4", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_ia5, { "5G-IA5","nas_5gs.mm.5g_ia5", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_ia6, { "5G-IA6","nas_5gs.mm.5g_ia6", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL } }, { &hf_nas_5gs_mm_5g_ia7, { "5G-IA7","nas_5gs.mm.5g_ia7", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL } }, { &hf_nas_5gs_mm_eea0, { "EEA0","nas_5gs.mm.eea0", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80, NULL, HFILL } }, { &hf_nas_5gs_mm_128eea1, { "128-EEA1","nas_5gs.mm.128eea1", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, NULL, HFILL } }, { &hf_nas_5gs_mm_128eea2, { "128-EEA2","nas_5gs.mm.128eea2", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL } }, { &hf_nas_5gs_mm_eea3, { "128-EEA3","nas_5gs.mm.eea3", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL } }, { &hf_nas_5gs_mm_eea4, { "EEA4","nas_5gs.mm.eea4", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL } }, { &hf_nas_5gs_mm_eea5, { "EEA5","nas_5gs.mm.eea5", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL } }, { &hf_nas_5gs_mm_eea6, { "EEA6","nas_5gs.mm.eea6", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL } }, { &hf_nas_5gs_mm_eea7, { "EEA7","nas_5gs.mm.eea7", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL } }, { &hf_nas_5gs_mm_eia0, { "EIA0","nas_5gs.mm.eia0", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80, NULL, HFILL } }, { &hf_nas_5gs_mm_128eia1, { "128-EIA1","nas_5gs.mm.128eia1", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, NULL, HFILL } }, { &hf_nas_5gs_mm_128eia2, { "128-EIA2","nas_5gs.mm.128eia2", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL } }, { &hf_nas_5gs_mm_eia3, { "128-EIA3","nas_5gs.mm.eia3", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL } }, { &hf_nas_5gs_mm_eia4, { "EIA4","nas_5gs.mm.eia4", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL } }, { &hf_nas_5gs_mm_eia5, { "EIA5","nas_5gs.mm.eia5", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL } }, { &hf_nas_5gs_mm_eia6, { "EIA6","nas_5gs.mm.eia6", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL } }, { &hf_nas_5gs_mm_eia7, { "EIA7","nas_5gs.mm.eia7", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL } }, { &hf_nas_5gs_mm_n1_mode_reg_b1, { "N1 mode reg","nas_5gs.mm.n1_mode_reg_b1", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_mm_n1_mod), 0x02, NULL, HFILL } }, { &hf_nas_5gs_mm_s1_mode_reg_b0, { "S1 mode reg","nas_5gs.mm.s1_mode_reg_b0", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_mm_s1_mod), 0x01, NULL, HFILL } }, { &hf_nas_5gs_mm_sal_al_t, { "Allowed type","nas_5gs.mm.sal_al_t", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_sal_al_t), 0x80, NULL, HFILL } }, { &hf_nas_5gs_mm_sal_t_li, { "Type of list", "nas_5gs.mm.sal_t_li", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_sal_t_li_values), 0x60, NULL, HFILL } }, { &hf_nas_5gs_mm_sal_num_e, { "Number of elements", "nas_5gs.mm.sal_num_e", FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL } }, { &hf_nas_5gs_sm_pdu_session_type, { "PDU session type", "nas_5gs.sm.pdu_session_type", FT_UINT8, BASE_DEC, VALS(nas_5gs_pdu_session_type_values), 0x0f, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_0_b0, { "Spare","nas_5gs.pdu_ses_sts_psi_0_b0", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_1_b1, { "PSI(1)","nas_5gs.pdu_ses_sts_psi_1_b1", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x02, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_2_b2, { "PSI(2)","nas_5gs.pdu_ses_sts_psi_2_b2", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x04, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_3_b3, { "PSI(3)","nas_5gs.pdu_ses_sts_psi_3_b3", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x08, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_4_b4, { "PSI(4)","nas_5gs.pdu_ses_sts_psi_4_b4", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x10, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_5_b5, { "PSI(5)","nas_5gs.pdu_ses_sts_psi_5_b5", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x20, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_6_b6, { "PSI(6)","nas_5gs.pdu_ses_sts_psi_6_b6", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x40, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_7_b7, { "PSI(7)","nas_5gs.pdu_ses_sts_psi_7_b7", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x80, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_8_b0, { "PSI(8)","nas_5gs.pdu_ses_sts_psi_8_b0", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x01, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_9_b1, { "PSI(9)","nas_5gs.pdu_ses_sts_psi_9_b1", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x02, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_10_b2, { "PSI(10)","nas_5gs.pdu_ses_sts_psi_10_b2", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x04, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_11_b3, { "PSI(11)","nas_5gs.pdu_ses_sts_psi_11_b3", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x08, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_12_b4, { "PSI(12)","nas_5gs.pdu_ses_sts_psi_12_b4", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x10, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_13_b5, { "PSI(13)","nas_5gs.pdu_ses_sts_psi_13_b5", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x20, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_14_b6, { "PSI(14)","nas_5gs.pdu_ses_sts_psi_14_b6", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x40, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_sts_psi_15_b7, { "PSI(15)","nas_5gs.pdu_ses_sts_psi_15_b7", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_sts_psi), 0x80, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_0_b0, { "PSI(0) Spare","nas_5gs.pdu_ses_rect_res_psi_0_b0", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x01, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_1_b1, { "PSI(1)","nas_5gs.pdu_ses_rect_res_psi_1_b1", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x02, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_2_b2, { "PSI(2)","nas_5gs.pdu_ses_rect_res_psi_2_b2", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x04, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_3_b3, { "PSI(3)","nas_5gs.pdu_ses_rect_res_psi_3_b3", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x08, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_4_b4, { "PSI(4)","nas_5gs.pdu_ses_rect_res_psi_3_b4", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x10, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_5_b5, { "PSI(5)","nas_5gs.pdu_ses_rect_res_psi_3_b5", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x20, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_6_b6, { "PSI(6)","nas_5gs.pdu_ses_rect_res_psi_3_b6", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x40, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_7_b7, { "PSI(7)","nas_5gs.pdu_ses_rect_res_psi_3_b7", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x80, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_8_b0, { "PSI(8)","nas_5gs.pdu_ses_rect_res_psi_8_b0", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x01, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_9_b1, { "PSI(9)","nas_5gs.pdu_ses_rect_res_psi_9_b1", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x02, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_10_b2, { "PSI(10)","nas_5gs.pdu_ses_rect_res_psi_10_b2", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x04, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_11_b3, { "PSI(11)","nas_5gs.pdu_ses_rect_res_psi_11_b3", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x08, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_12_b4, { "PSI(12)","nas_5gs.pdu_ses_rect_res_psi_12_b4", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x10, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_13_b5, { "PSI(13)","nas_5gs.pdu_ses_sts_psi_13_b5", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x20, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_14_b6, { "PSI(14)","nas_5gs.pdu_ses_sts_psi_14_b6", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x40, NULL, HFILL } }, { &hf_nas_5gs_pdu_ses_rect_res_psi_15_b7, { "PSI(15)","nas_5gs.pdu_ses_sts_psi_15_b7", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_pdu_ses_rect_res_psi), 0x80, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_0_b0, { "Spare","nas_5gs.ul_data_sts_psi_0_b0", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_1_b1, { "PSI(1)","nas_5gs.ul_data_sts_psi_1_b1", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x02, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_2_b2, { "PSI(2)","nas_5gs.ul_data_sts_psi_2_b2", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x04, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_3_b3, { "PSI(3)","nas_5gs.ul_data_sts_psi_3_b3", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x08, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_4_b4, { "PSI(4)","nas_5gs.ul_data_sts_psi_4_b4", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x10, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_5_b5, { "PSI(5)","nas_5gs.ul_data_sts_psi_5_b5", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x20, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_6_b6, { "PSI(6)","nas_5gs.ul_data_sts_psi_6_b6", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x40, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_7_b7, { "PSI(7)","nas_5gs.ul_data_sts_psi_7_b7", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x80, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_8_b0, { "PSI(8)","nas_5gs.ul_data_sts_psi_8_b0", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x01, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_9_b1, { "PSI(9)","nas_5gs.ul_data_sts_psi_9_b1", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x02, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_10_b2, { "PSI(10)","nas_5gs.ul_data_sts_psi_10_b2", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x04, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_11_b3, { "PSI(11)","nas_5gs.ul_data_sts_psi_11_b3", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x08, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_12_b4, { "PSI(12)","nas_5gs.ul_data_sts_psi_12_b4", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x10, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_13_b5, { "PSI(13)","nas_5gs.ul_data_sts_psi_13_b5", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x20, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_14_b6, { "PSI(14)","nas_5gs.ul_data_sts_psi_14_b6", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x40, NULL, HFILL } }, { &hf_nas_5gs_ul_data_sts_psi_15_b7, { "PSI(15)","nas_5gs.ul_data_sts_psi_15_b7", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_ul_data_sts_psi), 0x80, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_0_b0, { "Spare","nas_5gs.allow_pdu_ses_sts_psi_0_b0", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_1_b1, { "PSI(1)","nas_5gs.allow_pdu_ses_sts_psi_1_b1", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x02, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_2_b2, { "PSI(2)","nas_5gs.allow_pdu_ses_sts_psi_2_b2", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x04, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_3_b3, { "PSI(3)","nas_5gs.allow_pdu_ses_sts_psi_3_b3", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x08, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_4_b4, { "PSI(4)","nas_5gs.allow_pdu_ses_sts_psi_4_b4", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x10, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_5_b5, { "PSI(5)","nas_5gs.allow_pdu_ses_sts_psi_5_b5", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x20, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_6_b6, { "PSI(6)","nas_5gs.allow_pdu_ses_sts_psi_6_b6", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x40, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_7_b7, { "PSI(7)","nas_5gs.allow_pdu_ses_sts_psi_7_b7", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x80, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_8_b0, { "PSI(8)","nas_5gs.allow_pdu_ses_sts_psi_8_b0", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x01, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_9_b1, { "PSI(9)","nas_5gs.allow_pdu_ses_sts_psi_9_b1", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x02, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_10_b2, { "PSI(10)","nas_5gs.allow_pdu_ses_sts_psi_10_b2", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x04, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_11_b3, { "PSI(11)","nas_5gs.allow_pdu_ses_sts_psi_11_b3", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x08, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_12_b4, { "PSI(12)","nas_5gs.allow_pdu_ses_sts_psi_12_b4", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x10, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_13_b5, { "PSI(13)","nas_5gs.allow_pdu_ses_sts_psi_13_b5", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x20, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_14_b6, { "PSI(14)","nas_5gs.allow_pdu_ses_sts_psi_14_b6", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x40, NULL, HFILL } }, { &hf_nas_5gs_allow_pdu_ses_sts_psi_15_b7, { "PSI(15)","nas_5gs.allow_pdu_ses_sts_psi_15_b7", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_allow_pdu_ses_sts_psi), 0x80, NULL, HFILL } }, { &hf_nas_5gs_sm_sc_mode, { "SSC mode", "nas_5gs.sm.sc_mode", FT_UINT8, BASE_DEC, VALS(nas_5gs_sc_mode_values), 0x0f, NULL, HFILL } }, { &hf_nas_5gs_sm_sel_sc_mode, { "Selected SSC mode", "nas_5gs.sm.sel_sc_mode", FT_UINT8, BASE_DEC, VALS(nas_5gs_sc_mode_values), 0xf0, NULL, HFILL } }, { &hf_nas_5gs_sm_rqos_b0, { "Reflective QoS(RqoS)", "nas_5gs.sm.rqos", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL } }, { &hf_nas_5gs_sm_5gsm_cause, { "5GSM cause", "nas_5gs.sm.5gsm_cause", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_cause_vals), 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_int_prot_max_data_rate_ul, { "Integrity protection maximum data rate for uplink", "nas_5gs.sm.int_prot_max_data_rate_ul", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_int_prot_max_data_rate_vals), 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_int_prot_max_data_rate_dl, { "Integrity protection maximum data rate for downlink", "nas_5gs.sm.int_prot_max_data_rate_dl", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_int_prot_max_data_rate_vals), 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_pdu_ses_type, { "PDU session type", "nas_5gs.sm.pdu_ses_type", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_pdu_ses_type_vals), 0x0f, NULL, HFILL } }, { &hf_nas_5gs_sm_pdu_addr_inf_ipv4, { "PDU address information", "nas_5gs.sm.pdu_addr_inf_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_pdu_addr_inf_ipv6, { "PDU address information", "nas_5gs.sm.pdu_addr_inf_ipv6", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_qos_rule_id, { "QoS rule identifier", "nas_5gs.sm.qos_rule_id", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_length, { "Length", "nas_5gs.sm.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_rop, { "Rule operation code", "nas_5gs.sm.rop", FT_UINT8, BASE_DEC, VALS(nas_5gs_rule_operation_code_values), 0xe0, NULL, HFILL } }, { &hf_nas_5gs_sm_dqr, { "DQR", "nas_5gs.sm.dqr", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_sm_dqr), 0x10, NULL, HFILL } }, { &hf_nas_5gs_sm_nof_pkt_filters, { "Number of packet filters", "nas_5gs.sm.nof_pkt_filters", FT_UINT8, BASE_DEC, NULL, 0x0f, NULL, HFILL } }, { &hf_nas_5gs_sm_pkt_flt_dir, { "Packet filter direction", "nas_5gs.sm.pkt_flt_dir", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_pkt_flt_dir_values), 0x30, NULL, HFILL } }, { &hf_nas_5gs_sm_pkt_flt_id, { "Packet filter identifier", "nas_5gs.sm.pkt_flt_id", FT_UINT8, BASE_DEC, NULL, 0x0f, NULL, HFILL } }, { &hf_nas_5gs_sm_pf_len, { "Length", "nas_5gs.sm.pf_len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_pf_type, { "Packet filter component type", "nas_5gs.sm.pf_type", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_pf_type_values), 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_e, { "E bit", "nas_5gs.sm.e", FT_UINT8, BASE_DEC, NULL, 0x40, NULL, HFILL } }, { &hf_nas_5gs_sm_nof_params, { "Number of parameters", "nas_5gs.sm.nof_params", FT_UINT8, BASE_DEC, NULL, 0x3f, NULL, HFILL } }, { &hf_nas_5gs_sm_param_id, { "Parameter identifier", "nas_5gs.sm.param_id", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_param_id_values), 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_param_len, { "Length", "nas_5gs.sm.param_len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_addr_mask_ipv4, { "IPv4 address mask", "nas_5gs.ipv4_address_mask", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_protocol_identifier_or_next_hd, { "Protocol identifier/Next header type", "nas_5gs.protocol_identifier_or_next_hd", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_qos_rule_precedence, { "QoS rule precedence", "nas_5gs.sm.qos_rule_precedence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_pal_cont, { "Parameters content", "nas_5gs.sm.pal_cont", FT_UINT8, BASE_DEC, VALS(nas_5gs_rule_param_cont), 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_qfi, { "Qos flow identifier", "nas_5gs.sm.qfi", FT_UINT8, BASE_DEC, NULL, 0x3f, NULL, HFILL } }, { &hf_nas_5gs_sm_mapd_eps_b_cont_id, { "EPS bearer identity", "nas_5gs.sm.mapd_eps_b_cont_id", FT_UINT8, BASE_DEC, NULL, 0xf0, NULL, HFILL } }, { &hf_nas_5gs_sm_mapd_eps_b_cont_opt_code, { "Operation code", "nas_5gs.sm.mapd_eps_b_cont_opt_code", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_mapd_eps_b_cont_opt_code_vals), 0xc0, NULL, HFILL } }, { &hf_nas_5gs_sm_qos_des_flow_opt_code, { "Operation code", "nas_5gs.sm.hf_nas_5gs_sm_qos_des_flow_opt_code", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_qos_des_flow_opt_code_vals), 0xe0, NULL, HFILL } }, { &hf_nas_5gs_sm_mapd_eps_b_cont_DEB, { "DEB bit", "nas_5gs.sm.mapd_eps_b_cont_DEB", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_mapd_eps_b_cont_DEB_vals), 0x20, NULL, HFILL } }, { &hf_nas_5gs_sm_mapd_eps_b_cont_E, { "E bit", "nas_5gs.sm.mapd_eps_b_cont_E", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_mapd_eps_b_cont_E_vals), 0x10, NULL, HFILL } }, { &hf_nas_5gs_sm_mapd_eps_b_cont_E_mod, { "E bit", "nas_5gs.sm.mapd_eps_b_cont_E_mod", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_mapd_eps_b_cont_E_Modify_vals), 0x10, NULL, HFILL } }, { &hf_nas_5gs_sm_mapd_eps_b_cont_num_eps_parms, { "Number of EPS parameters", "nas_5gs.sm.mapd_eps_b_cont_num_eps_parms", FT_UINT8, BASE_DEC, NULL, 0x0f, NULL, HFILL } }, { &hf_nas_5gs_sm_mapd_eps_b_cont_param_id, { "EPS parameter identity", "nas_5gs.sm.mapd_eps_b_cont_param_id", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_mapd_eps_b_cont_param_id_vals), 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_unit_for_session_ambr_dl, { "Unit for Session-AMBR for downlink", "nas_5gs.sm.unit_for_session_ambr_dl", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_unit_for_session_ambr_values), 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_unit_for_session_ambr_ul, { "Unit for Session-AMBR for uplink", "nas_5gs.sm.unit_for_session_ambr_ul", FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_unit_for_session_ambr_values), 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_session_ambr_dl, { "Session-AMBR for downlink", "nas_5gs.sm.session_ambr_dl", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_session_ambr_ul, { "Session-AMBR for uplink", "nas_5gs.sm.session_ambr_ul", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_all_ssc_mode_b0, { "SSC mode 1", "nas_5gs.sm.all_ssc_mode_b0", FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed), 0x01, NULL, HFILL } }, { &hf_nas_5gs_sm_all_ssc_mode_b1, { "SSC mode 2", "nas_5gs.sm.all_ssc_mode_b1", FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed), 0x02, NULL, HFILL } }, { &hf_nas_5gs_sm_all_ssc_mode_b2, { "SSC mode 3", "nas_5gs.sm.all_ssc_mode_b2", FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed), 0x04, NULL, HFILL } }, { &hf_nas_5gs_mm_supi_fmt, { "SUPI format","nas_5gs.mm.suci.supi_fmt", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_supi_fmt_vals), 0x70, NULL, HFILL } }, { &hf_nas_5gs_mm_routing_indicator, { "Routing indicator", "nas_5gs.mm.suci.routing_indicator", FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_nas_5gs_mm_prot_scheme_id, { "Protection scheme Id", "nas_5gs.mm.suci.scheme_id", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_prot_scheme_id_vals), 0x0f, NULL, HFILL } }, { &hf_nas_5gs_mm_pki, { "Home network public key identifier", "nas_5gs.mm.suci.pki", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_supi_null_scheme, { "Scheme output", "nas_5gs.mm.suci.supi_null_scheme", FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_nas_5gs_mm_scheme_output, { "Scheme output", "nas_5gs.mm.suci.scheme_output", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_suci_nai, { "NAI", "nas_5gs.mm.suci.nai", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_imei, { "IMEI", "nas_5gs.mm.imei", FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_nas_5gs_mm_imeisv, { "IMEISV", "nas_5gs.mm.imeisv", FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_nas_5gs_mm_reg_res_sms_allowed, { "SMS over NAS", "nas_5gs.mm.reg_res.sms_all", FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed), 0x08, NULL, HFILL } }, { &hf_nas_5gs_mm_reg_res_res, { "5GS registration result", "nas_5gs.mm.reg_res.res", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_reg_res_values), 0x07, NULL, HFILL } }, { &hf_nas_5gs_amf_region_id, { "AMF Region ID", "nas_5gs.amf_region_id", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_amf_set_id, { "AMF Set ID", "nas_5gs.amf_set_id", FT_UINT16, BASE_DEC, NULL, 0xffc0, NULL, HFILL } }, { &hf_nas_5gs_amf_pointer, { "AMF Pointer", "nas_5gs.amf_pointer", FT_UINT8, BASE_DEC, NULL, 0x3f, NULL, HFILL } }, { &hf_nas_5gs_5g_tmsi, { "5G-TMSI", "nas_5gs.5g_tmsi", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_nw_feat_sup_ims_emf_b5b4, { "Emergency service fallback indicator (EMF)", "nas_5gs.nw_feat_sup.emf", FT_UINT8, BASE_DEC, VALS(nas_5gs_nw_feat_sup_emf_values), 0x30, NULL, HFILL } }, { &hf_nas_5gs_nw_feat_sup_ims_emc_b3b2, { "Emergency service support indicator (EMC)", "nas_5gs.nw_feat_sup.emc", FT_UINT8, BASE_DEC, VALS(nas_5gs_nw_feat_sup_emc_values), 0x0c, NULL, HFILL } }, { &hf_nas_5gs_nw_feat_sup_ims_vops_b1b0, { "IMS voice over PS session indicator (IMS VoPS)", "nas_5gs.nw_feat_sup.vops", FT_UINT8, BASE_DEC, VALS(nas_5gs_nw_feat_sup_ims_vops_values), 0x03, NULL, HFILL } }, { &hf_nas_5gs_nw_feat_sup_ims_iwk_n26_b6, { "Interworking without N26", "nas_5gs.nw_feat_sup.iwk_n26", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, NULL, HFILL } }, { &hf_nas_5gs_nw_feat_sup_mpsi_b7, { "MPS indicator (MPSI)", "nas_5gs.nw_feat_sup.mpsi", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_nw_feat_sup_mpsi), 0x80, NULL, HFILL } }, { &hf_nas_5gs_tac, { "TAC", "nas_5gs.tac", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_tal_t_li, { "Type of list", "nas_5gs.mm.tal_t_li", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_tal_t_li_values), 0x60, NULL, HFILL } }, { &hf_nas_5gs_mm_tal_num_e, { "Number of elements", "nas_5gs.mm.tal_num_e", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_tal_num_e), 0x1f, NULL, HFILL } }, { &hf_nas_5gs_sm_mapd_eps_b_cont_eps_param_cont, { "EPS parameter contents", "nas_5gs.sm.mapd_eps_b_cont_eps_param_cont", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sm_max_nb_sup_pkt_flt_nb, { "Maximum number of supported packet filters", "nas_5gs.sm.max_nb_sup_pkt_flt.nb", FT_UINT16, BASE_DEC, NULL, 0xffe0, NULL, HFILL } }, { &hf_nas_5gs_sm_max_nb_sup_pkt_flt_spare, { "Spare", "nas_5gs.sm.max_nb_sup_pkt_flt.spare", FT_UINT16, BASE_HEX, NULL, 0x001f, NULL, HFILL } }, { &hf_nas_5gs_kacf, { "K_AMF change flag", "nas_5gs.kacf", FT_BOOLEAN, 8, TFS(&nas_5gs_kacf_tfs), 0x10, NULL, HFILL } }, { &hf_nas_5gs_ncc, { "NCC", "nas_5gs.ncc", FT_UINT8, BASE_DEC, NULL, 0x70, NULL, HFILL } }, { &hf_nas_5gs_mm_rinmr, { "Retransmission of initial NAS message request(RINMR)", "nas_5gs.mm.rinmr", FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x02, NULL, HFILL } }, { &hf_nas_5gs_mm_hdp, { "Horizontal derivation parameter (HDP)", "nas_5gs.mm.hdp", FT_BOOLEAN, 8, TFS(&tfs_required_not_required), 0x01, NULL, HFILL } }, { &hf_nas_5gs_mm_dcni, { "Default configured NSSAI indication (DCNI)", "nas_5gs.mm.dcni", FT_BOOLEAN, 8, TFS(&nas_5gs_mm_dcni_tfs), 0x02, NULL, HFILL } }, { &hf_nas_5gs_mm_nssci, { "Network slicing subscription change indication (NSSCI)", "nas_5gs.mm.nssci", FT_BOOLEAN, 8, TFS(&tfs_changed_not_changed), 0x01, NULL, HFILL } }, { &hf_nas_5gs_mm_nssai_inc_mode, { "NSSAI inclusion mode", "nas_5gs.mm.nssai_inc_mode", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_nssai_inc_mode_vals), 0x03, NULL, HFILL } }, { &hf_nas_5gs_mm_ue_usage_setting, { "UE's usage setting", "nas_5gs.mm.ue_usage_setting", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_mm_ue_usage_setting), 0x01, NULL, HFILL } }, { &hf_nas_5gs_mm_ng_ran_rcu, { "NG-RAN Radio Capability Update (NG-RAN-RCU)", "nas_5gs.mm.ng_ran_rcu", FT_BOOLEAN, 8, TFS(&tfs_needed_not_needed), 0x02, NULL, HFILL } }, { &hf_nas_5gs_mm_5gs_drx_param, { "DRX value", "nas_5gs.mm.drx_value", FT_UINT8, BASE_DEC, VALS(nas_5gs_mm_drx_vals), 0x0f, NULL, HFILL } }, { &hf_nas_5gs_mm_precedence, { "Precedence", "nas_5gs.mm.precedence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_mm_sms_indic_sai, { "SMS over NAS", "nas_5gs.mm.ms_indic.sai", FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed), 0x01, "SMS availability indication (SAI)", HFILL } }, { &hf_nas_5gs_sor_hdr0_ack, { "Acknowledgement (ACK)", "nas_5gs.sor_hdr0.ack", FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x08, NULL, HFILL } }, { &hf_nas_5gs_sor_hdr0_list_type, { "List type", "nas_5gs.sor_hdr0.list_type", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_list_type), 0x04, NULL, HFILL } }, { &hf_nas_5gs_sor_hdr0_list_ind, { "List indication", "nas_5gs.sor_hdr0.list_ind", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_list_ind), 0x02, NULL, HFILL } }, { &hf_nas_5gs_sor_hdr0_sor_data_type, { "SOR data type", "nas_5gs.sor.sor_data_type", FT_BOOLEAN, 8, TFS(&tfs_nas_5gs_sor_data_type), 0x01, NULL, HFILL } }, { &hf_nas_5gs_sor_mac_iue, { "SOR-MAC-IUE", "nas_5gs.mm.sor_mac_iue", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sor_mac_iausf, { "SOR-MAC-IAUSF", "nas_5gs.mm.sor_mac_iausf", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_counter_sor, { "CounterSOR", "nas_5gs.mm.counter_sor", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_sor_sec_pkt, { "Secured packet", "nas_5gs.mm.sor_sec_pkt", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_acces_tech_o1_b7, { "Access technology UTRAN", "nas_5gs.cces_tech_o1_b7.utran", FT_BOOLEAN, 8, TFS(&tfs_selected_not_selected), 0x80, NULL, HFILL } }, { &hf_nas_5gs_acces_tech_o1_b6, { "Access technology E-UTRAN", "nas_5gs.cces_tech_o1_b6.e_utran", FT_BOOLEAN, 8, TFS(&tfs_selected_not_selected), 0x40, NULL, HFILL } }, { &hf_nas_5gs_acces_tech_o1_b5, { "Access technology E-UTRAN in WB-S1 mode", "nas_5gs.cces_tech_o1_b5.e_utran_in_wb_s1_mode", FT_BOOLEAN, 8, TFS(&tfs_selected_not_selected), 0x20, NULL, HFILL } }, { &hf_nas_5gs_acces_tech_o1_b4, { "Access technology E-UTRAN in NB-S1 mode", "nas_5gs.cces_tech_o1_b4.e_utran_in_nb_s1_mode", FT_BOOLEAN, 8, TFS(&tfs_selected_not_selected), 0x10, NULL, HFILL } }, { &hf_nas_5gs_acces_tech_o1_b3, { "Access technology NG-RAN", "nas_5gs.cces_tech_o1_b3.ng_ran", FT_BOOLEAN, 8, TFS(&tfs_selected_not_selected), 0x08, NULL, HFILL } }, { &hf_nas_5gs_acces_tech_o2_b7, { "Access technology GSM", "nas_5gs.cces_tech_o2_b7.gsm", FT_BOOLEAN, 8, TFS(&tfs_selected_not_selected), 0x80, NULL, HFILL } }, { &hf_nas_5gs_acces_tech_o2_b6, { "Access technology GSM COMPACT", "nas_5gs.cces_tech_o2_b6.gsm_compact", FT_BOOLEAN, 8, TFS(&tfs_selected_not_selected), 0x40, NULL, HFILL } }, { &hf_nas_5gs_acces_tech_o2_b5, { "Access technology CDMA2000 HRPD", "nas_5gs.cces_tech_o2_b5.cdma2000_hrpd", FT_BOOLEAN, 8, TFS(&tfs_selected_not_selected), 0x20, NULL, HFILL } }, { &hf_nas_5gs_acces_tech_o2_b4, { "Access technology CDMA2000 1xRTT", "nas_5gs.cces_tech_o2_b4.cdma2000_1x_rtt", FT_BOOLEAN, 8, TFS(&tfs_selected_not_selected), 0x10, NULL, HFILL } }, { &hf_nas_5gs_acces_tech_o2_b3, { "Access technology EC-GSM-IoT", "nas_5gs.cces_tech_o2_b3.ec_gsm_iot", FT_BOOLEAN, 8, TFS(&tfs_selected_not_selected), 0x08, NULL, HFILL } }, { &hf_nas_5gs_acces_tech_o2_b2, { "Access technology GSM", "nas_5gs.cces_tech_o2_b2.gsm", FT_BOOLEAN, 8, TFS(&tfs_selected_not_selected), 0x04, NULL, HFILL } }, { &hf_nas_5gs_single_port_type, { "Port number", "nas_5gs.port_type", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_updp_ue_pol_sect_sublst_len, { "Length", "nas_5gs.updp.ue_pol_sect_sublst_len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_updp_instr_len, { "Length", "nas_5gs.updp.instr_len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_updp_upsc, { "UPSC", "nas_5gs.updp.upsc", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_updp_policy_len, { "Length", "nas_5gs.updp.policy_len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_updp_ue_policy_part_type, { "UE policy part type", "nas_5gs.updp.ue_policy_part_type", FT_UINT8, BASE_DEC, VALS(nas_5gs_updp_ue_policy_part_type_vals), 0x0f, NULL, HFILL } }, { &hf_nas_5gs_updp_ue_policy_part_cont, { "UE policy part contents", "nas_5gs.updp.ue_policy_part_cont", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_rule_len, { "Length", "nas_5gs.ursp.rule_len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_rule_prec, { "Precedence", "nas_5gs.ursp.rule_prec", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_traff_desc_lst_len, { "Length", "nas_5gs.ursp.traff_desc_len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_traff_desc, { "Traffic descriptor", "nas_5gs.ursp.traff_desc", FT_UINT8, BASE_DEC, VALS(nas_5gs_ursp_traff_desc_component_type_values), 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_r_sel_desc_lst_len, { "Length", "nas_5gs.ursp.r_sel_desc_lst_len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_r_sel_desc_lst, { "Route selection descriptor list", "nas_5gs.ursp.r_sel_desc_lst", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_traff_desc_ipv4, { "IPv4 Address", "nas_5gs.ursp.traff_desc.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_traff_desc_ipv4_mask, { "Mask", "nas_5gs.ursp.traff_desc.ipv4_mask", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_traff_desc_next_hdr, { "protocol identifier/next header type", "nas_5gs.ursp.desc_next_hdr", FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ipproto_val_ext, 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_traff_desc_len, { "Length", "nas_5gs.ursp.r_sel_desc_len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_r_sel_des_prec, { "Precedence", "nas_5gs.ursp.r_sel_des_prec", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_r_sel_des_cont_len, { "Length", "nas_5gs.ursp.r_sel_des_cont_len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_ursp_r_sel_desc_comp_type, { "Route selection descriptor component type identifier", "nas_5gs.ursp.r_sel_desc_comp_type", FT_UINT8, BASE_DEC, VALS(nas_5gs_ursp_r_sel_desc_comp_type_values), 0x0, NULL, HFILL } }, { &hf_nas_5gs_ursp_r_sel_desc_dnn_len, { "Length", "nas_5gs.ursp.r_sel_desc_dnn_len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, }; guint i; guint last_offset; /* Setup protocol subtree array */ #define NUM_INDIVIDUAL_ELEMS 20 gint *ett[NUM_INDIVIDUAL_ELEMS + NUM_NAS_5GS_COMMON_ELEM + NUM_NAS_5GS_MM_MSG + NUM_NAS_5GS_MM_ELEM + NUM_NAS_5GS_SM_MSG + NUM_NAS_5GS_SM_ELEM + NUM_NAS_5GS_UPDP_MSG + NUM_NAS_5GS_UPDP_ELEM ]; ett[0] = &ett_nas_5gs; ett[1] = &ett_nas_5gs_mm_nssai; ett[2] = &ett_nas_5gs_mm_pdu_ses_id; ett[3] = &ett_nas_5gs_sm_qos_rules; ett[4] = &ett_nas_5gs_sm_qos_params; ett[5] = &ett_nas_5gs_plain; ett[6] = &ett_nas_5gs_sec; ett[7] = &ett_nas_5gs_mm_part_sal; ett[8] = &ett_nas_5gs_mm_part_tal; ett[9] = &ett_nas_5gs_sm_mapd_eps_b_cont; ett[10] = &ett_nas_5gs_sm_mapd_eps_b_cont_params_list; ett[11] = &ett_nas_5gs_enc; ett[12] = &ett_nas_5gs_mm_ladn_indic; ett[13] = &ett_nas_5gs_mm_sor; ett[14] = &ett_nas_5gs_sm_pkt_filter_components; ett[15] = &ett_nas_5gs_updp_ue_policy_section_mgm_lst; ett[16] = &ett_nas_5gs_updp_ue_policy_section_mgm_sublst; ett[17] = &ett_nas_5gs_ue_policies_ursp; ett[18] = &ett_nas_5gs_ursp_traff_desc; ett[19] = &ett_nas_5gs_ursp_r_sel_desc_cont; last_offset = NUM_INDIVIDUAL_ELEMS; for (i = 0; i < NUM_NAS_5GS_COMMON_ELEM; i++, last_offset++) { ett_nas_5gs_common_elem[i] = -1; ett[last_offset] = &ett_nas_5gs_common_elem[i]; } /* MM */ for (i = 0; i < NUM_NAS_5GS_MM_MSG; i++, last_offset++) { ett_nas_5gs_mm_msg[i] = -1; ett[last_offset] = &ett_nas_5gs_mm_msg[i]; } for (i = 0; i < NUM_NAS_5GS_MM_ELEM; i++, last_offset++) { ett_nas_5gs_mm_elem[i] = -1; ett[last_offset] = &ett_nas_5gs_mm_elem[i]; } for (i = 0; i < NUM_NAS_5GS_SM_MSG; i++, last_offset++) { ett_nas_5gs_sm_msg[i] = -1; ett[last_offset] = &ett_nas_5gs_sm_msg[i]; } for (i = 0; i < NUM_NAS_5GS_SM_ELEM; i++, last_offset++) { ett_nas_5gs_sm_elem[i] = -1; ett[last_offset] = &ett_nas_5gs_sm_elem[i]; } for (i = 0; i < NUM_NAS_5GS_UPDP_MSG; i++, last_offset++) { ett_nas_5gs_updp_msg[i] = -1; ett[last_offset] = &ett_nas_5gs_updp_msg[i]; } for (i = 0; i < NUM_NAS_5GS_UPDP_ELEM; i++, last_offset++) { ett_nas_5gs_updp_elem[i] = -1; ett[last_offset] = &ett_nas_5gs_updp_elem[i]; } static ei_register_info ei[] = { { &ei_nas_5gs_extraneous_data, { "nas_5gs.extraneous_data", PI_PROTOCOL, PI_NOTE, "Extraneous Data, dissector bug or later version spec(report to wireshark.org)", EXPFILL }}, { &ei_nas_5gs_unknown_pd,{ "nas_5gs.unknown_pd", PI_PROTOCOL, PI_ERROR, "Unknown protocol discriminator", EXPFILL } }, { &ei_nas_5gs_mm_unknown_msg_type,{ "nas_5gs.mm.unknown_msg_type", PI_PROTOCOL, PI_WARN, "Unknown Message Type", EXPFILL } }, { &ei_nas_5gs_sm_unknown_msg_type,{ "nas_5gs.sm.unknown_msg_type", PI_PROTOCOL, PI_WARN, "Unknown Message Type", EXPFILL } }, { &ei_nas_5gs_updp_unknown_msg_type,{ "nas_5gs.updp.unknown_msg_type", PI_PROTOCOL, PI_WARN, "Unknown Message Type", EXPFILL } }, { &ei_nas_5gs_msg_not_dis,{ "nas_5gs.msg_not_dis", PI_PROTOCOL, PI_WARN, "MSG IEs not dissected yet", EXPFILL } }, { &ei_nas_5gs_ie_not_dis,{ "nas_5gs.ie_not_dis", PI_PROTOCOL, PI_WARN, "IE not dissected yet", EXPFILL } }, { &ei_nas_5gs_missing_mandatory_elemen,{ "nas_5gs.missing_mandatory_element", PI_PROTOCOL, PI_ERROR, "Missing Mandatory element, rest of dissection is suspect", EXPFILL } }, { &ei_nas_5gs_dnn_too_long,{ "nas_5gs.dnn_to_long", PI_PROTOCOL, PI_ERROR, "DNN encoding has more than 100 octets", EXPFILL } }, { &ei_nas_5gs_unknown_value,{ "nas_5gs.unknown_value", PI_PROTOCOL, PI_ERROR, "Value not according to (decoded)specification", EXPFILL } }, { &ei_nas_5gs_num_pkt_flt,{ "nas_5gs.num_pkt_flt", PI_PROTOCOL, PI_ERROR, "num_pkt_flt != 0", EXPFILL } }, { &ei_nas_5gs_not_diss,{ "nas_5gs.not_diss", PI_PROTOCOL, PI_NOTE, "Not dissected yet", EXPFILL } }, }; expert_module_t* expert_nas_5gs; module_t *nas_5GS_module; /* Register protocol */ proto_nas_5gs = proto_register_protocol(PNAME, PSNAME, PFNAME); /* Register fields and subtrees */ proto_register_field_array(proto_nas_5gs, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); expert_nas_5gs = expert_register_protocol(proto_nas_5gs); expert_register_field_array(expert_nas_5gs, ei, array_length(ei)); /* Register dissector */ nas_5gs_handle = register_dissector(PFNAME, dissect_nas_5gs, proto_nas_5gs); nas_5GS_module = prefs_register_protocol(proto_nas_5gs, NULL); prefs_register_bool_preference(nas_5GS_module, "null_decipher", "Try to detect and decode EEA0 ciphered messages", "This should work when the NAS ciphering algorithm is NULL (128-EEA0)", &g_nas_5gs_null_decipher); } void proto_reg_handoff_nas_5gs(void) { eap_handle = find_dissector("eap"); nas_eps_handle = find_dissector("nas-eps"); nas_eps_plain_handle = find_dissector("nas-eps_plain"); lpp_handle = find_dissector("lpp"); gsm_a_dtap_handle = find_dissector("gsm_a_dtap"); dissector_add_string("media_type", "application/vnd.3gpp.5gnas", create_dissector_handle(dissect_nas_5gs_media_type, proto_nas_5gs)); proto_json = proto_get_id_by_filter_name("json"); } /* * Editor modelines * * Local Variables: * c-basic-offset: 4 * tab-width: 8 * indent-tabs-mode: nil * End: * * ex: set shiftwidth=4 tabstop=8 expandtab: * :indentSize=4:tabSize=8:noTabs=true: */