pfcp: Update to 3GPP TS 29.244 V16.1.0

Change-Id: Iccc98a8f33d6de0ec466404a4f728442c8a58ea0
Reviewed-on: https://code.wireshark.org/review/35340
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:
Joakim Karlsson 2019-12-07 00:27:20 +01:00 committed by Anders Broman
parent c6c3ee1d62
commit c8dd7eed99
1 changed files with 412 additions and 95 deletions

View File

@ -10,7 +10,7 @@
*
* SPDX-License-Identifier: GPL-2.0-or-later
*
* Ref 3GPP TS 29.244 V16.0.0 (2019-06-13)
* Ref 3GPP TS 29.244 V16.1.0 (2019-09-18)
*/
#include "config.h"
@ -38,6 +38,7 @@ static int hf_pfcp_msg_type = -1;
static int hf_pfcp_msg_length = -1;
static int hf_pfcp_hdr_flags = -1;
static int hf_pfcp_version = -1;
static int hf_pfcp_fo_flag = -1;
static int hf_pfcp_mp_flag = -1;
static int hf_pfcp_s_flag = -1;
static int hf_pfcp_seid = -1;
@ -252,6 +253,13 @@ static int hf_pfcp_report_type_b0_dldr = -1;
static int hf_pfcp_offending_ie = -1;
static int hf_pfcp_up_function_features_o8_b2_vtime = -1;
static int hf_pfcp_up_function_features_o8_b1_rttl = -1;
static int hf_pfcp_up_function_features_o8_b0_mpas = -1;
static int hf_pfcp_up_function_features_o7_b7_gcom = -1;
static int hf_pfcp_up_function_features_o7_b6_bundl = -1;
static int hf_pfcp_up_function_features_o7_b5_mte_n4 = -1;
static int hf_pfcp_up_function_features_o7_b4_mnop = -1;
static int hf_pfcp_up_function_features_o7_b3_sset = -1;
static int hf_pfcp_up_function_features_o7_b2_ueip = -1;
static int hf_pfcp_up_function_features_o7_b1_adpdp = -1;
@ -297,16 +305,26 @@ static int hf_pfcp_usage_report_trigger_o6_b0_volqu = -1;
static int hf_pfcp_usage_report_trigger_o7_b0_evequ = -1;
static int hf_pfcp_volume_measurement = -1;
static int hf_pfcp_volume_measurement_b5_dlnop = -1;
static int hf_pfcp_volume_measurement_b4_ulnop = -1;
static int hf_pfcp_volume_measurement_b3_tonop = -1;
static int hf_pfcp_volume_measurement_b2_dlvol = -1;
static int hf_pfcp_volume_measurement_b1_ulvol = -1;
static int hf_pfcp_volume_measurement_b0_tovol = -1;
static int hf_pfcp_vol_meas_tovol = -1;
static int hf_pfcp_vol_meas_ulvol = -1;
static int hf_pfcp_vol_meas_dlvol = -1;
static int hf_pfcp_vol_meas_tonop = -1;
static int hf_pfcp_vol_meas_ulnop = -1;
static int hf_pfcp_vol_meas_dlnop = -1;
static int hf_pfcp_cp_function_features = -1;
static int hf_pfcp_cp_function_features_b0_load = -1;
static int hf_pfcp_cp_function_features_b5_mpas = -1;
static int hf_pfcp_cp_function_features_b4_bundl = -1;
static int hf_pfcp_cp_function_features_b3_sset = -1;
static int hf_pfcp_cp_function_features_b2_epfar = -1;
static int hf_pfcp_cp_function_features_b1_ovrl = -1;
static int hf_pfcp_cp_function_features_b0_load = -1;
static int hf_pfcp_usage_information = -1;
static int hf_pfcp_usage_information_b3_ube = -1;
@ -379,6 +397,7 @@ static int hf_pfcp_measurement_info_b0_mbqe = -1;
static int hf_pfcp_measurement_info_b1_inam = -1;
static int hf_pfcp_measurement_info_b2_radi = -1;
static int hf_pfcp_measurement_info_b3_istm = -1;
static int hf_pfcp_measurement_info_b4_mnop = -1;
static int hf_pfcp_node_report_type = -1;
static int hf_pfcp_node_report_type_b0_upfr = -1;
@ -543,12 +562,20 @@ static int hf_pfcp_steering_mode = -1;
static int hf_pfcp_weight = -1;
static int hf_pfcp_priority = -1;
static int hf_pfcp_ue_ip_address_pool_length = -1;
static int hf_pfcp_ue_ip_address_pool_identity = -1;
static int hf_pfcp_pfcp_alternative_smf_ip_address_flags = -1;
static int hf_pfcp_alternative_smf_ip_address_ipv4 = -1;
static int hf_pfcp_alternative_smf_ip_address_ipv6 = -1;
static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags = -1;
static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b3_dcaroni = -1;
static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b2_prin6i = -1;
static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b1_prin19i = -1;
static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b0_priueai = -1;
static int hf_pfcp_validity_time_value = -1;
static int ett_pfcp = -1;
static int ett_pfcp_flags = -1;
@ -605,6 +632,7 @@ static int ett_pfcp_adnp = -1;
static int ett_pfcp_pfcpsrreq = -1;
static int ett_pfcp_pfcpaureq = -1;
static int ett_pfcp_alternative_smf_ip_address_flags = -1;
static int ett_packet_replication_and_detection_carry_on_information = -1;
@ -645,7 +673,7 @@ typedef struct pfcp_info {
static dissector_table_t pfcp_enterprise_ies_dissector_table;
static void dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint offset, guint8 message_type, pfcp_session_args_t *args _U_);
static void dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint offset, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
static void dissect_pfcp_create_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
static void dissect_pfcp_pdi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
static void dissect_pfcp_create_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
@ -994,7 +1022,10 @@ static const value_string pfcp_ie_type[] = {
{ 176, "Update Access Forwarding Action Information 2"}, /* Extendable / Clause 8.2.127 */
{ 177, "UE IP address Pool Identity"}, /* Variable Length / Clause 8.2.128 */
{ 178, "Alternative SMF IP Address"}, /* Extendable / Clause 8.2.129 */
//179 to 32767 Spare. For future use.
{ 179, "Packet Replication and Detection Carry-On Information"},/* Extendable / Clause 8.2.130 */
{ 180, "SMF Set ID"}, /* Extendable / Clause 8.2.131 */
{ 181, "Quota Validity Time"}, /* Extendable / Clause 8.2.132 */
//182 to 32767 Spare. For future use.
//32768 to 65535 Vendor-specific IEs.
{0, NULL}
};
@ -1427,6 +1458,7 @@ static const value_string pfcp_source_interface_vals[] = {
{ 1, "Core" },
{ 2, "SGi-LAN/N6-LAN" },
{ 3, "CP-function" },
{ 4, "5G VN Internal" },
{ 0, NULL }
};
static int
@ -2199,6 +2231,7 @@ static const value_string pfcp_dst_interface_vals[] = {
{ 2, "SGi-LAN/N6-LAN" },
{ 3, "CP- Function" },
{ 4, "LI Function" },
{ 5, "5G VN Internal" },
{ 0, NULL }
};
@ -2275,19 +2308,33 @@ dissect_pfcp_up_function_features(tvbuff_t *tvb, packet_info *pinfo, proto_tree
}
static const int * pfcp_up_function_features_o7_flags[] = {
&hf_pfcp_spare_b7_b4,
&hf_pfcp_up_function_features_o7_b7_gcom,
&hf_pfcp_up_function_features_o7_b6_bundl,
&hf_pfcp_up_function_features_o7_b5_mte_n4,
&hf_pfcp_up_function_features_o7_b4_mnop,
&hf_pfcp_up_function_features_o7_b3_sset,
&hf_pfcp_up_function_features_o7_b2_ueip,
&hf_pfcp_up_function_features_o7_b1_adpdp,
&hf_pfcp_up_function_features_o7_b0_dpdra,
NULL
};
/* Octet 7 Spare Spare Spare Spare SSET UEIP ADPDP DPDRA */
/* Octet 7 GCOM BUNDL MTE N4 MNOP SSET UEIP ADPDP DPDRA */
proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o7_flags, ENC_BIG_ENDIAN);
offset++;
/* Octet 8 Spare */
proto_tree_add_item(tree, hf_pfcp_spare, tvb, offset, 1, ENC_BIG_ENDIAN);
if (offset == length) {
return;
}
static const int * pfcp_up_function_features_o8_flags[] = {
&hf_pfcp_spare_b7_b3,
&hf_pfcp_up_function_features_o8_b2_vtime,
&hf_pfcp_up_function_features_o8_b1_rttl,
&hf_pfcp_up_function_features_o8_b0_mpas,
NULL
};
/* Octet 8 Spare Spare Spare Spare Spare VTIME RTTL MPAS */
proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o8_flags, ENC_BIG_ENDIAN);
offset += 1;
if (offset < length) {
@ -2707,12 +2754,46 @@ static const value_string pfcp_node_id_type_vals[] = {
{ 0, NULL }
};
static int
decode_pfcp_fqdn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, gint offset, guint16 length)
{
int name_len, tmp;
guint8 *fqdn = NULL;
/* FQDN, the Node ID value encoding shall be identical to the encoding of a FQDN
* within a DNS message of section 3.1 of IETF RFC 1035 [27] but excluding the trailing zero byte.
*/
if (length > 0)
{
name_len = tvb_get_guint8(tvb, offset);
/* NOTE 1: The FQDN field in the IE is not encoded as a dotted string as commonly used in DNS master zone files. */
if (name_len < 0x40) {
fqdn = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 1, length - 2, ENC_ASCII);
for (;;) {
if (name_len >= length - 2)
break;
tmp = name_len;
name_len = name_len + fqdn[tmp] + 1;
fqdn[tmp] = '.';
}
}
/* In case the FQDN field is incorrectly in dotted string form.*/
else {
fqdn = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length - 1, ENC_ASCII);
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, offset, length - 1);
}
proto_tree_add_string(tree, hf_pfcp_node_id_fqdn, tvb, offset, length - 1, fqdn);
proto_item_append_text(item, "%s", fqdn);
offset += length - 1;
}
return offset;
}
static void
dissect_pfcp_node_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
{
int offset = 0, name_len, tmp;
int offset = 0;
guint32 node_id_type;
guint8 *fqdn = NULL;
/* Octet 5 Spare Node ID Type*/
proto_tree_add_item(tree, hf_pfcp_spare_h1, tvb, offset, 1, ENC_BIG_ENDIAN);
@ -2734,31 +2815,8 @@ dissect_pfcp_node_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_
offset += 16;
break;
case 2:
/* FQDN, the Node ID value encoding shall be identical to the encoding of a FQDN
* within a DNS message of section 3.1 of IETF RFC 1035 [27] but excluding the trailing zero byte.
*/
if (length > 1) {
name_len = tvb_get_guint8(tvb, offset);
/* NOTE 1: The FQDN field in the IE is not encoded as a dotted string as commonly used in DNS master zone files. */
if (name_len < 0x40) {
fqdn = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 1, length - 2, ENC_ASCII);
for (;;) {
if (name_len >= length - 2)
break;
tmp = name_len;
name_len = name_len + fqdn[tmp] + 1;
fqdn[tmp] = '.';
}
}
/* In case the FQDN field is incorrectly in dotted string form.*/
else {
fqdn = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length - 1, ENC_ASCII);
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, offset, length - 1);
}
proto_tree_add_string(tree, hf_pfcp_node_id_fqdn, tvb, offset, length - 1, fqdn);
proto_item_append_text(item, "%s", fqdn);
offset += length - 1;
}
/* FQDN */
offset = decode_pfcp_fqdn(tvb, pinfo, tree, item, offset, length);
break;
default:
break;
@ -3134,35 +3192,56 @@ dissect_pfcp_volume_measurement(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
guint64 flags;
static const int * pfcp_volume_measurement_flags[] = {
&hf_pfcp_spare_b7_b3,
&hf_pfcp_spare_b7_b6,
&hf_pfcp_volume_measurement_b5_dlnop,
&hf_pfcp_volume_measurement_b4_ulnop,
&hf_pfcp_volume_measurement_b3_tonop,
&hf_pfcp_volume_measurement_b2_dlvol,
&hf_pfcp_volume_measurement_b1_ulvol,
&hf_pfcp_volume_measurement_b0_tovol,
NULL
};
/* Octet 5 Spare DLVOL ULVOL TOVOL*/
/* Octet 5 Spare DLNOP ULNOP TONOP DLVOL ULVOL TOVOL*/
proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_volume_measurement,
ett_pfcp_volume_measurement, pfcp_volume_measurement_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
offset += 1;
/* Bit 1 - TOVOL: If this bit is set to "1", then the Total Volume field shall be present*/
if ((flags & 0x1) == 1) {
if ((flags & 0x1)) {
/* m to (m+7) Total Volume */
proto_tree_add_item(tree, hf_pfcp_vol_meas_tovol, tvb, offset, 8, ENC_BIG_ENDIAN);
offset += 8;
}
/* Bit 2 - ULVOL: If this bit is set to "1", then the Total Volume field shall be present*/
if ((flags & 0x2) == 2) {
if ((flags & 0x2)) {
/* p to (p+7) Uplink Volume */
proto_tree_add_item(tree, hf_pfcp_vol_meas_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
offset += 8;
}
/* Bit 3 - DLVOL: If this bit is set to "1", then the Total Volume field shall be present*/
if ((flags & 0x4) == 4) {
if ((flags & 0x4)) {
/*q to (q+7) Downlink Volume */
proto_tree_add_item(tree, hf_pfcp_vol_meas_dlvol, tvb, offset, 8, ENC_BIG_ENDIAN);
offset += 8;
}
/* Bit 4 - TONOP: If this bit is set to "1", then the Total Number of Packets field shall be present*/
if ((flags & 0x8)) {
/* r to (r+7) Total Number of Packets */
proto_tree_add_item(tree, hf_pfcp_vol_meas_tonop, tvb, offset, 8, ENC_BIG_ENDIAN);
offset += 8;
}
/* Bit 5 - ULNOP: If this bit is set to "1", then the Total Number of Packets field shall be present*/
if ((flags & 0x10)) {
/* s to (s+7) Uplink Number of Packets */
proto_tree_add_item(tree, hf_pfcp_vol_meas_ulnop, tvb, offset, 8, ENC_BIG_ENDIAN);
offset += 8;
}
/* Bit 6 - DLNOP: If this bit is set to "1", then the Total Number of Packets field shall be present*/
if ((flags & 0x20)) {
/*t to (t+7) Downlink Number of Packets */
proto_tree_add_item(tree, hf_pfcp_vol_meas_dlnop, tvb, offset, 8, ENC_BIG_ENDIAN);
offset += 8;
}
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
@ -3469,17 +3548,19 @@ dissect_pfcp_linked_urr_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
static const value_string pfcp_outer_hdr_desc_vals[] = {
{ 0x0100, "GTP-U/UDP/IPv4 " },
{ 0x0200, "GTP-U/UDP/IPv6 " },
{ 0x0300, "GTP-U/UDP/IPv4/IPv6 " },
{ 0x0400, "UDP/IPv4 " },
{ 0x0800, "UDP/IPv6 " },
{ 0x0C00, "UDP/IPv4/IPv6 " },
{ 0x1000, "IPv4 " },
{ 0x2000, "IPv6 " },
{ 0x3000, "IPv4/IPv6 " },
{ 0x4000, "C-TAG " },
{ 0x8000, "S-TAG " },
{ 0x000100, "GTP-U/UDP/IPv4 " },
{ 0x000200, "GTP-U/UDP/IPv6 " },
{ 0x000300, "GTP-U/UDP/IPv4/IPv6 " },
{ 0x000400, "UDP/IPv4 " },
{ 0x000800, "UDP/IPv6 " },
{ 0x000C00, "UDP/IPv4/IPv6 " },
{ 0x001000, "IPv4 " },
{ 0x002000, "IPv6 " },
{ 0x003000, "IPv4/IPv6 " },
{ 0x004000, "C-TAG " },
{ 0x008000, "S-TAG " },
{ 0x010000, "N19 Indication " },
{ 0x020000, "N6 Indication " },
{ 0, NULL }
};
@ -3497,7 +3578,7 @@ dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree
* The TEID field shall be present if the Outer Header Creation Description requests the creation of a GTP-U header.
* Otherwise it shall not be present
*/
if ((value & 0x0100) || (value & 0x0200)) {
if ((value & 0x000100) || (value & 0x000200)) {
proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_teid, tvb, offset, 4, ENC_BIG_ENDIAN);
offset += 4;
}
@ -3506,7 +3587,7 @@ dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree
* p to (p+3) IPv4
* The IPv4 Address field shall be present if the Outer Header Creation Description requests the creation of a IPv4 header
*/
if ((value & 0x0100) || (value & 0x0400) || (value & 0x1000)) {
if ((value & 0x000100) || (value & 0x000400) || (value & 0x001000)) {
proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
offset += 4;
}
@ -3515,7 +3596,7 @@ dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree
* q to (q+15) IPv6
* The IPv6 Address field shall be present if the Outer Header Creation Description requests the creation of a IPv6 header
*/
if ((value & 0x0200) || (value & 0x0800) || (value & 0x2000)) {
if ((value & 0x000200) || (value & 0x000800) || (value & 0x002000)) {
proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_ipv6, tvb, offset, 16, ENC_NA);
offset += 16;
}
@ -3524,7 +3605,7 @@ dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree
* r to (r+1) Port Number
* The Port Number field shall be present if the Outer Header Creation Description requests the creation of a UDP/IP header
*/
if ((value & 0x0400) || (value & 0x0800)) {
if ((value & 0x000400) || (value & 0x000800)) {
proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_port, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
}
@ -3533,7 +3614,7 @@ dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree
* t to (t+2) C-TAG
* The C-TAG field shall be present if the Outer Header Creation Description requests the setting of the C-Tag in Ethernet packet
*/
if (value & 0x4000) {
if (value & 0x004000) {
offset = decode_pfcp_c_tag(tvb, pinfo, tree, item, offset);
}
@ -3541,7 +3622,7 @@ dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree
* u to (u+2) S-TAG
* The S-TAG field shall be present if the Outer Header Creation Description requests the setting of the S-Tag in Ethernet packet
*/
if (value & 0x8000) {
if (value & 0x008000) {
offset = decode_pfcp_s_tag(tvb, pinfo, tree, item, offset);
}
@ -3588,6 +3669,11 @@ dissect_pfcp_cp_function_features(tvbuff_t *tvb, packet_info *pinfo, proto_tree
int offset = 0;
static const int * pfcp_cp_function_features_flags[] = {
&hf_pfcp_spare_b7_b6,
&hf_pfcp_cp_function_features_b5_mpas,
&hf_pfcp_cp_function_features_b4_bundl,
&hf_pfcp_cp_function_features_b3_sset,
&hf_pfcp_cp_function_features_b2_epfar,
&hf_pfcp_cp_function_features_b1_ovrl,
&hf_pfcp_cp_function_features_b0_load,
NULL
@ -3969,14 +4055,15 @@ dissect_pfcp_measurement_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
int offset = 0;
static const int * pfcp_measurement_info_flags[] = {
&hf_pfcp_spare_b7_b4,
&hf_pfcp_spare_b7_b5,
&hf_pfcp_measurement_info_b4_mnop,
&hf_pfcp_measurement_info_b3_istm,
&hf_pfcp_measurement_info_b2_radi,
&hf_pfcp_measurement_info_b1_inam,
&hf_pfcp_measurement_info_b0_mbqe,
NULL
};
/* Octet 5 Spare ISTM INAM MBQE */
/* Octet 5 Spare MNOP ISTM INAM MBQE */
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_measurement_info,
ett_pfcp_measurement_info, pfcp_measurement_info_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
offset += 1;
@ -5368,6 +5455,9 @@ static const value_string pfcp_tgpp_interface_type_vals[] = {
{ 13, "N3 Untrusted Non-3GPP Access" },
{ 14, "N3 for data forwarding" },
{ 15, "N9" },
{ 16, "SGi" },
{ 17, "N6" },
{ 18, "N19" },
{ 0, NULL }
};
@ -5615,11 +5705,19 @@ static void
dissect_pfcp_ue_ip_address_pool_identity(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
{
int offset = 0;
/* Octet 5 to (n+4) UE IP address Pool Identity
guint32 pool_length;
/* Octet 7 to "k" UE IP address Pool Identity
* The UE IP address Pool Identity field shall be encoded as an OctetString
* (see the Framed-Ipv6-Pool and Framed-Pool in clause 12.6.3 of 3GPP TS 29.561).
*/
proto_tree_add_item(tree, hf_pfcp_ue_ip_address_pool_identity, tvb, offset, length, ENC_NA);
proto_tree_add_item_ret_uint(tree, hf_pfcp_ue_ip_address_pool_length, tvb, 0, 1, ENC_BIG_ENDIAN, &pool_length);
proto_tree_add_item(tree, hf_pfcp_ue_ip_address_pool_identity, tvb, offset, pool_length, ENC_NA);
offset += pool_length;
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/*
@ -5660,6 +5758,72 @@ dissect_pfcp_alternative_smf_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto
}
}
/*
* 8.2.130 Packet Replication and Detection Carry-On Information
*/
static void
dissect_pfcp_packet_replication_and_detection_carry_on_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
{
int offset = 0;
static const int * pfcp_packet_replication_and_detection_carry_on_information_flags[] = {
&hf_pfcp_spare_b7_b4,
&hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b3_dcaroni,
&hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b2_prin6i,
&hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b1_prin19i,
&hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b0_priueai,
NULL
};
/* Octet 5 Spare Spare Spare Spare DCARONI PRIN6I PRIN19I PRIUEAI */
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_packet_replication_and_detection_carry_on_information_flags,
ett_packet_replication_and_detection_carry_on_information, pfcp_packet_replication_and_detection_carry_on_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
offset += 1;
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/*
* 8.2.131 SMF Set ID
*/
static void
dissect_pfcp_smf_set_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
{
int offset = 0;
/* Octet 5 Spare */
proto_tree_add_item(tree, hf_pfcp_spare, tvb, offset, 1, ENC_BIG_ENDIAN);
offset++;
/* 6 to m FQDN */
offset = decode_pfcp_fqdn(tvb, pinfo, tree, item, offset, length);
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/*
* 8.2.132 Quota Validity Time
*/
static void
dissect_pfcp_quota_validity_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
{
int offset = 0;
guint value;
/* The Quota Validity Time value shall be encoded as an Unsigned32 binary integer value. */
proto_tree_add_item_ret_uint(tree, hf_pfcp_validity_time_value, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
offset += 4;
proto_item_append_text(item, "%u", value);
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/* Array of functions to dissect IEs
* (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
*/
@ -5847,7 +6011,10 @@ static const pfcp_ie_t pfcp_ies[] = {
/* 176 */ { dissect_pfcp_update_access_forwarding_action_information_2 }, /* Update Access Forwarding Action Information 2 Extendable / Table 7.5.4.16-3 */
/* 177 */ { dissect_pfcp_ue_ip_address_pool_identity }, /* UE IP address Pool Identity Variable Length / Clause 8.2.128 */
/* 178 */ { dissect_pfcp_alternative_smf_ip_address }, /* Alternative SMF IP Address Extendable / Clause 8.2.129 */
//179 to 32767 Spare. For future use.
/* 179 */ { dissect_pfcp_packet_replication_and_detection_carry_on_information }, /* Packet Replication and Detection Carry-On Information Extendable / Clause 8.2.130 */
/* 180 */ { dissect_pfcp_smf_set_id }, /* SMF Set ID Extendable / Clause 8.2.131 */
/* 181 */ { dissect_pfcp_quota_validity_time }, /* Quota Validity Time Extendable / Clause 8.2.132 */
//182 to 32767 Spare. For future use.
//32768 to 65535 Vendor-specific IEs.
{ NULL }, /* End of List */
};
@ -6020,7 +6187,7 @@ dissect_pfcp_grouped_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro
grouped_tree = proto_item_add_subtree(tree, ett_index);
new_tvb = tvb_new_subset_length(tvb, offset, length);
dissect_pfcp_ies_common(new_tvb, pinfo, grouped_tree, 0, message_type, args);
dissect_pfcp_ies_common(new_tvb, pinfo, grouped_tree, offset, length, message_type, args);
}
@ -6320,12 +6487,12 @@ dissect_pfcp_update_access_forwarding_action_information_2(tvbuff_t *tvb, packet
}
static void
dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint offset, guint8 message_type, pfcp_session_args_t *args)
dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint offset, guint16 length, guint8 message_type, pfcp_session_args_t *args)
{
proto_tree *ie_tree;
proto_item *ti;
tvbuff_t *ie_tvb;
guint16 type, length;
guint16 type, length_ie;
guint16 enterprise_id;
/* 8.1.1 Information Element Format */
@ -6348,14 +6515,14 @@ dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
/* Length: this field contains the length of the IE excluding the first four octets, which are common for all IEs */
/* Process the IEs*/
while (offset < (gint)tvb_reported_length(tvb)) {
while (offset < length) {
/* Octet 1 -2 */
type = tvb_get_ntohs(tvb, offset);
length = tvb_get_ntohs(tvb, offset + 2);
length_ie = tvb_get_ntohs(tvb, offset + 2);
if ((type & 0x8000) == 0x8000 ) {
enterprise_id = tvb_get_ntohs(tvb, offset + 4);
ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 + length, ett_pfcp_ie, &ti, "Enterprise %s specific IE: %u",
ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 + length_ie, ett_pfcp_ie, &ti, "Enterprise %s specific IE: %u",
try_enterprises_lookup(enterprise_id),
type);
@ -6375,7 +6542,7 @@ dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
* e.g. by including the Update URR IE in the PFCP Session Modification Request
* with the IE(s) to be removed with a null length.
*/
if (length == 0) {
if (length_ie == 0) {
proto_item_append_text(ti, "[IE to be removed]");
/* Adding offset for EnterpriseID as Bit 8 of Octet 1 is set, the Enterprise ID is present */
@ -6383,12 +6550,12 @@ dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
} else {
/* give the whole IE to the subdissector */
ie_tvb = tvb_new_subset_length(tvb, offset - 4, length+4);
ie_tvb = tvb_new_subset_length(tvb, offset - 4, length_ie+4);
if (!dissector_try_uint_new(pfcp_enterprise_ies_dissector_table, enterprise_id, ie_tvb, pinfo, ie_tree, FALSE, ti)) {
proto_tree_add_item(ie_tree, hf_pfcp_enterprise_data, ie_tvb, 6, -1, ENC_NA);
}
}
offset += length;
offset += length_ie;
} else {
int tmp_ett;
if (type < (NUM_PFCP_IES - 1)) {
@ -6396,7 +6563,7 @@ dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
} else {
tmp_ett = ett_pfcp_ie;
}
ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 + length, tmp_ett, &ti, "%s : ",
ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 + length_ie, tmp_ett, &ti, "%s : ",
val_to_str_ext_const(type, &pfcp_ie_type_ext, "Unknown"));
proto_tree_add_item(ie_tree, hf_pfcp2_ie, tvb, offset, 2, ENC_BIG_ENDIAN);
@ -6411,29 +6578,29 @@ dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
* e.g. by including the Update URR IE in the PFCP Session Modification Request
* with the IE(s) to be removed with a null length.
*/
if( length == 0 ) {
if( length_ie == 0 ) {
proto_item_append_text(ti, "[IE to be removed]");
} else {
if (type < (NUM_PFCP_IES -1)) {
ie_tvb = tvb_new_subset_length(tvb, offset, length);
ie_tvb = tvb_new_subset_length(tvb, offset, length_ie);
if(pfcp_ies[type].decode){
(*pfcp_ies[type].decode) (ie_tvb, pinfo, ie_tree, ti, length, message_type, args);
(*pfcp_ies[type].decode) (ie_tvb, pinfo, ie_tree, ti, length_ie, message_type, args);
} else {
/* NULL function pointer, we have no decoding function*/
proto_tree_add_expert(ie_tree, pinfo, &ei_pfcp_ie_not_decoded_null, tvb, offset, length);
proto_tree_add_expert(ie_tree, pinfo, &ei_pfcp_ie_not_decoded_null, tvb, offset, length_ie);
}
} else {
/* IE id outside of array, We have no decoding function for it */
proto_tree_add_expert(ie_tree, pinfo, &ei_pfcp_ie_not_decoded_to_large, tvb, offset, length);
proto_tree_add_expert(ie_tree, pinfo, &ei_pfcp_ie_not_decoded_to_large, tvb, offset, length_ie);
}
}
offset += length;
offset += length_ie;
}
}
}
static int
dissect_pfcp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data _U_)
dissect_pfcp_message(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
{
proto_item *item;
proto_tree *sub_tree;
@ -6441,7 +6608,7 @@ dissect_pfcp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data
guint64 pfcp_flags;
guint8 message_type, cause_aux;
guint32 length;
guint32 length_remaining;
guint32 length_total;
int seq_no = 0;
conversation_t *conversation;
pfcp_conv_info_t *pfcp_info;
@ -6452,7 +6619,7 @@ dissect_pfcp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data
&hf_pfcp_version,
&hf_pfcp_spare_b4,
&hf_pfcp_spare_b3,
&hf_pfcp_spare_b2,
&hf_pfcp_fo_flag,
&hf_pfcp_mp_flag,
&hf_pfcp_s_flag,
NULL
@ -6499,7 +6666,7 @@ dissect_pfcp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data
/* 7.2.2 Message Header */
/*
Octet 8 7 6 5 4 3 2 1
1 | Version |Spare|Spare|Spare| MP | S |
1 | Version |Spare|Spare| FO | MP | S |
2 | Message Type |
3 | Message Length (1st Octet) |
4 | Message Length (2nd Octet) |
@ -6524,14 +6691,9 @@ dissect_pfcp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data
/* Octet 3 - 4 Message Length */
proto_tree_add_item_ret_uint(sub_tree, hf_pfcp_msg_length, tvb, offset, 2, ENC_BIG_ENDIAN, &length);
offset += 2;
/*
* The length field shall indicate the length of the message in octets
* excluding the mandatory part of the PFCP header (the first 4 octets).
*/
length_remaining = tvb_reported_length_remaining(tvb, offset);
if (length != length_remaining) {
proto_tree_add_expert_format(sub_tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, offset, -1, "Invalid Length for the message: %d instead of %d", length, length_remaining);
}
/* length of the message in octets plus the excluded mandatory part of the PFCP header (the first 4 octets) */
length_total = (length + 4);
if ((pfcp_flags & 0x1) == 1) {
/* If S flag is set to 1, then SEID shall be placed into octets 5-12*/
@ -6543,7 +6705,7 @@ dissect_pfcp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data
/* 7.2.2.2 PFCP Header for Node Related Messages */
/*
Octet 8 7 6 5 4 3 2 1
1 | Version |Spare|Spare|Spare| MP=0 | S=0 |
1 | Version |Spare|Spare| FO=0 | MP=0 | S=0 |
2 | Message Type |
3 | Message Length (1st Octet) |
4 | Message Length (2nd Octet) |
@ -6551,7 +6713,7 @@ dissect_pfcp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data
6 | Sequence Number (2st Octet) |
7 | Sequence Number (3st Octet) |
8 | Spare |
*/
*/
proto_tree_add_item_ret_uint(sub_tree, hf_pfcp_seqno, tvb, offset, 3, ENC_BIG_ENDIAN, &seq_no);
offset += 3;
@ -6565,7 +6727,7 @@ dissect_pfcp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data
offset++;
/* Dissect the IEs in the message */
dissect_pfcp_ies_common(tvb, pinfo, sub_tree, offset, message_type, args);
dissect_pfcp_ies_common(tvb, pinfo, sub_tree, offset, length_total, message_type, args);
/* Use sequence number to track Req/Resp pairs */
cause_aux = 16; /* Cause accepted by default. Only used when args is NULL */
@ -6579,7 +6741,29 @@ dissect_pfcp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data
pfcp_track_session(tvb, pinfo, sub_tree, pfcp_hdr, args->seid_list, args->ip_list, args->last_seid, args->last_ip);
}
return tvb_reported_length(tvb);
return length_total;
}
static int
dissect_pfcp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data _U_)
{
int offset = 0;
guint length = tvb_reported_length(tvb);
/* 7.2.1A PFCP messages bundled in one UDP/IP packet */
/* Each bundled PFCP message shall contain its PFCP message header and may */
/* contain subsequent information element(s) dependent on the type of message. */
do
{
/* length of the message in octets plus the excluded mandatory part of the PFCP header (the first 4 octets) */
guint16 message_length = (tvb_get_guint16(tvb, 2, 0) + 4);
tvbuff_t *message_tvb = tvb_new_subset_length(tvb, offset, message_length);
offset += dissect_pfcp_message(message_tvb, pinfo, tree);
} while (length > (guint)offset);
return length;
}
/* Enterprise IE decoding 3GPP */
@ -6655,6 +6839,11 @@ proto_register_pfcp(void)
FT_UINT8, BASE_DEC, NULL, 0xe0,
NULL, HFILL }
},
{ &hf_pfcp_fo_flag,
{ "Follow On (FO)", "pfcp.fo_flag",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_pfcp_mp_flag,
{ "Message Priority (MP)", "pfcp.mp_flag",
FT_BOOLEAN, 8, NULL, 0x02,
@ -7808,6 +7997,41 @@ proto_register_pfcp(void)
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
"UP function support of PFCP sessions successively controlled by different SMFs of a same SMF", HFILL }
},
{ &hf_pfcp_up_function_features_o7_b4_mnop,
{ "MNOP", "pfcp.up_function_features.mnop",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
"UPF supports measurement of number of packets which is instructed with the flag 'Measurement of Number of Packets' in a URR", HFILL }
},
{ &hf_pfcp_up_function_features_o7_b5_mte_n4,
{ "MTE N4", "pfcp.up_function_features.mte_n4",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
"UPF supports multiple instances of Traffic Endpoint IDs in a PDI", HFILL }
},
{ &hf_pfcp_up_function_features_o7_b6_bundl,
{ "BUNDL", "pfcp.up_function_features.bundl",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
"PFCP messages bunding", HFILL }
},
{ &hf_pfcp_up_function_features_o7_b7_gcom,
{ "GCOM", "pfcp.up_function_features.gcom",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
"UPF support of 5G VN Group Communication", HFILL }
},
{ &hf_pfcp_up_function_features_o8_b0_mpas,
{ "MPAS", "pfcp.up_function_features.mpas",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
"UPF support for multiple PFCP associations to the SMFs in an SMF set", HFILL }
},
{ &hf_pfcp_up_function_features_o8_b1_rttl,
{ "RTTL", "pfcp.up_function_features.rttl",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
"The UP function supports redundant transmission at transport layer", HFILL }
},
{ &hf_pfcp_up_function_features_o8_b2_vtime,
{ "VTIME", "pfcp.up_function_features.vtime",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
"UPF support of quota validity time feature", HFILL }
},
{ &hf_pfcp_sequence_number,
{ "Sequence Number", "pfcp.sequence_number",
FT_UINT32, BASE_DEC, NULL, 0x0,
@ -7848,6 +8072,21 @@ proto_register_pfcp(void)
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_pfcp_volume_measurement_b3_tonop,
{ "TONOP", "pfcp.volume_measurement_flags.tonop",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_pfcp_volume_measurement_b4_ulnop,
{ "ULNOP", "pfcp.volume_measurement_flags.ulnop",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_pfcp_volume_measurement_b5_dlnop,
{ "DLNOP", "pfcp.volume_measurement_flags.dlnops",
FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
{ &hf_pfcp_vol_meas_tovol,
{ "Total Volume", "pfcp.volume_measurement.tovol",
FT_UINT64, BASE_DEC, NULL, 0x0,
@ -7863,6 +8102,21 @@ proto_register_pfcp(void)
FT_UINT64, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_vol_meas_tonop,
{ "Total Number of Packets", "pfcp.volume_measurement.tonop",
FT_UINT64, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_vol_meas_ulnop,
{ "Uplink Number of Packets", "pfcp.volume_measurement.ulnop",
FT_UINT64, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_vol_meas_dlnop,
{ "Downlink Number of Packets", "pfcp.volume_measurement.dlnop",
FT_UINT64, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_cp_function_features,
{ "Flags", "pfcp.cp_function_features",
FT_UINT8, BASE_HEX, NULL, 0x0,
@ -7878,6 +8132,26 @@ proto_register_pfcp(void)
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
"Overload Control", HFILL }
},
{ &hf_pfcp_cp_function_features_b2_epfar,
{ "EPFAR", "pfcp.cp_function_features.epfar",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
"The CP function supports the Enhanced PFCP Association Release feature", HFILL }
},
{ &hf_pfcp_cp_function_features_b3_sset,
{ "SSET", "pfcp.cp_function_features.sset",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
"SMF support of PFCP sessions successively controlled by different SMFs of a same SMF Set", HFILL }
},
{ &hf_pfcp_cp_function_features_b4_bundl,
{ "BUNDL", "pfcp.cp_function_features.bundl",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
"PFCP messages bunding", HFILL }
},
{ &hf_pfcp_cp_function_features_b5_mpas,
{ "MPAS", "pfcp.cp_function_features.mpas",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
"SMF support for multiple PFCP associations from an SMF set to a single UPF", HFILL }
},
{ &hf_pfcp_usage_information,
{ "Flags", "pfcp.usage_information",
FT_UINT8, BASE_HEX, NULL, 0x0,
@ -8193,6 +8467,11 @@ proto_register_pfcp(void)
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_pfcp_measurement_info_b4_mnop,
{ "MNOP (Measurement of Number of Packets)", "pfcp.measurement_info.mnop",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_pfcp_node_report_type,
{ "Flags", "pfcp.node_report_type",
FT_UINT8, BASE_HEX, NULL, 0x0,
@ -8847,6 +9126,11 @@ proto_register_pfcp(void)
NULL, HFILL }
},
{ &hf_pfcp_ue_ip_address_pool_length,
{ "UE IP address Pool Identity", "pfcp.ue_ip_address_pool_length",
FT_UINT16, BASE_DEC, NULL, 0xF,
NULL, HFILL }
},
{ &hf_pfcp_ue_ip_address_pool_identity,
{ "UE IP address Pool Identity", "pfcp.ue_ip_address_pool_identity",
FT_BYTES, BASE_NONE, NULL, 0x0,
@ -8869,10 +9153,42 @@ proto_register_pfcp(void)
FT_IPv6, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_packet_replication_and_detection_carry_on_information_flags,
{ "Flags", "pfcp.hf_pfcp_packet_replication_and_detection_carry_on_information.flags",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b0_priueai,
{ "PRIUEAI (Packet Replication Information UE/PDU Session Address Indication)", "pfcp.packet_replication_and_detection_carry_on_information.flags.priueai",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
NULL, HFILL }
},
{ &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b1_prin19i,
{ "PRIN19I (Packet Replication Information - N19 Indication)", "pfcp.packet_replication_and_detection_carry_on_information.flags.prin19i",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
NULL, HFILL }
},
{ &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b2_prin6i,
{ "PRIN6I (Packet Replication Information - N6 Indication)", "pfcp.packet_replication_and_detection_carry_on_information.flags.prin6i",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
NULL, HFILL }
},
{ &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b3_dcaroni,
{ "DCARONI (Detection Carry-On Indication)", "pfcp.packet_replication_and_detection_carry_on_information.flags.dcaroni",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
NULL, HFILL }
},
{ &hf_pfcp_validity_time_value,
{ "Validity Time value", "pfcp.validity_time_value",
FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_seconds, 0x0,
NULL, HFILL }
},
};
/* Setup protocol subtree array */
#define NUM_INDIVIDUAL_ELEMS_PFCP 55
#define NUM_INDIVIDUAL_ELEMS_PFCP 56
gint *ett[NUM_INDIVIDUAL_ELEMS_PFCP +
(NUM_PFCP_IES - 1)];
@ -8931,6 +9247,7 @@ proto_register_pfcp(void)
ett[52] = &ett_pfcp_pfcpsrreq;
ett[53] = &ett_pfcp_pfcpaureq;
ett[54] = &ett_pfcp_alternative_smf_ip_address_flags;
ett[55] = &ett_packet_replication_and_detection_carry_on_information;
static ei_register_info ei[] = {