NAS 5GS: Dissect more UE policy management info.

Change-Id: Ie13934080edb70e0373c97e24b52f55724e122cd
Reviewed-on: https://code.wireshark.org/review/34596
Petri-Dish: Anders Broman <a.broman58@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Anders Broman 2019-09-23 16:28:09 +02:00 committed by Anders Broman
parent 02213cd510
commit e57aa1b0c6
1 changed files with 143 additions and 45 deletions

View File

@ -287,6 +287,7 @@ 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 hf_nas_5gs_sup_andsp = -1;
static int ett_nas_5gs = -1;
static int ett_nas_5gs_mm_nssai = -1;
@ -308,6 +309,7 @@ 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 ett_nas_5gs_updp_upsi_list = -1;
static int hf_nas_5gs_mm_abba = -1;
static int hf_nas_5gs_mm_supi_fmt = -1;
@ -398,7 +400,13 @@ 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 int hf_nas_5gs_dnn_len = -1;
static int hf_nas_5gs_upsi_sublist_len = -1;
static int hf_nas_5gs_upsc = -1;
static int hf_nas_5gs_os_id = -1;
static int hf_nas_5gs_os_id_len = -1;
static int hf_nas_5gs_os_app_id_len = -1;
static int hf_nas_5gs_os_app_id = -1;
static expert_field ei_nas_5gs_extraneous_data = EI_INIT;
static expert_field ei_nas_5gs_unknown_pd = EI_INIT;
@ -5241,6 +5249,7 @@ 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;
guint32 length;
/*
Traffic descriptor (octets v+5 to w)
@ -5252,14 +5261,24 @@ de_nas_5gs_ursp_traff_desc(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree)
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*/
case 1:
/* Match-all type*/
return;
case 8:
/* 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].
*/
proto_tree_add_item(tree, hf_nas_5gs_os_id, tvb, offset, 16, ENC_BIG_ENDIAN);
offset += 16;
proto_tree_add_item_ret_uint(tree, hf_nas_5gs_os_app_id_len, tvb, offset, 1, ENC_BIG_ENDIAN, &length);
offset += 1;
proto_tree_add_item(tree, hf_nas_5gs_os_app_id, tvb, offset, length, ENC_NA);
offset += length;
break;
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.
@ -5318,13 +5337,19 @@ de_nas_5gs_ursp_traff_desc(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree)
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.
two octets which specify an ethertype. */
case 0x88:
/*
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
*/
proto_tree_add_item_ret_uint(tree, hf_nas_5gs_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;
/* 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
@ -5420,7 +5445,7 @@ de_nas_5gs_ursp_r_sel_desc(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree)
/* 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);
proto_tree_add_item_ret_uint(tree, hf_nas_5gs_dnn_len, tvb, offset, 1, ENC_BIG_ENDIAN, &length);
offset++;
de_nas_5gs_cmn_dnn(tvb, tree, pinfo, offset, length, NULL, 0);
offset += length;
@ -5629,22 +5654,56 @@ de_nas_5gs_updp_ue_policy_section_mgm_res(tvbuff_t* tvb, proto_tree* tree, packe
/* D.6.4 UPSI list */
static guint16
de_nas_5gs_updp_upsi_list(tvbuff_t* tvb, proto_tree* tree, packet_info* pinfo,
de_nas_5gs_updp_upsi_list(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);
proto_tree* sub_tree;
proto_item* item;
guint32 curr_offset = offset;
guint32 end_offset = offset + len;
gint32 sublist_len;
/* UPSI sublist (PLMN 1) */
int i = 1;
while (curr_offset < end_offset ) {
sub_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, ett_nas_5gs_updp_upsi_list, &item,
" UPSI sublist (PLMN %u)", i);
proto_tree_add_item_ret_int(sub_tree, hf_nas_5gs_upsi_sublist_len, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &sublist_len);
proto_item_set_len(item, sublist_len + 2);
curr_offset += 2;
curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, sub_tree, curr_offset, E212_NONE, TRUE);
sublist_len -= 3;
while (sublist_len > 0) {
proto_tree_add_item(sub_tree, hf_nas_5gs_upsc, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
curr_offset += 2;
sublist_len -= 2;
}
}
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,
de_nas_5gs_updp_ue_policy_cm(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_oct3[] = {
&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_sup_andsp,
NULL
};
proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags_oct3, ENC_NA);
return len;
}
@ -5655,7 +5714,14 @@ 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);
gint32 length;
guint32 curr_offset = offset;
proto_tree_add_item_ret_uint(tree, hf_nas_5gs_os_id_len, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &length);
curr_offset++;
proto_tree_add_expert(tree, pinfo, &ei_nas_5gs_ie_not_dis, tvb, curr_offset, length);
return len;
}
@ -5769,14 +5835,12 @@ nas_5gs_updp_ue_state_indication(tvbuff_t* tvb, proto_tree* tree, packet_info* p
/* 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);
/* 41 UE OS Id OS Id D.6.6 O TLV 18-242 */
ELEM_OPT_TLV(0x41, NAS_5GS_PDU_TYPE_UPDP, DE_NAS_5GS_UPDP_UE_OS_ID, NULL);
}
@ -8032,18 +8096,51 @@ proto_register_nas_5gs(void)
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",
{ &hf_nas_5gs_dnn_len,
{ "Length", "nas_5gs.dnn_len",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_nas_5gs_sup_andsp,
{ "Support ANDSP", "nas_5gs.sup_andsp",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
NULL, HFILL }
},
{ &hf_nas_5gs_upsi_sublist_len,
{ "Length", "nas_5gs.upsi_sublist_len",
FT_INT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_nas_5gs_upsc,
{ "UPSC", "nas_5gs.upsc",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_nas_5gs_os_id,
{ "OS id(UUID)", "nas_5gs.os_id",
FT_GUID, BASE_NONE, NULL, 0x0,
NULL, HFILL } },
{ &hf_nas_5gs_os_id_len,
{ "Length", "nas_5gs.os_id_len",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_nas_5gs_os_app_id_len,
{ "Length", "nas_5gs.app_id_len",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_nas_5gs_os_app_id,
{ "OS App id", "nas_5gs.os_app_id",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL } },
};
guint i;
guint last_offset;
/* Setup protocol subtree array */
#define NUM_INDIVIDUAL_ELEMS 20
#define NUM_INDIVIDUAL_ELEMS 21
gint *ett[NUM_INDIVIDUAL_ELEMS +
NUM_NAS_5GS_COMMON_ELEM +
NUM_NAS_5GS_MM_MSG + NUM_NAS_5GS_MM_ELEM +
@ -8071,6 +8168,7 @@ proto_register_nas_5gs(void)
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;
ett[20] = &ett_nas_5gs_updp_upsi_list;
last_offset = NUM_INDIVIDUAL_ELEMS;