aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2019-01-31 14:27:00 +0100
committerAnders Broman <a.broman58@gmail.com>2019-01-31 14:39:49 +0000
commitafeec6d646aca89051658050a138fedb48b49565 (patch)
treef0112a4d5b689559068a907c5ca72f0bd1f03e75
parent6aad32583dcf9a159b68007546d699fb391c7f18 (diff)
NAS-5GS: Dissect more IEs
- 9.11.3.50A SMS indication - 9.11.3.51 SOR transparent container Change-Id: I12bcb1ab1a94eb4fff1673979ff2862a2ec62654 Reviewed-on: https://code.wireshark.org/review/31839 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r--epan/dissectors/packet-nas_5gs.c286
-rw-r--r--epan/tfs.c3
-rw-r--r--epan/tfs.h1
3 files changed, 283 insertions, 7 deletions
diff --git a/epan/dissectors/packet-nas_5gs.c b/epan/dissectors/packet-nas_5gs.c
index 26383eb7c1..2f996d08a1 100644
--- a/epan/dissectors/packet-nas_5gs.c
+++ b/epan/dissectors/packet-nas_5gs.c
@@ -21,6 +21,7 @@
#include <wsutil/pow2.h>
#include "packet-gsm_a_common.h"
+#include "packet-e212.h"
void proto_register_nas_5gs(void);
void proto_reg_handoff_nas_5gs(void);
@@ -54,6 +55,9 @@ 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;
@@ -268,7 +272,7 @@ 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 hf_nas_5gs_mm_abba = -1;
static int hf_nas_5gs_mm_suci = -1;
@@ -281,6 +285,7 @@ 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;
@@ -297,6 +302,28 @@ static int hf_nas_5gs_sm_mapd_eps_b_cont_eps_param_cont = -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 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;
@@ -1827,11 +1854,20 @@ static const value_string nas_5gs_mm_serv_type_vals[] = {
* 9.11.3.50A SMS indication
*/
static guint16
-de_nas_5gs_mm_sms_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
+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_)
{
- proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len);
+
+ 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;
}
@@ -1839,14 +1875,135 @@ de_nas_5gs_mm_sms_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
/*
* 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_)
{
- proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, offset, len);
+ /* 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);
- return len;
}
/*
@@ -5349,6 +5506,22 @@ proto_register_nas_5gs(void)
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,
@@ -6419,13 +6592,113 @@ proto_register_nas_5gs(void)
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 }
+ },
};
guint i;
guint last_offset;
/* Setup protocol subtree array */
-#define NUM_INDIVIDUAL_ELEMS 13
+#define NUM_INDIVIDUAL_ELEMS 14
gint *ett[NUM_INDIVIDUAL_ELEMS +
NUM_NAS_5GS_COMMON_ELEM +
NUM_NAS_5GS_MM_MSG + NUM_NAS_5GS_MM_ELEM +
@@ -6445,6 +6718,7 @@ proto_register_nas_5gs(void)
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;
last_offset = NUM_INDIVIDUAL_ELEMS;
diff --git a/epan/tfs.c b/epan/tfs.c
index 7649c49c08..5cd571fe19 100644
--- a/epan/tfs.c
+++ b/epan/tfs.c
@@ -96,4 +96,5 @@ const true_false_string tfs_c2s_s2c = { "Client to Server", "Server to Client" }
const true_false_string tfs_open_closed = { "Open", "Closed" };
const true_false_string tfs_external_internal = { "External", "Internal" };
const true_false_string tfs_changed_not_changed = { "Changed", "Not Changed" };
-const true_false_string tfs_needed_not_needed = { "Needed", "Needed Changed" };
+const true_false_string tfs_needed_not_needed = { "Needed", "Not Needed" };
+const true_false_string tfs_selected_not_selected = { "Selected", "Not Selected" };
diff --git a/epan/tfs.h b/epan/tfs.h
index 783fc859bb..dc81bd91a2 100644
--- a/epan/tfs.h
+++ b/epan/tfs.h
@@ -112,6 +112,7 @@ WS_DLL_PUBLIC const true_false_string tfs_open_closed;
WS_DLL_PUBLIC const true_false_string tfs_external_internal;
WS_DLL_PUBLIC const true_false_string tfs_changed_not_changed;
WS_DLL_PUBLIC const true_false_string tfs_needed_not_needed;
+WS_DLL_PUBLIC const true_false_string tfs_selected_not_selected;
#ifdef __cplusplus
}