diff options
Diffstat (limited to 'epan/dissectors/packet-pfcp.c')
-rw-r--r-- | epan/dissectors/packet-pfcp.c | 8548 |
1 files changed, 5288 insertions, 3260 deletions
diff --git a/epan/dissectors/packet-pfcp.c b/epan/dissectors/packet-pfcp.c index 6027726ad0..1179589128 100644 --- a/epan/dissectors/packet-pfcp.c +++ b/epan/dissectors/packet-pfcp.c @@ -4,13 +4,16 @@ * * Copyright 2017-2018, Anders Broman <anders.broman@ericsson.com> * + * Updates and corrections: + * Copyright 2017-2023, Joakim Karlsson <oakimk@gmail.com> + * * Wireshark - Network traffic analyzer * By Gerald Combs <gerald@wireshark.org> * Copyright 1998 Gerald Combs * * SPDX-License-Identifier: GPL-2.0-or-later * - * Ref 3GPP TS 29.244 V17.1.0 (2021-06-29) + * Ref 3GPP TS 29.244 V18.4.0 (2024-01-04) */ #include "config.h" @@ -18,8 +21,13 @@ #include <epan/conversation.h> #include <epan/etypes.h> #include <epan/expert.h> +#include <epan/ipproto.h> #include <epan/sminmpec.h> #include <epan/addr_resolv.h> /* Needed for BASE_ENTERPRISES */ +#include <epan/tap.h> +#include <epan/srt_table.h> +#include <proto.h> +#include <tvbuff.h> #include "packet-e164.h" #include "packet-e212.h" #include "packet-ip.h" @@ -28,1087 +36,1239 @@ void proto_register_pfcp(void); void proto_reg_handoff_pfcp(void); static dissector_handle_t pfcp_handle; -static dissector_handle_t pfcp_3gpp_ies_handle; -static dissector_handle_t pfcp_travelping_ies_handle; -static dissector_handle_t pfcp_bbf_ies_handle; - -#define UDP_PORT_PFCP 8805 -static guint g_pfcp_port = UDP_PORT_PFCP; - -static int proto_pfcp = -1; - -static int hf_pfcp_msg_type = -1; -static int hf_pfcp_msg_length = -1; -static int hf_pfcp_hdr_flags = -1; -static int hf_pfcp_version = -1; -static int hf_pfcp_fo_flag = -1; -static int hf_pfcp_mp_flag = -1; -static int hf_pfcp_s_flag = -1; -static int hf_pfcp_seid = -1; -static int hf_pfcp_seqno = -1; -static int hf_pfcp_mp = -1; - -static int hf_pfcp2_ie = -1; -static int hf_pfcp2_ie_len = -1; -static int hf_pfcp2_enterprise_ie = -1; -static int hf_pfcp_enterprise_id = -1; -static int hf_pfcp_enterprise_data = -1; - -static int hf_pfcp_response_in = -1; -static int hf_pfcp_response_to = -1; -static int hf_pfcp_response_time = -1; - -static int hf_pfcp_session = -1; - -static int hf_pfcp_spare_b2 = -1; -static int hf_pfcp_spare_b3 = -1; -static int hf_pfcp_spare_b4 = -1; -static int hf_pfcp_spare_b5 = -1; -static int hf_pfcp_spare_b6 = -1; -static int hf_pfcp_spare_b7 = -1; -static int hf_pfcp_spare_b7_b6 = -1; -static int hf_pfcp_spare_b7_b5 = -1; -static int hf_pfcp_spare_b7_b4 = -1; -static int hf_pfcp_spare_b7_b3 = -1; -static int hf_pfcp_spare_b7_b2 = -1; -static int hf_pfcp_spare_b7_b1 = -1; -static int hf_pfcp_spare_h0 = -1; -static int hf_pfcp_spare_h1 = -1; -static int hf_pfcp_spare_oct = -1; -static int hf_pfcp_spare = -1; - -static int hf_pfcp2_cause = -1; -static int hf_pfcp_node_id_type = -1; -static int hf_pfcp_node_id_ipv4 = -1; -static int hf_pfcp_node_id_ipv6 = -1; -static int hf_pfcp_node_id_fqdn = -1; -static int hf_pfcp_recovery_time_stamp = -1; -static int hf_pfcp_f_seid_flags = -1; -static int hf_pfcp_b0_v6 = -1; -static int hf_pfcp_b1_v4 = -1; -static int hf_pfcp_f_seid_ipv4 = -1; -static int hf_pfcp_f_seid_ipv6 = -1; -static int hf_pfcp_pdr_id = -1; -static int hf_pfcp_precedence = -1; -static int hf_pfcp_source_interface = -1; -static int hf_pfcp_f_teid_flags = -1; -static int hf_pfcp_fteid_flg_spare = -1; -static int hf_pfcp_fteid_flg_b3_ch_id = -1; -static int hf_pfcp_fteid_flg_b2_ch = -1; -static int hf_pfcp_fteid_flg_b1_v6 = -1; -static int hf_pfcp_fteid_flg_b0_v4 = -1; -static int hf_pfcp_f_teid_ch_id = -1; -static int hf_pfcp_f_teid_teid = -1; -static int hf_pfcp_f_teid_ipv4 = -1; -static int hf_pfcp_f_teid_ipv6 = -1; -static int hf_pfcp_network_instance = -1; -static int hf_pfcp_pdn_type = -1; -static int hf_pfcp_failed_rule_id_type = -1; -static int hf_pfcp_time_quota_mechanism_bti_type = -1; -static int hf_pfcp_time_quota_mechanism_bti = -1; -static int hf_pfcp_multiplier_value_digits = -1; -static int hf_pfcp_multiplier_exponent = -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_address_flag_b2_sd = -1; -static int hf_pfcp_ue_ip_address_flag_b3_v6d = -1; -static int hf_pfcp_ue_ip_address_flag_b4_chv4 = -1; -static int hf_pfcp_ue_ip_address_flag_b5_chv6 = -1; -static int hf_pfcp_ue_ip_address_flag_b6_v6pl = -1; -static int hf_pfcp_ue_ip_addr_ipv4 = -1; -static int hf_pfcp_ue_ip_add_ipv6 = -1; -static int hf_pfcp_ue_ip_add_ipv6_prefix = -1; -static int hf_pfcp_ue_ip_add_ipv6pd = -1; -static int hf_pfcp_ue_ip_add_ipv6_prefix_length = -1; -static int hf_pfcp_application_id = -1; -static int hf_pfcp_application_id_str = -1; - -static int hf_pfcp_sdf_filter_flags = -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_sdf_filter_flags_b4_bid = -1; - -static int hf_pfcp_flow_desc_len = -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_traffic_dscp = -1; -static int hf_pfcp_spi = -1; -static int hf_pfcp_flow_label_spare_bit = -1; -static int hf_pfcp_flow_label = -1; -static int hf_pfcp_sdf_filter_id = -1; - -static int hf_pfcp_out_hdr_desc = -1; -static int hf_pfcp_gtpu_ext_hdr_del_b0_pdu_sess_cont = -1; -static int hf_pfcp_far_id_flg = -1; -static int hf_pfcp_far_id = -1; -static int hf_pfcp_urr_id_flg = -1; -static int hf_pfcp_urr_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_o6_b4_mbsu = -1; -static int hf_pfcp_apply_action_flags_o6_b3_fssm = -1; -static int hf_pfcp_apply_action_flags_o6_b2_ddpn = -1; -static int hf_pfcp_apply_action_flags_o6_b1_bdpn = -1; -static int hf_pfcp_apply_action_flags_o6_b0_edrt = -1; -static int hf_pfcp_apply_action_flags_o5_b7_dfrt = -1; -static int hf_pfcp_apply_action_flags_o5_b6_ipmd = -1; -static int hf_pfcp_apply_action_flags_o5_b5_ipma = -1; -static int hf_pfcp_apply_action_flags_o5_b4_dupl = -1; -static int hf_pfcp_apply_action_flags_o5_b3_nocp = -1; -static int hf_pfcp_apply_action_flags_o5_b2_buff = -1; -static int hf_pfcp_apply_action_flags_o5_b1_forw = -1; -static int hf_pfcp_apply_action_flags_o5_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_fq_csid_node_id_ipv4 = -1; -static int hf_pfcp_fq_csid_node_id_ipv6 = -1; -static int hf_pfcp_fq_csid_node_id_mcc_mnc = -1; -static int hf_pfcp_fq_csid_node_id_int = -1; -static int hf_pfcp_fq_csid = -1; -static int hf_pfcp_fq_csid_node_type = -1; -static int hf_pfcp_measurement_period = -1; -static int hf_pfcp_duration_measurement = -1; -static int hf_pfcp_time_of_first_packet = -1; -static int hf_pfcp_time_of_last_packet = -1; -static int hf_pfcp_dst_interface = -1; -static int hf_pfcp_redirect_address_type = -1; -static int hf_pfcp_redirect_server_addr_len = -1; -static int hf_pfcp_redirect_server_address = -1; -static int hf_pfcp_other_redirect_server_addr_len = -1; -static int hf_pfcp_other_redirect_server_address = -1; -static int hf_pfcp_outer_hdr_desc = -1; -static int hf_pfcp_outer_hdr_creation_teid = -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_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_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_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_b7_quvti = -1; -static int hf_pfcp_reporting_triggers_o6_b6_ipmjl = -1; -static int hf_pfcp_reporting_triggers_o6_b5_evequ = -1; -static int hf_pfcp_reporting_triggers_o6_b4_eveth = -1; -static int hf_pfcp_reporting_triggers_o6_b3_macar = -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_reporting_triggers_o7_b0_reemr = -1; - -static int hf_pfcp_volume_threshold = -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 = -1; -static int hf_pfcp_subseq_volume_threshold_b2_dlvol = -1; -static int hf_pfcp_subseq_volume_threshold_b1_ulvol = -1; -static int hf_pfcp_subseq_volume_threshold_b0_tovol = -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_quota_holding_time = -1; -static int hf_pfcp_dropped_dl_traffic_threshold = -1; -static int hf_pfcp_dropped_dl_traffic_threshold_b1_dlby = -1; -static int hf_pfcp_dropped_dl_traffic_threshold_b0_dlpa = -1; -static int hf_pfcp_downlink_packets = -1; -static int hf_pfcp_bytes_downlink_data = -1; -static int hf_pfcp_qer_correlation_id = -1; -static int hf_pfcp_gate_status = -1; -static int hf_pfcp_gate_status_b0b1_dlgate = -1; -static int hf_pfcp_gate_status_b3b2_ulgate = -1; -static int hf_pfcp_ul_mbr = -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_report_type_b6_uisr = -1; -static int hf_pfcp_report_type_b5_sesr = -1; -static int hf_pfcp_report_type_b4_tmir = -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_offending_ie_value = -1; - - -static int hf_pfcp_up_function_features_o11_b0_drqos = -1; -static int hf_pfcp_up_function_features_o10_b7_dnsts = -1; -static int hf_pfcp_up_function_features_o10_b6_iprep = -1; -static int hf_pfcp_up_function_features_o10_b5_resps = -1; -static int hf_pfcp_up_function_features_o10_b4_upber = -1; -static int hf_pfcp_up_function_features_o10_b3_l2tp = -1; -static int hf_pfcp_up_function_features_o10_b2_nspoc = -1; -static int hf_pfcp_up_function_features_o10_b1_quoaf = -1; -static int hf_pfcp_up_function_features_o10_b0_rttwp = -1; -static int hf_pfcp_up_function_features_o9_b7_rds = -1; -static int hf_pfcp_up_function_features_o9_b6_ddds = -1; -static int hf_pfcp_up_function_features_o9_b5_ethar = -1; -static int hf_pfcp_up_function_features_o9_b4_ciot = -1; -static int hf_pfcp_up_function_features_o9_b3_mt_edt = -1; -static int hf_pfcp_up_function_features_o9_b2_gpqm = -1; -static int hf_pfcp_up_function_features_o9_b1_qfqm = -1; -static int hf_pfcp_up_function_features_o9_b0_atsss_ll = -1; -static int hf_pfcp_up_function_features_o8_b7_mptcp = -1; -static int hf_pfcp_up_function_features_o8_b6_tscu = -1; -static int hf_pfcp_up_function_features_o8_b5_ip6pl = -1; -static int hf_pfcp_up_function_features_o8_b4_iptv = -1; -static int hf_pfcp_up_function_features_o8_b3_norp = -1; -static int hf_pfcp_up_function_features_o8_b2_vtime = -1; -static int hf_pfcp_up_function_features_o8_b1_rttl = -1; -static int hf_pfcp_up_function_features_o8_b0_mpas = -1; -static int hf_pfcp_up_function_features_o7_b7_gcom = -1; -static int hf_pfcp_up_function_features_o7_b6_bundl = -1; -static int hf_pfcp_up_function_features_o7_b5_mte_n4 = -1; -static int hf_pfcp_up_function_features_o7_b4_mnop = -1; -static int hf_pfcp_up_function_features_o7_b3_sset = -1; -static int hf_pfcp_up_function_features_o7_b2_ueip = -1; -static int hf_pfcp_up_function_features_o7_b1_adpdp = -1; -static int hf_pfcp_up_function_features_o7_b0_dpdra = -1; -static int hf_pfcp_up_function_features_o6_b7_epfar = -1; -static int hf_pfcp_up_function_features_o6_b6_pfde = -1; -static int hf_pfcp_up_function_features_o6_b5_frrt = -1; -static int hf_pfcp_up_function_features_o6_b4_trace = -1; -static int hf_pfcp_up_function_features_o6_b3_quoac = -1; -static int hf_pfcp_up_function_features_o6_b2_udbc = -1; -static int hf_pfcp_up_function_features_o6_b1_pdiu = -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_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_b7_eveth = -1; -static int hf_pfcp_usage_report_trigger_o6_b6_macar = -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_usage_report_trigger_o7_b4_emrre = -1; -static int hf_pfcp_usage_report_trigger_o7_b3_quvti = -1; -static int hf_pfcp_usage_report_trigger_o7_b2_ipmjl = -1; -static int hf_pfcp_usage_report_trigger_o7_b1_tebur = -1; -static int hf_pfcp_usage_report_trigger_o7_b0_evequ = -1; - -static int hf_pfcp_volume_measurement = -1; -static int hf_pfcp_volume_measurement_b5_dlnop = -1; -static int hf_pfcp_volume_measurement_b4_ulnop = -1; -static int hf_pfcp_volume_measurement_b3_tonop = -1; -static int hf_pfcp_volume_measurement_b2_dlvol = -1; -static int hf_pfcp_volume_measurement_b1_ulvol = -1; -static int hf_pfcp_volume_measurement_b0_tovol = -1; -static int hf_pfcp_vol_meas_tovol = -1; -static int hf_pfcp_vol_meas_ulvol = -1; -static int hf_pfcp_vol_meas_dlvol = -1; -static int hf_pfcp_vol_meas_tonop = -1; -static int hf_pfcp_vol_meas_ulnop = -1; -static int hf_pfcp_vol_meas_dlnop = -1; - -static int hf_pfcp_cp_function_features_o6_b0_psucc = -1; -static int hf_pfcp_cp_function_features_o5_b7_uiaur = -1; -static int hf_pfcp_cp_function_features_o5_b6_ardr = -1; -static int hf_pfcp_cp_function_features_o5_b5_mpas = -1; -static int hf_pfcp_cp_function_features_o5_b4_bundl = -1; -static int hf_pfcp_cp_function_features_o5_b3_sset = -1; -static int hf_pfcp_cp_function_features_o5_b2_epfar = -1; -static int hf_pfcp_cp_function_features_o5_b1_ovrl = -1; -static int hf_pfcp_cp_function_features_o5_b0_load = -1; - -static int hf_pfcp_usage_information = -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_application_instance_id_str = -1; -static int hf_pfcp_flow_dir = -1; -static int hf_pfcp_packet_rate = -1; -static int hf_pfcp_packet_rate_b0_ulpr = -1; -static int hf_pfcp_packet_rate_b1_dlpr = -1; -static int hf_pfcp_packet_rate_b2_aprc = -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_a_ul_time_unit = -1; -static int hf_pfcp_a_max_ul_pr = -1; -static int hf_pfcp_a_dl_time_unit = -1; -static int hf_pfcp_a_max_dl_pr = -1; - -static int hf_pfcp_dl_flow_level_marking = -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_dl_data_service_inf_flags = -1; -static int hf_pfcp_dl_data_service_inf_b0_ppi = -1; -static int hf_pfcp_dl_data_service_inf_b1_qfii = -1; -static int hf_pfcp_ppi = -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_pfcpsmreq_flags_b3_sumpc = -1; -static int hf_pfcp_pfcpsmreq_flags_b4_rumuc = -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_pfd_contents_flags_b7_adnp = -1; -static int hf_pfcp_pfd_contents_flags_b6_aurl = -1; -static int hf_pfcp_pfd_contents_flags_b5_afd = -1; -static int hf_pfcp_pfd_contents_flags_b4_dnp = -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_dn = -1; -static int hf_pfcp_cp_len = -1; -static int hf_pfcp_cp = -1; -static int hf_pfcp_dnp_len = -1; -static int hf_pfcp_dnp = -1; -static int hf_pfcp_afd_len = -1; -static int hf_pfcp_aurl_len = -1; -static int hf_pfcp_adnp_len = -1; -static int hf_pfcp_header_type = -1; -static int hf_pfcp_hf_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_measurement_info_b0_mbqe = -1; -static int hf_pfcp_measurement_info_b1_inam = -1; -static int hf_pfcp_measurement_info_b2_radi = -1; -static int hf_pfcp_measurement_info_b3_istm = -1; -static int hf_pfcp_measurement_info_b4_mnop = -1; -static int hf_pfcp_measurement_info_b5_sspoc = -1; -static int hf_pfcp_measurement_info_b6_aspoc = -1; -static int hf_pfcp_measurement_info_b7_ciam = -1; - -static int hf_pfcp_node_report_type = -1; -static int hf_pfcp_node_report_type_b0_upfr = -1; -static int hf_pfcp_node_report_type_b1_uprr = -1; -static int hf_pfcp_node_report_type_b2_ckdr = -1; -static int hf_pfcp_node_report_type_b3_gpqr = -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_flags_b2_di = -1; -static int hf_pfcp_remote_gtp_u_peer_flags_b3_ni = -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_remote_gtp_u_peer_length_di = -1; -static int hf_pfcp_remote_gtp_u_peer_length_ni = -1; -static int hf_pfcp_ur_seqn = -1; - -static int hf_pfcp_oci_flags = -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_flags_b0_v4 = -1; -static int hf_pfcp_upiri_flags_b1_v6 = -1; -static int hf_pfcp_upiri_flg_b6_assosi = -1; -static int hf_pfcp_upiri_flg_b5_assoni = -1; -static int hf_pfcp_upiri_flg_b2b4_teidri = -1; -static int hf_pfcp_upiri_teidri = -1; -static int hf_pfcp_upiri_teid_range = -1; -static int hf_pfcp_upiri_ipv4 = -1; -static int hf_pfcp_upiri_ipv6 = -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 hf_pfcp_traffic_endpoint_id = -1; - -static int hf_pfcp_mac_address_flags = -1; -static int hf_pfcp_mac_address_flags_b3_udes = -1; -static int hf_pfcp_mac_address_flags_b2_usou = -1; -static int hf_pfcp_mac_address_flags_b1_dest = -1; -static int hf_pfcp_mac_address_flags_b0_sour = -1; -static int hf_pfcp_mac_address_upper_dest_mac_address = -1; -static int hf_pfcp_mac_address_upper_source_mac_address = -1; -static int hf_pfcp_mac_address_dest_mac_address = -1; -static int hf_pfcp_mac_address_source_mac_address = -1; - -static int hf_pfcp_c_tag_flags = -1; -static int hf_pfcp_c_tag_flags_b2_vid = -1; -static int hf_pfcp_c_tag_flags_b1_dei = -1; -static int hf_pfcp_c_tag_flags_b0_pcp = -1; -static int hf_pfcp_c_tag_cvid = -1; -static int hf_pfcp_c_tag_dei_flag = -1; -static int hf_pfcp_c_tag_pcp_value = -1; - -static int hf_pfcp_s_tag_flags = -1; -static int hf_pfcp_s_tag_flags_b2_vid = -1; -static int hf_pfcp_s_tag_flags_b1_dei = -1; -static int hf_pfcp_s_tag_flags_b0_pcp = -1; -static int hf_pfcp_s_tag_svid = -1; -static int hf_pfcp_s_tag_dei_flag = -1; -static int hf_pfcp_s_tag_pcp_value = -1; - -static int hf_pfcp_ethertype = -1; - -static int hf_pfcp_proxying_flags = -1; -static int hf_pfcp_proxying_flags_b1_ins = -1; -static int hf_pfcp_proxying_flags_b0_arp = -1; - -static int hf_pfcp_ethertype_filter_id = -1; - -static int hf_pfcp_ethertype_filter_properties_flags = -1; -static int hf_pfcp_ethertype_filter_properties_flags_b0_bide = -1; - -static int hf_pfcp_suggested_buffering_packets_count_packet_count = -1; - -static int hf_pfcp_user_id_flags = -1; -static int hf_pfcp_user_id_flags_b6_peif = -1; -static int hf_pfcp_user_id_flags_b5_gpsif = -1; -static int hf_pfcp_user_id_flags_b4_supif = -1; -static int hf_pfcp_user_id_flags_b3_naif = -1; -static int hf_pfcp_user_id_flags_b2_msisdnf = -1; -static int hf_pfcp_user_id_flags_b1_imeif = -1; -static int hf_pfcp_user_id_flags_b0_imsif = -1; -static int hf_pfcp_user_id_length_of_imsi = -1; -static int hf_pfcp_user_id_length_of_imei = -1; -static int hf_pfcp_user_id_imei = -1; -static int hf_pfcp_user_id_length_of_msisdn = -1; -static int hf_pfcp_user_id_length_of_nai = -1; -static int hf_pfcp_user_id_nai = -1; -static int hf_pfcp_user_id_length_of_supi = -1; -static int hf_pfcp_user_id_supi = -1; -static int hf_pfcp_user_id_length_of_gpsi = -1; -static int hf_pfcp_user_id_gpsi = -1; -static int hf_pfcp_user_id_length_of_pei = -1; -static int hf_pfcp_user_id_pei = -1; - -static int hf_pfcp_ethernet_pdu_session_information_flags = -1; -static int hf_pfcp_ethernet_pdu_session_information_flags_b0_ethi = -1; - -static int hf_pfcp_mac_addresses_detected_number_of_mac_addresses = -1; -static int hf_pfcp_mac_addresses_detected_mac_address = -1; -static int hf_pfcp_mac_addresses_detected_length_of_ctag = -1; -static int hf_pfcp_mac_addresses_detected_length_of_stag = -1; - -static int hf_pfcp_mac_addresses_removed_number_of_mac_addresses = -1; -static int hf_pfcp_mac_addresses_removed_mac_address = -1; -static int hf_pfcp_mac_addresses_removed_length_of_ctag = -1; -static int hf_pfcp_mac_addresses_removed_length_of_stag = -1; - -static int hf_pfcp_ethernet_inactivity_timer = -1; - -static int hf_pfcp_subsequent_event_quota = -1; - -static int hf_pfcp_subsequent_event_threshold = -1; - -static int hf_pfcp_trace_information_trace_id = -1; -static int hf_pfcp_trace_information_length_trigger_events = -1; -static int hf_pfcp_trace_information_trigger_events = -1; -static int hf_pfcp_trace_information_session_trace_depth = -1; -static int hf_pfcp_trace_information_length_list_interfaces = -1; -static int hf_pfcp_trace_information_list_interfaces = -1; -static int hf_pfcp_trace_information_length_ipaddress = -1; -static int hf_pfcp_trace_information_ipv4 = -1; -static int hf_pfcp_trace_information_ipv6 = -1; - -static int hf_pfcp_framed_route = -1; -static int hf_pfcp_framed_routing = -1; -static int hf_pfcp_framed_ipv6_route = -1; - -static int hf_pfcp_event_quota = -1; - -static int hf_pfcp_event_threshold = -1; - -static int hf_pfcp_time_stamp = -1; -static int hf_pfcp_averaging_window = -1; +#define UDP_PORT_PFCP 8805 /* IANA-registered */ + +static int proto_pfcp; + +static int hf_pfcp_msg_type; +static int hf_pfcp_msg_length; +static int hf_pfcp_hdr_flags; +static int hf_pfcp_version; +static int hf_pfcp_fo_flag; +static int hf_pfcp_mp_flag; +static int hf_pfcp_s_flag; +static int hf_pfcp_seid; +static int hf_pfcp_seqno; +static int hf_pfcp_mp; + +static int hf_pfcp2_ie; +static int hf_pfcp2_ie_len; +static int hf_pfcp2_enterprise_ie; +static int hf_pfcp_enterprise_id; +static int hf_pfcp_enterprise_data; + +static int hf_pfcp_response_in; +static int hf_pfcp_response_to; +static int hf_pfcp_response_time; + +static int hf_pfcp_session; + +static int hf_pfcp_spare_b0; +static int hf_pfcp_spare_b1; +static int hf_pfcp_spare_b2; +static int hf_pfcp_spare_b3; +static int hf_pfcp_spare_b4; +static int hf_pfcp_spare_b5; +static int hf_pfcp_spare_b6; +static int hf_pfcp_spare_b7; +static int hf_pfcp_spare_b7_b6; +static int hf_pfcp_spare_b7_b5; +static int hf_pfcp_spare_b7_b4; +static int hf_pfcp_spare_b7_b3; +static int hf_pfcp_spare_b7_b2; +static int hf_pfcp_spare_b7_b1; +static int hf_pfcp_spare_h0; +static int hf_pfcp_spare_h1; +static int hf_pfcp_spare_oct; +static int hf_pfcp_spare; + +static int hf_pfcp2_cause; +static int hf_pfcp_node_id_type; +static int hf_pfcp_node_id_ipv4; +static int hf_pfcp_node_id_ipv6; +static int hf_pfcp_node_id_fqdn; +static int hf_pfcp_recovery_time_stamp; +static int hf_pfcp_b0_v6; +static int hf_pfcp_b1_v4; +static int hf_pfcp_f_seid_ipv4; +static int hf_pfcp_f_seid_ipv6; +static int hf_pfcp_pdr_id; +static int hf_pfcp_precedence; +static int hf_pfcp_source_interface; +static int hf_pfcp_fteid_flg_spare; +static int hf_pfcp_fteid_flg_b3_ch_id; +static int hf_pfcp_fteid_flg_b2_ch; +static int hf_pfcp_fteid_flg_b1_v6; +static int hf_pfcp_fteid_flg_b0_v4; +static int hf_pfcp_f_teid_ch_id; +static int hf_pfcp_f_teid_teid; +static int hf_pfcp_f_teid_ipv4; +static int hf_pfcp_f_teid_ipv6; +static int hf_pfcp_network_instance; +static int hf_pfcp_pdn_type; +static int hf_pfcp_failed_rule_id_type; +static int hf_pfcp_time_quota_mechanism_bti_type; +static int hf_pfcp_time_quota_mechanism_bti; +static int hf_pfcp_multiplier_value_digits; +static int hf_pfcp_multiplier_exponent; + +static int hf_pfcp_ue_ip_address_flag_b0_v6; +static int hf_pfcp_ue_ip_address_flag_b1_v4; +static int hf_pfcp_ue_ip_address_flag_b2_sd; +static int hf_pfcp_ue_ip_address_flag_b3_v6d; +static int hf_pfcp_ue_ip_address_flag_b4_chv4; +static int hf_pfcp_ue_ip_address_flag_b5_chv6; +static int hf_pfcp_ue_ip_address_flag_b6_v6pl; +static int hf_pfcp_ue_ip_addr_ipv4; +static int hf_pfcp_ue_ip_add_ipv6; +static int hf_pfcp_ue_ip_add_ipv6_prefix_delegation_bits; +static int hf_pfcp_ue_ip_add_ipv6_prefix_length; +static int hf_pfcp_application_id; +static int hf_pfcp_application_id_str; + +static int hf_pfcp_sdf_filter_flags_b0_fd; +static int hf_pfcp_sdf_filter_flags_b1_ttc; +static int hf_pfcp_sdf_filter_flags_b2_spi; +static int hf_pfcp_sdf_filter_flags_b3_fl; +static int hf_pfcp_sdf_filter_flags_b4_bid; + +static int hf_pfcp_flow_desc_len; +static int hf_pfcp_flow_desc; +static int hf_pfcp_traffic_class; +static int hf_pfcp_traffic_mask; +static int hf_pfcp_traffic_dscp; +static int hf_pfcp_spi; +static int hf_pfcp_flow_label_spare_bit; +static int hf_pfcp_flow_label; +static int hf_pfcp_sdf_filter_id; + +static int hf_pfcp_out_hdr_desc; +static int hf_pfcp_gtpu_ext_hdr_del_b0_pdu_sess_cont; +static int hf_pfcp_far_id_flg; +static int hf_pfcp_far_id; +static int hf_pfcp_urr_id_flg; +static int hf_pfcp_urr_id; +static int hf_pfcp_qer_id_flg; +static int hf_pfcp_qer_id; +static int hf_pfcp_predef_rules_name; + + + +static int hf_pfcp_apply_action_flags_o6_b4_mbsu; +static int hf_pfcp_apply_action_flags_o6_b3_fssm; +static int hf_pfcp_apply_action_flags_o6_b2_ddpn; +static int hf_pfcp_apply_action_flags_o6_b1_bdpn; +static int hf_pfcp_apply_action_flags_o6_b0_edrt; +static int hf_pfcp_apply_action_flags_o5_b7_dfrt; +static int hf_pfcp_apply_action_flags_o5_b6_ipmd; +static int hf_pfcp_apply_action_flags_o5_b5_ipma; +static int hf_pfcp_apply_action_flags_o5_b4_dupl; +static int hf_pfcp_apply_action_flags_o5_b3_nocp; +static int hf_pfcp_apply_action_flags_o5_b2_buff; +static int hf_pfcp_apply_action_flags_o5_b1_forw; +static int hf_pfcp_apply_action_flags_o5_b0_drop; + +static int hf_pfcp_bar_id; +static int hf_pfcp_fq_csid_node_id_type; +static int hf_pfcp_num_csid; +static int hf_pfcp_fq_csid_node_id_ipv4; +static int hf_pfcp_fq_csid_node_id_ipv6; +static int hf_pfcp_fq_csid_node_id_mcc_mnc; +static int hf_pfcp_fq_csid_node_id_int; +static int hf_pfcp_fq_csid; +static int hf_pfcp_fq_csid_node_type; +static int hf_pfcp_measurement_period; +static int hf_pfcp_duration_measurement; +static int hf_pfcp_time_of_first_packet; +static int hf_pfcp_time_of_last_packet; +static int hf_pfcp_dst_interface; +static int hf_pfcp_redirect_address_type; +static int hf_pfcp_redirect_server_addr_len; +static int hf_pfcp_redirect_server_address; +static int hf_pfcp_other_redirect_server_addr_len; +static int hf_pfcp_other_redirect_server_address; +static int hf_pfcp_redirect_port; +static int hf_pfcp_outer_hdr_desc_o5_b0_gtp_udp_ipv4; +static int hf_pfcp_outer_hdr_desc_o5_b1_gtp_udp_ipv6; +static int hf_pfcp_outer_hdr_desc_o5_b2_udp_ipv4; +static int hf_pfcp_outer_hdr_desc_o5_b3_udp_ipv6; +static int hf_pfcp_outer_hdr_desc_o5_b4_ipv4; +static int hf_pfcp_outer_hdr_desc_o5_b5_ipv6; +static int hf_pfcp_outer_hdr_desc_o5_b6_ctag; +static int hf_pfcp_outer_hdr_desc_o5_b7_stag; +static int hf_pfcp_outer_hdr_desc_o6_b0_n19; +static int hf_pfcp_outer_hdr_desc_o6_b1_n6; +static int hf_pfcp_outer_hdr_desc_o6_b2_ssm_cteid; +static int hf_pfcp_outer_hdr_desc_o6_spare; +static int hf_pfcp_outer_hdr_creation_teid; +static int hf_pfcp_outer_hdr_creation_ipv4; +static int hf_pfcp_outer_hdr_creation_ipv6; +static int hf_pfcp_outer_hdr_creation_port; +static int hf_pfcp_time_threshold; +static int hf_pfcp_forwarding_policy_id_len; +static int hf_pfcp_forwarding_policy_id; + +static int hf_pfcp_measurement_method_flags_b0_durat; +static int hf_pfcp_measurement_method_flags_b1_volume; +static int hf_pfcp_measurement_method_flags_b2_event; + +static int hf_pfcp_subsequent_time_threshold; +static int hf_pfcp_inactivity_detection_time; +static int hf_pfcp_monitoring_time; + +static int hf_pfcp_reporting_triggers_o5_b7_liusa; +static int hf_pfcp_reporting_triggers_o5_b6_droth; +static int hf_pfcp_reporting_triggers_o5_b5_stopt; +static int hf_pfcp_reporting_triggers_o5_b4_start; +static int hf_pfcp_reporting_triggers_o5_b3_quhti; +static int hf_pfcp_reporting_triggers_o5_b2_timth; +static int hf_pfcp_reporting_triggers_o5_b1_volth; +static int hf_pfcp_reporting_triggers_o5_b0_perio; +static int hf_pfcp_reporting_triggers_o6_b7_quvti; +static int hf_pfcp_reporting_triggers_o6_b6_ipmjl; +static int hf_pfcp_reporting_triggers_o6_b5_evequ; +static int hf_pfcp_reporting_triggers_o6_b4_eveth; +static int hf_pfcp_reporting_triggers_o6_b3_macar; +static int hf_pfcp_reporting_triggers_o6_b2_envcl; +static int hf_pfcp_reporting_triggers_o6_b1_timqu; +static int hf_pfcp_reporting_triggers_o6_b0_volqu; +static int hf_pfcp_reporting_triggers_o7_b1_upint; +static int hf_pfcp_reporting_triggers_o7_b0_reemr; + +static int hf_pfcp_volume_threshold_b2_dlvol; +static int hf_pfcp_volume_threshold_b1_ulvol; +static int hf_pfcp_volume_threshold_b0_tovol; +static int hf_pfcp_volume_threshold_tovol; +static int hf_pfcp_volume_threshold_ulvol; +static int hf_pfcp_volume_threshold_dlvol; + +static int hf_pfcp_volume_quota_b2_dlvol; +static int hf_pfcp_volume_quota_b1_ulvol; +static int hf_pfcp_volume_quota_b0_tovol; +static int hf_pfcp_volume_quota_tovol; +static int hf_pfcp_volume_quota_ulvol; +static int hf_pfcp_volume_quota_dlvol; + +static int hf_pfcp_subseq_volume_threshold_b2_dlvol; +static int hf_pfcp_subseq_volume_threshold_b1_ulvol; +static int hf_pfcp_subseq_volume_threshold_b0_tovol; +static int hf_pfcp_subseq_volume_threshold_tovol; +static int hf_pfcp_subseq_volume_threshold_ulvol; +static int hf_pfcp_subseq_volume_threshold_dlvol; + +static int hf_pfcp_time_quota; +static int hf_pfcp_start_time; +static int hf_pfcp_end_time; +static int hf_pfcp_quota_holding_time; +static int hf_pfcp_dropped_dl_traffic_threshold_b1_dlby; +static int hf_pfcp_dropped_dl_traffic_threshold_b0_dlpa; +static int hf_pfcp_downlink_packets; +static int hf_pfcp_bytes_downlink_data; +static int hf_pfcp_qer_correlation_id; +static int hf_pfcp_gate_status_b0b1_dlgate; +static int hf_pfcp_gate_status_b3b2_ulgate; +static int hf_pfcp_ul_mbr; +static int hf_pfcp_dl_mbr; +static int hf_pfcp_ul_gbr; +static int hf_pfcp_dl_gbr; + +static int hf_pfcp_report_type_b6_uisr; +static int hf_pfcp_report_type_b5_sesr; +static int hf_pfcp_report_type_b4_tmir; +static int hf_pfcp_report_type_b3_upir; +static int hf_pfcp_report_type_b2_erir; +static int hf_pfcp_report_type_b1_usar; +static int hf_pfcp_report_type_b0_dldr; + +static int hf_pfcp_offending_ie; +static int hf_pfcp_offending_ie_value; + +static int hf_pfcp_up_function_features_o13_b2_qmdrm; +static int hf_pfcp_up_function_features_o13_b1_cntl; +static int hf_pfcp_up_function_features_o13_b0_pdusm; +static int hf_pfcp_up_function_features_o12_b7_eml4s; +static int hf_pfcp_up_function_features_o12_b6_detnet; +static int hf_pfcp_up_function_features_o12_b5_qmcon; +static int hf_pfcp_up_function_features_o12_b4_n6jedb; +static int hf_pfcp_up_function_features_o12_b3_drtsc; +static int hf_pfcp_up_function_features_o12_b2_tscts; +static int hf_pfcp_up_function_features_o12_b1_dbdm; +static int hf_pfcp_up_function_features_o12_b0_redsm; +static int hf_pfcp_up_function_features_o11_b7_mpquic; +static int hf_pfcp_up_function_features_o11_b6_afsfc; +static int hf_pfcp_up_function_features_o11_b5_upidp; +static int hf_pfcp_up_function_features_o11_b4_ratp; +static int hf_pfcp_up_function_features_o11_b3_eppi; +static int hf_pfcp_up_function_features_o11_b2_psuprm; +static int hf_pfcp_up_function_features_o11_b1_mbsn4; +static int hf_pfcp_up_function_features_o11_b0_drqos; +static int hf_pfcp_up_function_features_o10_b7_dnsts; +static int hf_pfcp_up_function_features_o10_b6_iprep; +static int hf_pfcp_up_function_features_o10_b5_resps; +static int hf_pfcp_up_function_features_o10_b4_upber; +static int hf_pfcp_up_function_features_o10_b3_l2tp; +static int hf_pfcp_up_function_features_o10_b2_nspoc; +static int hf_pfcp_up_function_features_o10_b1_quasf; +static int hf_pfcp_up_function_features_o10_b0_rttwp; +static int hf_pfcp_up_function_features_o9_b7_rds; +static int hf_pfcp_up_function_features_o9_b6_ddds; +static int hf_pfcp_up_function_features_o9_b5_ethar; +static int hf_pfcp_up_function_features_o9_b4_ciot; +static int hf_pfcp_up_function_features_o9_b3_mt_edt; +static int hf_pfcp_up_function_features_o9_b2_gpqm; +static int hf_pfcp_up_function_features_o9_b1_qfqm; +static int hf_pfcp_up_function_features_o9_b0_atsss_ll; +static int hf_pfcp_up_function_features_o8_b7_mptcp; +static int hf_pfcp_up_function_features_o8_b6_tsn; +static int hf_pfcp_up_function_features_o8_b5_ip6pl; +static int hf_pfcp_up_function_features_o8_b4_iptv; +static int hf_pfcp_up_function_features_o8_b3_norp; +static int hf_pfcp_up_function_features_o8_b2_vtime; +static int hf_pfcp_up_function_features_o8_b1_rttl; +static int hf_pfcp_up_function_features_o8_b0_mpas; +static int hf_pfcp_up_function_features_o7_b7_gcom; +static int hf_pfcp_up_function_features_o7_b6_bundl; +static int hf_pfcp_up_function_features_o7_b5_mte_n4; +static int hf_pfcp_up_function_features_o7_b4_mnop; +static int hf_pfcp_up_function_features_o7_b3_sset; +static int hf_pfcp_up_function_features_o7_b2_ueip; +static int hf_pfcp_up_function_features_o7_b1_adpdp; +static int hf_pfcp_up_function_features_o7_b0_dpdra; +static int hf_pfcp_up_function_features_o6_b7_epfar; +static int hf_pfcp_up_function_features_o6_b6_pfde; +static int hf_pfcp_up_function_features_o6_b5_frrt; +static int hf_pfcp_up_function_features_o6_b4_trace; +static int hf_pfcp_up_function_features_o6_b3_quoac; +static int hf_pfcp_up_function_features_o6_b2_udbc; +static int hf_pfcp_up_function_features_o6_b1_pdiu; +static int hf_pfcp_up_function_features_o6_b0_empu; +static int hf_pfcp_up_function_features_o5_b7_treu; +static int hf_pfcp_up_function_features_o5_b6_heeu; +static int hf_pfcp_up_function_features_o5_b5_pfdm; +static int hf_pfcp_up_function_features_o5_b4_ftup; +static int hf_pfcp_up_function_features_o5_b3_trst; +static int hf_pfcp_up_function_features_o5_b2_dlbd; +static int hf_pfcp_up_function_features_o5_b1_ddnd; +static int hf_pfcp_up_function_features_o5_b0_bucp; + +static int hf_pfcp_sequence_number; +static int hf_pfcp_metric; +static int hf_pfcp_timer_unit; +static int hf_pfcp_timer_value; + +static int hf_pfcp_usage_report_trigger_o5_b7_immer; +static int hf_pfcp_usage_report_trigger_o5_b6_droth; +static int hf_pfcp_usage_report_trigger_o5_b5_stopt; +static int hf_pfcp_usage_report_trigger_o5_b4_start; +static int hf_pfcp_usage_report_trigger_o5_b3_quhti; +static int hf_pfcp_usage_report_trigger_o5_b2_timth; +static int hf_pfcp_usage_report_trigger_o5_b1_volth; +static int hf_pfcp_usage_report_trigger_o5_b0_perio; +static int hf_pfcp_usage_report_trigger_o6_b7_eveth; +static int hf_pfcp_usage_report_trigger_o6_b6_macar; +static int hf_pfcp_usage_report_trigger_o6_b5_envcl; +static int hf_pfcp_usage_report_trigger_o6_b4_monit; +static int hf_pfcp_usage_report_trigger_o6_b3_termr; +static int hf_pfcp_usage_report_trigger_o6_b2_liusa; +static int hf_pfcp_usage_report_trigger_o6_b1_timqu; +static int hf_pfcp_usage_report_trigger_o6_b0_volqu; +static int hf_pfcp_usage_report_trigger_o7_b5_upint; +static int hf_pfcp_usage_report_trigger_o7_b4_emrre; +static int hf_pfcp_usage_report_trigger_o7_b3_quvti; +static int hf_pfcp_usage_report_trigger_o7_b2_ipmjl; +static int hf_pfcp_usage_report_trigger_o7_b1_tebur; +static int hf_pfcp_usage_report_trigger_o7_b0_evequ; + +static int hf_pfcp_volume_measurement_b5_dlnop; +static int hf_pfcp_volume_measurement_b4_ulnop; +static int hf_pfcp_volume_measurement_b3_tonop; +static int hf_pfcp_volume_measurement_b2_dlvol; +static int hf_pfcp_volume_measurement_b1_ulvol; +static int hf_pfcp_volume_measurement_b0_tovol; +static int hf_pfcp_vol_meas_tovol; +static int hf_pfcp_vol_meas_ulvol; +static int hf_pfcp_vol_meas_dlvol; +static int hf_pfcp_vol_meas_tonop; +static int hf_pfcp_vol_meas_ulnop; +static int hf_pfcp_vol_meas_dlnop; + +static int hf_pfcp_cp_function_features_o6_b1_rpgur; +static int hf_pfcp_cp_function_features_o6_b0_psucc; +static int hf_pfcp_cp_function_features_o5_b7_uiaur; +static int hf_pfcp_cp_function_features_o5_b6_ardr; +static int hf_pfcp_cp_function_features_o5_b5_mpas; +static int hf_pfcp_cp_function_features_o5_b4_bundl; +static int hf_pfcp_cp_function_features_o5_b3_sset; +static int hf_pfcp_cp_function_features_o5_b2_epfar; +static int hf_pfcp_cp_function_features_o5_b1_ovrl; +static int hf_pfcp_cp_function_features_o5_b0_load; + +static int hf_pfcp_usage_information_b3_ube; +static int hf_pfcp_usage_information_b2_uae; +static int hf_pfcp_usage_information_b1_aft; +static int hf_pfcp_usage_information_b0_bef; + +static int hf_pfcp_application_instance_id; +static int hf_pfcp_application_instance_id_str; +static int hf_pfcp_flow_dir; +static int hf_pfcp_packet_rate_b0_ulpr; +static int hf_pfcp_packet_rate_b1_dlpr; +static int hf_pfcp_packet_rate_b2_aprc; +static int hf_pfcp_ul_time_unit; +static int hf_pfcp_max_ul_pr; +static int hf_pfcp_dl_time_unit; +static int hf_pfcp_max_dl_pr; +static int hf_pfcp_a_ul_time_unit; +static int hf_pfcp_a_max_ul_pr; +static int hf_pfcp_a_dl_time_unit; +static int hf_pfcp_a_max_dl_pr; + +static int hf_pfcp_dl_flow_level_marking_b0_ttc; +static int hf_pfcp_dl_flow_level_marking_b1_sci; + +static int hf_pfcp_sci; +static int hf_pfcp_dl_data_notification_delay; +static int hf_pfcp_packet_count; +static int hf_pfcp_dl_data_service_inf_b0_ppi; +static int hf_pfcp_dl_data_service_inf_b1_qfii; +static int hf_pfcp_ppi; + +static int hf_pfcp_pfcpsmreq_flags_b0_drobu; +static int hf_pfcp_pfcpsmreq_flags_b1_sndem; +static int hf_pfcp_pfcpsmreq_flags_b2_qaurr; +static int hf_pfcp_pfcpsmreq_flags_b3_sumpc; +static int hf_pfcp_pfcpsmreq_flags_b4_rumuc; +static int hf_pfcp_pfcpsmreq_flags_b5_deteid; + +static int hf_pfcp_pfcpsrrsp_flags_b0_drobu; + +static int hf_pfcp_pfd_contents_flags_b7_adnp; +static int hf_pfcp_pfd_contents_flags_b6_aurl; +static int hf_pfcp_pfd_contents_flags_b5_afd; +static int hf_pfcp_pfd_contents_flags_b4_dnp; +static int hf_pfcp_pfd_contents_flags_b3_cp; +static int hf_pfcp_pfd_contents_flags_b2_dn; +static int hf_pfcp_pfd_contents_flags_b1_url; +static int hf_pfcp_pfd_contents_flags_b0_fd; + +static int hf_pfcp_url_len; +static int hf_pfcp_url; +static int hf_pfcp_dn_len; +static int hf_pfcp_dn; +static int hf_pfcp_cp_len; +static int hf_pfcp_cp; +static int hf_pfcp_dnp_len; +static int hf_pfcp_dnp; +static int hf_pfcp_afd_len; +static int hf_pfcp_aurl_len; +static int hf_pfcp_adnp_len; +static int hf_pfcp_header_type; +static int hf_pfcp_hf_len; +static int hf_pfcp_hf_name; +static int hf_pfcp_hf_val_len; +static int hf_pfcp_hf_val; + +static int hf_pfcp_measurement_info_b0_mbqe; +static int hf_pfcp_measurement_info_b1_inam; +static int hf_pfcp_measurement_info_b2_radi; +static int hf_pfcp_measurement_info_b3_istm; +static int hf_pfcp_measurement_info_b4_mnop; +static int hf_pfcp_measurement_info_b5_sspoc; +static int hf_pfcp_measurement_info_b6_aspoc; +static int hf_pfcp_measurement_info_b7_ciam; + +static int hf_pfcp_node_report_type_b0_upfr; +static int hf_pfcp_node_report_type_b1_uprr; +static int hf_pfcp_node_report_type_b2_ckdr; +static int hf_pfcp_node_report_type_b3_gpqr; +static int hf_pfcp_node_report_type_b4_purr; +static int hf_pfcp_node_report_type_b5_vsr; + +static int hf_pfcp_remote_gtp_u_peer_flags_b0_v6; +static int hf_pfcp_remote_gtp_u_peer_flags_b1_v4; +static int hf_pfcp_remote_gtp_u_peer_flags_b2_di; +static int hf_pfcp_remote_gtp_u_peer_flags_b3_ni; +static int hf_pfcp_remote_gtp_u_peer_flags_b4_rts; +static int hf_pfcp_remote_gtp_u_peer_ipv4; +static int hf_pfcp_remote_gtp_u_peer_ipv6; +static int hf_pfcp_remote_gtp_u_peer_length_di; +static int hf_pfcp_remote_gtp_u_peer_length_ni; +static int hf_pfcp_remote_gtp_u_peer_time_stamp; +static int hf_pfcp_ur_seqn; + +static int hf_pfcp_oci_flags_b0_aoci; + +static int hf_pfcp_pfcp_assoc_rel_req_b0_sarr; +static int hf_pfcp_pfcp_assoc_rel_req_b1_urss; + +static int hf_pfcp_upiri_flags_b0_v4; +static int hf_pfcp_upiri_flags_b1_v6; +static int hf_pfcp_upiri_flg_b6_assosi; +static int hf_pfcp_upiri_flg_b5_assoni; +static int hf_pfcp_upiri_flg_b2b4_teidri; +static int hf_pfcp_upiri_teidri; +static int hf_pfcp_upiri_teid_range; +static int hf_pfcp_upiri_ipv4; +static int hf_pfcp_upiri_ipv6; + +static int hf_pfcp_user_plane_inactivity_timer; + +static int hf_pfcp_subsequent_volume_quota_b2_dlvol; +static int hf_pfcp_subsequent_volume_quota_b1_ulvol; +static int hf_pfcp_subsequent_volume_quota_b0_tovol; +static int hf_pfcp_subsequent_volume_quota_tovol; +static int hf_pfcp_subsequent_volume_quota_ulvol; +static int hf_pfcp_subsequent_volume_quota_dlvol; + +static int hf_pfcp_subsequent_time_quota; + +static int hf_pfcp_rqi_flag; +static int hf_pfcp_qfi; +static int hf_pfcp_query_urr_reference; +static int hf_pfcp_additional_usage_reports_information_b14_b0_number_value; +static int hf_pfcp_additional_usage_reports_information_b15_auri; +static int hf_pfcp_traffic_endpoint_id; + +static int hf_pfcp_mac_address_flags_b3_udes; +static int hf_pfcp_mac_address_flags_b2_usou; +static int hf_pfcp_mac_address_flags_b1_dest; +static int hf_pfcp_mac_address_flags_b0_sour; +static int hf_pfcp_mac_address_upper_dest_mac_address; +static int hf_pfcp_mac_address_upper_source_mac_address; +static int hf_pfcp_mac_address_dest_mac_address; +static int hf_pfcp_mac_address_source_mac_address; + +static int hf_pfcp_c_tag_flags_b2_vid; +static int hf_pfcp_c_tag_flags_b1_dei; +static int hf_pfcp_c_tag_flags_b0_pcp; +static int hf_pfcp_c_tag_cvid; +static int hf_pfcp_c_tag_dei_flag; +static int hf_pfcp_c_tag_pcp_value; + +static int hf_pfcp_s_tag_flags_b2_vid; +static int hf_pfcp_s_tag_flags_b1_dei; +static int hf_pfcp_s_tag_flags_b0_pcp; +static int hf_pfcp_s_tag_svid; +static int hf_pfcp_s_tag_dei_flag; +static int hf_pfcp_s_tag_pcp_value; + +static int hf_pfcp_ethertype; + +static int hf_pfcp_proxying_flags_b1_ins; +static int hf_pfcp_proxying_flags_b0_arp; + +static int hf_pfcp_ethertype_filter_id; + +static int hf_pfcp_ethertype_filter_properties_flags_b0_bide; + +static int hf_pfcp_suggested_buffering_packets_count_packet_count; + +static int hf_pfcp_user_id_flags_b6_peif; +static int hf_pfcp_user_id_flags_b5_gpsif; +static int hf_pfcp_user_id_flags_b4_supif; +static int hf_pfcp_user_id_flags_b3_naif; +static int hf_pfcp_user_id_flags_b2_msisdnf; +static int hf_pfcp_user_id_flags_b1_imeif; +static int hf_pfcp_user_id_flags_b0_imsif; +static int hf_pfcp_user_id_length_of_imsi; +static int hf_pfcp_user_id_length_of_imei; +static int hf_pfcp_user_id_imei; +static int hf_pfcp_user_id_length_of_msisdn; +static int hf_pfcp_user_id_length_of_nai; +static int hf_pfcp_user_id_nai; +static int hf_pfcp_user_id_length_of_supi; +static int hf_pfcp_user_id_supi; +static int hf_pfcp_user_id_length_of_gpsi; +static int hf_pfcp_user_id_gpsi; +static int hf_pfcp_user_id_length_of_pei; +static int hf_pfcp_user_id_pei; + +static int hf_pfcp_ethernet_pdu_session_information_flags_b0_ethi; + +static int hf_pfcp_mac_addresses_detected_number_of_mac_addresses; +static int hf_pfcp_mac_addresses_detected_mac_address; +static int hf_pfcp_mac_addresses_detected_length_of_ctag; +static int hf_pfcp_mac_addresses_detected_length_of_stag; + +static int hf_pfcp_mac_addresses_removed_number_of_mac_addresses; +static int hf_pfcp_mac_addresses_removed_mac_address; +static int hf_pfcp_mac_addresses_removed_length_of_ctag; +static int hf_pfcp_mac_addresses_removed_length_of_stag; + +static int hf_pfcp_ethernet_inactivity_timer; + +static int hf_pfcp_subsequent_event_quota; + +static int hf_pfcp_subsequent_event_threshold; + +static int hf_pfcp_trace_information_trace_id; +static int hf_pfcp_trace_information_length_trigger_events; +static int hf_pfcp_trace_information_trigger_events; +static int hf_pfcp_trace_information_session_trace_depth; +static int hf_pfcp_trace_information_length_list_interfaces; +static int hf_pfcp_trace_information_list_interfaces; +static int hf_pfcp_trace_information_length_ipaddress; +static int hf_pfcp_trace_information_ipv4; +static int hf_pfcp_trace_information_ipv6; + +static int hf_pfcp_framed_route; +static int hf_pfcp_framed_routing; +static int hf_pfcp_framed_ipv6_route; + +static int hf_pfcp_event_quota; + +static int hf_pfcp_event_threshold; + +static int hf_pfcp_time_stamp; + +static int hf_pfcp_averaging_window; + +static int hf_pfcp_paging_policy_indicator; + +static int hf_pfcp_apn_dnn; + +static int hf_pfcp_tgpp_interface_type; + +static int hf_pfcp_pfcpsrreq_flags_b0_psdbu; + +static int hf_pfcp_pfcpaureq_flags_b0_parps; + +static int hf_pfcp_activation_time; +static int hf_pfcp_deactivation_time; + +static int hf_pfcp_mar_id; + +static int hf_pfcp_steering_functionality; +static int hf_pfcp_steering_mode; + +static int hf_pfcp_weight; +static int hf_pfcp_priority; + +static int hf_pfcp_ue_ip_address_pool_length; +static int hf_pfcp_ue_ip_address_pool_identity; + +static int hf_pfcp_alternative_smf_ip_address_flags_ppe; +static int hf_pfcp_alternative_smf_ip_address_ipv4; +static int hf_pfcp_alternative_smf_ip_address_ipv6; + +static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b3_dcaroni; +static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b2_prin6i; +static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b1_prin19i; +static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b0_priueai; + +static int hf_pfcp_validity_time_value; +static int hf_pfcp_validity_time_str; + +static int hf_pfcp_number_of_reports; + +static int hf_pfcp_pfcpasrsp_flags_flags_b1_uupsi; +static int hf_pfcp_pfcpasrsp_flags_flags_b0_psrei; + +static int hf_pfcp_cp_pfcp_entity_ip_address_ipv4; +static int hf_pfcp_cp_pfcp_entity_ip_address_ipv6; + +static int hf_pfcp_pfcpsereq_flags_flags_b1_sumpc; +static int hf_pfcp_pfcpsereq_flags_flags_b0_resti; + +static int hf_pfcp_ip_multicast_address_flags_b3_any; +static int hf_pfcp_ip_multicast_address_flags_b2_range; +static int hf_pfcp_ip_multicast_address_start_ipv4; +static int hf_pfcp_ip_multicast_address_start_ipv6; +static int hf_pfcp_ip_multicast_address_end_ipv4; +static int hf_pfcp_ip_multicast_address_end_ipv6; + +static int hf_pfcp_source_ip_address_flags_b2_mpl; +static int hf_pfcp_source_ip_address_ipv4; +static int hf_pfcp_source_ip_address_ipv6; +static int hf_pfcp_source_ip_address_mask_prefix_lengt; + +static int hf_pfcp_packet_rate_status_flags_b2_apr; +static int hf_pfcp_packet_rate_status_flags_b1_dl; +static int hf_pfcp_packet_rate_status_flags_b0_ul; +static int hf_pfcp_packet_rate_status_ul; +static int hf_pfcp_packet_rate_status_dl; +static int hf_pfcp_packet_rate_status_apr_ul; +static int hf_pfcp_packet_rate_status_apr_dl; +static int hf_pfcp_packet_rate_status_validity_time; + +static int hf_pfcp_create_bridge_router_info_flags_b1_rii; +static int hf_pfcp_create_bridge_router_info_flags_b0_bii; + +static int hf_pfcp_port_number; + +static int hf_pfcp_nw_tt_port_number; + +static int hf_pfcp_5gs_user_plane_node_id_flags_b0_bid; +static int hf_pfcp_5gs_user_plane_node_id_value; + +static int hf_pfcp_port_management_information; + +static int hf_pfcp_requested_clock_drift_control_information_flags_b1_rrcr; +static int hf_pfcp_requested_clock_drift_control_information_flags_b0_rrto; + +static int hf_pfcp_time_domain_number_value; + +static int hf_pfcp_time_offset_threshold; + +static int hf_pfcp_cumulative_rate_ratio_threshold; + +static int hf_pfcp_time_offset_measurement; + +static int hf_pfcp_cumulative_rate_ratio_measurement; + +static int hf_pfcp_srr_id; + +static int hf_pfcp_requested_access_availability_control_information_flags_b0_rrca; + +static int hf_pfcp_availability_status; +static int hf_pfcp_availability_type; + +static int hf_pfcp_mptcp_control_information_flags_b0_tci; + +static int hf_pfcp_atsss_ll_control_information_flags_b0_lli; -static int hf_pfcp_paging_policy_indicator = -1; +static int hf_pfcp_pmf_control_information_flags_b2_pqpm; +static int hf_pfcp_pmf_control_information_flags_b1_drtti; +static int hf_pfcp_pmf_control_information_flags_b0_pmfi; +static int hf_pfcp_pmf_control_information_number_of_qfi; -static int hf_pfcp_apn_dnn = -1; +static int hf_pfcp_mptcp_address_information_flags_b1_v6; +static int hf_pfcp_mptcp_address_information_flags_b0_v4; +static int hf_pfcp_mptcp_proxy_type; +static int hf_pfcp_mptcp_proxy_port; +static int hf_pfcp_mptcp_proxy_ip_address_ipv4; +static int hf_pfcp_mptcp_proxy_ip_address_ipv6; -static int hf_pfcp_tgpp_interface_type = -1; +static int hf_pfcp_link_specific_multipath_ip_address_flags_b3_nv6; +static int hf_pfcp_link_specific_multipath_ip_address_flags_b2_nv4; +static int hf_pfcp_link_specific_multipath_ip_address_flags_b1_v6; +static int hf_pfcp_link_specific_multipath_ip_address_flags_b0_v4; +static int hf_pfcp_link_specific_multipath_ip_address_3gpp_ipv4; +static int hf_pfcp_link_specific_multipath_ip_address_3gpp_ipv6; +static int hf_pfcp_link_specific_multipath_ip_address_non3gpp_ipv4; +static int hf_pfcp_link_specific_multipath_ip_address_non3gpp_ipv6; -static int hf_pfcp_pfcpsrreq_flags = -1; -static int hf_pfcp_pfcpsrreq_flags_b0_psdbu = -1; +static int hf_pfcp_pmf_address_information_flags_b2_mac; +static int hf_pfcp_pmf_address_information_flags_b1_v6; +static int hf_pfcp_pmf_address_information_flags_b0_v4; +static int hf_pfcp_pmf_address_ipv4; +static int hf_pfcp_pmf_address_ipv6; +static int hf_pfcp_pmf_port_3gpp; +static int hf_pfcp_pmf_port_non3gpp; +static int hf_pfcp_pmf_mac_address_3gpp; +static int hf_pfcp_pmf_mac_address_non3gpp; -static int hf_pfcp_pfcpaureq_flags = -1; -static int hf_pfcp_pfcpaureq_flags_b0_parps = -1; +static int hf_pfcp_atsss_ll_information_flags_b0_lli; -static int hf_pfcp_activation_time = -1; -static int hf_pfcp_deactivation_time = -1; +static int hf_pfcp_data_network_access_identifier; -static int hf_pfcp_mar_id = -1; +static int hf_pfcp_packet_delay_milliseconds; -static int hf_pfcp_steering_functionality = -1; -static int hf_pfcp_steering_mode = -1; +static int hf_pfcp_qos_report_trigger_flags_b2_ire; +static int hf_pfcp_qos_report_trigger_flags_b1_thr; +static int hf_pfcp_qos_report_trigger_flags_b0_per; -static int hf_pfcp_weight = -1; -static int hf_pfcp_priority = -1; +static int hf_pfcp_gtp_u_path_interface_type_flags_b1_n3; +static int hf_pfcp_gtp_u_path_interface_type_flags_b0_n9; -static int hf_pfcp_ue_ip_address_pool_length = -1; -static int hf_pfcp_ue_ip_address_pool_identity = -1; +static int hf_pfcp_requested_qos_monitoring_flags_b7_ulpr; +static int hf_pfcp_requested_qos_monitoring_flags_b6_dlpr; +static int hf_pfcp_requested_qos_monitoring_flags_b5_ulci; +static int hf_pfcp_requested_qos_monitoring_flags_b4_dlci; +static int hf_pfcp_requested_qos_monitoring_flags_b3_gtpupm; +static int hf_pfcp_requested_qos_monitoring_flags_b2_rppd; +static int hf_pfcp_requested_qos_monitoring_flags_b1_ulpd; +static int hf_pfcp_requested_qos_monitoring_flags_b0_dlpd; -static int hf_pfcp_pfcp_alternative_smf_ip_address_flags = -1; -static int hf_pfcp_alternative_smf_ip_address_ipv4 = -1; -static int hf_pfcp_alternative_smf_ip_address_ipv6 = -1; +static int hf_pfcp_reporting_frequency_flags_b2_sesrl; +static int hf_pfcp_reporting_frequency_flags_b1_perio; +static int hf_pfcp_reporting_frequency_flags_b0_evett; -static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags = -1; -static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b3_dcaroni = -1; -static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b2_prin6i = -1; -static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b1_prin19i = -1; -static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b0_priueai = -1; +static int hf_pfcp_packet_delay_thresholds_flags_b2_rp; +static int hf_pfcp_packet_delay_thresholds_flags_b1_ul; +static int hf_pfcp_packet_delay_thresholds_flags_b0_dl; +static int hf_pfcp_packet_delay_thresholds_downlink; +static int hf_pfcp_packet_delay_thresholds_uplink; +static int hf_pfcp_packet_delay_thresholds_roundtrip; -static int hf_pfcp_validity_time_value = -1; +static int hf_pfcp_minimum_wait_time_seconds; -static int hf_pfcp_number_of_reports = -1; +static int hf_pfcp_qos_monitoring_measurement_flags_b5_ulci; +static int hf_pfcp_qos_monitoring_measurement_flags_b4_dlci; +static int hf_pfcp_qos_monitoring_measurement_flags_b3_plmf; +static int hf_pfcp_qos_monitoring_measurement_flags_b2_rppd; +static int hf_pfcp_qos_monitoring_measurement_flags_b1_ulpd; +static int hf_pfcp_qos_monitoring_measurement_flags_b0_dlpd; +static int hf_pfcp_qos_monitoring_measurement_downlink_packet_delay; +static int hf_pfcp_qos_monitoring_measurement_uplink_packet_delay; +static int hf_pfcp_qos_monitoring_measurement_roundtrip; +static int hf_pfcp_qos_monitoring_measurement_downlink_congestion_information; +static int hf_pfcp_qos_monitoring_measurement_uplink_congestion_information; +static int hf_pfcp_qos_monitoring_measurement_downlink_packet_rate; +static int hf_pfcp_qos_monitoring_measurement_uplink_packet_rate; -static int hf_pfcp_pfcpasrsp_flags_flags = -1; -static int hf_pfcp_pfcpasrsp_flags_flags_b1_uupsi = -1; -static int hf_pfcp_pfcpasrsp_flags_flags_b0_psrei = -1; +static int hf_pfcp_mt_edt_control_information_flags_b0_rdsi; -static int hf_pfcp_cp_pfcp_entity_ip_address_flags = -1; -static int hf_pfcp_cp_pfcp_entity_ip_address_ipv4 = -1; -static int hf_pfcp_cp_pfcp_entity_ip_address_ipv6 = -1; +static int hf_pfcp_dl_data_packets_size; -static int hf_pfcp_pfcpsereq_flags_flags = -1; -static int hf_pfcp_pfcpsereq_flags_flags_b1_sumpc = -1; -static int hf_pfcp_pfcpsereq_flags_flags_b0_resti = -1; +static int hf_pfcp_qer_control_indications_o5_b0_rcsr; -static int hf_pfcp_ip_multicast_address_flags = -1; -static int hf_pfcp_ip_multicast_address_flags_b3_any = -1; -static int hf_pfcp_ip_multicast_address_flags_b2_range = -1; -static int hf_pfcp_ip_multicast_address_start_ipv4 = -1; -static int hf_pfcp_ip_multicast_address_start_ipv6 = -1; -static int hf_pfcp_ip_multicast_address_end_ipv4 = -1; -static int hf_pfcp_ip_multicast_address_end_ipv6 = -1; +static int hf_pfcp_nf_instance_id; -static int hf_pfcp_source_ip_address_flags = -1; -static int hf_pfcp_source_ip_address_flags_b2_mpl = -1; -static int hf_pfcp_source_ip_address_ipv4 = -1; -static int hf_pfcp_source_ip_address_ipv6 = -1; -static int hf_pfcp_source_ip_address_mask_prefix_lengt = -1; +static int hf_pfcp_s_nssai_sst; +static int hf_pfcp_s_nssai_sd; + +static int hf_pfcp_ip_version_flags_b1_v6; +static int hf_pfcp_ip_version_flags_b0_v4; + +static int hf_pfcp_pfcpasreq_flags_flags_b0_uupsi; + +static int hf_pfcp_data_status_flags_b1_buff; +static int hf_pfcp_data_status_flags_b0_drop; + +static int hf_pfcp_rds_configuration_information_flags_b0_rds; + +static int hf_pfcp_multipath_application_indication_flags_b1_mqai; +static int hf_pfcp_multipath_application_indication_flags_b0_mtai; + +static int hf_pfcp_user_plane_node_management_information_container; + +static int hf_pfcp_number_of_ue_ip_addresses_b1_ipv6; +static int hf_pfcp_number_of_ue_ip_addresses_b0_ipv4; +static int hf_pfcp_number_of_ue_ip_addresses_ipv6; +static int hf_pfcp_number_of_ue_ip_addresses_ipv4; + +static int hf_pfcp_validity_timer; + +static int hf_pfcp_rattype; + +static int hf_pfcp_l2tp_user_authentication_proxy_authen_type_value; +static int hf_pfcp_l2tp_user_authentication_b3_pai; +static int hf_pfcp_l2tp_user_authentication_b2_par; +static int hf_pfcp_l2tp_user_authentication_b1_pac; +static int hf_pfcp_l2tp_user_authentication_b0_pan; +static int hf_pfcp_l2tp_user_authentication_proxy_authen_name_len; +static int hf_pfcp_l2tp_user_authentication_proxy_authen_name; +static int hf_pfcp_l2tp_user_authentication_proxy_authen_challenge_len; +static int hf_pfcp_l2tp_user_authentication_proxy_authen_challenge; +static int hf_pfcp_l2tp_user_authentication_proxy_authen_response_len; +static int hf_pfcp_l2tp_user_authentication_proxy_authen_response; +static int hf_pfcp_l2tp_user_authentication_proxy_authen_id; -static int hf_pfcp_packet_rate_status_flags = -1; -static int hf_pfcp_packet_rate_status_flags_b2_apr = -1; -static int hf_pfcp_packet_rate_status_flags_b1_dl = -1; -static int hf_pfcp_packet_rate_status_flags_b0_ul = -1; -static int hf_pfcp_packet_rate_status_ul = -1; -static int hf_pfcp_packet_rate_status_dl = -1; -static int hf_pfcp_packet_rate_status_apr_ul = -1; -static int hf_pfcp_packet_rate_status_apr_dl = -1; -static int hf_pfcp_packet_rate_status_validity_time = -1; +static int hf_pfcp_lns_address_ipv4; +static int hf_pfcp_lns_address_ipv6; -static int hf_pfcp_create_bridge_info_for_tsc_flags = -1; -static int hf_pfcp_create_bridge_info_for_tsc_flags_b0_bii = -1; +static int hf_pfcp_tunnel_preference_value; -static int hf_pfcp_ds_tt_port_number = -1; +static int hf_pfcp_calling_number_value; +static int hf_pfcp_called_number_value; -static int hf_pfcp_nw_tt_port_number = -1; +static int hf_pfcp_l2tp_session_indications_o5_b2_rensa; +static int hf_pfcp_l2tp_session_indications_o5_b1_redsa; +static int hf_pfcp_l2tp_session_indications_o5_b0_reuia; -static int hf_pfcp_5gs_user_plane_node_flags = -1; -static int hf_pfcp_5gs_user_plane_node_flags_b0_bid = -1; -static int hf_pfcp_5gs_user_plane_node_value = -1; +static int hf_pfcp_maximum_receive_unit; -static int hf_pfcp_port_management_information = -1; +static int hf_pfcp_thresholds_flags_b1_plr; +static int hf_pfcp_thresholds_flags_b0_rtt; +static int hf_pfcp_thresholds_rtt; +static int hf_pfcp_thresholds_plr; -static int hf_pfcp_requested_clock_drift_control_information_flags = -1; -static int hf_pfcp_requested_clock_drift_control_information_flags_b1_rrcr = -1; -static int hf_pfcp_requested_clock_drift_control_information_flags_b0_rrto = -1; +static int hf_pfcp_l2tp_steering_mode_indications_o5_b1_ueai; +static int hf_pfcp_l2tp_steering_mode_indications_o5_b0_albi; -static int hf_pfcp_time_domain_number_value = -1; +static int hf_pfcp_group_id; -static int hf_pfcp_time_offset_threshold = -1; +static int hf_pfcp_cp_ip_address_ipv4; +static int hf_pfcp_cp_ip_address_ipv6; -static int hf_pfcp_cumulative_rate_ratio_threshold = -1; +static int hf_pfcp_ip_address_and_port_number_replacement_flag_b0_v4; +static int hf_pfcp_ip_address_and_port_number_replacement_flag_b1_v6; +static int hf_pfcp_ip_address_and_port_number_replacement_flag_b2_dpn; +static int hf_pfcp_ip_address_and_port_number_replacement_flag_b3_sipv4; +static int hf_pfcp_ip_address_and_port_number_replacement_flag_b4_sipv6; +static int hf_pfcp_ip_address_and_port_number_replacement_flag_b5_spn; +static int hf_pfcp_ip_address_and_port_number_replacement_destination_ipv4; +static int hf_pfcp_ip_address_and_port_number_replacement_destination_ipv6; +static int hf_pfcp_ip_address_and_port_number_replacement_destination_port; +static int hf_pfcp_ip_address_and_port_number_replacement_source_ipv4; +static int hf_pfcp_ip_address_and_port_number_replacement_source_ipv6; +static int hf_pfcp_ip_address_and_port_number_replacement_source_port; -static int hf_pfcp_time_offset_measurement = -1; +static int hf_pfcp_dns_query_filter_pattern_len; +static int hf_pfcp_dns_query_filter_pattern; -static int hf_pfcp_cumulative_rate_ratio_measurement = -1; +static int hf_pfcp_event_notification_uri; -static int hf_pfcp_srr_id = -1; +static int hf_pfcp_notification_correlation_id; -static int hf_pfcp_requested_access_availability_control_information_flags = -1; -static int hf_pfcp_requested_access_availability_control_information_flags_b0_rrca = -1; +static int hf_pfcp_reporting_flags_o5_b0_dupl; -static int hf_pfcp_availability_status = -1; -static int hf_pfcp_availability_type = -1; +static int hf_pfcp_mbs_session_identifier_flag_b0_tmgi; +static int hf_pfcp_mbs_session_identifier_flag_b1_ssmi; +static int hf_pfcp_mbs_session_identifier_flag_b2_nidi; +static int hf_pfcp_mbs_session_identifier_tmgi; +static int hf_pfcp_mbs_session_identifier_nidi; +static int hf_pfcp_mbs_session_identifier_source_address_type; +static int hf_pfcp_mbs_session_identifier_source_address_length; +static int hf_pfcp_mbs_session_identifier_source_address_ipv4; +static int hf_pfcp_mbs_session_identifier_source_address_ipv6; -static int hf_pfcp_mptcp_control_information_flags = -1; -static int hf_pfcp_mptcp_control_information_flags_b0_tci = -1; +static int hf_pfcp_multicast_transport_information_endpoint_identifier; +static int hf_pfcp_multicast_transport_information_distribution_address_type; +static int hf_pfcp_multicast_transport_information_distribution_address_length; +static int hf_pfcp_multicast_transport_information_distribution_address_ipv4; +static int hf_pfcp_multicast_transport_information_distribution_address_ipv6; +static int hf_pfcp_multicast_transport_information_source_address_type; +static int hf_pfcp_multicast_transport_information_source_address_length; +static int hf_pfcp_multicast_transport_information_source_address_ipv4; +static int hf_pfcp_multicast_transport_information_source_address_ipv6; -static int hf_pfcp_atsss_ll_control_information_flags = -1; -static int hf_pfcp_atsss_ll_control_information_flags_b0_lli = -1; +static int hf_pfcp_mbsn4mbreq_flags_o5_b2_mbs_resti; +static int hf_pfcp_mbsn4mbreq_flags_o5_b1_jmbssm; +static int hf_pfcp_mbsn4mbreq_flags_o5_b0_pllssm; -static int hf_pfcp_pmf_control_information_flags = -1; -static int hf_pfcp_pmf_control_information_flags_b2_pqpm = -1; -static int hf_pfcp_pmf_control_information_flags_b1_drtti = -1; -static int hf_pfcp_pmf_control_information_flags_b0_pmfi = -1; -static int hf_pfcp_pmf_control_information_number_of_qfi = -1; +static int hf_pfcp_local_ingress_tunnel_flags_b2_ch; +static int hf_pfcp_local_ingress_tunnel_flags_b1_v6; +static int hf_pfcp_local_ingress_tunnel_flags_b0_v4; +static int hf_pfcp_local_ingress_tunnel_udp_port; +static int hf_pfcp_local_ingress_tunnel_ipv4; +static int hf_pfcp_local_ingress_tunnel_ipv6; -static int hf_pfcp_mptcp_address_information_flags = -1; -static int hf_pfcp_mptcp_address_information_flags_b1_v6 = -1; -static int hf_pfcp_mptcp_address_information_flags_b0_v4 = -1; -static int hf_pfcp_mptcp_proxy_type = -1; -static int hf_pfcp_mptcp_proxy_port = -1; -static int hf_pfcp_mptcp_proxy_ip_address_ipv4 = -1; -static int hf_pfcp_mptcp_proxy_ip_address_ipv6 = -1; +static int hf_pfcp_mbs_unicast_parameters_id; -static int hf_pfcp_ue_link_specific_ip_address_flags = -1; -static int hf_pfcp_ue_link_specific_ip_address_flags_b3_nv6 = -1; -static int hf_pfcp_ue_link_specific_ip_address_flags_b2_nv4 = -1; -static int hf_pfcp_ue_link_specific_ip_address_flags_b1_v6 = -1; -static int hf_pfcp_ue_link_specific_ip_address_flags_b0_v4 = -1; -static int hf_pfcp_ue_link_specific_ip_address_3gpp_ipv4 = -1; -static int hf_pfcp_ue_link_specific_ip_address_3gpp_ipv6 = -1; -static int hf_pfcp_ue_link_specific_ip_address_non3gpp_ipv4 = -1; -static int hf_pfcp_ue_link_specific_ip_address_non3gpp_ipv6 = -1; +static int hf_pfcp_mbsn4resp_flags_o5_b2_n19dtr; +static int hf_pfcp_mbsn4resp_flags_o5_b1_jmti; +static int hf_pfcp_mbsn4resp_flags_o5_b0_nn19dt; -static int hf_pfcp_pmf_address_information_flags = -1; -static int hf_pfcp_pmf_address_information_flags_b2_mac = -1; -static int hf_pfcp_pmf_address_information_flags_b1_v6 = -1; -static int hf_pfcp_pmf_address_information_flags_b0_v4 = -1; -static int hf_pfcp_pmf_address_ipv4 = -1; -static int hf_pfcp_pmf_address_ipv6 = -1; -static int hf_pfcp_pmf_port_3gpp = -1; -static int hf_pfcp_pmf_port_non3gpp = -1; -static int hf_pfcp_pmf_mac_address_3gpp = -1; -static int hf_pfcp_pmf_mac_address_non3gpp = -1; - -static int hf_pfcp_atsss_ll_information_flags = -1; -static int hf_pfcp_atsss_ll_information_flags_b0_lli = -1; - -static int hf_pfcp_data_network_access_identifier = -1; +static int hf_pfcp_tunnel_password_value; -static int hf_pfcp_packet_delay_milliseconds = -1; +static int hf_pfcp_area_session_id_value; -static int hf_pfcp_qos_report_trigger_flags = -1; -static int hf_pfcp_qos_report_trigger_flags_b2_ire = -1; -static int hf_pfcp_qos_report_trigger_flags_b1_thr = -1; -static int hf_pfcp_qos_report_trigger_flags_b0_per = -1; +static int hf_pfcp_dscp_to_ppi_mapping_info_ppi_value; +static int hf_pfcp_dscp_to_ppi_mapping_info_dscp_value; -static int hf_pfcp_gtp_u_path_interface_type_flags = -1; -static int hf_pfcp_gtp_u_path_interface_type_flags_b1_n3 = -1; -static int hf_pfcp_gtp_u_path_interface_type_flags_b0_n9 = -1; +static int hf_pfcp_pfcpsdrsp_flags_b0_puru; -static int hf_pfcp_requested_qos_monitoring_flags = -1; -static int hf_pfcp_requested_qos_monitoring_flags_b3_gtpupm = -1; -static int hf_pfcp_requested_qos_monitoring_flags_b2_rp = -1; -static int hf_pfcp_requested_qos_monitoring_flags_b1_ul = -1; -static int hf_pfcp_requested_qos_monitoring_flags_b0_dl = -1; +static int hf_pfcp_qer_indications_flags_b3_pdusm; +static int hf_pfcp_qer_indications_flags_b2_eml4s; +static int hf_pfcp_qer_indications_flags_b1_edbmi; +static int hf_pfcp_qer_indications_flags_b0_iqfis; -static int hf_pfcp_reporting_frequency_flags = -1; -static int hf_pfcp_reporting_frequency_flags_b2_sesrl = -1; -static int hf_pfcp_reporting_frequency_flags_b1_perio = -1; -static int hf_pfcp_reporting_frequency_flags_b0_evett = -1; +static int hf_pfcp_configured_time_domain_flags_b0_ctdi; -static int hf_pfcp_packet_delay_thresholds_flags = -1; -static int hf_pfcp_packet_delay_thresholds_flags_b2_rp = -1; -static int hf_pfcp_packet_delay_thresholds_flags_b1_ul = -1; -static int hf_pfcp_packet_delay_thresholds_flags_b0_dl = -1; -static int hf_pfcp_packet_delay_thresholds_downlink = -1; -static int hf_pfcp_packet_delay_thresholds_uplink = -1; -static int hf_pfcp_packet_delay_thresholds_roundtrip = -1; +static int hf_pfcp_metadata; +static int hf_pfcp_metadata_binary_metadata; -static int hf_pfcp_minimum_wait_time_seconds = -1; +static int hf_pfcp_traffic_parameter_threshold_flags_b0_dl; +static int hf_pfcp_traffic_parameter_threshold_downlink_n6_jitter_threshold; +static int hf_pfcp_dl_periodicity_value; -static int hf_pfcp_qos_monitoring_measurement_flags = -1; -static int hf_pfcp_qos_monitoring_measurement_flags_b3_plmf = -1; -static int hf_pfcp_qos_monitoring_measurement_flags_b2_rp = -1; -static int hf_pfcp_qos_monitoring_measurement_flags_b1_ul = -1; -static int hf_pfcp_qos_monitoring_measurement_flags_b0_dl = -1; -static int hf_pfcp_qos_monitoring_measurement_downlink = -1; -static int hf_pfcp_qos_monitoring_measurement_uplink = -1; -static int hf_pfcp_qos_monitoring_measurement_roundtrip = -1; - -static int hf_pfcp_mt_edt_control_information_flags = -1; -static int hf_pfcp_mt_edt_control_information_flags_b0_rdsi = -1; - -static int hf_pfcp_dl_data_packets_size = -1; - -static int hf_pfcp_qer_control_indications_o5_b0_rcsr = -1; - -static int hf_pfcp_nf_instance_id = -1; - -static int hf_pfcp_s_nssai_sst = -1; -static int hf_pfcp_s_nssai_sd = -1; - -static int hf_pfcp_ip_version_flags = -1; -static int hf_pfcp_ip_version_flags_b1_v6 = -1; -static int hf_pfcp_ip_version_flags_b0_v4 = -1; - -static int hf_pfcp_pfcpasreq_flags_flags = -1; -static int hf_pfcp_pfcpasreq_flags_flags_b0_uupsi = -1; - -static int hf_pfcp_data_status_flags = -1; -static int hf_pfcp_data_status_flags_b1_buff = -1; -static int hf_pfcp_data_status_flags_b0_drop = -1; - -static int hf_pfcp_rds_configuration_information_flags = -1; -static int hf_pfcp_rds_configuration_information_flags_b0_rds = -1; - -static int hf_pfcp_mptcp_application_indication_flags = -1; -static int hf_pfcp_mptcp_application_indication_flags_b0_mai = -1; - -static int hf_pfcp_user_plane_nodemanagement_information_container = -1; - -static int hf_pfcp_number_of_ue_ip_addresses_flags = -1; -static int hf_pfcp_number_of_ue_ip_addresses_b1_ipv6 = -1; -static int hf_pfcp_number_of_ue_ip_addresses_b0_ipv4 = -1; -static int hf_pfcp_number_of_ue_ip_addresses_ipv6 = -1; -static int hf_pfcp_number_of_ue_ip_addresses_ipv4 = -1; - -static int hf_pfcp_validity_timer = -1; - -static int hf_pfcp_rattype = -1; - -static int hf_pfcp_l2tp_user_authentication_proxy_authen_type_value = -1; -static int hf_pfcp_l2tp_user_authentication_flags = -1; -static int hf_pfcp_l2tp_user_authentication_b3_pai = -1; -static int hf_pfcp_l2tp_user_authentication_b2_par = -1; -static int hf_pfcp_l2tp_user_authentication_b1_pac = -1; -static int hf_pfcp_l2tp_user_authentication_b0_pan = -1; -static int hf_pfcp_l2tp_user_authentication_proxy_authen_name_len = -1; -static int hf_pfcp_l2tp_user_authentication_proxy_authen_name = -1; -static int hf_pfcp_l2tp_user_authentication_proxy_authen_challenge_len = -1; -static int hf_pfcp_l2tp_user_authentication_proxy_authen_challenge = -1; -static int hf_pfcp_l2tp_user_authentication_proxy_authen_response_len = -1; -static int hf_pfcp_l2tp_user_authentication_proxy_authen_response = -1; -static int hf_pfcp_l2tp_user_authentication_proxy_authen_id = -1; +static int hf_pfcp_n6_jitter_measurement_flags_b0_dl; +static int hf_pfcp_n6_jitter_measurement_dl_periodicity; +static int hf_pfcp_n6_jitter_measurement_lower_dl_jitter_measurement; +static int hf_pfcp_n6_jitter_measurement_higher_dl_jitter_measurement; -static int hf_pfcp_lns_address_ipv4 = -1; -static int hf_pfcp_lns_address_ipv6 = -1; -static int hf_pfcp_tunnel_preference_value = -1; - -static int hf_pfcp_calling_number_value = -1; -static int hf_pfcp_called_number_value = -1; - -static int hf_pfcp_l2tp_session_indications_o5_b2_rensa = -1; -static int hf_pfcp_l2tp_session_indications_o5_b1_redsa = -1; -static int hf_pfcp_l2tp_session_indications_o5_b0_reuia = -1; - -static int hf_pfcp_maximum_receive_unit = -1; - -static int hf_pfcp_thresholds_flags = -1; -static int hf_pfcp_thresholds_flags_b1_plr = -1; -static int hf_pfcp_thresholds_flags_b0_rtt = -1; -static int hf_pfcp_thresholds_rtt = -1; -static int hf_pfcp_thresholds_plr = -1; +static int hf_pfcp_traffic_parameter_measurement_indication_flags_b2_n6jmi; +static int hf_pfcp_traffic_parameter_measurement_indication_flags_b1_dlpmi; +static int hf_pfcp_traffic_parameter_measurement_indication_flags_b0_ulpmi; -static int hf_pfcp_l2tp_steering_mode_indications_o5_b1_ueai = -1; -static int hf_pfcp_l2tp_steering_mode_indications_o5_b0_albi = -1; +static int hf_pfcp_ul_periodicity_value; -static int hf_pfcp_group_id = -1; +static int hf_pfcp_mpquic_control_information_flags_b0_cupd; -static int hf_pfcp_cp_ip_address_flags = -1; -static int hf_pfcp_cp_ip_address_ipv4 = -1; -static int hf_pfcp_cp_ip_address_ipv6 = -1; +static int hf_pfcp_mpquic_address_information_flags_b1_v6; +static int hf_pfcp_mpquic_address_information_flags_b0_v4; +static int hf_pfcp_mpquic_address_information_type; +static int hf_pfcp_mpquic_address_information_port; +static int hf_pfcp_mpquic_address_information_address_ipv4; +static int hf_pfcp_mpquic_address_information_address_ipv6; -static int hf_pfcp_ip_address_and_port_number_replacement_flags = -1; -static int hf_pfcp_ip_address_and_port_number_replacement_flag_b0_v4 = -1; -static int hf_pfcp_ip_address_and_port_number_replacement_flag_b1_v6 = -1; -static int hf_pfcp_ip_address_and_port_number_replacement_flag_b2_dpn = -1; -static int hf_pfcp_ip_address_and_port_number_replacement_flag_b3_sipv4 = -1; -static int hf_pfcp_ip_address_and_port_number_replacement_flag_b4_sipv6 = -1; -static int hf_pfcp_ip_address_and_port_number_replacement_flag_b5_spn = -1; -static int hf_pfcp_ip_address_and_port_number_replacement_destination_ipv4 = -1; -static int hf_pfcp_ip_address_and_port_number_replacement_destination_ipv6 = -1; -static int hf_pfcp_ip_address_and_port_number_replacement_destination_port = -1; -static int hf_pfcp_ip_address_and_port_number_replacement_source_ipv4 = -1; -static int hf_pfcp_ip_address_and_port_number_replacement_source_ipv6 = -1; -static int hf_pfcp_ip_address_and_port_number_replacement_source_port = -1; +static int hf_pfcp_transport_mode_value; -static int hf_pfcp_dns_query_filter_pattern_len = -1; -static int hf_pfcp_dns_query_filter_pattern = -1; +static int hf_pfcp_protocol_description_flags_b2_srtp; +static int hf_pfcp_protocol_description_flags_b1_rtp; +static int hf_pfcp_protocol_description_flags_b0_h264; -static int hf_pfcp_event_notification_uri = -1; +static int hf_pfcp_reporting_suggestion_info_reporting_urgency_value; +static int hf_pfcp_reporting_suggestion_info_reporting_time_info; -static int hf_pfcp_notification_correlation_id = -1; +static int hf_pfcp_tl_container; -static int hf_pfcp_reporting_flags_o5_b0_dupl = -1; +static int hf_pfcp_measurement_indication_flags_b0_dqfi; -static int hf_pfcp_mbs_session_identifier_flags = -1; -static int hf_pfcp_mbs_session_identifier_flag_b0_tmgi = -1; -static int hf_pfcp_mbs_session_identifier_flag_b1_ssmi = -1; -static int hf_pfcp_mbs_session_identifier_tmgi = -1; -static int hf_pfcp_mbs_session_identifier_ssmi = -1; - -static int hf_pfcp_multicast_transport_information_endpoint_identifier = -1; -static int hf_pfcp_multicast_transport_information_distribution_address_type = -1; -static int hf_pfcp_multicast_transport_information_distribution_address_length = -1; -static int hf_pfcp_multicast_transport_information_distribution_address_ipv4 = -1; -static int hf_pfcp_multicast_transport_information_distribution_address_ipv6 = -1; -static int hf_pfcp_multicast_transport_information_source_address_type = -1; -static int hf_pfcp_multicast_transport_information_source_address_length = -1; -static int hf_pfcp_multicast_transport_information_source_address_ipv4 = -1; -static int hf_pfcp_multicast_transport_information_source_address_ipv6 = -1; - -static int hf_pfcp_mbsn4mbreq_flags_o5_b1_jmbssm = -1; -static int hf_pfcp_mbsn4mbreq_flags_o5_b0_pllssm = -1; - -static int hf_pfcp_local_ingress_tunnel_flags = -1; -static int hf_pfcp_local_ingress_tunnel_flags_b2_ch = -1; -static int hf_pfcp_local_ingress_tunnel_flags_b1_v6 = -1; -static int hf_pfcp_local_ingress_tunnel_flags_b0_v4 = -1; -static int hf_pfcp_local_ingress_tunnel_udp_port = -1; -static int hf_pfcp_local_ingress_tunnel_ipv4 = -1; -static int hf_pfcp_local_ingress_tunnel_ipv6 = -1; - -static int hf_pfcp_mbs_unicast_parameters_id = -1; +static int hf_pfcp_hplmn_s_nssai_sst; +static int hf_pfcp_hplmn_s_nssai_sd; + +static int hf_pfcp_media_transport_protocol; + +static int hf_pfcp_rtp_header_extension_type; + +static int hf_pfcp_rtp_header_extension_id; + +static int hf_pfcp_rtp_payload_type; + +static int hf_pfcp_rtp_payload_format; /* Enterprise IEs */ /* BBF */ -static int hf_pfcp_bbf_up_function_features_o7_b4_lcp_keepalive_offload = -1; -static int hf_pfcp_bbf_up_function_features_o7_b3_lns = -1; -static int hf_pfcp_bbf_up_function_features_o7_b2_lac = -1; -static int hf_pfcp_bbf_up_function_features_o7_b1_ipoe = -1; -static int hf_pfcp_bbf_up_function_features_o7_b0_pppoe = -1; +static int hf_pfcp_bbf_up_function_features_o7_b7_nat_up; +static int hf_pfcp_bbf_up_function_features_o7_b6_nat_cp; +static int hf_pfcp_bbf_up_function_features_o7_b5_iptv; +static int hf_pfcp_bbf_up_function_features_o7_b4_lcp_keepalive_offload; +static int hf_pfcp_bbf_up_function_features_o7_b3_lns; +static int hf_pfcp_bbf_up_function_features_o7_b2_lac; +static int hf_pfcp_bbf_up_function_features_o7_b1_ipoe; +static int hf_pfcp_bbf_up_function_features_o7_b0_pppoe; -static int hf_pfcp_bbf_logical_port_id = -1; -static int hf_pfcp_bbf_logical_port_id_str = -1; +static int hf_pfcp_bbf_logical_port_id; +static int hf_pfcp_bbf_logical_port_id_str; -static int hf_pfcp_bbf_outer_hdr_desc = -1; -static int hf_pfcp_bbf_outer_hdr_creation_tunnel_id = -1; -static int hf_pfcp_bbf_outer_hdr_creation_session_id = -1; +static int hf_pfcp_bbf_outer_hdr_desc; +static int hf_pfcp_bbf_outer_hdr_creation_tunnel_id; +static int hf_pfcp_bbf_outer_hdr_creation_session_id; -static int hf_pfcp_bbf_out_hdr_desc = -1; +static int hf_pfcp_bbf_out_hdr_desc; -static int hf_pfcp_bbf_pppoe_session_id = -1; +static int hf_pfcp_bbf_pppoe_session_id; -static int hf_pfcp_bbf_ppp_protocol_flags = -1; -static int hf_pfcp_bbf_ppp_protocol_b2_control = -1; -static int hf_pfcp_bbf_ppp_protocol_b1_data = -1; -static int hf_pfcp_bbf_ppp_protocol_b0_specific = -1; -static int hf_pfcp_bbf_ppp_protocol = -1; +static int hf_pfcp_bbf_ppp_protocol_flags; +static int hf_pfcp_bbf_ppp_protocol_b2_control; +static int hf_pfcp_bbf_ppp_protocol_b1_data; +static int hf_pfcp_bbf_ppp_protocol_b0_specific; +static int hf_pfcp_bbf_ppp_protocol; -static int hf_pfcp_bbf_verification_timer_interval = -1; -static int hf_pfcp_bbf_verification_timer_count = -1; +static int hf_pfcp_bbf_verification_timer_interval; +static int hf_pfcp_bbf_verification_timer_count; -static int hf_pfcp_bbf_ppp_lcp_magic_number_tx = -1; -static int hf_pfcp_bbf_ppp_lcp_magic_number_rx = -1; +static int hf_pfcp_bbf_ppp_lcp_magic_number_tx; +static int hf_pfcp_bbf_ppp_lcp_magic_number_rx; -static int hf_pfcp_bbf_mtu = -1; +static int hf_pfcp_bbf_mtu; -static int hf_pfcp_bbf_l2tp_endp_flags = -1; -static int hf_pfcp_bbf_l2tp_endp_flags_b2_ch = -1; -static int hf_pfcp_bbf_l2tp_endp_flags_b1_v6 = -1; -static int hf_pfcp_bbf_l2tp_endp_flags_b0_v4 = -1; -static int hf_pfcp_bbf_l2tp_endp_id_tunnel_id = -1; -static int hf_pfcp_bbf_l2tp_endp_id_ipv4 = -1; -static int hf_pfcp_bbf_l2tp_endp_id_ipv6 = -1; +static int hf_pfcp_bbf_l2tp_endp_flags; +static int hf_pfcp_bbf_l2tp_endp_flags_b2_ch; +static int hf_pfcp_bbf_l2tp_endp_flags_b1_v6; +static int hf_pfcp_bbf_l2tp_endp_flags_b0_v4; +static int hf_pfcp_bbf_l2tp_endp_id_tunnel_id; +static int hf_pfcp_bbf_l2tp_endp_id_ipv4; +static int hf_pfcp_bbf_l2tp_endp_id_ipv6; -static int hf_pfcp_bbf_l2tp_session_id = -1; +static int hf_pfcp_bbf_l2tp_session_id; -static int hf_pfcp_bbf_l2tp_type_flags = -1; -static int hf_pfcp_bbf_l2tp_type_flags_b0_t = -1; +static int hf_pfcp_bbf_l2tp_type_flags; +static int hf_pfcp_bbf_l2tp_type_flags_b0_t; -/* Travelping */ -static int hf_pfcp_travelping_build_id = -1; -static int hf_pfcp_travelping_build_id_str = -1; -static int hf_pfcp_travelping_now = -1; -static int hf_pfcp_travelping_error_message = -1; -static int hf_pfcp_travelping_error_message_str = -1; -static int hf_pfcp_travelping_file_name = -1; -static int hf_pfcp_travelping_file_name_str = -1; -static int hf_pfcp_travelping_line_number = -1; - -static int ett_pfcp = -1; -static int ett_pfcp_flags = -1; -static int ett_pfcp_ie = -1; -static int ett_pfcp_grouped_ie = -1; -static int ett_pfcp_f_seid_flags = -1; -static int ett_f_teid_flags = -1; -static int ett_pfcp_ue_ip_address_flags = -1; -static int ett_pfcp_sdf_filter_flags = -1; -static int ett_pfcp_measurement_method_flags = -1; -static int ett_pfcp_reporting_triggers = -1; -static int ett_pfcp_volume_threshold = -1; -static int ett_pfcp_volume_quota = -1; -static int ett_pfcp_subseq_volume_threshold = -1; -static int ett_pfcp_dropped_dl_traffic_threshold = -1; -static int ett_pfcp_gate_status = -1; -static int ett_pfcp_report_type = -1; -static int ett_pfcp_up_function_features = -1; -static int ett_pfcp_report_trigger = -1; -static int ett_pfcp_volume_measurement = -1; -static int ett_pfcp_usage_information = -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_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_pfcp_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_sdf_filter_id = -1; -static int ett_pfcp_subsequent_volume_quota = -1; -static int ett_pfcp_additional_usage_reports_information = -1; -static int ett_pfcp_mac_address = -1; -static int ett_pfcp_c_tag = -1; -static int ett_pfcp_s_tag = -1; -static int ett_pfcp_proxying = -1; -static int ett_pfcp_ethernet_filter_properties = -1; -static int ett_pfcp_user_id = -1; -static int ett_pfcp_ethernet_pdu_session_information = -1; -static int ett_pfcp_adf = -1; -static int ett_pfcp_aurl = -1; -static int ett_pfcp_adnp = -1; -static int ett_pfcp_pfcpsrreq = -1; -static int ett_pfcp_pfcpaureq = -1; -static int ett_pfcp_alternative_smf_ip_address_flags = -1; -static int ett_pfcp_packet_replication_and_detection_carry_on_information = -1; -static int ett_pfcp_pfcpasrsp_flags = -1; -static int ett_pfcp_cp_pfcp_entity_ip_address_flags = -1; -static int ett_pfcp_pfcpsereq_flags = -1; -static int ett_pfcp_ip_multicast_address_flags = -1; -static int ett_pfcp_source_ip_address_flags = -1; -static int ett_pfcp_packet_rate_status = -1; -static int ett_pfcp_create_bridge_info_for_tsc = -1; -static int ett_pfcp_5gs_user_plane_node = -1; -static int ett_pfcp_requested_clock_drift_control_information = -1; -static int ett_pfcp_requested_access_availability_control_information = -1; -static int ett_pfcp_mptcp_control_information = -1; -static int ett_pfcp_atsss_ll_control_information = -1; -static int ett_pfcp_pmf_control_information = -1; -static int ett_pfcp_mptcp_entity_ip_address_information = -1; -static int ett_pfcp_ue_link_specific_entity_ip_address = -1; -static int ett_pfcp_pmf_address_information = -1; -static int ett_pfcp_atsss_ll_information = -1; -static int ett_pfcp_qos_report_trigger = -1; -static int ett_pfcp_gtp_u_path_interface_type = -1; -static int ett_pfcp_requested_qos_monitoring = -1; -static int ett_pfcp_reporting_frequency = -1; -static int ett_pfcp_packet_delay_thresholds = -1; -static int ett_pfcp_qos_monitoring_measurement = -1; -static int ett_pfcp_monitoring_measurement = -1; -static int ett_pfcp_ip_version = -1; -static int ett_pfcp_pfcpasreq_flags = -1; -static int ett_pfcp_data_status_flags = -1; -static int ett_pfcp_rds_configuration_information_flags = -1; -static int ett_pfcp_number_of_ue_ip_addresses_flags = -1; -static int ett_pfcp_l2tp_user_authentication_flags = -1; -static int ett_pfcp_thresholds = -1; -static int ett_pfcp_cp_ip_address_flags = -1; -static int ett_pfcp_ip_address_and_port_number_replacement_flags = -1; -static int ett_pfcp_mbs_session_identifier_flags = -1; -static int ett_local_ingress_tunnel_flags = -1; - -static int ett_pfcp_enterprise_travelping_error_report = -1; - -static int ett_pfcp_bbf_ppp_protocol_flags = -1; -static int ett_pfcp_bbf_l2tp_endp_flags = -1; -static int ett_pfcp_bbf_l2tp_type_flags = -1; -static int ett_pfcp_bbf_ppp_lcp_connectivity = -1; -static int ett_pfcp_bbf_l2tp_tunnel = -1; - -static expert_field ei_pfcp_ie_reserved = EI_INIT; -static expert_field ei_pfcp_ie_data_not_decoded = EI_INIT; -static expert_field ei_pfcp_ie_not_decoded_null = EI_INIT; -static expert_field ei_pfcp_ie_not_decoded_too_large = EI_INIT; -static expert_field ei_pfcp_enterprise_ie_3gpp = EI_INIT; -static expert_field ei_pfcp_ie_encoding_error = EI_INIT; +static int hf_pfcp_bbf_multicast_flags_o7_b1_routeralertoff; +static int hf_pfcp_bbf_multicast_flags_o7_b0_fastleave; + +static int hf_pfcp_bbf_multicast_query_param_robustness; +static int hf_pfcp_bbf_multicast_query_param_query_interval; +static int hf_pfcp_bbf_multicast_query_param_query_response_interval; +static int hf_pfcp_bbf_multicast_query_param_group_query_interval; + +static int hf_pfcp_bbf_multicast_group_limit_max_joins; + +static int hf_pfcp_bbf_apply_action_flags_b0_nat; + +static int hf_pfcp_bbf_nat_external_port_range_start; +static int hf_pfcp_bbf_nat_external_port_range_end; + +static int hf_pfcp_bbf_nat_port_forward; +static int hf_pfcp_bbf_nat_port_forward_inside_ip; +static int hf_pfcp_bbf_nat_port_forward_inside_port; +static int hf_pfcp_bbf_nat_port_forward_outside_port; +static int hf_pfcp_bbf_nat_port_forward_protocol; + +static int hf_pfcp_bbf_reporting_trigger; +static int hf_pfcp_bbf_dynamic_nat_block_port_range_start_port; +static int hf_pfcp_bbf_dynamic_nat_block_port_range_end_port; + +static int hf_pfcp_bbf_event_time_stamp; + +/* Travelping */ +static int hf_pfcp_enterprise_travelping_packet_measurement; +static int hf_pfcp_enterprise_travelping_packet_measurement_b2_dlnop; +static int hf_pfcp_enterprise_travelping_packet_measurement_b1_ulnop; +static int hf_pfcp_enterprise_travelping_packet_measurement_b0_tonop; +static int hf_pfcp_travelping_pkt_meas_tonop; +static int hf_pfcp_travelping_pkt_meas_ulnop; +static int hf_pfcp_travelping_pkt_meas_dlnop; + +static int hf_pfcp_travelping_build_id; +static int hf_pfcp_travelping_build_id_str; +static int hf_pfcp_travelping_now; +static int hf_pfcp_travelping_error_message; +static int hf_pfcp_travelping_error_message_str; +static int hf_pfcp_travelping_file_name; +static int hf_pfcp_travelping_file_name_str; +static int hf_pfcp_travelping_line_number; +static int hf_pfcp_travelping_ipfix_policy; +static int hf_pfcp_travelping_ipfix_policy_str; +static int hf_pfcp_travelping_trace_parent; +static int hf_pfcp_travelping_trace_parent_str; +static int hf_pfcp_travelping_trace_state; +static int hf_pfcp_travelping_trace_state_str; + +/* Nokia */ + +static int hf_pfcp_nokia_sap_template; +static int hf_pfcp_nokia_group_iface_template; +static int hf_pfcp_nokia_session_state_id; +static int hf_pfcp_nokia_detailed_stats_key; +static int hf_pfcp_nokia_detailed_stats_key_direction; +static int hf_pfcp_nokia_detailed_stats_key_object_id; +static int hf_pfcp_nokia_detailed_stats_key_stat_mode; +static int hf_pfcp_nokia_detailed_stats_key_type; +static int hf_pfcp_nokia_detailed_stats_bitmap_item; +static int hf_pfcp_nokia_detailed_stats_octets; +static int hf_pfcp_nokia_detailed_error; +static int hf_pfcp_nokia_qos_override; +static int hf_pfcp_nokia_measurement_info; +static int hf_pfcp_nokia_measurement_info_b0_det; +static int hf_pfcp_nokia_pfcpsmreq_flags; +static int hf_pfcp_nokia_pfcpsmreq_flags_b0_abs; +static int hf_pfcp_nokia_pfcpsmreq_flags_b1_audit; +static int hf_pfcp_nokia_up_function_features_bulk_audit; +static int hf_pfcp_nokia_up_function_features_sssg; +static int hf_pfcp_nokia_filter_override_type; +static int hf_pfcp_nokia_filter_override_name; +static int hf_pfcp_nokia_intermediate_destination; +static int hf_pfcp_nokia_nat_isa_members; +static int hf_pfcp_nokia_pfcphb_flags; +static int hf_pfcp_nokia_pfcphb_flags_b0_aud_r; +static int hf_pfcp_nokia_pfcphb_flags_b1_aud_s; +static int hf_pfcp_nokia_pfcphb_flags_b2_aud_e; +static int hf_pfcp_nokia_l2tp_lcp_request; +static int hf_pfcp_nokia_l2tp_auth_type; +static int hf_pfcp_nokia_l2tp_auth_name; +static int hf_pfcp_nokia_l2tp_auth_id; +static int hf_pfcp_nokia_l2tp_auth_challenge; +static int hf_pfcp_nokia_l2tp_auth_response; +static int hf_pfcp_nokia_l2tp_tunnel_endpoint_ipv4_address; +static int hf_pfcp_nokia_l2tp_tunnel_endpoint_ipv6_address; +static int hf_pfcp_nokia_l2tp_client_auth_id; +static int hf_pfcp_nokia_l2tp_server_auth_id; +static int hf_pfcp_nokia_l2tp_password; +static int hf_pfcp_nokia_l2tp_assignment_id; +static int hf_pfcp_nokia_l2tp_private_group_id; +static int hf_pfcp_nokia_l2tp_tunnel_params_flags; +static int hf_pfcp_nokia_l2tp_params_flags_b31_hello_interval; +static int hf_pfcp_nokia_l2tp_params_flags_b30_idle_timeout; +static int hf_pfcp_nokia_l2tp_params_flags_b29_session_limit; +static int hf_pfcp_nokia_l2tp_params_flags_b28_preference; +static int hf_pfcp_nokia_l2tp_params_flags_b27_df_bit; +static int hf_pfcp_nokia_l2tp_params_flags_b26_challenge; +static int hf_pfcp_nokia_l2tp_params_flags_b25_avp_hiding; +static int hf_pfcp_nokia_l2tp_params_flags_b24_algorithm; +static int hf_pfcp_nokia_l2tp_params_flags_b19_rx_window_size; +static int hf_pfcp_nokia_l2tp_params_flags_b18_max_retries_not_estab; +static int hf_pfcp_nokia_l2tp_params_flags_b17_max_retries_estab; +static int hf_pfcp_nokia_l2tp_params_flags_b16_destruct_timeout; +static int hf_pfcp_nokia_l2tp_params_hello_interval; +static int hf_pfcp_nokia_l2tp_params_idle_timeout; +static int hf_pfcp_nokia_l2tp_params_session_limit; +static int hf_pfcp_nokia_l2tp_params_preference; +static int hf_pfcp_nokia_l2tp_params_df_bit; +static int hf_pfcp_nokia_l2tp_params_challenge; +static int hf_pfcp_nokia_l2tp_params_avp_hiding; +static int hf_pfcp_nokia_l2tp_params_algorithm; +static int hf_pfcp_nokia_l2tp_params_rx_window_size; +static int hf_pfcp_nokia_l2tp_params_max_retries_not_estab; +static int hf_pfcp_nokia_l2tp_params_max_retries_estab; +static int hf_pfcp_nokia_l2tp_params_destruct_timeout; +static int hf_pfcp_nokia_l2tp_local_tunnel_id; +static int hf_pfcp_nokia_l2tp_remote_tunnel_id; +static int hf_pfcp_nokia_l2tp_local_session_id; +static int hf_pfcp_nokia_l2tp_remote_session_id; +static int hf_pfcp_nokia_l2tp_call_serial_num; +static int hf_pfcp_nokia_snat_inside_ipv4_address; +static int hf_pfcp_nokia_access_line_circuit_id; +static int hf_pfcp_nokia_access_line_remote_id; +static int hf_pfcp_nokia_access_line_params_flags; +static int hf_pfcp_nokia_access_line_params_flags_b24_act_up; +static int hf_pfcp_nokia_access_line_params_flags_b25_act_down; +static int hf_pfcp_nokia_access_line_params_flags_b26_min_up; +static int hf_pfcp_nokia_access_line_params_flags_b27_min_down; +static int hf_pfcp_nokia_access_line_params_flags_b28_att_up; +static int hf_pfcp_nokia_access_line_params_flags_b29_att_down; +static int hf_pfcp_nokia_access_line_params_flags_b30_max_up; +static int hf_pfcp_nokia_access_line_params_flags_b31_max_down; +static int hf_pfcp_nokia_access_line_params_flags_b16_min_up_lp; +static int hf_pfcp_nokia_access_line_params_flags_b17_min_down_lp; +static int hf_pfcp_nokia_access_line_params_flags_b18_max_inter_delay_up; +static int hf_pfcp_nokia_access_line_params_flags_b19_act_inter_delay_up; +static int hf_pfcp_nokia_access_line_params_flags_b20_max_inter_delay_down; +static int hf_pfcp_nokia_access_line_params_flags_b21_act_inter_delay_down; +static int hf_pfcp_nokia_access_line_params_flags_b22_access_loop_encap; +static int hf_pfcp_nokia_access_line_params_flags_b23_iw_session; +static int hf_pfcp_nokia_access_line_params_act_up; +static int hf_pfcp_nokia_access_line_params_act_down; +static int hf_pfcp_nokia_access_line_params_min_up; +static int hf_pfcp_nokia_access_line_params_min_down; +static int hf_pfcp_nokia_access_line_params_att_up; +static int hf_pfcp_nokia_access_line_params_att_down; +static int hf_pfcp_nokia_access_line_params_max_up; +static int hf_pfcp_nokia_access_line_params_max_down; +static int hf_pfcp_nokia_access_line_params_min_up_lp; +static int hf_pfcp_nokia_access_line_params_min_down_lp; +static int hf_pfcp_nokia_access_line_params_max_inter_delay_up; +static int hf_pfcp_nokia_access_line_params_act_inter_delay_up; +static int hf_pfcp_nokia_access_line_params_max_inter_delay_down; +static int hf_pfcp_nokia_access_line_params_act_inter_delay_down; +static int hf_pfcp_nokia_access_line_params_access_loop_encap; +static int hf_pfcp_nokia_acct_session_id; +static int hf_pfcp_nokia_fsg_template_name; + + +static int ett_pfcp; +static int ett_pfcp_flags; +static int ett_pfcp_ie; +static int ett_pfcp_unknown_enterprise_ie; +static int ett_pfcp_grouped_ie; +static int ett_pfcp_reporting_triggers; +static int ett_pfcp_up_function_features; +static int ett_pfcp_report_trigger; +static int ett_pfcp_flow_desc; +static int ett_pfcp_tos; +static int ett_pfcp_spi; +static int ett_pfcp_flow_label; +static int ett_pfcp_sdf_filter_id; +static int ett_pfcp_adf; +static int ett_pfcp_aurl; +static int ett_pfcp_adnp; + +static int ett_pfcp_enterprise_travelping_packet_measurement; +static int ett_pfcp_enterprise_travelping_error_report; +static int ett_pfcp_enterprise_travelping_created_nat_binding; +static int ett_pfcp_enterprise_travelping_trace_info; + +static int ett_pfcp_bbf_ppp_protocol_flags; +static int ett_pfcp_bbf_l2tp_endp_flags; +static int ett_pfcp_bbf_l2tp_type_flags; +static int ett_pfcp_bbf_ppp_lcp_connectivity; +static int ett_pfcp_bbf_l2tp_tunnel; +static int ett_pfcp_bbf_nat_port_forward_list; + +static int ett_pfcp_nokia_detailed_stats_key; +static int ett_pfcp_nokia_detailed_stats_bitmap; +static int ett_pfcp_nokia_measurement_info; +static int ett_pfcp_nokia_pfcpsmreq_flags; +static int ett_pfcp_nokia_pfcphb_flags; +static int ett_pfcp_nokia_l2tp_tunnel_params_flags; +static int ett_pfcp_nokia_access_line_params_flags; + +static expert_field ei_pfcp_ie_reserved; +static expert_field ei_pfcp_ie_data_not_decoded; +static expert_field ei_pfcp_ie_not_decoded_null; +static expert_field ei_pfcp_ie_not_decoded_too_large; +static expert_field ei_pfcp_ie_encoding_error; + +static int pfcp_tap = -1; static gboolean g_pfcp_session = FALSE; static guint32 pfcp_session_count; @@ -1135,17 +1295,18 @@ typedef struct pfcp_session_args { typedef struct _pfcp_hdr { guint8 message; /* Message type */ guint16 length; /* Length of header */ - gint64 seid; /* Tunnel End-point ID */ + guint64 seid; /* Session End-point ID */ } pfcp_hdr_t; /* Relation between frame -> session */ GHashTable* pfcp_session_table; /* Relation between <seid,ip> -> frame */ -wmem_tree_t* pfcp_frame_tree; +wmem_map_t* pfcp_frame_map; + typedef struct pfcp_info { guint64 seid; - guint32 frame; + address addr; } pfcp_info_t; typedef struct _pfcp_sub_dis_t { @@ -1155,106 +1316,8 @@ typedef struct _pfcp_sub_dis_t { static dissector_table_t pfcp_enterprise_ies_dissector_table; -static void dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint offset, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_create_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_pdi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_create_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_forwarding_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_duplicating_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_create_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_create_qer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_created_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_update_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_update_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_upd_forwarding_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_update_bar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_update_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_update_qer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_remove_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_remove_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_remove_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_remove_qer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_load_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_overload_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_application_ids_pfds(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_pfd_context(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_application_detection_inf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_pfcp_query_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_usage_report_smr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_usage_report_sdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_usage_report_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_downlink_data_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_create_bar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_update_bar_smr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_remove_bar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_error_indication_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_user_plane_path_failure_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_update_duplicating_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_aggregated_urrs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_create_traffic_endpoint(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_created_traffic_endpoint(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_update_traffic_endpoint(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_remove_traffic_endpoint(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_ethernet_packet_filter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_ethernet_traffic_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_additional_monitoring_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_create_mar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_update_mar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_remove_mar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_access_forwarding_action_information_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_access_forwarding_action_information_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_update_access_forwarding_action_information_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_update_access_forwarding_action_information_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_user_plane_path_recovery_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_pfcp_session_retention_information_within_pfcp_association_setup_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_ip_multicast_addressing_info_within_pfcp_session_establishment_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_join_ip_multicast_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_leave_ip_multicast_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_created_bridge_info_for_tsc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_tsc_management_information_ie_within_pfcp_session_report_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_clock_drift_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_clock_drift_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_remove_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_create_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_update_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_session_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_access_availability_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_access_availability_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_provide_atsss_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_atsss_control_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_mptcp_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_atsss_ll_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_pmf_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_ue_ip_address_pool_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_gtp_u_path_qos_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_gtp_u_path_qos_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_qos_information_in_gtp_u_path_qos_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_qos_monitoring_per_qos_flow_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_qos_monitoring_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_packet_rate_status_report_ie_within_pfcp_session_deletion_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_ethernet_context_information_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_redundant_transmission_detection_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_updated_pdr_ie_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_provide_rds_configuration_information_ie_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_query_packet_rate_status_ie_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_query_packet_rate_status_report_ie_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_ue_ip_address_usage_information_ie_within_pfcp_association_update_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_redundant_transmission_forward_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_transport_dealy_reporting_ie_in_create_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_partial_failure_information_within_pfcp_session_establishment_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_partial_failure_information_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_l2tp_tunnel_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_pfcp_session_change_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_direct_reporting_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_mbs_session_n4mb_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_mbs_multicast_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_add_mbs_unicast_parameters_ie_in_create_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_mbs_session_n4mb_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); -static void dissect_pfcp_remove_mbs_unicast_parameters_ie_in_update_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_); +static void +dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint offset, guint16 length, guint8 message_type, pfcp_session_args_t *args); static const true_false_string pfcp_id_predef_dynamic_tfs = { "Predefined by UP", @@ -1430,7 +1493,10 @@ static value_string_ext pfcp_message_type_ext = VALUE_STRING_EXT_INIT(pfcp_messa #define PFCP_IE_ADD_MBS_UNICAST_PARAMETERS_IE_IN_CREATE_FAR 302 #define PFCP_IE_MBS_SESSION_N4MB_INFORMATION 300 #define PFCP_IE_REMOVE_MBS_UNICAST_PARAMETERS_IE_IN_UPDATE_FAR 304 - +#define PFCP_IE_MBS_SESSION_N4_CONTROl_INFORMATION_IE_WITHIN_PFCP_SESSION_ESTABLISHMENT_REQUEST 310 +#define PFCP_IE_MBS_SESSION_N4_CONTROl_INFORMATION_IE_WITHIN_PFCP_SESSION_ESTABLISHMENT_RESPONSE 311 +#define PFCP_IE_PEER_UP_REPORT_IE_WITING_PFCP_NODE_REPORT_REQUEST 315 +#define PFCP_IE_DSCP_TO_PPI_CONTROL_INFORMATION_IE_WITIN_PCFP_SESSION_ESTABLISHMENT_REQUEST 316 static const value_string pfcp_ie_type[] = { @@ -1623,9 +1689,9 @@ static const value_string pfcp_ie_type[] = { { 191, "IP Multicast Address"}, /* Extendable / Clause 8.2.137 */ { 192, "Source IP Address"}, /* Extendable / Clause 8.2.138 */ { 193, "Packet Rate Status"}, /* Extendable / Clause 8.2.139 */ - { 194, "Create Bridge Info for TSC"}, /* Extendable / Clause 8.2.140 */ - { 195, "Created Bridge Info for TSC"}, /* Extendable / Table 7.5.3.6-1 */ - { 196, "DS-TT Port Number"}, /* Fixed Length / Clause 8.2.141 */ + { 194, "Create Bridge/Router Info"}, /* Extendable / Clause 8.2.140 */ + { 195, "Created Bridge/Router Info"}, /* Extendable / Table 7.5.3.6-1 */ + { 196, "Port Number"}, /* Fixed Length / Clause 8.2.141 */ { 197, "NW-TT Port Number"}, /* Fixed Length / Clause 8.2.142 */ { 198, "5GS User Plane Node"}, /* Extendable / Clause 8.2.143 */ { 199, "TSC Management Information IE within PFCP Session Modification Request"}, /* Extendable / Table 7.5.4.18-1 */ @@ -1658,7 +1724,7 @@ static const value_string pfcp_ie_type[] = { { 226, "ATSSS-LL Parameters"}, /* Extendable / Table 7.5.3.7-3 */ { 227, "PMF Parameters"}, /* Extendable / Table 7.5.3.7-4 */ { 228, "MPTCP Address Information"}, /* Extendable / Clause 8.2.157 */ - { 229, "UE Link-Specific IP Address"}, /* Extendable / Clause 8.2.158 */ + { 229, "Link-Specific Multipath IP Address"}, /* Extendable / Clause 8.2.158 */ { 230, "PMF Address Information"}, /* Extendable / Clause 8.2.159 */ { 231, "ATSSS-LL Information"}, /* Extendable / Clause 8.2.160 */ { 232, "Data Network Access Identifier"}, /* Variable Length / Clause 8.2.161 */ @@ -1693,8 +1759,8 @@ static const value_string pfcp_ie_type[] = { { 262, "RDS Configuration Information"}, /* Extendable / Clause 8.2.180 */ { 263, "Query Packet Rate Status IE within PFCP Session Modification Request"}, /* Extendable / Table 7.5.4.22-1 */ { 264, "Query Packet Rate Status Report IE within PFCP Session Modification Response"}, /* Extendable / Table 7.5.5.4-1 */ - { 265, "MPTCP Applicable Indication"}, /* Extendable / Clause 8.2.181 */ - { 266, "User Plane NodeManagement Information Container"}, /* Variable Length / Clause 8.2.182 */ + { 265, "Multipath Applicable Indication"}, /* Extendable / Clause 8.2.181 */ + { 266, "User Plane Node Management Information Container"}, /* Variable Length / Clause 8.2.182 */ { 267, "UE IP Address Usage Information"}, /* Extendable / Table 7.4.4.3.1-1 */ { 268, "Number of UE IP Addresses"}, /* Extendable / Clause 8.2.183 */ { 269, "Validity Timer"}, /* Extendable / Clause 8.2.184 */ @@ -1738,7 +1804,43 @@ static const value_string pfcp_ie_type[] = { { 307, "MBSN4mbReq Flags"}, /* Extendable Length / Clause 8.2.208 */ { 308, "Local Ingress Tunnel"}, /* Extendable Length / Clause 8.2.209 */ { 309, "MBS Unicast Parameters ID"}, /* Extendable Length / Clause 8.2.210 */ - //310 to 32767 Spare. For future use. + { 310, "MBS Session N4 Control Information IE within PFCP Session Establishment Request"}, /* Extendable / Table 7.5.2.1-6 */ + { 311, "MBS Session N4 Control Information IE within PFCP Session Establishment Response"}, /* Extendable / Table 7.5.3.1-5 */ + { 312, "MBSN4Resp-Flags"}, /* Extendable / Clause 8.2.211 */ + { 313, "Tunnel Password"}, /* Variable Length / Clause 8.2.212 */ + { 314, "Area Session ID"}, /* Fixed / Clause 8.2.213 */ + { 315, "Peer UP Restart Report IE within PFCP Node Report Request"}, /* Extendable / Table 7.4.5.1-7 */ + { 316, "DSCP to PPI Control Information IE within PFCP Session Establishment Request"}, /* Extendable / Table 7.5.2.1-6 */ + { 317, "DSCP to PPI Mapping Information"}, /* Extendable / Clause 8.2.214 */ + { 318, "PFCPSDRsp-Flags"}, /* Extendable / Clause 8.2.215 */ + { 319, "QER Indications"}, /* Extendable / Clause 8.2.216 */ + { 320, "Vendor-Specific Node Report Type"}, /* Extendable / Clause 8.2.217 */ + { 321, "Configured Time Domain"}, /* Extendable / Clause 8.2.218 */ + { 322, "Metadata"}, /* Variable Length / Clause 8.2.219 */ + { 323, "Traffic Parameter Measurement Control Information"}, /* Extendable / Table 7.5.2.9-5 */ + { 324, "Traffic Parameter Measurement Report"}, /* Extendable / Table 7.5.8.6-4 */ + { 325, "Traffic Parameter Threshold"}, /* Extendable / Clause 8.2.220 */ + { 326, "DL Periodicity"}, /* Extendable / Clause 8.2.221 */ + { 327, "N6 Jitter Measurement"}, /* Extendable / Clause 8.2.222 */ + { 328, "Traffic Parameter Measurement Indication"}, /* Extendable / Clause 8.2.223 */ + { 329, "UL Periodicity"}, /* Extendable / Clause 8.2.224 */ + { 330, "MPQUIC Control Information"}, /* Extendable / Clause 8.2.225 */ + { 331, "MPQUIC Parameters"}, /* Extendable / Table 7.5.3.7-5 */ + { 332, "MPQUIC Address Information"}, /* Extendable / Clause 8.2.226 */ + { 333, "Transport Mode"}, /* Extendable / Clause 8.2.227 */ + { 334, "Protocol Description"}, /* Extendable / Table 7.5.2.2-7 */ + { 335, "Reporting Suggestion Info"}, /* Extendable / Clause 8.2.289 */ + { 336, "TL-Container"}, /* Variable Length / Clause 8.2.230 */ + { 337, "Measurement Indication"}, /* Extendable / Clause 8.2.231 */ + { 338, "HPLMN S-NSSAI"}, /* Fixed Length / Clause 8.2.232 */ + { 339, "Media Transport Protocol"}, /* Extendable / Clause 8.2.233 */ + { 340, "RTP Header Extension Information"}, /* Extendable / Table 7.5.2.2-8 */ + { 341, "RTP Payload Information"}, /* Extendable / Table 7.5.2.2-9 */ + { 342, "RTP Header Extension Type"}, /* Fixed Length / Clause 8.2.234 */ + { 343, "RTP Header Extension ID"}, /* Fixed Length / Clause 8.2.235 */ + { 344, "RTP Payload Type"}, /* Fixed Length / Clause 8.2.236 */ + { 345, "RTP Payload Format"}, /* Fixed Length / Clause 8.2.237 */ + //346 to 32767 Spare. For future use. //32768 to 65535 Vendor-specific IEs. {0, NULL} }; @@ -1746,73 +1848,62 @@ static const value_string pfcp_ie_type[] = { static value_string_ext pfcp_ie_type_ext = VALUE_STRING_EXT_INIT(pfcp_ie_type); /* PFCP Session funcs*/ +static guint +pfcp_info_hash(gconstpointer key) +{ + const pfcp_info_t *k = (const pfcp_info_t *)key; + + /* The SEID is likely unique, so just use it. */ + return g_int_hash(&k->seid); +} + +static gboolean +pfcp_info_equal(gconstpointer key1, gconstpointer key2) +{ + const pfcp_info_t *a = (const pfcp_info_t *)key1; + const pfcp_info_t *b = (const pfcp_info_t *)key2; + + return (a->seid == b->seid && (cmp_address(&a->addr, &b->addr) == 0)); +} + static guint32 -pfcp_get_frame(packet_info *pinfo, address ip, guint64 seid, guint32 *frame) { - gboolean found = FALSE; - wmem_list_frame_t *elem; - pfcp_info_t *info; - wmem_list_t *info_list; - gchar *ip_str; - - /* First we get the seid list*/ - ip_str = address_to_str(pinfo->pool, &ip); - info_list = (wmem_list_t*)wmem_tree_lookup_string(pfcp_frame_tree, ip_str, 0); - if (info_list != NULL) { - elem = wmem_list_head(info_list); - while (!found && elem) { - info = (pfcp_info_t*)wmem_list_frame_data(elem); - if (seid == info->seid) { - *frame = info->frame; - return 1; - } - elem = wmem_list_frame_next(elem); - } +pfcp_get_frame(address ip, guint64 seid, guint32 *frame) { + pfcp_info_t info; + guint32 *value; + + info.seid = seid; + copy_address_shallow(&info.addr, &ip); + value = wmem_map_lookup(pfcp_frame_map, &info); + if (value != NULL) { + *frame = GPOINTER_TO_UINT(value); + return 1; } return 0; } static gboolean -pfcp_call_foreach_ip(const void *key _U_, void *value, void *data){ - wmem_list_frame_t * elem; - wmem_list_t *info_list = (wmem_list_t *)value; - pfcp_info_t *info; - guint32* frame = (guint32*)data; - - /* We loop over the <seid, frame> list */ - elem = wmem_list_head(info_list); - while (elem) { - info = (pfcp_info_t*)wmem_list_frame_data(elem); - if (info->frame == *frame) { - wmem_list_frame_t * del = elem; - /* proceed to next request */ - elem = wmem_list_frame_next(elem); - /* If we find the frame we remove its information from the list */ - wmem_list_remove_frame(info_list, del); - wmem_free(wmem_file_scope(), info); - } - else { - elem = wmem_list_frame_next(elem); - } - } +pfcp_frame_equal(void *key _U_, void *value, void *data){ + guint32 frame = GPOINTER_TO_UINT(data); - return FALSE; + return (GPOINTER_TO_UINT(value) == frame); } static void -pfcp_remove_frame_info(guint32 *f) { - /* For each ip node */ - wmem_tree_foreach(pfcp_frame_tree, pfcp_call_foreach_ip, (void *)f); +pfcp_remove_frame_info(guint32 f) { + /* XXX: This iterates through the entire map and it is slow if done + * often. For large files with lots of removals, there are better + * alternatives, e.g. marking sessions as expired and then periodically + * removing all expired sessions from the map, or using a bijective + * map to coordinate removals. + */ + wmem_map_foreach_remove(pfcp_frame_map, pfcp_frame_equal, GUINT_TO_POINTER(f)); } + static void pfcp_add_session(guint32 frame, guint32 session) { - guint32 *f, *session_count; + g_hash_table_insert(pfcp_session_table, GUINT_TO_POINTER(frame), GUINT_TO_POINTER(session)); - f = wmem_new0(wmem_file_scope(), guint32); - session_count = wmem_new0(wmem_file_scope(), guint32); - *f = frame; - *session_count = session; - g_hash_table_insert(pfcp_session_table, f, session_count); } static gboolean @@ -1845,71 +1936,45 @@ pfcp_ip_exists(address ip, wmem_list_t *ip_list) { return found; } -static gboolean -pfcp_info_exists(pfcp_info_t *wanted, wmem_list_t *info_list) { - wmem_list_frame_t *elem; - pfcp_info_t *info; - gboolean found; - found = FALSE; - elem = wmem_list_head(info_list); - while (!found && elem) { - info = (pfcp_info_t*)wmem_list_frame_data(elem); - found = wanted->seid == info->seid; - elem = wmem_list_frame_next(elem); - } - return found; -} - static void pfcp_fill_map(wmem_list_t *seid_list, wmem_list_t *ip_list, guint32 frame) { wmem_list_frame_t *elem_ip, *elem_seid; pfcp_info_t *pfcp_info; - wmem_list_t * info_list; /* List of <seids,frames>*/ - guint32 *f, *session, *fr, *session_count; + gpointer session_p, fr_p; GHashTableIter iter; guint64 seid; - gchar *ip; + guint32 session; + address *ip; elem_ip = wmem_list_head(ip_list); - while (elem_ip) { - ip = address_to_str(wmem_file_scope(), (address*)wmem_list_frame_data(elem_ip)); - /* We check if a seid list exists for this ip */ - info_list = (wmem_list_t*)wmem_tree_lookup_string(pfcp_frame_tree, ip, 0); - if (info_list == NULL) { - info_list = wmem_list_new(wmem_file_scope()); - } - + ip = (address*)wmem_list_frame_data(elem_ip); /* We loop over the seid list */ elem_seid = wmem_list_head(seid_list); while (elem_seid) { seid = *(guint64*)wmem_list_frame_data(elem_seid); - f = wmem_new0(wmem_file_scope(), guint32); - *f = frame; pfcp_info = wmem_new0(wmem_file_scope(), pfcp_info_t); pfcp_info->seid = seid; - pfcp_info->frame = *f; - - if (pfcp_info_exists(pfcp_info, info_list)) { - /* If the seid and ip already existed, that means that we need to remove old info about that session */ + copy_address_wmem(wmem_file_scope(), &pfcp_info->addr, ip); + if (wmem_map_lookup(pfcp_frame_map, pfcp_info)) { + /* If the seid and ip already maps to a session, that means + * that we need to remove old info about that session */ /* We look for its session ID */ - session = (guint32 *)g_hash_table_lookup(pfcp_session_table, f); + session = GPOINTER_TO_UINT(g_hash_table_lookup(pfcp_session_table, GUINT_TO_POINTER(frame))); if (session) { g_hash_table_iter_init(&iter, pfcp_session_table); - - while (g_hash_table_iter_next(&iter, (gpointer*)&fr, (gpointer*)&session_count)) { + while (g_hash_table_iter_next(&iter, &fr_p, &session_p)) { /* If the msg has the same session ID and it's not the upd req we have to remove its info */ - if (*session_count == *session) { + if (GPOINTER_TO_UINT(session_p) == session) { /* If it's the session we are looking for, we remove all the frame information */ - pfcp_remove_frame_info(fr); + pfcp_remove_frame_info(GPOINTER_TO_UINT(fr_p)); } } } } - wmem_list_prepend(info_list, pfcp_info); + wmem_map_insert(pfcp_frame_map, pfcp_info, GUINT_TO_POINTER(frame)); elem_seid = wmem_list_frame_next(elem_seid); } - wmem_tree_insert_string(pfcp_frame_tree, ip, info_list, 0); elem_ip = wmem_list_frame_next(elem_ip); } } @@ -1985,33 +2050,95 @@ pfcp_sn_equal_unmatched(gconstpointer k1, gconstpointer k2) return key1->seq_nr == key2->seq_nr; } +static GHashTable *pfcp_stat_msg_idx_hash = NULL; + +static void +pfcp_stat_init(struct register_srt* srt _U_, GArray*srt_array) +{ + if (pfcp_stat_msg_idx_hash != NULL) { + g_hash_table_destroy(pfcp_stat_msg_idx_hash); + } + pfcp_stat_msg_idx_hash = g_hash_table_new(g_direct_hash, g_direct_equal); + + init_srt_table("PFCP Requests", NULL, srt_array, 0, NULL, NULL, NULL); +} + +static tap_packet_status +pfcp_stat_packet(void *pss, packet_info *pinfo, epan_dissect_t *edt _U_, const void *prv, tap_flags_t flags _U_) +{ + guint i = 0; + srt_stat_table *pfcp_srt_table; + srt_data_t *srt_data = (srt_data_t*)pss; + const pfcp_msg_hash_t *pcrp = (const pfcp_msg_hash_t *)prv; + int idx = 0; + + /* We are only interested in matched reply packets. */ + if (pcrp->is_request) { + return TAP_PACKET_DONT_REDRAW; + } + if (!pcrp->req_frame) { + return TAP_PACKET_DONT_REDRAW; + } + + pfcp_srt_table = g_array_index(srt_data->srt_array, srt_stat_table*, i); + + /* XXX: It would be nice if srt_table handled hashing so that the + * real procedure number could be displayed in the table without + * having to add empty rows for unused message types and responses + * (requests and responses have different message types, and we + * only use the request value.) + */ + idx = GPOINTER_TO_UINT(g_hash_table_lookup(pfcp_stat_msg_idx_hash, GUINT_TO_POINTER(pcrp->msgtype))); + + /* Store the row value incremented by 1 to distinguish 0 from NULL */ + if (idx == 0) { + idx = g_hash_table_size(pfcp_stat_msg_idx_hash); + g_hash_table_insert(pfcp_stat_msg_idx_hash, GUINT_TO_POINTER(pcrp->msgtype), GUINT_TO_POINTER(idx + 1)); + init_srt_table_row(pfcp_srt_table, idx, val_to_str_ext_const(pcrp->msgtype, &pfcp_message_type_ext, "Unknown")); + } else { + idx -= 1; + } + + add_srt_table_data(pfcp_srt_table, idx, &pcrp->req_time, pinfo); + + return TAP_PACKET_REDRAW; +} + static void pfcp_track_session(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, pfcp_hdr_t * pfcp_hdr, wmem_list_t *seid_list, wmem_list_t *ip_list, guint64 last_seid _U_, address last_ip _U_) { - guint32 *session, frame_seid_cp; + guint32 session, frame_seid_cp; proto_item *it; /* PFCP session */ if (tree) { - session = (guint32*)g_hash_table_lookup(pfcp_session_table, &pinfo->num); + session = GPOINTER_TO_UINT(g_hash_table_lookup(pfcp_session_table, GUINT_TO_POINTER(pinfo->num))); if (session) { - it = proto_tree_add_uint(tree, hf_pfcp_session, tvb, 0, 0, *session); + it = proto_tree_add_uint(tree, hf_pfcp_session, tvb, 0, 0, session); proto_item_set_generated(it); } } if (!PINFO_FD_VISITED(pinfo)) { /* If the message does not have any session ID */ - session = (guint32*)g_hash_table_lookup(pfcp_session_table, &pinfo->num); + session = GPOINTER_TO_UINT(g_hash_table_lookup(pfcp_session_table, GUINT_TO_POINTER(pinfo->num))); if (!session) { - /* If the message is not a SEREQ, SERES, SMREQ, SERES, SDREQ, SDRES, SRREQ or SRRES then we remove its information from seid and ip lists */ + /* If the message is not a SEREQ, SERES, SMREQ, SERES, SDREQ, SDRES, SRREQ or SRRES + * then we remove its information from seid and ip lists + * XXX: Wouldn't it be better not to insert this information + * in the first place for other message types, instead of + * inserting it and then immediately removing it? + * At the very least, it would be faster to iterate through the + * seid_list and ip_list and remove via keys rather than doing + * removal through a reverse lookup. + */ if ((pfcp_hdr->message != PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST && pfcp_hdr->message != PFCP_MSG_SESSION_ESTABLISHMENT_RESPONSE && pfcp_hdr->message != PFCP_MSG_SESSION_MODIFICATION_REQUEST && pfcp_hdr->message != PFCP_MSG_SESSION_MODIFICATION_RESPONSE && pfcp_hdr->message != PFCP_MSG_SESSION_DELETION_REQUEST && pfcp_hdr->message != PFCP_MSG_SESSION_DELETION_RESPONSE && pfcp_hdr->message != PFCP_MSG_SESSION_REPORT_REQUEST && pfcp_hdr->message != PFCP_MSG_SESSION_REPORT_RESPONSE)) { /* If the lists are not empty*/ if (wmem_list_count(seid_list) && wmem_list_count(ip_list)) { - pfcp_remove_frame_info(&pinfo->num); + pfcp_remove_frame_info(pinfo->num); } } if (pfcp_hdr->message == PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST){ @@ -2021,12 +2148,12 @@ pfcp_track_session(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, pfcp_ else if (pfcp_hdr->message != PFCP_MSG_SESSION_ESTABLISHMENT_RESPONSE) { /* We have to check if its seid == seid_cp and ip.dst == gsn_ipv4 from the lists, if that is the case then we have to assign the corresponding session ID */ - if ((pfcp_get_frame(pinfo, pinfo->dst, (guint32)pfcp_hdr->seid, &frame_seid_cp) == 1)) { + if ((pfcp_get_frame(pinfo->dst, pfcp_hdr->seid, &frame_seid_cp) == 1)) { /* Then we have to set its session ID */ - session = (guint32*)g_hash_table_lookup(pfcp_session_table, &frame_seid_cp); - if (session != NULL) { + session = GPOINTER_TO_UINT(g_hash_table_lookup(pfcp_session_table, GUINT_TO_POINTER(frame_seid_cp))); + if (session) { /* We add the corresponding session to the list so that when a response came we can associate its session ID*/ - pfcp_add_session(pinfo->num, *session); + pfcp_add_session(pinfo->num, session); } } } @@ -2040,6 +2167,15 @@ dissect_pfcp_reserved(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_reserved, tvb, 0, length); } +static int dissect_pfcp_string_ie(tvbuff_t *tvb, proto_tree *tree, int hf) +{ + char* string_value = NULL; + proto_tree_add_item_ret_display_string(tree, hf, tvb, 0, -1, ENC_ASCII, wmem_packet_scope(), &string_value); + proto_item_append_text(proto_tree_get_parent(tree), " : %s", string_value); + + return tvb_reported_length(tvb); +} + /* Functions for C-Tag and S-TAG * See 8.2.94 and 8.2.95 */ @@ -2078,8 +2214,7 @@ static int decode_pfcp_c_tag(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree * NULL }; /* Octet 5 Spare VID DEI PCP */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_c_tag_flags, - ett_pfcp_c_tag, pfcp_c_tag_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_c_tag_flags, ENC_BIG_ENDIAN); offset += 1; // Octet 8 7 6 5 4 3 2 1 @@ -2109,8 +2244,7 @@ static int decode_pfcp_s_tag(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree * NULL }; /* Octet 5 Spare VID DEI PCP */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_s_tag_flags, - ett_pfcp_s_tag, pfcp_s_tag_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_s_tag_flags, ENC_BIG_ENDIAN); offset += 1; // Octet 8 7 6 5 4 3 2 1 @@ -2141,7 +2275,7 @@ static const value_string pfcp_cause_vals[] = { { 68, "Invalid length" }, { 69, "Mandatory IE incorrect" }, { 70, "Invalid Forwarding Policy" }, - { 71, "Invalid F - TEID allocation option" }, + { 71, "Invalid F-TEID allocation option" }, { 72, "No established PFCP Association" }, { 73, "Rule creation / modification Failure" }, { 74, "PFCP entity in congestion" }, @@ -2156,7 +2290,11 @@ static const value_string pfcp_cause_vals[] = { { 83, "L2TP session Establishment failure" }, { 84, "L2TP tunnel release" }, { 85, "L2TP session release" }, - /* 86 to 255 Spare for future use in a response message. */ + { 86, "PFCP session restoration failure" }, + { 87, "L2TP tunnel Establishment failure - Tunnel Auth Failure"}, + { 88, "L2TP Session Establishment failure - Session Auth Failure"}, + { 89, "L2TP tunnel Establishment failure - LNS not reachable"}, + /* 90 to 255 Spare for future use in a response message. */ {0, NULL} }; @@ -2229,8 +2367,7 @@ dissect_pfcp_f_teid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_i NULL }; /* Octet 5 Spare Spare Spare Spare CHID CH V6 V4*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_f_teid_flags, - ett_f_teid_flags, pfcp_fteid_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &fteid_flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_fteid_flags, ENC_BIG_ENDIAN, &fteid_flags_val); offset += 1; /* The following flags are coded within Octet 5: * Bit 1 - V4: If this bit is set to "1" and the CH bit is not set, then the IPv4 address field shall be present, @@ -2295,19 +2432,11 @@ decode_pfcp_network_instance(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree * if (name_len < 0x41) { /* APN */ guint8 *apn = NULL; - int tmp; name_len = tvb_get_guint8(tvb, offset); if (name_len < 0x20) { - apn = tvb_get_string_enc(pinfo->pool, tvb, offset + 1, length - 1, ENC_ASCII); - for (;;) { - if (name_len >= length - 1) - break; - tmp = name_len; - name_len = name_len + apn[tmp] + 1; - apn[tmp] = '.'; - } + apn = tvb_get_string_enc(pinfo->pool, tvb, offset, length, ENC_APN_STR); } else { apn = tvb_get_string_enc(pinfo->pool, tvb, offset, length, ENC_ASCII); } @@ -2361,8 +2490,7 @@ dissect_pfcp_sdf_filter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro NULL }; /* Octet 5 Spare FL SPI TTC FD*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_sdf_filter_flags, - ett_pfcp_sdf_filter_flags, pfcp_sdf_filter_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_sdf_filter_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; /* Octet 6 Spare*/ proto_tree_add_item(tree, hf_pfcp_spare, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -2380,7 +2508,7 @@ dissect_pfcp_sdf_filter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro * 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(flow_desc_tree, hf_pfcp_flow_desc, tvb, offset, fd_length, ENC_ASCII|ENC_NA); + proto_tree_add_item(flow_desc_tree, hf_pfcp_flow_desc, tvb, offset, fd_length, ENC_ASCII); offset += fd_length; } if ((flags_val & 0x2) == 2) { @@ -2469,8 +2597,7 @@ dissect_pfcp_gate_status(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pr NULL }; /* Octet 5 Spare UL Gate DL Gate */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_gate_status, - ett_pfcp_gate_status, pfcp_gate_status_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_gate_status_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -2626,8 +2753,7 @@ dissect_pfcp_volume_threshold(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre NULL }; /* Octet 5 Spare DLVOL ULVOL TOVOL*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_volume_threshold, - ett_pfcp_volume_threshold, pfcp_volume_threshold_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_volume_threshold_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; /* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value. @@ -2722,8 +2848,7 @@ dissect_pfcp_subseq_volume_threshold(tvbuff_t *tvb, packet_info *pinfo, proto_tr NULL }; /* Octet 5 Spare DLVOL ULVOL TOVOL*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_subseq_volume_threshold, - ett_pfcp_subseq_volume_threshold, pfcp_subseq_volume_threshold_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_subseq_volume_threshold_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; /* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value. @@ -2840,11 +2965,12 @@ dissect_pfcp_reporting_triggers(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t } static int * const pfcp_reporting_triggers_o7_flags[] = { - &hf_pfcp_spare_b7_b1, + &hf_pfcp_spare_b7_b2, + &hf_pfcp_reporting_triggers_o7_b1_upint, &hf_pfcp_reporting_triggers_o7_b0_reemr, NULL }; - /* Octet 7 Spare Spare Spare Spare Spare Spare Spare REEMR */ + /* Octet 7 Spare Spare Spare Spare Spare Spare UPINT REEMR */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_reporting_triggers_o7_flags, ENC_BIG_ENDIAN); offset++; @@ -2869,6 +2995,10 @@ static const value_string pfcp_redirect_address_type_vals[] = { { 2, "URL" }, { 3, "SIP URI" }, { 4, "IPv4 and IPv6 addresses" }, + { 5, "Port" }, + { 6, "IPv4 address and Port" }, + { 7, "IPv6 address and Port" }, + { 8, "IPv4 and IPv6 addresses and Port" }, { 0, NULL } }; @@ -2876,37 +3006,42 @@ static void dissect_pfcp_redirect_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) { int offset = 0; - guint32 value, addr_len; + guint32 redirect_address_type, addr_len, other_addr_len; /* Octet Spare Redirect Address 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_redirect_address_type, tvb, offset, 1, ENC_BIG_ENDIAN, &value); + proto_tree_add_item_ret_uint(tree, hf_pfcp_redirect_address_type, tvb, offset, 1, ENC_BIG_ENDIAN, &redirect_address_type); offset++; - /* 6-7 Redirect Server Address Length=a */ - proto_tree_add_item_ret_uint(tree, hf_pfcp_redirect_server_addr_len, tvb, offset, 2, ENC_BIG_ENDIAN, &addr_len); - offset+=2; + /* If the Redirect Address Type is set to Port, the Redirect Address Server Address shall not be present */ + if(!(redirect_address_type == 5)) { + /* 6-7 Redirect Server Address Length=a */ + proto_tree_add_item_ret_uint(tree, hf_pfcp_redirect_server_addr_len, tvb, offset, 2, ENC_BIG_ENDIAN, &addr_len); + offset+=2; - /* 8-(8+a-1) Redirect Server Address */ - proto_tree_add_item(tree, hf_pfcp_redirect_server_address, tvb, offset, addr_len, ENC_UTF_8 | ENC_NA); - offset += addr_len; + /* 8-(8+a-1) Redirect Server Address */ + proto_tree_add_item(tree, hf_pfcp_redirect_server_address, tvb, offset, addr_len, ENC_UTF_8 | ENC_NA); + offset += addr_len; - /* If the Redirect Address type is set to "IPv4 and IPv6 address", - * the Redirect Information IE shall include an IPv4 address and - * an IPv6 address in the Redirect Server Address IE and Other Redirect Server Address. - */ + /* - If the Redirect Address type is set to "IPv4 and IPv6 address", the Redirect Information IE shall include an IPv4 address + * and an IPv6 address in the Redirect Server Address IE and Other Redirect Server Address. + * - When Redirect Address Type is set to "IPv4 and IPv6 addresses and Port", the Other Redirect Server Address shall also be present. + */ + if((redirect_address_type == 4) || (redirect_address_type == 8)) { + /* p-(p+1) Other Redirect Server Address Length=b */ + proto_tree_add_item_ret_uint(tree, hf_pfcp_other_redirect_server_addr_len, tvb, offset, 2, ENC_BIG_ENDIAN, &other_addr_len); + offset+=2; + + /* (p+2)-(p+2+b-1) Other Redirect Server Address */ + proto_tree_add_item(tree, hf_pfcp_other_redirect_server_address, tvb, offset, other_addr_len, ENC_UTF_8 | ENC_NA); + offset += other_addr_len; + } + } - /* Redirect Information is an extensible IE. It was extended with the Other Redirect Server Address - * in version 15.6.0, before that version not including the Other Redirect Server Address was fine - */ - if (offset < length) { - /* p-(p+1) Other Redirect Server Address Length=b */ - proto_tree_add_item_ret_uint(tree, hf_pfcp_other_redirect_server_addr_len, tvb, offset, 2, ENC_BIG_ENDIAN, &addr_len); + if((redirect_address_type == 5) || (redirect_address_type == 6) || (redirect_address_type == 7) || (redirect_address_type == 8)) { + /* m to (m+1) Port */ + proto_tree_add_item(tree, hf_pfcp_redirect_port, tvb, offset, 2, ENC_BIG_ENDIAN); offset+=2; - - /* (p+2)-(p+2+b-1) Other Redirect Server Address */ - proto_tree_add_item(tree, hf_pfcp_other_redirect_server_address, tvb, offset, addr_len, ENC_UTF_8 | ENC_NA); - offset += addr_len; } if (offset < length) { @@ -2933,8 +3068,7 @@ dissect_pfcp_report_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pr NULL }; /* Octet 5 Spare UISR SESR TMIR 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); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_report_type_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -3083,7 +3217,7 @@ dissect_pfcp_up_function_features(tvbuff_t *tvb, packet_info *pinfo, proto_tree static int * const pfcp_up_function_features_o8_flags[] = { &hf_pfcp_up_function_features_o8_b7_mptcp, - &hf_pfcp_up_function_features_o8_b6_tscu, + &hf_pfcp_up_function_features_o8_b6_tsn, &hf_pfcp_up_function_features_o8_b5_ip6pl, &hf_pfcp_up_function_features_o8_b4_iptv, &hf_pfcp_up_function_features_o8_b3_norp, @@ -3092,7 +3226,7 @@ dissect_pfcp_up_function_features(tvbuff_t *tvb, packet_info *pinfo, proto_tree &hf_pfcp_up_function_features_o8_b0_mpas, NULL }; - /* Octet 8 MPTCP TSCU IP6PL IPTV NORP VTIME RTTL MPAS */ + /* Octet 8 MPTCP TSN IP6PL IPTV NORP VTIME RTTL MPAS */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o8_flags, ENC_BIG_ENDIAN); offset += 1; @@ -3111,7 +3245,7 @@ dissect_pfcp_up_function_features(tvbuff_t *tvb, packet_info *pinfo, proto_tree &hf_pfcp_up_function_features_o9_b0_atsss_ll, NULL }; - /* Octet 9 SPARE ETHAR CIOT MT-EDT GPQM QFQM ATSSS-LL */ + /* Octet 9 RDS DDDS ETHAR CIOT MT-EDT GPQM QFQM ATSSS-LL */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o9_flags, ENC_BIG_ENDIAN); offset += 1; @@ -3126,11 +3260,11 @@ dissect_pfcp_up_function_features(tvbuff_t *tvb, packet_info *pinfo, proto_tree &hf_pfcp_up_function_features_o10_b4_upber, &hf_pfcp_up_function_features_o10_b3_l2tp, &hf_pfcp_up_function_features_o10_b2_nspoc, - &hf_pfcp_up_function_features_o10_b1_quoaf, + &hf_pfcp_up_function_features_o10_b1_quasf, &hf_pfcp_up_function_features_o10_b0_rttwp, NULL }; - /* Octet 10 DNSTS IPREP RESPS UPBER L2TP NSPOC QUOAF RTTWP */ + /* Octet 10 DNSTS IPREP RESPS UPBER L2TP NSPOC QUOSF RTTWP */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o10_flags, ENC_BIG_ENDIAN); offset += 1; @@ -3139,11 +3273,17 @@ dissect_pfcp_up_function_features(tvbuff_t *tvb, packet_info *pinfo, proto_tree } static int * const pfcp_up_function_features_o11_flags[] = { - &hf_pfcp_spare_b7_b1, + &hf_pfcp_up_function_features_o11_b7_mpquic, + &hf_pfcp_up_function_features_o11_b6_afsfc, + &hf_pfcp_up_function_features_o11_b5_upidp, + &hf_pfcp_up_function_features_o11_b4_ratp, + &hf_pfcp_up_function_features_o11_b3_eppi, + &hf_pfcp_up_function_features_o11_b2_psuprm, + &hf_pfcp_up_function_features_o11_b1_mbsn4, &hf_pfcp_up_function_features_o11_b0_drqos, NULL }; - /* Octet 10 Spare DRQOS */ + /* Octet 11 MPQUIC AFSFC UPIDP RATP EPPI PSUPRM MBSN4 DRQOS */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o11_flags, ENC_BIG_ENDIAN); offset += 1; @@ -3151,6 +3291,40 @@ dissect_pfcp_up_function_features(tvbuff_t *tvb, packet_info *pinfo, proto_tree return; } + static int * const pfcp_up_function_features_o12_flags[] = { + &hf_pfcp_up_function_features_o12_b7_eml4s, + &hf_pfcp_up_function_features_o12_b6_detnet, + &hf_pfcp_up_function_features_o12_b5_qmcon, + &hf_pfcp_up_function_features_o12_b4_n6jedb, + &hf_pfcp_up_function_features_o12_b3_drtsc, + &hf_pfcp_up_function_features_o12_b2_tscts, + &hf_pfcp_up_function_features_o12_b1_dbdm, + &hf_pfcp_up_function_features_o12_b0_redsm, + NULL + }; + /* Octet 12 EML4S DETNET QMCON N6JEDB DRTSC TSCTS DBDM REDSM */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o12_flags, ENC_BIG_ENDIAN); + offset += 1; + + if (offset == length) { + return; + } + + static int * const pfcp_up_function_features_o13_flags[] = { + &hf_pfcp_spare_b7_b3, + &hf_pfcp_up_function_features_o13_b2_qmdrm, + &hf_pfcp_up_function_features_o13_b1_cntl, + &hf_pfcp_up_function_features_o13_b0_pdusm, + NULL + }; + /* Octet 13 Spare QMDRM CN-TL PDUSM */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o13_flags, ENC_BIG_ENDIAN); + offset += 1; + + if (offset == length) { + return; + } + if (offset < length) { proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); } @@ -3217,8 +3391,7 @@ dissect_pfcp_dl_data_service_inf(tvbuff_t *tvb, packet_info *pinfo, proto_tree * NULL }; /* Octet 5 Spare QFII PPI */ - 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); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_dl_data_service_inf_flags, ENC_BIG_ENDIAN, &flags); offset += 1; /* The PPI flag in octet 5 indicates whether the Paging Policy Indication value in octet 'm' shall be present */ @@ -3350,7 +3523,8 @@ dissect_pfcp_pfcpsmreq_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree int offset = 0; static int * const pfcp_pfcpsmreq_flags[] = { - &hf_pfcp_spare_b7_b5, + &hf_pfcp_spare_b7_b6, + &hf_pfcp_pfcpsmreq_flags_b5_deteid, &hf_pfcp_pfcpsmreq_flags_b4_rumuc, &hf_pfcp_pfcpsmreq_flags_b3_sumpc, &hf_pfcp_pfcpsmreq_flags_b2_qaurr, @@ -3358,9 +3532,8 @@ dissect_pfcp_pfcpsmreq_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree &hf_pfcp_pfcpsmreq_flags_b0_drobu, NULL }; - /* Octet 5 Spare Spare Spare RUMUC SUMPC QAURR SNDEM DROBU */ - 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); + /* Octet 5 Spare Spare DETEID RUMUC SUMPC QAURR SNDEM DROBU */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_pfcpsmreq_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -3382,8 +3555,7 @@ dissect_pfcp_pfcpsrrsp_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree NULL }; /* Octet 5 Spare Spare Spare Spare Spare Spare Spare DROBU */ - 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); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_pfcpsrrsp_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -3524,8 +3696,7 @@ dissect_pfcp_f_seid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_i NULL }; /* Octet 5 Spare Spare Spare Spare Spare Spare V4 V6*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_f_seid_flags, - ett_pfcp_f_seid_flags, pfcp_f_seid_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &f_seid_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_f_seid_flags, ENC_BIG_ENDIAN, &f_seid_flags); offset += 1; if ((f_seid_flags & 0x3) == 0) { @@ -3533,7 +3704,6 @@ dissect_pfcp_f_seid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_i return; } /* Octet 6 to 13 SEID */ - //proto_tree_add_item(tree, hf_pfcp_seid, tvb, offset, 8, ENC_BIG_ENDIAN); proto_tree_add_item_ret_uint64(tree, hf_pfcp_seid, tvb, offset, 8, ENC_BIG_ENDIAN, &seid_cp); proto_item_append_text(item, "SEID: 0x%s", tvb_bytes_to_str(pinfo->pool, tvb, offset, 8)); offset += 8; @@ -3595,7 +3765,7 @@ static const value_string pfcp_node_id_type_vals[] = { static int decode_pfcp_fqdn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, gint offset, guint16 length) { - int name_len, tmp; + int name_len; guint8 *fqdn = NULL; /* FQDN, the Node ID value encoding shall be identical to the encoding of a FQDN @@ -3606,14 +3776,7 @@ decode_pfcp_fqdn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item name_len = tvb_get_guint8(tvb, offset); /* NOTE 1: The FQDN field in the IE is not encoded as a dotted string as commonly used in DNS master zone files. */ if (name_len < 0x40) { - fqdn = tvb_get_string_enc(pinfo->pool, tvb, offset + 1, length - 2, ENC_ASCII); - for (;;) { - if (name_len >= length - 2) - break; - tmp = name_len; - name_len = name_len + fqdn[tmp] + 1; - fqdn[tmp] = '.'; - } + fqdn = tvb_get_string_enc(pinfo->pool, tvb, offset, length - 1, ENC_APN_STR); } /* In case the FQDN field is incorrectly in dotted string form.*/ else { @@ -3696,8 +3859,7 @@ dissect_pfcp_pfd_contents(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p NULL }; /* Octet 5 ADNP AURL AFD DNP 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); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_pfd_contents_flags, ENC_BIG_ENDIAN, &flags); offset += 1; // Octet 6 Spare Octet @@ -3716,7 +3878,7 @@ dissect_pfcp_pfd_contents(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p offset += 2; /* (m+2) to p Flow Description */ - proto_tree_add_item(tree, hf_pfcp_flow_desc, tvb, offset, len, ENC_ASCII|ENC_NA); + proto_tree_add_item(tree, hf_pfcp_flow_desc, tvb, offset, len, ENC_ASCII); offset += len; } @@ -3729,7 +3891,7 @@ dissect_pfcp_pfd_contents(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p offset += 2; /* (q+2) to r URL */ - proto_tree_add_item(tree, hf_pfcp_url, tvb, offset, len, ENC_ASCII|ENC_NA); + proto_tree_add_item(tree, hf_pfcp_url, tvb, offset, len, ENC_ASCII); offset += len; } @@ -3743,7 +3905,7 @@ dissect_pfcp_pfd_contents(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p offset += 2; /* (s+2) to t Domain Name */ - proto_tree_add_item(tree, hf_pfcp_dn, tvb, offset, len, ENC_ASCII|ENC_NA); + proto_tree_add_item(tree, hf_pfcp_dn, tvb, offset, len, ENC_ASCII); offset += len; } @@ -3773,7 +3935,7 @@ dissect_pfcp_pfd_contents(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p offset += 2; /* (w+2) to x Domain Name Protocol */ - proto_tree_add_item(tree, hf_pfcp_dnp, tvb, offset, len, ENC_ASCII|ENC_NA); + proto_tree_add_item(tree, hf_pfcp_dnp, tvb, offset, len, ENC_ASCII); offset += len; } @@ -3798,7 +3960,7 @@ dissect_pfcp_pfd_contents(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p dissected_len += 2; /* (y+4) to i Flow Description */ - proto_tree_add_item(afd_tree, hf_pfcp_flow_desc, tvb, offset+2, flow_desc_len, ENC_ASCII|ENC_NA); + proto_tree_add_item(afd_tree, hf_pfcp_flow_desc, tvb, offset, flow_desc_len, ENC_ASCII); offset += flow_desc_len; dissected_len += flow_desc_len; } @@ -3824,7 +3986,7 @@ dissect_pfcp_pfd_contents(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p offset += 2; /* (a+4) to o URL */ - proto_tree_add_item(aurl_tree, hf_pfcp_url, tvb, offset, url_len, ENC_ASCII|ENC_NA); + proto_tree_add_item(aurl_tree, hf_pfcp_url, tvb, offset, url_len, ENC_ASCII); dissected_len += url_len; offset += url_len; } @@ -3850,7 +4012,7 @@ dissect_pfcp_pfd_contents(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p offset += 2; /* (c+4) to pd Domain Name */ - proto_tree_add_item(adnp_tree, hf_pfcp_dn, tvb, offset, domain_name_len, ENC_ASCII|ENC_NA); + proto_tree_add_item(adnp_tree, hf_pfcp_dn, tvb, offset, domain_name_len, ENC_ASCII); dissected_len += domain_name_len; offset += domain_name_len; @@ -3860,7 +4022,7 @@ dissect_pfcp_pfd_contents(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p offset += 2; /* (pe+2) to ph Domain Name Protocol */ - proto_tree_add_item(adnp_tree, hf_pfcp_dnp, tvb, offset, domain_name_prot_len, ENC_ASCII|ENC_NA); + proto_tree_add_item(adnp_tree, hf_pfcp_dnp, tvb, offset, domain_name_prot_len, ENC_ASCII); dissected_len += domain_name_prot_len; offset += domain_name_prot_len; } @@ -3887,8 +4049,7 @@ dissect_pfcp_measurement_method(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t NULL }; /* 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); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_measurement_method_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -3944,7 +4105,8 @@ dissect_pfcp_usage_report_trigger(tvbuff_t *tvb, packet_info *pinfo, proto_tree } static int * const pfcp_usage_report_trigger_o7_flags[] = { - &hf_pfcp_spare_b7_b5, + &hf_pfcp_spare_b7_b6, + &hf_pfcp_usage_report_trigger_o7_b5_upint, &hf_pfcp_usage_report_trigger_o7_b4_emrre, &hf_pfcp_usage_report_trigger_o7_b3_quvti, &hf_pfcp_usage_report_trigger_o7_b2_ipmjl, @@ -3952,7 +4114,7 @@ dissect_pfcp_usage_report_trigger(tvbuff_t *tvb, packet_info *pinfo, proto_tree &hf_pfcp_usage_report_trigger_o7_b0_evequ, NULL }; - /* Octet 7 Spare Spare Spare EMRRE QUVTI IPMJL TEBUR EVEQU */ + /* Octet 7 Spare Spare UPINT EMRRE QUVTI IPMJL TEBUR EVEQU */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_usage_report_trigger_o7_flags, ENC_BIG_ENDIAN); offset++; @@ -4000,10 +4162,10 @@ static const value_string pfcp_fq_csid_node_type_vals[] = { { 0, "MME" }, { 1, "SGW-C" }, - { 2, "PGW-C" }, + { 2, "PGW-C/SMF" }, { 3, "ePDG" }, { 4, "TWAN" }, - { 5, "PGW-U/SGW-U" }, + { 5, "PGW-U/SGW-U/UPF" }, { 0, NULL } }; @@ -4081,8 +4243,7 @@ dissect_pfcp_volume_measurement(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t NULL }; /* Octet 5 Spare DLNOP ULNOP TONOP DLVOL ULVOL TOVOL*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_volume_measurement, - ett_pfcp_volume_measurement, pfcp_volume_measurement_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_volume_measurement_flags, ENC_BIG_ENDIAN, &flags); offset += 1; /* Bit 1 - TOVOL: If this bit is set to "1", then the Total Volume field shall be present*/ @@ -4224,8 +4385,7 @@ dissect_pfcp_dropped_dl_traffic_threshold(tvbuff_t *tvb, packet_info *pinfo, pro NULL }; /* Octet 5 Spare DLBY DLPA*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_dropped_dl_traffic_threshold, - ett_pfcp_dropped_dl_traffic_threshold, pfcp_dropped_dl_traffic_threshold_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_dropped_dl_traffic_threshold_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; if ((flags_val & 0x1) == 1) { @@ -4265,8 +4425,7 @@ dissect_pfcp_volume_quota(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p NULL }; /* Octet 5 Spare DLVOL ULVOL TOVOL*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_volume_quota, - ett_pfcp_volume_quota, pfcp_volume_quota_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_volume_quota_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; /* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value. @@ -4424,41 +4583,38 @@ dissect_pfcp_linked_urr_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* * 8.2.56 Outer Header Creation */ - -static const value_string pfcp_outer_hdr_desc_vals[] = { - - { 0x000100, "GTP-U/UDP/IPv4 " }, - { 0x000200, "GTP-U/UDP/IPv6 " }, - { 0x000300, "GTP-U/UDP/IPv4/IPv6 " }, - { 0x000400, "UDP/IPv4 " }, - { 0x000800, "UDP/IPv6 " }, - { 0x000C00, "UDP/IPv4/IPv6 " }, - { 0x001000, "IPv4 " }, - { 0x002000, "IPv6 " }, - { 0x003000, "IPv4/IPv6 " }, - { 0x004000, "C-TAG " }, - { 0x008000, "S-TAG " }, - { 0x010000, "N19 Indication " }, - { 0x020000, "N6 Indication " }, - { 0x040000, "Low Layer SSM and C-TEID " }, - { 0, NULL } -}; - static void dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) { int offset = 0; - guint32 value; + guint64 value; + + static int * const outer_hdr_desc[] = { + &hf_pfcp_outer_hdr_desc_o5_b7_stag, + &hf_pfcp_outer_hdr_desc_o5_b6_ctag, + &hf_pfcp_outer_hdr_desc_o5_b5_ipv6, + &hf_pfcp_outer_hdr_desc_o5_b4_ipv4, + &hf_pfcp_outer_hdr_desc_o5_b3_udp_ipv6, + &hf_pfcp_outer_hdr_desc_o5_b2_udp_ipv4, + &hf_pfcp_outer_hdr_desc_o5_b1_gtp_udp_ipv6, + &hf_pfcp_outer_hdr_desc_o5_b0_gtp_udp_ipv4, + &hf_pfcp_outer_hdr_desc_o6_spare, + &hf_pfcp_outer_hdr_desc_o6_b2_ssm_cteid, + &hf_pfcp_outer_hdr_desc_o6_b1_n6, + &hf_pfcp_outer_hdr_desc_o6_b0_n19, + NULL + }; - /* Octet 5 Outer Header Creation Description */ - proto_tree_add_item_ret_uint(tree, hf_pfcp_outer_hdr_desc, tvb, offset, 2, ENC_BIG_ENDIAN, &value); + /* Octet 5-6 Outer Header Creation Description */ + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 2, outer_hdr_desc, 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 & 0x000100) || (value & 0x000200)) { + if ((value & 0x0100) || (value & 0x0200)) { proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_teid, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; } @@ -4467,7 +4623,7 @@ dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree * p to (p+3) IPv4 * The IPv4 Address field shall be present if the Outer Header Creation Description requests the creation of a IPv4 header */ - if ((value & 0x000100) || (value & 0x000400) || (value & 0x001000)) { + if ((value & 0x0100) || (value & 0x0400) || (value & 0x1000)) { proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; } @@ -4476,7 +4632,7 @@ dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree * q to (q+15) IPv6 * The IPv6 Address field shall be present if the Outer Header Creation Description requests the creation of a IPv6 header */ - if ((value & 0x000200) || (value & 0x000800) || (value & 0x002000)) { + if ((value & 0x0200) || (value & 0x0800) || (value & 0x2000)) { proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_ipv6, tvb, offset, 16, ENC_NA); offset += 16; } @@ -4485,7 +4641,7 @@ dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree * r to (r+1) Port Number * The Port Number field shall be present if the Outer Header Creation Description requests the creation of a UDP/IP header */ - if ((value & 0x000400) || (value & 0x000800)) { + if ((value & 0x0400) || (value & 0x0800)) { proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_port, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; } @@ -4494,7 +4650,7 @@ dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree * t to (t+2) C-TAG * The C-TAG field shall be present if the Outer Header Creation Description requests the setting of the C-Tag in Ethernet packet */ - if (value & 0x004000) { + if (value & 0x4000) { offset = decode_pfcp_c_tag(tvb, pinfo, tree, item, offset); } @@ -4502,7 +4658,7 @@ dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree * u to (u+2) S-TAG * The S-TAG field shall be present if the Outer Header Creation Description requests the setting of the S-Tag in Ethernet packet */ - if (value & 0x008000) { + if (value & 0x8000) { offset = decode_pfcp_s_tag(tvb, pinfo, tree, item, offset); } @@ -4572,11 +4728,12 @@ dissect_pfcp_cp_function_features(tvbuff_t *tvb, packet_info *pinfo, proto_tree } static int * const pfcp_cp_function_features_o6_flags[] = { - &hf_pfcp_spare_b7_b1, + &hf_pfcp_spare_b7_b2, + &hf_pfcp_cp_function_features_o6_b1_rpgur, &hf_pfcp_cp_function_features_o6_b0_psucc, NULL }; - /* Octet 6 Spare Spare Spare Spare Spare Spare Spare PSUCC */ + /* Octet 6 Spare Spare Spare Spare Spare Spare RPGUR PSUCC */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_cp_function_features_o6_flags, ENC_BIG_ENDIAN); offset++; @@ -4603,8 +4760,7 @@ dissect_pfcp_usage_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr NULL }; /* Octet 5 Spare UBE UAE AFT BEF */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_usage_information, - ett_pfcp_usage_information, pfcp_usage_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_usage_information_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -4664,7 +4820,7 @@ dissect_pfcp_flow_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, p * 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_flow_desc, tvb, offset, len, ENC_ASCII|ENC_NA); + proto_tree_add_item(tree, hf_pfcp_flow_desc, tvb, offset, len, ENC_ASCII); offset += len; if (offset < length) { @@ -4699,8 +4855,7 @@ dissect_pfcp_ue_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, NULL }; /* Octet 5 Spare IPV6PL CHV6 CHV4 IPv6D S/D V4 V6*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_ue_ip_address_flags, - ett_pfcp_ue_ip_address_flags, pfcp_ue_ip_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &ue_ip_address_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_ue_ip_address_flags, ENC_BIG_ENDIAN, &ue_ip_address_flags); offset += 1; /* IPv4 address (if present)*/ @@ -4715,10 +4870,8 @@ dissect_pfcp_ue_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } /* IPv6 Prefix Delegation Bits (if present)*/ if ((ue_ip_address_flags & 0x8)) { - proto_tree_add_item(tree, hf_pfcp_ue_ip_add_ipv6_prefix, tvb, offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_pfcp_ue_ip_add_ipv6_prefix_delegation_bits, tvb, offset, 1, ENC_NA); offset += 1; - proto_tree_add_item(tree, hf_pfcp_ue_ip_add_ipv6pd, tvb, offset, 16, ENC_NA); - offset += 16; } /* IPv6 Prefix Lengths (if present)*/ if ((ue_ip_address_flags & 0x40)) { @@ -4757,8 +4910,7 @@ dissect_pfcp_packet_rate(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pr NULL }; /* Octet 5 Spare DLPR ULPR */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_packet_rate, - ett_pfcp_packet_rate, pfcp_packet_rate_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_packet_rate_flags, ENC_BIG_ENDIAN, &flags); offset += 1; /* Bit 1 - ULPR (Uplink Packet Rate): If this bit is set to "1", then octets m to (m+2) shall be present */ @@ -4822,8 +4974,8 @@ static const value_string pfcp_out_hdr_desc_vals[] = { { 4, "IPv4" }, { 5, "IPv6 " }, { 6, "GTP-U/UDP/IP" }, - { 7, "VLAN S-TAG" }, - { 8, "S-TAG and C-TAG" }, + { 7, "VLAN TAG POP" }, + { 8, "VLAN TAGs POP-POP" }, { 0, NULL } }; @@ -4890,8 +5042,7 @@ dissect_pfcp_dl_flow_level_marking(tvbuff_t *tvb, packet_info *pinfo _U_, proto_ NULL }; /* Octet 5 Spare SCI TTC*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_dl_flow_level_marking, - ett_pfcp_pfcp_dl_flow_level_marking, pfcp_dl_flow_level_marking_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_dl_flow_level_marking_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; /* Bit 1 - TTC (ToS/Traffic Class): If this bit is set to "1", @@ -4989,8 +5140,7 @@ dissect_pfcp_measurement_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre NULL }; /* Octet 5 CIAM ASPOC SSPOC MNOP ISTM INAM MBQE */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_measurement_info, - ett_pfcp_measurement_info, pfcp_measurement_info_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_measurement_info_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -5007,16 +5157,17 @@ dissect_pfcp_node_report_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre int offset = 0; static int * const pfcp_node_report_type_flags[] = { - &hf_pfcp_spare_b7_b1, + &hf_pfcp_spare_b7_b6, + &hf_pfcp_node_report_type_b5_vsr, + &hf_pfcp_node_report_type_b4_purr, &hf_pfcp_node_report_type_b3_gpqr, &hf_pfcp_node_report_type_b2_ckdr, &hf_pfcp_node_report_type_b1_uprr, &hf_pfcp_node_report_type_b0_upfr, NULL }; - /* Octet 5 Spare GPQR CKDR UPRR MBQE */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_node_report_type, - ett_pfcp_node_report_type, pfcp_node_report_type_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + /* Octet 5 Spare VSR PURR GPQR CKDR UPRR MBQE */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_node_report_type_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -5035,16 +5186,16 @@ dissect_pfcp_remote_gtp_u_peer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr guint32 length_di, length_ni; static int * const pfcp_remote_gtp_u_peer_flags[] = { - &hf_pfcp_spare_b7_b4, + &hf_pfcp_spare_b7_b5, + &hf_pfcp_remote_gtp_u_peer_flags_b4_rts, &hf_pfcp_remote_gtp_u_peer_flags_b3_ni, &hf_pfcp_remote_gtp_u_peer_flags_b2_di, &hf_pfcp_remote_gtp_u_peer_flags_b1_v4, &hf_pfcp_remote_gtp_u_peer_flags_b0_v6, NULL }; - /* Octet 5 Spare NI DI V4 V6*/ - 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); + /* Octet 5 Spare RTS NI DI V4 V6*/ + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_remote_gtp_u_peer_flags, ENC_BIG_ENDIAN, &flags); offset += 1; /* IPv4 address (if present)*/ @@ -5077,6 +5228,11 @@ dissect_pfcp_remote_gtp_u_peer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr /* Network Instance */ offset += decode_pfcp_network_instance(tvb, pinfo, tree, item, offset, length_ni); } + /* RTS (if present)*/ + if (flags & 0x8) { + proto_tree_add_item(tree, hf_pfcp_remote_gtp_u_peer_time_stamp, tvb, offset, 4, ENC_TIME_NTP | ENC_BIG_ENDIAN); + offset += 4; + } if (offset < length) { proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); @@ -5222,8 +5378,7 @@ dissect_pfcp_oci_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, prot NULL }; /* Octet 5 Spare AOCI */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_oci_flags, - ett_pfcp_oci_flags, pfcp_oci_flags_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_oci_flags_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -5241,13 +5396,13 @@ dissect_pfcp_pfcp_assoc_rel_req(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t int offset = 0; static int * const pfcp_pfcp_assoc_rel_req_flags[] = { - &hf_pfcp_spare_b7_b1, + &hf_pfcp_spare_b7_b2, + &hf_pfcp_pfcp_assoc_rel_req_b1_urss, &hf_pfcp_pfcp_assoc_rel_req_b0_sarr, NULL }; - /* Octet 5 Spare SARR */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcp_assoc_rel_req_flags, - ett_pfcp_assoc_rel_req_flags, pfcp_pfcp_assoc_rel_req_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + /* Octet 5 Spare URSS SARR */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_pfcp_assoc_rel_req_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -5492,8 +5647,7 @@ dissect_pfcp_user_plane_ip_resource_infomation(tvbuff_t *tvb, packet_info *pinfo NULL }; /* Octet 5 Spare ASSOSI ASSONI TEIDRI TEIDRI TEIDRI V6 V4*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_upiri_flags, - ett_pfcp_upiri_flags, pfcp_upiri_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &upiri_flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_upiri_flags, ENC_BIG_ENDIAN, &upiri_flags_val); /* The following flags are coded within Octet 5: * Bit 1 - V4: If this bit is set to "1" and the CH bit is not set, then the IPv4 address field shall be present, @@ -5619,8 +5773,7 @@ dissect_pfcp_subsequent_volume_quota(tvbuff_t *tvb, packet_info *pinfo, proto_tr 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); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_subsequent_volume_quota_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; /* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value. @@ -5766,8 +5919,7 @@ dissect_pfcp_additional_usage_reports_information(tvbuff_t *tvb, packet_info *pi &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); + proto_tree_add_bitmask_list(tree, tvb, offset, 2, pfcp_additional_usage_reports_information_flags, ENC_BIG_ENDIAN); offset += 2; if (offset < length) { @@ -5808,8 +5960,7 @@ static void dissect_pfcp_mac_address(tvbuff_t *tvb, packet_info *pinfo, proto_tr NULL }; /* Octet 5 Spare EDES USOU DEST SOUR */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_mac_address_flags, - ett_pfcp_mac_address, pfcp_mac_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_mac_address_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; // Octets "m to (m+5)" or "n to (n+5)" and "o to (o+5)" or "p to (p+5)", if present, @@ -5913,8 +6064,7 @@ static void dissect_pfcp_proxying(tvbuff_t *tvb, packet_info *pinfo, proto_tree NULL }; /* Octet 5 Spare INS ARP */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_proxying_flags, - ett_pfcp_proxying, pfcp_proxying_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_proxying_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; if (offset < length) { @@ -5953,8 +6103,7 @@ static void dissect_pfcp_ethernet_filter_properties(tvbuff_t *tvb, packet_info * NULL }; /* Octet 5 Spare BIDE */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_ethertype_filter_properties_flags, - ett_pfcp_ethernet_filter_properties, pfcp_ethernet_filter_properties_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_ethernet_filter_properties_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; if (offset < length) { @@ -6003,8 +6152,7 @@ static void dissect_pfcp_user_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree * NULL }; /* Octet 5 Spare IMEIF IMSIF */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_user_id_flags, - ett_pfcp_user_id, pfcp_user_id_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_user_id_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; /* Bit 1 - IMSIF: If this bit is set to "1", then the Length of IMSI and IMSI fields shall be present */ @@ -6028,7 +6176,7 @@ static void dissect_pfcp_user_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree * * a default digit set of 0-9 returning "?" for overdecadic digits a pointer to the EP * allocated string will be returned. */ - proto_tree_add_item(tree, hf_pfcp_user_id_imei, tvb, offset, length_imei, ENC_BCD_DIGITS_0_9); + proto_tree_add_item(tree, hf_pfcp_user_id_imei, tvb, offset, length_imei, ENC_BCD_DIGITS_0_9|ENC_LITTLE_ENDIAN); offset += length_imei; } @@ -6048,7 +6196,7 @@ static void dissect_pfcp_user_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree * proto_tree_add_item_ret_uint(tree, hf_pfcp_user_id_length_of_nai, tvb, offset, 1, ENC_BIG_ENDIAN, &length_nai); offset += 1; /* (f+1) to g NAI */ - proto_tree_add_item(tree, hf_pfcp_user_id_nai, tvb, offset, length_nai, ENC_ASCII|ENC_NA); + proto_tree_add_item(tree, hf_pfcp_user_id_nai, tvb, offset, length_nai, ENC_ASCII); offset += length_nai; } @@ -6058,7 +6206,7 @@ static void dissect_pfcp_user_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree * proto_tree_add_item_ret_uint(tree, hf_pfcp_user_id_length_of_supi, tvb, offset, 1, ENC_BIG_ENDIAN, &length_supi); offset += 1; /* (f+1) to g SUPI */ - proto_tree_add_item(tree, hf_pfcp_user_id_supi, tvb, offset, length_supi, ENC_ASCII|ENC_NA); + proto_tree_add_item(tree, hf_pfcp_user_id_supi, tvb, offset, length_supi, ENC_ASCII); offset += length_supi; } @@ -6068,7 +6216,7 @@ static void dissect_pfcp_user_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree * proto_tree_add_item_ret_uint(tree, hf_pfcp_user_id_length_of_gpsi, tvb, offset, 1, ENC_BIG_ENDIAN, &length_gpsi); offset += 1; /* (f+1) to g GPSI */ - proto_tree_add_item(tree, hf_pfcp_user_id_gpsi, tvb, offset, length_gpsi, ENC_ASCII|ENC_NA); + proto_tree_add_item(tree, hf_pfcp_user_id_gpsi, tvb, offset, length_gpsi, ENC_ASCII); offset += length_gpsi; } @@ -6078,7 +6226,7 @@ static void dissect_pfcp_user_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree * proto_tree_add_item_ret_uint(tree, hf_pfcp_user_id_length_of_pei, tvb, offset, 1, ENC_BIG_ENDIAN, &length_pei); offset += 1; /* (f+1) to g PEI */ - proto_tree_add_item(tree, hf_pfcp_user_id_pei, tvb, offset, length_pei, ENC_ASCII|ENC_NA); + proto_tree_add_item(tree, hf_pfcp_user_id_pei, tvb, offset, length_pei, ENC_ASCII); offset += length_pei; } @@ -6101,8 +6249,7 @@ static void dissect_pfcp_ethernet_pdu_session_information(tvbuff_t *tvb, packet_ NULL }; /* Octet 5 Spare ETHI */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_ethernet_pdu_session_information_flags, - ett_pfcp_ethernet_pdu_session_information, pfcp_ethernet_pdu_session_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_ethernet_pdu_session_information_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -6340,7 +6487,7 @@ dissect_pfcp_framed_route(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre * MUST NOT affect operation of the protocol. It is recommended that * the message contain UTF-8 encoded 10646 [7] characters. */ - proto_tree_add_item(tree, hf_pfcp_framed_route, tvb, 0, length, ENC_UTF_8|ENC_NA); + proto_tree_add_item(tree, hf_pfcp_framed_route, tvb, 0, length, ENC_UTF_8); } /* @@ -6366,7 +6513,7 @@ dissect_pfcp_framed_ipv6_route(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree * RFC 3162 * "...It is intended to be human readable..." */ - proto_tree_add_item(tree, hf_pfcp_framed_ipv6_route, tvb, 0, length, ENC_UTF_8|ENC_NA); + proto_tree_add_item(tree, hf_pfcp_framed_ipv6_route, tvb, 0, length, ENC_UTF_8); } /* @@ -6535,6 +6682,9 @@ static const value_string pfcp_tgpp_interface_type_vals[] = { { 26, "Sxc-U" }, { 27, "N4-U" }, { 28, "SGW/UPF GTP-U interface for UL data forwarding" }, + { 29, "N6mb/Nmb9" }, + { 30, "N3mb" }, + { 31, "N19mb" }, { 0, NULL } }; @@ -6570,8 +6720,7 @@ dissect_pfcp_pfcpsrreq_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree NULL }; /* Octet 5 Spare Spare Spare Spare Spare Spare Spare PSDBU */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpsrreq_flags, - ett_pfcp_pfcpsrreq, pfcp_pfcpsrreq_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_pfcpsrreq_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -6594,8 +6743,7 @@ dissect_pfcp_pfcpaureq_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree NULL }; /* Octet 5 Spare Spare Spare Spare Spare Spare Spare PSDBU */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpaureq_flags, - ett_pfcp_pfcpaureq, pfcp_pfcpaureq_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_pfcpaureq_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -6699,6 +6847,7 @@ static const value_string pfcp_steering_mode_vals[] = { { 1, "Smallest Delay" }, { 2, "Load Balancing" }, { 3, "Priority-based" }, + { 4, "Redundant" }, { 0, NULL } }; @@ -6743,6 +6892,8 @@ static const value_string pfcp_priority_vals[] = { { 2, "No Standby" }, { 3, "High" }, { 4, "Low" }, + { 5, "Primary" }, + { 6, "Secondary" }, { 0, NULL } }; @@ -6799,13 +6950,13 @@ dissect_pfcp_alternative_smf_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto static int * const pfcp_alternative_smf_ip_address_flags[] = { &hf_pfcp_spare_b7_b2, + &hf_pfcp_alternative_smf_ip_address_flags_ppe, &hf_pfcp_b1_v4, &hf_pfcp_b0_v6, NULL }; - /* Octet 5 Spare V4 V6 */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_pfcp_alternative_smf_ip_address_flags, - ett_pfcp_alternative_smf_ip_address_flags, pfcp_alternative_smf_ip_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &alternative_smf_ip_address_flags); + /* Octet 5 Spare PPE V4 V6 */ + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_alternative_smf_ip_address_flags, ENC_BIG_ENDIAN, &alternative_smf_ip_address_flags); offset += 1; /* IPv4 address (if present) */ @@ -6843,8 +6994,7 @@ dissect_pfcp_packet_replication_and_detection_carry_on_information(tvbuff_t *tvb NULL }; /* Octet 5 Spare Spare Spare Spare DCARONI PRIN6I PRIN19I PRIUEAI */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_packet_replication_and_detection_carry_on_information_flags, - ett_pfcp_packet_replication_and_detection_carry_on_information, pfcp_packet_replication_and_detection_carry_on_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_packet_replication_and_detection_carry_on_information_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -6880,6 +7030,8 @@ dissect_pfcp_quota_validity_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree * { int offset = 0; guint value; + nstime_t quvti; + proto_item *pi; /* The Quota Validity Time value shall be encoded as an Unsigned32 binary integer value. */ proto_tree_add_item_ret_uint(tree, hf_pfcp_validity_time_value, tvb, offset, 4, ENC_BIG_ENDIAN, &value); @@ -6887,6 +7039,11 @@ dissect_pfcp_quota_validity_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree * proto_item_append_text(item, "%u", value); + nstime_copy(&quvti, &(pinfo->abs_ts)); + quvti.secs += value; + pi = proto_tree_add_time(tree, hf_pfcp_validity_time_str, tvb, 0, 0, &quvti); + proto_item_set_generated(pi); + if (offset < length) { proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); } @@ -6900,7 +7057,7 @@ dissect_pfcp_number_of_reports(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree { guint value; - /* Number of Reports, an Unigned16 binary integer value excluding the first value "0". */ + /* Number of Reports, an Unsigned16 binary integer value excluding the first value "0". */ proto_tree_add_item_ret_uint(tree, hf_pfcp_number_of_reports, tvb, 0, length, ENC_BIG_ENDIAN, &value); proto_item_append_text(item, "%u", value); } @@ -6920,8 +7077,7 @@ dissect_pfcp_pfcpasrsp_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree NULL }; /* Octet 5 Spare UUPSI PSREI */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpasrsp_flags_flags, - ett_pfcp_pfcpasrsp_flags, pfcp_pfcpasrsp_flags_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_pfcpasrsp_flags_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -6945,8 +7101,7 @@ dissect_pfcp_cp_pfcp_entity_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_ NULL }; /* Octet 5 Spare V4 V6 */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_cp_pfcp_entity_ip_address_flags, - ett_pfcp_cp_pfcp_entity_ip_address_flags, pfcp_cp_pfcp_entity_ip_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &cp_pfcp_entity_ip_address_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_cp_pfcp_entity_ip_address_flags, ENC_BIG_ENDIAN, &cp_pfcp_entity_ip_address_flags); offset += 1; /* IPv4 address (if present) */ @@ -6982,8 +7137,7 @@ dissect_pfcp_pfcpsereq_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree NULL }; /* Octet 5 Spare SUMPC RESTI */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpsereq_flags_flags, - ett_pfcp_pfcpsereq_flags, pfcp_pfcpsereq_flags_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_pfcpsereq_flags_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -7009,8 +7163,7 @@ dissect_pfcp_ip_multicast_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree NULL }; /* Octet 5 Spare A(Any) R(Range) V4 V6 */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_ip_multicast_address_flags, - ett_pfcp_ip_multicast_address_flags, pfcp_ip_multicast_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &ip_multicast_address_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_ip_multicast_address_flags, ENC_BIG_ENDIAN, &ip_multicast_address_flags); offset += 1; /* Any: If this bit is set to "1", this indicates any IP multicast address; in this case, no IP address field shall be included. */ @@ -7062,8 +7215,7 @@ dissect_pfcp_source_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr NULL }; /* Octet 5 Spare V4 V6 */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_source_ip_address_flags, - ett_pfcp_source_ip_address_flags, pfcp_source_ip_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &source_ip_address_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_source_ip_address_flags, ENC_BIG_ENDIAN, &source_ip_address_flags); offset += 1; /* IPv4 address (if present) */ @@ -7080,9 +7232,9 @@ dissect_pfcp_source_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr } /* Mask/Prefix Length (if present) */ if ((source_ip_address_flags & 0x4)) { - proto_tree_add_item(tree, hf_pfcp_source_ip_address_mask_prefix_lengt, tvb, offset, 16, ENC_NA); - proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset)); - offset += 16; + proto_tree_add_item(tree, hf_pfcp_source_ip_address_mask_prefix_lengt, tvb, offset, 1, ENC_NA); + proto_item_append_text(item, ", Mask/Prefix length %s", tvb_ip6_to_str(pinfo->pool, tvb, offset)); + offset += 1; } @@ -7108,8 +7260,7 @@ dissect_pfcp_packet_rate_status(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t NULL }; /* Octet 5 Spare APR DL UL*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_packet_rate_status_flags, - ett_pfcp_packet_rate_status, pfcp_packet_rate_status_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_packet_rate_status_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; @@ -7146,21 +7297,21 @@ dissect_pfcp_packet_rate_status(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t } /* - * 8.2.140 Create Bridge Info for TSC + * 8.2.140 Create Bridge/Router Info */ static void -dissect_pfcp_create_bridge_info_for_tsc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +dissect_pfcp_create_bridge_router_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) { int offset = 0; - static int * const pfcp_create_bridge_info_for_tsc_flags[] = { - &hf_pfcp_spare_b7_b1, - &hf_pfcp_create_bridge_info_for_tsc_flags_b0_bii, + static int * const pfcp_create_bridge_router_info_flags[] = { + &hf_pfcp_spare_b7_b2, + &hf_pfcp_create_bridge_router_info_flags_b1_rii, + &hf_pfcp_create_bridge_router_info_flags_b0_bii, NULL }; - /* Octet 5 Spare BII */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_create_bridge_info_for_tsc_flags, - ett_pfcp_create_bridge_info_for_tsc, pfcp_create_bridge_info_for_tsc_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + /* Octet 5 Spare RII BII */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_create_bridge_router_info_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -7169,15 +7320,15 @@ dissect_pfcp_create_bridge_info_for_tsc(tvbuff_t *tvb, packet_info *pinfo, proto } /* - * 8.2.141 DS-TT Port Number + * 8.2.141 Port Number */ static void -dissect_pfcp_ds_tt_port_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +dissect_pfcp_port_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) { guint value; - /* The DS-TT Port Number shall contain one Port Number value */ - proto_tree_add_item_ret_uint(tree, hf_pfcp_ds_tt_port_number, tvb, 0, length, ENC_BIG_ENDIAN, &value); + /* The Port Number shall contain one Port Number value */ + proto_tree_add_item_ret_uint(tree, hf_pfcp_port_number, tvb, 0, length, ENC_BIG_ENDIAN, &value); proto_item_append_text(item, "%u", value); } @@ -7195,29 +7346,28 @@ dissect_pfcp_nw_tt_port_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree } /* - * 8.2.143 5GS User Plane Node + * 8.2.143 5GS User Plane Node ID */ static void -dissect_pfcp_5gs_user_plane_node(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +dissect_pfcp_5gs_user_plane_node_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) { int offset = 0; guint64 flags_val; - static int * const pfcp_5gs_user_plane_node_flags[] = { + static int * const pfcp_5gs_user_plane_node_id_flags[] = { &hf_pfcp_spare_b7_b4, - &hf_pfcp_5gs_user_plane_node_flags_b0_bid, + &hf_pfcp_5gs_user_plane_node_id_flags_b0_bid, NULL }; /* Octet 5 Spare BID */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_5gs_user_plane_node_flags, - ett_pfcp_5gs_user_plane_node, pfcp_5gs_user_plane_node_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_5gs_user_plane_node_id_flags, ENC_BIG_ENDIAN, &flags_val); offset += 1; // Bit 1 – BID: If this bit is set to "1", then the Use Plane value field shall be present, // The Bridge ID value is defined in IEEE.802.1Q clause 14.2.5 and value shall be encoded as an Unisigned64 binary integer. if ((flags_val & 0x1)) { - proto_tree_add_item(tree, hf_pfcp_5gs_user_plane_node_value, tvb, offset, 6, ENC_NA); - offset += 6; + proto_tree_add_item(tree, hf_pfcp_5gs_user_plane_node_id_value, tvb, offset, 8, ENC_BIG_ENDIAN); + offset += 8; } if (offset < length) { @@ -7250,8 +7400,7 @@ dissect_pfcp_requested_clock_drift_control_information(tvbuff_t *tvb, packet_inf NULL }; /* Octet 5 Spare BII */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_requested_clock_drift_control_information_flags, - ett_pfcp_requested_clock_drift_control_information, pfcp_requested_clock_drift_control_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_requested_clock_drift_control_information_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -7377,8 +7526,7 @@ dissect_pfcp_requested_access_availability_control_information(tvbuff_t *tvb, pa NULL }; /* Octet 5 Spare RRCA */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_requested_access_availability_control_information_flags, - ett_pfcp_requested_access_availability_control_information, pfcp_requested_access_availability_control_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_requested_access_availability_control_information_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -7432,8 +7580,7 @@ dissect_pfcp_mptcp_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_ NULL }; /* Octet 5 Spare RRCA */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_mptcp_control_information_flags, - ett_pfcp_mptcp_control_information, pfcp_mptcp_control_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_mptcp_control_information_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -7455,8 +7602,7 @@ dissect_pfcp_atsss_ll_control_information(tvbuff_t *tvb, packet_info *pinfo, pro NULL }; /* Octet 5 Spare RRCA */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_atsss_ll_control_information_flags, - ett_pfcp_atsss_ll_control_information, pfcp_atsss_ll_control_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_atsss_ll_control_information_flags, ENC_BIG_ENDIAN); offset += 1; @@ -7483,8 +7629,7 @@ dissect_pfcp_pmf_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tr NULL }; /* Octet 5 Spare PQPM DRTTI RRCA */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_pmf_control_information_flags, - ett_pfcp_pmf_control_information, pfcp_pmf_control_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_pmf_control_information_flags, ENC_BIG_ENDIAN, &flags); offset += 1; /* QFI */ @@ -7521,8 +7666,7 @@ dissect_pfcp_mptcp_address_information(tvbuff_t *tvb, packet_info *pinfo, proto_ NULL }; /* Octet 5 Spare V6 V4 */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_mptcp_address_information_flags, - ett_pfcp_mptcp_entity_ip_address_information, pfcp_mptcp_ip_address_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &mptcp_address_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_mptcp_ip_address_information_flags, ENC_BIG_ENDIAN, &mptcp_address_flags); offset += 1; /* Octet 6 MPTCP Proxy Type */ @@ -7552,46 +7696,45 @@ dissect_pfcp_mptcp_address_information(tvbuff_t *tvb, packet_info *pinfo, proto_ } /* - * 8.2.158 UE Link-Specific IP Address + * 8.2.158 Link-Specific Multipath IP Address */ static void -dissect_pfcp_ue_link_specific_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +dissect_pfcp_link_specific_multipath_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) { int offset = 0; - guint64 ue_link_specific_ip_address_flags; + guint64 link_specific_multipath_ip_address_flags; - static int * const pfcp_ue_link_specific_ip_address_flags[] = { + static int * const pfcp_link_specific_multipath_ip_address_flags[] = { &hf_pfcp_spare_b7_b4, - &hf_pfcp_ue_link_specific_ip_address_flags_b3_nv6, - &hf_pfcp_ue_link_specific_ip_address_flags_b2_nv4, - &hf_pfcp_ue_link_specific_ip_address_flags_b1_v6, - &hf_pfcp_ue_link_specific_ip_address_flags_b0_v4, + &hf_pfcp_link_specific_multipath_ip_address_flags_b3_nv6, + &hf_pfcp_link_specific_multipath_ip_address_flags_b2_nv4, + &hf_pfcp_link_specific_multipath_ip_address_flags_b1_v6, + &hf_pfcp_link_specific_multipath_ip_address_flags_b0_v4, NULL }; /* Octet 5 Spare NV6 NV4 V6 V4 */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_ue_link_specific_ip_address_flags, - ett_pfcp_ue_link_specific_entity_ip_address, pfcp_ue_link_specific_ip_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &ue_link_specific_ip_address_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_link_specific_multipath_ip_address_flags, ENC_BIG_ENDIAN, &link_specific_multipath_ip_address_flags); offset += 1; - /* UE Link-Specific IPv4 Address for 3GPP Access (if present) */ - if ((ue_link_specific_ip_address_flags & 0x1)) { - proto_tree_add_item(tree, hf_pfcp_ue_link_specific_ip_address_3gpp_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN); + /* Link-Specific Multipath IPv4 Address for 3GPP Access (if present) */ + if ((link_specific_multipath_ip_address_flags & 0x1)) { + proto_tree_add_item(tree, hf_pfcp_link_specific_multipath_ip_address_3gpp_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; } - /* UE Link-Specific IPv6 Address for 3GPP Access (if present) */ - if ((ue_link_specific_ip_address_flags & 0x2)) { - proto_tree_add_item(tree, hf_pfcp_ue_link_specific_ip_address_3gpp_ipv6, tvb, offset, 16, ENC_NA); + /* Link-Specific Multipath IPv6 Address for 3GPP Access (if present) */ + if ((link_specific_multipath_ip_address_flags & 0x2)) { + proto_tree_add_item(tree, hf_pfcp_link_specific_multipath_ip_address_3gpp_ipv6, tvb, offset, 16, ENC_NA); offset += 16; } - /* UE Link-Specific IPv4 Address for Non-3GPP Access (if present) */ - if ((ue_link_specific_ip_address_flags & 0x1)) { - proto_tree_add_item(tree, hf_pfcp_ue_link_specific_ip_address_non3gpp_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN); + /* Link-Specific Multipath IPv4 Address for Non-3GPP Access (if present) */ + if ((link_specific_multipath_ip_address_flags & 0x1)) { + proto_tree_add_item(tree, hf_pfcp_link_specific_multipath_ip_address_non3gpp_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; } - /* UE Link-Specific IPv6 Address for Non-3GPP Access (if present) */ - if ((ue_link_specific_ip_address_flags & 0x2)) { - proto_tree_add_item(tree, hf_pfcp_ue_link_specific_ip_address_non3gpp_ipv6, tvb, offset, 16, ENC_NA); + /* Link-Specific Multipath IPv6 Address for Non-3GPP Access (if present) */ + if ((link_specific_multipath_ip_address_flags & 0x2)) { + proto_tree_add_item(tree, hf_pfcp_link_specific_multipath_ip_address_non3gpp_ipv6, tvb, offset, 16, ENC_NA); offset += 16; } if (offset < length) { @@ -7616,8 +7759,7 @@ dissect_pfcp_pmf_address_information(tvbuff_t *tvb, packet_info *pinfo, proto_tr NULL }; /* Octet 5 Spare MAC V6 V4 */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_pmf_address_information_flags, - ett_pfcp_pmf_address_information, pfcp_pmf_address_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &pmf_address_information_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_pmf_address_information_flags, ENC_BIG_ENDIAN, &pmf_address_information_flags); offset += 1; /* p to (p+3) PMF IPv4 address (if present) */ @@ -7669,8 +7811,7 @@ dissect_pfcp_atsss_ll_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree NULL }; /* Octet 5 Spare LLI */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_atsss_ll_information_flags, - ett_pfcp_atsss_ll_information, pfcp_atsss_ll_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_atsss_ll_information_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -7759,8 +7900,7 @@ dissect_pfcp_qos_report_trigger(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t NULL }; /* Octet 5 Spare IRE THR PER */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_qos_report_trigger_flags, - ett_pfcp_qos_report_trigger, pfcp_qos_report_trigger_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_qos_report_trigger_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -7783,8 +7923,7 @@ dissect_pfcp_gtp_u_path_interface_type(tvbuff_t *tvb, packet_info *pinfo, proto_ NULL }; /* Octet 5 Spare N3 N9 */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_gtp_u_path_interface_type_flags, - ett_pfcp_gtp_u_path_interface_type, pfcp_gtp_u_path_interface_type_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_gtp_u_path_interface_type_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -7801,16 +7940,18 @@ dissect_pfcp_requested_qos_monitoring(tvbuff_t *tvb, packet_info *pinfo, proto_t int offset = 0; static int * const pfcp_requested_qos_monitoring_flags[] = { - &hf_pfcp_spare_b7_b4, + &hf_pfcp_requested_qos_monitoring_flags_b7_ulpr, + &hf_pfcp_requested_qos_monitoring_flags_b6_dlpr, + &hf_pfcp_requested_qos_monitoring_flags_b5_ulci, + &hf_pfcp_requested_qos_monitoring_flags_b4_dlci, &hf_pfcp_requested_qos_monitoring_flags_b3_gtpupm, - &hf_pfcp_requested_qos_monitoring_flags_b2_rp, - &hf_pfcp_requested_qos_monitoring_flags_b1_ul, - &hf_pfcp_requested_qos_monitoring_flags_b0_dl, + &hf_pfcp_requested_qos_monitoring_flags_b2_rppd, + &hf_pfcp_requested_qos_monitoring_flags_b1_ulpd, + &hf_pfcp_requested_qos_monitoring_flags_b0_dlpd, NULL }; - /* Octet 5 Spare GTPUPM RP Ul DL */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_requested_qos_monitoring_flags, - ett_pfcp_requested_qos_monitoring, pfcp_requested_qos_monitoring_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + /* Octet 5 ULPR DLPR ULCI DLCI GTPUPM RPPD UlPD DLPD */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_requested_qos_monitoring_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -7834,8 +7975,7 @@ dissect_pfcp_reporting_frequency(tvbuff_t *tvb, packet_info *pinfo, proto_tree * NULL }; /* Octet 5 Spare RP Ul DL */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_reporting_frequency_flags, - ett_pfcp_reporting_frequency, pfcp_reporting_frequency_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_reporting_frequency_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -7860,8 +8000,7 @@ dissect_pfcp_packet_delay_thresholds(tvbuff_t *tvb, packet_info *pinfo, proto_tr NULL }; /* Octet 5 Spare RP Ul DL */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_packet_delay_thresholds_flags, - ett_pfcp_packet_delay_thresholds, pfcp_packet_delay_thresholds_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &packet_delay_thresholds_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_packet_delay_thresholds_flags, ENC_BIG_ENDIAN, &packet_delay_thresholds_flags); offset += 1; /* m to (m+3) Downlink packet delay threshold */ @@ -7914,27 +8053,28 @@ dissect_pfcp_qos_monitoring_measurement(tvbuff_t *tvb, packet_info *pinfo, proto guint64 qos_monitoring_measurement_flags; static int * const pfcp_qos_monitoring_measurement_flags[] = { - &hf_pfcp_spare_b7_b4, + &hf_pfcp_spare_b7_b5, + &hf_pfcp_qos_monitoring_measurement_flags_b5_ulci, + &hf_pfcp_qos_monitoring_measurement_flags_b4_dlci, &hf_pfcp_qos_monitoring_measurement_flags_b3_plmf, - &hf_pfcp_qos_monitoring_measurement_flags_b2_rp, - &hf_pfcp_qos_monitoring_measurement_flags_b1_ul, - &hf_pfcp_qos_monitoring_measurement_flags_b0_dl, + &hf_pfcp_qos_monitoring_measurement_flags_b2_rppd, + &hf_pfcp_qos_monitoring_measurement_flags_b1_ulpd, + &hf_pfcp_qos_monitoring_measurement_flags_b0_dlpd, NULL }; - /* Octet 5 Spare RP Ul DL */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_qos_monitoring_measurement_flags, - ett_pfcp_qos_monitoring_measurement, pfcp_qos_monitoring_measurement_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &qos_monitoring_measurement_flags); + /* Octet 5 Spare CI PLMF RP Ul DL */ + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_qos_monitoring_measurement_flags, ENC_BIG_ENDIAN, &qos_monitoring_measurement_flags); offset += 1; /* m to (m+3) Downlink packet delay threshold */ if ((qos_monitoring_measurement_flags & 0x1)) { - proto_tree_add_item(tree, hf_pfcp_qos_monitoring_measurement_downlink, tvb, offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_pfcp_qos_monitoring_measurement_downlink_packet_delay, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; } /* p to (p+3) Uplink packet delay threshold */ if ((qos_monitoring_measurement_flags & 0x2)) { - proto_tree_add_item(tree, hf_pfcp_qos_monitoring_measurement_uplink, tvb, offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_pfcp_qos_monitoring_measurement_uplink_packet_delay, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; } @@ -7944,6 +8084,29 @@ dissect_pfcp_qos_monitoring_measurement(tvbuff_t *tvb, packet_info *pinfo, proto offset += 4; } + /* r Downlink Congestion information */ + if ((qos_monitoring_measurement_flags & 0x10)) { + proto_tree_add_item(tree, hf_pfcp_qos_monitoring_measurement_downlink_congestion_information, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + } + + /* r Uplink Congestion information */ + if ((qos_monitoring_measurement_flags & 0x20)) { + proto_tree_add_item(tree, hf_pfcp_qos_monitoring_measurement_uplink_congestion_information, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + } + + /* m to (m+3) Downlink packet rate */ + if ((qos_monitoring_measurement_flags & 0x40)) { + proto_tree_add_item(tree, hf_pfcp_qos_monitoring_measurement_downlink_packet_rate, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + } + + /* p to (p+3) Uplink packet rate */ + if ((qos_monitoring_measurement_flags & 0x80)) { + proto_tree_add_item(tree, hf_pfcp_qos_monitoring_measurement_uplink_packet_rate, 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, length); } @@ -7963,8 +8126,7 @@ dissect_pfcp_mt_edt_control_information(tvbuff_t *tvb, packet_info *pinfo, proto NULL }; /* Octet 5 Spare RDSI */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_mt_edt_control_information_flags, - ett_pfcp_monitoring_measurement, pfcp_mt_edt_control_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_mt_edt_control_information_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -8060,8 +8222,7 @@ dissect_pfcp_ip_version(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro NULL }; /* Octet 5 Spare V6 V4 */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_ip_version_flags, - ett_pfcp_ip_version, pfcp_ip_version_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_ip_version_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -8083,8 +8244,7 @@ dissect_pfcp_pfcpasreq_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree NULL }; /* Octet 5 Spare UUPSI */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpasreq_flags_flags, - ett_pfcp_pfcpasreq_flags, pfcp_pfcpasreq_flags_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_pfcpasreq_flags_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -8107,8 +8267,7 @@ dissect_pfcp_data_status(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pr NULL }; /* Octet 5 Spare BUFF DROP */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_data_status_flags, - ett_pfcp_data_status_flags, pfcp_data_status_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_data_status_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -8130,8 +8289,7 @@ dissect_pfcp_rds_configuration_information(tvbuff_t *tvb, packet_info *pinfo, pr NULL }; /* Octet 5 Spare RDS */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_rds_configuration_information_flags, - ett_pfcp_rds_configuration_information_flags, pfcp_rds_configuration_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_rds_configuration_information_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -8140,21 +8298,21 @@ dissect_pfcp_rds_configuration_information(tvbuff_t *tvb, packet_info *pinfo, pr } /* - * 8.2.181 MPTCP Application Indication + * 8.2.181 Multipath Application Indication */ static void -dissect_pfcp_mptcp_application_indication(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +dissect_pfcp_multipath_application_indication(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) { int offset = 0; - static int * const pfcp_mptcp_application_indication_flags[] = { - &hf_pfcp_spare_b7_b1, - &hf_pfcp_mptcp_application_indication_flags_b0_mai, + static int * const pfcp_multipath_application_indication_flags[] = { + &hf_pfcp_spare_b7_b2, + &hf_pfcp_multipath_application_indication_flags_b1_mqai, + &hf_pfcp_multipath_application_indication_flags_b0_mtai, NULL }; - /* Octet 5 Spare MAI */ - proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_mptcp_application_indication_flags, - ett_pfcp_rds_configuration_information_flags, pfcp_mptcp_application_indication_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + /* Octet 5 Spare MQAI MTAI */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_multipath_application_indication_flags, ENC_BIG_ENDIAN); offset += 1; if (offset < length) { @@ -8163,16 +8321,16 @@ dissect_pfcp_mptcp_application_indication(tvbuff_t *tvb, packet_info *pinfo, pro } /* - * 8.2.182 User Plane NodeManagement Information Container + * 8.2.182 User Plane Node Management Information Container */ static void -dissect_pfcp_user_plane_nodemanagement_information_container(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +dissect_pfcp_user_plane_node_management_information_container(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) { int offset = 0; - /* Octet 5 to (n+4) User Plane NodeManagement Information Container - * The User Plane NodeManagement Information Container field shall be encoded as an OctetString. + /* Octet 5 to (n+4) User Plane Node Management Information Container + * The User Plane Node Management Information Container field shall be encoded as an OctetString. */ - proto_tree_add_item(tree, hf_pfcp_user_plane_nodemanagement_information_container, tvb, offset, length, ENC_NA); + proto_tree_add_item(tree, hf_pfcp_user_plane_node_management_information_container, tvb, offset, length, ENC_NA); } /* @@ -8191,8 +8349,7 @@ dissect_pfcp_number_of_ue_ip_addresses(tvbuff_t *tvb, packet_info *pinfo, proto_ NULL }; /* Octet 5 Spare Spare Spare Spare Spare Spare IPv6 IPv4*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_number_of_ue_ip_addresses_flags, - ett_pfcp_number_of_ue_ip_addresses_flags, pfcp_number_of_ue_ip_addresses_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &number_of_ue_ip_addresses_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_number_of_ue_ip_addresses_flags, ENC_BIG_ENDIAN, &number_of_ue_ip_addresses_flags); offset += 1; /* a to (a+3) Number of UE IPv4 Addresses */ @@ -8248,7 +8405,7 @@ dissect_pfcp_offending_ie_information(tvbuff_t *tvb, packet_info *pinfo _U_, pro offset += 2; /* Octets 7 to (n+4) shall contain the value of the offending IE that caused the failure */ - proto_tree_add_item(tree, hf_pfcp_offending_ie_value, tvb, offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_pfcp_offending_ie_value, tvb, offset, length - offset, ENC_NA); } /* @@ -8266,6 +8423,7 @@ static const value_string pfcp_rattype_vals[] = { { 8, "EUTRAN-NB-IoT" }, { 9, "LTE-M" }, { 10, "NR" }, + { 11, "NR-REDCAP" }, { 0, NULL } }; @@ -8309,8 +8467,7 @@ dissect_pfcp_l2tp_user_authentication(tvbuff_t *tvb, packet_info *pinfo _U_, pro offset += 2; /* Octet 7 Spare PAI PAR PAC PAN */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_l2tp_user_authentication_flags, - ett_pfcp_l2tp_user_authentication_flags, pfcp_l2tp_user_authentication_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &l2tp_user_authentication_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_l2tp_user_authentication_flags, ENC_BIG_ENDIAN, &l2tp_user_authentication_flags); offset += 1; /* Proxy Authen Name */ @@ -8489,8 +8646,7 @@ dissect_pfcp_thresholds(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro NULL }; /* Octet 5 Spare PLR RTT */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_thresholds_flags, - ett_pfcp_thresholds, pfcp_thresholds_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_thresholds_flags, ENC_BIG_ENDIAN, &flags); offset += 1; /* RTT */ @@ -8543,7 +8699,7 @@ static void dissect_pfcp_group_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) { /* Octet 5 to (n+4) Group ID */ - proto_tree_add_item(tree, hf_pfcp_group_id, tvb, 0, length, ENC_UTF_8|ENC_NA); + proto_tree_add_item(tree, hf_pfcp_group_id, tvb, 0, length, ENC_UTF_8); } /* @@ -8562,8 +8718,7 @@ dissect_pfcp_cp_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, NULL }; /* Octet 5 Spare V4 V6 */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_cp_ip_address_flags, - ett_pfcp_cp_ip_address_flags, pfcp_cp_ip_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &cp_ip_address_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_cp_ip_address_flags, ENC_BIG_ENDIAN, &cp_ip_address_flags); offset += 1; /* IPv4 address (if present) */ @@ -8604,8 +8759,7 @@ dissect_pfcp_ip_address_and_port_number_replacement(tvbuff_t *tvb, packet_info * NULL }; /* Octet 5 Spare SPN SIPV6 SIPV4 DPN V6 V4*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_ip_address_and_port_number_replacement_flags, - ett_pfcp_ip_address_and_port_number_replacement_flags, pfcp_ip_address_and_port_number_replacement_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &ip_address_and_port_number_replacement_flags); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_ip_address_and_port_number_replacement_flags, ENC_BIG_ENDIAN, &ip_address_and_port_number_replacement_flags); offset += 1; /* Destination IPv4 address (if present)*/ @@ -8734,14 +8888,14 @@ dissect_pfcp_mbs_session_identifier(tvbuff_t *tvb, packet_info *pinfo, proto_tre guint64 mbs_session_identifier_flags; static int * const pfcp_mbs_session_identifier_flags[] = { - &hf_pfcp_spare_b7_b2, + &hf_pfcp_spare_b7_b3, + &hf_pfcp_mbs_session_identifier_flag_b2_nidi, &hf_pfcp_mbs_session_identifier_flag_b1_ssmi, &hf_pfcp_mbs_session_identifier_flag_b0_tmgi, NULL }; - /* Octet 5 Spare SMI TMGI */ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_mbs_session_identifier_flags, - ett_pfcp_mbs_session_identifier_flags, pfcp_mbs_session_identifier_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &mbs_session_identifier_flags); + /* Octet 5 Spare NIDI SMI TMGI */ + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_mbs_session_identifier_flags, ENC_BIG_ENDIAN, &mbs_session_identifier_flags); offset += 1; /* TMGI (if present)*/ @@ -8751,7 +8905,28 @@ dissect_pfcp_mbs_session_identifier(tvbuff_t *tvb, packet_info *pinfo, proto_tre } /* SSMI (if present)*/ if ((mbs_session_identifier_flags & 0x2)) { - proto_tree_add_item(tree, hf_pfcp_mbs_session_identifier_ssmi, tvb, offset, -1, ENC_NA); + guint32 source_address_type; + guint32 source_address_length; + + /* Source Address Type && Length */ + proto_tree_add_item_ret_uint(tree, hf_pfcp_mbs_session_identifier_source_address_type, tvb, offset, 1, ENC_BIG_ENDIAN, &source_address_type); + proto_tree_add_item_ret_uint(tree, hf_pfcp_mbs_session_identifier_source_address_length, tvb, offset, 1, ENC_BIG_ENDIAN, &source_address_length); + offset++; + + /* Source IPv4 address (if present) */ + if (source_address_type == 0) { + proto_tree_add_item(tree, hf_pfcp_mbs_session_identifier_source_address_ipv4, tvb, offset, source_address_length, ENC_BIG_ENDIAN); + offset += source_address_length; + } + /* Source IPv6 address (if present) */ + if (source_address_type == 1) { + proto_tree_add_item(tree, hf_pfcp_mbs_session_identifier_source_address_ipv6, tvb, offset, source_address_length, ENC_NA); + offset += source_address_length; + } + } + /* NIDI (if present)*/ + if ((mbs_session_identifier_flags & 0x4)) { + proto_tree_add_item(tree, hf_pfcp_mbs_session_identifier_nidi, tvb, offset, 5, ENC_NA); return; } @@ -8776,9 +8951,9 @@ dissect_pfcp_multicast_transport_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree_add_item(tree, hf_pfcp_spare_oct, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; - /* Oct 6 to 9 Common Tunnel Endpoint Identifer */ - proto_tree_add_item(tree, hf_pfcp_multicast_transport_information_endpoint_identifier, tvb, offset, 1, ENC_BIG_ENDIAN); - offset++; + /* Oct 6 to 9 Common Tunnel Endpoint Identifier */ + proto_tree_add_item(tree, hf_pfcp_multicast_transport_information_endpoint_identifier, tvb, offset, 4, ENC_BIG_ENDIAN); + offset+=4; /* Oct 10 Distribution Address Type && Length */ proto_tree_add_item_ret_uint(tree, hf_pfcp_multicast_transport_information_distribution_address_type, tvb, offset, 1, ENC_BIG_ENDIAN, &distribution_address_type); @@ -8827,11 +9002,12 @@ dissect_pfcp_mbsn4mbreq_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre static int * const pfcp_mbsn4mbreq_flags_o5_flags[] = { &hf_pfcp_spare_b7_b2, + &hf_pfcp_mbsn4mbreq_flags_o5_b2_mbs_resti, &hf_pfcp_mbsn4mbreq_flags_o5_b1_jmbssm, &hf_pfcp_mbsn4mbreq_flags_o5_b0_pllssm, NULL }; - /* Octet 5 Spare JMBSSM PLLSSM */ + /* Octet 5 Spare MBS RESTI JMBSSM PLLSSM */ proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_mbsn4mbreq_flags_o5_flags, ENC_BIG_ENDIAN); offset++; @@ -8845,7 +9021,7 @@ dissect_pfcp_mbsn4mbreq_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre } /* - * 8.2.3 Local Ingress Tunnel + * 8.2.209 Local Ingress Tunnel */ static void dissect_pfcp_local_ingress_tunnel(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) @@ -8861,8 +9037,7 @@ dissect_pfcp_local_ingress_tunnel(tvbuff_t *tvb, packet_info *pinfo, proto_tree NULL }; /* Octet 5 Spare CH V6 V4*/ - proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_local_ingress_tunnel_flags, - ett_local_ingress_tunnel_flags, pfcp_local_ingress_tunnel_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &local_ingress_tunnel_flags_val); + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_local_ingress_tunnel_flags, ENC_BIG_ENDIAN, &local_ingress_tunnel_flags_val); offset += 1; /* Bit 3 – CH (CHOOSE): If this bit is set to "1", then the UDP Port, IPv4 address and IPv6 address fields shall not be present */ @@ -8900,338 +9075,617 @@ dissect_pfcp_mbs_unicast_parameters_id(tvbuff_t *tvb, packet_info *pinfo _U_, pr proto_item_append_text(item, "%u", value); } -/* Array of functions to dissect IEs -* (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -*/ -typedef struct _pfcp_ie { - void(*decode) (tvbuff_t *, packet_info *, proto_tree *, proto_item *, guint16, guint8, pfcp_session_args_t *); -} pfcp_ie_t; +/* + * 8.2.211 MBSN4Resp-Flags + */ +static void +dissect_pfcp_mbsn4resp_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; -static const pfcp_ie_t pfcp_ies[] = { -/* 0 */ { dissect_pfcp_reserved }, -/* 1 */ { dissect_pfcp_create_pdr }, /* Create PDR Extendable / Table 7.5.2.2-1 */ -/* 2 */ { dissect_pfcp_pdi }, /* PDI Extendable / Table 7.5.2.2-2 */ -/* 3 */ { dissect_pfcp_create_far }, /* Create FAR Extendable / Table 7.5.2.3-1 */ -/* 4 */ { dissect_pfcp_forwarding_parameters }, /* Forwarding Parameters Extendable / Table 7.5.2.3-2 */ -/* 5 */ { dissect_pfcp_duplicating_parameters }, /* Duplicating Parameters Extendable / Table 7.5.2.3-3 */ -/* 6 */ { dissect_pfcp_create_urr }, /* Create URR Extendable / Table 7.5.2.4-1 */ -/* 7 */ { dissect_pfcp_create_qer }, /* Create QER Extendable / Table 7.5.2.5-1 */ -/* 8 */ { dissect_pfcp_created_pdr }, /* Created PDR Extendable / Table 7.5.3.2-1 */ -/* 9 */ { dissect_pfcp_update_pdr }, /* Update PDR Extendable / Table 7.5.4.2-1 */ -/* 10 */ { dissect_pfcp_update_far }, /* Update FAR Extendable / Table 7.5.4.3-1 */ -/* 11 */ { dissect_pfcp_upd_forwarding_param }, /* Update Forwarding Parameters Extendable / Table 7.5.4.3-2 */ -/* 12 */ { dissect_pfcp_update_bar }, /* Update BAR (PFCP Session Report Response) Extendable / Table 7.5.9.2-1 */ -/* 13 */ { dissect_pfcp_update_urr }, /* Update URR Extendable / Table 7.5.4.4 */ -/* 14 */ { dissect_pfcp_update_qer }, /* Update QER Extendable / Table 7.5.4.5 */ -/* 15 */ { dissect_pfcp_remove_pdr }, /* Remove PDR Extendable / Table 7.5.4.6 */ -/* 16 */ { dissect_pfcp_remove_far }, /* Remove FAR Extendable / Table 7.5.4.7 */ -/* 17 */ { dissect_pfcp_remove_urr }, /* Remove URR Extendable / Table 7.5.4.8 */ -/* 18 */ { dissect_pfcp_remove_qer }, /* Remove QER Extendable / Table 7.5.4.9 */ -/* 19 */ { dissect_pfcp_cause }, /* Cause Fixed / Subclause 8.2.1 */ -/* 20 */ { dissect_pfcp_source_interface }, /* Source Interface Extendable / Subclause 8.2.2 */ -/* 21 */ { dissect_pfcp_f_teid }, /* F-TEID Extendable / Subclause 8.2.3 */ -/* 22 */ { dissect_pfcp_network_instance }, /* Network Instance Variable Length / Subclause 8.2.4 */ -/* 23 */ { dissect_pfcp_sdf_filter }, /* SDF Filter Extendable / Subclause 8.2.5 */ -/* 24 */ { dissect_pfcp_application_id }, /* Application ID Variable Length / Subclause 8.2.6 */ -/* 25 */ { dissect_pfcp_gate_status }, /* Gate Status Extendable / Subclause 8.2.7 */ -/* 26 */ { dissect_pfcp_mbr }, /* MBR Extendable / Subclause 8.2.8 */ -/* 27 */ { dissect_pfcp_gbr }, /* GBR Extendable / Subclause 8.2.9 */ -/* 28 */ { dissect_pfcp_qer_correlation_id }, /* QER Correlation ID Extendable / Subclause 8.2.10 */ -/* 29 */ { dissect_pfcp_precedence }, /* Precedence Extendable / Subclause 8.2.11 */ -/* 30 */ { dissect_pfcp_transport_level_marking }, /* Transport Level Marking Extendable / Subclause 8.2.12 */ -/* 31 */ { dissect_pfcp_volume_threshold }, /* Volume Threshold Extendable /Subclause 8.2.13 */ -/* 32 */ { dissect_pfcp_time_threshold }, /* Time Threshold Extendable /Subclause 8.2.14 */ -/* 33 */ { dissect_pfcp_monitoring_time }, /* Monitoring Time Extendable /Subclause 8.2.15 */ -/* 34 */ { dissect_pfcp_subseq_volume_threshold }, /* Subsequent Volume Threshold Extendable /Subclause 8.2.16 */ -/* 35 */ { dissect_pfcp_subsequent_time_threshold }, /* Subsequent Time Threshold Extendable /Subclause 8.2.17 */ -/* 36 */ { dissect_pfcp_inactivity_detection_time }, /* Inactivity Detection Time Extendable /Subclause 8.2.18 */ -/* 37 */ { dissect_pfcp_reporting_triggers }, /* Reporting Triggers Extendable /Subclause 8.2.19 */ -/* 38 */ { dissect_pfcp_redirect_information }, /* Redirect Information Extendable /Subclause 8.2.20 */ -/* 39 */ { dissect_pfcp_report_type }, /* Report Type Extendable / Subclause 8.2.21 */ -/* 40 */ { dissect_pfcp_offending_ie }, /* Offending IE Fixed / Subclause 8.2.22 */ -/* 41 */ { dissect_pfcp_forwarding_policy }, /* Forwarding Policy Extendable / Subclause 8.2.23 */ -/* 42 */ { dissect_pfcp_destination_interface }, /* Destination Interface Extendable / Subclause 8.2.24 */ -/* 43 */ { dissect_pfcp_up_function_features }, /* UP Function Features Extendable / Subclause 8.2.25 */ -/* 44 */ { dissect_pfcp_apply_action }, /* Apply Action Extendable / Subclause 8.2.26 */ -/* 45 */ { dissect_pfcp_dl_data_service_inf }, /* Downlink Data Service Information Extendable / Subclause 8.2.27 */ -/* 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_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 */ -/* 54 */ { dissect_pfcp_overload_control_information }, /* Overload Control Information Extendable / Table 7.5.3.4-1 */ -/* 55 */ { dissect_pfcp_timer }, /* Timer Extendable / Subclause 8.2 35 */ -/* 56 */ { dissect_pfcp_pdr_id }, /* PDR ID Extendable / Subclause 8.2 36 */ -/* 57 */ { dissect_pfcp_f_seid }, /* F-SEID Extendable / Subclause 8.2 37 */ -/* 58 */ { dissect_pfcp_application_ids_pfds }, /* Application ID's PFDs Extendable / Table 7.4.3.1-2 */ -/* 59 */ { dissect_pfcp_pfd_context }, /* PFD context Extendable / Table 7.4.3.1-3 */ -/* 60 */ { dissect_pfcp_node_id }, /* Node ID Extendable / Subclause 8.2.38 */ -/* 61 */ { dissect_pfcp_pfd_contents }, /* PFD contents Extendable / Subclause 8.2.39 */ -/* 62 */ { dissect_pfcp_measurement_method }, /* Measurement Method Extendable / Subclause 8.2.40 */ -/* 63 */ { dissect_pfcp_usage_report_trigger }, /* Usage Report Trigger Extendable / Subclause 8.2.41 */ -/* 64 */ { dissect_pfcp_measurement_period }, /* Measurement Period Extendable / Subclause 8.2.42 */ -/* 65 */ { dissect_pfcp_fq_csid }, /* FQ-CSID Extendable / Subclause 8.2.43 */ -/* 66 */ { dissect_pfcp_volume_measurement }, /* Volume Measurement Extendable / Subclause 8.2.44 */ -/* 67 */ { dissect_pfcp_duration_measurement }, /* Duration Measurement Extendable / Subclause 8.2.45 */ -/* 68 */ { dissect_pfcp_application_detection_inf }, /* Application Detection Information Extendable / Table 7.5.8.3-2 */ -/* 69 */ { dissect_pfcp_time_of_first_packet }, /* Time of First Packet Extendable / Subclause 8.2.46 */ -/* 70 */ { dissect_pfcp_time_of_last_packet }, /* Time of Last Packet Extendable / Subclause 8.2.47 */ -/* 71 */ { dissect_pfcp_quota_holding_time }, /* Quota Holding Time Extendable / Subclause 8.2.48 */ -/* 72 */ { dissect_pfcp_dropped_dl_traffic_threshold }, /* Dropped DL Traffic Threshold Extendable / Subclause 8.2.49 */ -/* 73 */ { dissect_pfcp_volume_quota }, /* Volume Quota Extendable / Subclause 8.2.50 */ -/* 74 */ { dissect_pfcp_time_quota }, /* Time Quota Extendable / Subclause 8.2.51 */ -/* 75 */ { dissect_pfcp_start_time }, /* Start Time Extendable / Subclause 8.2.52 */ -/* 76 */ { dissect_pfcp_end_time }, /* End Time Extendable / Subclause 8.2.53 */ -/* 77 */ { dissect_pfcp_pfcp_query_urr }, /* Query URR Extendable / Table 7.5.4.10-1 */ -/* 78 */ { dissect_pfcp_usage_report_smr }, /* Usage Report (Session Modification Response) Extendable / Table 7.5.5.2-1 */ -/* 79 */ { dissect_pfcp_usage_report_sdr }, /* Usage Report (Session Deletion Response) Extendable / Table 7.5.7.2-1 */ -/* 80 */ { dissect_pfcp_usage_report_srr }, /* Usage Report (Session Report Request) Extendable / Table 7.5.8.3-1 */ -/* 81 */ { dissect_pfcp_urr_id }, /* URR ID Extendable / Subclause 8.2.54 */ -/* 82 */ { dissect_pfcp_linked_urr_id }, /* Linked URR ID Extendable / Subclause 8.2.55 */ -/* 83 */ { dissect_pfcp_downlink_data_report }, /* Downlink Data Report Extendable / Table 7.5.8.2-1 */ -/* 84 */ { dissect_pfcp_outer_header_creation }, /* Outer Header Creation Extendable / Subclause 8.2.56 */ -/* 85 */ { dissect_pfcp_create_bar }, /* Create BAR Extendable / Table 7.5.2.6-1 */ -/* 86 */ { dissect_pfcp_update_bar_smr }, /* Update BAR (Session Modification Request) Extendable / Table 7.5.4.11-1 */ -/* 87 */ { dissect_pfcp_remove_bar }, /* Remove BAR Extendable / Table 7.5.4.12-1 */ -/* 88 */ { dissect_pfcp_bar_id }, /* BAR ID Extendable / Subclause 8.2.57 */ -/* 89 */ { dissect_pfcp_cp_function_features }, /* CP Function Features Extendable / Subclause 8.2.58 */ -/* 90 */ { dissect_pfcp_usage_information }, /* Usage Information Extendable / Subclause 8.2.59 */ -/* 91 */ { dissect_pfcp_application_instance_id }, /* Application Instance ID Variable Length / Subclause 8.2.60 */ -/* 92 */ { dissect_pfcp_flow_inf }, /* Flow Information Extendable / Subclause 8.2.61 */ -/* 93 */ { dissect_pfcp_ue_ip_address }, /* UE IP Address Extendable / Subclause 8.2.62 */ -/* 94 */ { dissect_pfcp_packet_rate }, /* Packet Rate Extendable / Subclause 8.2.63 */ -/* 95 */ { dissect_pfcp_outer_hdr_rem }, /* Outer Header Removal Extendable / Subclause 8.2.64 */ -/* 96 */ { dissect_pfcp_recovery_time_stamp }, /* Recovery Time Stamp Extendable / Subclause 8.2.65 */ -/* 97 */ { dissect_pfcp_dl_flow_level_marking }, /* DL Flow Level Marking Extendable / Subclause 8.2.66 */ -/* 98 */ { dissect_pfcp_header_enrichment }, /* Header Enrichment Extendable / Subclause 8.2.67 */ -/* 99 */ { dissect_pfcp_error_indication_report }, /* Error Indication Report Extendable / Table 7.5.8.4-1 */ -/* 100 */ { dissect_pfcp_measurement_info }, /* Measurement Information Extendable / Subclause 8.2.68 */ -/* 101 */ { dissect_pfcp_node_report_type }, /* Node Report Type Extendable / Subclause 8.2.69 */ -/* 102 */ { dissect_pfcp_user_plane_path_failure_report }, /* User Plane Path Failure Report Extendable / Table 7.4.5.1.2-1 */ -/* 103 */ { dissect_pfcp_remote_gtp_u_peer }, /* Remote GTP-U Peer Extendable / Subclause 8.2.70 */ -/* 104 */ { dissect_pfcp_ur_seqn }, /* UR-SEQN Fixed Length / Subclause 8.2.71 */ -/* 105 */ { dissect_pfcp_update_duplicating_parameters }, /* Update Duplicating Parameters Extendable / Table 7.5.4.3-3 */ -/* 106 */ { dissect_pfcp_act_predef_rules }, /* Activate Predefined Rules Variable Length / Subclause 8.2.72 */ -/* 107 */ { dissect_pfcp_deact_predef_rules }, /* Deactivate Predefined Rules Variable Length / Subclause 8.2.73 */ -/* 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_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_quota_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 */ { dissect_pfcp_create_traffic_endpoint }, /* Create Traffic Endpoint Extendable / Table 7.5.2.7 */ -/* 128 */ { dissect_pfcp_created_traffic_endpoint }, /* Created Traffic Endpoint Extendable / Table 7.5.3.5 */ -/* 129 */ { dissect_pfcp_update_traffic_endpoint }, /* Update Traffic Endpoint Extendable / Table 7.5.4.13 */ -/* 130 */ { dissect_pfcp_remove_traffic_endpoint }, /* Remove Traffic Endpoint Extendable / Table 7.5.4.14 */ -/* 131 */ { dissect_pfcp_traffic_endpoint_id }, /* Traffic Endpoint ID Extendable / Subclause 8.2.92 */ -/* 132 */ { dissect_pfcp_ethernet_packet_filter }, /* Ethernet Packet Filter IE Extendable / Table 7.5.2.2-3 */ -/* 133 */ { dissect_pfcp_mac_address }, /* MAC address Extendable / Subclause 8.2.93 */ -/* 134 */ { dissect_pfcp_c_tag }, /* C-TAG Extendable / Subclause 8.2.94 */ -/* 135 */ { dissect_pfcp_s_tag }, /* S-TAG Extendable / Subclause 8.2.95 */ -/* 136 */ { dissect_pfcp_ethertype }, /* Ethertype Extendable / Subclause 8.2.96 */ -/* 137 */ { dissect_pfcp_proxying }, /* Proxying Extendable / Subclause 8.2.97 */ -/* 138 */ { dissect_pfcp_ethertype_filter_id }, /* Ethernet Filter ID Extendable / Subclause 8.2.98 */ -/* 139 */ { dissect_pfcp_ethernet_filter_properties }, /* Ethernet Filter Properties Extendable / Subclause 8.2.99 */ -/* 140 */ { dissect_pfcp_suggested_buffering_packets_count }, /* Suggested Buffering Packets Count Extendable / Subclause 8.2.100 */ -/* 141 */ { dissect_pfcp_user_id }, /* User ID Extendable / Subclause 8.2.101 */ -/* 142 */ { dissect_pfcp_ethernet_pdu_session_information }, /* Ethernet PDU Session Information Extendable / Subclause 8.2.102 */ -/* 143 */ { dissect_pfcp_ethernet_traffic_information }, /* Ethernet Traffic Information Extendable / Table 7.5.8.3-3 */ -/* 144 */ { dissect_pfcp_mac_addresses_detected }, /* MAC Addresses Detected Extendable / Subclause 8.2.103 */ -/* 145 */ { dissect_pfcp_mac_addresses_removed }, /* MAC Addresses Removed Extendable / Subclause 8.2.104 */ -/* 146 */ { dissect_pfcp_ethernet_inactivity_timer }, /* Ethernet Inactivity Timer Extendable / Subclause 8.2.105 */ -/* 147 */ { dissect_pfcp_additional_monitoring_time }, /* Additional Monitoring Time Extendable / Table 7.5.2.4-3 */ -/* 148 */ { dissect_pfcp_event_quota }, /* Event Quota Extendable / Subclause 8.2.112 */ -/* 149 */ { dissect_pfcp_event_threshold }, /* Event Threshold Extendable / Subclause 8.2.113 */ -/* 150 */ { dissect_pfcp_subsequent_event_quota }, /* Subsequent Event Quota Extendable / Subclause 8.2.106 */ -/* 151 */ { dissect_pfcp_subsequent_event_threshold }, /* Subsequent Event Threshold Extendable / Subclause 8.2.107 */ -/* 152 */ { dissect_pfcp_trace_information }, /* Trace Information Extendable / Subclause 8.2.108 */ -/* 153 */ { dissect_pfcp_framed_route }, /* Framed-Route Variable Length / Subclause 8.2.109 */ -/* 154 */ { dissect_pfcp_framed_routing }, /* Framed-Routing Fixed Length / Subclause 8.2.110 */ -/* 155 */ { dissect_pfcp_framed_ipv6_route }, /* Framed-IPv6-Route Variable Length / Subclause 8.2.111 */ -/* 156 */ { dissect_pfcp_time_stamp }, /* Time Stamp Extendable / Subclause 8.2.114 */ -/* 157 */ { dissect_pfcp_averaging_window }, /* Averaging Window Extendable / Subclause 8.2.115 */ -/* 158 */ { dissect_pfcp_paging_policy_indicator }, /* Paging Policy Indicator Extendable / Subclause 8.2.116 */ -/* 159 */ { dissect_pfcp_apn_dnn }, /* APN/DNN Variable Length / Subclause 8.2.117 */ -/* 160 */ { dissect_pfcp_tgpp_interface_type }, /* 3GPP Interface Type Extendable / Subclause 8.2.118 */ -/* 161 */ { dissect_pfcp_pfcpsrreq_flags }, /* PFCPSRReq-Flags Extendable / Subclause 8.2.119 */ -/* 162 */ { dissect_pfcp_pfcpaureq_flags }, /* PFCPAUReq-Flags Extendable / Subclause 8.2.120 */ -/* 163 */ { dissect_pfcp_activation_time }, /* Activation Time Extendable / Subclause 8.2.121 */ -/* 164 */ { dissect_pfcp_deactivation_time }, /* Deactivation Time Extendable / Subclause 8.2.122 */ -/* 165 */ { dissect_pfcp_create_mar }, /* Create MAR Extendable / Table 7.5.2.8-1 */ -/* 166 */ { dissect_pfcp_access_forwarding_action_information_1 }, /* Access Forwarding Action Information 1 Extendable / Table 7.5.2.8-2 */ -/* 167 */ { dissect_pfcp_access_forwarding_action_information_2 }, /* Access Forwarding Action Information 2 Extendable / Table 7.5.2.8-3 */ -/* 168 */ { dissect_pfcp_remove_mar }, /* Remove MAR Extendable / Table 7.5.4.15-1*/ -/* 169 */ { dissect_pfcp_update_mar }, /* Update MAR Extendable / Table 7.5.4.16-1 */ -/* 170 */ { dissect_pfcp_mar_id }, /* MAR ID Extendable / Subclause 8.2.123 */ -/* 171 */ { dissect_pfcp_steering_functionality }, /* Steering Functionality Extendable / Subclause 8.2.124 */ -/* 172 */ { dissect_pfcp_steering_mode }, /* Steering Mode Extendable / Subclause 8.2.125 */ -/* 173 */ { dissect_pfcp_weight }, /* Weight Fixed / Clause 8.2.126 */ -/* 174 */ { dissect_pfcp_priority }, /* Priority Extendable / Subclause 8.2.127 */ -/* 175 */ { dissect_pfcp_update_access_forwarding_action_information_1 }, /* Update Access Forwarding Action Information 1 Extendable / Table 7.5.4.16-2 */ -/* 176 */ { dissect_pfcp_update_access_forwarding_action_information_2 }, /* Update Access Forwarding Action Information 2 Extendable / Table 7.5.4.16-3 */ -/* 177 */ { dissect_pfcp_ue_ip_address_pool_identity }, /* UE IP address Pool Identity Variable Length / Clause 8.2.128 */ -/* 178 */ { dissect_pfcp_alternative_smf_ip_address }, /* Alternative SMF IP Address Extendable / Clause 8.2.129 */ -/* 179 */ { dissect_pfcp_packet_replication_and_detection_carry_on_information }, /* Packet Replication and Detection Carry-On Information Extendable / Clause 8.2.130 */ -/* 180 */ { dissect_pfcp_smf_set_id }, /* SMF Set ID Extendable / Clause 8.2.131 */ -/* 181 */ { dissect_pfcp_quota_validity_time }, /* Quota Validity Time Extendable / Clause 8.2.132 */ -/* 182 */ { dissect_pfcp_number_of_reports }, /* Number of Reports Fixed / Clause 8.2.133 */ -/* 183 */ { dissect_pfcp_pfcp_session_retention_information_within_pfcp_association_setup_request }, /* PFCP Session Retention Information (within PFCP Association Setup Request) Extendable / Table 7.4.4.1-2 */ -/* 184 */ { dissect_pfcp_pfcpasrsp_flags }, /* PFCPASRsp-Flags Extendable / Clause 8.2.134 */ -/* 185 */ { dissect_pfcp_cp_pfcp_entity_ip_address }, /* CP PFCP Entity IP Address Extendable / Clause 8.2.135 */ -/* 186 */ { dissect_pfcp_pfcpsereq_flags }, /* PFCPSEReq-Flags Extendable / Clause 8.2.136 */ -/* 187 */ { dissect_pfcp_user_plane_path_recovery_report }, /* User Plane Path Recovery Report Extendable / Table 7.4.5.1.3-1 */ -/* 188 */ { dissect_ip_multicast_addressing_info_within_pfcp_session_establishment_request }, /* IP Multicast Addressing Info within PFCP Session Establishment Request Extendable / Clause 7.5.2.2-4 */ -/* 189 */ { dissect_pfcp_join_ip_multicast_information }, /* Join IP Multicast Information IE within Usage Report Extendable / Table 7.5.8.3-4 */ -/* 190 */ { dissect_pfcp_leave_ip_multicast_information }, /* Leave IP Multicast Information IE within Usage Report Extendable / Table 7.5.8.3-5 */ -/* 191 */ { dissect_pfcp_ip_multicast_address }, /* IP Multicast Address Extendable / Clause 8.2.137 */ -/* 192 */ { dissect_pfcp_source_ip_address }, /* Source IP Address Extendable / Clause 8.2.138 */ -/* 193 */ { dissect_pfcp_packet_rate_status }, /* Packet Rate Status Extendable / Clause 8.2.139 */ -/* 194 */ { dissect_pfcp_create_bridge_info_for_tsc }, /* Create Bridge Info for TSC Extendable / Clause 8.2.140 */ -/* 195 */ { dissect_pfcp_created_bridge_info_for_tsc }, /* Created Bridge Info for TSC Extendable / Table 7.5.3.6-1 */ -/* 196 */ { dissect_pfcp_ds_tt_port_number }, /* DS-TT Port Number Fixed Length / Clause 8.2.141 */ -/* 197 */ { dissect_pfcp_nw_tt_port_number }, /* NW-TT Port Number Fixed Length / Clause 8.2.142 */ -/* 198 */ { dissect_pfcp_5gs_user_plane_node }, /* 5GS User Plane Node Extendable / Clause 8.2.143 */ -/* 199 */ { dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_request }, /* TSC Management Information IE within PFCP Session Modification Request Extendable / Table 7.5.4.18-1 */ -/* 200 */ { dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_response }, /* TSC Management Information IE within PFCP Session Modification Response Extendable / Table 7.5.5.3-1 */ -/* 201 */ { dissect_pfcp_tsc_management_information_ie_within_pfcp_session_report_request }, /* TSC Management Information IE within PFCP Session Report Request Extendable / Table 7.5.8.5-1 */ -/* 202 */ { dissect_pfcp_port_management_information_container }, /* Port Management Information Container Variable Length / Clause 8.2.144 */ -/* 203 */ { dissect_pfcp_clock_drift_control_information }, /* Clock Drift Control Information Extendable / Table 7.4.4.1.2-1 */ -/* 204 */ { dissect_pfcp_requested_clock_drift_control_information }, /* Requested Clock Drift Information Extendable / Clause 8.2.145 */ -/* 205 */ { dissect_pfcp_clock_drift_report }, /* Clock Drift Report Extendable / Table 7.4.5.1.4-1 */ -/* 206 */ { dissect_pfcp_time_domain_number }, /* Time Domain Number Extendable / Clause 8.2.146 */ -/* 207 */ { dissect_pfcp_time_offset_threshold }, /* Time Offset Threshold Extendable / Clause 8.2.147 */ -/* 208 */ { dissect_pfcp_cumulative_rate_ratio_threshold }, /* Cumulative rateRatio Threshold Extendable / Clause 8.2.148 */ -/* 209 */ { dissect_pfcp_time_offset_measurement }, /* Time Offset Measurement Extendable / Clause 8.2.149 */ -/* 210 */ { dissect_pfcp_cumulative_rate_ratio_measurement }, /* Cumulative rateRatio Measurement Extendable / Clause 8.2.150 */ -/* 211 */ { dissect_pfcp_remove_srr }, /* Remove SRR Extendable/ Table 7.5.4.19-1 */ -/* 212 */ { dissect_pfcp_create_srr }, /* Create SRR Extendable/ Table 7.5.2.9-1 */ -/* 213 */ { dissect_pfcp_update_srr }, /* Update SRR Extendable/ Table 7.5.4.21-1 */ -/* 214 */ { dissect_pfcp_session_report }, /* Session Report Extendable / Table 7.5.8.7-1 */ -/* 215 */ { dissect_pfcp_srr_id }, /* SRR ID Extendable / Clause 8.2.151 */ -/* 216 */ { dissect_pfcp_access_availability_control_information }, /* Access Availability Control Information Extendable / Table 7.5.2.9-2 */ -/* 217 */ { dissect_pfcp_requested_access_availability_control_information }, /* Requested Access Availability Information Extendable / Clause 8.2.152 */ -/* 218 */ { dissect_pfcp_access_availability_report }, /* Access Availability Report Extendable / Table 7.5.8.6-2 */ -/* 219 */ { dissect_pfcp_access_availability_information }, /* Access Availability Information Extendable / Clause 8.2.153 */ -/* 220 */ { dissect_pfcp_provide_atsss_control_information }, /* Provide ATSSS Control Information Extendable / Table 7.5.2.10-1 */ -/* 221 */ { dissect_pfcp_atsss_control_parameters }, /* ATSSS Control Parameters Extendable / Table 7.5.3.7-1 */ -/* 222 */ { dissect_pfcp_mptcp_control_information }, /* MPTCP Control Information Extendable / Clause 8.2.154 */ -/* 223 */ { dissect_pfcp_atsss_ll_control_information }, /* ATSSS-LL Control Information Extendable / Clause 8.2.155 */ -/* 224 */ { dissect_pfcp_pmf_control_information }, /* PMF Control Information Extendable / Clause 8.2.156 */ -/* 225 */ { dissect_pfcp_mptcp_parameters }, /* MPTCP Parameters Extendable / Table 7.5.3.7-2 */ -/* 226 */ { dissect_pfcp_atsss_ll_parameters }, /* ATSSS-LL Parameters Extendable / Table 7.5.3.7-3 */ -/* 227 */ { dissect_pfcp_pmf_parameters }, /* PMF Parameters Extendable / Table 7.5.3.7-4 */ -/* 228 */ { dissect_pfcp_mptcp_address_information }, /* MPTCP Address Information Extendable / Clause 8.2.157 */ -/* 229 */ { dissect_pfcp_ue_link_specific_ip_address }, /* UE Link-Specific IP Address Extendable / Clause 8.2.158 */ -/* 230 */ { dissect_pfcp_pmf_address_information }, /* PMF Address Information Extendable / Clause 8.2.159 */ -/* 231 */ { dissect_pfcp_atsss_ll_information }, /* ATSSS-LL Information Extendable / Clause 8.2.160 */ -/* 232 */ { dissect_pfcp_data_network_access_identifier }, /* Data Network Access Identifier Variable Length / Clause 8.2.161 */ -/* 233 */ { dissect_pfcp_ue_ip_address_pool_information }, /* UE IP address Pool Information Extendable / Table 7.4.4.1-3 */ -/* 234 */ { dissect_pfcp_average_packet_delay }, /* Average Packet Delay Extendable / Clause 8.2.162 */ -/* 235 */ { dissect_pfcp_minimum_packet_delay }, /* Minimum Packet Delay Extendable / Clause 8.2.163 */ -/* 236 */ { dissect_pfcp_maximum_packet_delay }, /* Maximum Packet Delay Extendable / Clause 8.2.164 */ -/* 237 */ { dissect_pfcp_qos_report_trigger }, /* QoS Report Trigger Extendable / Clause 8.2.165 */ -/* 238 */ { dissect_pfcp_gtp_u_path_qos_control_information }, /* GTP-U Path QoS Control Information Extendable / Table 7.4.4.1.3-1 */ -/* 239 */ { dissect_pfcp_gtp_u_path_qos_report }, /* GTP-U Path QoS Report (PFCP Node Report Request) Extendable / Table 7.4.5.1.5-1 */ -/* 240 */ { dissect_pfcp_qos_information_in_gtp_u_path_qos_report }, /* QoS Information in GTP-U Path QoS Report Extendable / Table 7.4.5.1.6-1 */ -/* 241 */ { dissect_pfcp_gtp_u_path_interface_type }, /* GTP-U Path Interface Type Extendable / Clause 8.2.166 */ -/* 242 */ { dissect_pfcp_qos_monitoring_per_qos_flow_control_information }, /* QoS Monitoring per QoS flow Control Information Extendable / Table 7.5.2.9-3 */ -/* 243 */ { dissect_pfcp_requested_qos_monitoring }, /* Requested QoS Monitoring Extendable / Clause 8.2.167 */ -/* 244 */ { dissect_pfcp_reporting_frequency }, /* Reporting Frequency Extendable / Clause 8.2.168 */ -/* 245 */ { dissect_pfcp_packet_delay_thresholds }, /* Packet Delay Thresholds Extendable / Clause 8.2.169 */ -/* 246 */ { dissect_pfcp_minimum_wait_time }, /* Minimum Wait Time Extendable / Clause 8.2.170 */ -/* 247 */ { dissect_pfcp_qos_monitoring_report }, /* QoS Monitoring Report Extendable / Table 7.5.8.6-3 */ -/* 248 */ { dissect_pfcp_qos_monitoring_measurement }, /* QoS Monitoring Measurement Extendable / Clause 8.2.171 */ -/* 249 */ { dissect_pfcp_mt_edt_control_information }, /* MT-EDT Control Information Extendable / Clause 8.2.172 */ -/* 250 */ { dissect_pfcp_dl_data_packets_size }, /* DL Data Packets Size Extendable / Clause 8.2.173 */ -/* 251 */ { dissect_pfcp_qer_control_indications }, /* QER Control Indications Extendable / Clause 8.2.174 */ -/* 252 */ { dissect_pfcp_packet_rate_status_report_ie_within_pfcp_session_deletion_response }, /* Packet Rate Status Report IE within PFCP Session Deletion Response Extendable / Table 7.5.7.1-2 */ -/* 253 */ { dissect_pfcp_nf_instance_id }, /* NF Instance ID Extendable / Clause 8.2.175 */ -/* 254 */ { dissect_pfcp_ethernet_context_information_within_pfcp_session_modification_request }, /* Ethernet Context Information within PFCP Session Modification Request Extendable / Table 7.5.4.21-1 */ -/* 255 */ { dissect_pfcp_redundant_transmission_detection_parameters }, /* Redundant Transmission Detection Parameters Extendable / Table 7.5.2.2-5 */ -/* 256 */ { dissect_pfcp_updated_pdr_ie_within_pfcp_session_modification_response }, /* Updated PDR IE within PFCP Session Modification Response Extendable / Table 7.5.5.5-1 */ -/* 257 */ { dissect_pfcp_s_nssai }, /* S-NSSAI Fixed Length / Clause 8.2.176 */ -/* 258 */ { dissect_pfcp_ip_version }, /* IP version Extendable / Clause 8.2.177 */ -/* 259 */ { dissect_pfcp_pfcpasreq_flags }, /* PFCPASReq-Flags Extendable / Clause 8.2.178 */ -/* 260 */ { dissect_pfcp_data_status }, /* Data Status Extendable / Clause 8.2.179 */ -/* 261 */ { dissect_pfcp_provide_rds_configuration_information_ie_within_pfcp_session_modification_request }, /* Provide RDS Configuration Information IE within PFCP Session Establishment Request Extendable / Table 7.5.2.11-1 */ -/* 262 */ { dissect_pfcp_rds_configuration_information }, /* RDS Configuration Information Extendable / Clause 8.2.180 */ -/* 263 */ { dissect_pfcp_query_packet_rate_status_ie_within_pfcp_session_modification_request }, /* Query Packet Rate Status IE within PFCP Session Modification Request Extendable / Table 7.5.4.22-1 */ -/* 264 */ { dissect_pfcp_query_packet_rate_status_report_ie_within_pfcp_session_modification_response }, /* Query Packet Rate Status Report IE within PFCP Session Modification Response Extendable / Table 7.5.5.4-1 */ -/* 265 */ { dissect_pfcp_mptcp_application_indication }, /* MPTCP Applicable Indication Extendable / Clause 8.2.181 */ -/* 266 */ { dissect_pfcp_user_plane_nodemanagement_information_container }, /* User Plane NodeManagement Information Container Variable Length / Clause 8.2.182 */ -/* 267 */ { dissect_pfcp_ue_ip_address_usage_information_ie_within_pfcp_association_update_request }, /* UE IP Address Usage Information IE within PFCP Association Update Request Extendable / Table 7.4.4.3.1-1 */ -/* 268 */ { dissect_pfcp_number_of_ue_ip_addresses }, /* Number of UE IP Addresses Variable Length / Clause 8.2.183 */ -/* 269 */ { dissect_pfcp_validity_timer }, /* Validity Timer Variable Length / Clause 8.2.183 */ -/* 270 */ { dissect_pfcp_redundant_transmission_forward_parameters }, /* Redundant Transmission Forward Parameters Variable Length / Clause 8.2.184 */ -/* 271 */ { dissect_pfcp_transport_dealy_reporting_ie_in_create_pdr }, /* Transport Delay Reporting IE in Create PDR IE Extendable / Table 7.5.2.2-6 */ -/* 272 */ { dissect_pfcp_partial_failure_information_within_pfcp_session_establishment_response }, /* Partial Failure Information within PFCP Session Establishment Response Extendable / Table 7.5.3.1-2 */ -/* 273 */ { dissect_pfcp_partial_failure_information_within_pfcp_session_modification_response }, /* Partial Failure Information within PFCP Session Modificaton Response Extendable / Table 7.5.5.1-2 */ -/* 274 */ { dissect_pfcp_offending_ie_information }, /* Offending IE Information Variable Length / Clause 8.2.185 */ -/* 275 */ { dissect_pfcp_rattype }, /* RAT Type Variable Length / Clause 8.2.186 */ -/* 276 */ { dissect_pfcp_l2tp_tunnel_information }, /* L2TP Tunnel Information Extendable / Table 7.5.2.1-2 */ -/* 277 */ { dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_request }, /* L2TP Session Information within PFCP Session Establishment Request Extendable / Table 7.5.2.1-3 */ -/* 278 */ { dissect_pfcp_l2tp_user_authentication }, /* L2TP User Authentication Variable Length / Clause 8.2.187 */ -/* 279 */ { dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_response }, /* L2TP Session Information within PFCP Session Establishment Response Extendable / Table 7.5.3.1-3 */ -/* 280 */ { dissect_pfcp_lns_address }, /* LNS Address Variable Length / Clause 8.2.188 */ -/* 281 */ { dissect_pfcp_tunnel_preference }, /* Tunnel Preference Fixed / Clause 8.2.189 */ -/* 282 */ { dissect_pfcp_calling_number }, /* Calling Number Variable Length / Clause 8.2.190 */ -/* 283 */ { dissect_pfcp_called_number }, /* Called Number Variable Length / Clause 8.2.191 */ -/* 284 */ { dissect_pfcp_l2tp_session_indications }, /* L2TP Session Indications Extendable / Clause 8.2.192 */ -/* 285 */ { dissect_pfcp_dns_sever_address }, /* DNS Server Address Variable Length / Clause 8.2.193 */ -/* 286 */ { dissect_pfcp_nbns_sever_address }, /* NBNS Server Address Variable Length / Clause 8.2.194 */ -/* 287 */ { dissect_pfcp_maximum_receive_unit }, /* Maximum Receive Unit Fixed / Clause 8.2.195 */ -/* 288 */ { dissect_pfcp_thresholds }, /* Thresholds Variable Length / Clause 8.2.196 */ -/* 289 */ { dissect_pfcp_steering_mode_indications }, /* Steering Mode Indicator Extendable / Clause 8.2.197 */ -/* 290 */ { dissect_pfcp_pfcp_session_change_info }, /* PFCP Session Change Info Extendable / Table 7.4.7.1-2 */ -/* 291 */ { dissect_pfcp_group_id }, /* Group ID Fixed / Clause 8.2.198 */ -/* 292 */ { dissect_pfcp_cp_ip_address }, /* CP IP Address Variable Length / Clause 8.2.199 */ -/* 293 */ { dissect_pfcp_ip_address_and_port_number_replacement }, /* IP Address and Port Number Replacement Variable Length / Clause 8.2.200 */ -/* 294 */ { dissect_pfcp_dns_query_filter }, /* DNS Query Filter Variable Length / Clause 8.2.201 */ -/* 295 */ { dissect_pfcp_direct_reporting_information }, /* Direct Reporting Information Extendable / Table 7.5.2.9-4 */ -/* 296 */ { dissect_pfcp_event_notification_uri }, /* Event Notification URI Variable Length / Clause 8.2.202 */ -/* 297 */ { dissect_pfcp_notification_correlation_id }, /* Notification Correlation ID Fixed / Clause 8.2.203 */ -/* 298 */ { dissect_pfcp_reporting_flags }, /* Reporting Flags Extendable / Clause 8.2.204 */ -/* 299 */ { dissect_pfcp_predefined_rules_name }, /* Predefined Rules Name Variable Length / Clause 8.2.205 */ -/* 300 */ { dissect_pfcp_mbs_session_n4mb_control_information }, /* MBS Session N4mb Control Information Extendable / Table 7.5.2.1-5 */ -/* 301 */ { dissect_pfcp_mbs_multicast_parameters }, /* MBS Multicast Parameters Extendable / Table 7.5.2.3-5 */ -/* 302 */ { dissect_pfcp_add_mbs_unicast_parameters_ie_in_create_far }, /* Addd MBS Unicast Parameters IE in Create FAR Extendable / Table 7.5.2.3-6 */ -/* 303 */ { dissect_pfcp_mbs_session_n4mb_information }, /* MBS Session N4mb Information Extendable / Table 7.5.3.1-4 */ -/* 304 */ { dissect_pfcp_remove_mbs_unicast_parameters_ie_in_update_far },/* Remove MBS Unicast Parameters IE in Update FAR Extendable / Table 7.5.4.3-4 */ -/* 305 */ { dissect_pfcp_mbs_session_identifier }, /* MBS Session Identifier Variable Length / Clause 8.2.206 */ -/* 306 */ { dissect_pfcp_multicast_transport_information }, /* Multicast Transport Information Variable Length / Clause 8.2.207 */ -/* 307 */ { dissect_pfcp_mbsn4mbreq_flags }, /* MBSN4mbReq Flags Extendable / Clause 8.2.208 */ -/* 308 */ { dissect_pfcp_local_ingress_tunnel }, /* Local Ingress Tunnel Extendable / Clause 8.2.209 */ -/* 309 */ { dissect_pfcp_mbs_unicast_parameters_id }, /* MBS Unicast Parameters ID Extendable / Clause 8.2.210 */ -//310 to 32767 Spare. For future use. -//32768 to 65535 Vendor-specific IEs. - { NULL }, /* End of List */ + static int * const pfcp_mbsn4resp_flags_o5_flags[] = { + &hf_pfcp_spare_b7_b3, + &hf_pfcp_mbsn4resp_flags_o5_b2_n19dtr, + &hf_pfcp_mbsn4resp_flags_o5_b1_jmti, + &hf_pfcp_mbsn4resp_flags_o5_b0_nn19dt, + NULL + }; + /* Octet 5 Spare spare Spare Spare Spare N19DTR JMTI NN19DT */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_mbsn4resp_flags_o5_flags, ENC_BIG_ENDIAN); + offset++; + + if (offset < length) { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); + } + +} + +/* + * 8.2.212 Tunnel Password + */ +static void +dissect_pfcp_tunnel_password(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{; + /* Octet 5 to (n+4) Tunnel Password value */ + proto_tree_add_item(tree, hf_pfcp_tunnel_password_value, tvb, 0, -1, ENC_UTF_8 | ENC_NA); +} + +/* + * 8.2.213 Area Session ID + */ +static void +dissect_pfcp_area_session_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{; + guint32 value; + /* Octet 5 to (n+4) Tunnel Password value */ + proto_tree_add_item_ret_uint(tree, hf_pfcp_area_session_id_value, tvb, 0, 2, ENC_UTF_8 | ENC_NA, &value); + proto_item_append_text(item, "%u", value); +} + +/* + * 8.2.214 DSCP to PPI Mapping Information + */ +static void +dissect_pfcp_dscp_to_ppi_mapping_information(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + int dscp_values = 0; + + /* Octet 5 Paging Policy Indicator (PPI) + * The PPI shall be encoded as a value between 0 and 7, as specified in clause 5.5.3.7 of 3GPP TS 38.415 + */ + proto_tree_add_item(tree, hf_pfcp_dscp_to_ppi_mapping_info_ppi_value, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + + while (offset < length) { + proto_tree_add_item(tree, hf_pfcp_dscp_to_ppi_mapping_info_dscp_value, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + dscp_values++; + + /* no more than 63 DSCP values */ + if(dscp_values >= 63) { + break; + } + } + + if (offset < length) { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); + } +} + +/* + * 8.2.215 PFCPSDRsp-Flags + */ +static void +dissect_pfcp_pfcpsdrsp_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + static int * const pfcp_pfcpsdrsp_flags[] = { + &hf_pfcp_spare_b7_b1, + &hf_pfcp_pfcpsdrsp_flags_b0_puru, + NULL + }; + /* Octet 5 Spare PURU */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_pfcpsdrsp_flags, ENC_BIG_ENDIAN); + offset += 1; + + if (offset < length) { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); + } +} + +/* + * 8.2.216 QER Indications + */ +static void +dissect_pfcp_qer_indications(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + static int * const pfcp_qer_indications_flags[] = { + &hf_pfcp_spare_b7_b4, + &hf_pfcp_qer_indications_flags_b3_pdusm, + &hf_pfcp_qer_indications_flags_b2_eml4s, + &hf_pfcp_qer_indications_flags_b1_edbmi, + &hf_pfcp_qer_indications_flags_b0_iqfis, + NULL + }; + /* Octet 5 Spare PDUSM EML4s EDBMI PURU */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_qer_indications_flags, ENC_BIG_ENDIAN); + offset += 1; + + if (offset < length) { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); + } +} + +/* + * 8.2.217 Vendor-Specific Node Report Type + */ +static void +dissect_pfcp_vendor_specific_node_report_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + /* Octet 5 to 6 Enterprise ID */ + proto_tree_add_item(tree, hf_pfcp_enterprise_id, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + + static int * const pfcp_vendor_specific_node_report_type_flags[] = { + &hf_pfcp_spare_b7, + &hf_pfcp_spare_b6, + &hf_pfcp_spare_b5, + &hf_pfcp_spare_b4, + &hf_pfcp_spare_b3, + &hf_pfcp_spare_b2, + &hf_pfcp_spare_b1, + &hf_pfcp_spare_b0, + NULL + }; + /* Octet 5 Spare */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_vendor_specific_node_report_type_flags, ENC_BIG_ENDIAN); + offset += 1; + + if (offset < length) { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); + } +} + +/* + * 8.2.218 Configured Time Domain + */ +static void +dissect_pfcp_configured_time_domain(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + static int * const pfcp_configured_time_domain_flags[] = { + &hf_pfcp_spare_b7_b1, + &hf_pfcp_configured_time_domain_flags_b0_ctdi, + NULL + }; + /* Octet 5 Spare CTDI */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_configured_time_domain_flags, ENC_BIG_ENDIAN); + offset += 1; + + if (offset < length) { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); + } +} + +/* + * 8.2.219 Metadata + */ +static void +dissect_pfcp_metadata(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + /* Octet 5 to (n+4) Metadata + * The Metadata field shall contain an octet string set to base64-encoded characters as specified in clause 5.5.2 of 3GPP TS 29.571 + */ + proto_tree_add_item(tree, hf_pfcp_metadata, tvb, offset, length, ENC_NA); + + tvbuff_t* bin_tvb = base64_tvb_to_new_tvb(tvb, offset, length); + int bin_tvb_length = tvb_reported_length(bin_tvb); + add_new_data_source(pinfo, bin_tvb, "Base64 decoded"); + proto_tree_add_item(tree, hf_pfcp_metadata_binary_metadata, bin_tvb, 0, bin_tvb_length, ENC_NA); +} + +/* + * 8.2.220 Traffic Parameter Threshold + */ +static void +dissect_pfcp_traffic_parameter_threshold(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + guint64 traffic_parameter_threshold_flags; + + static int * const pfcp_traffic_parameter_threshold_flags[] = { + &hf_pfcp_spare_b7_b1, + &hf_pfcp_traffic_parameter_threshold_flags_b0_dl, + NULL + }; + /* Octet 5 Spare DL */ + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_traffic_parameter_threshold_flags, ENC_BIG_ENDIAN, &traffic_parameter_threshold_flags); + offset += 1; + + /* Octet 6 to 9 Downlink N6 Jitter threshold (if present)*/ + if ((traffic_parameter_threshold_flags & 0x1)) { + proto_tree_add_item(tree, hf_pfcp_traffic_parameter_threshold_downlink_n6_jitter_threshold, 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.221 DL Periodicity + */ +static void +dissect_pfcp_dl_periodicity(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + // Octet 5 Spare Octet + proto_tree_add_item(tree, hf_pfcp_spare_oct, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + + /* Octet 6 to 9 DL Periodicity */ + proto_tree_add_item(tree, hf_pfcp_dl_periodicity_value, 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.222 N6 Jitter Measurement + */ +static void +dissect_pfcp_n6_jitter_measurement(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + guint64 n6_jitter_measurement_flags; + + static int * const pfcp_n6_jitter_measurement_flags[] = { + &hf_pfcp_spare_b7_b1, + &hf_pfcp_n6_jitter_measurement_flags_b0_dl, + NULL + }; + /* Octet 5 Spare DL */ + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_n6_jitter_measurement_flags, ENC_BIG_ENDIAN, &n6_jitter_measurement_flags); + offset += 1; + + if ((n6_jitter_measurement_flags & 0x1)) { + /* Octet 6 to 9 DL Periodicity */ + proto_tree_add_item(tree, hf_pfcp_n6_jitter_measurement_dl_periodicity, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + + /* Octet 10 to 13 Lower DL Jitter Measurement */ + proto_tree_add_item(tree, hf_pfcp_n6_jitter_measurement_lower_dl_jitter_measurement, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + + /* Octet 14 to 17 Higher DL Jitter Measurement */ + proto_tree_add_item(tree, hf_pfcp_n6_jitter_measurement_higher_dl_jitter_measurement, 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.223 Traffic Parameter Measurement Indication + */ +static void +dissect_pfcp_traffic_parameter_measurement_indication(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + static int * const pfcp_traffic_parameter_measurement_indication_flags[] = { + &hf_pfcp_spare_b7_b3, + &hf_pfcp_traffic_parameter_measurement_indication_flags_b2_n6jmi, + &hf_pfcp_traffic_parameter_measurement_indication_flags_b1_dlpmi, + &hf_pfcp_traffic_parameter_measurement_indication_flags_b0_ulpmi, + NULL + }; + /* Octet 5 Spare N6JMI DLPMI ULPMI */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_traffic_parameter_measurement_indication_flags, ENC_BIG_ENDIAN); + offset += 1; + + if (offset < length) { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); + } +} + +/* + * 8.2.224 UL Periodicity + */ +static void +dissect_pfcp_ul_periodicity(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + // Octet 5 Spare Octet + proto_tree_add_item(tree, hf_pfcp_spare_oct, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + + /* Octet 6 to 9 DL Periodicity */ + proto_tree_add_item(tree, hf_pfcp_ul_periodicity_value, 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.225 MPQUIC Control Information + */ +static void +dissect_pfcp_mpquic_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + static int * const pfcp_mpquic_control_information_flags[] = { + &hf_pfcp_spare_b7_b1, + &hf_pfcp_mpquic_control_information_flags_b0_cupd, + NULL + }; + /* Octet 5 Spare CUDP */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_mpquic_control_information_flags, ENC_BIG_ENDIAN); + offset += 1; + + if (offset < length) { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); + } +} + +/* + * 8.2.226 MPQUIC Address Information + */ +static const value_string pfcp_mpquic_address_information_type_vals[] = { + { 1, "Transport converter, used only if the proxy type is MPTCP" }, + { 2, "Connect-UDP, used only if the proxy type is MPQUIC" }, + { 0, NULL } }; -#define NUM_PFCP_IES (sizeof(pfcp_ies)/sizeof(pfcp_ie_t)) -/* Set up the array to hold "etts" for each IE*/ -gint ett_pfcp_elem[NUM_PFCP_IES-1]; +static void +dissect_pfcp_mpquic_address_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + guint64 mpquic_address_information_flags; + + static int * const pfcp_mpquic_address_information_flags[] = { + &hf_pfcp_spare_b7_b1, + &hf_pfcp_mpquic_address_information_flags_b1_v6, + &hf_pfcp_mpquic_address_information_flags_b0_v4, + NULL + }; + /* Octet 5 Spare V6 V4 */ + proto_tree_add_bitmask_list_ret_uint64(tree, tvb, offset, 1, pfcp_mpquic_address_information_flags, ENC_BIG_ENDIAN, &mpquic_address_information_flags); + offset += 1; + + /* 6 MPQUIC Proxy Type */ + proto_tree_add_item(tree, hf_pfcp_mpquic_address_information_type, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + + /* 7 MPQUIC Proxy Port */ + proto_tree_add_item(tree, hf_pfcp_mpquic_address_information_port, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + + /* p to (p+3) MPQUIC Proxy IPv4 address (if present) */ + if ((mpquic_address_information_flags & 0x1)) { + proto_tree_add_item(tree, hf_pfcp_mpquic_address_information_address_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + } + /* q to (q+15) MPQUIC Proxy IPv6 address (if present) */ + if ((mpquic_address_information_flags & 0x2)) { + proto_tree_add_item(tree, hf_pfcp_mpquic_address_information_address_ipv6, tvb, offset, 16, ENC_NA); + offset += 16; + } + + if (offset < length) { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); + } +} + +/* + * 8.2.227 Transport Mode + */ +static const value_string pfcp_transport_mode_type_vals[] = { + { 0, "Datagram mode 1" }, + { 1, "Datagram mode 2" }, + { 2, "Stream mode" }, + { 0, NULL } +}; + +static void +dissect_pfcp_transport_mode(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + /* 5 Transport Mode Value */ + proto_tree_add_item(tree, hf_pfcp_transport_mode_value, 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); + } +} + +/* + * 8.2.228 Protocol Description + */ +static void +dissect_pfcp_protocol_description(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + static int * const pfcp_protocol_description_flags[] = { + &hf_pfcp_spare_b7_b3, + &hf_pfcp_protocol_description_flags_b2_srtp, + &hf_pfcp_protocol_description_flags_b1_rtp, + &hf_pfcp_protocol_description_flags_b0_h264, + NULL + }; + /* Octet 5 Spare SRTP RTP H264 */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_protocol_description_flags, ENC_BIG_ENDIAN); + offset += 1; + + if (offset < length) { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); + } +} + +/* + * 8.2.229 Reporting Suggestion Info + */ +static const value_string pfcp_reporting_urgency_type_vals[] = { + { 0, "Delay tolerant" }, + { 1, "Non delay tolerant" }, + { 0, NULL } +}; + +static void +dissect_pfcp_reporting_suggestion_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + guint32 value; + + /* 5 Reporting Urgency value */ + proto_tree_add_item_ret_uint(tree, hf_pfcp_reporting_suggestion_info_reporting_urgency_value, tvb, offset, 1, ENC_BIG_ENDIAN, &value); + offset += 1; + + /* 6-9 Reporting Time Info */ + if (value == 0) { + proto_tree_add_item(tree, hf_pfcp_reporting_suggestion_info_reporting_time_info, 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.230 TL-Container + */ +static void +dissect_pfcp_tl_container(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + /* Octet 5 to (n+4) TL-Container + * The TL-Container Information field shall be encoded as an Octet String. + * It shall encode a Get or Set Request or Response message defined in 3GPP TS 29.585. + */ + proto_tree_add_item(tree, hf_pfcp_tl_container, tvb, offset, length, ENC_NA); +} + +/* + * 8.2.231 Measurement Indication + */ +static void +dissect_pfcp_measurement_indication(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + static int * const pfcp_measurement_indication_flags[] = { + &hf_pfcp_spare_b7_b1, + &hf_pfcp_measurement_indication_flags_b0_dqfi, + NULL + }; + /* Octet 5 Spare DQFI */ + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_measurement_indication_flags, ENC_BIG_ENDIAN); + offset += 1; + + if (offset < length) { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); + } +} + +/* + * 8.2.232 HPLMN S-NSSAI + */ +static void +dissect_pfcp_hplmn_s_nssai(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + /* The SST (Slice/Service Type) and SD (Slice Differentiator) fields shall be encoded as defined in clause 28.4.2 of 3GPP TS 23.003. */ + /* Octet 5 SST */ + proto_tree_add_item(tree, hf_pfcp_hplmn_s_nssai_sst, tvb, offset, 1, ENC_NA); + offset += 1; + + /* Octet 6-8 SD */ + proto_tree_add_item(tree, hf_pfcp_hplmn_s_nssai_sd, tvb, offset, 3, ENC_NA); +} + +/* + * 8.2.233 Media Transport Protocol + */ +static const value_string pfcp_media_transport_protocol_vals[] = { + { 0, "Unspecified" }, + { 1, "RTP (Real-time Transport Protocol)" }, + { 2, "SRTP (Secure Real-Time Protocol)" }, + { 0, NULL } +}; + +static void +dissect_pfcp_media_transport_protocol(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + int offset = 0; + + /* 5 Media Transport Protocol */ + proto_tree_add_item(tree, hf_pfcp_media_transport_protocol, 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); + } +} + +/* + * 8.2.234 RTP Header Extension Type + */ +static const value_string pfcp_rtp_header_extension_type_vals[] = { + { 1, "RTP Header Extension for PDU Set Marking" }, + { 0, NULL } +}; + +static void +dissect_pfcp_rtp_header_extension_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + /* Octet 5 RTP Header Extension Type */ + proto_tree_add_item(tree, hf_pfcp_rtp_header_extension_type, tvb, 0, length, ENC_NA); +} + +/* + * 8.2.235 RTP Header Extension ID + */ +static void +dissect_pfcp_rtp_header_extension_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + /* Octet 5 RTP Header Extension ID */ + proto_tree_add_item(tree, hf_pfcp_rtp_header_extension_id, tvb, 0, length, ENC_NA); +} + +/* + * 8.2.236 RTP Payload Type + */ +static void +dissect_pfcp_rtp_payload_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + /* Octet 5 RTP Payload Type */ + proto_tree_add_item(tree, hf_pfcp_rtp_payload_type, tvb, 0, length, ENC_NA); +} + +/* + * 8.2.237 RTP Payload Format + */ +static const value_string pfcp_rtp_payload_format_vals[] = { + { 1, "RTP Header Extension for PDU Set Marking" }, + { 0, NULL } +}; + +static void +dissect_pfcp_rtp_payload_format(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +{ + /* Octet 5 RTP Payload Format */ + proto_tree_add_item(tree, hf_pfcp_rtp_payload_format, tvb, 0, length, ENC_NA); +} static pfcp_msg_hash_t * pfcp_match_response(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint seq_nr, guint msgtype, pfcp_conv_info_t *pfcp_info, guint8 last_cause) { pfcp_msg_hash_t pcr, *pcrp = NULL; - guint32 *session; + guint32 session; pcr.seq_nr = seq_nr; pcr.req_time = pinfo->abs_ts; @@ -9364,17 +9818,17 @@ pfcp_match_response(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint if (g_pfcp_session && !PINFO_FD_VISITED(pinfo)) { /* PFCP session */ /* If it's not already in the list */ - session = (guint32 *)g_hash_table_lookup(pfcp_session_table, &pinfo->num); + session = GPOINTER_TO_UINT(g_hash_table_lookup(pfcp_session_table, GUINT_TO_POINTER(pinfo->num))); if (!session) { - session = (guint32 *)g_hash_table_lookup(pfcp_session_table, &pcrp->req_frame); - if (session != NULL) { - pfcp_add_session(pinfo->num, *session); + session = GPOINTER_TO_UINT(g_hash_table_lookup(pfcp_session_table, GUINT_TO_POINTER(pcrp->req_frame))); + if (session) { + pfcp_add_session(pinfo->num, session); } } if (!pfcp_is_cause_accepted(last_cause)){ /* If the cause is not accepted then we have to remove all the session information about its corresponding request */ - pfcp_remove_frame_info(&pcrp->req_frame); + pfcp_remove_frame_info(pcrp->req_frame); } } } @@ -9385,58 +9839,43 @@ pfcp_match_response(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint /* 7.2.3.3 Grouped Information Elements */ static void -dissect_pfcp_grouped_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, int ett_index, pfcp_session_args_t *args) +dissect_pfcp_grouped_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - int offset = 0; - tvbuff_t *new_tvb; - proto_tree *grouped_tree; - proto_item_append_text(item, "[Grouped IE]"); - grouped_tree = proto_item_add_subtree(tree, ett_index); - - new_tvb = tvb_new_subset_length(tvb, offset, length); - dissect_pfcp_ies_common(new_tvb, pinfo, grouped_tree, offset, length, message_type, args); - + dissect_pfcp_ies_common(tvb, pinfo, tree, 0, length, message_type, args); } -static void -dissect_pfcp_pdi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) +// wrapper around dissect_pfcp_grouped_ie with the dissector_t prototype +static int +dissect_pfcp_grouped_ie_wrapper(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ID_PDI], args); + pfcp_sub_dis_t *pfcp_sub_dis_info = (pfcp_sub_dis_t *)data; + + dissect_pfcp_grouped_ie(tvb, pinfo, tree, proto_tree_get_parent(tree), tvb_reported_length(tvb), pfcp_sub_dis_info->message_type, pfcp_sub_dis_info->args); + + return tvb_reported_length(tvb); } static void dissect_pfcp_create_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ID_CREATE_PDR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": PDR ID: %u", args->last_rule_ids.pdr); } static void dissect_pfcp_create_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_FAR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": FAR ID: %s %u", tfs_get_string((args->last_rule_ids.far & 0x80000000), &pfcp_id_predef_dynamic_tfs), (args->last_rule_ids.far & 0x7fffffff)); } static void -dissect_pfcp_forwarding_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_FORWARDING_PARAMETERS], args); -} - -static void -dissect_pfcp_duplicating_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_DUPLICATING_PARAMETERS], args); -} - -static void dissect_pfcp_create_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_URR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": URR ID: %s %u", tfs_get_string((args->last_rule_ids.urr & 0x80000000), &pfcp_id_predef_dynamic_tfs), (args->last_rule_ids.urr & 0x7fffffff)); @@ -9445,7 +9884,7 @@ dissect_pfcp_create_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro static void dissect_pfcp_create_qer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_QER], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": QER ID: %s %u", tfs_get_string((args->last_rule_ids.qer & 0x80000000), &pfcp_id_predef_dynamic_tfs), (args->last_rule_ids.qer & 0x7fffffff)); @@ -9454,43 +9893,37 @@ dissect_pfcp_create_qer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro static void dissect_pfcp_created_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATED_PDR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": PDR ID: %u", args->last_rule_ids.pdr); } static void dissect_pfcp_update_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_PDR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": PDR ID: %u", args->last_rule_ids.pdr); } static void dissect_pfcp_update_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_FAR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": FAR ID: %s %u", tfs_get_string((args->last_rule_ids.far & 0x80000000), &pfcp_id_predef_dynamic_tfs), (args->last_rule_ids.far & 0x7fffffff)); } static void -dissect_pfcp_upd_forwarding_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPD_FORWARDING_PARAM], args); -} - -static void dissect_pfcp_update_bar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_BAR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": BAR ID: %u", args->last_rule_ids.bar); } static void dissect_pfcp_update_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_URR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": URR ID: %s %u", tfs_get_string((args->last_rule_ids.urr & 0x80000000), &pfcp_id_predef_dynamic_tfs), (args->last_rule_ids.urr & 0x7fffffff)); @@ -9499,7 +9932,7 @@ dissect_pfcp_update_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro static void dissect_pfcp_update_qer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_QER], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": QER ID: %s %u", tfs_get_string((args->last_rule_ids.qer & 0x80000000), &pfcp_id_predef_dynamic_tfs), (args->last_rule_ids.qer & 0x7fffffff)); @@ -9508,14 +9941,14 @@ dissect_pfcp_update_qer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro static void dissect_pfcp_remove_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_PDR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": PDR ID: %u", args->last_rule_ids.pdr); } static void dissect_pfcp_remove_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_FAR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": FAR ID: %s %u", tfs_get_string((args->last_rule_ids.far & 0x80000000), &pfcp_id_predef_dynamic_tfs), (args->last_rule_ids.far & 0x7fffffff)); @@ -9524,7 +9957,7 @@ dissect_pfcp_remove_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro static void dissect_pfcp_remove_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_URR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": URR ID: %s %u", tfs_get_string((args->last_rule_ids.urr & 0x80000000), &pfcp_id_predef_dynamic_tfs), (args->last_rule_ids.urr & 0x7fffffff)); @@ -9533,53 +9966,16 @@ dissect_pfcp_remove_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro static void dissect_pfcp_remove_qer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_QER], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": QER ID: %s %u", tfs_get_string((args->last_rule_ids.qer & 0x80000000), &pfcp_id_predef_dynamic_tfs), (args->last_rule_ids.qer & 0x7fffffff)); } static void -dissect_pfcp_load_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_LOAD_CONTROL_INFORMATION], args); -} - -static void -dissect_pfcp_overload_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_OVERLOAD_CONTROL_INFORMATION], args); -} - -static void -dissect_pfcp_application_ids_pfds(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_APPLICATION_IDS_PFDS], args); -} - -static void -dissect_pfcp_pfd_context(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PFD_CONTEXT], args); -} - - -static void -dissect_pfcp_application_detection_inf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_APPLICATION_DETECTION_INF], args); -} - -static void -dissect_pfcp_pfcp_query_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_QUERY_URR], args); -} - -static void dissect_pfcp_usage_report_smr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_USAGE_REPORT_SMR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": URR ID: %s %u", tfs_get_string((args->last_rule_ids.urr & 0x80000000), &pfcp_id_predef_dynamic_tfs), (args->last_rule_ids.urr & 0x7fffffff)); @@ -9588,7 +9984,7 @@ dissect_pfcp_usage_report_smr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre static void dissect_pfcp_usage_report_sdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_USAGE_REPORT_SDR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": URR ID: %s %u", tfs_get_string((args->last_rule_ids.urr & 0x80000000), &pfcp_id_predef_dynamic_tfs), (args->last_rule_ids.urr & 0x7fffffff)); @@ -9597,454 +9993,576 @@ dissect_pfcp_usage_report_sdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre static void dissect_pfcp_usage_report_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_USAGE_REPORT_SRR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": URR ID: %s %u", tfs_get_string((args->last_rule_ids.urr & 0x80000000), &pfcp_id_predef_dynamic_tfs), (args->last_rule_ids.urr & 0x7fffffff)); } static void -dissect_pfcp_downlink_data_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_DOWNLINK_DATA_REPORT], args); -} - -static void dissect_pfcp_create_bar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_BAR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": BAR ID: %u", args->last_rule_ids.bar); } static void dissect_pfcp_update_bar_smr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_BAR_SMR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": BAR ID: %u", args->last_rule_ids.bar); } static void dissect_pfcp_remove_bar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_BAR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": BAR ID: %u", args->last_rule_ids.bar); } static void -dissect_pfcp_error_indication_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ERROR_INDICATION_REPORT], args); -} - -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, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_USER_PLANE_PATH_FAILURE_REPORT], args); -} - -static void -dissect_pfcp_update_duplicating_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_DUPLICATING_PARAMETERS], args); -} - -static void -dissect_pfcp_aggregated_urrs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_AGGREGATED_URRS], args); -} - -static void -dissect_pfcp_create_traffic_endpoint(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_TRAFFIC_ENDPOINT], args); -} - -static void -dissect_pfcp_created_traffic_endpoint(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATED_TRAFFIC_ENDPOINT], args); -} - -static void -dissect_pfcp_update_traffic_endpoint(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_TRAFFIC_ENDPOINT], args); -} - -static void -dissect_pfcp_remove_traffic_endpoint(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_TRAFFIC_ENDPOINT], args); -} - -static void -dissect_pfcp_ethernet_packet_filter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ETHERNET_PACKET_FILTER], args); -} - -static void -dissect_pfcp_ethernet_traffic_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ETHERNET_TRAFFIC_INFORMATION], args); -} - -static void -dissect_pfcp_additional_monitoring_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ADDITIONAL_MONITORING_TIME], args); -} - -static void dissect_pfcp_create_mar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_MAR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": MAR ID: %u", args->last_rule_ids.mar); } static void -dissect_pfcp_access_forwarding_action_information_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ACCESS_FORWARDING_ACTION_INORMATION_1], args); -} - -static void -dissect_pfcp_access_forwarding_action_information_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ACCESS_FORWARDING_ACTION_INORMATION_2], args); -} - -static void dissect_pfcp_update_mar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_MAR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": MAR ID: %u", args->last_rule_ids.mar); } static void dissect_pfcp_remove_mar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_MAR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": MAR ID: %u", args->last_rule_ids.mar); } static void -dissect_pfcp_update_access_forwarding_action_information_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_ACCESS_FORWARDING_ACTION_INORMATION_1], args); -} - -static void -dissect_pfcp_update_access_forwarding_action_information_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_ACCESS_FORWARDING_ACTION_INORMATION_2], args); -} - -static void -dissect_pfcp_pfcp_session_retention_information_within_pfcp_association_setup_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PFCP_SESSION_RETENTION_INFORMATION_WITHIN_ASSOCIATION_SETUP_REQUEST], args); -} - -static void -dissect_pfcp_user_plane_path_recovery_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_USER_PLANE_PATH_RECOVERY_REPORT], args); -} - -static void -dissect_ip_multicast_addressing_info_within_pfcp_session_establishment_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_IP_MULTICAST_ADDRESSING_INFO], args); -} - -static void -dissect_pfcp_join_ip_multicast_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_JOIN_IP_MULTICAST_INFORMATION], args); -} - -static void -dissect_pfcp_leave_ip_multicast_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_LEAVE_IP_MULTICAST_INFORMATION], args); -} - -static void -dissect_pfcp_created_bridge_info_for_tsc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATED_BRIDGE_INFO_FOR_TSC], args); -} - -static void -dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_TSC_MANAGEMENT_INFORMATION_WITHIN_PCFP_SESSION_MODIFICATION_REQUEST], args); -} - -static void -dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_TSC_MANAGEMENT_INFORMATION_WITHIN_PCFP_SESSION_MODIFICATION_RESPONSE], args); -} - -static void -dissect_pfcp_tsc_management_information_ie_within_pfcp_session_report_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_TSC_MANAGEMENT_INFORMATION_WITHIN_PCFP_SESSION_REPORT_REQUEST], args); -} - -static void -dissect_pfcp_clock_drift_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CLOCK_DRIFT_CONTROL_INFORMATION], args); -} - -static void -dissect_pfcp_clock_drift_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CLOCK_DRIFT_REPORT], args); -} - -static void dissect_pfcp_remove_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_SRR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": SRR ID: %u", args->last_rule_ids.srr); } static void dissect_pfcp_create_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_SRR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": SRR ID: %u", args->last_rule_ids.srr); } static void dissect_pfcp_update_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_SRR], args); + dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, args); proto_item_append_text(item, ": SRR ID: %u", args->last_rule_ids.srr); } -static void -dissect_pfcp_session_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_SESSION_REPORT], args); -} - -static void -dissect_pfcp_access_availability_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ACCESS_AVAILABILITY_CONTROL_INFORMATION], args); -} - -static void -dissect_pfcp_access_availability_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ACCESS_AVAILABILITY_REPORT], args); -} - -static void -dissect_pfcp_provide_atsss_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PROVICE_ATSSS_CONTROL_INFORMATION], args); -} - -static void -dissect_pfcp_atsss_control_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ATSSS_CONTROl_PARAMETERS], args); -} - -static void -dissect_pfcp_mptcp_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_MPTCP_PARAMETERS], args); -} - -static void -dissect_pfcp_atsss_ll_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ATSSS_LL_PARAMETERS], args); -} - -static void -dissect_pfcp_pmf_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PMF_PARAMETERS], args); -} - -static void -dissect_pfcp_ue_ip_address_pool_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UE_IP_ADDRESS_POOL_INFORMATION], args); -} - -static void -dissect_pfcp_gtp_u_path_qos_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_GTP_U_PATH_QOS_CONTROL_INFORMATION], args); -} - -static void -dissect_pfcp_gtp_u_path_qos_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_GTP_U_PATH_QOS_REPORT], args); -} - -static void -dissect_pfcp_qos_information_in_gtp_u_path_qos_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_QOS_INFORMATION_IN_GTP_U_PATH_QOS_REPORT], args); -} - -static void -dissect_pfcp_qos_monitoring_per_qos_flow_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_QOS_MONITORING_PER_QOS_FLOW_CONTROL_INFORMATION], args); -} - -static void -dissect_pfcp_qos_monitoring_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_QOS_MONITORING_REPORT], args); -} - -static void -dissect_pfcp_packet_rate_status_report_ie_within_pfcp_session_deletion_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PACKET_RATE_STATUS_REPORT_IE_WITHIN_PFCP_SESSION_DELETION_RESPONSE], args); -} - -static void -dissect_pfcp_ethernet_context_information_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PCFP_IE_ETHERNET_CONTEXT_INFORMATION_WITHIN_PFCP_SESSION_MODIFICATION_REQUEST], args); -} - -static void -dissect_pfcp_redundant_transmission_detection_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REDUNDANT_TRANSMISSION_DETECTION_PARAMETERS_IE_IN_PDI], args); -} - -static void -dissect_pfcp_updated_pdr_ie_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATED_PDR_IE_WITHIN_PFCP_SESSION_MODIFICATION_RESPONSE], args); -} +/* Array of functions to dissect IEs +* (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) +*/ +typedef struct _pfcp_ie { + void(*decode) (tvbuff_t *, packet_info *, proto_tree *, proto_item *, guint16, guint8, pfcp_session_args_t *); +} pfcp_ie_t; -static void -dissect_pfcp_provide_rds_configuration_information_ie_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PROVIDE_RDS_CONFIGURATION_INFORMATION_IE_WITHIN_PCFP_SESSION_ESTABLISHMENT_REQUEST], args); -} +static const pfcp_ie_t pfcp_ies[] = { +/* 0 */ { dissect_pfcp_reserved }, +/* 1 */ { dissect_pfcp_create_pdr }, /* Create PDR Extendable / Table 7.5.2.2-1 */ +/* 2 */ { dissect_pfcp_grouped_ie }, /* PDI Extendable / Table 7.5.2.2-2 */ +/* 3 */ { dissect_pfcp_create_far }, /* Create FAR Extendable / Table 7.5.2.3-1 */ +/* 4 */ { dissect_pfcp_grouped_ie }, /* Forwarding Parameters Extendable / Table 7.5.2.3-2 */ +/* 5 */ { dissect_pfcp_grouped_ie }, /* Duplicating Parameters Extendable / Table 7.5.2.3-3 */ +/* 6 */ { dissect_pfcp_create_urr }, /* Create URR Extendable / Table 7.5.2.4-1 */ +/* 7 */ { dissect_pfcp_create_qer }, /* Create QER Extendable / Table 7.5.2.5-1 */ +/* 8 */ { dissect_pfcp_created_pdr }, /* Created PDR Extendable / Table 7.5.3.2-1 */ +/* 9 */ { dissect_pfcp_update_pdr }, /* Update PDR Extendable / Table 7.5.4.2-1 */ +/* 10 */ { dissect_pfcp_update_far }, /* Update FAR Extendable / Table 7.5.4.3-1 */ +/* 11 */ { dissect_pfcp_grouped_ie }, /* Update Forwarding Parameters Extendable / Table 7.5.4.3-2 */ +/* 12 */ { dissect_pfcp_update_bar }, /* Update BAR (PFCP Session Report Response) Extendable / Table 7.5.9.2-1 */ +/* 13 */ { dissect_pfcp_update_urr }, /* Update URR Extendable / Table 7.5.4.4 */ +/* 14 */ { dissect_pfcp_update_qer }, /* Update QER Extendable / Table 7.5.4.5 */ +/* 15 */ { dissect_pfcp_remove_pdr }, /* Remove PDR Extendable / Table 7.5.4.6 */ +/* 16 */ { dissect_pfcp_remove_far }, /* Remove FAR Extendable / Table 7.5.4.7 */ +/* 17 */ { dissect_pfcp_remove_urr }, /* Remove URR Extendable / Table 7.5.4.8 */ +/* 18 */ { dissect_pfcp_remove_qer }, /* Remove QER Extendable / Table 7.5.4.9 */ +/* 19 */ { dissect_pfcp_cause }, /* Cause Fixed / Subclause 8.2.1 */ +/* 20 */ { dissect_pfcp_source_interface }, /* Source Interface Extendable / Subclause 8.2.2 */ +/* 21 */ { dissect_pfcp_f_teid }, /* F-TEID Extendable / Subclause 8.2.3 */ +/* 22 */ { dissect_pfcp_network_instance }, /* Network Instance Variable Length / Subclause 8.2.4 */ +/* 23 */ { dissect_pfcp_sdf_filter }, /* SDF Filter Extendable / Subclause 8.2.5 */ +/* 24 */ { dissect_pfcp_application_id }, /* Application ID Variable Length / Subclause 8.2.6 */ +/* 25 */ { dissect_pfcp_gate_status }, /* Gate Status Extendable / Subclause 8.2.7 */ +/* 26 */ { dissect_pfcp_mbr }, /* MBR Extendable / Subclause 8.2.8 */ +/* 27 */ { dissect_pfcp_gbr }, /* GBR Extendable / Subclause 8.2.9 */ +/* 28 */ { dissect_pfcp_qer_correlation_id }, /* QER Correlation ID Extendable / Subclause 8.2.10 */ +/* 29 */ { dissect_pfcp_precedence }, /* Precedence Extendable / Subclause 8.2.11 */ +/* 30 */ { dissect_pfcp_transport_level_marking }, /* Transport Level Marking Extendable / Subclause 8.2.12 */ +/* 31 */ { dissect_pfcp_volume_threshold }, /* Volume Threshold Extendable /Subclause 8.2.13 */ +/* 32 */ { dissect_pfcp_time_threshold }, /* Time Threshold Extendable /Subclause 8.2.14 */ +/* 33 */ { dissect_pfcp_monitoring_time }, /* Monitoring Time Extendable /Subclause 8.2.15 */ +/* 34 */ { dissect_pfcp_subseq_volume_threshold }, /* Subsequent Volume Threshold Extendable /Subclause 8.2.16 */ +/* 35 */ { dissect_pfcp_subsequent_time_threshold }, /* Subsequent Time Threshold Extendable /Subclause 8.2.17 */ +/* 36 */ { dissect_pfcp_inactivity_detection_time }, /* Inactivity Detection Time Extendable /Subclause 8.2.18 */ +/* 37 */ { dissect_pfcp_reporting_triggers }, /* Reporting Triggers Extendable /Subclause 8.2.19 */ +/* 38 */ { dissect_pfcp_redirect_information }, /* Redirect Information Extendable /Subclause 8.2.20 */ +/* 39 */ { dissect_pfcp_report_type }, /* Report Type Extendable / Subclause 8.2.21 */ +/* 40 */ { dissect_pfcp_offending_ie }, /* Offending IE Fixed / Subclause 8.2.22 */ +/* 41 */ { dissect_pfcp_forwarding_policy }, /* Forwarding Policy Extendable / Subclause 8.2.23 */ +/* 42 */ { dissect_pfcp_destination_interface }, /* Destination Interface Extendable / Subclause 8.2.24 */ +/* 43 */ { dissect_pfcp_up_function_features }, /* UP Function Features Extendable / Subclause 8.2.25 */ +/* 44 */ { dissect_pfcp_apply_action }, /* Apply Action Extendable / Subclause 8.2.26 */ +/* 45 */ { dissect_pfcp_dl_data_service_inf }, /* Downlink Data Service Information Extendable / Subclause 8.2.27 */ +/* 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_pfcpsmreq_flags }, /* PFCPSMReq-Flags Extendable / Subclause 8.2.31 */ +/* 50 */ { dissect_pfcp_pfcpsrrsp_flags }, /* PFCPSRRsp-Flags Extendable / Subclause 8.2.32 */ +/* 51 */ { dissect_pfcp_grouped_ie }, /* 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 */ +/* 54 */ { dissect_pfcp_grouped_ie }, /* Overload Control Information Extendable / Table 7.5.3.4-1 */ +/* 55 */ { dissect_pfcp_timer }, /* Timer Extendable / Subclause 8.2 35 */ +/* 56 */ { dissect_pfcp_pdr_id }, /* PDR ID Extendable / Subclause 8.2 36 */ +/* 57 */ { dissect_pfcp_f_seid }, /* F-SEID Extendable / Subclause 8.2 37 */ +/* 58 */ { dissect_pfcp_grouped_ie }, /* Application ID's PFDs Extendable / Table 7.4.3.1-2 */ +/* 59 */ { dissect_pfcp_grouped_ie }, /* PFD context Extendable / Table 7.4.3.1-3 */ +/* 60 */ { dissect_pfcp_node_id }, /* Node ID Extendable / Subclause 8.2.38 */ +/* 61 */ { dissect_pfcp_pfd_contents }, /* PFD contents Extendable / Subclause 8.2.39 */ +/* 62 */ { dissect_pfcp_measurement_method }, /* Measurement Method Extendable / Subclause 8.2.40 */ +/* 63 */ { dissect_pfcp_usage_report_trigger }, /* Usage Report Trigger Extendable / Subclause 8.2.41 */ +/* 64 */ { dissect_pfcp_measurement_period }, /* Measurement Period Extendable / Subclause 8.2.42 */ +/* 65 */ { dissect_pfcp_fq_csid }, /* FQ-CSID Extendable / Subclause 8.2.43 */ +/* 66 */ { dissect_pfcp_volume_measurement }, /* Volume Measurement Extendable / Subclause 8.2.44 */ +/* 67 */ { dissect_pfcp_duration_measurement }, /* Duration Measurement Extendable / Subclause 8.2.45 */ +/* 68 */ { dissect_pfcp_grouped_ie }, /* Application Detection Information Extendable / Table 7.5.8.3-2 */ +/* 69 */ { dissect_pfcp_time_of_first_packet }, /* Time of First Packet Extendable / Subclause 8.2.46 */ +/* 70 */ { dissect_pfcp_time_of_last_packet }, /* Time of Last Packet Extendable / Subclause 8.2.47 */ +/* 71 */ { dissect_pfcp_quota_holding_time }, /* Quota Holding Time Extendable / Subclause 8.2.48 */ +/* 72 */ { dissect_pfcp_dropped_dl_traffic_threshold }, /* Dropped DL Traffic Threshold Extendable / Subclause 8.2.49 */ +/* 73 */ { dissect_pfcp_volume_quota }, /* Volume Quota Extendable / Subclause 8.2.50 */ +/* 74 */ { dissect_pfcp_time_quota }, /* Time Quota Extendable / Subclause 8.2.51 */ +/* 75 */ { dissect_pfcp_start_time }, /* Start Time Extendable / Subclause 8.2.52 */ +/* 76 */ { dissect_pfcp_end_time }, /* End Time Extendable / Subclause 8.2.53 */ +/* 77 */ { dissect_pfcp_grouped_ie }, /* Query URR Extendable / Table 7.5.4.10-1 */ +/* 78 */ { dissect_pfcp_usage_report_smr }, /* Usage Report (Session Modification Response) Extendable / Table 7.5.5.2-1 */ +/* 79 */ { dissect_pfcp_usage_report_sdr }, /* Usage Report (Session Deletion Response) Extendable / Table 7.5.7.2-1 */ +/* 80 */ { dissect_pfcp_usage_report_srr }, /* Usage Report (Session Report Request) Extendable / Table 7.5.8.3-1 */ +/* 81 */ { dissect_pfcp_urr_id }, /* URR ID Extendable / Subclause 8.2.54 */ +/* 82 */ { dissect_pfcp_linked_urr_id }, /* Linked URR ID Extendable / Subclause 8.2.55 */ +/* 83 */ { dissect_pfcp_grouped_ie }, /* Downlink Data Report Extendable / Table 7.5.8.2-1 */ +/* 84 */ { dissect_pfcp_outer_header_creation }, /* Outer Header Creation Extendable / Subclause 8.2.56 */ +/* 85 */ { dissect_pfcp_create_bar }, /* Create BAR Extendable / Table 7.5.2.6-1 */ +/* 86 */ { dissect_pfcp_update_bar_smr }, /* Update BAR (Session Modification Request) Extendable / Table 7.5.4.11-1 */ +/* 87 */ { dissect_pfcp_remove_bar }, /* Remove BAR Extendable / Table 7.5.4.12-1 */ +/* 88 */ { dissect_pfcp_bar_id }, /* BAR ID Extendable / Subclause 8.2.57 */ +/* 89 */ { dissect_pfcp_cp_function_features }, /* CP Function Features Extendable / Subclause 8.2.58 */ +/* 90 */ { dissect_pfcp_usage_information }, /* Usage Information Extendable / Subclause 8.2.59 */ +/* 91 */ { dissect_pfcp_application_instance_id }, /* Application Instance ID Variable Length / Subclause 8.2.60 */ +/* 92 */ { dissect_pfcp_flow_inf }, /* Flow Information Extendable / Subclause 8.2.61 */ +/* 93 */ { dissect_pfcp_ue_ip_address }, /* UE IP Address Extendable / Subclause 8.2.62 */ +/* 94 */ { dissect_pfcp_packet_rate }, /* Packet Rate Extendable / Subclause 8.2.63 */ +/* 95 */ { dissect_pfcp_outer_hdr_rem }, /* Outer Header Removal Extendable / Subclause 8.2.64 */ +/* 96 */ { dissect_pfcp_recovery_time_stamp }, /* Recovery Time Stamp Extendable / Subclause 8.2.65 */ +/* 97 */ { dissect_pfcp_dl_flow_level_marking }, /* DL Flow Level Marking Extendable / Subclause 8.2.66 */ +/* 98 */ { dissect_pfcp_header_enrichment }, /* Header Enrichment Extendable / Subclause 8.2.67 */ +/* 99 */ { dissect_pfcp_grouped_ie }, /* Error Indication Report Extendable / Table 7.5.8.4-1 */ +/* 100 */ { dissect_pfcp_measurement_info }, /* Measurement Information Extendable / Subclause 8.2.68 */ +/* 101 */ { dissect_pfcp_node_report_type }, /* Node Report Type Extendable / Subclause 8.2.69 */ +/* 102 */ { dissect_pfcp_grouped_ie }, /* User Plane Path Failure Report Extendable / Table 7.4.5.1.2-1 */ +/* 103 */ { dissect_pfcp_remote_gtp_u_peer }, /* Remote GTP-U Peer Extendable / Subclause 8.2.70 */ +/* 104 */ { dissect_pfcp_ur_seqn }, /* UR-SEQN Fixed Length / Subclause 8.2.71 */ +/* 105 */ { dissect_pfcp_grouped_ie }, /* Update Duplicating Parameters Extendable / Table 7.5.4.3-3 */ +/* 106 */ { dissect_pfcp_act_predef_rules }, /* Activate Predefined Rules Variable Length / Subclause 8.2.72 */ +/* 107 */ { dissect_pfcp_deact_predef_rules }, /* Deactivate Predefined Rules Variable Length / Subclause 8.2.73 */ +/* 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_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_quota_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_grouped_ie }, /* 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 */ { dissect_pfcp_grouped_ie }, /* Create Traffic Endpoint Extendable / Table 7.5.2.7 */ +/* 128 */ { dissect_pfcp_grouped_ie }, /* Created Traffic Endpoint Extendable / Table 7.5.3.5 */ +/* 129 */ { dissect_pfcp_grouped_ie }, /* Update Traffic Endpoint Extendable / Table 7.5.4.13 */ +/* 130 */ { dissect_pfcp_grouped_ie }, /* Remove Traffic Endpoint Extendable / Table 7.5.4.14 */ +/* 131 */ { dissect_pfcp_traffic_endpoint_id }, /* Traffic Endpoint ID Extendable / Subclause 8.2.92 */ +/* 132 */ { dissect_pfcp_grouped_ie }, /* Ethernet Packet Filter IE Extendable / Table 7.5.2.2-3 */ +/* 133 */ { dissect_pfcp_mac_address }, /* MAC address Extendable / Subclause 8.2.93 */ +/* 134 */ { dissect_pfcp_c_tag }, /* C-TAG Extendable / Subclause 8.2.94 */ +/* 135 */ { dissect_pfcp_s_tag }, /* S-TAG Extendable / Subclause 8.2.95 */ +/* 136 */ { dissect_pfcp_ethertype }, /* Ethertype Extendable / Subclause 8.2.96 */ +/* 137 */ { dissect_pfcp_proxying }, /* Proxying Extendable / Subclause 8.2.97 */ +/* 138 */ { dissect_pfcp_ethertype_filter_id }, /* Ethernet Filter ID Extendable / Subclause 8.2.98 */ +/* 139 */ { dissect_pfcp_ethernet_filter_properties }, /* Ethernet Filter Properties Extendable / Subclause 8.2.99 */ +/* 140 */ { dissect_pfcp_suggested_buffering_packets_count }, /* Suggested Buffering Packets Count Extendable / Subclause 8.2.100 */ +/* 141 */ { dissect_pfcp_user_id }, /* User ID Extendable / Subclause 8.2.101 */ +/* 142 */ { dissect_pfcp_ethernet_pdu_session_information }, /* Ethernet PDU Session Information Extendable / Subclause 8.2.102 */ +/* 143 */ { dissect_pfcp_grouped_ie }, /* Ethernet Traffic Information Extendable / Table 7.5.8.3-3 */ +/* 144 */ { dissect_pfcp_mac_addresses_detected }, /* MAC Addresses Detected Extendable / Subclause 8.2.103 */ +/* 145 */ { dissect_pfcp_mac_addresses_removed }, /* MAC Addresses Removed Extendable / Subclause 8.2.104 */ +/* 146 */ { dissect_pfcp_ethernet_inactivity_timer }, /* Ethernet Inactivity Timer Extendable / Subclause 8.2.105 */ +/* 147 */ { dissect_pfcp_grouped_ie }, /* Additional Monitoring Time Extendable / Table 7.5.2.4-3 */ +/* 148 */ { dissect_pfcp_event_quota }, /* Event Quota Extendable / Subclause 8.2.112 */ +/* 149 */ { dissect_pfcp_event_threshold }, /* Event Threshold Extendable / Subclause 8.2.113 */ +/* 150 */ { dissect_pfcp_subsequent_event_quota }, /* Subsequent Event Quota Extendable / Subclause 8.2.106 */ +/* 151 */ { dissect_pfcp_subsequent_event_threshold }, /* Subsequent Event Threshold Extendable / Subclause 8.2.107 */ +/* 152 */ { dissect_pfcp_trace_information }, /* Trace Information Extendable / Subclause 8.2.108 */ +/* 153 */ { dissect_pfcp_framed_route }, /* Framed-Route Variable Length / Subclause 8.2.109 */ +/* 154 */ { dissect_pfcp_framed_routing }, /* Framed-Routing Fixed Length / Subclause 8.2.110 */ +/* 155 */ { dissect_pfcp_framed_ipv6_route }, /* Framed-IPv6-Route Variable Length / Subclause 8.2.111 */ +/* 156 */ { dissect_pfcp_time_stamp }, /* Time Stamp Extendable / Subclause 8.2.114 */ +/* 157 */ { dissect_pfcp_averaging_window }, /* Averaging Window Extendable / Subclause 8.2.115 */ +/* 158 */ { dissect_pfcp_paging_policy_indicator }, /* Paging Policy Indicator Extendable / Subclause 8.2.116 */ +/* 159 */ { dissect_pfcp_apn_dnn }, /* APN/DNN Variable Length / Subclause 8.2.117 */ +/* 160 */ { dissect_pfcp_tgpp_interface_type }, /* 3GPP Interface Type Extendable / Subclause 8.2.118 */ +/* 161 */ { dissect_pfcp_pfcpsrreq_flags }, /* PFCPSRReq-Flags Extendable / Subclause 8.2.119 */ +/* 162 */ { dissect_pfcp_pfcpaureq_flags }, /* PFCPAUReq-Flags Extendable / Subclause 8.2.120 */ +/* 163 */ { dissect_pfcp_activation_time }, /* Activation Time Extendable / Subclause 8.2.121 */ +/* 164 */ { dissect_pfcp_deactivation_time }, /* Deactivation Time Extendable / Subclause 8.2.122 */ +/* 165 */ { dissect_pfcp_create_mar }, /* Create MAR Extendable / Table 7.5.2.8-1 */ +/* 166 */ { dissect_pfcp_grouped_ie }, /* Access Forwarding Action Information 1 Extendable / Table 7.5.2.8-2 */ +/* 167 */ { dissect_pfcp_grouped_ie }, /* Access Forwarding Action Information 2 Extendable / Table 7.5.2.8-3 */ +/* 168 */ { dissect_pfcp_remove_mar }, /* Remove MAR Extendable / Table 7.5.4.15-1*/ +/* 169 */ { dissect_pfcp_update_mar }, /* Update MAR Extendable / Table 7.5.4.16-1 */ +/* 170 */ { dissect_pfcp_mar_id }, /* MAR ID Extendable / Subclause 8.2.123 */ +/* 171 */ { dissect_pfcp_steering_functionality }, /* Steering Functionality Extendable / Subclause 8.2.124 */ +/* 172 */ { dissect_pfcp_steering_mode }, /* Steering Mode Extendable / Subclause 8.2.125 */ +/* 173 */ { dissect_pfcp_weight }, /* Weight Fixed / Clause 8.2.126 */ +/* 174 */ { dissect_pfcp_priority }, /* Priority Extendable / Subclause 8.2.127 */ +/* 175 */ { dissect_pfcp_grouped_ie }, /* Update Access Forwarding Action Information 1 Extendable / Table 7.5.4.16-2 */ +/* 176 */ { dissect_pfcp_grouped_ie }, /* Update Access Forwarding Action Information 2 Extendable / Table 7.5.4.16-3 */ +/* 177 */ { dissect_pfcp_ue_ip_address_pool_identity }, /* UE IP address Pool Identity Variable Length / Clause 8.2.128 */ +/* 178 */ { dissect_pfcp_alternative_smf_ip_address }, /* Alternative SMF IP Address Extendable / Clause 8.2.129 */ +/* 179 */ { dissect_pfcp_packet_replication_and_detection_carry_on_information }, /* Packet Replication and Detection Carry-On Information Extendable / Clause 8.2.130 */ +/* 180 */ { dissect_pfcp_smf_set_id }, /* SMF Set ID Extendable / Clause 8.2.131 */ +/* 181 */ { dissect_pfcp_quota_validity_time }, /* Quota Validity Time Extendable / Clause 8.2.132 */ +/* 182 */ { dissect_pfcp_number_of_reports }, /* Number of Reports Fixed / Clause 8.2.133 */ +/* 183 */ { dissect_pfcp_grouped_ie }, /* PFCP Session Retention Information (within PFCP Association Setup Request) Extendable / Table 7.4.4.1-2 */ +/* 184 */ { dissect_pfcp_pfcpasrsp_flags }, /* PFCPASRsp-Flags Extendable / Clause 8.2.134 */ +/* 185 */ { dissect_pfcp_cp_pfcp_entity_ip_address }, /* CP PFCP Entity IP Address Extendable / Clause 8.2.135 */ +/* 186 */ { dissect_pfcp_pfcpsereq_flags }, /* PFCPSEReq-Flags Extendable / Clause 8.2.136 */ +/* 187 */ { dissect_pfcp_grouped_ie }, /* User Plane Path Recovery Report Extendable / Table 7.4.5.1.3-1 */ +/* 188 */ { dissect_pfcp_grouped_ie }, /* IP Multicast Addressing Info within PFCP Session Establishment Request Extendable / Clause 7.5.2.2-4 */ +/* 189 */ { dissect_pfcp_grouped_ie }, /* Join IP Multicast Information IE within Usage Report Extendable / Table 7.5.8.3-4 */ +/* 190 */ { dissect_pfcp_grouped_ie }, /* Leave IP Multicast Information IE within Usage Report Extendable / Table 7.5.8.3-5 */ +/* 191 */ { dissect_pfcp_ip_multicast_address }, /* IP Multicast Address Extendable / Clause 8.2.137 */ +/* 192 */ { dissect_pfcp_source_ip_address }, /* Source IP Address Extendable / Clause 8.2.138 */ +/* 193 */ { dissect_pfcp_packet_rate_status }, /* Packet Rate Status Extendable / Clause 8.2.139 */ +/* 194 */ { dissect_pfcp_create_bridge_router_info }, /* Create Bridge/Router Info Extendable / Clause 8.2.140 */ +/* 195 */ { dissect_pfcp_grouped_ie }, /* Created Bridge/Router Info Extendable / Table 7.5.3.6-1 */ +/* 196 */ { dissect_pfcp_port_number }, /* Port Number Fixed Length / Clause 8.2.141 */ +/* 197 */ { dissect_pfcp_nw_tt_port_number }, /* NW-TT Port Number Fixed Length / Clause 8.2.142 */ +/* 198 */ { dissect_pfcp_5gs_user_plane_node_id }, /* 5GS User Plane Node ID Extendable / Clause 8.2.143 */ +/* 199 */ { dissect_pfcp_grouped_ie }, /* TSC Management Information IE within PFCP Session Modification Request Extendable / Table 7.5.4.18-1 */ +/* 200 */ { dissect_pfcp_grouped_ie }, /* TSC Management Information IE within PFCP Session Modification Response Extendable / Table 7.5.5.3-1 */ +/* 201 */ { dissect_pfcp_grouped_ie }, /* TSC Management Information IE within PFCP Session Report Request Extendable / Table 7.5.8.5-1 */ +/* 202 */ { dissect_pfcp_port_management_information_container }, /* Port Management Information Container Variable Length / Clause 8.2.144 */ +/* 203 */ { dissect_pfcp_grouped_ie }, /* Clock Drift Control Information Extendable / Table 7.4.4.1.2-1 */ +/* 204 */ { dissect_pfcp_requested_clock_drift_control_information }, /* Requested Clock Drift Information Extendable / Clause 8.2.145 */ +/* 205 */ { dissect_pfcp_grouped_ie }, /* Clock Drift Report Extendable / Table 7.4.5.1.4-1 */ +/* 206 */ { dissect_pfcp_time_domain_number }, /* Time Domain Number Extendable / Clause 8.2.146 */ +/* 207 */ { dissect_pfcp_time_offset_threshold }, /* Time Offset Threshold Extendable / Clause 8.2.147 */ +/* 208 */ { dissect_pfcp_cumulative_rate_ratio_threshold }, /* Cumulative rateRatio Threshold Extendable / Clause 8.2.148 */ +/* 209 */ { dissect_pfcp_time_offset_measurement }, /* Time Offset Measurement Extendable / Clause 8.2.149 */ +/* 210 */ { dissect_pfcp_cumulative_rate_ratio_measurement }, /* Cumulative rateRatio Measurement Extendable / Clause 8.2.150 */ +/* 211 */ { dissect_pfcp_remove_srr }, /* Remove SRR Extendable/ Table 7.5.4.19-1 */ +/* 212 */ { dissect_pfcp_create_srr }, /* Create SRR Extendable/ Table 7.5.2.9-1 */ +/* 213 */ { dissect_pfcp_update_srr }, /* Update SRR Extendable/ Table 7.5.4.21-1 */ +/* 214 */ { dissect_pfcp_grouped_ie }, /* Session Report Extendable / Table 7.5.8.7-1 */ +/* 215 */ { dissect_pfcp_srr_id }, /* SRR ID Extendable / Clause 8.2.151 */ +/* 216 */ { dissect_pfcp_grouped_ie }, /* Access Availability Control Information Extendable / Table 7.5.2.9-2 */ +/* 217 */ { dissect_pfcp_requested_access_availability_control_information }, /* Requested Access Availability Information Extendable / Clause 8.2.152 */ +/* 218 */ { dissect_pfcp_grouped_ie }, /* Access Availability Report Extendable / Table 7.5.8.6-2 */ +/* 219 */ { dissect_pfcp_access_availability_information }, /* Access Availability Information Extendable / Clause 8.2.153 */ +/* 220 */ { dissect_pfcp_grouped_ie }, /* Provide ATSSS Control Information Extendable / Table 7.5.2.10-1 */ +/* 221 */ { dissect_pfcp_grouped_ie }, /* ATSSS Control Parameters Extendable / Table 7.5.3.7-1 */ +/* 222 */ { dissect_pfcp_mptcp_control_information }, /* MPTCP Control Information Extendable / Clause 8.2.154 */ +/* 223 */ { dissect_pfcp_atsss_ll_control_information }, /* ATSSS-LL Control Information Extendable / Clause 8.2.155 */ +/* 224 */ { dissect_pfcp_pmf_control_information }, /* PMF Control Information Extendable / Clause 8.2.156 */ +/* 225 */ { dissect_pfcp_grouped_ie }, /* MPTCP Parameters Extendable / Table 7.5.3.7-2 */ +/* 226 */ { dissect_pfcp_grouped_ie }, /* ATSSS-LL Parameters Extendable / Table 7.5.3.7-3 */ +/* 227 */ { dissect_pfcp_grouped_ie }, /* PMF Parameters Extendable / Table 7.5.3.7-4 */ +/* 228 */ { dissect_pfcp_mptcp_address_information }, /* MPTCP Address Information Extendable / Clause 8.2.157 */ +/* 229 */ { dissect_pfcp_link_specific_multipath_ip_address }, /* Link-Specific Multipath IP Address Extendable / Clause 8.2.158 */ +/* 230 */ { dissect_pfcp_pmf_address_information }, /* PMF Address Information Extendable / Clause 8.2.159 */ +/* 231 */ { dissect_pfcp_atsss_ll_information }, /* ATSSS-LL Information Extendable / Clause 8.2.160 */ +/* 232 */ { dissect_pfcp_data_network_access_identifier }, /* Data Network Access Identifier Variable Length / Clause 8.2.161 */ +/* 233 */ { dissect_pfcp_grouped_ie }, /* UE IP address Pool Information Extendable / Table 7.4.4.1-3 */ +/* 234 */ { dissect_pfcp_average_packet_delay }, /* Average Packet Delay Extendable / Clause 8.2.162 */ +/* 235 */ { dissect_pfcp_minimum_packet_delay }, /* Minimum Packet Delay Extendable / Clause 8.2.163 */ +/* 236 */ { dissect_pfcp_maximum_packet_delay }, /* Maximum Packet Delay Extendable / Clause 8.2.164 */ +/* 237 */ { dissect_pfcp_qos_report_trigger }, /* QoS Report Trigger Extendable / Clause 8.2.165 */ +/* 238 */ { dissect_pfcp_grouped_ie }, /* GTP-U Path QoS Control Information Extendable / Table 7.4.4.1.3-1 */ +/* 239 */ { dissect_pfcp_grouped_ie }, /* GTP-U Path QoS Report (PFCP Node Report Request) Extendable / Table 7.4.5.1.5-1 */ +/* 240 */ { dissect_pfcp_grouped_ie }, /* QoS Information in GTP-U Path QoS Report Extendable / Table 7.4.5.1.6-1 */ +/* 241 */ { dissect_pfcp_gtp_u_path_interface_type }, /* GTP-U Path Interface Type Extendable / Clause 8.2.166 */ +/* 242 */ { dissect_pfcp_grouped_ie }, /* QoS Monitoring per QoS flow Control Information Extendable / Table 7.5.2.9-3 */ +/* 243 */ { dissect_pfcp_requested_qos_monitoring }, /* Requested QoS Monitoring Extendable / Clause 8.2.167 */ +/* 244 */ { dissect_pfcp_reporting_frequency }, /* Reporting Frequency Extendable / Clause 8.2.168 */ +/* 245 */ { dissect_pfcp_packet_delay_thresholds }, /* Packet Delay Thresholds Extendable / Clause 8.2.169 */ +/* 246 */ { dissect_pfcp_minimum_wait_time }, /* Minimum Wait Time Extendable / Clause 8.2.170 */ +/* 247 */ { dissect_pfcp_grouped_ie }, /* QoS Monitoring Report Extendable / Table 7.5.8.6-3 */ +/* 248 */ { dissect_pfcp_qos_monitoring_measurement }, /* QoS Monitoring Measurement Extendable / Clause 8.2.171 */ +/* 249 */ { dissect_pfcp_mt_edt_control_information }, /* MT-EDT Control Information Extendable / Clause 8.2.172 */ +/* 250 */ { dissect_pfcp_dl_data_packets_size }, /* DL Data Packets Size Extendable / Clause 8.2.173 */ +/* 251 */ { dissect_pfcp_qer_control_indications }, /* QER Control Indications Extendable / Clause 8.2.174 */ +/* 252 */ { dissect_pfcp_grouped_ie }, /* Packet Rate Status Report IE within PFCP Session Deletion Response Extendable / Table 7.5.7.1-2 */ +/* 253 */ { dissect_pfcp_nf_instance_id }, /* NF Instance ID Extendable / Clause 8.2.175 */ +/* 254 */ { dissect_pfcp_grouped_ie }, /* Ethernet Context Information within PFCP Session Modification Request Extendable / Table 7.5.4.21-1 */ +/* 255 */ { dissect_pfcp_grouped_ie }, /* Redundant Transmission Detection Parameters Extendable / Table 7.5.2.2-5 */ +/* 256 */ { dissect_pfcp_grouped_ie }, /* Updated PDR IE within PFCP Session Modification Response Extendable / Table 7.5.5.5-1 */ +/* 257 */ { dissect_pfcp_s_nssai }, /* S-NSSAI Fixed Length / Clause 8.2.176 */ +/* 258 */ { dissect_pfcp_ip_version }, /* IP version Extendable / Clause 8.2.177 */ +/* 259 */ { dissect_pfcp_pfcpasreq_flags }, /* PFCPASReq-Flags Extendable / Clause 8.2.178 */ +/* 260 */ { dissect_pfcp_data_status }, /* Data Status Extendable / Clause 8.2.179 */ +/* 261 */ { dissect_pfcp_grouped_ie }, /* Provide RDS Configuration Information IE within PFCP Session Establishment Request Extendable / Table 7.5.2.11-1 */ +/* 262 */ { dissect_pfcp_rds_configuration_information }, /* RDS Configuration Information Extendable / Clause 8.2.180 */ +/* 263 */ { dissect_pfcp_grouped_ie }, /* Query Packet Rate Status IE within PFCP Session Modification Request Extendable / Table 7.5.4.22-1 */ +/* 264 */ { dissect_pfcp_grouped_ie }, /* Query Packet Rate Status Report IE within PFCP Session Modification Response Extendable / Table 7.5.5.4-1 */ +/* 265 */ { dissect_pfcp_multipath_application_indication }, /* Multipath Applicable Indication Extendable / Clause 8.2.181 */ +/* 266 */ { dissect_pfcp_user_plane_node_management_information_container }, /* User Plane Node Management Information Container Variable Length / Clause 8.2.182 */ +/* 267 */ { dissect_pfcp_grouped_ie }, /* UE IP Address Usage Information IE within PFCP Association Update Request Extendable / Table 7.4.4.3.1-1 */ +/* 268 */ { dissect_pfcp_number_of_ue_ip_addresses }, /* Number of UE IP Addresses Variable Length / Clause 8.2.183 */ +/* 269 */ { dissect_pfcp_validity_timer }, /* Validity Timer Variable Length / Clause 8.2.183 */ +/* 270 */ { dissect_pfcp_grouped_ie }, /* Redundant Transmission Forward Parameters Variable Length / Clause 8.2.184 */ +/* 271 */ { dissect_pfcp_grouped_ie }, /* Transport Delay Reporting IE in Create PDR IE Extendable / Table 7.5.2.2-6 */ +/* 272 */ { dissect_pfcp_grouped_ie }, /* Partial Failure Information within PFCP Session Establishment Response Extendable / Table 7.5.3.1-2 */ +/* 273 */ { dissect_pfcp_grouped_ie }, /* Partial Failure Information within PFCP Session Modification Response Extendable / Table 7.5.5.1-2 */ +/* 274 */ { dissect_pfcp_offending_ie_information }, /* Offending IE Information Variable Length / Clause 8.2.185 */ +/* 275 */ { dissect_pfcp_rattype }, /* RAT Type Variable Length / Clause 8.2.186 */ +/* 276 */ { dissect_pfcp_grouped_ie }, /* L2TP Tunnel Information Extendable / Table 7.5.2.1-2 */ +/* 277 */ { dissect_pfcp_grouped_ie }, /* L2TP Session Information within PFCP Session Establishment Request Extendable / Table 7.5.2.1-3 */ +/* 278 */ { dissect_pfcp_l2tp_user_authentication }, /* L2TP User Authentication Variable Length / Clause 8.2.187 */ +/* 279 */ { dissect_pfcp_grouped_ie }, /* L2TP Session Information within PFCP Session Establishment Response Extendable / Table 7.5.3.1-3 */ +/* 280 */ { dissect_pfcp_lns_address }, /* LNS Address Variable Length / Clause 8.2.188 */ +/* 281 */ { dissect_pfcp_tunnel_preference }, /* Tunnel Preference Fixed / Clause 8.2.189 */ +/* 282 */ { dissect_pfcp_calling_number }, /* Calling Number Variable Length / Clause 8.2.190 */ +/* 283 */ { dissect_pfcp_called_number }, /* Called Number Variable Length / Clause 8.2.191 */ +/* 284 */ { dissect_pfcp_l2tp_session_indications }, /* L2TP Session Indications Extendable / Clause 8.2.192 */ +/* 285 */ { dissect_pfcp_dns_sever_address }, /* DNS Server Address Variable Length / Clause 8.2.193 */ +/* 286 */ { dissect_pfcp_nbns_sever_address }, /* NBNS Server Address Variable Length / Clause 8.2.194 */ +/* 287 */ { dissect_pfcp_maximum_receive_unit }, /* Maximum Receive Unit Fixed / Clause 8.2.195 */ +/* 288 */ { dissect_pfcp_thresholds }, /* Thresholds Variable Length / Clause 8.2.196 */ +/* 289 */ { dissect_pfcp_steering_mode_indications }, /* Steering Mode Indicator Extendable / Clause 8.2.197 */ +/* 290 */ { dissect_pfcp_grouped_ie }, /* PFCP Session Change Info Extendable / Table 7.4.7.1-2 */ +/* 291 */ { dissect_pfcp_group_id }, /* Group ID Fixed / Clause 8.2.198 */ +/* 292 */ { dissect_pfcp_cp_ip_address }, /* CP IP Address Variable Length / Clause 8.2.199 */ +/* 293 */ { dissect_pfcp_ip_address_and_port_number_replacement }, /* IP Address and Port Number Replacement Variable Length / Clause 8.2.200 */ +/* 294 */ { dissect_pfcp_dns_query_filter }, /* DNS Query Filter Variable Length / Clause 8.2.201 */ +/* 295 */ { dissect_pfcp_grouped_ie }, /* Direct Reporting Information Extendable / Table 7.5.2.9-4 */ +/* 296 */ { dissect_pfcp_event_notification_uri }, /* Event Notification URI Variable Length / Clause 8.2.202 */ +/* 297 */ { dissect_pfcp_notification_correlation_id }, /* Notification Correlation ID Fixed / Clause 8.2.203 */ +/* 298 */ { dissect_pfcp_reporting_flags }, /* Reporting Flags Extendable / Clause 8.2.204 */ +/* 299 */ { dissect_pfcp_predefined_rules_name }, /* Predefined Rules Name Variable Length / Clause 8.2.205 */ +/* 300 */ { dissect_pfcp_grouped_ie }, /* MBS Session N4mb Control Information Extendable / Table 7.5.2.1-5 */ +/* 301 */ { dissect_pfcp_grouped_ie }, /* MBS Multicast Parameters Extendable / Table 7.5.2.3-5 */ +/* 302 */ { dissect_pfcp_grouped_ie }, /* Addd MBS Unicast Parameters IE in Create FAR Extendable / Table 7.5.2.3-6 */ +/* 303 */ { dissect_pfcp_grouped_ie }, /* MBS Session N4mb Information Extendable / Table 7.5.3.1-4 */ +/* 304 */ { dissect_pfcp_grouped_ie }, /* Remove MBS Unicast Parameters IE in Update FAR Extendable / Table 7.5.4.3-4 */ +/* 305 */ { dissect_pfcp_mbs_session_identifier }, /* MBS Session Identifier Variable Length / Clause 8.2.206 */ +/* 306 */ { dissect_pfcp_multicast_transport_information }, /* Multicast Transport Information Variable Length / Clause 8.2.207 */ +/* 307 */ { dissect_pfcp_mbsn4mbreq_flags }, /* MBSN4mbReq Flags Extendable / Clause 8.2.208 */ +/* 308 */ { dissect_pfcp_local_ingress_tunnel }, /* Local Ingress Tunnel Extendable / Clause 8.2.209 */ +/* 309 */ { dissect_pfcp_mbs_unicast_parameters_id }, /* MBS Unicast Parameters ID Extendable / Clause 8.2.210 */ +/* 310 */ { dissect_pfcp_grouped_ie }, /* MBS Session N4 Control Information IE within PFCP Session Establishment Request Extendable / Table 7.5.2.1-6 */ +/* 311 */ { dissect_pfcp_grouped_ie }, /* MBS Session N4 Control Information IE within PFCP Session Establishment Response Extendable / Table 7.5.3.1-5 */ +/* 312 */ { dissect_pfcp_mbsn4resp_flags }, /* MBSN4Resp-Flags Extendable / Clause 8.2.211 */ +/* 313 */ { dissect_pfcp_tunnel_password }, /* Tunnel Password Variable Length / Clause 8.2.212 */ +/* 314 */ { dissect_pfcp_area_session_id }, /* Area Session ID Fixed / Clause 8.2.213 */ +/* 315 */ { dissect_pfcp_grouped_ie }, /* Peer UP Restart Report IE within PFCP Node Report Request Extendable / Table 7.4.5.1-7 */ +/* 316 */ { dissect_pfcp_grouped_ie }, /* DSCP to PPI Control Information IE within PFCP Session Establishment Request Extendable / Table 7.5.2.1-6 */ +/* 317 */ { dissect_pfcp_dscp_to_ppi_mapping_information }, /* DSCP to PPI Mapping Information Extendable / Clause 8.2.214 */ +/* 318 */ { dissect_pfcp_pfcpsdrsp_flags }, /* PFCPSDRsp-Flags Extendable / Clause 8.2.215 */ +/* 319 */ { dissect_pfcp_qer_indications }, /* QER Indications Extendable / Clause 8.2.216 */ +/* 320 */ { dissect_pfcp_vendor_specific_node_report_type }, /* Vendor-Specific Node Report Type Extendable / Clause 8.2.217 */ +/* 321 */ { dissect_pfcp_configured_time_domain }, /* Configured Time Domain Extendable / Clause 8.2.218 */ +/* 322 */ { dissect_pfcp_metadata }, /* Metadata Variable Length / Clause 8.2.219 */ +/* 323 */ { dissect_pfcp_grouped_ie }, /* Traffic Parameter Measurement Control Information Extendable / Table 7.5.2.9-5 */ +/* 324 */ { dissect_pfcp_grouped_ie }, /* Traffic Parameter Measurement Report Extendable / Table 7.5.8.6-4 */ +/* 325 */ { dissect_pfcp_traffic_parameter_threshold }, /* Traffic Parameter Threshold Extendable / Clause 8.2.220 */ +/* 326 */ { dissect_pfcp_dl_periodicity }, /* DL Periodicity Extendable / Clause 8.2.221 */ +/* 327 */ { dissect_pfcp_n6_jitter_measurement }, /* N6 Jitter Measurement Extendable / Clause 8.2.222 */ +/* 328 */ { dissect_pfcp_traffic_parameter_measurement_indication }, /* Traffic Parameter Measurement Indication Extendable / Clause 8.2.223 */ +/* 329 */ { dissect_pfcp_ul_periodicity }, /* UL Periodicity Extendable / Clause 8.2.224 */ +/* 330 */ { dissect_pfcp_mpquic_control_information }, /* MPQUIC Control Information Extendable / Clause 8.2.225 */ +/* 331 */ { dissect_pfcp_grouped_ie }, /* MPQUIC Parameters Extendable / Table 7.5.3.7-5 */ +/* 332 */ { dissect_pfcp_mpquic_address_information }, /* MPQUIC Address Information Extendable / Clause 8.2.226 */ +/* 333 */ { dissect_pfcp_transport_mode }, /* Transport Mode Extendable / Clause 8.2.227 */ +/* 334 */ { dissect_pfcp_protocol_description }, /* Protocol Description Extendable / Table 7.5.2.2-7 */ +/* 335 */ { dissect_pfcp_reporting_suggestion_info }, /* Reporting Suggestion Info Extendable / Clause 8.2.229 */ +/* 336 */ { dissect_pfcp_tl_container }, /* TL-Container Variable Length / Clause 8.2.230 */ +/* 337 */ { dissect_pfcp_measurement_indication }, /* Measurement Indication Extendable / Clause 8.2.231 */ +/* 338 */ { dissect_pfcp_hplmn_s_nssai }, /* HPLMN S-NSSAI Fixed Length / Clause 8.2.232 */ +/* 339 */ { dissect_pfcp_media_transport_protocol }, /* Media Transport Protocol Extendable / Clause 8.2.233 */ +/* 340 */ { dissect_pfcp_grouped_ie }, /* RTP Header Extension Information Extendable / Table 7.5.2.2-8 */ +/* 341 */ { dissect_pfcp_grouped_ie }, /* RTP Payload Information Extendable / Table 7.5.2.2-9 */ +/* 342 */ { dissect_pfcp_rtp_header_extension_type }, /* RTP Header Extension Type Fixed Length / Clause 8.2.234 */ +/* 343 */ { dissect_pfcp_rtp_header_extension_id }, /* RTP Header Extension ID Fixed Length / Clause 8.2.235 */ +/* 344 */ { dissect_pfcp_rtp_payload_type }, /* RTP Payload Type Fixed Length / Clause 8.2.236 */ +/* 345 */ { dissect_pfcp_rtp_payload_format }, /* RTP Payload Format Fixed Length / Clause 8.2.237 */ +//346 to 32767 Spare. For future use. +//32768 to 65535 Vendor-specific IEs. + { NULL }, /* End of List */ +}; -static void -dissect_pfcp_query_packet_rate_status_ie_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_QUERY_PACKET_RATE_STATUS_IE_WITHIN_PCFP_SESSION_ESTABLISHMENT_REQUEST], args); -} +#define NUM_PFCP_IES (sizeof(pfcp_ies)/sizeof(pfcp_ie_t)) +/* Set up the array to hold "etts" for each IE*/ +gint ett_pfcp_elem[NUM_PFCP_IES-1]; -static void -dissect_pfcp_query_packet_rate_status_report_ie_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_QUERY_PACKET_RATE_STATUS_REPORT_IE_WITHIN_PCFP_SESSION_ESTABLISHMENT_RESPONSE], args); -} +typedef struct pfcp_generic_ie { + uint16_t enterprise_id; // 0 for non-vendor-IE + uint16_t ie_type; + const char* name; + dissector_t dissector; + int ett; +} pfcp_generic_ie_t; -static void -dissect_pfcp_ue_ip_address_usage_information_ie_within_pfcp_association_update_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) +static int +dissect_pfcp_unknown_enterprise_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UE_IP_ADDRESS_USAGE_INFORMATION_IE_WITHIN_PFCP_ASSOCIATION_UPDATE_REQUEST], args); -} + proto_tree_add_item(tree, hf_pfcp_enterprise_data, tvb, 0, -1, ENC_NA); + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_not_decoded_null, tvb, 0, -1); -static void -dissect_pfcp_redundant_transmission_forward_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REDUNDANT_TRANSMISSION_FORWARD_PARAMETERS_IE_IN_FAR], args); + return tvb_reported_length(tvb); } -static void -dissect_pfcp_transport_dealy_reporting_ie_in_create_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) +// Generic-IE dissector which wraps the actual data-dissector and which overwrites the +// default tree-type and tree-text. +static int +dissect_pfcp_generic_ie_cb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data, void *cb) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_TRANSPORT_DELAY_REPORTING], args); -} + const pfcp_generic_ie_t* ie_info = cb; + proto_item* item = proto_tree_get_parent(tree); -static void -dissect_pfcp_partial_failure_information_within_pfcp_session_establishment_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PARTIAL_FAILURE_INFORMATION_WITHIN_PFCP_SESSION_ESTABLISHMENT_RESPONSE], args); -} + // Overwrite the generic-IE subtree with our per-IE subtree + if (ie_info->ett != -1) { + tree = proto_item_add_subtree(item, ie_info->ett); + } -static void -dissect_pfcp_partial_failure_information_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PARTIAL_FAILURE_INFORMATION_WITHIN_PFCP_SESSION_MODIFICATION_RESPONSE], args); -} + // Overwrite generic text with per-IE text + if (ie_info->name != NULL) { + if (ie_info->enterprise_id == 0) { + proto_item_set_text(item, "%s", ie_info->name); + } else { + const char* enterprise_name = try_enterprises_lookup(ie_info->enterprise_id); + if (enterprise_name != NULL) { + proto_item_set_text(item, "%s (%s)", ie_info->name, enterprise_name); + } else { + proto_item_set_text(item, "%s (Unknown enterprise %u)", ie_info->name, ie_info->enterprise_id); + } + } + } -static void -dissect_pfcp_l2tp_tunnel_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_L2TP_TUNNEL_INFORMATION], args); + // Run dissector + return ie_info->dissector(tvb, pinfo, tree, data); } -static void -dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_L2TP_SESSION_INFORMATION_WITHIN_PFCP_SESSION_ESTABLISHMENT_REQUEST], args); -} +static int +dissect_pfcp_generic_enterprise_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data, void *cb) +{ + // Add a subtree, using the generic IE ett. + // A per-IE subdissector can later overwrite this ett to have an ett per IE. + proto_item* item; + tree = proto_tree_add_subtree(tree, tvb, 0, -1, ett_pfcp_unknown_enterprise_ie, &item, NULL); + + // Add the generic header. + uint32_t ie_type, ie_len, enterprise_id; + proto_tree_add_item_ret_uint(tree, hf_pfcp2_enterprise_ie, tvb, 0, 2, ENC_BIG_ENDIAN, &ie_type); + proto_tree_add_item_ret_uint(tree, hf_pfcp2_ie_len, tvb, 2, 2, ENC_BIG_ENDIAN, &ie_len); + proto_tree_add_item_ret_uint(tree, hf_pfcp_enterprise_id, tvb, 4, 2, ENC_BIG_ENDIAN, &enterprise_id); + + // Item text + const char* enterprise_name = try_enterprises_lookup(enterprise_id); + if (enterprise_name != NULL) { + proto_item_set_text(item, "Unknown IE %u (%s)", ie_type, enterprise_name); + } else { + proto_item_set_text(item, "Unknown IE %u (Unknown enterprise %u)", ie_type, enterprise_id); + } -static void -dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_L2TP_SESSION_INFORMATION_WITHIN_PFCP_SESSION_ESTABLISHMENT_RESPONSE], args); -} + // Length field is already checked to be big enough by accessing tvb[4:6]. + // This tvb was created with length derived from the length-field. + DISSECTOR_ASSERT(ie_len >= 2); + const unsigned data_len = ie_len - 2; + if (data_len == 0) + { + /* + * 5.6.3 Modifying the Rules of an Existing PFCP Session + * + * Updating the Rule including the IEs to be removed with a null length, + * e.g. by including the Update URR IE in the PFCP Session Modification Request + * with the IE(s) to be removed with a null length. + */ + proto_item_append_text(item, " [IE to be removed]"); + } else { + // Run the specific IE-dissector only on the "body" of the IE. + tvbuff_t* data_tvb = tvb_new_subset_length(tvb, 6, data_len); + + dissector_table_t ie_table = cb; + int offset = 0; + if (ie_table == NULL) + { + // No IE-table is given so no specific decoding can be performed + offset = dissect_pfcp_unknown_enterprise_ie(data_tvb, pinfo, tree, data); + } else { + // A dissector-table is provided from which an IE-specific dissector can be looked up + offset = dissector_try_uint_new(ie_table, ie_type, data_tvb, pinfo, tree, FALSE, data); -static void -dissect_pfcp_pfcp_session_change_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PFCP_SESSION_CHANGE_INFO], args); -} + // Fallback to unknown-ie dissector + if (offset == 0) { + offset = dissect_pfcp_unknown_enterprise_ie(data_tvb, pinfo, tree, data); + } + } -static void -dissect_pfcp_direct_reporting_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_DIRECT_REPORTING_INFORMATION], args); -} + // If not all data from the IE is decoded (possible when IE has been extended since last update of dissector), + // add an expert-info warning about the undecoded data. + if (offset < 0 || (unsigned) offset < data_len) + { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, data_tvb, offset, -1); + } + } -static void -dissect_pfcp_mbs_session_n4mb_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_MBS_SESSION_N4MB_CONTROL_INFORMATION], args); + return tvb_reported_length(tvb); } -static void -dissect_pfcp_mbs_multicast_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) +static void pfcp_register_generic_ie_dissector(uint16_t enterprise_id, const char* dissector_name, const char* table_name, const char* ui_name, pfcp_generic_ie_t* ies, unsigned num_ies) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_MBS_MULTICAST_PARAMETERS], args); -} + // Register a tree-type for each IE and store it in the ie-struct + int** ie_refs = g_alloca(sizeof(int*) * num_ies); + for (unsigned i = 0; i < num_ies; i++) { + ies[i].ett = -1; + ie_refs[i] = &ies[i].ett; + } + proto_register_subtree_array(ie_refs, num_ies); -static void -dissect_pfcp_add_mbs_unicast_parameters_ie_in_create_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ADD_MBS_UNICAST_PARAMETERS_IE_IN_CREATE_FAR], args); -} + // Create a table that will contain all IEs for this vendor + dissector_table_t table = register_dissector_table(table_name, ui_name, proto_pfcp, FT_UINT16, BASE_DEC); -static void -dissect_pfcp_mbs_session_n4mb_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_MBS_SESSION_N4MB_INFORMATION], args); -} + // Register a dissector per IE-type + for (unsigned i = 0; i < num_ies; i++) { + dissector_add_uint(table_name, ies[i].ie_type, create_dissector_handle_with_data(dissect_pfcp_generic_ie_cb, -1, &ies[i])); + } -static void -dissect_pfcp_remove_mbs_unicast_parameters_ie_in_update_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args) -{ - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_MBS_UNICAST_PARAMETERS_IE_IN_UPDATE_FAR], args); + // Register a dissector using the generic enterprise-dissector + dissector_handle_t handle = register_dissector_with_data(dissector_name, dissect_pfcp_generic_enterprise_ie, proto_pfcp, table); + dissector_add_uint("pfcp.enterprise_ies", enterprise_id, handle); } - static void dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint offset, guint16 length, guint8 message_type, pfcp_session_args_t *args) { @@ -10087,30 +10605,9 @@ dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, enterprise_id = tvb_get_ntohs(tvb, offset + 4); ie_tvb = tvb_new_subset_length(tvb, offset, length_ie + 4); + // Find a per-vendor dissector or fallback to the generic-enterprise-dissector without IE-table. if (!dissector_try_uint_new(pfcp_enterprise_ies_dissector_table, enterprise_id, ie_tvb, pinfo, tree, FALSE, pfcp_sub_dis_inf)) { - /* no Enterprise disector, do some generic decoding */ - ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 + length_ie, ett_pfcp_ie, &ti, "Enterprise %s specific IE: %u", - try_enterprises_lookup(enterprise_id), - type); - - proto_tree_add_item(ie_tree, hf_pfcp2_enterprise_ie, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(ie_tree, hf_pfcp2_ie_len, tvb, offset + 2, 2, ENC_BIG_ENDIAN); - - /* 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_enterprise_id, tvb, offset + 4, 2, ENC_BIG_ENDIAN); - - /* - * 5.6.3 Modifying the Rules of an Existing PFCP Session - * - * Updating the Rule including the IEs to be removed with a null length, - * e.g. by including the Update URR IE in the PFCP Session Modification Request - * with the IE(s) to be removed with a null length. - */ - if (length_ie == 0) { - proto_item_append_text(ti, "[IE to be removed]"); - } else { - proto_tree_add_item(ie_tree, hf_pfcp_enterprise_data, ie_tvb, 6, -1, ENC_NA); - } + dissect_pfcp_generic_enterprise_ie(ie_tvb, pinfo, tree, pfcp_sub_dis_inf, NULL); } offset += (4 + length_ie); } else { @@ -10156,66 +10653,6 @@ dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, } } -static void -dissect_pfcp_enterprise_ies_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8 message_type, pfcp_session_args_t *args, - guint num_pfcp_enterprise_ies, gint * ett_pfcp_enterprise_elem, const pfcp_ie_t * pfcp_enterprise_ies, - value_string_ext * pfcp_ie_enterprise_type_ext) -{ - proto_tree *ie_tree; - proto_item *ti; - tvbuff_t *ie_tvb; - gint offset = 0; - guint16 type, length_ie; - int tmp_ett; - - /* Octet 1 -2 */ - type = tvb_get_ntohs(tvb, offset) & ~0x8000; - length_ie = tvb_get_ntohs(tvb, offset + 2); - - /* adjust length for Enterprise Id */ - length_ie -= 2; - - if (type < (num_pfcp_enterprise_ies - 1)) { - tmp_ett = ett_pfcp_enterprise_elem[type]; - } else { - tmp_ett = ett_pfcp_ie; - } - - ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, 6 + length_ie, tmp_ett, &ti, "%s : ", - val_to_str_ext_const(type, pfcp_ie_enterprise_type_ext, "Unknown")); - - proto_tree_add_item(ie_tree, hf_pfcp2_enterprise_ie, tvb, offset, 2, ENC_BIG_ENDIAN); - offset += 2; - proto_tree_add_item(ie_tree, hf_pfcp2_ie_len, tvb, offset, 2, ENC_BIG_ENDIAN); - offset += 2; - proto_tree_add_item(ie_tree, hf_pfcp_enterprise_id, tvb, offset, 2, ENC_BIG_ENDIAN); - offset += 2; - - /* - * 5.6.3 Modifying the Rules of an Existing PFCP Session - * - * Updating the Rule including the IEs to be removed with a null length, - * e.g. by including the Update URR IE in the PFCP Session Modification Request - * with the IE(s) to be removed with a null length. - */ - if( length_ie == 0 ) { - proto_item_append_text(ti, "[IE to be removed]"); - } else { - if (type < (num_pfcp_enterprise_ies - 1)) { - ie_tvb = tvb_new_subset_length(tvb, offset, length_ie); - if(pfcp_enterprise_ies[type].decode){ - (*pfcp_enterprise_ies[type].decode) (ie_tvb, pinfo, ie_tree, ti, length_ie, message_type, args); - } else { - /* NULL function pointer, we have no decoding function*/ - proto_tree_add_expert(ie_tree, pinfo, &ei_pfcp_ie_not_decoded_null, tvb, offset, length_ie); - } - } else { - /* IE id outside of array, We have no decoding function for it */ - proto_tree_add_expert(ie_tree, pinfo, &ei_pfcp_ie_not_decoded_too_large, tvb, offset, length_ie); - } - } -} - static int dissect_pfcp_message(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) { @@ -10230,6 +10667,7 @@ dissect_pfcp_message(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) conversation_t *conversation; pfcp_conv_info_t *pfcp_info; pfcp_session_args_t *args = NULL; + pfcp_msg_hash_t *pcrp = NULL; pfcp_hdr_t *pfcp_hdr = NULL; static int * const pfcp_hdr_flags[] = { @@ -10354,7 +10792,10 @@ dissect_pfcp_message(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) pfcp_fill_map(args->seid_list, args->ip_list, pinfo->num); cause_aux = args->last_cause; } - pfcp_match_response(tvb, pinfo, sub_tree, seq_no, message_type, pfcp_info, cause_aux); + pcrp = pfcp_match_response(tvb, pinfo, sub_tree, seq_no, message_type, pfcp_info, cause_aux); + if (pcrp) { + tap_queue_packet(pfcp_tap, pinfo, pcrp); + } if (g_pfcp_session) { pfcp_track_session(tvb, pinfo, sub_tree, pfcp_hdr, args->seid_list, args->ip_list, args->last_seid, args->last_ip); } @@ -10398,83 +10839,25 @@ dissect_pfcp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data return length; } -/* Enterprise IE decoding 3GPP */ -static int -dissect_pfcp_3gpp_enterprise_ies(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) -{ - gint offset = 0; - proto_tree *ie_tree; - guint16 type; - - type = tvb_get_ntohs(tvb, offset) & ~0x8000; - - ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_pfcp_ie, NULL, - "Enterprise %s specific IE: %u [Enterprise ID set to '10415' shall not be used for the vendor specific IEs]", - try_enterprises_lookup(VENDOR_THE3GPP), type); - proto_tree_add_item(ie_tree, hf_pfcp2_enterprise_ie, tvb, offset, 2, ENC_BIG_ENDIAN); - offset += 2; - proto_tree_add_item(ie_tree, hf_pfcp2_ie_len, tvb, offset, 2, ENC_BIG_ENDIAN); - offset += 2; - proto_tree_add_item(ie_tree, hf_pfcp_enterprise_id, tvb, offset, 2, ENC_BIG_ENDIAN); - offset += 2; - proto_tree_add_expert(ie_tree, pinfo, &ei_pfcp_enterprise_ie_3gpp, tvb, offset, -1); - - return tvb_reported_length(tvb); -} - /* Enterprise IE decoding Broadband Forum * * TR-459: Control and User Plane Separation for a disaggregated BNG */ -static void dissect_pfcp_enterprise_bbf_ppp_lcp_connectivity(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args); -static void dissect_pfcp_enterprise_bbf_l2tp_tunnel(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args); - -#define PFCP_IE_ENTERPRISE_BBF_UP_FUNCTION_FEATURES 0 /* 32768 */ -#define PFCP_IE_ENTERPRISE_BBF_LOGICAL_PORT 1 /* 32769 */ -#define PFCP_IE_ENTERPRISE_BBF_OUTER_HEADER_CREATION 2 /* 32770 */ -#define PFCP_IE_ENTERPRISE_BBF_OUTER_HEADER_REMOVAL 3 /* 32771 */ -#define PFCP_IE_ENTERPRISE_BBF_PPPOE_SESSION_ID 4 /* 32772 */ -#define PFCP_IE_ENTERPRISE_BBF_PPP_PROTOCOL 5 /* 32773 */ -#define PFCP_IE_ENTERPRISE_BBF_VERIFICATION_TIMERS 6 /* 32774 */ -#define PFCP_IE_ENTERPRISE_BBF_PPP_LCP_MAGIC_NUMBER 7 /* 32775 */ -#define PFCP_IE_ENTERPRISE_BBF_MTU 8 /* 32776 */ -#define PFCP_IE_ENTERPRISE_BBF_L2TP_TUNNEL_ENDPOINT 9 /* 32777 */ -#define PFCP_IE_ENTERPRISE_BBF_L2TP_SESSION_ID 10 /* 32778 */ -#define PFCP_IE_ENTERPRISE_BBF_L2TP_TYPE 11 /* 32779 */ -#define PFCP_IE_ENTERPRISE_BBF_PPP_LCP_CONNECTIVITY 12 /* 32780 */ -#define PFCP_IE_ENTERPRISE_BBF_L2TP_TUNNEL 13 /* 32781 */ - -static const value_string pfcp_ie_enterprise_bbf_type[] = { - { PFCP_IE_ENTERPRISE_BBF_UP_FUNCTION_FEATURES, "BBF UP Function Features"}, - { PFCP_IE_ENTERPRISE_BBF_LOGICAL_PORT, "Logical Port"}, - { PFCP_IE_ENTERPRISE_BBF_OUTER_HEADER_CREATION, "BBF Outer Header Creation"}, - { PFCP_IE_ENTERPRISE_BBF_OUTER_HEADER_REMOVAL, "BBF Outer Header Removal"}, - { PFCP_IE_ENTERPRISE_BBF_PPPOE_SESSION_ID, "PPPoE Session ID"}, - { PFCP_IE_ENTERPRISE_BBF_PPP_PROTOCOL, "PPP protocol"}, - { PFCP_IE_ENTERPRISE_BBF_VERIFICATION_TIMERS, "Verification Timers"}, - { PFCP_IE_ENTERPRISE_BBF_PPP_LCP_MAGIC_NUMBER, "PPP LCP Magic Number"}, - { PFCP_IE_ENTERPRISE_BBF_MTU, "MTU"}, - { PFCP_IE_ENTERPRISE_BBF_L2TP_TUNNEL_ENDPOINT, "L2TP Tunnel Endpoint"}, - { PFCP_IE_ENTERPRISE_BBF_L2TP_SESSION_ID, "L2TP Session ID"}, - { PFCP_IE_ENTERPRISE_BBF_L2TP_TYPE, "L2TP Type"}, - { PFCP_IE_ENTERPRISE_BBF_PPP_LCP_CONNECTIVITY, "PPP LCP Connectivity"}, - { PFCP_IE_ENTERPRISE_BBF_L2TP_TUNNEL, "L2TP Tunnel"}, - { 0, NULL } -}; - -static value_string_ext pfcp_ie_enterprise_bbf_type_ext = VALUE_STRING_EXT_INIT(pfcp_ie_enterprise_bbf_type); - /* - * TR-459: 6.6.1 BBF UP Function Features + * TR-459: 6.6.1 BBF UP Function Features + * TR-459.2: 6.5.1 BBF UP Function Features + * TR-459.3: Table 1: BBF UP Function Features for Multicast */ -static void -dissect_pfcp_enterprise_bbf_up_function_features(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_bbf_up_function_features(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { int offset = 0; static int * const pfcp_bbf_up_function_features_o7_flags[] = { - &hf_pfcp_spare_b7_b5, + &hf_pfcp_bbf_up_function_features_o7_b7_nat_up, + &hf_pfcp_bbf_up_function_features_o7_b6_nat_cp, + &hf_pfcp_bbf_up_function_features_o7_b5_iptv, &hf_pfcp_bbf_up_function_features_o7_b4_lcp_keepalive_offload, &hf_pfcp_bbf_up_function_features_o7_b3_lns, &hf_pfcp_bbf_up_function_features_o7_b2_lac, @@ -10483,9 +10866,6 @@ dissect_pfcp_enterprise_bbf_up_function_features(tvbuff_t *tvb, packet_info *pin NULL }; - proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_bbf_up_function_features_o7_flags, ENC_BIG_ENDIAN); - offset += 1; - // Octet 8 Spare Octet proto_tree_add_item(tree, hf_pfcp_spare_oct, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; @@ -10498,28 +10878,31 @@ dissect_pfcp_enterprise_bbf_up_function_features(tvbuff_t *tvb, packet_info *pin proto_tree_add_item(tree, hf_pfcp_spare_oct, 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); - } + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_bbf_up_function_features_o7_flags, ENC_BIG_ENDIAN); + offset += 1; + + return offset; } /* * TR-459: 6.6.2 Logical Port */ -static void -dissect_pfcp_enterprise_bbf_logical_port(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_bbf_logical_port(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) { /* Octet 7 to (n+4) logical-port-id */ - if (tvb_ascii_isprint(tvb, 0, length)) + if (tvb_ascii_isprint(tvb, 0, -1)) { const guint8* string_value; - proto_tree_add_item_ret_string(tree, hf_pfcp_bbf_logical_port_id_str, tvb, 0, length, ENC_ASCII | ENC_NA, pinfo->pool, &string_value); - proto_item_append_text(item, "%s", string_value); + proto_tree_add_item_ret_string(tree, hf_pfcp_bbf_logical_port_id_str, tvb, 0, -1, ENC_ASCII | ENC_NA, pinfo->pool, &string_value); + proto_item_append_text(proto_tree_get_parent(tree), "%s", string_value); } else { - proto_tree_add_item(tree, hf_pfcp_bbf_logical_port_id, tvb, 0, length, ENC_NA); + proto_tree_add_item(tree, hf_pfcp_bbf_logical_port_id, tvb, 0, -1, ENC_NA); } + + return tvb_reported_length(tvb); } /* @@ -10535,8 +10918,8 @@ static const value_string pfcp_bbf_outer_hdr_desc_vals[] = { { 0, NULL } }; -static void -dissect_pfcp_enterprise_bbf_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_bbf_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { int offset = 0; guint32 value; @@ -10553,9 +10936,7 @@ dissect_pfcp_enterprise_bbf_outer_header_creation(tvbuff_t *tvb, packet_info *pi proto_tree_add_item(tree, hf_pfcp_bbf_outer_hdr_creation_session_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; - if (offset < length) { - proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); - } + return offset; } /* @@ -10571,44 +10952,40 @@ static const value_string pfcp_bbf_out_hdr_desc_vals[] = { { 0, NULL } }; -static void -dissect_pfcp_enterprise_bbf_outer_header_removal(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_bbf_outer_header_removal(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { int offset = 0; guint32 value; proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_out_hdr_desc, tvb, offset, 1, ENC_BIG_ENDIAN, &value); offset++; - proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_bbf_out_hdr_desc_vals, "Unknown")); + proto_item_append_text(proto_tree_get_parent(tree), "%s", val_to_str_const(value, pfcp_bbf_out_hdr_desc_vals, "Unknown")); - if (offset < length) { - proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); - } + return offset; } /* * TR-459: 6.6.5 PPPoE Session ID */ -static void -dissect_pfcp_enterprise_bbf_pppoe_session_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_bbf_pppoe_session_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { int offset = 0; guint32 value; proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_pppoe_session_id, tvb, offset, 2, ENC_BIG_ENDIAN, &value); offset += 2; - proto_item_append_text(item, "%u", value); + proto_item_append_text(proto_tree_get_parent(tree), "%u", value); - if (offset < length) { - proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); - } + return offset; } /* * TR-459: 6.6.6 PPP Protocol */ -static void -dissect_pfcp_enterprise_bbf_ppp_protocol(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_bbf_ppp_protocol(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { int offset = 0; guint64 bbf_ppp_flags_val; @@ -10632,16 +11009,14 @@ dissect_pfcp_enterprise_bbf_ppp_protocol(tvbuff_t *tvb, packet_info *pinfo _U_, offset += 2; } - if (offset < length) { - proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); - } + return offset; } /* * TR-459: 6.6.7 Verification Timers */ -static void -dissect_pfcp_enterprise_bbf_verification_timers(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_bbf_verification_timers(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { int offset = 0; @@ -10651,16 +11026,14 @@ dissect_pfcp_enterprise_bbf_verification_timers(tvbuff_t *tvb, packet_info *pinf proto_tree_add_item(tree, hf_pfcp_bbf_verification_timer_count, 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 offset; } /* * TR-459: 6.6.8 LCP Magic Number */ -static void -dissect_pfcp_enterprise_bbf_ppp_lcp_magic_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_bbf_ppp_lcp_magic_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { int offset = 0; @@ -10670,34 +11043,30 @@ dissect_pfcp_enterprise_bbf_ppp_lcp_magic_number(tvbuff_t *tvb, packet_info *pin proto_tree_add_item(tree, hf_pfcp_bbf_ppp_lcp_magic_number_rx, 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); - } + return offset; } /* * TR-459: 6.6.9 MTU */ -static void -dissect_pfcp_enterprise_bbf_mtu(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_bbf_mtu(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { int offset = 0; guint32 value; proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_mtu, tvb, offset, 2, ENC_BIG_ENDIAN, &value); offset += 2; - proto_item_append_text(item, "%u", value); + proto_item_append_text(proto_tree_get_parent(tree), "%u", value); - if (offset < length) { - proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); - } + return offset; } /* * TR-459: 6.6.10 L2TP Tunnel Endpoint */ -static void -dissect_pfcp_enterprise_bbf_l2tp_tunnel_endpoint(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_bbf_l2tp_tunnel_endpoint(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { int offset = 0; guint64 bbf_l2tp_endp_flags_val; @@ -10723,27 +11092,23 @@ dissect_pfcp_enterprise_bbf_l2tp_tunnel_endpoint(tvbuff_t *tvb, packet_info *pin proto_tree_add_item(tree, hf_pfcp_bbf_l2tp_endp_id_ipv6, tvb, offset, 16, ENC_NA); offset += 16; - if (offset < length) { - proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); - } + return offset; } /* * TR-459: 6.6.11 L2TP Session ID */ -static void -dissect_pfcp_enterprise_bbf_l2tp_session_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_bbf_l2tp_session_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { int offset = 0; guint32 value; proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_l2tp_session_id, tvb, offset, 2, ENC_BIG_ENDIAN, &value); offset += 2; - proto_item_append_text(item, "%u", value); + proto_item_append_text(proto_tree_get_parent(tree), "%u", value); - if (offset < length) { - proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); - } + return offset; } @@ -10756,8 +11121,8 @@ static const true_false_string pfcp_bbf_l2tp_type_b0_t_tfs = { "data" }; -static void -dissect_pfcp_enterprise_bbf_l2tp_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_bbf_l2tp_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { int offset = 0; @@ -10771,102 +11136,290 @@ dissect_pfcp_enterprise_bbf_l2tp_type(tvbuff_t *tvb, packet_info *pinfo _U_, pro ett_pfcp_bbf_l2tp_type_flags, pfcp_bbf_l2tp_type_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS); offset += 1; - if (offset < length) { - proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); - } + return offset; } -static const pfcp_ie_t pfcp_enterprise_bbf_ies[] = { -/* 32768 */ { dissect_pfcp_enterprise_bbf_up_function_features }, -/* 32769 */ { dissect_pfcp_enterprise_bbf_logical_port }, -/* 32770 */ { dissect_pfcp_enterprise_bbf_outer_header_creation }, -/* 32771 */ { dissect_pfcp_enterprise_bbf_outer_header_removal }, -/* 32772 */ { dissect_pfcp_enterprise_bbf_pppoe_session_id }, -/* 32773 */ { dissect_pfcp_enterprise_bbf_ppp_protocol }, -/* 32774 */ { dissect_pfcp_enterprise_bbf_verification_timers }, -/* 32775 */ { dissect_pfcp_enterprise_bbf_ppp_lcp_magic_number }, -/* 32776 */ { dissect_pfcp_enterprise_bbf_mtu }, -/* 32777 */ { dissect_pfcp_enterprise_bbf_l2tp_tunnel_endpoint }, -/* 32778 */ { dissect_pfcp_enterprise_bbf_l2tp_session_id }, -/* 32779 */ { dissect_pfcp_enterprise_bbf_l2tp_type }, -/* 32780 */ { dissect_pfcp_enterprise_bbf_ppp_lcp_connectivity }, -/* 32781 */ { dissect_pfcp_enterprise_bbf_l2tp_tunnel }, - { NULL }, /* End of List */ -}; +/* + * TR-459.3: Figure 6: BBF Multicast Flags Information Element + */ +static int +dissect_pfcp_enterprise_bbf_multicast_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) +{ + int offset = 0; -#define NUM_PFCP_ENTERPRISE_BBF_IES (sizeof(pfcp_enterprise_bbf_ies)/sizeof(pfcp_ie_t)) -/* Set up the array to hold "etts" for each IE*/ -gint ett_pfcp_enterprise_bbf_elem[NUM_PFCP_ENTERPRISE_BBF_IES-1]; + static int * const pfcp_bbf_multicast_flags[] = { + &hf_pfcp_spare_b7_b2, + &hf_pfcp_bbf_multicast_flags_o7_b1_routeralertoff, + &hf_pfcp_bbf_multicast_flags_o7_b0_fastleave, + NULL + }; -static void -dissect_pfcp_enterprise_bbf_ppp_lcp_connectivity(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type, pfcp_session_args_t *args) + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_bbf_multicast_flags, ENC_BIG_ENDIAN); + offset += 1; + + return offset; +} + +/* + * TR-459.3: Figure 7: BBF Multicast Query Parameters Information Element + */ +static int +dissect_pfcp_enterprise_bbf_multicast_query_parameters(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_enterprise_bbf_elem[PFCP_IE_ENTERPRISE_BBF_PPP_LCP_CONNECTIVITY], args); + int offset = 0; + + proto_tree_add_item(tree, hf_pfcp_bbf_multicast_query_param_robustness, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + + proto_tree_add_item(tree, hf_pfcp_bbf_multicast_query_param_query_interval, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + + proto_tree_add_item(tree, hf_pfcp_bbf_multicast_query_param_query_response_interval, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + + proto_tree_add_item(tree, hf_pfcp_bbf_multicast_query_param_group_query_interval, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + + return offset; } -static void -dissect_pfcp_enterprise_bbf_l2tp_tunnel(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type, pfcp_session_args_t *args) +/* + * TR-459.3: Figure 8: BBF Multicast Group Limit Information Element + */ +static int +dissect_pfcp_enterprise_bbf_multicast_group_limit(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_enterprise_bbf_elem[PFCP_IE_ENTERPRISE_BBF_L2TP_TUNNEL], args); + int offset = 0; + guint32 value; + + proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_multicast_group_limit_max_joins, tvb, offset, 2, ENC_BIG_ENDIAN, &value); + offset += 2; + proto_item_append_text(proto_tree_get_parent(tree), "%u", value); + + return offset; } +/* + * TR-459.2: 6.5.5 BBF Apply Action IE + */ static int -dissect_pfcp_enterprise_bbf_ies(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) +dissect_pfcp_enterprise_bbf_apply_action(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) { - pfcp_sub_dis_t *pfcp_sub_dis_info = (pfcp_sub_dis_t *)data; + int offset = 0; - dissect_pfcp_enterprise_ies_common(tvb, pinfo, tree, pfcp_sub_dis_info->message_type, pfcp_sub_dis_info->args, - NUM_PFCP_ENTERPRISE_BBF_IES, ett_pfcp_enterprise_bbf_elem, - pfcp_enterprise_bbf_ies, &pfcp_ie_enterprise_bbf_type_ext); - return tvb_reported_length(tvb); + static int * const pfcp_bbf_apply_action_flags[] = { + &hf_pfcp_spare_b7_b1, + &hf_pfcp_bbf_apply_action_flags_b0_nat, + NULL + }; + + proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_bbf_apply_action_flags, ENC_BIG_ENDIAN); + offset += 1; + + return offset; } -/* Enterprise IE decoding Travelping */ +/* + * TR-459.2: 6.5.6 BBF NAT External Port Range + */ +static int +dissect_pfcp_enterprise_bbf_nat_external_port_range(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) +{ + int offset = 0; + guint32 start, end; -static void dissect_pfcp_enterprise_travelping_error_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args); + proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_nat_external_port_range_start, tvb, offset, 2, ENC_BIG_ENDIAN, &start); + offset += 2; -/* Enterprise IE decoding Travelping */ -#define PFCP_IE_ENTERPRISE_TRAVELPING_BUILD_ID 2 -#define PFCP_IE_ENTERPRISE_TRAVELPING_NOW 3 -#define PFCP_IE_ENTERPRISE_TRAVELPING_START 4 -#define PFCP_IE_ENTERPRISE_TRAVELPING_STOP 5 -#define PFCP_IE_ENTERPRISE_TRAVELPING_ERROR_REPORT 6 -#define PFCP_IE_ENTERPRISE_TRAVELPING_ERROR_MESSAGE 7 -#define PFCP_IE_ENTERPRISE_TRAVELPING_FILE_NAME 8 -#define PFCP_IE_ENTERPRISE_TRAVELPING_LINE_NUMBER 9 - -static const value_string pfcp_ie_enterprise_travelping_type[] = { - { PFCP_IE_ENTERPRISE_TRAVELPING_BUILD_ID, "Build Id"}, - { PFCP_IE_ENTERPRISE_TRAVELPING_NOW, "Now"}, - { PFCP_IE_ENTERPRISE_TRAVELPING_START, "Start"}, - { PFCP_IE_ENTERPRISE_TRAVELPING_STOP, "Stop"}, - { PFCP_IE_ENTERPRISE_TRAVELPING_ERROR_REPORT, "Error Report"}, - { PFCP_IE_ENTERPRISE_TRAVELPING_ERROR_MESSAGE, "Error Message"}, - { PFCP_IE_ENTERPRISE_TRAVELPING_FILE_NAME, "File Name"}, - { PFCP_IE_ENTERPRISE_TRAVELPING_LINE_NUMBER, "Line Number"}, + proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_nat_external_port_range_end, tvb, offset, 2, ENC_BIG_ENDIAN, &end); + offset += 2; + + proto_item_append_text(proto_tree_get_parent(tree), ": %u:%u", start, end); + + return offset; +} + +/* + * TR-459.2: 6.5.7 BBF NAT port forward + */ +static int +dissect_pfcp_enterprise_bbf_nat_port_forward(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +{ + int offset = 0; + guint length = tvb_reported_length(tvb); + + while ((guint)offset < length) { + guint32 in, out, protocol; + proto_item *li; + proto_tree *lt; + + li = proto_tree_add_item(tree, hf_pfcp_bbf_nat_port_forward, tvb, offset, 9, ENC_NA); + lt = proto_item_add_subtree(li, ett_pfcp_bbf_nat_port_forward_list); + + proto_tree_add_item(lt, hf_pfcp_bbf_nat_port_forward_inside_ip, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + + proto_tree_add_item_ret_uint(lt, hf_pfcp_bbf_nat_port_forward_inside_port, tvb, offset, 2, ENC_BIG_ENDIAN, &in); + offset += 2; + + proto_tree_add_item_ret_uint(lt, hf_pfcp_bbf_nat_port_forward_outside_port, tvb, offset, 2, ENC_BIG_ENDIAN, &out); + offset += 2; + + proto_tree_add_item_ret_uint(lt, hf_pfcp_bbf_nat_port_forward_protocol, tvb, offset, 1, ENC_BIG_ENDIAN, &protocol); + offset += 1; + + proto_item_append_text(li, ": proto=%s: %s:%u -> %u", val_to_str_ext_const(protocol, &ipproto_val_ext, "Unknown"), + tvb_ip_to_str(pinfo->pool, tvb, 0), in, out); + } + + return offset; +} + +/* + * TR 459.2: 6.5.3 BBF Report Trigger + */ +static const value_string pfcp_bbf_reporting_trigger_vals[] = { + + { 0, "reserved" }, + { 1, "DBNG-UP allocated NAT blocks" }, { 0, NULL } }; -static value_string_ext pfcp_ie_enterprise_travelping_type_ext = VALUE_STRING_EXT_INIT(pfcp_ie_enterprise_travelping_type); +static int +dissect_pfcp_enterprise_bbf_reporting_trigger(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) +{ + int offset = 0; + guint32 value; -static void -dissect_pfcp_enterprise_travelping_build_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) + proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_reporting_trigger, tvb, offset, 1, ENC_BIG_ENDIAN, &value); + offset += 1; + proto_item_append_text(proto_tree_get_parent(tree), "%s", val_to_str_const(value, pfcp_bbf_reporting_trigger_vals, "Unknown")); + + return offset; +} + +/* + * TR 459.2: 6.5.8 BBF Dynamic NAT Block Port Range + */ +static int +dissect_pfcp_enterprise_bbf_dynamic_nat_block_port_range(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_) +{ + int offset = 0; + guint32 start, end; + + proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_dynamic_nat_block_port_range_start_port, tvb, offset, 2, ENC_BIG_ENDIAN, &start); + offset += 2; + + proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_dynamic_nat_block_port_range_end_port, tvb, offset, 2, ENC_BIG_ENDIAN, &end); + offset += 2; + + proto_item_append_text(proto_tree_get_parent(tree), "%u:%u", start, end); + + return offset; +} + +/* + * TR 459.2: 6.5.9 BBF Event Time Stamp + */ +static int +dissect_pfcp_enterprise_bbf_event_time_stamp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +{ + int offset = 0; + char *time_str; + + proto_tree_add_item_ret_time_string(tree, hf_pfcp_bbf_event_time_stamp, tvb, 0, 8, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str); + offset += 8; + proto_item_append_text(proto_tree_get_parent(tree), "%s", time_str); + + return offset; +} + +static pfcp_generic_ie_t pfcp_bbf_ies[] = { + /* TR-459 */ + { VENDOR_BROADBAND_FORUM, 32768 , "UP Function Features" , dissect_pfcp_enterprise_bbf_up_function_features , -1} , + { VENDOR_BROADBAND_FORUM, 32769 , "Logical Port" , dissect_pfcp_enterprise_bbf_logical_port , -1} , + { VENDOR_BROADBAND_FORUM, 32770 , "Outer Header Creation" , dissect_pfcp_enterprise_bbf_outer_header_creation , -1} , + { VENDOR_BROADBAND_FORUM, 32771 , "Outer Header Removal" , dissect_pfcp_enterprise_bbf_outer_header_removal , -1} , + { VENDOR_BROADBAND_FORUM, 32772 , "PPPoE Session ID" , dissect_pfcp_enterprise_bbf_pppoe_session_id , -1} , + { VENDOR_BROADBAND_FORUM, 32773 , "PPP protocol" , dissect_pfcp_enterprise_bbf_ppp_protocol , -1} , + { VENDOR_BROADBAND_FORUM, 32774 , "Verification Timers" , dissect_pfcp_enterprise_bbf_verification_timers , -1} , + { VENDOR_BROADBAND_FORUM, 32775 , "PPP LCP Magic Number" , dissect_pfcp_enterprise_bbf_ppp_lcp_magic_number , -1} , + { VENDOR_BROADBAND_FORUM, 32776 , "MTU" , dissect_pfcp_enterprise_bbf_mtu , -1} , + { VENDOR_BROADBAND_FORUM, 32777 , "L2TP Tunnel Endpoint" , dissect_pfcp_enterprise_bbf_l2tp_tunnel_endpoint , -1} , + { VENDOR_BROADBAND_FORUM, 32778 , "L2TP Session ID" , dissect_pfcp_enterprise_bbf_l2tp_session_id , -1} , + { VENDOR_BROADBAND_FORUM, 32779 , "L2TP Type" , dissect_pfcp_enterprise_bbf_l2tp_type , -1} , + { VENDOR_BROADBAND_FORUM, 32780 , "PPP LCP Connectivity" , dissect_pfcp_grouped_ie_wrapper , -1} , + { VENDOR_BROADBAND_FORUM, 32781 , "L2TP Tunnel" , dissect_pfcp_grouped_ie_wrapper , -1} , + /* TR-459.3 */ + { VENDOR_BROADBAND_FORUM, 32782 , "BBF Multicast Flags" , dissect_pfcp_enterprise_bbf_multicast_flags , -1} , + { VENDOR_BROADBAND_FORUM, 32783 , "BBF Multicast Query Parameters" , dissect_pfcp_enterprise_bbf_multicast_query_parameters , -1} , + { VENDOR_BROADBAND_FORUM, 32784 , "BBF Multicast Group Limit" , dissect_pfcp_enterprise_bbf_multicast_group_limit , -1} , + { VENDOR_BROADBAND_FORUM, 32785 , "BBF Multicast Protocol Control" , dissect_pfcp_grouped_ie_wrapper , -1} , + /* TR-459.2 */ + { VENDOR_BROADBAND_FORUM, 32787 , "BBF Apply Action" , dissect_pfcp_enterprise_bbf_apply_action , -1} , + { VENDOR_BROADBAND_FORUM, 32788 , "BBF NAT External Port Range" , dissect_pfcp_enterprise_bbf_nat_external_port_range , -1} , + { VENDOR_BROADBAND_FORUM, 32789 , "BBF NAT Port Forward" , dissect_pfcp_enterprise_bbf_nat_port_forward , -1} , + { VENDOR_BROADBAND_FORUM, 32790 , "BBF Report Trigger" , dissect_pfcp_enterprise_bbf_reporting_trigger , -1} , + { VENDOR_BROADBAND_FORUM, 32791 , "BBF Dynamic NAT Block Port Range" , dissect_pfcp_enterprise_bbf_dynamic_nat_block_port_range , -1} , + { VENDOR_BROADBAND_FORUM, 32792 , "BBF Event Time Stamp" , dissect_pfcp_enterprise_bbf_event_time_stamp , -1} , +}; + +/* Enterprise IE decoding Travelping */ + +static int +dissect_pfcp_enterprise_travelping_packet_measurement(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + int offset = 0; + guint64 flags; + + static int * const pfcp_enterprise_travelping_packet_measurement_flags[] = { + &hf_pfcp_spare_b7_b3, + &hf_pfcp_enterprise_travelping_packet_measurement_b2_dlnop, + &hf_pfcp_enterprise_travelping_packet_measurement_b1_ulnop, + &hf_pfcp_enterprise_travelping_packet_measurement_b0_tonop, + NULL + }; + + proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_enterprise_travelping_packet_measurement, + ett_pfcp_enterprise_travelping_packet_measurement, pfcp_enterprise_travelping_packet_measurement_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags); + offset += 1; + + if ((flags & 0x1)) { + proto_tree_add_item(tree, hf_pfcp_travelping_pkt_meas_tonop, tvb, offset, 8, ENC_BIG_ENDIAN); + offset += 8; + } + if ((flags & 0x2)) { + proto_tree_add_item(tree, hf_pfcp_travelping_pkt_meas_ulnop, tvb, offset, 8, ENC_BIG_ENDIAN); + offset += 8; + } + if ((flags & 0x4)) { + proto_tree_add_item(tree, hf_pfcp_travelping_pkt_meas_dlnop, tvb, offset, 8, ENC_BIG_ENDIAN); + offset += 8; + } + + return offset; +} + +static int +dissect_pfcp_enterprise_travelping_build_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { /* Octet 7 to (n+4) Travelping Build Id */ - if (tvb_ascii_isprint(tvb, 0, length)) + if (tvb_ascii_isprint(tvb, 0, -1)) { const guint8* string_value; - proto_tree_add_item_ret_string(tree, hf_pfcp_travelping_build_id_str, tvb, 0, length, ENC_ASCII | ENC_NA, pinfo->pool, &string_value); - proto_item_append_text(item, "%s", string_value); + proto_tree_add_item_ret_string(tree, hf_pfcp_travelping_build_id_str, tvb, 0, -1, ENC_ASCII | ENC_NA, pinfo->pool, &string_value); + proto_item_append_text(proto_tree_get_parent(tree), "%s", string_value); } else { - proto_tree_add_item(tree, hf_pfcp_travelping_build_id, tvb, 0, length, ENC_NA); + proto_tree_add_item(tree, hf_pfcp_travelping_build_id, tvb, 0, -1, ENC_NA); } + + return tvb_reported_length(tvb); } -static void -dissect_pfcp_enterprise_travelping_now(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_travelping_now(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) { int offset = 0; char *time_str; @@ -10874,15 +11427,13 @@ dissect_pfcp_enterprise_travelping_now(tvbuff_t *tvb, packet_info *pinfo, proto_ proto_tree_add_item_ret_time_string(tree, hf_pfcp_travelping_now, tvb, 0, 8, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str); offset += 8; - proto_item_append_text(item, "%s", time_str); + proto_item_append_text(proto_tree_get_parent(tree), "%s", time_str); - if (offset < length) { - proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); - } + return offset; } -static void -dissect_pfcp_enterprise_travelping_start(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_travelping_start(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { int offset = 0; char *time_str; @@ -10890,15 +11441,13 @@ dissect_pfcp_enterprise_travelping_start(tvbuff_t *tvb, packet_info *pinfo, prot proto_tree_add_item_ret_time_string(tree, hf_pfcp_travelping_now, tvb, 0, 8, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str); offset += 8; - proto_item_append_text(item, "%s", time_str); + proto_item_append_text(proto_tree_get_parent(tree), "%s", time_str); - if (offset < length) { - proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); - } + return offset; } -static void -dissect_pfcp_enterprise_travelping_stop(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_travelping_stop(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { int offset = 0; char *time_str; @@ -10906,47 +11455,49 @@ dissect_pfcp_enterprise_travelping_stop(tvbuff_t *tvb, packet_info *pinfo, proto proto_tree_add_item_ret_time_string(tree, hf_pfcp_travelping_now, tvb, offset, 8, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str); offset += 8; - proto_item_append_text(item, "%s", time_str); + proto_item_append_text(proto_tree_get_parent(tree), "%s", time_str); - if (offset < length) { - proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); - } + return offset; } -static void -dissect_pfcp_enterprise_travelping_error_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_travelping_error_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { /* Octet 7 to (n+4) Travelping Error Message */ - if (tvb_ascii_isprint(tvb, 0, length)) + if (tvb_ascii_isprint(tvb, 0, -1)) { const guint8* string_value; - proto_tree_add_item_ret_string(tree, hf_pfcp_travelping_error_message_str, tvb, 0, length, ENC_ASCII | ENC_NA, pinfo->pool, &string_value); - proto_item_append_text(item, "%s", string_value); + proto_tree_add_item_ret_string(tree, hf_pfcp_travelping_error_message_str, tvb, 0, -1, ENC_ASCII | ENC_NA, pinfo->pool, &string_value); + proto_item_append_text(proto_tree_get_parent(tree), "%s", string_value); } else { - proto_tree_add_item(tree, hf_pfcp_travelping_error_message, tvb, 0, length, ENC_NA); + proto_tree_add_item(tree, hf_pfcp_travelping_error_message, tvb, 0, -1, ENC_NA); } + + return tvb_reported_length(tvb); } -static void -dissect_pfcp_enterprise_travelping_file_name(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_travelping_file_name(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { /* Octet 7 to (n+4) Travelping Error Message */ - if (tvb_ascii_isprint(tvb, 0, length)) + if (tvb_ascii_isprint(tvb, 0, -1)) { const guint8* string_value; - proto_tree_add_item_ret_string(tree, hf_pfcp_travelping_file_name_str, tvb, 0, length, ENC_ASCII | ENC_NA, pinfo->pool, &string_value); - proto_item_append_text(item, "%s", string_value); + proto_tree_add_item_ret_string(tree, hf_pfcp_travelping_file_name_str, tvb, 0, -1, ENC_ASCII | ENC_NA, pinfo->pool, &string_value); + proto_item_append_text(proto_tree_get_parent(tree), "%s", string_value); } else { - proto_tree_add_item(tree, hf_pfcp_travelping_file_name, tvb, 0, length, ENC_NA); + proto_tree_add_item(tree, hf_pfcp_travelping_file_name, tvb, 0, -1, ENC_NA); } + + return tvb_reported_length(tvb); } -static void -dissect_pfcp_enterprise_travelping_line_number(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_) +static int +dissect_pfcp_enterprise_travelping_line_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) { int offset = 0; guint32 line_number; @@ -10955,54 +11506,699 @@ dissect_pfcp_enterprise_travelping_line_number(tvbuff_t *tvb, packet_info *pinfo proto_tree_add_item_ret_uint(tree, hf_pfcp_travelping_line_number, tvb, offset, 4, ENC_BIG_ENDIAN, &line_number); offset += 4; - proto_item_append_text(item, " : %u", line_number); + proto_item_append_text(proto_tree_get_parent(tree), " : %u", line_number); - if (offset < length) { - proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1); + return offset; +} + +static int +dissect_pfcp_enterprise_travelping_ipfix_policy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +{ + /* Octet 7 to (n+4) Travelping IPFIX Policy */ + if (tvb_ascii_isprint(tvb, 0, -1)) + { + const guint8* string_value; + proto_tree_add_item_ret_string(tree, hf_pfcp_travelping_ipfix_policy_str, tvb, 0, -1, ENC_ASCII | ENC_NA, pinfo->pool, &string_value); + proto_item_append_text(proto_tree_get_parent(tree), "%s", string_value); + } + else + { + proto_tree_add_item(tree, hf_pfcp_travelping_ipfix_policy, tvb, 0, -1, ENC_NA); } + + return tvb_reported_length(tvb); } -static const pfcp_ie_t pfcp_enterprise_travelping_ies[] = { -/* 0 */ { dissect_pfcp_reserved }, -/* 1 */ { dissect_pfcp_reserved }, -/* 2 */ { dissect_pfcp_enterprise_travelping_build_id }, -/* 3 */ { dissect_pfcp_enterprise_travelping_now }, -/* 4 */ { dissect_pfcp_enterprise_travelping_start }, -/* 5 */ { dissect_pfcp_enterprise_travelping_stop }, -/* 6 */ { dissect_pfcp_enterprise_travelping_error_report }, -/* 7 */ { dissect_pfcp_enterprise_travelping_error_message }, -/* 8 */ { dissect_pfcp_enterprise_travelping_file_name }, -/* 9 */ { dissect_pfcp_enterprise_travelping_line_number }, - { NULL }, /* End of List */ +static int +dissect_pfcp_enterprise_travelping_trace_parent(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +{ + /* Octet 7 to (n+4) Travelping Trace Parent */ + if (tvb_ascii_isprint(tvb, 0, -1)) + { + const guint8* string_value; + proto_tree_add_item_ret_string(tree, hf_pfcp_travelping_trace_parent_str, tvb, 0, -1, ENC_ASCII | ENC_NA, pinfo->pool, &string_value); + proto_item_append_text(proto_tree_get_parent(tree), "%s", string_value); + } + else + { + proto_tree_add_item(tree, hf_pfcp_travelping_trace_parent, tvb, 0, -1, ENC_NA); + } + + return tvb_reported_length(tvb); +} + +static int +dissect_pfcp_enterprise_travelping_trace_state(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +{ + /* Octet 7 to (n+4) Travelping Trace State */ + if (tvb_ascii_isprint(tvb, 0, -1)) + { + const guint8* string_value; + proto_tree_add_item_ret_string(tree, hf_pfcp_travelping_trace_state_str, tvb, 0, -1, ENC_ASCII | ENC_NA, pinfo->pool, &string_value); + proto_item_append_text(proto_tree_get_parent(tree), "%s", string_value); + } + else + { + proto_tree_add_item(tree, hf_pfcp_travelping_trace_state, tvb, 0, -1, ENC_NA); + } + + return tvb_reported_length(tvb); +} + + +static pfcp_generic_ie_t pfcp_travelping_ies[] = { + { VENDOR_TRAVELPING, 32769 , "Packet Measurement" , dissect_pfcp_enterprise_travelping_packet_measurement , -1} , + { VENDOR_TRAVELPING, 32770 , "Build Id" , dissect_pfcp_enterprise_travelping_build_id , -1} , + { VENDOR_TRAVELPING, 32771 , "Now" , dissect_pfcp_enterprise_travelping_now , -1} , + { VENDOR_TRAVELPING, 32772 , "Start" , dissect_pfcp_enterprise_travelping_start , -1} , + { VENDOR_TRAVELPING, 32773 , "Stop" , dissect_pfcp_enterprise_travelping_stop , -1} , + { VENDOR_TRAVELPING, 32774 , "Error Report" , dissect_pfcp_grouped_ie_wrapper , -1} , + { VENDOR_TRAVELPING, 32775 , "Error Message" , dissect_pfcp_enterprise_travelping_error_message , -1} , + { VENDOR_TRAVELPING, 32776 , "File Name" , dissect_pfcp_enterprise_travelping_file_name , -1} , + { VENDOR_TRAVELPING, 32777 , "Line Number" , dissect_pfcp_enterprise_travelping_line_number , -1} , + { VENDOR_TRAVELPING, 32778 , "Created NAT Binding" , dissect_pfcp_grouped_ie_wrapper , -1} , + { VENDOR_TRAVELPING, 32779 , "IPFIX Policy" , dissect_pfcp_enterprise_travelping_ipfix_policy , -1} , + { VENDOR_TRAVELPING, 32780 , "Trace Information" , dissect_pfcp_grouped_ie_wrapper , -1} , + { VENDOR_TRAVELPING, 32781 , "Trace Parent" , dissect_pfcp_enterprise_travelping_trace_parent , -1} , + { VENDOR_TRAVELPING, 32782 , "Trace State" , dissect_pfcp_enterprise_travelping_trace_state , -1} , }; -#define NUM_PFCP_ENTERPRISE_TRAVELPING_IES (sizeof(pfcp_enterprise_travelping_ies)/sizeof(pfcp_ie_t)) -/* Set up the array to hold "etts" for each IE*/ -gint ett_pfcp_enterprise_travelping_elem[NUM_PFCP_ENTERPRISE_TRAVELPING_IES-1]; +/************************************ Nokia ***********************************/ -static void -dissect_pfcp_enterprise_travelping_error_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type, pfcp_session_args_t *args) +static int dissect_pfcp_nokia_sap_template(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) { - dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_enterprise_travelping_elem[PFCP_IE_ENTERPRISE_TRAVELPING_ERROR_REPORT], args); + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_sap_template); } -static int -dissect_pfcp_enterprise_travelping_ies(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) +static int dissect_pfcp_nokia_group_if_template(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) { - pfcp_sub_dis_t *pfcp_sub_dis_info = (pfcp_sub_dis_t *)data; + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_group_iface_template); +} + +static int dissect_pfcp_nokia_session_state_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + guint64 value; + + proto_tree_add_item_ret_uint64(tree, hf_pfcp_nokia_session_state_id, tvb, 0, 8, ENC_BIG_ENDIAN, &value); + proto_item_append_text(proto_tree_get_parent(tree), " : %" G_GUINT64_FORMAT, value); + + return 8; +} + +static const true_false_string tfs_nokia_detailed_stats_ie = { "Egress", "Ingress" }; +static const true_false_string tfs_nokia_detailed_stats_qp = { "Policer", "Queue" }; +static const val64_string nokia_detailed_stats_length_values[] = { + {0, "Not present"}, + {1, "4 bytes"}, + {2, "8 bytes"}, + {3, "Invalid"}, + {0, NULL} +}; + +static int dissect_pfcp_nokia_detailed_statistics(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +{ + static const value_string ingress_queue_names[] = { + { 1, "HighPktsOffered"}, + { 2, "HighPktsDropped"}, + { 3, "LowPktsOffered"}, + { 4, "LowPktsDropped"}, + { 5, "HighOctetsOffered"}, + { 6, "HighOctetsDropped"}, + { 7, "LowOctetsOffered"}, + { 8, "LowOctetsDropped"}, + { 9, "UncolouredPktsOffered"}, + {10, "UncolouredOctetsOffered"}, + {11, "McastManagedPktsOffered"}, + {12, "McastManagedOctetsOffered"}, + {13, "InProfilePktsForwarded"}, + {14, "OutOfProfilePktsForwarded"}, + {15, "InProfileOctetsForwarded"}, + {16, "OutOfProfileOctetsForwarded"}, + { 0, NULL}, + }; + static const value_string egress_queue_names[] = { + { 1, "InProfilePktsForwarded"}, + { 2, "InProfilePktsDropped"}, + { 3, "OutOfProfilePktsForwarded"}, + { 4, "OutOfProfilePktsDropped"}, + { 5, "InProfileOctetsForwarded"}, + { 6, "InProfileOctetsDropped"}, + { 7, "OutOfProfileOctetsForwarded"}, + { 8, "OutOfProfileOctetsDropped"}, + { 9, "ExceedProfilePktsForwarded"}, + {10, "ExceedProfilePktsDropped"}, + {11, "ExceedProfileOctetsForwarded"}, + {12, "ExceedProfileOctetsDropped"}, + { 0, NULL}, + }; + static const value_string policer_names[] = { + { 1, "HighPktsOffered"}, + { 2, "HighPktsDropped"}, + { 3, "LowPktsOffered"}, + { 4, "LowPktsDropped"}, + { 5, "HighOctetsOffered"}, + { 6, "HighOctetsDropped"}, + { 7, "LowOctetsOffered"}, + { 8, "LowOctetsDropped"}, + { 9, "UncolouredPktsOffered"}, + {10, "UncolouredOctetsOffered"}, + {11, "InProfilePktsForwarded"}, + {12, "OutOfProfilePktsForwarded"}, + {13, "InProfileOctetsForwarded"}, + {14, "OutOfProfileOctetsForwarded"}, + {15, "ExceedProfilePktsOffered"}, + {16, "ExceedProfilePktsDropped"}, + {17, "ExceedProfilePktsForwarded"}, + {18, "ExceedProfileOctetsOffered"}, + {19, "ExceedProfileOctetsDropped"}, + {20, "ExceedProfileOctetsForwarded"}, + {21, "InPlusProfilePktsOffered"}, + {22, "InPlusProfilePktsDropped"}, + {23, "InPlusProfilePktsForwarded"}, + {24, "InPlusProfileOctetsOffered"}, + {25, "InPlusProfileOctetsDropped"}, + {26, "InPlusProfileOctetsForwarded"}, + { 0, NULL}, + }; + + int offset = 0; + static int * const key[] = { + &hf_pfcp_nokia_detailed_stats_key_direction, + &hf_pfcp_nokia_detailed_stats_key_type, + &hf_pfcp_nokia_detailed_stats_key_object_id, + &hf_pfcp_nokia_detailed_stats_key_stat_mode, + NULL + }; + + guint64 flags; + proto_tree_add_bitmask_with_flags_ret_uint64( + tree, tvb, offset, hf_pfcp_nokia_detailed_stats_key, + ett_pfcp_nokia_detailed_stats_key, key, + ENC_BIG_ENDIAN, 0, &flags + ); + const bool flags_egress = !!(flags & 0x80000000); + const bool flags_policer = !!(flags & 0x40000000); + offset += 4; + + proto_item* bitmap_item; + proto_tree* bitmap_tree = proto_tree_add_subtree_format(tree, tvb, offset, 8, ett_pfcp_nokia_detailed_stats_bitmap, &bitmap_item, "Counter info"); + guint64 bitmap = tvb_get_ntoh64(tvb, offset); + const int bitmap_offset = offset; + offset += 8; + + int num = 0; + for (int i = 0; bitmap != 0; bitmap <<= 8, i += 4) + { + uint8_t mappedbyte = (bitmap >> 56) & 0xff; + if (mappedbyte == 0) continue; + + for (int j = 1; mappedbyte != 0; mappedbyte >>= 2, j++) + { + const uint8_t bits = mappedbyte & 0x03; + int counter_index = i + j; + if (bits == 0) continue; + + const value_string* names = flags_policer ? policer_names : flags_egress ? egress_queue_names : ingress_queue_names; + const char* counter_name = val_to_str(counter_index, names, "Counter %u"); + + const int bit_offset = 8 * (bitmap_offset + i/4 + 1) - 2 * j; + proto_item* it = proto_tree_add_bits_item(bitmap_tree, hf_pfcp_nokia_detailed_stats_bitmap_item, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + proto_item_append_text(it, " - %s (%u) ", counter_name, counter_index); + if (bits == 3) + { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, bitmap_offset, 8); + break; + } + + const int len = bits == 1 ? 4 : 8; + + if (offset > 0 && (unsigned) offset + len > tvb_reported_length(tvb)) + { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, offset, tvb_reported_length(tvb) - offset); + break; + } + + guint64 octets; + it = proto_tree_add_item_ret_uint64(tree, hf_pfcp_nokia_detailed_stats_octets, tvb, offset, len, ENC_BIG_ENDIAN, &octets); + proto_item_set_text(it, "%s: %" G_GINT64_MODIFIER "u", counter_name, octets); + + num++; + offset += len; + } + } + + if (num == 0) + { + proto_item_append_text(bitmap_item, " (empty)"); + } + + proto_item_append_text(proto_tree_get_parent(tree), " : %u %s %s counter%s (object %u mode %u)", + num, flags_egress ? "egress" : "ingress", flags_policer ? "policer" : "queue", num == 1 ? "" : "s", + (int) (flags >> 16) & 0x3f, (int) flags & 0x1f); + + return offset; +} + +static int dissect_pfcp_nokia_detailed_error(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_detailed_error); +} + +static int dissect_pfcp_nokia_qos_override(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_qos_override); +} + +static int dissect_pfcp_nokia_measurement_information(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + static int * const flags[] = { + &hf_pfcp_spare_b7_b1, + &hf_pfcp_nokia_measurement_info_b0_det, + NULL + }; + + proto_tree_add_bitmask_with_flags(tree, tvb, 0, hf_pfcp_nokia_measurement_info, ett_pfcp_nokia_measurement_info, flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + + return 1; +} + +static int dissect_pfcp_nokia_pfpsmreq_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + static int * const flags[] = { + &hf_pfcp_spare_b7_b2, + &hf_pfcp_nokia_pfcpsmreq_flags_b1_audit, + &hf_pfcp_nokia_pfcpsmreq_flags_b0_abs, + NULL + }; + + proto_tree_add_bitmask_with_flags(tree, tvb, 0, hf_pfcp_nokia_pfcpsmreq_flags, ett_pfcp_nokia_pfcpsmreq_flags, flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + + return 1; +} + +static int dissect_pfcp_nokia_up_function_features(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + static int * const pfcp_nokia_up_function_features_flags[] = { + &hf_pfcp_nokia_up_function_features_sssg, + &hf_pfcp_nokia_up_function_features_bulk_audit, + NULL, + }; + + proto_tree_add_bitmask_list(tree, tvb, 0, 1, pfcp_nokia_up_function_features_flags, ENC_BIG_ENDIAN); + + return 1; +} + +static const value_string nokia_filter_override_type_vals[] = { + {0, "Ingress IPv4"}, + {1, "Egress IPv4"}, + {2, "Ingress IPv6"}, + {3, "Egress IPv6"}, + {0, NULL} +}; + +static int dissect_pfcp_nokia_filter_override(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + guint32 type; + proto_tree_add_item_ret_uint(tree, hf_pfcp_nokia_filter_override_type, tvb, 0, 1, ENC_BIG_ENDIAN, &type); + + if (tvb_reported_length(tvb) == 1) + { + proto_item_append_text(proto_tree_get_parent(tree), " : %s: <disable>", val_to_str_const(type, nokia_filter_override_type_vals, "Unknown")); + } + else + { + proto_tree_add_item(tree, hf_pfcp_nokia_filter_override_name, tvb, 1, tvb_reported_length(tvb) - 1, ENC_ASCII); + + proto_item_append_text(proto_tree_get_parent(tree), " : %s: %s", + val_to_str_const(type, nokia_filter_override_type_vals, "Unknown"), + tvb_get_string_enc(wmem_packet_scope(), tvb, 1, tvb_reported_length(tvb) - 1, ENC_ASCII)); + } + + return tvb_reported_length(tvb); +} + +static int dissect_pfcp_nokia_intermediate_destination(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_intermediate_destination); +} + +static int dissect_pfcp_nokia_nat_isa_members(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + guint32 num_members; + + proto_tree_add_item_ret_uint(tree, hf_pfcp_nokia_nat_isa_members, tvb, 0, 1, ENC_BIG_ENDIAN, &num_members); + proto_item_append_text(proto_tree_get_parent(tree), " : %u", num_members); + + return 1; +} + +static int dissect_pfcp_nokia_pfcphb_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + static int * const flags[] = { + &hf_pfcp_spare_b7_b3, + &hf_pfcp_nokia_pfcphb_flags_b2_aud_e, + &hf_pfcp_nokia_pfcphb_flags_b1_aud_s, + &hf_pfcp_nokia_pfcphb_flags_b0_aud_r, + NULL + }; + + proto_tree_add_bitmask_with_flags(tree, tvb, 0, hf_pfcp_nokia_pfcphb_flags, ett_pfcp_nokia_pfcphb_flags, flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT); + + return 1; +} + +static int dissect_pfcp_nokia_l2tp_lcp_options(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + proto_tree_add_item(tree, hf_pfcp_nokia_l2tp_lcp_request, tvb, 0, -1, ENC_NA); + + return tvb_reported_length(tvb); +} + +static const value_string nokia_l2tp_auth_type_vals[] = { + {0, "CHAP"}, + {1, "PAP"}, + {0, NULL} +}; + +static int dissect_pfcp_nokia_l2tp_auth_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + guint32 type; + proto_tree_add_item_ret_uint(tree, hf_pfcp_nokia_l2tp_auth_type, tvb, 0, 1, ENC_BIG_ENDIAN, &type); + proto_item_append_text(proto_tree_get_parent(tree), " : %s", val_to_str_const(type, nokia_l2tp_auth_type_vals, "<Unknown>")); + + return 1; +} + +static int dissect_pfcp_nokia_l2tp_auth_name(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_l2tp_auth_name); +} + +static int dissect_pfcp_nokia_l2tp_auth_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + guint32 id; + proto_tree_add_item_ret_uint(tree, hf_pfcp_nokia_l2tp_auth_id, tvb, 0, 1, ENC_BIG_ENDIAN, &id); + proto_item_append_text(proto_tree_get_parent(tree), " : %u", id); + + return 1; +} + +static int dissect_pfcp_nokia_l2tp_auth_challenge(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + proto_tree_add_item(tree, hf_pfcp_nokia_l2tp_auth_challenge, tvb, 0, -1, ENC_NA); + + return tvb_reported_length(tvb); +} + +static int dissect_pfcp_nokia_l2tp_auth_response(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + proto_tree_add_item(tree, hf_pfcp_nokia_l2tp_auth_response, tvb, 0, -1, ENC_NA); + + return tvb_reported_length(tvb); +} + +static int dissect_pfcp_nokia_l2tp_endpoint(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +{ + if (tvb_reported_length(tvb) == 4) + { + proto_tree_add_item(tree, hf_pfcp_nokia_l2tp_tunnel_endpoint_ipv4_address, tvb, 0, 4, ENC_BIG_ENDIAN); + proto_item_append_text(proto_tree_get_parent(tree), " : %s", tvb_ip_to_str(pinfo->pool, tvb, 0)); + } + else if (tvb_reported_length(tvb) == 16) + { + proto_tree_add_item(tree, hf_pfcp_nokia_l2tp_tunnel_endpoint_ipv6_address, tvb, 0, 16, ENC_NA); + proto_item_append_text(proto_tree_get_parent(tree), " : %s", tvb_ip6_to_str(pinfo->pool, tvb, 0)); + } + else + { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, 0, -1); + } + + return tvb_reported_length(tvb); +} + +static int dissect_pfcp_nokia_l2tp_client_auth_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_l2tp_client_auth_id); +} + +static int dissect_pfcp_nokia_l2tp_server_auth_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_l2tp_server_auth_id); +} + +static int dissect_pfcp_nokia_l2tp_password(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_l2tp_password); +} + +static int dissect_pfcp_nokia_l2tp_assignment_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_l2tp_assignment_id); +} + +static int dissect_pfcp_nokia_l2tp_private_group_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_l2tp_private_group_id); +} + +static int dissect_pfcp_flags_and_fields(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned length, int * const * flags, int * const * fields, int flags_hf, int flags_ett) +{ + unsigned offset = 0; + + guint64 flags_present; + proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, flags_hf, flags_ett, flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_present); + offset += 4; + + for (int i = 0; flags[i] != NULL; i++) + { + // is there a corresponding field? + if (fields[i] == NULL) continue; + + // is the flag enabled? + header_field_info* hf = proto_registrar_get_nth(*flags[i]); + if ((flags_present & hf->bitmask) == 0) continue; + + // is the field actually there? + if (offset >= length) + { + proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, 0, length); + return tvb_reported_length(tvb); + } + + // all is well, add the field + hf = proto_registrar_get_nth(*fields[i]); + int len = hf->type == FT_UINT8 ? 1 : + hf->type == FT_UINT24 ? 3 : + hf->type == FT_UINT32 ? 4 : 0; + proto_tree_add_item(tree, *fields[i], tvb, offset, len, ENC_NA); + offset += len; + } + + return offset; +} + +static const value_string nokia_l2tp_params_algorithm_vals[] = { + {0, "Weighted Access"}, + {1, "Weighted Random"}, + {2, "Existing First"}, + {0, NULL} +}; + +static const value_string nokia_l2tp_params_avp_hiding_vals[] = { + {0, "Nothing"}, + {1, "Sensitive Only"}, + {2, "All"}, + {0, NULL} +}; + +static const value_string nokia_l2tp_params_never_always[] = { + {0, "Never"}, + {1, "Always"}, + {0, NULL} +}; + +static const value_string nokia_l2tp_params_infinite[] = { + {0xffffff, "Infinite"}, + {0, NULL} +}; + +static int dissect_pfcp_nokia_l2tp_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +{ + static int * const flags[] = { + &hf_pfcp_nokia_l2tp_params_flags_b24_algorithm, + &hf_pfcp_nokia_l2tp_params_flags_b25_avp_hiding, + &hf_pfcp_nokia_l2tp_params_flags_b26_challenge, + &hf_pfcp_nokia_l2tp_params_flags_b27_df_bit, + &hf_pfcp_nokia_l2tp_params_flags_b28_preference, + &hf_pfcp_nokia_l2tp_params_flags_b29_session_limit, + &hf_pfcp_nokia_l2tp_params_flags_b30_idle_timeout, + &hf_pfcp_nokia_l2tp_params_flags_b31_hello_interval, + &hf_pfcp_nokia_l2tp_params_flags_b16_destruct_timeout, + &hf_pfcp_nokia_l2tp_params_flags_b17_max_retries_estab, + &hf_pfcp_nokia_l2tp_params_flags_b18_max_retries_not_estab, + &hf_pfcp_nokia_l2tp_params_flags_b19_rx_window_size, + NULL + }; + static int * const fields[] = { + &hf_pfcp_nokia_l2tp_params_algorithm, + &hf_pfcp_nokia_l2tp_params_avp_hiding, + &hf_pfcp_nokia_l2tp_params_challenge, + &hf_pfcp_nokia_l2tp_params_df_bit, + &hf_pfcp_nokia_l2tp_params_preference, + &hf_pfcp_nokia_l2tp_params_session_limit, + &hf_pfcp_nokia_l2tp_params_idle_timeout, + &hf_pfcp_nokia_l2tp_params_hello_interval, + &hf_pfcp_nokia_l2tp_params_destruct_timeout, + &hf_pfcp_nokia_l2tp_params_max_retries_estab, + &hf_pfcp_nokia_l2tp_params_max_retries_not_estab, + &hf_pfcp_nokia_l2tp_params_rx_window_size, + NULL + }; + + return dissect_pfcp_flags_and_fields(tvb, pinfo, tree, tvb_reported_length(tvb), flags, fields, hf_pfcp_nokia_l2tp_tunnel_params_flags, ett_pfcp_nokia_l2tp_tunnel_params_flags); +} + +static int dissect_pfcp_nokia_l2tp_ids(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + guint32 local_tunnel, remote_tunnel, local_session, remote_session, call_serial_number; + + proto_tree_add_item_ret_uint(tree, hf_pfcp_nokia_l2tp_local_tunnel_id , tvb, 0, 2, ENC_BIG_ENDIAN, &local_tunnel); + proto_tree_add_item_ret_uint(tree, hf_pfcp_nokia_l2tp_remote_tunnel_id , tvb, 2, 2, ENC_BIG_ENDIAN, &remote_tunnel); + proto_tree_add_item_ret_uint(tree, hf_pfcp_nokia_l2tp_local_session_id , tvb, 4, 2, ENC_BIG_ENDIAN, &local_session); + proto_tree_add_item_ret_uint(tree, hf_pfcp_nokia_l2tp_remote_session_id, tvb, 6, 2, ENC_BIG_ENDIAN, &remote_session); + proto_tree_add_item_ret_uint(tree, hf_pfcp_nokia_l2tp_call_serial_num , tvb, 8, 4, ENC_BIG_ENDIAN, &call_serial_number); + + proto_item_append_text(proto_tree_get_parent(tree), " : LTID %u LSID %u RTID %u RSID %u CSN %u", local_tunnel, local_session, remote_tunnel, remote_session, call_serial_number); + + return 12; +} + +static int dissect_pfcp_nokia_snat_inside_ip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +{ + proto_tree_add_item(tree, hf_pfcp_nokia_snat_inside_ipv4_address, tvb, 0, 4, ENC_BIG_ENDIAN); + proto_item_append_text(proto_tree_get_parent(tree), " : %s", tvb_ip_to_str(pinfo->pool, tvb, 0)); + + return 4; +} + +static int dissect_pfcp_nokia_access_line_circuit_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + proto_tree_add_item(tree, hf_pfcp_nokia_access_line_circuit_id, tvb, 0, -1, ENC_NA); - dissect_pfcp_enterprise_ies_common(tvb, pinfo, tree, pfcp_sub_dis_info->message_type, pfcp_sub_dis_info->args, - NUM_PFCP_ENTERPRISE_TRAVELPING_IES, ett_pfcp_enterprise_travelping_elem, - pfcp_enterprise_travelping_ies, &pfcp_ie_enterprise_travelping_type_ext); return tvb_reported_length(tvb); } +static int dissect_pfcp_nokia_access_line_remote_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + proto_tree_add_item(tree, hf_pfcp_nokia_access_line_remote_id, tvb, 0, -1, ENC_NA); + + return tvb_reported_length(tvb); +} + +static int dissect_pfcp_nokia_access_line_params(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +{ + static int * const flags[] = { + &hf_pfcp_nokia_access_line_params_flags_b24_act_up, + &hf_pfcp_nokia_access_line_params_flags_b25_act_down, + &hf_pfcp_nokia_access_line_params_flags_b26_min_up, + &hf_pfcp_nokia_access_line_params_flags_b27_min_down, + &hf_pfcp_nokia_access_line_params_flags_b28_att_up, + &hf_pfcp_nokia_access_line_params_flags_b29_att_down, + &hf_pfcp_nokia_access_line_params_flags_b30_max_up, + &hf_pfcp_nokia_access_line_params_flags_b31_max_down, + &hf_pfcp_nokia_access_line_params_flags_b16_min_up_lp, + &hf_pfcp_nokia_access_line_params_flags_b17_min_down_lp, + &hf_pfcp_nokia_access_line_params_flags_b18_max_inter_delay_up, + &hf_pfcp_nokia_access_line_params_flags_b19_act_inter_delay_up, + &hf_pfcp_nokia_access_line_params_flags_b20_max_inter_delay_down, + &hf_pfcp_nokia_access_line_params_flags_b21_act_inter_delay_down, + &hf_pfcp_nokia_access_line_params_flags_b22_access_loop_encap, + &hf_pfcp_nokia_access_line_params_flags_b23_iw_session, + NULL + }; + static int * const fields[] = { + &hf_pfcp_nokia_access_line_params_act_up, + &hf_pfcp_nokia_access_line_params_act_down, + &hf_pfcp_nokia_access_line_params_min_up, + &hf_pfcp_nokia_access_line_params_min_down, + &hf_pfcp_nokia_access_line_params_att_up, + &hf_pfcp_nokia_access_line_params_att_down, + &hf_pfcp_nokia_access_line_params_max_up, + &hf_pfcp_nokia_access_line_params_max_down, + &hf_pfcp_nokia_access_line_params_min_up_lp, + &hf_pfcp_nokia_access_line_params_min_down_lp, + &hf_pfcp_nokia_access_line_params_max_inter_delay_up, + &hf_pfcp_nokia_access_line_params_act_inter_delay_up, + &hf_pfcp_nokia_access_line_params_max_inter_delay_down, + &hf_pfcp_nokia_access_line_params_act_inter_delay_down, + &hf_pfcp_nokia_access_line_params_access_loop_encap, + NULL + }; + + return dissect_pfcp_flags_and_fields(tvb, pinfo, tree, tvb_reported_length(tvb), flags, fields, hf_pfcp_nokia_access_line_params_flags, ett_pfcp_nokia_access_line_params_flags); +} + +static int dissect_pfcp_nokia_acct_session_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_acct_session_id); +} + +static int dissect_pfcp_nokia_fsg_template(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + return dissect_pfcp_string_ie(tvb, tree, hf_pfcp_nokia_fsg_template_name); +} + +static pfcp_generic_ie_t pfcp_nokia_ies[] = { + {VENDOR_NOKIA, 32774, "UP Aggregate Route", dissect_pfcp_grouped_ie_wrapper, -1}, + {VENDOR_NOKIA, 32775, "SAP Template", dissect_pfcp_nokia_sap_template, -1}, + {VENDOR_NOKIA, 32776, "Group Interface Template", dissect_pfcp_nokia_group_if_template, -1}, + {VENDOR_NOKIA, 32777, "State Id", dissect_pfcp_nokia_session_state_id, -1}, + {VENDOR_NOKIA, 32778, "Detailed Statistics", dissect_pfcp_nokia_detailed_statistics, -1}, + {VENDOR_NOKIA, 32779, "Detailed Error", dissect_pfcp_nokia_detailed_error, -1}, + {VENDOR_NOKIA, 32780, "Qos Override", dissect_pfcp_nokia_qos_override, -1}, + {VENDOR_NOKIA, 32781, "Measurement Information", dissect_pfcp_nokia_measurement_information, -1}, + {VENDOR_NOKIA, 32783, "PFCPSMReq-Flags", dissect_pfcp_nokia_pfpsmreq_flags, -1}, + {VENDOR_NOKIA, 32787, "UP Function Features", dissect_pfcp_nokia_up_function_features, -1}, + {VENDOR_NOKIA, 32788, "Create Filter Override", dissect_pfcp_nokia_filter_override, -1}, + {VENDOR_NOKIA, 32789, "Delete Filter Override", dissect_pfcp_nokia_filter_override, -1}, + {VENDOR_NOKIA, 32790, "Intermediate Destination", dissect_pfcp_nokia_intermediate_destination, -1}, + {VENDOR_NOKIA, 32791, "NAT ISA Members", dissect_pfcp_nokia_nat_isa_members, -1}, + {VENDOR_NOKIA, 32797, "PFCPHB-Flags", dissect_pfcp_nokia_pfcphb_flags, -1}, + {VENDOR_NOKIA, 32800, "L2TP First Rx LCP Conf Request", dissect_pfcp_nokia_l2tp_lcp_options, -1}, + {VENDOR_NOKIA, 32801, "L2TP Last Tx LCP Conf Request", dissect_pfcp_nokia_l2tp_lcp_options, -1}, + {VENDOR_NOKIA, 32802, "L2TP Last Rx LCP Conf Request", dissect_pfcp_nokia_l2tp_lcp_options, -1}, + {VENDOR_NOKIA, 32803, "L2TP Auth Type", dissect_pfcp_nokia_l2tp_auth_type, -1}, + {VENDOR_NOKIA, 32804, "L2TP Auth Name", dissect_pfcp_nokia_l2tp_auth_name, -1}, + {VENDOR_NOKIA, 32805, "L2TP Auth Id", dissect_pfcp_nokia_l2tp_auth_id, -1}, + {VENDOR_NOKIA, 32806, "L2TP Auth Challenge", dissect_pfcp_nokia_l2tp_auth_challenge, -1}, + {VENDOR_NOKIA, 32807, "L2TP Auth Response", dissect_pfcp_nokia_l2tp_auth_response, -1}, + {VENDOR_NOKIA, 32808, "L2TP Tunnel", dissect_pfcp_grouped_ie_wrapper, -1}, + {VENDOR_NOKIA, 32809, "L2TP Client Endpoint", dissect_pfcp_nokia_l2tp_endpoint, -1}, + {VENDOR_NOKIA, 32810, "L2TP Server Endpoint", dissect_pfcp_nokia_l2tp_endpoint, -1}, + {VENDOR_NOKIA, 32811, "L2TP Client Auth Id", dissect_pfcp_nokia_l2tp_client_auth_id, -1}, + {VENDOR_NOKIA, 32812, "L2TP Server Auth Id", dissect_pfcp_nokia_l2tp_server_auth_id, -1}, + {VENDOR_NOKIA, 32813, "L2TP Password", dissect_pfcp_nokia_l2tp_password, -1}, + {VENDOR_NOKIA, 32814, "L2TP Assignment Id", dissect_pfcp_nokia_l2tp_assignment_id, -1}, + {VENDOR_NOKIA, 32815, "L2TP Private Group Id", dissect_pfcp_nokia_l2tp_private_group_id, -1}, + {VENDOR_NOKIA, 32816, "L2TP Parameters", dissect_pfcp_nokia_l2tp_parameters, -1}, + {VENDOR_NOKIA, 32817, "L2TP Ids", dissect_pfcp_nokia_l2tp_ids, -1}, + {VENDOR_NOKIA, 32819, "SNAT Inside IP", dissect_pfcp_nokia_snat_inside_ip, -1}, + {VENDOR_NOKIA, 32820, "Access Line Circuit Id", dissect_pfcp_nokia_access_line_circuit_id, -1}, + {VENDOR_NOKIA, 32821, "Access Line Remote Id", dissect_pfcp_nokia_access_line_remote_id, -1}, + {VENDOR_NOKIA, 32822, "Access Line Params", dissect_pfcp_nokia_access_line_params, -1}, + {VENDOR_NOKIA, 32823, "Accounting Session Id", dissect_pfcp_nokia_acct_session_id, -1}, + {VENDOR_NOKIA, 32830, "FSG Template", dissect_pfcp_nokia_fsg_template, -1}, +}; + static void pfcp_init(void) { pfcp_session_count = 1; - pfcp_session_table = g_hash_table_new(g_int_hash, g_int_equal); - pfcp_frame_tree = wmem_tree_new(wmem_file_scope()); + pfcp_session_table = g_hash_table_new(g_direct_hash, g_direct_equal); + pfcp_frame_map = wmem_map_new(wmem_file_scope(), pfcp_info_hash, pfcp_info_equal); + } static void @@ -11045,7 +12241,7 @@ proto_register_pfcp(void) }, { &hf_pfcp_msg_length, { "Length", "pfcp.length", - FT_UINT8, BASE_DEC, NULL, 0x0, + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_pfcp_hdr_flags, @@ -11073,6 +12269,16 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } }, + { &hf_pfcp_spare_b0, + { "Spare", "pfcp.spare_b0", + FT_UINT8, BASE_DEC, NULL, 0x01, + NULL, HFILL } + }, + { &hf_pfcp_spare_b1, + { "Spare", "pfcp.spare_b1", + FT_UINT8, BASE_DEC, NULL, 0x02, + NULL, HFILL } + }, { &hf_pfcp_spare_b2, { "Spare", "pfcp.spare_b2", FT_UINT8, BASE_DEC, NULL, 0x04, @@ -11242,11 +12448,6 @@ proto_register_pfcp(void) FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_f_seid_flags, - { "Flags", "pfcp.f_seid_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_b0_v6, { "V6 (IPv6)", "pfcp.f_seid_flags.v6", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -11274,7 +12475,7 @@ proto_register_pfcp(void) }, { &hf_pfcp_precedence, { "Precedence", "pfcp.precedence", - FT_UINT16, BASE_DEC, NULL, 0x0, + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_pfcp_source_interface, @@ -11282,11 +12483,6 @@ proto_register_pfcp(void) FT_UINT8, BASE_DEC, VALS(pfcp_source_interface_vals), 0x0f, NULL, HFILL } }, - { &hf_pfcp_f_teid_flags, - { "Flags", "pfcp.f_teid_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_fteid_flg_spare, { "Spare", "pfcp.fteid_flg.spare", FT_UINT8, BASE_DEC, NULL, 0xf0, @@ -11367,11 +12563,6 @@ proto_register_pfcp(void) FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_ue_ip_address_flags, - { "Flags", "pfcp.ue_ip_address_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_ue_ip_address_flag_b0_v6, { "V6 (IPv6)", "pfcp.ue_ip_address_flag.v6", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -11417,16 +12608,11 @@ proto_register_pfcp(void) FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_ue_ip_add_ipv6_prefix, - { "IPv6 Prefix", "pfcp.ue_ip_addr_ipv6_prefix", + { &hf_pfcp_ue_ip_add_ipv6_prefix_delegation_bits, + { "IPv6 Prefix Delegation Bits", "pfcp.ue_ip_addr_ipv6_prefix", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_ue_ip_add_ipv6pd, - { "IPv6 Delegated Prefix Address", "pfcp.ue_ip_addr_ipv6pd", - FT_IPv6, BASE_NONE, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_ue_ip_add_ipv6_prefix_length, { "IPv6 Prefix Length", "pfcp.ue_ip_addr_ipv6_prefix_length", FT_UINT8, BASE_DEC, NULL, 0x0, @@ -11442,11 +12628,6 @@ proto_register_pfcp(void) FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_sdf_filter_flags, - { "Flags", "pfcp.sdf_filter_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_sdf_filter_flags_b0_fd, { "FD (Flow Description)", "pfcp.sdf_filter.fd", FT_BOOLEAN, 8, NULL, 0x01, @@ -11724,9 +12905,69 @@ proto_register_pfcp(void) FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_outer_hdr_desc, - { "Outer Header Creation Description", "pfcp.outer_hdr_desc", - FT_UINT16, BASE_DEC, VALS(pfcp_outer_hdr_desc_vals), 0x0, + { &hf_pfcp_redirect_port, + { "Redirect Port", "pfcp.redirect_port", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_outer_hdr_desc_o5_b0_gtp_udp_ipv4, + { "GTP-U/UDP/IPv4", "pfcp.pfcp_outer_hdr_desc.gtpu_udp_ipv4", + FT_BOOLEAN, 16, NULL, 0x0100, + NULL, HFILL } + }, + { &hf_pfcp_outer_hdr_desc_o5_b1_gtp_udp_ipv6, + { "GTP-U/UDP/IPv6", "pfcp.pfcp_outer_hdr_desc.gtpu_udp_ipv6", + FT_BOOLEAN, 16, NULL, 0x0200, + NULL, HFILL } + }, + { &hf_pfcp_outer_hdr_desc_o5_b2_udp_ipv4, + { "UDP/IPv4", "pfcp.pfcp_outer_hdr_desc.udp_ipv4", + FT_BOOLEAN, 16, NULL, 0x0400, + NULL, HFILL } + }, + { &hf_pfcp_outer_hdr_desc_o5_b3_udp_ipv6, + { "UDP/IPv6", "pfcp.pfcp_outer_hdr_desc.udp_ipv6", + FT_BOOLEAN, 16, NULL, 0x0800, + NULL, HFILL } + }, + { &hf_pfcp_outer_hdr_desc_o5_b4_ipv4, + { "IPv4", "pfcp.pfcp_outer_hdr_desc.ipv4", + FT_BOOLEAN, 16, NULL, 0x1000, + NULL, HFILL } + }, + { &hf_pfcp_outer_hdr_desc_o5_b5_ipv6, + { "IPv6", "pfcp.pfcp_outer_hdr_desc.ipv6", + FT_BOOLEAN, 16, NULL, 0x2000, + NULL, HFILL } + }, + { &hf_pfcp_outer_hdr_desc_o5_b6_ctag, + { "C-TAG", "pfcp.pfcp_outer_hdr_desc.ctag", + FT_BOOLEAN, 16, NULL, 0x4000, + NULL, HFILL } + }, + { &hf_pfcp_outer_hdr_desc_o5_b7_stag, + { "S-TAG", "pfcp.pfcp_outer_hdr_desc.stag", + FT_BOOLEAN, 16, NULL, 0x8000, + NULL, HFILL } + }, + { &hf_pfcp_outer_hdr_desc_o6_b0_n19, + { "N19 Indication", "pfcp.pfcp_outer_hdr_desc.n19", + FT_BOOLEAN, 16, NULL, 0x0001, + NULL, HFILL } + }, + { &hf_pfcp_outer_hdr_desc_o6_b1_n6, + { "N6 Indication", "pfcp.pfcp_outer_hdr_desc.n6", + FT_BOOLEAN, 16, NULL, 0x0002, + NULL, HFILL } + }, + { &hf_pfcp_outer_hdr_desc_o6_b2_ssm_cteid, + { "Low Layer SSM and C-TEID", "pfcp.pfcp_outer_hdr_desc.ssm_cteid", + FT_BOOLEAN, 16, NULL, 0x0004, + NULL, HFILL } + }, + { &hf_pfcp_outer_hdr_desc_o6_spare, + { "Spare", "pfcp.pfcp_outer_hdr_desc.spare", + FT_UINT16, BASE_DEC, NULL, 0x00f8, NULL, HFILL } }, { &hf_pfcp_outer_hdr_creation_teid, @@ -11764,11 +13005,6 @@ proto_register_pfcp(void) FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_measurement_method_flags, - { "Flags", "pfcp.measurement_method_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_measurement_method_flags_b0_durat, { "DURAT (Duration)", "pfcp.measurement_method_flags.durat", FT_BOOLEAN, 8, NULL, 0x01, @@ -11884,13 +13120,18 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } }, + { &hf_pfcp_reporting_triggers_o7_b1_upint, + { "UPINT (User Plane Inactivity Timer)", "pfcp.reporting_triggers_flags.upint", + FT_BOOLEAN, 8, NULL, 0x02, + NULL, HFILL } + }, { &hf_pfcp_usage_report_trigger_o7_b0_evequ, { "EVEQU (Event Quota)", "pfcp.usage_report_trigger_flags.evequ", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } }, { &hf_pfcp_usage_report_trigger_o7_b1_tebur, - { "TEMUR (Termination By UP function Report)", "pfcp.usage_report_trigger_flags.tebur", + { "TEBUR (Termination By UP function Report)", "pfcp.usage_report_trigger_flags.tebur", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL } }, @@ -11905,10 +13146,15 @@ proto_register_pfcp(void) NULL, HFILL } }, { &hf_pfcp_usage_report_trigger_o7_b4_emrre, - { "EMRRE (End Marker Recetion REport)", "pfcp.usage_report_trigger_flags.emrre", + { "EMRRE (End Marker Reception REport)", "pfcp.usage_report_trigger_flags.emrre", FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL } }, + { &hf_pfcp_usage_report_trigger_o7_b5_upint, + { "UPINT (User Plane Inactivity Timer)", "pfcp.usage_report_trigger_flags.upint", + FT_BOOLEAN, 8, NULL, 0x20, + NULL, HFILL } + }, { &hf_pfcp_usage_report_trigger_o6_b0_volqu, { "VOLQU (Volume Quota)", "pfcp.usage_report_trigger_flags.volqu", FT_BOOLEAN, 8, NULL, 0x01, @@ -11990,11 +13236,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_volume_threshold, - { "Flags", "pfcp.volume_threshold", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_volume_threshold_b0_tovol, { "TOVOL", "pfcp.volume_threshold_flags.tovol", FT_BOOLEAN, 8, NULL, 0x01, @@ -12025,11 +13266,6 @@ proto_register_pfcp(void) FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_volume_quota, - { "Flags", "pfcp.volume_quota", - 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, @@ -12060,11 +13296,6 @@ proto_register_pfcp(void) FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_subseq_volume_threshold, - { "Flags", "pfcp.subseq_volume_threshold", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_subseq_volume_threshold_b0_tovol, { "TOVOL", "pfcp.subseq_volume_threshold.tovol_flg", FT_BOOLEAN, 8, NULL, 0x01, @@ -12115,11 +13346,6 @@ proto_register_pfcp(void) FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_dropped_dl_traffic_threshold, - { "Flags", "pfcp.dropped_dl_traffic_threshold", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_dropped_dl_traffic_threshold_b0_dlpa, { "DLPA", "pfcp.dropped_dl_traffic_threshold.dlpa_flg", FT_BOOLEAN, 8, NULL, 0x01, @@ -12145,11 +13371,6 @@ proto_register_pfcp(void) FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_gate_status, - { "Flags", "pfcp.gate_status", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_gate_status_b0b1_dlgate, { "DL Gate", "pfcp.gate_status.dlgate", FT_UINT8, BASE_DEC, VALS(pfcp_gate_status_vals), 0x03, @@ -12180,11 +13401,6 @@ proto_register_pfcp(void) FT_UINT40, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_report_type, - { "Flags", "pfcp.report_type", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_report_type_b6_uisr, { "UISR (UP Initiated Session Request)", "pfcp.report_type.uisr", FT_BOOLEAN, 8, NULL, 0x40, @@ -12226,8 +13442,8 @@ proto_register_pfcp(void) NULL, HFILL } }, { &hf_pfcp_offending_ie_value, - { "Type of the offending IE", "pfcp.offending_ie", - FT_UINT32, BASE_DEC, NULL, 0x0, + { "Value of the offending IE", "pfcp.offending_ie_value", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, @@ -12381,10 +13597,10 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, "UPF supports UE IPv6 address(es) allocation with IPv6 prefix length other than default /64", HFILL } }, - { &hf_pfcp_up_function_features_o8_b6_tscu, - { "TSCU", "pfcp.up_function_features.tscu", + { &hf_pfcp_up_function_features_o8_b6_tsn, + { "TSN", "pfcp.up_function_features.tsn", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, - "Time Sensitive Communication is supported by the UPF", HFILL } + "Integration of 5GS into a TSN data network is supported by the UPF", HFILL } }, { &hf_pfcp_up_function_features_o8_b7_mptcp, { "MPTCP", "pfcp.up_function_features.mptcp", @@ -12399,7 +13615,7 @@ proto_register_pfcp(void) { &hf_pfcp_up_function_features_o9_b1_qfqm, { "QFQM", "pfcp.up_function_features.qfqm", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, - "UPF support of per QoS flow per UE QoS monitoring", HFILL } + "UPF support of per QoS flow per UE QoS monitoring for packet delay", HFILL } }, { &hf_pfcp_up_function_features_o9_b2_gpqm, { "GPQM", "pfcp.up_function_features.gpqm", @@ -12424,7 +13640,7 @@ proto_register_pfcp(void) { &hf_pfcp_up_function_features_o9_b6_ddds, { "DDDS", "pfcp.up_function_features.ddds", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, - "UPF support of reporting of the first buffred / discarded data for downlink", HFILL } + "UPF support of reporting of the first buffered / discarded data for downlink", HFILL } }, { &hf_pfcp_up_function_features_o9_b7_rds, { "RDS", "pfcp.up_function_features.rds", @@ -12436,13 +13652,13 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, "UPF support of RTT measurement towards the UE without PMF", HFILL } }, - { &hf_pfcp_up_function_features_o10_b1_quoaf, - { "QUOAF", "pfcp.up_function_features.quoaf", + { &hf_pfcp_up_function_features_o10_b1_quasf, + { "QUASF", "pfcp.up_function_features.quasf", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, - "UP function supports being provisioned with the Quota Action Application ID or a Quota Action SDF Filter to apply when reaching quotas", HFILL } + "The UP function supports being provisioned in a URR with an Exempted Application ID for Quota Action or an Exempted SDF Filter for Quota Action which is to be used when the quota is exhausted", HFILL } }, { &hf_pfcp_up_function_features_o10_b2_nspoc, - { "QUOAF", "pfcp.up_function_features.nspoc", + { "NSPOC", "pfcp.up_function_features.nspoc", FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, "UP function supports notifying start of Pause of Charging via user plane", HFILL } }, @@ -12476,6 +13692,96 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, "UP function supports Direct Reporting of QoS monitoring events to Local NEF or AF", HFILL } }, + { &hf_pfcp_up_function_features_o11_b1_mbsn4, + { "MBSN4", "pfcp.up_function_features.mbsn4", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, + "UPF supports sending MBS multicast session data to associated PDU sessions using 5GC individual delivery", HFILL } + }, + { &hf_pfcp_up_function_features_o11_b2_psuprm, + { "MBSN4", "pfcp.up_function_features.mbsn4", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, + "UP function supports Per Slice UP Resource Management", HFILL } + }, + { &hf_pfcp_up_function_features_o11_b3_eppi, + { "EPPI", "pfcp.up_function_features.eppi", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, + "UP function supports Enhanced Provisioning of Paging Policy Indicator", HFILL } + }, + { &hf_pfcp_up_function_features_o11_b4_ratp, + { "RATP", "pfcp.up_function_features.ratp", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, + "UP function supports Redirection Address Types set to Port, IPv4 address and Port, IPv6 address and Port, or IPv4 and IPv6 addresses and Port", HFILL } + }, + { &hf_pfcp_up_function_features_o11_b5_upidp, + { "UPIDP", "pfcp.up_function_features.upidp", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, + "UP function supports User Plane Inactivity Detection and reporting per PDR", HFILL } + }, + { &hf_pfcp_up_function_features_o11_b6_afsfc, + { "AFSFC", "pfcp.up_function_features.afsfc", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, + "UP function supports inserting metadata when Application Function influence on Service Function Chaining", HFILL } + }, + { &hf_pfcp_up_function_features_o11_b7_mpquic, + { "MPQUIC", "pfcp.up_function_features.mpquic", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80, + "UPF support of MPQUIC Proxy functionality", HFILL } + }, + { &hf_pfcp_up_function_features_o12_b0_redsm, + { "REDSM", "pfcp.up_function_features.redsm", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, + "UP function supports the Redundant Steering Mode", HFILL } + }, + { &hf_pfcp_up_function_features_o12_b1_dbdm, + { "DBDM", "pfcp.up_function_features.dbdm", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, + "The buffering parameters 'DL Buffering Duration' and 'DL Buffering Suggested Packet Count' in PFCP Session Modification Request are supported by the UP function", HFILL } + }, + { &hf_pfcp_up_function_features_o12_b2_tscts, + { "TSCTS", "pfcp.up_function_features.tscts", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, + "AF requested support of Time Synchronization and/or Time Sensitive Communication is supported by the UP function", HFILL } + }, + { &hf_pfcp_up_function_features_o12_b3_drtsc, + { "DRTSC", "pfcp.up_function_features.drtsc", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, + "UP function supports Direct Reporting of TSC management information events to TSN AF or TSCTSF", HFILL } + }, + { &hf_pfcp_up_function_features_o12_b4_n6jedb, + { "N6JEDB", "pfcp.up_function_features.n6jedb", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, + "UPF support of N6 Jitter, DL Periodicity and UL Periodicity Measurement and Reporting, and End of Data Burst marking", HFILL } + }, + { &hf_pfcp_up_function_features_o12_b5_qmcon, + { "QMCON", "pfcp.up_function_features.qmcon", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, + "UPF support of QoS monitoring of Congestion information", HFILL } + }, + { &hf_pfcp_up_function_features_o12_b6_detnet, + { "DETNET", "pfcp.up_function_features.detnet", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, + "Deterministic Networking is supported by the UP function", HFILL } + }, + { &hf_pfcp_up_function_features_o12_b7_eml4s, + { "EML4S", "pfcp.up_function_features.eml4s", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80, + "UP function supports ECN Marking for L4S", HFILL } + }, + { &hf_pfcp_up_function_features_o13_b0_pdusm, + { "PDUSM", "pfcp.up_function_features.pdusm", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, + "UP function supports PDU Set Marking", HFILL } + }, + { &hf_pfcp_up_function_features_o13_b1_cntl, + { "CN-TL", "pfcp.up_function_features.cntl", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, + "UPF support of the TSN Talker and Listener (TL) functionality", HFILL } + }, + { &hf_pfcp_up_function_features_o13_b2_qmdrm, + { "QMDRM", "pfcp.up_function_features.qmdrm", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, + "UPF support of QoS monitoring of Data Rate Measurement", HFILL } + }, { &hf_pfcp_sequence_number, { "Sequence Number", "pfcp.sequence_number", @@ -12497,11 +13803,6 @@ proto_register_pfcp(void) FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL } }, - { &hf_pfcp_volume_measurement, - { "Flags", "pfcp.volume_measurement", - 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, @@ -12607,11 +13908,12 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, "CP function supports PFCP session establishment or modification with Partial Success", HFILL } }, - { &hf_pfcp_usage_information, - { "Flags", "pfcp.usage_information", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } + { &hf_pfcp_cp_function_features_o6_b1_rpgur, + { "RPGUR", "pfcp.cp_function_features.rpgur", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, + "CP function supports the Peer GTP-U Entity Restart Reporting", HFILL } }, + { &hf_pfcp_usage_information_b0_bef, { "BEF (Before)", "pfcp.usage_information.bef", FT_BOOLEAN, 8, NULL, 0x01, @@ -12647,11 +13949,6 @@ proto_register_pfcp(void) FT_UINT8, BASE_DEC, VALS(pfcp_flow_dir_vals), 0x07, NULL, HFILL } }, - { &hf_pfcp_packet_rate, - { "Flags", "pfcp.packet_rate", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_packet_rate_b0_ulpr, { "ULPR (Uplink Packet Rate)", "pfcp.packet_rate.ulpr", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -12707,11 +14004,6 @@ proto_register_pfcp(void) FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_dl_flow_level_marking, - { "Flags", "pfcp.dl_flow_level_marking", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &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, @@ -12737,11 +14029,6 @@ proto_register_pfcp(void) FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_dl_data_service_inf_flags, - { "Flags", "pfcp.dl_data_service_inf_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &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, @@ -12757,11 +14044,6 @@ proto_register_pfcp(void) FT_UINT16, BASE_DEC, NULL, 0x7f, NULL, HFILL } }, - { &hf_pfcp_pfcpsmreq_flags, - { "Flags", "pfcp.smreq_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_pfcpsmreq_flags_b0_drobu, { "DROBU (Drop Buffered Packets)", "pfcp.smreq_flags.drobu", FT_BOOLEAN, 8, NULL, 0x01, @@ -12787,9 +14069,9 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL } }, - { &hf_pfcp_pfcpsrrsp_flags, - { "Flags", "pfcp.srrsp_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, + { &hf_pfcp_pfcpsmreq_flags_b5_deteid, + { "DETEID (Delete All DL N3mb and/or N19mb F-TEIDs)", "pfcp.smreq_flags.deteid", + FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL } }, { &hf_pfcp_pfcpsrrsp_flags_b0_drobu, @@ -12797,11 +14079,6 @@ proto_register_pfcp(void) 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_pfd_contents_flags_b0_fd, { "FD (Flow Description)", "pfcp.pfd_contents_flags.fd", FT_BOOLEAN, 8, NULL, 0x01, @@ -12878,7 +14155,7 @@ proto_register_pfcp(void) NULL, HFILL } }, { &hf_pfcp_dnp, - { "Domain Name Protocol", "pfcp.dn", + { "Domain Name Protocol", "pfcp.dnp", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, @@ -12923,11 +14200,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_measurement_info, - { "Flags", "pfcp.measurement_info", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_measurement_info_b0_mbqe, { "MBQE (Measurement Before QoS Enforcement)", "pfcp.measurement_info.fd", FT_BOOLEAN, 8, NULL, 0x01, @@ -12968,11 +14240,6 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL } }, - { &hf_pfcp_node_report_type, - { "Flags", "pfcp.node_report_type", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_node_report_type_b0_upfr, { "UPFR (User Plane Path Failure Report)", "pfcp.node_report_type.upfr", FT_BOOLEAN, 8, NULL, 0x01, @@ -12993,79 +14260,85 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL } }, - { &hf_pfcp_remote_gtp_u_peer_flags, - { "Flags", "pfcp.remote_gtp_u_peer_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, + { &hf_pfcp_node_report_type_b4_purr, + { "PURR (peer GTP-U entity Restart Report)", "pfcp.node_report_type.purr", + FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL } }, + { &hf_pfcp_node_report_type_b5_vsr, + { "VSR (Vendor-Specific Report)", "pfcp.node_report_type.pvsrurr", + FT_BOOLEAN, 8, NULL, 0x20, + NULL, HFILL } + }, + { &hf_pfcp_remote_gtp_u_peer_flags_b0_v6, - { "V6 (IPv6)", "pfcp.remote_gtp_u_peer_flags.v6", + { "V6 (IPv6)", "pfcp.remote_gtp_u_peer.flags.v6", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL } }, { &hf_pfcp_remote_gtp_u_peer_flags_b1_v4, - { "V4 (IPv4)", "pfcp.remote_gtp_u_peer_flags.v4", + { "V4 (IPv4)", "pfcp.remote_gtp_u_peer.flags.v4", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, NULL, HFILL } }, { &hf_pfcp_remote_gtp_u_peer_flags_b2_di, - { "DI (Destination Interface)", "pfcp.remote_gtp_u_peer_flags.di", + { "DI (Destination Interface)", "pfcp.remote_gtp_u_peer.flags.di", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, NULL, HFILL } }, { &hf_pfcp_remote_gtp_u_peer_flags_b3_ni, - { "NI (Network Instance)", "pfcp.remote_gtp_u_peer_flags.ni", + { "NI (Network Instance)", "pfcp.remote_gtp_u_peer.flags.ni", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08, NULL, HFILL } }, + { &hf_pfcp_remote_gtp_u_peer_flags_b4_rts, + { "RTS (Recovery Timestamp)", "pfcp.remote_gtp_u_peer.flags.rts", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10, + NULL, HFILL } + }, { &hf_pfcp_remote_gtp_u_peer_ipv4, - { "IPv4 address", "pfcp.node_id_ipv4", + { "IPv4 address", "pfcp.remote_gtp_u_peer.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_pfcp_remote_gtp_u_peer_ipv6, - { "IPv6 address", "pfcp.node_id_ipv6", + { "IPv6 address", "pfcp.remote_gtp_u_peer.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_pfcp_remote_gtp_u_peer_length_di, - { "Length of Destination Interface field", "pfcp.node_id_length_di", + { "Length of Destination Interface field", "pfcp.remote_gtp_u_peer.length_di", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, { &hf_pfcp_remote_gtp_u_peer_length_ni, - { "Length of Network Instance field", "pfcp.node_id_length_ni", + { "Length of Network Instance field", "pfcp.remote_gtp_u_peer.length_ni", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL } }, + { &hf_pfcp_remote_gtp_u_peer_time_stamp, + { "Time Stamp", "pfcp.remote_gtp_u_peer.time_stamp", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_NTP_UTC, NULL, 0, + NULL, HFILL } + }, { &hf_pfcp_ur_seqn, { "UR-SEQN", "pfcp.ur_seqn", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_oci_flags, - { "Flags", "pfcp.oci_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &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_pfcp_assoc_rel_req_flags, - { "Flags", "pfcp.assoc_rel_req", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &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 } }, - { &hf_pfcp_upiri_flags, - { "Flags", "pfcp.upiri_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, + { &hf_pfcp_pfcp_assoc_rel_req_b1_urss, + { "URSS (non-zero Usage Reports for the affected PFCP Sessions Sent)", "pfcp.assoc_rel_req.urss", + FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL } }, { &hf_pfcp_upiri_flg_b6_assosi, @@ -13119,11 +14392,6 @@ proto_register_pfcp(void) 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, @@ -13167,7 +14435,7 @@ proto_register_pfcp(void) }, { &hf_pfcp_qfi, { "QFI", "pfcp.qfi_value", - FT_UINT8, BASE_HEX, NULL, 0x7f, + FT_UINT8, BASE_HEX, NULL, 0x3f, NULL, HFILL } }, { &hf_pfcp_query_urr_reference, @@ -13176,11 +14444,6 @@ proto_register_pfcp(void) 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, @@ -13197,11 +14460,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_mac_address_flags, - { "Flags", "pfcp.mac_address.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_mac_address_flags_b0_sour, { "SOUR", "pfcp.mac_address.flags.sour", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -13243,11 +14501,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_c_tag_flags, - { "Flags", "pfcp.c_tag.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_c_tag_flags_b0_pcp, { "PCP", "pfcp.c_tag.flags.pcp", FT_BOOLEAN, 8, NULL, 0x01, @@ -13279,11 +14532,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_s_tag_flags, - { "Flags", "pfcp.s_tag.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_s_tag_flags_b0_pcp, { "PCP", "pfcp.s_tag.flags.pcp", FT_BOOLEAN, 8, NULL, 0x01, @@ -13321,11 +14569,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_proxying_flags, - { "Flags", "pfcp.proxying.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_proxying_flags_b0_arp, { "ARP", "pfcp.proxying.flags.arp", FT_BOOLEAN, 8, NULL, 0x01, @@ -13343,11 +14586,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_ethertype_filter_properties_flags, - { "Flags", "pfcp.ethertype_filter_properties.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_ethertype_filter_properties_flags_b0_bide, { "BIDE", "pfcp.ethertype_filter_properties.flags.bide", FT_BOOLEAN, 8, NULL, 0x01, @@ -13360,11 +14598,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_user_id_flags, - { "Flags", "pfcp.user_id.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_user_id_flags_b0_imsif, { "IMSIF", "pfcp.user_id.flags.imsif", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -13462,12 +14695,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - - { &hf_pfcp_ethernet_pdu_session_information_flags, - { "Flags", "pfcp.ethernet_pdu_session_information.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_ethernet_pdu_session_information_flags_b0_ethi, { "IMSIF", "pfcp.ethernet_pdu_session_information.flags.ethi", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -13636,22 +14863,12 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_pfcpsrreq_flags, - { "Flags", "pfcp.srreq_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_pfcpsrreq_flags_b0_psdbu, { "PSDBU (PFCP Session Deleted By the UP function)", "pfcp.srreq_flags.psdbu", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } }, - { &hf_pfcp_pfcpaureq_flags, - { "Flags", "pfcp.aureq_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_pfcpaureq_flags_b0_parps, { "PARPBS (PFCP Association Release Preparation Start)", "pfcp.aureq_flags.parps", FT_BOOLEAN, 8, NULL, 0x01, @@ -13708,10 +14925,9 @@ proto_register_pfcp(void) NULL, HFILL } }, - - { &hf_pfcp_pfcp_alternative_smf_ip_address_flags, - { "Flags", "pfcp.alternative_smf_ip_address", - FT_UINT8, BASE_HEX, NULL, 0x0, + { &hf_pfcp_alternative_smf_ip_address_flags_ppe, + { "PPE (Preferred PFCP Entity)", "pfcp.alternative_smf_ip_address_flags.ppe", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, NULL, HFILL } }, { &hf_pfcp_alternative_smf_ip_address_ipv4, @@ -13725,11 +14941,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_packet_replication_and_detection_carry_on_information_flags, - { "Flags", "pfcp.hf_pfcp_packet_replication_and_detection_carry_on_information.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b0_priueai, { "PRIUEAI (Packet Replication Information – UE/PDU Session Address Indication)", "pfcp.packet_replication_and_detection_carry_on_information.flags.priueai", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -13756,6 +14967,11 @@ proto_register_pfcp(void) FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_seconds, 0x0, NULL, HFILL } }, + { &hf_pfcp_validity_time_str, + { "Validity Time", "pfcp.validity_time", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, + NULL, HFILL } + }, { &hf_pfcp_number_of_reports, { "Number of Reports", "pfcp.number_of_reports", @@ -13763,11 +14979,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_pfcpasrsp_flags_flags, - { "Flags", "pfcp.pfcpasrsp_flags.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_pfcpasrsp_flags_flags_b0_psrei, { "PSREI (PFCP Session Retained Indication)", "pfcp.asrsp_flags.flags.psrei", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -13779,11 +14990,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_cp_pfcp_entity_ip_address_flags, - { "Flags", "pfcp.cp_pfcp_entity_ip_address", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_cp_pfcp_entity_ip_address_ipv4, { "IPv4 address", "pfcp.cp_pfcp_entity_ip_address.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, @@ -13795,11 +15001,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_pfcpsereq_flags_flags, - { "Flags", "pfcp.pfcpsereq_flags.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_pfcpsereq_flags_flags_b0_resti, { "RESTI (Restoration Indication)", "pfcp.sereq_flags.flags.resti", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -13811,11 +15012,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_ip_multicast_address_flags, - { "Flags", "pfcp.ip_multicast_address.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_ip_multicast_address_flags_b2_range, { "RANGE", "pfcp.ip_multicast_address.flags.range", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, @@ -13847,11 +15043,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_source_ip_address_flags, - { "Flags", "pfcp.source_ip_address.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_source_ip_address_flags_b2_mpl, { "MPL (Mask/Prefix Length)", "pfcp.source_ip_address.flags.mpl", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, @@ -13873,11 +15064,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_packet_rate_status_flags, - { "Flags", "pfcp.packet_rate_status.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_packet_rate_status_flags_b0_ul, { "UL", "pfcp.packet_rate_status.flags.ul", FT_BOOLEAN, 8, NULL, 0x01, @@ -13914,47 +15100,42 @@ proto_register_pfcp(void) NULL, HFILL } }, { &hf_pfcp_packet_rate_status_validity_time, - { "Validity Time value", "pfcp.packet_rate_status.validity_time", - FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_seconds, 0x0, + { "Rate Status Validity Time value", "pfcp.packet_rate_status.validity_time", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_create_bridge_info_for_tsc_flags, - { "Flags", "pfcp.create_bridge_info_for_tsc.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, + { &hf_pfcp_create_bridge_router_info_flags_b0_bii, + { "BII (Bridge Information Indication)", "pfcp.create_bridge_router_info.flags.bii", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL } }, - { &hf_pfcp_create_bridge_info_for_tsc_flags_b0_bii, - { "BII (Bridge Information Indication)", "pfcp.create_bridge_info_for_tsc.flags.bii", - FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, + { &hf_pfcp_create_bridge_router_info_flags_b1_rii, + { "RII (Router Information Indication)", "pfcp.create_bridge_router_info.flags.rii", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, NULL, HFILL } }, - { &hf_pfcp_ds_tt_port_number, - { "DS-TT Port Number value", "pfcp.ds_tt_port_number", + { &hf_pfcp_port_number, + { "Port Number value", "pfcp.port_number.value", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_pfcp_nw_tt_port_number, - { "NW-TT Port Number value", "pfcp.nw_tt_port_number", + { "NW-TT Port Number value", "pfcp.nw_tt_port_number.value", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_5gs_user_plane_node_flags, - { "Flags", "pfcp.5gs_user_plane_node.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_pfcp_5gs_user_plane_node_flags_b0_bid, - { "BID", "pfcp.5gs_user_plane_node.flags.sour", + { &hf_pfcp_5gs_user_plane_node_id_flags_b0_bid, + { "BID", "pfcp.5gs_user_plane_node_id.flags.sour", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL } }, - { &hf_pfcp_5gs_user_plane_node_value, - { "Use Plane Node value", "pfcp.5gs_user_plane_node.value", - FT_BYTES, BASE_NONE, NULL, 0x0, + { &hf_pfcp_5gs_user_plane_node_id_value, + { "Use Plane Node value", "pfcp.5gs_user_plane_node_id.value", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } }, @@ -13964,11 +15145,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_requested_clock_drift_control_information_flags, - { "Flags", "pfcp.requested_clock_drift_control_information.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_requested_clock_drift_control_information_flags_b0_rrto, { "RRTO (Request to Report Time Offset)", "pfcp.requested_clock_drift_control_information.flags.rrto", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14017,11 +15193,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_requested_access_availability_control_information_flags, - { "Flags", "pfcp.requested_access_availability_control_information.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_requested_access_availability_control_information_flags_b0_rrca, { "RRCA (Request to Report Change in Access availability)", "pfcp.requested_access_availability_control_information.flags.rrca", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14039,33 +15210,18 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_mptcp_control_information_flags, - { "Flags", "pfcp.mptcp_control_information.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_mptcp_control_information_flags_b0_tci, { "TCI (Transport Converter Indication)", "pfcp.mptcp_control_information.flags.tci", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL } }, - { &hf_pfcp_atsss_ll_control_information_flags, - { "Flags", "pfcp.atsss_ll_control_information.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_atsss_ll_control_information_flags_b0_lli, { "LLI: ATSSS-LL steering functionality is required", "pfcp.atsss_ll_control_information.flags.lli", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL } }, - { &hf_pfcp_pmf_control_information_flags, - { "Flags", "pfcp.atsss_ll_control_information.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_pmf_control_information_flags_b0_pmfi, { "PMFI (PMF functionality is required)", "pfcp.pmf_control_information.flags.pmfi", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14087,11 +15243,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_mptcp_address_information_flags, - { "Flags", "pfcp.mptcp_ip_address_information.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_mptcp_address_information_flags_b0_v4, { "V4", "pfcp.mptcp_ip_address_information.flags.v4", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14123,57 +15274,47 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_ue_link_specific_ip_address_flags, - { "Flags", "pfcp.ue_link_specific_ip_address.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_pfcp_ue_link_specific_ip_address_flags_b0_v4, - { "V4", "pfcp.ue_link_specific_ip_address.flags.v4", + { &hf_pfcp_link_specific_multipath_ip_address_flags_b0_v4, + { "V4", "pfcp.link_specific_multipath_ip_address.flags.v4", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL } }, - { &hf_pfcp_ue_link_specific_ip_address_flags_b1_v6, - { "V6", "pfcp.ue_link_specific_ip_address.flags.v6", + { &hf_pfcp_link_specific_multipath_ip_address_flags_b1_v6, + { "V6", "pfcp.link_specific_multipath_ip_address.flags.v6", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, NULL, HFILL } }, - { &hf_pfcp_ue_link_specific_ip_address_flags_b2_nv4, - { "NV4", "pfcp.ue_link_specific_ip_address.flags.nv4", + { &hf_pfcp_link_specific_multipath_ip_address_flags_b2_nv4, + { "NV4", "pfcp.link_specific_multipath_ip_address.flags.nv4", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, NULL, HFILL } }, - { &hf_pfcp_ue_link_specific_ip_address_flags_b3_nv6, - { "NV6", "pfcp.ue_link_specific_ip_address.flags.nv6", + { &hf_pfcp_link_specific_multipath_ip_address_flags_b3_nv6, + { "NV6", "pfcp.link_specific_multipath_ip_address.flags.nv6", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08, NULL, HFILL } }, - { &hf_pfcp_ue_link_specific_ip_address_3gpp_ipv4, - { "UE Link-Specific IPv4 Address for 3GPP Access", "pfcp.ue_link_specific_ip_address.3gpp.ipv4", + { &hf_pfcp_link_specific_multipath_ip_address_3gpp_ipv4, + { "Link-Specific IPv4 Address for 3GPP Access", "pfcp.link_specific_multipath_ip_address.3gpp.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_ue_link_specific_ip_address_3gpp_ipv6, - { "UE Link-Specific IPv6 Address for 3GPP Access", "pfcp.ue_link_specific_ip_address.3gpp.ipv6", + { &hf_pfcp_link_specific_multipath_ip_address_3gpp_ipv6, + { "Link-Specific IPv6 Address for 3GPP Access", "pfcp.link_specific_multipath_ip_address.3gpp.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_ue_link_specific_ip_address_non3gpp_ipv4, - { "UE Link-Specific IPv4 Address for Non-3GPP Access", "pfcp.ue_link_specific_ip_address.non3gpp.ipv4", + { &hf_pfcp_link_specific_multipath_ip_address_non3gpp_ipv4, + { "Link-Specific IPv4 Address for Non-3GPP Access", "pfcp.link_specific_multipath_ip_address.non3gpp.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_ue_link_specific_ip_address_non3gpp_ipv6, - { "UE Link-Specific IPv6 Address for Non-3GPP Access", "pfcp.ue_link_specific_ip_address.non3gpp.ipv6", + { &hf_pfcp_link_specific_multipath_ip_address_non3gpp_ipv6, + { "Link-Specific IPv6 Address for Non-3GPP Access", "pfcp.link_specific_multipath_ip_address.non3gpp.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_pmf_address_information_flags, - { "Flags", "pfcp.pmf_address_information.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_pmf_address_information_flags_b0_v4, { "V4", "pfcp.pmf_address_information.flags.v4", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14220,11 +15361,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_atsss_ll_information_flags, - { "Flags", "pfcp.atsss_ll_information.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_atsss_ll_information_flags_b0_lli, { "LLI: ATSSS-LL steering functionality have been allocated", "pfcp.atsss_ll_information.flags.lli", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14243,11 +15379,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_qos_report_trigger_flags, - { "Flags", "pfcp.qos_report_trigger.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_qos_report_trigger_flags_b0_per, { "PER (Periodic Reporting)", "pfcp.qos_report_trigger.flags.v4", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14264,12 +15395,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - - { &hf_pfcp_gtp_u_path_interface_type_flags, - { "Flags", "pfcp.gtp_u_path_interface_type.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_gtp_u_path_interface_type_flags_b0_n9, { "N9", "pfcp.qos_report_trigtp_u_path_interface_typegger.flags.n9", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14281,23 +15406,18 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_requested_qos_monitoring_flags, - { "Flags", "pfcp.requested_qos_monitoring.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_pfcp_requested_qos_monitoring_flags_b0_dl, - { "DL (Downlink)", "pfcp.requested_qos_monitoring.flags.dl", + { &hf_pfcp_requested_qos_monitoring_flags_b0_dlpd, + { "DLPD (Downlink Packet Delay)", "pfcp.requested_qos_monitoring.flags.dlpd", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL } }, - { &hf_pfcp_requested_qos_monitoring_flags_b1_ul, - { "UL (Uplink)", "pfcp.requested_qos_monitoring.flags.ul", + { &hf_pfcp_requested_qos_monitoring_flags_b1_ulpd, + { "ULPD (Uplink Packet Delay)", "pfcp.requested_qos_monitoring.flags.ulpd", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, NULL, HFILL } }, - { &hf_pfcp_requested_qos_monitoring_flags_b2_rp, - { "RP (Round Trip)", "pfcp.requested_qos_monitoring.flags.rp", + { &hf_pfcp_requested_qos_monitoring_flags_b2_rppd, + { "RPPD (Round Trip Packet Delay)", "pfcp.requested_qos_monitoring.flags.rppd", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, NULL, HFILL } }, @@ -14306,12 +15426,27 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08, NULL, HFILL } }, - - { &hf_pfcp_reporting_frequency_flags, - { "Flags", "pfcp.reporting_frequency.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, + { &hf_pfcp_requested_qos_monitoring_flags_b4_dlci, + { "DLCI (Downlink Congestion Information)", "pfcp.requested_qos_monitoring.flags.dlci", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10, + NULL, HFILL } + }, + { &hf_pfcp_requested_qos_monitoring_flags_b5_ulci, + { "ULCI (Uplink Congestion Information)", "pfcp.requested_qos_monitoring.flags.ulci", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20, NULL, HFILL } }, + { &hf_pfcp_requested_qos_monitoring_flags_b6_dlpr, + { "DLPR (Downlink Packet Rate)", "pfcp.requested_qos_monitoring.flags.dlpr", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x40, + NULL, HFILL } + }, + { &hf_pfcp_requested_qos_monitoring_flags_b7_ulpr, + { "ULPR (Uplink Packet Rate)", "pfcp.requested_qos_monitoring.flags.ulpr", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x80, + NULL, HFILL } + }, + { &hf_pfcp_reporting_frequency_flags_b0_evett, { "EVETT (Event Triggered QoS monitoring reporting)", "pfcp.reporting_frequency.flags.evett", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14323,16 +15458,11 @@ proto_register_pfcp(void) NULL, HFILL } }, { &hf_pfcp_reporting_frequency_flags_b2_sesrl, - { "SESRL (Session Released QoS monitoring reporting)", "pfcp.reporting_frequency.flags.sesrl", + { "SESRL (Session Released QoS monitoring reporting) (Deprecated in R18.1)", "pfcp.reporting_frequency.flags.sesrl", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, NULL, HFILL } }, - { &hf_pfcp_packet_delay_thresholds_flags, - { "Flags", "pfcp.packet_delay_thresholds.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_packet_delay_thresholds_flags_b0_dl, { "DL (Downlink)", "pfcp.packet_delay_thresholds.flags.dl", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14370,24 +15500,18 @@ proto_register_pfcp(void) NULL, HFILL } }, - - { &hf_pfcp_qos_monitoring_measurement_flags, - { "Flags", "pfcp.qos_monitoring_measurement.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_pfcp_qos_monitoring_measurement_flags_b0_dl, - { "DL (Downlink)", "pfcp.qos_monitoring_measurement.flags.dl", + { &hf_pfcp_qos_monitoring_measurement_flags_b0_dlpd, + { "DLPD (Downlink Packet Delay)", "pfcp.qos_monitoring_measurement.flags.dlpd", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL } }, - { &hf_pfcp_qos_monitoring_measurement_flags_b1_ul, - { "UL (Uplink)", "pfcp.qos_monitoring_measurement.flags.ul", + { &hf_pfcp_qos_monitoring_measurement_flags_b1_ulpd, + { "ULPD (Uplink Packet Delay)", "pfcp.qos_monitoring_measurement.flags.ulpd", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, NULL, HFILL } }, - { &hf_pfcp_qos_monitoring_measurement_flags_b2_rp, - { "RP (Round Trip)", "pfcp.qos_monitoring_measurement.flags.rp", + { &hf_pfcp_qos_monitoring_measurement_flags_b2_rppd, + { "RPPD (Round Trip Packet Delay)", "pfcp.qos_monitoring_measurement.flags.rppd", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, NULL, HFILL } }, @@ -14396,13 +15520,24 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08, NULL, HFILL } }, - { &hf_pfcp_qos_monitoring_measurement_downlink, - { "Downlink packet delay (milliseconds)", "pfcp.qos_monitoring_measurement.downlink", + { &hf_pfcp_qos_monitoring_measurement_flags_b4_dlci, + { "DLCI (Downlink Congestion Info)", "pfcp.qos_monitoring_measurement.flags.dlci", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10, + NULL, HFILL } + }, + { &hf_pfcp_qos_monitoring_measurement_flags_b5_ulci, + { "ULCI (Uplink Congestion Info)", "pfcp.qos_monitoring_measurement.flags.ulci", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20, + NULL, HFILL } + }, + + { &hf_pfcp_qos_monitoring_measurement_downlink_packet_delay, + { "Downlink packet delay (milliseconds)", "pfcp.qos_monitoring_measurement.downlink_packet_delay", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_qos_monitoring_measurement_uplink, - { "Downlink packet delay (milliseconds)", "pfcp.qos_monitoring_measurement.uplink", + { &hf_pfcp_qos_monitoring_measurement_uplink_packet_delay, + { "Downlink packet delay (milliseconds)", "pfcp.qos_monitoring_measurement.uplink_packet_delay", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, @@ -14411,12 +15546,27 @@ proto_register_pfcp(void) FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - - { &hf_pfcp_mt_edt_control_information_flags, - { "Flags", "pfcp.reporting_frequency.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, + { &hf_pfcp_qos_monitoring_measurement_downlink_congestion_information, + { "Downlink Congestion information", "pfcp.qos_monitoring_measurement.downlink_congestion_information", + FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } }, + { &hf_pfcp_qos_monitoring_measurement_uplink_congestion_information, + { "Uplink Congestion information", "pfcp.qos_monitoring_measurement.uplink_congestion_information", + FT_UINT8, BASE_DEC_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_qos_monitoring_measurement_downlink_packet_rate, + { "Average Downlink packet rate (kilobits per second)", "pfcp.qos_monitoring_measurement.downlink_packet_rate", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_qos_monitoring_measurement_uplink_packet_rate, + { "Average Uplink packet rate (kilobits per second)", "pfcp.qos_monitoring_measurement.uplink_packet_rate", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_mt_edt_control_information_flags_b0_rdsi, { "RDSI (Reporting DL data packets Size Indication)", "pfcp.mt_edt_control_information.flags.rdsi", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14452,11 +15602,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_ip_version_flags, - { "Flags", "pfcp.ip_version.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_ip_version_flags_b1_v6, { "V6 (IPv6)", "pfcp.ip_version.v6", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, @@ -14468,22 +15613,12 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_pfcpasreq_flags_flags, - { "Flags", "pfcp.pfcpasreq_flags.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_pfcpasreq_flags_flags_b0_uupsi, { "UUPSI (UPF configured for IPUPS indication)", "pfcp.asreq_flags.flags.uupsi", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL } }, - { &hf_pfcp_data_status_flags, - { "Flags", "pfcp.data_status.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_data_status_flags_b0_drop, { "DROP (First DL packet is discared by UP function)", "pfcp.data_status.flags.drop", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14495,40 +15630,29 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_rds_configuration_information_flags, - { "Flags", "pfcp.rds_configuration_information.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_rds_configuration_information_flags_b0_rds, { "RDS (Reliable Data Service)", "pfcp.rds_configuration_information.flags.rds", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL } }, - { &hf_pfcp_mptcp_application_indication_flags, - { "Flags", "pfcp.mptcp_application_indication.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, + { &hf_pfcp_multipath_application_indication_flags_b0_mtai, + { "MTAI (MPTCP Applicable Indication)", "pfcp.multipath_application_indication.flags.mtai", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL } }, - { &hf_pfcp_mptcp_application_indication_flags_b0_mai, - { "MAI (MPTCP Applicable Indication)", "pfcp.mptcp_application_indication.flags.mai", - FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, + { &hf_pfcp_multipath_application_indication_flags_b1_mqai, + { "MQAI (MPQUIC Applicable Indication)", "pfcp.multipath_application_indication.flags.mqai", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, NULL, HFILL } }, - { &hf_pfcp_user_plane_nodemanagement_information_container, - { "Predefined Rules Name", "pfcp.user_plane_nodemanagement_information_container", + { &hf_pfcp_user_plane_node_management_information_container, + { "Predefined Rules Name", "pfcp.user_plane_node_management_information_container", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - - { &hf_pfcp_number_of_ue_ip_addresses_flags, - { "Flags", "pfcp.number_of_ue_ip_addresses.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_number_of_ue_ip_addresses_b0_ipv4, { "IPv4", "pfcp.number_of_ue_ip_addresses.v4", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14567,11 +15691,6 @@ proto_register_pfcp(void) FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_pfcp_l2tp_user_authentication_flags, - { "Flags", "pfcp.l2tp_user_authentication.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_l2tp_user_authentication_b0_pan, { "PAN (Proxy Authen Name)", "pfcp.l2tp_user_authentication.flags.pan", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14678,11 +15797,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_thresholds_flags, - { "Flags", "pfcp.thresholds.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_thresholds_flags_b0_rtt, { "RTT", "pfcp.thresholds.flags.rtt", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14721,11 +15835,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_cp_ip_address_flags, - { "Flags", "pfcp.cp_ip_address.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_cp_ip_address_ipv4, { "IPv4 address", "pfcp.cp_ip_address.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, @@ -14737,11 +15846,6 @@ proto_register_pfcp(void) NULL, HFILL } }, - { &hf_pfcp_ip_address_and_port_number_replacement_flags, - { "Flags", "pfcp.ip_address_and_port_number_replacement.flag", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_ip_address_and_port_number_replacement_flag_b0_v4, { "DIPV4", "pfcp.ip_address_and_port_number_replacement.flag.dipv4", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, @@ -14828,40 +15932,60 @@ proto_register_pfcp(void) }, { &hf_pfcp_reporting_flags_o5_b0_dupl, - { "DUPL (Duplocation Notication)", "pfcp.reporting_flags.dupl", + { "DUPL (Duplication Notification)", "pfcp.reporting_flags.dupl", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } }, - - { &hf_pfcp_mbs_session_identifier_flags, - { "Flags", "pfcp.cp_ip_address.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, { &hf_pfcp_mbs_session_identifier_flag_b0_tmgi, { "TGMI", "pfcp.session_identifier.flag.tmgi", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } - },{ &hf_pfcp_mbs_session_identifier_flag_b1_ssmi, + }, + { &hf_pfcp_mbs_session_identifier_flag_b1_ssmi, { "SSMI", "pfcp.session_identifier.flag.ssmi", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL } }, + { &hf_pfcp_mbs_session_identifier_flag_b2_nidi, + { "NIDI", "pfcp.session_identifier.flag.nidi", + FT_BOOLEAN, 8, NULL, 0x04, + NULL, HFILL } + }, { &hf_pfcp_mbs_session_identifier_tmgi, {"TMGI", "pfcp.mbs_session_identifier.tmgi", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} }, - { &hf_pfcp_mbs_session_identifier_ssmi, - {"SSMI", "pfcp.mbs_session_identifier.ssmi", + { &hf_pfcp_mbs_session_identifier_source_address_type, + { "Source Address Type", "pfcp.mbs_session_identifier.source_address.type", + FT_UINT8, BASE_DEC, NULL, 0xC0, + NULL, HFILL } + }, + { &hf_pfcp_mbs_session_identifier_source_address_length, + { "Source Address Length", "pfcp.mbs_session_identifier.source_address.length", + FT_UINT8, BASE_DEC, NULL, 0x3F, + NULL, HFILL } + }, + { &hf_pfcp_mbs_session_identifier_source_address_ipv4, + { "Source IPv4 address", "pfcp.mbs_session_identifier.source_address.ipv4", + FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_mbs_session_identifier_source_address_ipv6, + { "Source IPv6 address", "pfcp.mbs_session_identifier.source_address.ipv6", + FT_IPv6, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_mbs_session_identifier_nidi, + {"NIDI", "pfcp.mbs_session_identifier.nidi", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} }, { &hf_pfcp_multicast_transport_information_endpoint_identifier, { "Common Tunnel Endpoint Identifier", "pfcp.multicast_transport_information.endpoint_identifier", - FT_UINT8, BASE_DEC, NULL, 0x0, + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_pfcp_multicast_transport_information_distribution_address_type, @@ -14870,7 +15994,7 @@ proto_register_pfcp(void) NULL, HFILL } }, { &hf_pfcp_multicast_transport_information_distribution_address_length, - { "Distribution Type", "pfcp.multicast_transport_information.distribution_address.length", + { "Distribution Address Length", "pfcp.multicast_transport_information.distribution_address.length", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL } }, @@ -14885,22 +16009,22 @@ proto_register_pfcp(void) NULL, HFILL } }, { &hf_pfcp_multicast_transport_information_source_address_type, - { "Source Address Type", "pfcp.multicast_transport_information.distribution_address.type", + { "Source Address Type", "pfcp.multicast_transport_information.source_address.type", FT_UINT8, BASE_DEC, NULL, 0xC0, NULL, HFILL } }, { &hf_pfcp_multicast_transport_information_source_address_length, - { "Source Address Type", "pfcp.multicast_transport_information.distribution_address.length", + { "Source Address Length", "pfcp.multicast_transport_information.source_address.length", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL } }, { &hf_pfcp_multicast_transport_information_source_address_ipv4, - { "Source IPv4 address", "pfcp.multicast_transport_information.distribution_address.ipv4", + { "Source IPv4 address", "pfcp.multicast_transport_information.source_address.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_pfcp_multicast_transport_information_source_address_ipv6, - { "Source IPv6 address", "pfcp.multicast_transport_information.distribution_address.ipv6", + { "Source IPv6 address", "pfcp.multicast_transport_information.source_address.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, @@ -14915,13 +16039,12 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL } }, - - - { &hf_pfcp_local_ingress_tunnel_flags, - { "Flags", "pfcp.local_ingress_tunnel.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, + { &hf_pfcp_mbsn4mbreq_flags_o5_b2_mbs_resti, + { "MBS RESTI (MBS Restoration Indication)", "pfcp.reporting_flags.mbs_resti", + FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL } }, + { &hf_pfcp_local_ingress_tunnel_flags_b2_ch, { "CH (CHOOSE)", "pfcp.local_ingress_tunnel.flags.ch", FT_BOOLEAN, 8, NULL, 0x04, @@ -14959,6 +16082,267 @@ proto_register_pfcp(void) NULL, HFILL } }, + { &hf_pfcp_mbsn4resp_flags_o5_b0_nn19dt, + { "NN19DT", "pfcp.mbsn4resp_flags.nn19dt", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, + "New N19mb Downlink Tunnel", HFILL } + }, + { &hf_pfcp_mbsn4resp_flags_o5_b1_jmti, + { "JMTI", "pfcp.mbsn4resp_flags.jmti", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, + "Joined N19mb Multicast Tree Indication", HFILL } + }, + { &hf_pfcp_mbsn4resp_flags_o5_b2_n19dtr, + { "N19DTR", "pfcp.mbsn4resp_flags.n19dtr", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, + "N19mb Downlink Tunnel Removal", HFILL } + }, + + { &hf_pfcp_tunnel_password_value, + { "Tunnel Password value", "pfcp.tunnel_password_value", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_area_session_id_value, + { "Area Session ID value", "pfcp.area_session_id_value", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_dscp_to_ppi_mapping_info_ppi_value, + { "PPI value", "pfcp.dscp_to_ppi_mapping_info_ppi_value", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_dscp_to_ppi_mapping_info_dscp_value, + { "DSCP value", "pfcp.dscp_to_ppi_mapping_info_dscp_value", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_pfcpsdrsp_flags_b0_puru, + { "PURU (Pending Usage Reports Unacknowledged)", "pfcp.pfcpsdrsp_flags.puru", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + + { &hf_pfcp_qer_indications_flags_b0_iqfis, + { "IQFIS (Insert DL MBS QFI SN)", "pfcp.qer_indications_flags.iqfis", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + { &hf_pfcp_qer_indications_flags_b1_edbmi, + { "EDBMI (End Of Data Burst Marking Indication)", "pfcp.qer_indications_flags.edbmi", + FT_BOOLEAN, 8, NULL, 0x02, + NULL, HFILL } + }, + { &hf_pfcp_qer_indications_flags_b2_eml4s, + { "EML4S (ECN Marking for L4S)", "pfcp.qer_indications_flags.eml4s", + FT_BOOLEAN, 8, NULL, 0x04, + NULL, HFILL } + }, + { &hf_pfcp_qer_indications_flags_b3_pdusm, + { "PDUSM (PDU Set Marking)", "pfcp.qer_indications_flags.pdusm", + FT_BOOLEAN, 8, NULL, 0x04, + NULL, HFILL } + }, + + { &hf_pfcp_configured_time_domain_flags_b0_ctdi, + { "CTDI (Configured Time Domain Indicator)", "pfcp.qer_indications_flags.ctdi", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + + { &hf_pfcp_metadata, + { "Metadata", "pfcp.metadata.metadata", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_metadata_binary_metadata, + { "Metadata - Binary data", "pfcp.metadata.binary_metadata", + FT_BYTES, BASE_NONE, NULL, 0x00, + NULL, HFILL } + }, + + { &hf_pfcp_traffic_parameter_threshold_flags_b0_dl, + { "DL", "pfcp.traffic_parameter_threshold_flags.dl", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + { &hf_pfcp_traffic_parameter_threshold_downlink_n6_jitter_threshold, + { "Downlink N6 Jitter Threshold", "pfcp.traffic_parameter_threshold.downlink_n6_jitter_threshold", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_dl_periodicity_value, + { "Dl Periodicity", "pfcp.dl_periodicity.value", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_n6_jitter_measurement_flags_b0_dl, + { "DL", "pfcp.dl_periodicity.dl", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + { &hf_pfcp_n6_jitter_measurement_dl_periodicity, + { "DL Periodicity", "pfcp.dl_periodicity.dl_periodicity", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_n6_jitter_measurement_lower_dl_jitter_measurement, + { "Lower DL Jitter Measurement", "pfcp.dl_periodicity.lower_dl_jitter_measurement", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_n6_jitter_measurement_higher_dl_jitter_measurement, + { "Higher DL Jitter Measurement", "pfcp.dl_periodicity.higher_dl_jitter_measurement", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_traffic_parameter_measurement_indication_flags_b0_ulpmi, + { "ULPMI", "pfcp.traffic_parameter_measurement_indication.ulpmi", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + { &hf_pfcp_traffic_parameter_measurement_indication_flags_b1_dlpmi, + { "DLPMI", "pfcp.traffic_parameter_measurement_indication.dlpmi", + FT_BOOLEAN, 8, NULL, 0x02, + NULL, HFILL } + }, + { &hf_pfcp_traffic_parameter_measurement_indication_flags_b2_n6jmi, + { "N6JMI", "pfcp.traffic_parameter_measurement_indication.n6jmi", + FT_BOOLEAN, 8, NULL, 0x02, + NULL, HFILL } + }, + + { &hf_pfcp_ul_periodicity_value, + { "Ul Periodicity", "pfcp.ul_periodicity.value", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_mpquic_control_information_flags_b0_cupd, + { "CUPD", "pfcp.quic_control_information.cupd", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + + { &hf_pfcp_mpquic_address_information_flags_b0_v4, + { "V4", "pfcp.mpquic_address_information.flags.v4", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, + NULL, HFILL } + }, + { &hf_pfcp_mpquic_address_information_flags_b1_v6, + { "V6", "pfcp.mpquic_address_information.flags.v6", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, + NULL, HFILL } + }, + { &hf_pfcp_mpquic_address_information_type, + { "MPQUIC Proxy Type", "pfcp.mpquic_address_information.type", + FT_UINT8, BASE_DEC, VALS(pfcp_mpquic_address_information_type_vals), 0x0, + NULL, HFILL } + }, + { &hf_pfcp_mpquic_address_information_port, + { "MPQUIC Proxy Port", "pfcp.mpquic_address_information.port", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_mpquic_address_information_address_ipv4, + { "MPQUIC Proxy IPv4 Address", "pfcp.mpquic_address_information.ipv4", + FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_mpquic_address_information_address_ipv6, + { "MPQUIC Proxy IPv6 Address", "pfcp.mpquic_address_information.ipv6", + FT_IPv6, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_transport_mode_value, + { "Transport Mode Value", "pfcp.transport_mode.value", + FT_UINT8, BASE_DEC, VALS(pfcp_transport_mode_type_vals), 0x0f, + NULL, HFILL } + }, + + { &hf_pfcp_protocol_description_flags_b0_h264, + { "H264", "pfcp.protocol_description.h264", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + { &hf_pfcp_protocol_description_flags_b1_rtp, + { "RTP", "pfcp.protocol_description.rtp", + FT_BOOLEAN, 8, NULL, 0x02, + NULL, HFILL } + }, + { &hf_pfcp_protocol_description_flags_b2_srtp, + { "SRTP", "pfcp.protocol_description.srtp", + FT_BOOLEAN, 8, NULL, 0x02, + NULL, HFILL } + }, + + { &hf_pfcp_reporting_suggestion_info_reporting_urgency_value, + { "Reporting Urgency value", "pfcp.reporting_suggestion_info.reporting_urgency_value", + FT_UINT8, BASE_DEC, VALS(pfcp_reporting_urgency_type_vals), 0x0f, + NULL, HFILL } + }, + { &hf_pfcp_reporting_suggestion_info_reporting_time_info, + { "Reporting Time Info", "pfcp.reporting_suggestion_info.reporting_time_info", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_tl_container, + { "TL-Container", "pfcp.tl_container", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_hplmn_s_nssai_sst, + { "SST (Slice/Service Type)", "pfcp.hplmn_s_nssai.sst", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_hplmn_s_nssai_sd, + { "SD (Slice Differentiator)", "pfcp.hplmn_s_nssai.sd", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_media_transport_protocol, + { "Media Transport Protocol", "pfcp.media_transport_protocol.media_transport_protocol_value", + FT_UINT8, BASE_DEC, VALS(pfcp_media_transport_protocol_vals), 0x0f, + NULL, HFILL } + }, + + { &hf_pfcp_rtp_header_extension_type, + { "RTP Header Extension Type", "pfcp.rtp_header_extension.rtp_header_extension_type", + FT_UINT8, BASE_DEC, VALS(pfcp_rtp_header_extension_type_vals), 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_rtp_header_extension_id, + { "RTP Header Extension ID", "pfcp.rtp_header_extension_id.rtp_header_extension_id", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_rtp_payload_type, + { "RTP Payload Type", "pfcp.rtp_payload_type.rtp_payload_type", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_rtp_payload_format, + { "RTP Payload Format", "pfcp.rtp_payload_format.rtp_payload_format", + FT_UINT8, BASE_DEC, VALS(pfcp_rtp_payload_format_vals), 0x0, + NULL, HFILL } + }, + /* Enterprise IEs */ /* BBF */ { &hf_pfcp_bbf_up_function_features_o7_b0_pppoe, @@ -14986,6 +16370,21 @@ proto_register_pfcp(void) FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, "PPP LCP echo supported in DBNG-UP function", HFILL } }, + { &hf_pfcp_bbf_up_function_features_o7_b5_iptv, + { "IPTV", "pfcp.bbf.up_function_features.iptv", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, + "DBNG-UP support of IP Multicast", HFILL } + }, + { &hf_pfcp_bbf_up_function_features_o7_b6_nat_cp, + { "NAT-CP", "pfcp.bbf.up_function_features.nat_cp", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, + "NAT function supported in DBNG-CP function", HFILL } + }, + { &hf_pfcp_bbf_up_function_features_o7_b7_nat_up, + { "NAT-UP", "pfcp.bbf.up_function_features.nat_up", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80, + "NAT function supported in DBNG-UP function", HFILL } + }, { &hf_pfcp_bbf_logical_port_id, { "Logical Port", "pfcp.bbf.logical_port_id", @@ -15133,7 +16532,147 @@ proto_register_pfcp(void) NULL, HFILL } }, + { &hf_pfcp_bbf_multicast_flags_o7_b1_routeralertoff, + { "ROUTERALERTOFF", "pfcp.bbf.multicast_flags.routeralertoff", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + { &hf_pfcp_bbf_multicast_flags_o7_b0_fastleave, + { "FASTLEAVE", "pfcp.bbf.multicast_flags.fastleave", + FT_BOOLEAN, 8, NULL, 0x02, + NULL, HFILL } + }, + + { &hf_pfcp_bbf_multicast_query_param_robustness, + { "Robustness count", "pfcp.bbf.multicast_query_parameters.robustness_count", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_bbf_multicast_query_param_query_interval, + { "Query interval", "pfcp.bbf.multicast_query_parameters.query_interval", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_bbf_multicast_query_param_query_response_interval, + { "Query response interval", "pfcp.bbf.multicast_query_parameters.query_response_interval", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_bbf_multicast_query_param_group_query_interval, + { "Group-specific query interval", "pfcp.bbf.multicast_query_parameters.group_specific_query_interval", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_bbf_multicast_group_limit_max_joins, + { "Maximum number of concurrent (S,G) joins allowed", "pfcp.bbf.multicast_group_limit.max_joins", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_bbf_apply_action_flags_b0_nat, + { "NAT", "pfcp.bbf.apply_action_flags.nat", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + + { &hf_pfcp_bbf_nat_external_port_range_start, + { "Start", "pfcp.bbf.nat_external_port_range.start", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_bbf_nat_external_port_range_end, + { "End", "pfcp.bbf.nat_external_port_range.end", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_bbf_nat_port_forward, + { "NAT Port Forward", "pfcp.bbf.nat_port_forward", + FT_NONE, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_bbf_nat_port_forward_inside_ip, + { "Inside Address", "pfcp.bbf.nat_port_forward.inside_address", + FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_bbf_nat_port_forward_inside_port, + { "Inside Port", "pfcp.bbf.nat_port_forward.inside_port", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_bbf_nat_port_forward_outside_port, + { "Outside Port", "pfcp.bbf.nat_port_forward.outside_port", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_bbf_nat_port_forward_protocol, + { "Protocol", "pfcp.bbf.nat_port_forward.protocol", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &ipproto_val_ext, 0x0, + NULL , HFILL + } + }, + + { &hf_pfcp_bbf_reporting_trigger, + { "Reporting Trigger", "pfcp.bbf.reporting_trigger", + FT_UINT8, BASE_DEC, VALS(pfcp_bbf_reporting_trigger_vals), 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_bbf_dynamic_nat_block_port_range_start_port, + { "Start", "pfcp.dynamic_nat_block_port_range.start", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_bbf_dynamic_nat_block_port_range_end_port, + { "End", "pfcp.dynamic_nat_block_port_range.end", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + + { &hf_pfcp_bbf_event_time_stamp, + { "Event Time Stamp", "pfcp.bbf.event_time_stamp", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_NTP_UTC, NULL, 0x0, + NULL, HFILL } + }, + /* Travelping */ + { &hf_pfcp_enterprise_travelping_packet_measurement, + { "Flags", "pfcp.travelping.volume_measurement", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_enterprise_travelping_packet_measurement_b0_tonop, + { "TONOP", "pfcp.travelping.volume_measurement_flags.tonop", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + { &hf_pfcp_enterprise_travelping_packet_measurement_b1_ulnop, + { "ULNOP", "pfcp.travelping.volume_measurement_flags.ulnop", + FT_BOOLEAN, 8, NULL, 0x02, + NULL, HFILL } + }, + { &hf_pfcp_enterprise_travelping_packet_measurement_b2_dlnop, + { "DLNOP", "pfcp.travelping.volume_measurement_flags.dlnops", + FT_BOOLEAN, 8, NULL, 0x04, + NULL, HFILL } + }, + { &hf_pfcp_travelping_pkt_meas_tonop, + { "Total Number of Packets", "pfcp.travelping.volume_measurement.tonop", + FT_UINT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_travelping_pkt_meas_ulnop, + { "Uplink Number of Packets", "pfcp.travelping.volume_measurement.ulnop", + FT_UINT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_travelping_pkt_meas_dlnop, + { "Downlink Number of Packets", "pfcp.travelping.volume_measurement.dlnop", + FT_UINT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, { &hf_pfcp_travelping_build_id, { "Build Identifier", "pfcp.travelping.build_id", FT_BYTES, BASE_NONE, NULL, 0x0, @@ -15174,148 +16713,640 @@ proto_register_pfcp(void) FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_pfcp_travelping_ipfix_policy, + { "IPFIX Policy", "pfcp.travelping.ipfix_policy", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_travelping_ipfix_policy_str, + { "IPFIX Policy", "pfcp.travelping.ipfix_policy_str", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_travelping_trace_parent, + { "Trace Parent", "pfcp.travelping.trace_parent", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_travelping_trace_parent_str, + { "Trace Parent", "pfcp.travelping.trace_parent_str", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_travelping_trace_state, + { "Trace State", "pfcp.travelping.trace_state", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_travelping_trace_state_str, + { "Trace State", "pfcp.travelping.trace_state_str", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + + /* Nokia */ + + { &hf_pfcp_nokia_sap_template, + { "SAP template", "pfcp.nokia.sap_template", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_group_iface_template, + { "Group Interface Template", "pfcp.nokia.group_if_template", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_session_state_id, + { "Session State Id", "pfcp.nokia.session_state_id", + FT_UINT64, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_detailed_stats_key, + { "Key", "pfcp.nokia.detailed_stats.key", + FT_UINT32, BASE_HEX, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_detailed_stats_key_direction, + { "Direction", "pfcp.nokia.detailed_stats.direction", + FT_BOOLEAN, 32, TFS(&tfs_nokia_detailed_stats_ie), 0x80000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_detailed_stats_key_type, + { "Type", "pfcp.nokia.detailed_stats.type", + FT_BOOLEAN, 32, TFS(&tfs_nokia_detailed_stats_qp), 0x40000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_detailed_stats_key_object_id, + { "Object id", "pfcp.nokia.detailed_stats.object_id", + FT_UINT32, BASE_DEC, NULL, 0x003f0000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_detailed_stats_key_stat_mode, + { "Stat mode", "pfcp.nokia.detailed_stats.stat_mode", + FT_UINT32, BASE_DEC, NULL, 0x0000001f, + NULL, HFILL } + }, + { &hf_pfcp_nokia_detailed_stats_bitmap_item, + { "length", "pfcp.nokia.detailed_stats.bitmap.len", + FT_UINT64, BASE_DEC|BASE_VAL64_STRING, VALS64(nokia_detailed_stats_length_values), 0x0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_detailed_stats_octets, + { "Packets offered", "pfcp.nokia.detailed_stats.octets", + FT_UINT64, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_detailed_error, + { "Detailed Error", "pfcp.nokia.detailed_error", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_qos_override, + { "Qos Override", "pfcp.nokia.qos_override", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_measurement_info, + { "Flags", "pfcp.nokia.measurement_info", + FT_UINT8, BASE_HEX, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_measurement_info_b0_det, + { "DET (Detailed Statistics)", "pfcp.nokia.measurement_info.det", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + { &hf_pfcp_nokia_pfcpsmreq_flags, + { "Flags", "pfcp.nokia.smreq_flags", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_pfcpsmreq_flags_b0_abs, + { "ABS (Absolute modification request)", "pfcp.nokia.smreq_flags.abs", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + { &hf_pfcp_nokia_pfcpsmreq_flags_b1_audit, + { "AUD (Auditing modification message)", "pfcp.nokia.smreq_flags.audit", + FT_BOOLEAN, 8, NULL, 0x02, + NULL, HFILL } + }, + { &hf_pfcp_nokia_up_function_features_bulk_audit, + { "BLK_AUD (Bulk Audit)", "pfcp.nokia.up_function_features.blk_aud", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, + NULL, HFILL } + }, + { &hf_pfcp_nokia_up_function_features_sssg, + { "SSSG (Shared Subnet Signaling)", "pfcp.nokia.up_function_features.sssg", + FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, + NULL, HFILL } + }, + { &hf_pfcp_nokia_filter_override_type, + { "Filter Type", "pfcp.nokia.filter_override.type", + FT_UINT8, BASE_HEX, VALS(nokia_filter_override_type_vals), 0x0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_filter_override_name, + { "Filter Override", "pfcp.nokia.filter_override.name", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_intermediate_destination, + { "Intermediate Destination", "pfcp.nokia.intermediate_destination", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_nat_isa_members, + { "Number of ISA members", "pfcp.nokia.nat_isa_members", + FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_pfcphb_flags, + { "Flags", "pfcp.nokia.hb_flags", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_pfcphb_flags_b0_aud_r, + { "AUDR (Mass Audit Request)", "pfcp.nokia.hb_flags.audr", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + { &hf_pfcp_nokia_pfcphb_flags_b1_aud_s, + { "AUDS (Mass Audit Start)", "pfcp.nokia.hb_flags.auds", + FT_BOOLEAN, 8, NULL, 0x02, + NULL, HFILL } + }, + { &hf_pfcp_nokia_pfcphb_flags_b2_aud_e, + { "AUDE (Mass Audit End)", "pfcp.nokia.hb_flags.aude", + FT_BOOLEAN, 8, NULL, 0x04, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_lcp_request, + { "LCP Request", "pfcp.nokia.l2tp.lcp_request", + FT_BYTES, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_auth_type, + { "L2TP Auth Type", "pfcp.nokia.l2tp.auth_type", + FT_UINT8, BASE_HEX, VALS(nokia_l2tp_auth_type_vals), 0x0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_auth_name, + { "L2TP Auth Name", "pfcp.nokia.l2tp.auth_name", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_auth_id, + { "L2TP Auth Id", "pfcp.nokia.l2tp.auth_id", + FT_UINT8, BASE_HEX, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_auth_challenge, + { "L2TP Auth Challenge", "pfcp.nokia.l2tp.auth_challenge", + FT_BYTES, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_auth_response, + { "L2TP Auth Response", "pfcp.nokia.l2tp.auth_response", + FT_BYTES, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_tunnel_endpoint_ipv4_address, + { "L2TP IPv4 Endpoint", "pfcp.nokia.l2tp.tunnel_endpoint.ipv4_addr", + FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_tunnel_endpoint_ipv6_address, + { "L2TP IPv6 Endpoint", "pfcp.nokia.l2tp.tunnel_endpoint.ipv6_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_client_auth_id, + { "L2TP Client Auth Id", "pfcp.nokia.l2tp.client_auth_id", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_server_auth_id, + { "L2TP Server Auth Id", "pfcp.nokia.l2tp.server_auth_id", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_password, + { "L2TP Password", "pfcp.nokia.l2tp.password", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_assignment_id, + { "L2TP Assignment Id", "pfcp.nokia.l2tp.assignment_id", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_private_group_id, + { "L2TP Private Group Id", "pfcp.nokia.l2tp.private_group_id", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_tunnel_params_flags, + { "Flags", "pfcp.nokia.l2tp.tunnel_params.flags", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_flags_b30_idle_timeout, + {"Idle Timeout", "pfcp.nokia.l2tp.tunnel_params.flags.idle_timeout", + FT_BOOLEAN, 32, NULL, 0x40000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_flags_b31_hello_interval, + {"Hello Interval", "pfcp.nokia.l2tp.tunnel_params.flags.hello_interval", + FT_BOOLEAN, 32, NULL, 0x80000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_flags_b29_session_limit, + {"Session Limit", "pfcp.nokia.l2tp.tunnel_params.flags.session_limit", + FT_BOOLEAN, 32, NULL, 0x20000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_flags_b28_preference, + {"Preference", "pfcp.nokia.l2tp.tunnel_params.flags.preference", + FT_BOOLEAN, 32, NULL, 0x10000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_flags_b27_df_bit, + {"DF Bit", "pfcp.nokia.l2tp.tunnel_params.flags.df_bit", + FT_BOOLEAN, 32, NULL, 0x08000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_flags_b26_challenge, + {"Challenge", "pfcp.nokia.l2tp.tunnel_params.flags.challenge", + FT_BOOLEAN, 32, NULL, 0x04000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_flags_b25_avp_hiding, + {"AVP Hiding", "pfcp.nokia.l2tp.tunnel_params.flags.avp_hiding", + FT_BOOLEAN, 32, NULL, 0x02000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_flags_b24_algorithm, + {"Algorithm", "pfcp.nokia.l2tp.tunnel_params.flags.algorithm", + FT_BOOLEAN, 32, NULL, 0x01000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_flags_b19_rx_window_size, + {"RX Window Size", "pfcp.nokia.l2tp.tunnel_params.flags.rx_window_size", + FT_BOOLEAN, 32, NULL, 0x00080000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_flags_b18_max_retries_not_estab, + {"Max Retries Not Established", "pfcp.nokia.l2tp.tunnel_params.flags.max_retries_not_estab", + FT_BOOLEAN, 32, NULL, 0x00040000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_flags_b17_max_retries_estab, + {"Max Retries Established", "pfcp.nokia.l2tp.tunnel_params.flags.max_retries_estab", + FT_BOOLEAN, 32, NULL, 0x00020000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_flags_b16_destruct_timeout, + {"Destruct Timeout", "pfcp.nokia.l2tp.tunnel_params.flags.destruct_timeout", + FT_BOOLEAN, 32, NULL, 0x00010000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_hello_interval, + {"Hello Interval", "pfcp.nokia.l2tp.tunnel_params.hello_interval", + FT_UINT24, BASE_DEC|BASE_SPECIAL_VALS, VALS(nokia_l2tp_params_infinite), 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_idle_timeout, + {"Idle Timeout", "pfcp.nokia.l2tp.tunnel_params.idle_timeout", + FT_UINT24, BASE_DEC|BASE_SPECIAL_VALS, VALS(nokia_l2tp_params_infinite), 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_session_limit, + {"Session Limit", "pfcp.nokia.l2tp.tunnel_params.session_limit", + FT_UINT24, BASE_DEC|BASE_SPECIAL_VALS, VALS(nokia_l2tp_params_infinite), 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_preference, + {"Preference", "pfcp.nokia.l2tp.tunnel_params.preference", + FT_UINT24, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_df_bit, + {"DF Bit", "pfcp.nokia.l2tp.tunnel_params.df_bit", + FT_UINT8, BASE_DEC, VALS(nokia_l2tp_params_never_always), 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_challenge, + {"Challenge", "pfcp.nokia.l2tp.tunnel_params.challenge", + FT_UINT8, BASE_DEC, VALS(nokia_l2tp_params_never_always), 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_avp_hiding, + {"AVP Hiding", "pfcp.nokia.l2tp.tunnel_params.avp_hiding", + FT_UINT8, BASE_DEC, VALS(nokia_l2tp_params_avp_hiding_vals), 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_algorithm, + {"Algorithm", "pfcp.nokia.l2tp.tunnel_params.algorithm", + FT_UINT8, BASE_DEC, VALS(nokia_l2tp_params_algorithm_vals), 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_rx_window_size, + {"RX Window Size", "pfcp.nokia.l2tp.tunnel_params.rx_window_size", + FT_UINT24, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_max_retries_not_estab, + {"Max Retries Not Estab", "pfcp.nokia.l2tp.tunnel_params.max_retries_not_estab", + FT_UINT24, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_max_retries_estab, + {"Max Retries Estab", "pfcp.nokia.l2tp.tunnel_params.max_retries_estab", + FT_UINT24, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_params_destruct_timeout, + {"Destruct Timeout", "pfcp.nokia.l2tp.tunnel_params.destruct_timeout", + FT_UINT24, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_local_tunnel_id, + { "Local Tunnel Id", "pfcp.nokia.l2tp.local_tunnel_id", + FT_UINT16, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_remote_tunnel_id, + { "Remote Tunnel Id", "pfcp.nokia.l2tp.remote_tunnel_id", + FT_UINT16, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_local_session_id, + { "Local Session Id", "pfcp.nokia.l2tp.local_session_id", + FT_UINT16, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_remote_session_id, + { "Remote Session Id", "pfcp.nokia.l2tp.remote_session_id", + FT_UINT16, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_l2tp_call_serial_num, + { "Call Serial Number", "pfcp.nokia.l2tp.call_serial_num", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_snat_inside_ipv4_address, + { "SNAT Inside IP", "pfcp.nokia.snat_inside_ip", + FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_circuit_id, + { "Access Line Circuit Id", "pfcp.nokia.access_line.circuit_id", + FT_BYTES, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_remote_id, + { "Access Line Remote Id", "pfcp.nokia.access_line.remote_id", + FT_BYTES, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags, + { "Flags", "pfcp.nokia.access_line.params.flags", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b24_act_up, + {"Act Up", "pfcp.nokia.access_line.params.flags.act_up", + FT_BOOLEAN, 32, NULL, 0x01000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b25_act_down, + {"Act Down", "pfcp.nokia.access_line.params.flags.act_down", + FT_BOOLEAN, 32, NULL, 0x02000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b26_min_up, + {"Min Up", "pfcp.nokia.access_line.params.flags.min_up", + FT_BOOLEAN, 32, NULL, 0x04000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b27_min_down, + {"Min Down", "pfcp.nokia.access_line.params.flags.min_down", + FT_BOOLEAN, 32, NULL, 0x08000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b28_att_up, + {"Att Up", "pfcp.nokia.access_line.params.flags.att_up", + FT_BOOLEAN, 32, NULL, 0x10000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b29_att_down, + {"Att Down", "pfcp.nokia.access_line.params.flags.att_down", + FT_BOOLEAN, 32, NULL, 0x20000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b30_max_up, + {"Max Up", "pfcp.nokia.access_line.params.flags.max_up", + FT_BOOLEAN, 32, NULL, 0x40000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b31_max_down, + {"Max Down", "pfcp.nokia.access_line.params.flags.max_down", + FT_BOOLEAN, 32, NULL, 0x80000000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b16_min_up_lp, + {"Min Up Lp", "pfcp.nokia.access_line.params.flags.min_up_lp", + FT_BOOLEAN, 32, NULL, 0x00010000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b17_min_down_lp, + {"Min Down Lp", "pfcp.nokia.access_line.params.flags.min_down_lp", + FT_BOOLEAN, 32, NULL, 0x00020000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b18_max_inter_delay_up, + {"Max Inter Delay Up", "pfcp.nokia.access_line.params.flags.max_inter_delay_up", + FT_BOOLEAN, 32, NULL, 0x00040000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b19_act_inter_delay_up, + {"Act Inter Delay Up", "pfcp.nokia.access_line.params.flags.act_inter_delay_up", + FT_BOOLEAN, 32, NULL, 0x00080000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b20_max_inter_delay_down, + {"Max Inter Delay Down", "pfcp.nokia.access_line.params.flags.max_inter_delay_down", + FT_BOOLEAN, 32, NULL, 0x00100000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b21_act_inter_delay_down, + {"Act Inter Delay Down", "pfcp.nokia.access_line.params.flags.act_inter_delay_down", + FT_BOOLEAN, 32, NULL, 0x00200000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b22_access_loop_encap, + {"Access Loop Encap", "pfcp.nokia.access_line.params.flags.access_loop_encap", + FT_BOOLEAN, 32, NULL, 0x00400000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_flags_b23_iw_session, + {"IW Session", "pfcp.nokia.access_line.params.flags.iw_session", + FT_BOOLEAN, 32, NULL, 0x00800000, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_act_up, + { "Act Up", "pfcp.nokia.access_line.params.act_up", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_act_down, + { "Act Down", "pfcp.nokia.access_line.params.act_down", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_min_up, + { "Min Up", "pfcp.nokia.access_line.params.min_up", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_min_down, + { "Min Down", "pfcp.nokia.access_line.params.min_down", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_att_up, + { "Att Up", "pfcp.nokia.access_line.params.att_up", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_att_down, + { "Act Att Down", "pfcp.nokia.access_line.params.att_down", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_max_up, + { "Max Up", "pfcp.nokia.access_line.params.max_up", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_max_down, + { "Max Down", "pfcp.nokia.access_line.params.max_down", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_min_up_lp, + { "Min Up Lp", "pfcp.nokia.access_line.params.min_up_lp", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_min_down_lp, + { "Min Down Lp", "pfcp.nokia.access_line.params.min_down_lp", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_max_inter_delay_up, + { "Max Inter Delay Up", "pfcp.nokia.access_line.params.max_inter_delay_up", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_act_inter_delay_up, + { "Act Inter Delay Up", "pfcp.nokia.access_line.params.act_inter_delay_up", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_max_inter_delay_down, + { "Max Inter Delay Down", "pfcp.nokia.access_line.params.max_inter_delay_down", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_act_inter_delay_down, + { "Act Inter Delay Down", "pfcp.nokia.access_line.params.act_inter_delay_down", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_access_line_params_access_loop_encap, + { "Access Loop Encap", "pfcp.nokia.access_line.params.access_loop_encap", + FT_UINT24, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_acct_session_id, + { "Accounting Session Id", "pfcp.nokia.acct_session_id", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_pfcp_nokia_fsg_template_name, + { "FSG Template Name", "pfcp.nokia.fsg_template_name", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL } + }, }; /* Setup protocol subtree array */ -#define NUM_INDIVIDUAL_ELEMS_PFCP 93 - gint *ett[NUM_INDIVIDUAL_ELEMS_PFCP + - (NUM_PFCP_IES - 1) + - (NUM_PFCP_ENTERPRISE_BBF_IES - 1) + - (NUM_PFCP_ENTERPRISE_TRAVELPING_IES - 1)]; - - ett[0] = &ett_pfcp; - ett[1] = &ett_pfcp_flags; - ett[2] = &ett_pfcp_ie; - ett[3] = &ett_pfcp_grouped_ie; - ett[4] = &ett_pfcp_f_seid_flags; - ett[5] = &ett_f_teid_flags; - ett[6] = &ett_pfcp_ue_ip_address_flags; - ett[7] = &ett_pfcp_sdf_filter_flags; - ett[8] = &ett_pfcp_measurement_method_flags; - ett[9] = &ett_pfcp_reporting_triggers; - ett[10] = &ett_pfcp_volume_threshold; - ett[11] = &ett_pfcp_volume_quota; - ett[12] = &ett_pfcp_subseq_volume_threshold; - ett[13] = &ett_pfcp_dropped_dl_traffic_threshold; - ett[14] = &ett_pfcp_gate_status; - ett[15] = &ett_pfcp_report_type; - ett[16] = &ett_pfcp_up_function_features; - ett[17] = &ett_pfcp_report_trigger; - ett[18] = &ett_pfcp_volume_measurement; - ett[19] = &ett_pfcp_usage_information; - ett[20] = &ett_pfcp_packet_rate; - ett[21] = &ett_pfcp_pfcp_dl_flow_level_marking; - ett[22] = &ett_pfcp_dl_data_service_inf; - ett[23] = &ett_pfcp_pfcpsmreq; - ett[24] = &ett_pfcp_pfcpsrrsp; - ett[25] = &ett_pfcp_measurement_info; - ett[26] = &ett_pfcp_node_report_type; - ett[27] = &ett_pfcp_remote_gtp_u_peer; - ett[28] = &ett_pfcp_oci_flags; - ett[29] = &ett_pfcp_assoc_rel_req_flags; - ett[30] = &ett_pfcp_upiri_flags; - ett[31] = &ett_pfcp_flow_desc; - ett[32] = &ett_pfcp_tos; - ett[33] = &ett_pfcp_spi; - ett[34] = &ett_pfcp_flow_label; - ett[35] = &ett_pfcp_subsequent_volume_quota; - ett[36] = &ett_pfcp_additional_usage_reports_information; - ett[37] = &ett_pfcp_mac_address; - ett[38] = &ett_pfcp_c_tag; - ett[39] = &ett_pfcp_s_tag; - ett[40] = &ett_pfcp_proxying; - ett[41] = &ett_pfcp_ethernet_filter_properties; - ett[42] = &ett_pfcp_user_id; - ett[43] = &ett_pfcp_ethernet_pdu_session_information; - ett[44] = &ett_pfcp_sdf_filter_id; - ett[45] = &ett_pfcp_adf; - ett[46] = &ett_pfcp_aurl; - ett[47] = &ett_pfcp_adnp; - ett[48] = &ett_pfcp_pfcpsrreq; - ett[49] = &ett_pfcp_pfcpaureq; - ett[50] = &ett_pfcp_alternative_smf_ip_address_flags; - ett[51] = &ett_pfcp_packet_replication_and_detection_carry_on_information; - ett[52] = &ett_pfcp_pfcpasrsp_flags; - ett[53] = &ett_pfcp_cp_pfcp_entity_ip_address_flags; - ett[54] = &ett_pfcp_pfcpsereq_flags; - ett[55] = &ett_pfcp_ip_multicast_address_flags; - ett[56] = &ett_pfcp_source_ip_address_flags; - ett[57] = &ett_pfcp_packet_rate_status; - ett[58] = &ett_pfcp_create_bridge_info_for_tsc; - ett[59] = &ett_pfcp_5gs_user_plane_node; - ett[60] = &ett_pfcp_requested_clock_drift_control_information; - ett[61] = &ett_pfcp_requested_access_availability_control_information; - ett[62] = &ett_pfcp_mptcp_control_information; - ett[63] = &ett_pfcp_atsss_ll_control_information; - ett[64] = &ett_pfcp_pmf_control_information; - ett[65] = &ett_pfcp_mptcp_entity_ip_address_information; - ett[66] = &ett_pfcp_ue_link_specific_entity_ip_address; - ett[67] = &ett_pfcp_pmf_address_information; - ett[68] = &ett_pfcp_atsss_ll_information; - ett[69] = &ett_pfcp_qos_report_trigger; - ett[70] = &ett_pfcp_gtp_u_path_interface_type; - ett[71] = &ett_pfcp_requested_qos_monitoring; - ett[72] = &ett_pfcp_reporting_frequency; - ett[73] = &ett_pfcp_packet_delay_thresholds; - ett[74] = &ett_pfcp_qos_monitoring_measurement; - ett[75] = &ett_pfcp_monitoring_measurement; - ett[76] = &ett_pfcp_ip_version; - ett[77] = &ett_pfcp_pfcpasreq_flags; - ett[78] = &ett_pfcp_data_status_flags; - ett[79] = &ett_pfcp_rds_configuration_information_flags; - ett[80] = &ett_pfcp_number_of_ue_ip_addresses_flags; - ett[81] = &ett_pfcp_l2tp_user_authentication_flags; - ett[82] = &ett_pfcp_thresholds; - ett[83] = &ett_pfcp_cp_ip_address_flags; - ett[84] = &ett_pfcp_ip_address_and_port_number_replacement_flags; - ett[85] = &ett_pfcp_mbs_session_identifier_flags; - ett[86] = &ett_local_ingress_tunnel_flags; - /* Enterprise */ - /* Travelping */ - ett[87] = &ett_pfcp_enterprise_travelping_error_report; - /* BBF */ - ett[88] = &ett_pfcp_bbf_ppp_protocol_flags; - ett[89] = &ett_pfcp_bbf_l2tp_endp_flags; - ett[90] = &ett_pfcp_bbf_l2tp_type_flags; - ett[91] = &ett_pfcp_bbf_ppp_lcp_connectivity; - ett[92] = &ett_pfcp_bbf_l2tp_tunnel; + int *ett[] = { + &ett_pfcp, + &ett_pfcp_flags, + &ett_pfcp_ie, + &ett_pfcp_unknown_enterprise_ie, + &ett_pfcp_grouped_ie, + &ett_pfcp_reporting_triggers, + &ett_pfcp_up_function_features, + &ett_pfcp_report_trigger, + &ett_pfcp_flow_desc, + &ett_pfcp_tos, + &ett_pfcp_spi, + &ett_pfcp_flow_label, + &ett_pfcp_sdf_filter_id, + &ett_pfcp_adf, + &ett_pfcp_aurl, + &ett_pfcp_adnp, + /* Travelping */ + &ett_pfcp_enterprise_travelping_packet_measurement, + &ett_pfcp_enterprise_travelping_error_report, + &ett_pfcp_enterprise_travelping_created_nat_binding, + &ett_pfcp_enterprise_travelping_trace_info, + /* BBF */ + &ett_pfcp_bbf_ppp_protocol_flags, + &ett_pfcp_bbf_l2tp_endp_flags, + &ett_pfcp_bbf_l2tp_type_flags, + &ett_pfcp_bbf_ppp_lcp_connectivity, + &ett_pfcp_bbf_l2tp_tunnel, + &ett_pfcp_bbf_nat_port_forward_list, + /* Nokia */ + &ett_pfcp_nokia_detailed_stats_key, + &ett_pfcp_nokia_detailed_stats_bitmap, + &ett_pfcp_nokia_measurement_info, + &ett_pfcp_nokia_pfcpsmreq_flags, + &ett_pfcp_nokia_pfcphb_flags, + &ett_pfcp_nokia_l2tp_tunnel_params_flags, + &ett_pfcp_nokia_access_line_params_flags, + }; + + // Each IE gets its own subtree + int* ie_ett[NUM_PFCP_IES - 1]; + for (unsigned i = 0; i < NUM_PFCP_IES - 1; i++) { + ie_ett[i] = &ett_pfcp_elem[i]; + } static ei_register_info ei[] = { { &ei_pfcp_ie_reserved,{ "pfcp.ie_id_reserved", PI_PROTOCOL, PI_ERROR, "Reserved IE value used", EXPFILL } }, { &ei_pfcp_ie_data_not_decoded,{ "pfcp.ie_data_not_decoded", PI_UNDECODED, PI_NOTE, "IE data not decoded by WS yet", EXPFILL } }, - { &ei_pfcp_ie_not_decoded_null,{ "pfcp.ie_not_decoded_null", PI_UNDECODED, PI_NOTE, "IE not decoded yet(WS:no decoding function(NULL))", EXPFILL } }, + { &ei_pfcp_ie_not_decoded_null,{ "pfcp.ie_not_decoded_null", PI_UNDECODED, PI_NOTE, "IE not decoded yet", EXPFILL } }, { &ei_pfcp_ie_not_decoded_too_large,{ "pfcp.ie_not_decoded", PI_UNDECODED, PI_NOTE, "IE not decoded yet(WS:IE id too large)", EXPFILL } }, - { &ei_pfcp_enterprise_ie_3gpp,{ "pfcp.ie_enterprise_3gpp", PI_PROTOCOL, PI_ERROR, "IE not decoded yet(WS:No vendor dissector)", EXPFILL } }, { &ei_pfcp_ie_encoding_error,{ "pfcp.ie_encoding_error", PI_PROTOCOL, PI_ERROR, "IE wrongly encoded", EXPFILL } }, }; module_t *module_pfcp; expert_module_t* expert_pfcp; - guint last_index = NUM_INDIVIDUAL_ELEMS_PFCP, i; - - for (i = 0; i < (NUM_PFCP_IES-1); i++, last_index++) - { - ett_pfcp_elem[i] = -1; - ett[last_index] = &ett_pfcp_elem[i]; - } - for (i = 0; i < (NUM_PFCP_ENTERPRISE_TRAVELPING_IES-1); i++, last_index++) - { - ett_pfcp_enterprise_travelping_elem[i] = -1; - ett[last_index] = &ett_pfcp_enterprise_travelping_elem[i]; - } - for (i = 0; i < (NUM_PFCP_ENTERPRISE_BBF_IES-1); i++, last_index++) - { - ett_pfcp_enterprise_bbf_elem[i] = -1; - ett[last_index] = &ett_pfcp_enterprise_bbf_elem[i]; - } - proto_pfcp = proto_register_protocol("Packet Forwarding Control Protocol", "PFCP", "pfcp"); pfcp_handle = register_dissector("pfcp", dissect_pfcp, proto_pfcp); - module_pfcp = prefs_register_protocol(proto_pfcp, proto_reg_handoff_pfcp); + module_pfcp = prefs_register_protocol(proto_pfcp, NULL); proto_register_field_array(proto_pfcp, hf_pfcp, array_length(hf_pfcp)); proto_register_subtree_array(ett, array_length(ett)); + proto_register_subtree_array(ie_ett, array_length(ie_ett)); expert_pfcp = expert_register_protocol(proto_pfcp); expert_register_field_array(expert_pfcp, ei, array_length(ei)); @@ -15323,27 +17354,24 @@ proto_register_pfcp(void) pfcp_enterprise_ies_dissector_table = register_dissector_table("pfcp.enterprise_ies", "PFCP Enterprice IEs", proto_pfcp, FT_UINT32, BASE_DEC); - pfcp_3gpp_ies_handle = register_dissector("pfcp_3gpp_ies", dissect_pfcp_3gpp_enterprise_ies, proto_pfcp); - pfcp_travelping_ies_handle = register_dissector("pfcp_travelping_ies", dissect_pfcp_enterprise_travelping_ies, proto_pfcp); - pfcp_bbf_ies_handle = register_dissector("pfcp_bbf_ies", dissect_pfcp_enterprise_bbf_ies, proto_pfcp); + pfcp_register_generic_ie_dissector(VENDOR_TRAVELPING, "pfcp_travelping_ies", "pfcp.ie.travelping", "Travelping IE Type", pfcp_travelping_ies, G_N_ELEMENTS(pfcp_travelping_ies)); + pfcp_register_generic_ie_dissector(VENDOR_BROADBAND_FORUM, "pfcp_bbf_ies", "pfcp.ie.bbf", "Broadband Forum IE Type", pfcp_bbf_ies, G_N_ELEMENTS(pfcp_bbf_ies)); + pfcp_register_generic_ie_dissector(VENDOR_NOKIA, "pfcp_nokia_ies", "pfcp.ie.nokia", "Nokia IE Type", pfcp_nokia_ies, G_N_ELEMENTS(pfcp_nokia_ies)); - prefs_register_uint_preference(module_pfcp, "port_pfcp", "PFCP port", "PFCP port (default 8805)", 10, &g_pfcp_port); prefs_register_bool_preference(module_pfcp, "track_pfcp_session", "Track PFCP session", "Track PFCP session", &g_pfcp_session); register_init_routine(pfcp_init); register_cleanup_routine(pfcp_cleanup); + pfcp_tap = register_tap("pfcp"); + + register_srt_table(proto_pfcp, NULL, 1, pfcp_stat_packet, pfcp_stat_init, NULL); } void proto_reg_handoff_pfcp(void) { - dissector_add_uint("udp.port", g_pfcp_port, pfcp_handle); - /* Register 3GPP in the table to give expert info and serve as an example how to add decoding of enterprise IEs*/ - dissector_add_uint("pfcp.enterprise_ies", VENDOR_THE3GPP, pfcp_3gpp_ies_handle); - /* Register Broadband Forum IEs */ - dissector_add_uint("pfcp.enterprise_ies", VENDOR_BROADBAND_FORUM, pfcp_bbf_ies_handle); - /* Register Travelping IEs */ - dissector_add_uint("pfcp.enterprise_ies", VENDOR_TRAVELPING, pfcp_travelping_ies_handle); + dissector_add_uint_with_preference("udp.port", UDP_PORT_PFCP, pfcp_handle); + dissector_add_string("media_type", "application/vnd.3gpp.pfcp", pfcp_handle); } /* |