* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
+* SPDX-License-Identifier: GPL-2.0-or-later
*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*
-* Ref 3GPP TS 29.244 V14.1.0 (2017-09)
+* Ref 3GPP TS 29.244 V15.1.0 (2018-03-27)
*/
#include "config.h"
static int hf_pfcp_failed_rule_id_type = -1;
static int hf_pfcp_time_qouta_mechanism_bti_type = -1;
static int hf_pfcp_time_qouta_mechanism_bti = -1;
+static int hf_pfcp_multiplier_value_digits = -1;
+static int hf_pfcp_multiplier_exponent = -1;
+static int hf_pfcp_aggregated_urr_id_ie_urr_id = -1;
+
static int hf_pfcp_ue_ip_address_flags = -1;
static int hf_pfcp_ue_ip_address_flag_b0_v6 = -1;
static int hf_pfcp_ue_ip_address_flag_b1_v4 = -1;
static int hf_pfcp_ue_ip_addr_ipv4 = -1;
static int hf_pfcp_ue_ip_add_ipv6 = -1;
static int hf_pfcp_application_id = -1;
+
static int hf_pfcp_sdf_filter_flags = -1;
-static int hf_pfcp_sdf_filter_b0_fd = -1;
-static int hf_pfcp_sdf_filter_b1_ttc = -1;
-static int hf_pfcp_sdf_filter_b2_spi = -1;
-static int hf_pfcp_sdf_filter_b3_fl = -1;
+static int hf_pfcp_sdf_filter_flags_b0_fd = -1;
+static int hf_pfcp_sdf_filter_flags_b1_ttc = -1;
+static int hf_pfcp_sdf_filter_flags_b2_spi = -1;
+static int hf_pfcp_sdf_filter_flags_b3_fl = -1;
+
static int hf_pfcp_flow_desc_len = -1;
-static int hf_pfcp_fd = -1;
-static int hf_pfcp_ttc = -1;
+static int hf_pfcp_flow_desc = -1;
+static int hf_pfcp_traffic_class = -1;
+static int hf_pfcp_traffic_mask = -1;
static int hf_pfcp_spi = -1;
-static int hf_pfcp_fl = -1;
+static int hf_pfcp_flow_label_spare_bit = -1;
+static int hf_pfcp_flow_label = -1;
static int hf_pfcp_out_hdr_desc = -1;
static int hf_pfcp_far_id_flg = -1;
static int hf_pfcp_far_id = -1;
static int hf_pfcp_qer_id_flg = -1;
static int hf_pfcp_qer_id = -1;
static int hf_pfcp_predef_rules_name = -1;
+
static int hf_pfcp_apply_action_flags = -1;
-static int hf_pfcp_apply_action_b4_dupl = -1;
-static int hf_pfcp_apply_action_b3_nocp = -1;
-static int hf_pfcp_apply_action_b2_buff = -1;
-static int hf_pfcp_apply_action_b1_forw = -1;
-static int hf_pfcp_apply_action_b0_drop = -1;
+static int hf_pfcp_apply_action_flags_b4_dupl = -1;
+static int hf_pfcp_apply_action_flags_b3_nocp = -1;
+static int hf_pfcp_apply_action_flags_b2_buff = -1;
+static int hf_pfcp_apply_action_flags_b1_forw = -1;
+static int hf_pfcp_apply_action_flags_b0_drop = -1;
+
static int hf_pfcp_bar_id = -1;
static int hf_pfcp_fq_csid_node_id_type = -1;
static int hf_pfcp_num_csid = -1;
static int hf_pfcp_outer_hdr_creation_ipv4 = -1;
static int hf_pfcp_outer_hdr_creation_ipv6 = -1;
static int hf_pfcp_outer_hdr_creation_port = -1;
-static int hf_pfcp_tos_traf_class = -1;
static int hf_pfcp_time_threshold = -1;
static int hf_pfcp_forwarding_policy_id_len = -1;
static int hf_pfcp_forwarding_policy_id = -1;
+
static int hf_pfcp_measurement_method_flags = -1;
-static int hf_pfcp_b0_durat = -1;
-static int hf_pfcp_b1_volume = -1;
-static int hf_pfcp_b2_event = -1;
+static int hf_pfcp_measurement_method_flags_b0_durat = -1;
+static int hf_pfcp_measurement_method_flags_b1_volume = -1;
+static int hf_pfcp_measurement_method_flags_b2_event = -1;
+
static int hf_pfcp_subsequent_time_threshold = -1;
static int hf_pfcp_inactivity_detection_time = -1;
static int hf_pfcp_monitoring_time = -1;
static int hf_pfcp_reporting_triggers = -1;
-static int hf_pfcp_reporting_triggers_b15_liusa = -1;
-static int hf_pfcp_reporting_triggers_b14_droth = -1;
-static int hf_pfcp_reporting_triggers_b13_stopt = -1;
-static int hf_pfcp_reporting_triggers_b12_start = -1;
-static int hf_pfcp_reporting_triggers_b11_quhti = -1;
-static int hf_pfcp_reporting_triggers_b10_timth = -1;
-static int hf_pfcp_reporting_triggers_b9_volth = -1;
-static int hf_pfcp_reporting_triggers_b8_perio = -1;
-static int hf_pfcp_reporting_triggers_b7_b3_spare = -1;
-static int hf_pfcp_reporting_triggers_b2_envcl = -1;
-static int hf_pfcp_reporting_triggers_b1_timqu = -1;
-static int hf_pfcp_reporting_triggers_b0_volqu = -1;
+static int hf_pfcp_reporting_triggers_o5_b7_liusa = -1;
+static int hf_pfcp_reporting_triggers_o5_b6_droth = -1;
+static int hf_pfcp_reporting_triggers_o5_b5_stopt = -1;
+static int hf_pfcp_reporting_triggers_o5_b4_start = -1;
+static int hf_pfcp_reporting_triggers_o5_b3_quhti = -1;
+static int hf_pfcp_reporting_triggers_o5_b2_timth = -1;
+static int hf_pfcp_reporting_triggers_o5_b1_volth = -1;
+static int hf_pfcp_reporting_triggers_o5_b0_perio = -1;
+static int hf_pfcp_reporting_triggers_o6_b2_envcl = -1;
+static int hf_pfcp_reporting_triggers_o6_b1_timqu = -1;
+static int hf_pfcp_reporting_triggers_o6_b0_volqu = -1;
static int hf_pfcp_volume_threshold = -1;
-static int hf_pfcp_b2_dlvol = -1;
-static int hf_pfcp_b1_ulvol = -1;
-static int hf_pfcp_b0_tovol = -1;
+static int hf_pfcp_volume_threshold_b2_dlvol = -1;
+static int hf_pfcp_volume_threshold_b1_ulvol = -1;
+static int hf_pfcp_volume_threshold_b0_tovol = -1;
static int hf_pfcp_volume_threshold_tovol = -1;
static int hf_pfcp_volume_threshold_ulvol = -1;
static int hf_pfcp_volume_threshold_dlvol = -1;
static int hf_pfcp_volume_quota = -1;
+static int hf_pfcp_volume_quota_b2_dlvol = -1;
+static int hf_pfcp_volume_quota_b1_ulvol = -1;
+static int hf_pfcp_volume_quota_b0_tovol = -1;
static int hf_pfcp_volume_quota_tovol = -1;
static int hf_pfcp_volume_quota_ulvol = -1;
static int hf_pfcp_volume_quota_dlvol = -1;
static int hf_pfcp_subseq_volume_threshold_tovol = -1;
static int hf_pfcp_subseq_volume_threshold_ulvol = -1;
static int hf_pfcp_subseq_volume_threshold_dlvol = -1;
+
static int hf_pfcp_time_quota = -1;
static int hf_pfcp_start_time = -1;
static int hf_pfcp_end_time = -1;
static int hf_pfcp_dl_mbr = -1;
static int hf_pfcp_ul_gbr = -1;
static int hf_pfcp_dl_gbr = -1;
+
static int hf_pfcp_report_type = -1;
-static int hf_pfcp_b2_erir = -1;
-static int hf_pfcp_b1_usar = -1;
-static int hf_pfcp_b0_dldr = -1;
+static int hf_pfcp_report_type_b3_upir = -1;
+static int hf_pfcp_report_type_b2_erir = -1;
+static int hf_pfcp_report_type_b1_usar = -1;
+static int hf_pfcp_report_type_b0_dldr = -1;
+
static int hf_pfcp_offending_ie = -1;
static int hf_pfcp_up_function_features = -1;
-static int hf_pfcp_b8_empu = -1;
-static int hf_pfcp_b7_treu = -1;
-static int hf_pfcp_b6_heeu = -1;
-static int hf_pfcp_b5_pfdm = -1;
-static int hf_pfcp_b4_ftup = -1;
-static int hf_pfcp_b3_trst = -1;
-static int hf_pfcp_b2_dlbd = -1;
-static int hf_pfcp_b1_ddnd = -1;
-static int hf_pfcp_b0_bucp = -1;
+static int hf_pfcp_up_function_features_o6_b0_empu = -1;
+static int hf_pfcp_up_function_features_o5_b7_treu = -1;
+static int hf_pfcp_up_function_features_o5_b6_heeu = -1;
+static int hf_pfcp_up_function_features_o5_b5_pfdm = -1;
+static int hf_pfcp_up_function_features_o5_b4_ftup = -1;
+static int hf_pfcp_up_function_features_o5_b3_trst = -1;
+static int hf_pfcp_up_function_features_o5_b2_dlbd = -1;
+static int hf_pfcp_up_function_features_o5_b1_ddnd = -1;
+static int hf_pfcp_up_function_features_o5_b0_bucp = -1;
+
static int hf_pfcp_sequence_number = -1;
static int hf_pfcp_metric = -1;
static int hf_pfcp_timer_unit = -1;
static int hf_pfcp_timer_value = -1;
static int hf_pfcp_usage_report_trigger = -1;
-static int hf_pfcp_usage_report_trigger_b15_immer = -1;
-static int hf_pfcp_usage_report_trigger_b14_droth = -1;
-static int hf_pfcp_usage_report_trigger_b13_stopt = -1;
-static int hf_pfcp_usage_report_trigger_b12_start = -1;
-static int hf_pfcp_usage_report_trigger_b11_quhti = -1;
-static int hf_pfcp_usage_report_trigger_b10_timth = -1;
-static int hf_pfcp_usage_report_trigger_b9_volth = -1;
-static int hf_pfcp_usage_report_trigger_b8_perio = -1;
-static int hf_pfcp_usage_report_trigger_b7_b6_spare = -1;
-static int hf_pfcp_usage_report_trigger_b5_envcl = -1;
-static int hf_pfcp_usage_report_trigger_b4_monit = -1;
-static int hf_pfcp_usage_report_trigger_b3_termr = -1;
-static int hf_pfcp_usage_report_trigger_b2_liusa = -1;
-static int hf_pfcp_usage_report_trigger_b1_timqu = -1;
-static int hf_pfcp_usage_report_trigger_b0_volqu = -1;
+static int hf_pfcp_usage_report_trigger_o5_b7_immer = -1;
+static int hf_pfcp_usage_report_trigger_o5_b6_droth = -1;
+static int hf_pfcp_usage_report_trigger_o5_b5_stopt = -1;
+static int hf_pfcp_usage_report_trigger_o5_b4_start = -1;
+static int hf_pfcp_usage_report_trigger_o5_b3_quhti = -1;
+static int hf_pfcp_usage_report_trigger_o5_b2_timth = -1;
+static int hf_pfcp_usage_report_trigger_o5_b1_volth = -1;
+static int hf_pfcp_usage_report_trigger_o5_b0_perio = -1;
+static int hf_pfcp_usage_report_trigger_o6_b5_envcl = -1;
+static int hf_pfcp_usage_report_trigger_o6_b4_monit = -1;
+static int hf_pfcp_usage_report_trigger_o6_b3_termr = -1;
+static int hf_pfcp_usage_report_trigger_o6_b2_liusa = -1;
+static int hf_pfcp_usage_report_trigger_o6_b1_timqu = -1;
+static int hf_pfcp_usage_report_trigger_o6_b0_volqu = -1;
static int hf_pfcp_volume_measurement = -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_cp_function_features = -1;
-static int hf_pfcp_b0_load = -1;
-static int hf_pfcp_b1_ovrl = -1;
+static int hf_pfcp_cp_function_features_b0_load = -1;
+static int hf_pfcp_cp_function_features_b1_ovrl = -1;
+
static int hf_pfcp_usage_information = -1;
-static int hf_pfcp_b3_ube = -1;
-static int hf_pfcp_b2_uae = -1;
-static int hf_pfcp_b1_aft = -1;
-static int hf_pfcp_b0_bef = -1;
+static int hf_pfcp_usage_information_b3_ube = -1;
+static int hf_pfcp_usage_information_b2_uae = -1;
+static int hf_pfcp_usage_information_b1_aft = -1;
+static int hf_pfcp_usage_information_b0_bef = -1;
+
static int hf_pfcp_application_instance_id = -1;
static int hf_pfcp_flow_dir = -1;
static int hf_pfcp_packet_rate = -1;
-static int hf_pfcp_ulpr_b0 = -1;
-static int hf_pfcp_dlpr_b1 = -1;
+static int hf_pfcp_packet_rate_b0_ulpr = -1;
+static int hf_pfcp_packet_rate_b1_dlpr = -1;
static int hf_pfcp_ul_time_unit = -1;
static int hf_pfcp_max_ul_pr = -1;
static int hf_pfcp_dl_time_unit = -1;
static int hf_pfcp_max_dl_pr = -1;
+
static int hf_pfcp_dl_flow_level_marking = -1;
-static int hf_pfcp_b0_ttc = -1;
-static int hf_pfcp_b1_sci = -1;
+static int hf_pfcp_dl_flow_level_marking_b0_ttc = -1;
+static int hf_pfcp_dl_flow_level_marking_b1_sci = -1;
+
static int hf_pfcp_sci = -1;
static int hf_pfcp_dl_data_notification_delay = -1;
static int hf_pfcp_packet_count = -1;
-static int hf_pfcp_pfcp_dl_data_service_inf_flags = -1;
-static int hf_pfcp_b0_ppi = -1;
+static int hf_pfcp_dl_data_service_inf_flags = -1;
+static int hf_pfcp_dl_data_service_inf_b0_ppi = -1;
static int hf_pfcp_ppi = -1;
-static int hf_pfcp_sxsmreq_flags = -1;
-static int hf_pfcp_b0_drobu = -1;
-static int hf_pfcp_b1_sndem = -1;
-static int hf_pfcp_b2_qaurr = -1;
-static int hf_pfcp_sxsrrsp_flags = -1;
+
+static int hf_pfcp_pfcpsmreq_flags = -1;
+static int hf_pfcp_pfcpsmreq_flags_b0_drobu = -1;
+static int hf_pfcp_pfcpsmreq_flags_b1_sndem = -1;
+static int hf_pfcp_pfcpsmreq_flags_b2_qaurr = -1;
+
+static int hf_pfcp_pfcpsrrsp_flags = -1;
+static int hf_pfcp_pfcpsrrsp_flags_b0_drobu = -1;
+
static int hf_pfcp_pfd_contents_flags = -1;
-static int hf_pfcp_b0_fd = -1;
-static int hf_pfcp_b3_cp = -1;
-static int hf_pfcp_b2_dn = -1;
-static int hf_pfcp_b1_url = -1;
+static int hf_pfcp_pfd_contents_flags_b3_cp = -1;
+static int hf_pfcp_pfd_contents_flags_b2_dn = -1;
+static int hf_pfcp_pfd_contents_flags_b1_url = -1;
+static int hf_pfcp_pfd_contents_flags_b0_fd = -1;
+
static int hf_pfcp_url_len = -1;
static int hf_pfcp_url = -1;
static int hf_pfcp_dn_len = -1;
static int hf_pfcp_hf_name = -1;
static int hf_pfcp_hf_val_len = -1;
static int hf_pfcp_hf_val = -1;
+
static int hf_pfcp_measurement_info = -1;
-static int hf_pfcp_b0_mbqe = -1;
-static int hf_pfcp_b1_inam = -1;
+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_node_report_type = -1;
-static int hf_pfcp_b0_upfr = -1;
-static int hf_pfcp_remote_gtp_u_peer = -1;
-static int hf_pfcp_gtp_u_peer_flag_b0_v6 = -1;
-static int hf_pfcp_gtp_u_peer_flag_b1_v4 = -1;
+static int hf_pfcp_node_report_type_b0_upfr = -1;
+
+static int hf_pfcp_remote_gtp_u_peer_flags = -1;
+static int hf_pfcp_remote_gtp_u_peer_flags_b0_v6 = -1;
+static int hf_pfcp_remote_gtp_u_peer_flags_b1_v4 = -1;
static int hf_pfcp_remote_gtp_u_peer_ipv4 = -1;
static int hf_pfcp_remote_gtp_u_peer_ipv6 = -1;
static int hf_pfcp_ur_seqn = -1;
+
static int hf_pfcp_oci_flags = -1;
-static int hf_pfcp_b0_aoci = -1;
-static int hf_pfcp_sx_assoc_rel_req_flags = -1;
-static int hf_pfcp_b0_sarr = -1;
+static int hf_pfcp_oci_flags_b0_aoci = -1;
+
+static int hf_pfcp_pfcp_assoc_rel_req_flags = -1;
+static int hf_pfcp_pfcp_assoc_rel_req_b0_sarr = -1;
+
static int hf_pfcp_upiri_flags = -1;
-static int hf_pfcp_upiri_flg_b0_v4 = -1;
-static int hf_pfcp_upiri_flg_b1_v6 = -1;
+static int hf_pfcp_upiri_flags_b0_v4 = -1;
+static int hf_pfcp_upiri_flags_b1_v6 = -1;
static int hf_pfcp_upiri_flg_b5_assoni = -1;
static int hf_pfcp_upiri_teidri = -1;
static int hf_pfcp_upiri_teid_range = -1;
static int hf_pfcp_upiri_ipv6 = -1;
static int hf_pfcp_upiri_network_instance = -1;
+static int hf_pfcp_user_plane_inactivity_timer = -1;
+
+static int hf_pfcp_subsequent_volume_quota = -1;
+static int hf_pfcp_subsequent_volume_quota_b2_dlvol = -1;
+static int hf_pfcp_subsequent_volume_quota_b1_ulvol = -1;
+static int hf_pfcp_subsequent_volume_quota_b0_tovol = -1;
+static int hf_pfcp_subsequent_volume_quota_tovol = -1;
+static int hf_pfcp_subsequent_volume_quota_ulvol = -1;
+static int hf_pfcp_subsequent_volume_quota_dlvol = -1;
+
+static int hf_pfcp_subsequent_time_quota = -1;
+
+static int hf_pfcp_rqi_flag = -1;
+static int hf_pfcp_qfi = -1;
+static int hf_pfcp_query_urr_reference = -1;
+static int hf_pfcp_additional_usage_reports_information = -1;
+static int hf_pfcp_additional_usage_reports_information_b14_b0_number_value = -1;
+static int hf_pfcp_additional_usage_reports_information_b15_auri = -1;
+
static int ett_pfcp = -1;
static int ett_pfcp_flags = -1;
static int ett_pfcp_ie = -1;
static int ett_pfcp_packet_rate = -1;
static int ett_pfcp_pfcp_dl_flow_level_marking = -1;
static int ett_pfcp_dl_data_service_inf = -1;
-static int ett_pfcp_sxsmreq = -1;
-static int ett_pfcp_sxsrrsp = -1;
+static int ett_pfcp_pfcpsmreq = -1;
+static int ett_pfcp_pfcpsrrsp = -1;
static int ett_pfcp_measurement_info = -1;
static int ett_pfcp_node_report_type = -1;
static int ett_pfcp_remote_gtp_u_peer = -1;
static int ett_pfcp_oci_flags = -1;
static int ett_sx_assoc_rel_req_flags = -1;
static int ett_pfcp_upiri_flags = -1;
+static int ett_pfcp_flow_desc = -1;
+static int ett_pfcp_tos = -1;
+static int ett_pfcp_spi = -1;
+static int ett_pfcp_flow_label = -1;
+static int ett_pfcp_subsequent_volume_quota = -1;
+static int ett_pfcp_additional_usage_reports_information = -1;
+
static expert_field ei_pfcp_ie_reserved = EI_INIT;
static expert_field ei_pfcp_ie_data_not_decoded = EI_INIT;
static void dissect_pfcp_error_indication_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
static void dissect_pfcp_user_plane_path_failure_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
static void dissect_pfcp_update_duplicating_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
+static void dissect_pfcp_aggregated_urrs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
static const true_false_string pfcp_id_predef_dynamic_tfs = {
"Predefined by UP",
{ 13, "Sx Node Report Response"},
{ 14, "Sx Session Set Deletion Request"},
{ 15, "Sx Session Set Deletion Response"},
- //16 to 49 For future use
+ //16 to 49 For future use
//Sx Session related messages
{ 50, "Sx Session Establishment Request"},
{ 51, "Sx Session Establishment Response"},
{ 55, "Sx Session Deletion Response"},
{ 56, "Sx Session Report Request"},
{ 57, "Sx Session Report Response"},
- //58 to 99 For future use
+ //58 to 99 For future use
//Other messages
- //100 to 255 For future use
+ //100 to 255 For future use
{0, NULL}
};
static value_string_ext pfcp_message_type_ext = VALUE_STRING_EXT_INIT(pfcp_message_type);
#define PFCP_ERROR_INDICATION_REPORT 99
#define PFCP_USER_PLANE_PATH_FAILURE_REPORT 102
#define PFCP_UPDATE_DUPLICATING_PARAMETERS 105
+#define PFCP_AGGREGATED_URRS 118
static const value_string pfcp_ie_type[] = {
{ 46, "Downlink Data Notification Delay" }, /* Extendable / Subclause 8.2.28 */
{ 47, "DL Buffering Duration" }, /* Extendable / Subclause 8.2.29 */
{ 48, "DL Buffering Suggested Packet Count" }, /* Variable / Subclause 8.2.30 */
- { 49, "SxSMReq-Flags" }, /* Extendable / Subclause 8.2.31 */
- { 50, "SxSRRsp-Flags" }, /* Extendable / Subclause 8.2.32 */
+ { 49, "PFCPSMReq-Flags" }, /* Extendable / Subclause 8.2.31 */
+ { 50, "PFCPSRRsp-Flags" }, /* Extendable / Subclause 8.2.32 */
{ 51, "Load Control Information" }, /* Extendable / Table 7.5.3.3-1 */
{ 52, "Sequence Number" }, /* Fixed Length / Subclause 8.2.33 */
{ 53, "Metric" }, /* Fixed Length / Subclause 8.2.34 */
{ 114, "Failed Rule ID" }, /* Extendable / Subclause 8.2.80 */
{ 115, "Time Quota Mechanism" }, /* Extendable / Subclause 8.2.81 */
{ 116, "User Plane IP Resource Information" }, /* Extendable / Subclause 8.2.82 */
- //117 to 65535 Spare. For future use.
+ { 117, "User Plane Inactivity Timer" }, /* Extendable / Subclause 8.2.83 */
+ { 118, "Aggregated URRs" }, /* Extendable / Table 7.5.2.4-2 */
+ { 119, "Multiplier" }, /* Fixed Length / Subclause 8.2.84 */
+ { 120, "Aggregated URR ID IE" }, /* Fixed Length / Subclause 8.2.85 */
+ { 121, "Subsequent Volume Quota" }, /* Extendable / Subclause 8.2.86 */
+ { 122, "Subsequent Time Quota" }, /* Extendable / Subclause 8.2.87 */
+ { 123, "RQI"}, /* Extendable / Subclause 8.2.88 */
+ { 124, "QFI"}, /* Extendable / Subclause 8.2.89 */
+ { 125, "Query URR Reference"}, /* Extendable / Subclause 8.2.90 */
+ { 126, "Additional Usage Reports Information"}, /* Extendable / Subclause 8.2.91 */
+ // { 127, "Create Traffic Endpoint"}, /* Extendable / Table 7.5.2.7 */
+ // { 128, "Created Traffic Endpoint"}, /* Extendable / Table 7.5.3.5 */
+ // { 129, "Update Traffic Endpoint"}, /* Extendable / Table 7.5.4.13 */
+ // { 130, "Remove Traffic Endpoint"}, /* Extendable / Table 7.5.4.14 */
+ // { 131, "Traffic Endpoint ID"}, /* Extendable / Subclause 8.2.92 */
+ // { 132, "Ethernet Packet Filter"}, /* Extendable / Table 7.5.2.2-3 */
+ // { 133, "MAC address"}, /* Extendable / Subclause 8.2.93 */
+ // { 134, "C-TAG"}, /* Extendable / Subclause 8.2.94 */
+ // { 135, "S-TAG"}, /* Extendable / Subclause 8.2.95 */
+ // { 136, "Ethertype"}, /* Extendable / Subclause 8.2.96 */
+ // { 137, "Proxying"}, /* Extendable / Subclause 8.2.97 */
+ // { 138, "Ethernet Filter ID"}, /* Extendable / Subclause 8.2.98 */
+ // { 139, "Ethernet Filter Properties"}, /* Extendable / Subclause 8.2.99 */
+ //140 to 65535 Spare. For future use.
{0, NULL}
};
};
static void
-dissect_pfcp_cause(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_)
+dissect_pfcp_cause(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
{
+ guint32 value;
/* Octet 5 Cause value */
- proto_tree_add_item(tree, hf_pfcp2_cause, tvb, 0, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item_ret_uint(tree, hf_pfcp2_cause, tvb, 0, 1, ENC_BIG_ENDIAN, &value);
+ proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_cause_vals, "Unknown"));
}
/*
* 8.2.2 Source Interface
* 8.2.3 F-TEID
*/
static void
-dissect_pfcp_f_teid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+dissect_pfcp_f_teid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
{
int offset = 0;
guint64 fteid_flags_val;
/* Octet 6 to 9 TEID */
proto_tree_add_item(tree, hf_pfcp_f_teid_teid, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_item_append_text(item, "TEID: 0x%s", tvb_bytes_to_str(wmem_packet_scope(), tvb, offset, 4));
offset += 4;
if ((fteid_flags_val & 0x1) == 1) {
/* m to (m+3) IPv4 address */
proto_tree_add_item(tree, hf_pfcp_f_teid_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_item_append_text(item, ", IPv4 %s", tvb_ip_to_str(tvb, offset));
offset += 4;
}
if ((fteid_flags_val & 0x2) == 2) {
/* p to (p+15) IPv6 address */
proto_tree_add_item(tree, hf_pfcp_f_teid_ipv6, tvb, offset, 16, ENC_NA);
+ proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(tvb, offset));
offset += 16;
}
/* If the value of CH bit is set to "0", but the value of CHID bit is "1" */
* 8.2.5 SDF Filter
*/
static void
-dissect_pfcp_sdf_filter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_)
+dissect_pfcp_sdf_filter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
{
int offset = 0;
guint64 flags_val;
guint32 fd_length;
+ proto_tree *flow_desc_tree, *tos_tree, *spi_tree, *flow_label_tree;
static const int * pfcp_sdf_filter_flags[] = {
&hf_pfcp_spare_h1,
- &hf_pfcp_sdf_filter_b3_fl,
- &hf_pfcp_sdf_filter_b2_spi,
- &hf_pfcp_sdf_filter_b1_ttc,
- &hf_pfcp_sdf_filter_b0_fd,
+ &hf_pfcp_sdf_filter_flags_b3_fl,
+ &hf_pfcp_sdf_filter_flags_b2_spi,
+ &hf_pfcp_sdf_filter_flags_b1_ttc,
+ &hf_pfcp_sdf_filter_flags_b0_fd,
NULL
};
/* Octet 5 Spare FL SPI TTC FD*/
/* FD (Flow Description): If this bit is set to "1",
* then the Length of Flow Description and the Flow Description fields shall be present
*/
- /* m to (m+1) Length of Flow Description */
- proto_tree_add_item_ret_uint(tree, hf_pfcp_flow_desc_len, tvb, offset, 2, ENC_BIG_ENDIAN, &fd_length);
+ flow_desc_tree = proto_item_add_subtree(item, ett_pfcp_flow_desc);
+ /* m to (m+1) Length of Flow Description */
+ proto_tree_add_item_ret_uint(flow_desc_tree, hf_pfcp_flow_desc_len, tvb, offset, 2, ENC_BIG_ENDIAN, &fd_length);
offset += 2;
/* Flow Description
* The Flow Description field, when present, shall be encoded as an OctetString
* as specified in subclause 5.4.2 of 3GPP TS 29.212
*/
- proto_tree_add_item(tree, hf_pfcp_fd, tvb, offset, fd_length, ENC_NA);
+ proto_tree_add_item(flow_desc_tree, hf_pfcp_flow_desc, tvb, offset, fd_length, ENC_ASCII|ENC_NA);
offset += fd_length;
}
if ((flags_val & 0x2) == 2) {
/* ToS Traffic Class field, when present, shall be encoded as an OctetString on two octets
* as specified in subclause 5.3.15 of 3GPP TS 29.212
*/
- proto_tree_add_item(tree, hf_pfcp_ttc, tvb, offset, 2, ENC_NA);
- offset += 2;
+ tos_tree = proto_item_add_subtree(item, ett_pfcp_tos);
+ proto_tree_add_item(tos_tree, hf_pfcp_traffic_class, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tos_tree, hf_pfcp_traffic_mask, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset += 1;
}
if ((flags_val & 0x4) == 4) {
* contain the IPsec security parameter index (which is a 32-bit field),
* as specified in subclause 5.3.51 of 3GPP TS 29.212
*/
- proto_tree_add_item(tree, hf_pfcp_spi, tvb, offset, 4, ENC_NA);
+ spi_tree = proto_item_add_subtree(item, ett_pfcp_spi);
+ proto_tree_add_item(spi_tree, hf_pfcp_spi, tvb, offset, 4, ENC_BIG_ENDIAN);
offset += 4;
}
if ((flags_val & 0x8) == 8) {
* subclause 5.3.52 of 3GPP TS 29.212 and shall contain an IPv6 flow label (which is a 20-bit field).
* The bits 8 to 5 of the octet "v" shall be spare and set to zero, and the remaining 20 bits shall
* contain the IPv6 flow label.*/
- proto_tree_add_item(tree, hf_pfcp_fl, tvb, offset, 3, ENC_NA);
+ flow_label_tree = proto_item_add_subtree(item, ett_pfcp_flow_label);
+ proto_tree_add_bits_item(flow_label_tree, hf_pfcp_flow_label_spare_bit, tvb, (offset<<3), 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(flow_label_tree, hf_pfcp_flow_label, tvb, offset, 3, ENC_BIG_ENDIAN);
offset += 3;
}
dissect_pfcp_transport_level_marking(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
int offset = 0;
- /* Octet 5 to 6 ToS/Traffic Class
+ /* Octet 5 to 6 ToS/Traffic Class
* The ToS/Traffic Class shall be encoded on two octets as an OctetString.
* The first octet shall contain the IPv4 Type-of-Service or the IPv6 Traffic-Class field and the second octet shall contain the ToS/Traffic Class mask field
*/
- proto_tree_add_item(tree, hf_pfcp_tos_traf_class, tvb, offset, 2, ENC_BIG_ENDIAN);
- offset += 2;
+ proto_tree_add_item(tree, hf_pfcp_traffic_class, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_pfcp_traffic_mask, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset += 1;
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
static const int * pfcp_volume_threshold_flags[] = {
&hf_pfcp_spare_b7_b3,
- &hf_pfcp_b2_dlvol,
- &hf_pfcp_b1_ulvol,
- &hf_pfcp_b0_tovol,
+ &hf_pfcp_volume_threshold_b2_dlvol,
+ &hf_pfcp_volume_threshold_b1_ulvol,
+ &hf_pfcp_volume_threshold_b0_tovol,
NULL
};
/* Octet 5 Spare DLVOL ULVOL TOVOL*/
offset += 8;
}
if ((flags_val & 0x2) == 2) {
- /* p to (p+7) Uplink Volume
+ /* p to (p+7) Uplink Volume
* ULVOL: If this bit is set to "1", then the Uplink Volume field shall be present
*/
proto_tree_add_item(tree, hf_pfcp_volume_threshold_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
int offset = 0;
guint value;
- /* Octet 5 to 8 Time Threshold
+ /* Octet 5 to 8 Time Threshold
* The Time Threshold field shall be encoded as an Unsigned32 binary integer value.
* It shall contain the duration in seconds.
*/
offset += 8;
}
if ((flags_val & 0x2) == 2) {
- /* p to (p+7) Uplink Volume
+ /* p to (p+7) Uplink Volume
* ULVOL: If this bit is set to "1", then the Uplink Volume field shall be present
*/
proto_tree_add_item(tree, hf_pfcp_subseq_volume_threshold_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
{
int offset = 0;
- static const int * pfcp_reporting_triggers_flags[] = {
- &hf_pfcp_reporting_triggers_b15_liusa,
- &hf_pfcp_reporting_triggers_b14_droth,
- &hf_pfcp_reporting_triggers_b13_stopt,
- &hf_pfcp_reporting_triggers_b12_start,
- &hf_pfcp_reporting_triggers_b11_quhti,
- &hf_pfcp_reporting_triggers_b10_timth,
- &hf_pfcp_reporting_triggers_b9_volth,
- &hf_pfcp_reporting_triggers_b8_perio,
- &hf_pfcp_reporting_triggers_b7_b3_spare,
- &hf_pfcp_reporting_triggers_b2_envcl,
- &hf_pfcp_reporting_triggers_b1_timqu,
- &hf_pfcp_reporting_triggers_b0_volqu,
+ static const int * pfcp_reporting_triggers_o5_flags[] = {
+ &hf_pfcp_reporting_triggers_o5_b7_liusa,
+ &hf_pfcp_reporting_triggers_o5_b6_droth,
+ &hf_pfcp_reporting_triggers_o5_b5_stopt,
+ &hf_pfcp_reporting_triggers_o5_b4_start,
+ &hf_pfcp_reporting_triggers_o5_b3_quhti,
+ &hf_pfcp_reporting_triggers_o5_b2_timth,
+ &hf_pfcp_reporting_triggers_o5_b1_volth,
+ &hf_pfcp_reporting_triggers_o5_b0_perio,
+ NULL
+ };
+ static const int * pfcp_reporting_triggers_o6_flags[] = {
+ &hf_pfcp_spare_b7_b3,
+ &hf_pfcp_reporting_triggers_o6_b2_envcl,
+ &hf_pfcp_reporting_triggers_o6_b1_timqu,
+ &hf_pfcp_reporting_triggers_o6_b0_volqu,
NULL
};
/* Octet 5 [Bits 15-08] LIUSA DROTH STOPT START QUHTI TIMTH VOLTH PERIO */
/* Octet 6 [Bits 07-00] SPARE SPARE SPARE SPARE SPARE ENVCL TIMQU VOLQU */
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_reporting_triggers,
- ett_pfcp_reporting_triggers, pfcp_reporting_triggers_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
- offset += 2;
+ ett_pfcp_reporting_triggers, pfcp_reporting_triggers_o5_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
+ offset++;
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_reporting_triggers,
+ ett_pfcp_reporting_triggers, pfcp_reporting_triggers_o6_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
+ offset++;
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
int offset = 0;
static const int * pfcp_report_type_flags[] = {
- &hf_pfcp_spare_b7_b3,
- &hf_pfcp_b2_erir,
- &hf_pfcp_b1_usar,
- &hf_pfcp_b0_dldr,
+ &hf_pfcp_spare_b7_b4,
+ &hf_pfcp_report_type_b3_upir,
+ &hf_pfcp_report_type_b2_erir,
+ &hf_pfcp_report_type_b1_usar,
+ &hf_pfcp_report_type_b0_dldr,
NULL
};
- /* Octet 5 Spare ERIR USAR DLDR */
+ /* Octet 5 Spare UPIR ERIR USAR DLDR */
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_report_type,
ett_pfcp_report_type, pfcp_report_type_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
offset += 1;
int offset = 0;
guint32 value;
- /* Octet 5 Spare Interface value*/
+ /* Octet 5 Spare Interface value*/
proto_tree_add_item(tree, hf_pfcp_spare_h1, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item_ret_uint(tree, hf_pfcp_dst_interface, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
offset++;
{
int offset = 0;
- static const int * pfcp_up_function_features_flags[] = {
- &hf_pfcp_b8_empu,
- &hf_pfcp_b7_treu,
- &hf_pfcp_b6_heeu,
- &hf_pfcp_b5_pfdm,
- &hf_pfcp_b4_ftup,
- &hf_pfcp_b3_trst,
- &hf_pfcp_b2_dlbd,
- &hf_pfcp_b1_ddnd,
- &hf_pfcp_b0_bucp,
+ static const int * pfcp_up_function_features_o5_flags[] = {
+ &hf_pfcp_up_function_features_o5_b7_treu,
+ &hf_pfcp_up_function_features_o5_b6_heeu,
+ &hf_pfcp_up_function_features_o5_b5_pfdm,
+ &hf_pfcp_up_function_features_o5_b4_ftup,
+ &hf_pfcp_up_function_features_o5_b3_trst,
+ &hf_pfcp_up_function_features_o5_b2_dlbd,
+ &hf_pfcp_up_function_features_o5_b1_ddnd,
+ &hf_pfcp_up_function_features_o5_b0_bucp,
NULL
};
- /* Octet 5 LIUSA DROTH STOPT START QUHTI TIMTH VOLTH PERIO*/
+ static const int * pfcp_up_function_features_o6_flags[] = {
+ &hf_pfcp_spare_b7_b1,
+ &hf_pfcp_up_function_features_o6_b0_empu,
+ NULL
+ };
+ /* Octet 5 TREU HEEU PFDM FTUP TRST DLBD DDND BUCP */
+ /* Octet 6 Spare Spare Spare Spare Spare Spare Spare EMPU */
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_up_function_features,
- ett_pfcp_up_function_features, pfcp_up_function_features_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
- offset += 2;
+ ett_pfcp_up_function_features, pfcp_up_function_features_o5_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
+ offset++;
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_up_function_features,
+ ett_pfcp_up_function_features, pfcp_up_function_features_o6_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
+ offset++;
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
static const int * pfcp_apply_action_flags[] = {
&hf_pfcp_spare_b7_b5,
- &hf_pfcp_apply_action_b4_dupl,
- &hf_pfcp_apply_action_b3_nocp,
- &hf_pfcp_apply_action_b2_buff,
- &hf_pfcp_apply_action_b1_forw,
- &hf_pfcp_apply_action_b0_drop,
+ &hf_pfcp_apply_action_flags_b4_dupl,
+ &hf_pfcp_apply_action_flags_b3_nocp,
+ &hf_pfcp_apply_action_flags_b2_buff,
+ &hf_pfcp_apply_action_flags_b1_forw,
+ &hf_pfcp_apply_action_flags_b0_drop,
NULL
};
/* Octet 5 Spare Spare Spare DUPL NOCP BUFF FORW DROP */
static const int * pfcp_dl_data_service_inf_flags[] = {
&hf_pfcp_spare_b7_b1,
- &hf_pfcp_b0_ppi,
+ &hf_pfcp_dl_data_service_inf_b0_ppi,
NULL
};
/* Octet 5 Spare PPI */
- proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_pfcp_dl_data_service_inf_flags,
+ proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_dl_data_service_inf_flags,
ett_pfcp_dl_data_service_inf, pfcp_dl_data_service_inf_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &flags);
offset += 1;
/* The PPI flag in octet 5 indicates whether the Paging Policy Indication value in octet 'm' shall be present */
offset++;
unit = unit >> 5;
- switch (unit) {
- case 0:
- proto_item_append_text(item, "%u s", value * 2);
- break;
- case 1:
- proto_item_append_text(item, "%u min", value);
- break;
- case 2:
- proto_item_append_text(item, "%u min", value * 10);
- break;
- case 3:
- proto_item_append_text(item, "%u hours", value);
- break;
- case 4:
- proto_item_append_text(item, "%u hours", value * 10);
- break;
- case 7:
- proto_item_append_text(item, "%u Infinite", value);
- break;
- /* Value 5 and 6 */
- default:
- proto_item_append_text(item, "%u min", value * 10);
- break;
- }
- if ((unit != 7) && (value == 0)) {
+ if ((unit == 0) && (value == 0)) {
proto_item_append_text(item, " Stopped");
+ } else {
+ switch (unit) {
+ case 0:
+ proto_item_append_text(item, "%u s", value * 2);
+ break;
+ case 1:
+ proto_item_append_text(item, "%u min", value);
+ break;
+ case 2:
+ proto_item_append_text(item, "%u min", value * 10);
+ break;
+ case 3:
+ proto_item_append_text(item, "%u hours", value);
+ break;
+ case 4:
+ proto_item_append_text(item, "%u hours", value * 10);
+ break;
+ case 7:
+ proto_item_append_text(item, "%u Infinite", value);
+ break;
+ /* Value 5 and 6 */
+ default:
+ proto_item_append_text(item, "%u min", value);
+ break;
+ }
}
if (offset < length) {
* 8.2.30 DL Buffering Suggested Packet Count
*/
static void
-dissect_pfcp_dl_buffering_suggested_packet_count(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+dissect_pfcp_dl_buffering_suggested_packet_count(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
{
+ guint32 value;
/* Octet 5 to n+4 Packet Count Value
* The length shall be set to 1 or 2 octets.
*/
- proto_tree_add_item(tree, hf_pfcp_packet_count, tvb, 0, length, ENC_BIG_ENDIAN);
+ proto_tree_add_item_ret_uint(tree, hf_pfcp_packet_count, tvb, 0, length, ENC_BIG_ENDIAN, &value);
+
+ proto_item_append_text(item, "%u", value);
}
/*
- * 8.2.31 SxSMReq-Flags
+ * 8.2.31 PFCPSMReq-Flags
*/
static void
-dissect_pfcp_sxsmreq_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+dissect_pfcp_pfcpsmreq_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
int offset = 0;
- static const int * pfcp_sxsmreq_flags[] = {
+ static const int * pfcp_pfcpsmreq_flags[] = {
&hf_pfcp_spare_b7_b3,
- &hf_pfcp_b2_qaurr,
- &hf_pfcp_b1_sndem,
- &hf_pfcp_b0_drobu,
+ &hf_pfcp_pfcpsmreq_flags_b2_qaurr,
+ &hf_pfcp_pfcpsmreq_flags_b1_sndem,
+ &hf_pfcp_pfcpsmreq_flags_b0_drobu,
NULL
};
/* Octet 5 Spare Spare Spare Spare Spare QAURR SNDEM DROBU */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_sxsmreq_flags,
- ett_pfcp_sxsmreq, pfcp_sxsmreq_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpsmreq_flags,
+ ett_pfcp_pfcpsmreq, pfcp_pfcpsmreq_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
offset += 1;
if (offset < length) {
}
/*
- * 8.2.32 SxSRRsp-Flags
+ * 8.2.32 PFCPSRRsp-Flags
*/
static void
-dissect_pfcp_sxsrrsp_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+dissect_pfcp_pfcpsrrsp_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
int offset = 0;
- static const int * pfcp_sxsrrsp_flags[] = {
+ static const int * pfcp_pfcpsrrsp_flags[] = {
&hf_pfcp_spare_b7_b1,
- &hf_pfcp_b0_drobu,
+ &hf_pfcp_pfcpsrrsp_flags_b0_drobu,
NULL
};
/* Octet 5 Spare Spare Spare Spare Spare Spare Spare DROBU */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_sxsrrsp_flags,
- ett_pfcp_sxsrrsp, pfcp_sxsrrsp_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpsrrsp_flags,
+ ett_pfcp_pfcpsrrsp, pfcp_pfcpsrrsp_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
offset += 1;
if (offset < length) {
dissect_pfcp_sequence_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
{
guint32 value;
- /* Octet 5 to 8 Sequence Number */
+ /* Octet 5 to 8 Sequence Number */
proto_tree_add_item_ret_uint(tree, hf_pfcp_sequence_number, tvb, 0, 4, ENC_BIG_ENDIAN, &value);
proto_item_append_text(item, "%u", value);
offset++;
unit = unit >> 5;
- switch (unit) {
- case 0:
- proto_item_append_text(item, "%u s", value * 2);
- break;
- case 1:
- proto_item_append_text(item, "%u min", value);
- break;
- case 2:
- proto_item_append_text(item, "%u min", value * 10);
- break;
- case 3:
- proto_item_append_text(item, "%u hours", value);
- break;
- case 4:
- proto_item_append_text(item, "%u hours", value * 10);
- break;
- case 7:
- proto_item_append_text(item, "%u Infinite", value);
- break;
- /* Value 5 and 6 */
- default:
- proto_item_append_text(item, "%u min", value * 10);
- break;
- }
- if ((unit != 7) && (value == 0)) {
+ if ((unit == 0) && (value == 0)) {
proto_item_append_text(item, " Stopped");
+ } else {
+ switch (unit) {
+ case 0:
+ proto_item_append_text(item, "%u s", value * 2);
+ break;
+ case 1:
+ proto_item_append_text(item, "%u min", value);
+ break;
+ case 2:
+ proto_item_append_text(item, "%u min", value * 10);
+ break;
+ case 3:
+ proto_item_append_text(item, "%u hours", value);
+ break;
+ case 4:
+ proto_item_append_text(item, "%u hours", value * 10);
+ break;
+ case 7:
+ proto_item_append_text(item, "%u Infinite", value);
+ break;
+ /* Value 5 and 6 */
+ default:
+ proto_item_append_text(item, "%u min", value * 1);
+ break;
+ }
}
if (offset < length) {
* 8.2.37 F-SEID
*/
static void
-dissect_pfcp_f_seid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+dissect_pfcp_f_seid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
{
int offset = 0;
guint64 f_seid_flags;
}
/* Octet 6 to 13 SEID */
proto_tree_add_item(tree, hf_pfcp_seid, tvb, offset, 8, ENC_BIG_ENDIAN);
+ proto_item_append_text(item, "SEID: 0x%s", tvb_bytes_to_str(wmem_packet_scope(), tvb, offset, 8));
offset += 8;
/* IPv4 address (if present)*/
if ((f_seid_flags & 0x2) == 2) {
proto_tree_add_item(tree, hf_pfcp_f_seid_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_item_append_text(item, ", IPv4 %s", tvb_ip_to_str(tvb, offset));
offset += 4;
}
/* IPv6 address (if present)*/
if ((f_seid_flags & 0x1) == 1) {
proto_tree_add_item(tree, hf_pfcp_f_seid_ipv6, tvb, offset, 16, ENC_NA);
+ proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(tvb, offset));
offset += 16;
}
if (offset < length) {
/* Octet 5 Spare Node ID Type*/
proto_tree_add_item(tree, hf_pfcp_spare_h1, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item_ret_uint(tree, hf_pfcp_node_id_type, tvb, offset, 1, ENC_BIG_ENDIAN, &node_id_type);
+ proto_item_append_text(item, "%s: ", val_to_str_const(node_id_type, pfcp_node_id_type_vals, "Unknown"));
offset++;
switch (node_id_type) {
case 0:
/* IPv4 address */
proto_tree_add_item(tree, hf_pfcp_node_id_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
- proto_item_append_text(item, "IPv4 %s", tvb_ip_to_str(tvb, offset));
+ proto_item_append_text(item, "%s", tvb_ip_to_str(tvb, offset));
offset += 4;
break;
case 1:
/* IPv6 address */
proto_tree_add_item(tree, hf_pfcp_node_id_ipv6, tvb, offset, 16, ENC_NA);
- proto_item_append_text(item, "IPv6 %s", tvb_ip6_to_str(tvb, offset));
+ proto_item_append_text(item, "%s", tvb_ip6_to_str(tvb, offset));
offset += 16;
break;
case 2:
static const int * pfcp_pfd_contents_flags[] = {
&hf_pfcp_spare_b7_b4,
- &hf_pfcp_b3_cp,
- &hf_pfcp_b2_dn,
- &hf_pfcp_b1_url,
- &hf_pfcp_b0_fd,
+ &hf_pfcp_pfd_contents_flags_b3_cp,
+ &hf_pfcp_pfd_contents_flags_b2_dn,
+ &hf_pfcp_pfd_contents_flags_b1_url,
+ &hf_pfcp_pfd_contents_flags_b0_fd,
NULL
};
- /* Octet 5 Spare CP DN URL FD*/
+ /* Octet 5 Spare CP DN URL FD */
proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_pfd_contents_flags,
ett_pfcp_measurement_method_flags, pfcp_pfd_contents_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
offset += 1;
offset += 2;
/* (m+2) to p Flow Description */
- proto_tree_add_item(tree, hf_pfcp_fd, tvb, offset, len, ENC_NA);
+ proto_tree_add_item(tree, hf_pfcp_flow_desc, tvb, offset, len, ENC_ASCII|ENC_NA);
offset += len;
}
static const int * pfcp_measurement_method_flags[] = {
&hf_pfcp_spare_b7_b3,
- &hf_pfcp_b2_event,
- &hf_pfcp_b1_volume,
- &hf_pfcp_b0_durat,
+ &hf_pfcp_measurement_method_flags_b2_event,
+ &hf_pfcp_measurement_method_flags_b1_volume,
+ &hf_pfcp_measurement_method_flags_b0_durat,
NULL
};
- /* Octet 5 Spare Spare Spare Spare Spare EVENT VOLUM DURAT*/
+ /* Octet 5 Spare Spare Spare Spare Spare EVENT VOLUM DURAT */
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_measurement_method_flags,
ett_pfcp_measurement_method_flags, pfcp_measurement_method_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
offset += 1;
{
int offset = 0;
- static const int * pfcp_usage_report_trigger_flags[] = {
-
- &hf_pfcp_usage_report_trigger_b15_immer,
- &hf_pfcp_usage_report_trigger_b14_droth,
- &hf_pfcp_usage_report_trigger_b13_stopt,
- &hf_pfcp_usage_report_trigger_b12_start,
- &hf_pfcp_usage_report_trigger_b11_quhti,
- &hf_pfcp_usage_report_trigger_b10_timth,
- &hf_pfcp_usage_report_trigger_b9_volth,
- &hf_pfcp_usage_report_trigger_b8_perio,
- &hf_pfcp_usage_report_trigger_b7_b6_spare,
- &hf_pfcp_usage_report_trigger_b5_envcl,
- &hf_pfcp_usage_report_trigger_b4_monit,
- &hf_pfcp_usage_report_trigger_b3_termr,
- &hf_pfcp_usage_report_trigger_b2_liusa,
- &hf_pfcp_usage_report_trigger_b1_timqu,
- &hf_pfcp_usage_report_trigger_b0_volqu,
+ static const int * pfcp_usage_report_trigger_o5_flags[] = {
+ &hf_pfcp_usage_report_trigger_o5_b7_immer,
+ &hf_pfcp_usage_report_trigger_o5_b6_droth,
+ &hf_pfcp_usage_report_trigger_o5_b5_stopt,
+ &hf_pfcp_usage_report_trigger_o5_b4_start,
+ &hf_pfcp_usage_report_trigger_o5_b3_quhti,
+ &hf_pfcp_usage_report_trigger_o5_b2_timth,
+ &hf_pfcp_usage_report_trigger_o5_b1_volth,
+ &hf_pfcp_usage_report_trigger_o5_b0_perio,
+ NULL
+ };
+ static const int * pfcp_usage_report_trigger_o6_flags[] = {
+ &hf_pfcp_spare_b7_b6,
+ &hf_pfcp_usage_report_trigger_o6_b5_envcl,
+ &hf_pfcp_usage_report_trigger_o6_b4_monit,
+ &hf_pfcp_usage_report_trigger_o6_b3_termr,
+ &hf_pfcp_usage_report_trigger_o6_b2_liusa,
+ &hf_pfcp_usage_report_trigger_o6_b1_timqu,
+ &hf_pfcp_usage_report_trigger_o6_b0_volqu,
NULL
};
/* Octet 5 IMMER DROTH STOPT START QUHTI TIMTH VOLTH PERIO*/
/* Octet 6 Spare Spare ENVCL MONIT TERMR LIUSA TIMQU VOLQU*/
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_usage_report_trigger,
- ett_pfcp_report_trigger, pfcp_usage_report_trigger_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
- offset += 2;
+ ett_pfcp_report_trigger, pfcp_usage_report_trigger_o5_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
+ offset++;
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_usage_report_trigger,
+ ett_pfcp_report_trigger, pfcp_usage_report_trigger_o6_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
+ offset++;
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
int offset = 0;
guint32 node_id_type, num_csid;
- /* Octet 5 FQ-CSID Node-ID Type Number of CSIDs= m*/
+ /* Octet 5 FQ-CSID Node-ID Type Number of CSIDs= m*/
proto_tree_add_item_ret_uint(tree, hf_pfcp_fq_csid_node_id_type, tvb, offset, 1, ENC_BIG_ENDIAN, &node_id_type);
proto_tree_add_item_ret_uint(tree, hf_pfcp_num_csid, tvb, offset, 1, ENC_BIG_ENDIAN, &num_csid);
offset++;
static const int * pfcp_volume_measurement_flags[] = {
&hf_pfcp_spare_b7_b3,
- &hf_pfcp_b2_dlvol,
- &hf_pfcp_b1_ulvol,
- &hf_pfcp_b0_tovol,
+ &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*/
{
int offset = 0;
guint32 value;
- /* Octet 5 to 8 Time Quota value
+ /* Octet 5 to 8 Time Quota value
* TThe Time Quota value shall be encoded as an Unsigned32 binary integer value. It contains a duration in seconds
*/
proto_tree_add_item_ret_uint(tree, hf_pfcp_quota_holding_time, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
static const int * pfcp_volume_quota_flags[] = {
&hf_pfcp_spare_b7_b3,
- &hf_pfcp_b2_dlvol,
- &hf_pfcp_b1_ulvol,
- &hf_pfcp_b0_tovol,
+ &hf_pfcp_volume_quota_b2_dlvol,
+ &hf_pfcp_volume_quota_b1_ulvol,
+ &hf_pfcp_volume_quota_b0_tovol,
NULL
};
/* Octet 5 Spare DLVOL ULVOL TOVOL*/
offset += 8;
}
if ((flags_val & 0x2) == 2) {
- /* p to (p+7) Uplink Volume
+ /* p to (p+7) Uplink Volume
* ULVOL: If this bit is set to "1", then the Uplink Volume field shall be present
*/
proto_tree_add_item(tree, hf_pfcp_volume_quota_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
{
int offset = 0;
guint32 value;
- /* Octet 5 to 8 Time Quota value
+ /* Octet 5 to 8 Time Quota value
* TThe Time Quota value shall be encoded as an Unsigned32 binary integer value. It contains a duration in seconds
*/
proto_tree_add_item_ret_uint(tree, hf_pfcp_time_quota, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
decode_pfcp_urr_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint offset)
{
guint32 urr_id;
+ guint8 urr_id_flag;
/* Octet 5 to 8 URR ID value
* The bit 8 of octet 5 is used to indicate if the Rule ID is dynamically allocated by the CP function
* or predefined in the UP function. If set to 0, it indicates that the Rule is dynamically provisioned
* by the CP Function. If set to 1, it indicates that the Rule is predefined in the UP Function
*/
+ urr_id_flag = tvb_get_guint8(tvb, offset) & 0x80;
+
proto_tree_add_item(tree, hf_pfcp_urr_id_flg, tvb, offset, 4, ENC_BIG_ENDIAN);
proto_tree_add_item_ret_uint(tree, hf_pfcp_urr_id, tvb, offset, 4, ENC_BIG_ENDIAN, &urr_id);
offset += 4;
proto_item_append_text(item, "%s %u",
- ((urr_id & 80000000) ? pfcp_id_predef_dynamic_tfs.true_string : pfcp_id_predef_dynamic_tfs.false_string),
+ ((urr_id_flag)? pfcp_id_predef_dynamic_tfs.true_string : pfcp_id_predef_dynamic_tfs.false_string),
(urr_id & 0x7fffffff));
return offset;
proto_tree_add_item_ret_uint(tree, hf_pfcp_linked_urr_id, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
offset += 4;
- proto_item_append_text(item, "%u s", value);
+ 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);
static const value_string pfcp_outer_hdr_desc_vals[] = {
- { 0, "GTP-U/UDP/IPv4 " },
- { 1, "GTP-U/UDP/IPv6 " },
- { 2, "UDP/IPv4 " },
- { 3, "UDP/IPv6 " },
+ { 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 " },
{ 0, NULL }
};
guint32 value;
/* Octet 5 Outer Header Creation Description */
- proto_tree_add_item_ret_uint(tree, hf_pfcp_outer_hdr_desc, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
- offset += 1;
+ proto_tree_add_item_ret_uint(tree, hf_pfcp_outer_hdr_desc, tvb, offset, 2, ENC_BIG_ENDIAN, &value);
+ offset += 2;
/* m to (m+3) TEID
* 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 == 0) || (value == 1)) {
+ if ((value & 0x0100) || (value & 0x0200)) {
proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_teid, tvb, offset, 4, ENC_BIG_ENDIAN);
offset += 4;
}
* 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 == 0) || (value == 2)) {
+ if ((value & 0x0100) || (value & 0x0400)) {
proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
offset += 4;
}
* 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 == 1) || (value == 3)) {
+ if ((value & 0x0200) || (value & 0x0800)) {
proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_ipv6, tvb, offset, 16, ENC_NA);
offset += 16;
}
* 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 == 2) || (value == 3)) {
+ if ((value & 0x0400) || (value & 0x0800)) {
proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_port, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
}
* 8.2.57 BAR ID
*/
static int
-decode_pfcp_bar_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 offset)
+decode_pfcp_bar_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 offset)
{
+ guint32 value;
/* Octet 5 BAR ID value
* The BAR ID value shall be encoded as a binary integer value
*/
- proto_tree_add_item(tree, hf_pfcp_bar_id, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item_ret_uint(tree, hf_pfcp_bar_id, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
+ proto_item_append_text(item, "%u", value);
offset++;
return offset;
int offset = 0;
static const int * pfcp_cp_function_features_flags[] = {
- &hf_pfcp_b1_ovrl,
- &hf_pfcp_b0_load,
+ &hf_pfcp_cp_function_features_b1_ovrl,
+ &hf_pfcp_cp_function_features_b0_load,
NULL
};
/* Octet 5
static const int * pfcp_usage_information_flags[] = {
&hf_pfcp_spare_h1,
- &hf_pfcp_b3_ube,
- &hf_pfcp_b2_uae,
- &hf_pfcp_b1_aft,
- &hf_pfcp_b0_bef,
+ &hf_pfcp_usage_information_b3_ube,
+ &hf_pfcp_usage_information_b2_uae,
+ &hf_pfcp_usage_information_b1_aft,
+ &hf_pfcp_usage_information_b0_bef,
NULL
};
/* Octet 5 Spare UBE UAE AFT BEF */
* The Flow Description field, when present, shall be encoded as an OctetString
* as specified in subclause 5.4.2 of 3GPP TS 29.212
*/
- proto_tree_add_item(tree, hf_pfcp_fd, tvb, offset, len, ENC_NA);
+ proto_tree_add_item(tree, hf_pfcp_flow_desc, tvb, offset, len, ENC_ASCII|ENC_NA);
offset += len;
if (offset < length) {
static const int * pfcp_packet_rate_flags[] = {
&hf_pfcp_spare_b7_b2,
- &hf_pfcp_dlpr_b1,
- &hf_pfcp_ulpr_b0,
+ &hf_pfcp_packet_rate_b1_dlpr,
+ &hf_pfcp_packet_rate_b0_ulpr,
NULL
};
/* Octet 5 Spare DLPR ULPR */
static const int * pfcp_dl_flow_level_marking_flags[] = {
&hf_pfcp_spare_b7_b2,
- &hf_pfcp_b1_sci,
- &hf_pfcp_b0_ttc,
+ &hf_pfcp_dl_flow_level_marking_b1_sci,
+ &hf_pfcp_dl_flow_level_marking_b0_ttc,
NULL
};
/* Octet 5 Spare SCI TTC*/
* then the ToS/Traffic Class field shall be present
*/
if ((flags_val & 0x1) == 1) {
- /* m to (m+1) ToS/Traffic Class
+ /* m to (m+1) ToS/Traffic Class
* The ToS/Traffic Class shall be encoded on two octets as an OctetString.
* The first octet shall contain the IPv4 Type-of-Service or the IPv6 Traffic-Class field and
* the second octet shall contain the ToS/Traffic Class mask field
*/
- proto_tree_add_item(tree, hf_pfcp_tos_traf_class, tvb, offset, 2, ENC_BIG_ENDIAN);
- offset += 2;
+ proto_tree_add_item(tree, hf_pfcp_traffic_class, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_pfcp_traffic_mask, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset += 1;
}
/* SCI (Service Class Indicator): If this bit is set to "1",
* then the Service Class Indicator field shall be present
int offset = 0;
static const int * pfcp_measurement_info_flags[] = {
- &hf_pfcp_spare_b7_b2,
- &hf_pfcp_b1_inam,
- &hf_pfcp_b0_mbqe,
+ &hf_pfcp_spare_b7_b3,
+ &hf_pfcp_measurement_info_b2_radi,
+ &hf_pfcp_measurement_info_b1_inam,
+ &hf_pfcp_measurement_info_b0_mbqe,
NULL
};
/* Octet 5 Spare INAM MBQE */
static const int * pfcp_node_report_type_flags[] = {
&hf_pfcp_spare_b7_b1,
- &hf_pfcp_b0_upfr,
+ &hf_pfcp_node_report_type_b0_upfr,
NULL
};
/* Octet 5 Spare INAM MBQE */
static const int * pfcp_remote_gtp_u_peer_flags[] = {
&hf_pfcp_spare_b7_b2,
- &hf_pfcp_gtp_u_peer_flag_b1_v4,
- &hf_pfcp_gtp_u_peer_flag_b0_v6,
+ &hf_pfcp_remote_gtp_u_peer_flags_b1_v4,
+ &hf_pfcp_remote_gtp_u_peer_flags_b0_v6,
NULL
};
/* Octet 5 Spare V4 V6*/
- proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_remote_gtp_u_peer,
+ proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_remote_gtp_u_peer_flags,
ett_pfcp_remote_gtp_u_peer, pfcp_remote_gtp_u_peer_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &flags);
offset += 1;
- /* IPv6 address (if present)*/
- if ((flags & 0x1) == 1) {
- proto_tree_add_item(tree, hf_pfcp_remote_gtp_u_peer_ipv6, tvb, offset, 16, ENC_NA);
- proto_item_append_text(item, "IPv6 %s", tvb_ip6_to_str(tvb, offset));
- offset += 16;
- }
/* IPv4 address (if present)*/
if ((flags & 0x2) == 2) {
proto_tree_add_item(tree, hf_pfcp_remote_gtp_u_peer_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
- proto_item_append_text(item, "IPv4 %s", tvb_ip_to_str(tvb, offset));
+ proto_item_append_text(item, "IPv4 %s ", tvb_ip_to_str(tvb, offset));
offset += 4;
}
+ /* IPv6 address (if present)*/
+ if ((flags & 0x1) == 1) {
+ proto_tree_add_item(tree, hf_pfcp_remote_gtp_u_peer_ipv6, tvb, offset, 16, ENC_NA);
+ proto_item_append_text(item, "IPv6 %s ", tvb_ip6_to_str(tvb, offset));
+ offset += 16;
+ }
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
decode_pfcp_far_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, gint offset)
{
guint32 far_id;
+ guint8 far_id_flag;
/* Octet 5 to 8 FAR ID value
* The bit 8 of octet 5 is used to indicate if the Rule ID is dynamically allocated
* by the CP function or predefined in the UP function. If set to 0, it indicates that
* the Rule is dynamically provisioned by the CP Function. If set to 1, it indicates that
* the Rule is predefined in the UP Function.
*/
+ far_id_flag = tvb_get_guint8(tvb,offset) & 0x80;
+
proto_tree_add_item(tree, hf_pfcp_far_id_flg, tvb, offset, 4, ENC_BIG_ENDIAN);
proto_tree_add_item_ret_uint(tree, hf_pfcp_far_id, tvb, offset, 4, ENC_BIG_ENDIAN, &far_id);
offset += 4;
proto_item_append_text(item, "%s %u",
- ((far_id&80000000)? pfcp_id_predef_dynamic_tfs.true_string : pfcp_id_predef_dynamic_tfs.false_string),
+ ((far_id_flag)? pfcp_id_predef_dynamic_tfs.true_string : pfcp_id_predef_dynamic_tfs.false_string),
(far_id & 0x7fffffff));
return offset;
decode_pfcp_qer_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint offset)
{
guint32 qer_id;
+ guint8 qer_id_flag;
/* Octet 5 to 8 QER ID value
* The bit 8 of octet 5 is used to indicate if the Rule ID is dynamically allocated by the CP function
* or predefined in the UP function. If set to 0, it indicates that the Rule is dynamically provisioned
* by the CP Function. If set to 1, it indicates that the Rule is predefined in the UP Function
*/
+ qer_id_flag = tvb_get_guint8(tvb, offset) & 0x80;
+
proto_tree_add_item(tree, hf_pfcp_qer_id_flg, tvb, offset, 4, ENC_BIG_ENDIAN);
proto_tree_add_item_ret_uint(tree, hf_pfcp_qer_id, tvb, offset, 4, ENC_BIG_ENDIAN, &qer_id);
offset += 4;
proto_item_append_text(item, "%s %u",
- ((qer_id & 80000000) ? pfcp_id_predef_dynamic_tfs.true_string : pfcp_id_predef_dynamic_tfs.false_string),
+ ((qer_id_flag)? pfcp_id_predef_dynamic_tfs.true_string : pfcp_id_predef_dynamic_tfs.false_string),
(qer_id & 0x7fffffff));
return offset;
static const int * pfcp_oci_flags_flags[] = {
&hf_pfcp_spare_b7_b1,
- &hf_pfcp_b0_aoci,
+ &hf_pfcp_oci_flags_b0_aoci,
NULL
};
/* Octet 5 Spare AOCI */
}
/*
- * 8.2.77 Sx Association Release Request
+ * 8.2.77 PFCP Association Release Request
*/
static void
-dissect_pfcp_sx_assoc_rel_req(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+dissect_pfcp_pfcp_assoc_rel_req(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
int offset = 0;
static const int * pfcp_sx_assoc_rel_req_flags[] = {
&hf_pfcp_spare_b7_b1,
- &hf_pfcp_b0_sarr,
+ &hf_pfcp_pfcp_assoc_rel_req_b0_sarr,
NULL
};
/* Octet 5 Spare SARR */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_sx_assoc_rel_req_flags,
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcp_assoc_rel_req_flags,
ett_sx_assoc_rel_req_flags, pfcp_sx_assoc_rel_req_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
offset += 1;
proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
offset++;
- unit = unit >> 5;
- switch (unit) {
- case 0:
- proto_item_append_text(item, "%u s", value * 2);
- break;
- case 1:
- proto_item_append_text(item, "%u min", value);
- break;
- case 2:
- proto_item_append_text(item, "%u min", value * 10);
- break;
- case 3:
- proto_item_append_text(item, "%u hours", value);
- break;
- case 4:
- proto_item_append_text(item, "%u hours", value * 10);
- break;
- case 7:
- proto_item_append_text(item, "%u Infinite", value);
- break;
- /* Value 5 and 6 */
- default:
- proto_item_append_text(item, "%u min", value * 10);
- break;
- }
- if ((unit != 7) && (value == 0)) {
+ if ((unit == 0) && (value == 0)) {
proto_item_append_text(item, " Stopped");
+ } else {
+ switch (unit) {
+ case 0:
+ proto_item_append_text(item, "%u s", value * 2);
+ break;
+ case 1:
+ proto_item_append_text(item, "%u min", value);
+ break;
+ case 2:
+ proto_item_append_text(item, "%u min", value * 10);
+ break;
+ case 3:
+ proto_item_append_text(item, "%u hours", value);
+ break;
+ case 4:
+ proto_item_append_text(item, "%u hours", value * 10);
+ break;
+ case 7:
+ proto_item_append_text(item, "%u Infinite", value);
+ break;
+ /* Value 5 and 6 */
+ default:
+ proto_item_append_text(item, "%u min", value * 1);
+ break;
+ }
}
if (offset < length) {
static const int * pfcp_upiri_flags[] = {
&hf_pfcp_spare_b7_b6,
&hf_pfcp_upiri_flg_b5_assoni,
- &hf_pfcp_upiri_flg_b1_v6,
- &hf_pfcp_upiri_flg_b0_v4,
+ &hf_pfcp_upiri_flags_b1_v6,
+ &hf_pfcp_upiri_flags_b0_v4,
NULL
};
/* Octet 5 Spare Spare ASSONI TEIDRI TEIDRI TEIDRI V6 V4*/
}
if ((upiri_flags_val & 0x20) == 32) {
/* k to (l) Network Instance */
- proto_tree_add_item(tree, hf_pfcp_upiri_network_instance, tvb, offset, length, ENC_NA);
+ proto_tree_add_item(tree, hf_pfcp_upiri_network_instance, tvb, offset, length - offset, ENC_NA);
offset = length;
}
}
+/*
+ * 8.2.83 User Plane Inactivity Timer
+ */
+static void
+dissect_pfcp_user_plane_inactivity_timer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+{
+ int offset = 0;
+ guint32 value;
+ /*
+ * The User Plane Inactivity Timer field shall be encoded as an Unsigned32 binary integer value.
+ * The timer value "0" shall be interpreted as an indication that
+ * user plane inactivity detection and reporting is stopped.
+ */
+
+ /* 5 to 8 Inactivity Timer */
+ proto_tree_add_item_ret_uint(tree, hf_pfcp_user_plane_inactivity_timer, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
+ offset += 4;
+
+ if(value == 0)
+ proto_item_append_text(item, " (Stopped)");
+
+ if (offset < length) {
+ proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
+ }
+
+}
+
+/*
+ * 8.2.84 Multiplier
+ */
+static void
+dissect_pfcp_multiplier(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_)
+{
+
+ /* 5 to 12 Value-Digits */
+ proto_tree_add_item(tree, hf_pfcp_multiplier_value_digits, tvb, 0, 8, ENC_BIG_ENDIAN);
+
+ /* 12 to 15 Exponent */
+ proto_tree_add_item(tree, hf_pfcp_multiplier_exponent, tvb, 8, 4, ENC_BIG_ENDIAN);
+
+}
+
+/*
+ * 8.2.85 Aggregated URR ID IE
+ */
+static void
+dissect_pfcp_aggregated_urr_id_ie(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
+{
+ guint32 value;
+ /* 5 to 8 URR ID */
+ proto_tree_add_item_ret_uint(tree, hf_pfcp_aggregated_urr_id_ie_urr_id, tvb, 0, 4, ENC_BIG_ENDIAN, &value);
+
+ proto_item_append_text(item, "%u", value);
+}
+
+/*
+ * 8.2.86 Subsequent Volume Quota
+ */
+static void
+dissect_pfcp_subsequent_volume_quota(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+{
+ int offset = 0;
+ guint64 flags_val;
+
+ static const int * pfcp_subsequent_volume_quota_flags[] = {
+ &hf_pfcp_spare_b7_b3,
+ &hf_pfcp_subsequent_volume_quota_b2_dlvol,
+ &hf_pfcp_subsequent_volume_quota_b1_ulvol,
+ &hf_pfcp_subsequent_volume_quota_b0_tovol,
+ NULL
+ };
+ /* Octet 5 Spare DLVOL ULVOL TOVOL*/
+ proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_subsequent_volume_quota,
+ ett_pfcp_subsequent_volume_quota, pfcp_subsequent_volume_quota_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
+ offset += 1;
+
+ /* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value.
+ * They shall contain the total, uplink or downlink number of octets respectively.
+ */
+ if ((flags_val & 0x1) == 1) {
+ /* m to (m+7) Total Volume
+ * TOVOL: If this bit is set to "1", then the Total Volume field shall be present
+ */
+ proto_tree_add_item(tree, hf_pfcp_subsequent_volume_quota_tovol, tvb, offset, 8, ENC_BIG_ENDIAN);
+ offset += 8;
+ }
+ if ((flags_val & 0x2) == 2) {
+ /* p to (p+7) Uplink Volume
+ * ULVOL: If this bit is set to "1", then the Uplink Volume field shall be present
+ */
+ proto_tree_add_item(tree, hf_pfcp_subsequent_volume_quota_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
+ offset += 8;
+ }
+ if ((flags_val & 0x4) == 4) {
+ /* q to (q+7) Downlink Volume
+ * DLVOL: If this bit is set to "1", then the Downlink Volume field shall be present
+ */
+ proto_tree_add_item(tree, hf_pfcp_subsequent_volume_quota_dlvol, 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);
+ }
+}
+
+/*
+ * 8.2.87 Subsequent Time Quota
+ */
+static void
+dissect_pfcp_subsequent_time_quota(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
+{
+ int offset = 0;
+ guint value;
+
+ /* Octet 5 to 8 Time Quota
+ * The Time Quota field shall be encoded as an Unsigned32 binary integer value.
+ * It shall contain the duration in seconds.
+ */
+ proto_tree_add_item_ret_uint(tree, hf_pfcp_subsequent_time_quota, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
+ offset += 4;
+
+ proto_item_append_text(item, "%u s", value);
+
+ if (offset < length) {
+ proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
+ }
+
+}
+
+/*
+ * 8.2.88 RQI
+ */
+static void
+dissect_pfcp_rqi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+{
+ int offset = 0;
+
+ proto_tree_add_item(tree, hf_pfcp_spare_b7_b1, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_pfcp_rqi_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset += 1;
+
+ if (offset < length) {
+ proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
+ }
+ return ;
+}
+
+/*
+ * 8.2.89 QFI
+ */
+static void
+dissect_pfcp_qfi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+{
+ int offset = 0;
+ /* Octets 5 to (m)
+ * The Application Identifier shall be encoded as an OctetString
+ */
+ proto_tree_add_item(tree, hf_pfcp_qfi, tvb, offset, length, ENC_NA);
+ offset += length;
+
+ if (offset < length) {
+ proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
+ }
+ return ;
+}
+
+/*
+ * 8.2.90 Querry URR Reference
+ */
+static void
+dissect_pfcp_query_urr_reference(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+{
+ int offset = 0;
+
+ /* Octets 5 to 8 Query URR Reference value
+ * The Query URR Reference value shall be encoded as an Unsigned32 binary integer value.
+ * It shall contain the reference of a query request for URR(s).
+ */
+ proto_tree_add_item(tree, hf_pfcp_query_urr_reference, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ if (offset < length) {
+ proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
+ }
+
+}
+
+/*
+ * 8.2.91 Additional Usage Reports Information
+ */
+static void
+dissect_pfcp_additional_usage_reports_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+{
+ int offset = 0;
+ /*
+ * Octet 8 7 6 5 4 3 2 1
+ * 5 | AURI | Number of Additional Usage Reports value |
+ * 6 | Number of Additional Usage Reports value |
+ *
+ * The Number of Additional Usage Reports value shall be encoded as
+ * an unsigned binary integer value on 15 bits.
+ * Bit 7 of Octet 5 is the most significant bit and bit 1 of Octet 6 is the least significant bit.
+ * The bit 8 of octet 5 shall encode the AURI (Additional Usage Reports Indication) flag{...}.
+ */
+ static const int * pfcp_additional_usage_reports_information_flags[] = {
+ &hf_pfcp_additional_usage_reports_information_b15_auri,
+ &hf_pfcp_additional_usage_reports_information_b14_b0_number_value,
+ NULL
+ };
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_additional_usage_reports_information,
+ ett_pfcp_additional_usage_reports_information, pfcp_additional_usage_reports_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
+ offset += 2;
+
+ 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)
*/
/* 46 */ { dissect_pfcp_dl_data_notification_delay }, /* Downlink Data Notification Delay Extendable / Subclause 8.2.28 */
/* 47 */ { dissect_pfcp_dl_buffering_dur }, /* DL Buffering Duration Extendable / Subclause 8.2.29 */
/* 48 */ { dissect_pfcp_dl_buffering_suggested_packet_count }, /* DL Buffering Suggested Packet Count Variable / Subclause 8.2.30 */
-/* 49 */ { dissect_pfcp_sxsmreq_flags }, /* SxSMReq-Flags Extendable / Subclause 8.2.31 */
-/* 50 */ { dissect_pfcp_sxsrrsp_flags }, /* SxSRRsp-Flags Extendable / Subclause 8.2.32 */
+/* 49 */ { dissect_pfcp_pfcpsmreq_flags }, /* PFCPSMReq-Flags Extendable / Subclause 8.2.31 */
+/* 50 */ { dissect_pfcp_pfcpsrrsp_flags }, /* PFCPSRRsp-Flags Extendable / Subclause 8.2.32 */
/* 51 */ { dissect_pfcp_load_control_information }, /* Load Control Information Extendable / Table 7.5.3.3-1 */
/* 52 */ { dissect_pfcp_sequence_number }, /* Sequence Number Fixed Length / Subclause 8.2.33 */
/* 53 */ { dissect_pfcp_metric }, /* Metric Fixed Length / Subclause 8.2.34 */
/* 108 */ { dissect_pfcp_far_id }, /* FAR ID Extendable / Subclause 8.2.74 */
/* 109 */ { dissect_pfcp_qer_id }, /* QER ID Extendable / Subclause 8.2.75 */
/* 110 */ { dissect_pfcp_oci_flags }, /* OCI Flags Extendable / Subclause 8.2.76 */
-/* 111 */ { dissect_pfcp_sx_assoc_rel_req }, /* Sx Association Release Request Extendable / Subclause 8.2.77 */
+/* 111 */ { dissect_pfcp_pfcp_assoc_rel_req }, /* PFCP Association Release Request Extendable / Subclause 8.2.77 */
/* 112 */ { dissect_pfcp_graceful_release_period }, /* Graceful Release Period Extendable / Subclause 8.2.78 */
/* 113 */ { dissect_pfcp_pdn_type }, /* PDN Type Fixed Length / Subclause 8.2.79 */
/* 114 */ { dissect_pfcp_failed_rule_id }, /* Failed Rule ID Extendable / Subclause 8.2.80 */
/* 115 */ { dissect_pfcp_time_qouta_mechanism }, /* Time Quota Mechanism Extendable / Subclause 8.2.81 */
/* 116 */ { dissect_pfcp_user_plane_ip_resource_infomation }, /* User Plane IP Resource Information Extendable / Subclause 8.2.82 */
+/* 117 */ { dissect_pfcp_user_plane_inactivity_timer }, /* User Plane Inactivity Timer Extendable / Subclause 8.2.83 */
+/* 118 */ { dissect_pfcp_aggregated_urrs }, /* Aggregated URRs Extendable / Table 7.5.2.4-2 */
+/* 119 */ { dissect_pfcp_multiplier }, /* Multiplier Fixed Length / Subclause 8.2.84 */
+/* 120 */ { dissect_pfcp_aggregated_urr_id_ie }, /* Aggregated URR ID IE Fixed Length / Subclause 8.2.85 */
+/* 121 */ { dissect_pfcp_subsequent_volume_quota }, /* Subsequent Volume Quota Extendable / Subclause 8.2.86 */
+/* 122 */ { dissect_pfcp_subsequent_time_quota }, /* Subsequent Time Quota Extendable / Subclause 8.2.87 */
+/* 123 */ { dissect_pfcp_rqi }, /* RQI Extendable / Subclause 8.2.88 */
+/* 124 */ { dissect_pfcp_qfi }, /* QFI Extendable / Subclause 8.2.89 */
+/* 125 */ { dissect_pfcp_query_urr_reference }, /* Query URR Reference Extendable / Subclause 8.2.90 */
+/* 126 */ { dissect_pfcp_additional_usage_reports_information }, /* Additional Usage Reports Information Extendable / Subclause 8.2.91 */
+ //127 (140) to 65535 Spare. For future use.
{ NULL }, /* End of List */
};
dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_UPDATE_DUPLICATING_PARAMETERS]);
}
+static void
+dissect_pfcp_aggregated_urrs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type)
+{
+ dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_AGGREGATED_URRS]);
+}
static void
dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint offset, guint8 message_type)
/* Bit 8 of Octet 1 is set, this indicates that the IE is defined by a vendor and the Enterprise ID is present */
proto_tree_add_item(ie_tree, hf_pfcp_enterprice_id, tvb, offset, 2, ENC_BIG_ENDIAN);
- offset += 2;
+
/* give the whole IE to the subdissector */
- ie_tvb = tvb_new_subset_length(tvb, offset-6, length);
+ ie_tvb = tvb_new_subset_length(tvb, offset-4, length);
dissector_try_uint_new(pfcp_enterprise_ies_dissector_table, enterprise_id, ie_tvb, pinfo, ie_tree, FALSE, ti);
offset += length;
} else {
proto_tree_add_item(sub_tree, hf_pfcp_seid, tvb, offset, 8, ENC_BIG_ENDIAN);
offset += 8;
}
- /* 7.2.2.2 PFCP Header for Node Related Messages */
+ /* 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 |
NULL, HFILL }
},
{ &hf_pfcp_mp_flag,
- { "MP", "pfcp.mp_flag",
+ { "Message Priority (MP)", "pfcp.mp_flag",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_pfcp_s_flag,
- { "S", "pfcp.s",
+ { "SEID (S)", "pfcp.s",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
NULL, HFILL }
},
{ &hf_pfcp_enterprice_id,
- { "Enterprise ID", "pfcp.enterprice_id",
+ { "Enterprise ID", "pfcp.enterprice_id",
FT_UINT16, BASE_ENTERPRISES, STRINGS_ENTERPRISES,
0x0, NULL, HFILL } },
{ &hf_pfcp2_ie,
FT_UINT8, BASE_DEC, VALS(pfcp_pdn_type_vals), 0x7,
NULL, HFILL }
},
+ { &hf_pfcp_multiplier_value_digits,
+ { "Value Digits", "pfcp.multiplier.value_digits",
+ FT_UINT64, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_multiplier_exponent,
+ { "Exponent", "pfcp.multiplier.exponent",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_aggregated_urr_id_ie_urr_id,
+ { "URR ID", "pfcp.aggregated_urr_id_ie.urr_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
{ &hf_pfcp_failed_rule_id_type,
{ "Failed Rule ID Type", "pfcp.failed_rule_id_type",
FT_UINT8, BASE_DEC, VALS(pfcp_failed_rule_id_type_vals), 0x7,
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_sdf_filter_b0_fd,
+ { &hf_pfcp_sdf_filter_flags_b0_fd,
{ "FD (Flow Description)", "pfcp.sdf_filter.fd",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_sdf_filter_b1_ttc,
+ { &hf_pfcp_sdf_filter_flags_b1_ttc,
{ "TTC (ToS Traffic Class)", "pfcp.sdf_filter.ttc",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
- { &hf_pfcp_sdf_filter_b2_spi,
+ { &hf_pfcp_sdf_filter_flags_b2_spi,
{ "SPI (Security Parameter Index)", "pfcp.sdf_filter.spi",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
- { &hf_pfcp_sdf_filter_b3_fl,
+ { &hf_pfcp_sdf_filter_flags_b3_fl,
{ "FL (Flow Label)", "pfcp.sdf_filter.fl",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_fd,
- { "Flow Description field", "pfcp.fd",
- FT_BYTES, BASE_NONE, NULL, 0x0,
+ { &hf_pfcp_flow_desc,
+ { "Flow Description", "pfcp.flow_desc",
+ FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_ttc,
- { "ToS Traffic Class field", "pfcp.ttc",
- FT_BYTES, BASE_NONE, NULL, 0x0,
+ { &hf_pfcp_traffic_class,
+ { "ToS Traffic Class", "pfcp.traffic_class",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_traffic_mask,
+ { "Mask field", "pfcp.traffic_mask",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_spi,
- { "Security Parameter Index field", "pfcp.spi",
- FT_BYTES, BASE_NONE, NULL, 0x0,
+ { "Security Parameter Index", "pfcp.spi",
+ FT_UINT32, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_fl,
- { "Flow Label field", "pfcp.fl",
- FT_BYTES, BASE_NONE, NULL, 0x0,
+ { &hf_pfcp_flow_label_spare_bit,
+ { "Spare bit", "pfcp.flow_label_spare_bit",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_flow_label,
+ { "Flow Label", "pfcp.flow_label",
+ FT_UINT24, BASE_HEX, NULL, 0x0FFFFF,
NULL, HFILL }
},
{ &hf_pfcp_out_hdr_desc,
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_apply_action_b0_drop,
+ { &hf_pfcp_apply_action_flags_b0_drop,
{ "DROP (Drop)", "pfcp.apply_action.drop",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_apply_action_b1_forw,
+ { &hf_pfcp_apply_action_flags_b1_forw,
{ "FORW (Forward)", "pfcp.apply_action.forw",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
- { &hf_pfcp_apply_action_b2_buff,
+ { &hf_pfcp_apply_action_flags_b2_buff,
{ "BUFF (Buffer)", "pfcp.apply_action.buff",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
- { &hf_pfcp_apply_action_b3_nocp,
+ { &hf_pfcp_apply_action_flags_b3_nocp,
{ "NOCP (Notify the CP function)", "pfcp.apply_action.nocp",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
- { &hf_pfcp_apply_action_b4_dupl,
+ { &hf_pfcp_apply_action_flags_b4_dupl,
{ "DUPL (Duplicate)", "pfcp.apply_action.dupl",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_pfcp_outer_hdr_desc,
{ "Outer Header Creation Description", "pfcp.outer_hdr_desc",
- FT_UINT8, BASE_DEC, VALS(pfcp_outer_hdr_desc_vals), 0x0,
+ FT_UINT16, BASE_DEC, VALS(pfcp_outer_hdr_desc_vals), 0x0,
NULL, HFILL }
},
{ &hf_pfcp_outer_hdr_creation_teid,
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_tos_traf_class,
- { "ToS/Traffic Class", "pfcp.tos_traf_class.port",
- FT_UINT16, BASE_DEC, NULL, 0x0,
- NULL, HFILL }
- },
{ &hf_pfcp_time_threshold,
{ "Time Threshold", "pfcp.time_threshold",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+ FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_forwarding_policy_id_len,
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_durat,
+ { &hf_pfcp_measurement_method_flags_b0_durat,
{ "DURAT (Duration)", "pfcp.measurement_method_flags.durat",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_b1_volume,
+ { &hf_pfcp_measurement_method_flags_b1_volume,
{ "VOLUM (Volume)", "pfcp.measurement_method_flags.volume",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
- { &hf_pfcp_b2_event,
+ { &hf_pfcp_measurement_method_flags_b2_event,
{ "EVENT (Event)", "pfcp.measurement_method_flags.event",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_pfcp_reporting_triggers,
{ "Flags", "pfcp.reporting_triggers_flags",
- FT_UINT16, BASE_HEX, NULL, 0x0,
- NULL, HFILL }
- },
- { &hf_pfcp_reporting_triggers_b0_volqu,
- { "VOLQU (Volume Quota)", "pfcp.reporting_triggers_flags.volqu",
- FT_BOOLEAN, 16, NULL, 0x0001,
- NULL, HFILL }
- },
- { &hf_pfcp_reporting_triggers_b1_timqu,
- { "TIMQU (Time Quota)", "pfcp.reporting_triggers_flags.timqu",
- FT_BOOLEAN, 16, NULL, 0x0002,
- NULL, HFILL }
- },
- { &hf_pfcp_reporting_triggers_b2_envcl,
- { "ENVCL (Envelope Closure)", "pfcp.reporting_triggers_flags.envcl",
- FT_BOOLEAN, 16, NULL, 0x0004,
- NULL, HFILL }
- },
- { &hf_pfcp_reporting_triggers_b7_b3_spare,
- { "Spare", "pfcp.reporting_triggers_flags.spare",
- FT_UINT16, BASE_DEC, NULL, 0x00F8,
+ FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_reporting_triggers_b8_perio,
+ { &hf_pfcp_reporting_triggers_o5_b0_perio,
{ "PERIO (Periodic Reporting)", "pfcp.reporting_triggers_flags.perio",
- FT_BOOLEAN, 16, NULL, 0x0100,
+ FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_reporting_triggers_b9_volth,
+ { &hf_pfcp_reporting_triggers_o5_b1_volth,
{ "VOLTH (Volume Threshold)", "pfcp.reporting_triggers_flags.volth",
- FT_BOOLEAN, 16, NULL, 0x0200,
+ FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
- { &hf_pfcp_reporting_triggers_b10_timth,
- { "TIMTH (Time Threshold)", "pfcp.reporting_triggers_flags.timth",
- FT_BOOLEAN, 16, NULL, 0x0400,
+ { &hf_pfcp_reporting_triggers_o5_b2_timth,
+ { "TIMTH (Time Threshold)", "pfcp.reporting_triggers_flags.timth",
+ FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
- { &hf_pfcp_reporting_triggers_b11_quhti,
+ { &hf_pfcp_reporting_triggers_o5_b3_quhti,
{ "QUHTI (Quota Holding Time)", "pfcp.reporting_triggers_flags.quhti",
- FT_BOOLEAN, 16, NULL, 0x0800,
+ FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
- { &hf_pfcp_reporting_triggers_b12_start,
+ { &hf_pfcp_reporting_triggers_o5_b4_start,
{ "START (Start of Traffic)", "pfcp.reporting_triggers_flags.start",
- FT_BOOLEAN, 16, NULL, 0x1000,
+ FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
- { &hf_pfcp_reporting_triggers_b13_stopt,
+ { &hf_pfcp_reporting_triggers_o5_b5_stopt,
{ "STOPT (Stop of Traffic)", "pfcp.reporting_triggers_flags.stopt",
- FT_BOOLEAN, 16, NULL, 0x2000,
+ FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
- { &hf_pfcp_reporting_triggers_b14_droth,
+ { &hf_pfcp_reporting_triggers_o5_b6_droth,
{ "DROTH (Dropped DL Traffic Threshold)", "pfcp.reporting_triggers_flags.droth",
- FT_BOOLEAN, 16, NULL, 0x4000,
+ FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL }
},
- { &hf_pfcp_reporting_triggers_b15_liusa,
+ { &hf_pfcp_reporting_triggers_o5_b7_liusa,
{ "LIUSA (Linked Usage Reporting)", "pfcp.reporting_triggers_flags.liusa",
- FT_BOOLEAN, 16, NULL, 0x8000,
+ FT_BOOLEAN, 8, NULL, 0x80,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_reporting_triggers_o6_b0_volqu,
+ { "VOLQU (Volume Quota)", "pfcp.reporting_triggers_flags.volqu",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_reporting_triggers_o6_b1_timqu,
+ { "TIMQU (Time Quota)", "pfcp.reporting_triggers_flags.timqu",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_reporting_triggers_o6_b2_envcl,
+ { "ENVCL (Envelope Closure)", "pfcp.reporting_triggers_flags.envcl",
+ FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_pfcp_usage_report_trigger,
{ "Flags", "pfcp.usage_report_trigger",
- FT_UINT16, BASE_HEX, NULL, 0x0,
+ FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b0_volqu,
+ { &hf_pfcp_usage_report_trigger_o6_b0_volqu,
{ "VOLQU (Volume Quota)", "pfcp.usage_report_trigger_flags.volqu",
- FT_BOOLEAN, 16, NULL, 0x0001,
+ FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b1_timqu,
+ { &hf_pfcp_usage_report_trigger_o6_b1_timqu,
{ "TIMQU (Time Quota)", "pfcp.usage_report_trigger_flags.timqu",
- FT_BOOLEAN, 16, NULL, 0x0002,
+ FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b2_liusa,
- { "LIUSA (Linked Usage Reporting)", "pfcp.usage_report_trigger_flags.liusa",
- FT_BOOLEAN, 16, NULL, 0x0004,
+ { &hf_pfcp_usage_report_trigger_o6_b2_liusa,
+ { "LIUSA (Linked Usage Reporting)", "pfcp.usage_report_trigger_flags.liusa",
+ FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b3_termr,
+ { &hf_pfcp_usage_report_trigger_o6_b3_termr,
{ "TERMR (Termination Report)", "pfcp.usage_report_trigger.term",
- FT_BOOLEAN, 16, NULL, 0x0008,
+ FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b4_monit,
+ { &hf_pfcp_usage_report_trigger_o6_b4_monit,
{ "MONIT (Monitoring Time)", "pfcp.usage_report_trigger.monit",
- FT_BOOLEAN, 16, NULL, 0x0010,
+ FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b5_envcl,
+ { &hf_pfcp_usage_report_trigger_o6_b5_envcl,
{ "ENVCL (Envelope Closure)", "pfcp.usage_report_trigger_flags.envcl",
- FT_BOOLEAN, 16, NULL, 0x0020,
- NULL, HFILL }
- },
- { &hf_pfcp_usage_report_trigger_b7_b6_spare,
- { "Spare", "pfcp.reporting_triggers_flags.spare",
- FT_UINT16, BASE_DEC, NULL, 0x00C0,
+ FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b8_perio,
+ { &hf_pfcp_usage_report_trigger_o5_b0_perio,
{ "PERIO (Periodic Reporting)", "pfcp.usage_report_trigger_flags.perio",
- FT_BOOLEAN, 16, NULL, 0x0100,
+ FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b9_volth,
+ { &hf_pfcp_usage_report_trigger_o5_b1_volth,
{ "VOLTH (Volume Threshold)", "pfcp.usage_report_trigger_flags.volth",
- FT_BOOLEAN, 16, NULL, 0x0200,
+ FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b10_timth,
+ { &hf_pfcp_usage_report_trigger_o5_b2_timth,
{ "TIMTH (Time Threshold)", "pfcp.usage_report_trigger_flags.timth",
- FT_BOOLEAN, 16, NULL, 0x0400,
+ FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b11_quhti,
+ { &hf_pfcp_usage_report_trigger_o5_b3_quhti,
{ "QUHTI (Quota Holding Time)", "pfcp.usage_report_trigger_flags.quhti",
- FT_BOOLEAN, 16, NULL, 0x0800,
+ FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b12_start,
+ { &hf_pfcp_usage_report_trigger_o5_b4_start,
{ "START (Start of Traffic)", "pfcp.usage_report_trigger_flags.start",
- FT_BOOLEAN, 16, NULL, 0x1000,
+ FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b13_stopt,
+ { &hf_pfcp_usage_report_trigger_o5_b5_stopt,
{ "STOPT (Stop of Traffic)", "pfcp.usage_report_trigger_flags.stopt",
- FT_BOOLEAN, 16, NULL, 0x2000,
+ FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b14_droth,
+ { &hf_pfcp_usage_report_trigger_o5_b6_droth,
{ "DROTH (Dropped DL Traffic Threshold)", "pfcp.usage_report_trigger_flags.droth",
- FT_BOOLEAN, 16, NULL, 0x4000,
+ FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL }
},
- { &hf_pfcp_usage_report_trigger_b15_immer,
+ { &hf_pfcp_usage_report_trigger_o5_b7_immer,
{ "IMMER (Immediate Report)", "pfcp.usage_report_trigger.immer",
- FT_BOOLEAN, 16, NULL, 0x8000,
+ FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }
},
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_tovol,
- { "TOVOL", "pfcp.tovol_flg",
+ { &hf_pfcp_volume_threshold_b0_tovol,
+ { "TOVOL", "pfcp.volume_threshold_flags.tovol",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_b1_ulvol,
- { "ULVOL", "pfcp.ulvol_flg",
+ { &hf_pfcp_volume_threshold_b1_ulvol,
+ { "ULVOL", "pfcp.volume_threshold_flags.ulvol",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
- { &hf_pfcp_b2_dlvol,
- { "DLVOL", "pfcp.dlvol_flg",
+ { &hf_pfcp_volume_threshold_b2_dlvol,
+ { "DLVOL", "pfcp.volume_threshold_flags.dlvol",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
+ { &hf_pfcp_volume_quota_b0_tovol,
+ { "TOVOL", "pfcp.volume_quota_flags.tovol",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_volume_quota_b1_ulvol,
+ { "ULVOL", "pfcp.volume_quota_flags.ulvol",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_volume_quota_b2_dlvol,
+ { "DLVOL", "pfcp.volume_quota_flags.dlvol",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }
+ },
{ &hf_pfcp_volume_quota_tovol,
{ "Total Volume", "pfcp.volume_quota.tovol",
FT_UINT64, BASE_DEC, NULL, 0x0,
},
{ &hf_pfcp_gate_status_b3b2_ulgate,
{ "UL Gate", "pfcp.gate_status.ulgate",
- FT_UINT8, BASE_DEC, VALS(pfcp_gate_status_vals), 0x0e,
+ FT_UINT8, BASE_DEC, VALS(pfcp_gate_status_vals), 0x0c,
NULL, HFILL }
},
{ &hf_pfcp_ul_mbr,
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b2_erir,
- { "DLDR (Downlink Data Report)", "pfcp.report_type.erir",
- FT_BOOLEAN, 8, NULL, 0x01,
+ { &hf_pfcp_report_type_b3_upir,
+ { "UPIR (User Plane Inactivity Report)", "pfcp.report_type.upir",
+ FT_BOOLEAN, 8, NULL, 0x08,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_report_type_b2_erir,
+ { "ERIR (Error Indication Report)", "pfcp.report_type.erir",
+ FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
- { &hf_pfcp_b1_usar,
+ { &hf_pfcp_report_type_b1_usar,
{ "USAR (Usage Report)", "pfcp.report_type.usar",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
- { &hf_pfcp_b0_dldr,
- { "ERIR (Error Indication Report)", "pfcp.report_type.dldr",
- FT_BOOLEAN, 8, NULL, 0x04,
+ { &hf_pfcp_report_type_b0_dldr,
+ { "DLDR (Downlink Data Report)", "pfcp.report_type.dldr",
+ FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_pfcp_offending_ie,
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_bucp,
+ { &hf_pfcp_up_function_features_o5_b0_bucp,
{ "BUCP", "pfcp.up_function_features.bucp",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0001,
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
"Downlink Data Buffering in CP function", HFILL }
},
- { &hf_pfcp_b1_ddnd,
+ { &hf_pfcp_up_function_features_o5_b1_ddnd,
{ "DDND", "pfcp.up_function_features.ddnd",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0002,
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
"Buffering parameter 'Downlink Data Notification Delay", HFILL }
},
- { &hf_pfcp_b2_dlbd,
+ { &hf_pfcp_up_function_features_o5_b2_dlbd,
{ "DLBD", "pfcp.up_function_features.dlbd",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0004,
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
NULL, HFILL }
},
- { &hf_pfcp_b3_trst,
+ { &hf_pfcp_up_function_features_o5_b3_trst,
{ "TRST", "pfcp.up_function_features.trst",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0008,
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
"Traffic Steering", HFILL }
},
- { &hf_pfcp_b4_ftup,
+ { &hf_pfcp_up_function_features_o5_b4_ftup,
{ "FTUP", "pfcp.up_function_features.ftup",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0010,
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
"F-TEID allocation / release in the UP function", HFILL }
},
- { &hf_pfcp_b5_pfdm,
+ { &hf_pfcp_up_function_features_o5_b5_pfdm,
{ "PFDM", "pfcp.up_function_features.pfdm",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0020,
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
"PFD Management procedure", HFILL }
},
- { &hf_pfcp_b6_heeu,
+ { &hf_pfcp_up_function_features_o5_b6_heeu,
{ "HEEU", "pfcp.up_function_features.heeu",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040,
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
"Header Enrichment of Uplink traffic", HFILL }
},
- { &hf_pfcp_b7_treu,
+ { &hf_pfcp_up_function_features_o5_b7_treu,
{ "TREU", "pfcp.up_function_features.treu",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0080,
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
"Traffic Redirection Enforcement in the UP function", HFILL }
},
- { &hf_pfcp_b8_empu,
+ { &hf_pfcp_up_function_features_o6_b0_empu,
{ "EMPU", "pfcp.up_function_features.empu",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0100,
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
"Sending of End Marker packets", HFILL }
},
{ &hf_pfcp_sequence_number,
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
+ { &hf_pfcp_volume_measurement_b0_tovol,
+ { "TOVOL", "pfcp.volume_measurement_flags.tovol",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_volume_measurement_b1_ulvol,
+ { "ULVOL", "pfcp.volume_measurement_flags.ulvol",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_volume_measurement_b2_dlvol,
+ { "DLVOL", "pfcp.volume_measurement_flags.dlvol",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }
+ },
{ &hf_pfcp_vol_meas_tovol,
{ "Total Volume", "pfcp.volume_measurement.tovol",
FT_UINT64, BASE_DEC, NULL, 0x0,
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_load,
+ { &hf_pfcp_cp_function_features_b0_load,
{ "LOAD", "pfcp.cp_function_features.load",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
"Load Control", HFILL }
},
- { &hf_pfcp_b1_ovrl,
+ { &hf_pfcp_cp_function_features_b1_ovrl,
{ "OVRL", "pfcp.cp_function_features.ovrl",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
"Overload Control", HFILL }
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_bef,
+ { &hf_pfcp_usage_information_b0_bef,
{ "BEF (Before)", "pfcp.usage_information.bef",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_b1_aft,
+ { &hf_pfcp_usage_information_b1_aft,
{ "AFT (After)", "pfcp.usage_information.aft",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
- { &hf_pfcp_b2_uae,
+ { &hf_pfcp_usage_information_b2_uae,
{ "UAE (Usage After Enforcement)", "pfcp.usage_information.uae",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
- { &hf_pfcp_b3_ube,
+ { &hf_pfcp_usage_information_b3_ube,
{ "UBE (Usage Before Enforcement)", "pfcp.usage_information.ube",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_ulpr_b0,
+ { &hf_pfcp_packet_rate_b0_ulpr,
{ "ULPR (Uplink Packet Rate)", "pfcp.packet_rate.ulpr",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
NULL, HFILL }
},
- { &hf_pfcp_dlpr_b1,
+ { &hf_pfcp_packet_rate_b1_dlpr,
{ "DLPR (Downlink Packet Rate)", "pfcp.packet_rate.dlpr",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
NULL, HFILL }
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_ttc,
+ { &hf_pfcp_dl_flow_level_marking_b0_ttc,
{ "TTC (ToS/Traffic Class)", "pfcp.dl_flow_level_marking.ttc",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
NULL, HFILL }
},
- { &hf_pfcp_b1_sci,
+ { &hf_pfcp_dl_flow_level_marking_b1_sci,
{ "SCI(Service Class Indicator)", "pfcp.dl_flow_level_marking.sci",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
NULL, HFILL }
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_pfcp_dl_data_service_inf_flags,
+ { &hf_pfcp_dl_data_service_inf_flags,
{ "Flags", "pfcp.dl_data_service_inf_flags",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_ppi,
+ { &hf_pfcp_dl_data_service_inf_b0_ppi,
{ "PPI(Paging Policy Indication)", "pfcp.dl_data_service_inf.ppi",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
NULL, HFILL }
FT_UINT16, BASE_DEC, NULL, 0x7f,
NULL, HFILL }
},
- { &hf_pfcp_sxsmreq_flags,
- { "Flags", "pfcp.sxsmreq_flags",
+ { &hf_pfcp_pfcpsmreq_flags,
+ { "Flags", "pfcp.smreq_flags",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_drobu,
- { "DROBU (Drop Buffered Packets)", "pfcp.sxsmreq_flags.drobu",
+ { &hf_pfcp_pfcpsmreq_flags_b0_drobu,
+ { "DROBU (Drop Buffered Packets)", "pfcp.smreq_flags.drobu",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_b1_sndem,
- { "SNDEM (Send End Marker Packets)", "pfcp.sxsmreq_flags.sndem",
+ { &hf_pfcp_pfcpsmreq_flags_b1_sndem,
+ { "SNDEM (Send End Marker Packets)", "pfcp.smreq_flags.sndem",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
- { &hf_pfcp_b2_qaurr,
- { "QAURR (Query All URRs)", "pfcp.sxsmreq_flags.qaurr",
+ { &hf_pfcp_pfcpsmreq_flags_b2_qaurr,
+ { "QAURR (Query All URRs)", "pfcp.smreq_flags.qaurr",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
- { &hf_pfcp_sxsrrsp_flags,
- { "Flags", "pfcp.sxsrrsp_flags",
+ { &hf_pfcp_pfcpsrrsp_flags,
+ { "Flags", "pfcp.srrsp_flags",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
+ { &hf_pfcp_pfcpsrrsp_flags_b0_drobu,
+ { "DROBU (Drop Buffered Packets)", "pfcp.srrsp_flags.drobu",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }
+ },
{ &hf_pfcp_pfd_contents_flags,
{ "Flags", "pfcp.pfd_contents_flags",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_fd,
+ { &hf_pfcp_pfd_contents_flags_b0_fd,
{ "FD (Flow Description)", "pfcp.pfd_contents_flags.fd",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_b1_url,
+ { &hf_pfcp_pfd_contents_flags_b1_url,
{ "URL (URL)", "pfcp.pfd_contents_flags.url",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
- { &hf_pfcp_b2_dn,
+ { &hf_pfcp_pfd_contents_flags_b2_dn,
{ "DN (Domain Name)", "pfcp.pfd_contents_flags.dn",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
- { &hf_pfcp_b3_cp,
+ { &hf_pfcp_pfd_contents_flags_b3_cp,
{ "CP (Custom PFD Content)", "pfcp.pfd_contents_flags.cp",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_mbqe,
+ { &hf_pfcp_measurement_info_b0_mbqe,
{ "MBQE (Measurement Before QoS Enforcement)", "pfcp.measurement_info.fd",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_b1_inam,
+ { &hf_pfcp_measurement_info_b1_inam,
{ "INAM (Inactive Measurement)", "pfcp.measurement_info.inam",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
+ { &hf_pfcp_measurement_info_b2_radi,
+ { "RADI (Reduced Application Detection Information)", "pfcp.measurement_info.radi",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }
+ },
{ &hf_pfcp_node_report_type,
{ "Flags", "pfcp.node_report_type",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_upfr,
+ { &hf_pfcp_node_report_type_b0_upfr,
{ "UPFR (User Plane Path Failure Report)", "pfcp.node_report_type.upfr",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_remote_gtp_u_peer,
- { "Flags", "pfcp.remote_gtp_u_peer",
+ { &hf_pfcp_remote_gtp_u_peer_flags,
+ { "Flags", "pfcp.remote_gtp_u_peer_flags",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_gtp_u_peer_flag_b0_v6,
- { "V6 (IPv6)", "pfcp.gtp_u_peer_flag.v6",
+ { &hf_pfcp_remote_gtp_u_peer_flags_b0_v6,
+ { "V6 (IPv6)", "pfcp.remote_gtp_u_peer_flags.v6",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
NULL, HFILL }
},
- { &hf_pfcp_gtp_u_peer_flag_b1_v4,
- { "V4 (IPv4)", "pfcp.gtp_u_peer_flag.v4",
+ { &hf_pfcp_remote_gtp_u_peer_flags_b1_v4,
+ { "V4 (IPv4)", "pfcp.remote_gtp_u_peer_flags.v4",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
NULL, HFILL }
},
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_aoci,
+ { &hf_pfcp_oci_flags_b0_aoci,
{ "AOCI: Associate OCI with Node ID", "pfcp.oci_flags.aoci",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
- { &hf_pfcp_sx_assoc_rel_req_flags,
- { "Flags", "pfcp.sx_assoc_rel_req",
+ { &hf_pfcp_pfcp_assoc_rel_req_flags,
+ { "Flags", "pfcp.assoc_rel_req",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_pfcp_b0_sarr,
- { "SARR (Sx Association Release Request)", "pfcp.sx_assoc_rel_req.sarr",
+ { &hf_pfcp_pfcp_assoc_rel_req_b0_sarr,
+ { "SARR (PFCP Association Release Request)", "pfcp.assoc_rel_req.sarr",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20,
NULL, HFILL }
},
- { &hf_pfcp_upiri_flg_b1_v6,
+ { &hf_pfcp_upiri_flags_b1_v6,
{ "V6 (IPv6)", "pfcp.upiri_flags.v6",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
NULL, HFILL }
},
- { &hf_pfcp_upiri_flg_b0_v4,
+ { &hf_pfcp_upiri_flags_b0_v4,
{ "V4 (IPv4)", "pfcp.upiri_flags.v4",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
NULL, HFILL }
},
{ &hf_pfcp_upiri_teidri,
{ "TEID Range Indication", "pfcp.upiri.teidri",
- FT_UINT64, BASE_DEC, NULL, 0x1C,
+ FT_UINT8, BASE_DEC, NULL, 0x1C,
NULL, HFILL }
},
{ &hf_pfcp_upiri_teid_range,
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
+ { &hf_pfcp_user_plane_inactivity_timer,
+ { "User Plane Inactivity Timer", "pfcp.user_plane_inactivity_time",
+ FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_seconds, 0,
+ NULL, HFILL }
+ },
+
+ { &hf_pfcp_subsequent_volume_quota,
+ { "Flags", "pfcp.subsequent_volume_quota",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_subsequent_volume_quota_b0_tovol,
+ { "TOVOL", "pfcp.subsequent_volume_quota_flags.tovol",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_subsequent_volume_quota_b1_ulvol,
+ { "ULVOL", "pfcp.subsequent_volume_quota_flags.ulvol",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_subsequent_volume_quota_b2_dlvol,
+ { "DLVOL", "pfcp.subsequent_volume_quota_flags.dlvol",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_subsequent_volume_quota_tovol,
+ { "Total Volume", "pfcp.subsequent_volume_quota.tovol",
+ FT_UINT64, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_subsequent_volume_quota_ulvol,
+ { "Uplink Volume", "pfcp.subsequent_volume_quota.ulvol",
+ FT_UINT64, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_subsequent_volume_quota_dlvol,
+ { "Downlink Volume", "pfcp.subsequent_volume_quota.dlvol",
+ FT_UINT64, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+
+ { &hf_pfcp_subsequent_time_quota,
+ { "Subsequent Time Quota", "pfcp.subsequent_time_quota",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_rqi_flag,
+ { "RQI", "pfcp.rqi_flag",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_qfi,
+ { "QFI", "pfcp.qfi_value",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_query_urr_reference,
+ { "Query URR Reference", "pfcp.query_urr_reference",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+
+ { &hf_pfcp_additional_usage_reports_information,
+ { "Additional Usage Reports Information", "pfcp.additional_usage_reports_information",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_additional_usage_reports_information_b15_auri,
+ { "AURI (Additional Usage Reports Indication)", "pfcp.additional_usage_reports_information_auri",
+ FT_BOOLEAN, 16, NULL, 0x8000,
+ NULL, HFILL }
+ },
+ { &hf_pfcp_additional_usage_reports_information_b14_b0_number_value,
+ { "Number of Additional Usage Reports value", "pfcp.additional_usage_reports_information_value",
+ FT_UINT16, BASE_DEC, NULL, 0x7FFF,
+ NULL, HFILL }
+ },
};
/* Setup protocol subtree array */
-#define NUM_INDIVIDUAL_ELEMS_PFCP 33
+#define NUM_INDIVIDUAL_ELEMS_PFCP 39
gint *ett[NUM_INDIVIDUAL_ELEMS_PFCP +
(NUM_PFCP_IES - 1)];
ett[22] = &ett_pfcp_packet_rate;
ett[23] = &ett_pfcp_pfcp_dl_flow_level_marking;
ett[24] = &ett_pfcp_dl_data_service_inf;
- ett[25] = &ett_pfcp_sxsmreq;
- ett[26] = &ett_pfcp_sxsrrsp;
+ ett[25] = &ett_pfcp_pfcpsmreq;
+ ett[26] = &ett_pfcp_pfcpsrrsp;
ett[27] = &ett_pfcp_measurement_info;
ett[28] = &ett_pfcp_node_report_type;
ett[29] = &ett_pfcp_remote_gtp_u_peer;
ett[30] = &ett_pfcp_oci_flags;
ett[31] = &ett_sx_assoc_rel_req_flags;
ett[32] = &ett_pfcp_upiri_flags;
+ ett[33] = &ett_pfcp_flow_desc;
+ ett[34] = &ett_pfcp_tos;
+ ett[35] = &ett_pfcp_spi;
+ ett[36] = &ett_pfcp_flow_label;
+ ett[37] = &ett_pfcp_subsequent_volume_quota;
+ ett[38] = &ett_pfcp_additional_usage_reports_information;
static ei_register_info ei[] = {