2017-09-03 13:38:23 +00:00
/* packet-pfcp.c
2018-04-30 19:55:30 +00:00
*
* Routines for Packet Forwarding Control Protocol ( PFCP ) dissection
*
2018-05-03 21:09:31 +00:00
* Copyright 2017 - 2018 , Anders Broman < anders . broman @ ericsson . com >
2018-04-30 19:55:30 +00:00
*
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
* Copyright 1998 Gerald Combs
*
* SPDX - License - Identifier : GPL - 2.0 - or - later
*
2019-07-04 22:57:12 +00:00
* Ref 3 GPP TS 29.244 V15 .6 .0 ( 2019 - 06 - 13 )
2018-04-30 19:55:30 +00:00
*/
2017-09-03 13:38:23 +00:00
# include "config.h"
# include <epan/packet.h>
2018-08-05 17:37:11 +00:00
# include <epan/conversation.h>
2018-05-04 21:42:09 +00:00
# include <epan/etypes.h>
2017-09-03 13:38:23 +00:00
# include <epan/expert.h>
# include <epan/sminmpec.h>
# include <epan/addr_resolv.h> /* Needed for BASE_ENTERPRISES */
2018-10-18 17:36:45 +00:00
# include "packet-e164.h"
2018-10-04 16:22:28 +00:00
# include "packet-e212.h"
2017-09-03 13:38:23 +00:00
# include "packet-ntp.h"
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 ;
2017-11-16 16:31:07 +00:00
# define UDP_PORT_PFCP 8805
2018-08-13 22:43:30 +00:00
static guint g_pfcp_port = UDP_PORT_PFCP ;
2017-11-16 16:31:07 +00:00
2017-09-03 13:38:23 +00:00
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_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 ;
2018-11-04 19:01:40 +00:00
static int hf_pfcp_enterprise_id = - 1 ;
static int hf_pfcp_enterprise_data = - 1 ;
2017-09-03 13:38:23 +00:00
2018-08-05 17:37:11 +00:00
static int hf_pfcp_response_in = - 1 ;
static int hf_pfcp_response_to = - 1 ;
static int hf_pfcp_response_time = - 1 ;
2018-08-13 22:43:30 +00:00
static int hf_pfcp_session = - 1 ;
2017-09-03 13:38:23 +00:00
static int hf_pfcp_spare_b2 = - 1 ;
static int hf_pfcp_spare_b3 = - 1 ;
static int hf_pfcp_spare_b4 = - 1 ;
2017-09-04 11:40:00 +00:00
static int hf_pfcp_spare_b5 = - 1 ;
static int hf_pfcp_spare_b6 = - 1 ;
static int hf_pfcp_spare_b7 = - 1 ;
2017-09-19 14:09:35 +00:00
static int hf_pfcp_spare_b7_b6 = - 1 ;
2017-09-11 07:26:21 +00:00
static int hf_pfcp_spare_b7_b5 = - 1 ;
2017-09-19 14:09:35 +00:00
static int hf_pfcp_spare_b7_b4 = - 1 ;
2017-09-13 15:22:05 +00:00
static int hf_pfcp_spare_b7_b3 = - 1 ;
2017-09-18 15:20:36 +00:00
static int hf_pfcp_spare_b7_b2 = - 1 ;
2017-09-19 14:09:35 +00:00
static int hf_pfcp_spare_b7_b1 = - 1 ;
2017-09-03 13:38:23 +00:00
static int hf_pfcp_spare_h0 = - 1 ;
2017-09-04 11:40:00 +00:00
static int hf_pfcp_spare_h1 = - 1 ;
2017-09-11 07:26:21 +00:00
static int hf_pfcp_spare_oct = - 1 ;
2017-09-06 15:38:12 +00:00
static int hf_pfcp_spare = - 1 ;
2017-09-03 13:38:23 +00:00
2017-09-04 11:40:00 +00:00
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 ;
2017-09-03 13:38:23 +00:00
static int hf_pfcp_recovery_time_stamp = - 1 ;
2017-09-04 11:40:00 +00:00
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 ;
2017-09-05 15:22:14 +00:00
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 ;
2017-11-09 10:34:19 +00:00
static int hf_pfcp_fteid_flg_b3_ch_id = - 1 ;
2017-09-05 15:22:14 +00:00
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 ;
2017-11-09 10:34:19 +00:00
static int hf_pfcp_f_teid_ch_id = - 1 ;
2017-11-11 14:41:12 +00:00
static int hf_pfcp_f_teid_teid = - 1 ;
2017-09-05 15:22:14 +00:00
static int hf_pfcp_f_teid_ipv4 = - 1 ;
static int hf_pfcp_f_teid_ipv6 = - 1 ;
2017-11-12 12:51:00 +00:00
static int hf_pfcp_network_instance = - 1 ;
2017-11-10 09:50:09 +00:00
static int hf_pfcp_pdn_type = - 1 ;
2017-11-12 12:51:00 +00:00
static int hf_pfcp_failed_rule_id_type = - 1 ;
static int hf_pfcp_time_qouta_mechanism_bti_type = - 1 ;
static int hf_pfcp_time_qouta_mechanism_bti = - 1 ;
2018-02-27 23:13:29 +00:00
static int hf_pfcp_multiplier_value_digits = - 1 ;
static int hf_pfcp_multiplier_exponent = - 1 ;
static int hf_pfcp_aggregated_urr_id_ie_urr_id = - 1 ;
2018-02-26 23:44:26 +00:00
2017-09-05 15:22:14 +00:00
static int hf_pfcp_ue_ip_address_flags = - 1 ;
2017-11-11 14:38:43 +00:00
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 ;
2018-10-04 16:22:28 +00:00
static int hf_pfcp_ue_ip_address_flag_b3_v6d = - 1 ;
2017-09-05 15:22:14 +00:00
static int hf_pfcp_ue_ip_addr_ipv4 = - 1 ;
static int hf_pfcp_ue_ip_add_ipv6 = - 1 ;
2018-10-04 16:22:28 +00:00
static int hf_pfcp_ue_ip_add_ipv6_prefix = - 1 ;
2017-09-05 15:22:14 +00:00
static int hf_pfcp_application_id = - 1 ;
2019-01-24 14:40:38 +00:00
static int hf_pfcp_application_id_str = - 1 ;
2018-02-26 23:44:26 +00:00
2017-09-06 15:38:12 +00:00
static int hf_pfcp_sdf_filter_flags = - 1 ;
2018-02-26 23:44:26 +00:00
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 ;
2018-07-11 23:19:26 +00:00
static int hf_pfcp_sdf_filter_flags_b4_bid = - 1 ;
2018-02-26 23:44:26 +00:00
2017-09-06 15:38:12 +00:00
static int hf_pfcp_flow_desc_len = - 1 ;
2018-02-22 20:54:52 +00:00
static int hf_pfcp_flow_desc = - 1 ;
static int hf_pfcp_traffic_class = - 1 ;
static int hf_pfcp_traffic_mask = - 1 ;
2017-09-06 15:38:12 +00:00
static int hf_pfcp_spi = - 1 ;
2018-02-22 20:54:52 +00:00
static int hf_pfcp_flow_label_spare_bit = - 1 ;
static int hf_pfcp_flow_label = - 1 ;
2018-07-11 23:19:26 +00:00
static int hf_pfcp_sdf_filter_id = - 1 ;
2017-09-06 15:38:12 +00:00
static int hf_pfcp_out_hdr_desc = - 1 ;
2019-06-02 07:22:19 +00:00
static int hf_pfcp_gtpu_ext_hdr_del_b0_pdu_sess_cont = - 1 ;
2017-09-06 15:38:12 +00:00
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 ;
2017-09-11 07:26:21 +00:00
static int hf_pfcp_predef_rules_name = - 1 ;
2018-02-26 23:44:26 +00:00
2017-09-11 07:26:21 +00:00
static int hf_pfcp_apply_action_flags = - 1 ;
2018-02-26 23:44:26 +00:00
static int hf_pfcp_apply_action_flags_b4_dupl = - 1 ;
static int hf_pfcp_apply_action_flags_b3_nocp = - 1 ;
static int hf_pfcp_apply_action_flags_b2_buff = - 1 ;
static int hf_pfcp_apply_action_flags_b1_forw = - 1 ;
static int hf_pfcp_apply_action_flags_b0_drop = - 1 ;
2017-09-11 07:26:21 +00:00
static int hf_pfcp_bar_id = - 1 ;
2017-09-11 15:57:39 +00:00
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_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 ;
2017-09-13 07:30:48 +00:00
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 ;
2019-07-04 22:57:12 +00:00
static int hf_pfcp_other_redirect_server_addr_len = - 1 ;
static int hf_pfcp_other_redirect_server_address = - 1 ;
2017-09-13 15:22:05 +00:00
static int hf_pfcp_linked_urr_id = - 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 ;
2018-02-26 23:44:26 +00:00
2017-09-13 15:22:05 +00:00
static int hf_pfcp_measurement_method_flags = - 1 ;
2018-02-26 23:44:26 +00:00
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 ;
2017-09-13 15:22:05 +00:00
static int hf_pfcp_subsequent_time_threshold = - 1 ;
static int hf_pfcp_inactivity_detection_time = - 1 ;
static int hf_pfcp_monitoring_time = - 1 ;
2017-12-21 14:21:09 +00:00
2018-02-26 23:44:26 +00:00
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 ;
2019-01-13 16:17:21 +00:00
static int hf_pfcp_reporting_triggers_o6_b5_evequ = - 1 ;
2018-10-04 16:22:28 +00:00
static int hf_pfcp_reporting_triggers_o6_b4_eveth = - 1 ;
2018-07-11 23:19:26 +00:00
static int hf_pfcp_reporting_triggers_o6_b3_macar = - 1 ;
2018-02-26 23:44:26 +00:00
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 ;
2017-12-21 14:21:09 +00:00
2017-09-13 15:22:05 +00:00
static int hf_pfcp_volume_threshold = - 1 ;
2018-02-26 23:44:26 +00:00
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 ;
2017-09-13 15:22:05 +00:00
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 ;
2018-02-26 23:44:26 +00:00
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 ;
2017-09-13 15:22:05 +00:00
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 ;
2018-02-26 23:44:26 +00:00
2017-09-13 15:22:05 +00:00
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 ;
2018-10-04 16:22:28 +00:00
static int hf_pfcp_dropped_dl_traffic_threshold_b1_dlby = - 1 ;
2017-09-13 15:22:05 +00:00
static int hf_pfcp_dropped_dl_traffic_threshold_b0_dlpa = - 1 ;
static int hf_pfcp_downlink_packets = - 1 ;
2018-10-04 16:22:28 +00:00
static int hf_pfcp_bytes_downlink_data = - 1 ;
2017-09-13 15:22:05 +00:00
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 ;
2018-02-26 23:44:26 +00:00
2017-09-13 15:22:05 +00:00
static int hf_pfcp_report_type = - 1 ;
2018-02-27 21:47:17 +00:00
static int hf_pfcp_report_type_b3_upir = - 1 ;
2018-02-26 23:44:26 +00:00
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 ;
2017-09-13 15:22:05 +00:00
static int hf_pfcp_offending_ie = - 1 ;
2019-05-14 17:12:15 +00:00
static int hf_pfcp_up_function_features_o6_b6_pfde = - 1 ;
2018-10-04 16:22:28 +00:00
static int hf_pfcp_up_function_features_o6_b5_frrt = - 1 ;
static int hf_pfcp_up_function_features_o6_b4_trace = - 1 ;
2018-07-11 23:19:26 +00:00
static int hf_pfcp_up_function_features_o6_b3_quoac = - 1 ;
static int hf_pfcp_up_function_features_o6_b2_udbc = - 1 ;
2018-05-03 21:21:40 +00:00
static int hf_pfcp_up_function_features_o6_b1_pdiu = - 1 ;
2018-02-26 23:44:26 +00:00
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 ;
2017-09-18 15:20:36 +00:00
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 ;
2017-12-21 14:21:09 +00:00
2018-02-26 23:44:26 +00:00
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 ;
2018-10-04 16:22:28 +00:00
static int hf_pfcp_usage_report_trigger_o6_b7_eveth = - 1 ;
2018-07-11 23:19:26 +00:00
static int hf_pfcp_usage_report_trigger_o6_b6_macar = - 1 ;
2018-02-26 23:44:26 +00:00
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 ;
2019-01-13 16:17:21 +00:00
static int hf_pfcp_usage_report_trigger_o7_b0_evequ = - 1 ;
2017-12-21 14:21:09 +00:00
2017-09-18 15:20:36 +00:00
static int hf_pfcp_volume_measurement = - 1 ;
2018-02-26 23:44:26 +00:00
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 ;
2017-09-18 15:20:36 +00:00
static int hf_pfcp_vol_meas_tovol = - 1 ;
static int hf_pfcp_vol_meas_ulvol = - 1 ;
static int hf_pfcp_vol_meas_dlvol = - 1 ;
2018-02-26 23:44:26 +00:00
2017-09-18 15:20:36 +00:00
static int hf_pfcp_cp_function_features = - 1 ;
2018-02-26 23:44:26 +00:00
static int hf_pfcp_cp_function_features_b0_load = - 1 ;
static int hf_pfcp_cp_function_features_b1_ovrl = - 1 ;
2017-09-18 15:20:36 +00:00
static int hf_pfcp_usage_information = - 1 ;
2018-02-26 23:44:26 +00:00
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 ;
2017-09-18 15:20:36 +00:00
static int hf_pfcp_application_instance_id = - 1 ;
2019-01-24 14:40:38 +00:00
static int hf_pfcp_application_instance_id_str = - 1 ;
2017-09-18 15:20:36 +00:00
static int hf_pfcp_flow_dir = - 1 ;
static int hf_pfcp_packet_rate = - 1 ;
2018-02-26 23:44:26 +00:00
static int hf_pfcp_packet_rate_b0_ulpr = - 1 ;
static int hf_pfcp_packet_rate_b1_dlpr = - 1 ;
2017-09-18 15:20:36 +00:00
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 ;
2018-02-26 23:44:26 +00:00
2017-09-18 15:20:36 +00:00
static int hf_pfcp_dl_flow_level_marking = - 1 ;
2018-02-26 23:44:26 +00:00
static int hf_pfcp_dl_flow_level_marking_b0_ttc = - 1 ;
static int hf_pfcp_dl_flow_level_marking_b1_sci = - 1 ;
2017-09-18 15:20:36 +00:00
static int hf_pfcp_sci = - 1 ;
static int hf_pfcp_dl_data_notification_delay = - 1 ;
static int hf_pfcp_packet_count = - 1 ;
2018-02-26 23:44:26 +00:00
static int hf_pfcp_dl_data_service_inf_flags = - 1 ;
static int hf_pfcp_dl_data_service_inf_b0_ppi = - 1 ;
2018-12-17 16:06:37 +00:00
static int hf_pfcp_dl_data_service_inf_b1_qfii = - 1 ;
2017-09-19 14:09:35 +00:00
static int hf_pfcp_ppi = - 1 ;
2018-02-26 23:44:26 +00:00
2018-02-27 21:31:25 +00:00
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 ;
2018-02-26 23:44:26 +00:00
2018-02-27 21:31:25 +00:00
static int hf_pfcp_pfcpsrrsp_flags = - 1 ;
static int hf_pfcp_pfcpsrrsp_flags_b0_drobu = - 1 ;
2018-02-26 23:44:26 +00:00
2017-09-19 14:09:35 +00:00
static int hf_pfcp_pfd_contents_flags = - 1 ;
2019-05-14 17:12:15 +00:00
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 ;
2018-02-26 23:44:26 +00:00
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 ;
2017-09-19 14:09:35 +00:00
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 ;
2019-05-14 17:12:15 +00:00
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 ;
2017-09-21 13:07:27 +00:00
static int hf_pfcp_header_type = - 1 ;
static int hf_pfcp_hf_len = - 1 ;
static int hf_pfcp_hf_name = - 1 ;
2018-10-12 06:36:21 +00:00
static int hf_pfcp_hf_name_str = - 1 ;
2017-09-21 13:07:27 +00:00
static int hf_pfcp_hf_val_len = - 1 ;
static int hf_pfcp_hf_val = - 1 ;
2018-10-12 06:36:21 +00:00
static int hf_pfcp_hf_val_str = - 1 ;
2018-02-26 23:44:26 +00:00
2017-09-21 13:07:27 +00:00
static int hf_pfcp_measurement_info = - 1 ;
2018-02-26 23:44:26 +00:00
static int hf_pfcp_measurement_info_b0_mbqe = - 1 ;
static int hf_pfcp_measurement_info_b1_inam = - 1 ;
2018-02-27 21:56:45 +00:00
static int hf_pfcp_measurement_info_b2_radi = - 1 ;
2019-01-13 16:17:21 +00:00
static int hf_pfcp_measurement_info_b3_istm = - 1 ;
2018-02-26 23:44:26 +00:00
2017-09-21 13:07:27 +00:00
static int hf_pfcp_node_report_type = - 1 ;
2018-02-26 23:44:26 +00:00
static int hf_pfcp_node_report_type_b0_upfr = - 1 ;
static int hf_pfcp_remote_gtp_u_peer_flags = - 1 ;
static int hf_pfcp_remote_gtp_u_peer_flags_b0_v6 = - 1 ;
static int hf_pfcp_remote_gtp_u_peer_flags_b1_v4 = - 1 ;
2019-07-04 22:57:12 +00:00
static int hf_pfcp_remote_gtp_u_peer_flags_b2_di = - 1 ;
static int hf_pfcp_remote_gtp_u_peer_flags_b3_ni = - 1 ;
2017-09-21 13:07:27 +00:00
static int hf_pfcp_remote_gtp_u_peer_ipv4 = - 1 ;
static int hf_pfcp_remote_gtp_u_peer_ipv6 = - 1 ;
2019-07-04 22:57:12 +00:00
static int hf_pfcp_remote_gtp_u_peer_length_di = - 1 ;
static int hf_pfcp_remote_gtp_u_peer_length_ni = - 1 ;
2017-09-21 13:07:27 +00:00
static int hf_pfcp_ur_seqn = - 1 ;
2018-02-26 23:44:26 +00:00
2017-09-21 13:07:27 +00:00
static int hf_pfcp_oci_flags = - 1 ;
2018-02-26 23:44:26 +00:00
static int hf_pfcp_oci_flags_b0_aoci = - 1 ;
2018-02-27 22:08:05 +00:00
static int hf_pfcp_pfcp_assoc_rel_req_flags = - 1 ;
static int hf_pfcp_pfcp_assoc_rel_req_b0_sarr = - 1 ;
2018-02-26 23:44:26 +00:00
2017-11-12 12:51:00 +00:00
static int hf_pfcp_upiri_flags = - 1 ;
2018-02-26 23:44:26 +00:00
static int hf_pfcp_upiri_flags_b0_v4 = - 1 ;
static int hf_pfcp_upiri_flags_b1_v6 = - 1 ;
2018-07-11 23:19:26 +00:00
static int hf_pfcp_upiri_flg_b6_assosi = - 1 ;
2017-11-12 12:51:00 +00:00
static int hf_pfcp_upiri_flg_b5_assoni = - 1 ;
2018-07-05 12:08:59 +00:00
static int hf_pfcp_upiri_flg_b2b4_teidri = - 1 ;
2017-11-12 12:51:00 +00:00
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 ;
2018-02-26 23:44:26 +00:00
2018-02-15 15:04:34 +00:00
static int hf_pfcp_user_plane_inactivity_timer = - 1 ;
2017-09-03 13:38:23 +00:00
2018-02-28 20:20:49 +00:00
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 ;
2018-04-09 11:55:07 +00:00
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 ;
2018-04-10 15:58:35 +00:00
static int hf_pfcp_traffic_endpoint_id = - 1 ;
2018-04-09 11:55:07 +00:00
2018-05-04 21:42:09 +00:00
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_c_tag_cvid_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_s_tag_svid_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 ;
2018-07-11 23:19:26 +00:00
static int hf_pfcp_suggested_buffering_packets_count_packet_count = - 1 ;
static int hf_pfcp_user_id_flags = - 1 ;
2018-10-04 16:22:28 +00:00
static int hf_pfcp_user_id_flags_b3_naif = - 1 ;
static int hf_pfcp_user_id_flags_b2_msisdnf = - 1 ;
2018-07-11 23:19:26 +00:00
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 ;
2018-10-04 16:22:28 +00:00
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 ;
2018-07-11 23:19:26 +00:00
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_removed_number_of_mac_addresses = - 1 ;
static int hf_pfcp_mac_addresses_removed_mac_address = - 1 ;
static int hf_pfcp_ethernet_inactivity_timer = - 1 ;
2019-01-13 16:17:21 +00:00
static int hf_pfcp_subsequent_event_quota = - 1 ;
2018-10-04 16:22:28 +00:00
2019-01-13 16:17:21 +00:00
static int hf_pfcp_subsequent_event_threshold = - 1 ;
2018-10-04 16:22:28 +00:00
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_ipaddress = - 1 ;
static int hf_pfcp_frame_route = - 1 ;
static int hf_pfcp_frame_routing = - 1 ;
static int hf_pfcp_frame_ipv6_route = - 1 ;
2019-01-13 16:17:21 +00:00
static int hf_pfcp_event_quota = - 1 ;
static int hf_pfcp_event_threshold = - 1 ;
static int hf_pfcp_event_time_stamp = - 1 ;
static int hf_pfcp_averaging_window = - 1 ;
static int hf_pfcp_paging_policy_indicator = - 1 ;
2019-07-04 22:57:12 +00:00
static int hf_pfcp_apn_dnn = - 1 ;
static int hf_pfcp_tgpp_interface_type = - 1 ;
2017-09-03 13:38:23 +00:00
static int ett_pfcp = - 1 ;
static int ett_pfcp_flags = - 1 ;
static int ett_pfcp_ie = - 1 ;
static int ett_pfcp_grouped_ie = - 1 ;
2017-09-04 11:40:00 +00:00
static int ett_pfcp_f_seid_flags = - 1 ;
2017-09-05 15:22:14 +00:00
static int ett_f_teid_flags = - 1 ;
static int ett_pfcp_ue_ip_address_flags = - 1 ;
2017-09-06 15:38:12 +00:00
static int ett_pfcp_sdf_filter_flags = - 1 ;
2017-09-11 07:26:21 +00:00
static int ett_pfcp_apply_action_flags = - 1 ;
2017-09-13 15:22:05 +00:00
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 ;
2017-09-18 15:20:36 +00:00
static int ett_pfcp_report_trigger = - 1 ;
static int ett_pfcp_volume_measurement = - 1 ;
static int ett_pfcp_cp_function_features = - 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 ;
2017-09-19 14:09:35 +00:00
static int ett_pfcp_dl_data_service_inf = - 1 ;
2018-02-27 21:31:25 +00:00
static int ett_pfcp_pfcpsmreq = - 1 ;
static int ett_pfcp_pfcpsrrsp = - 1 ;
2017-09-21 13:07:27 +00:00
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 ;
2018-05-23 21:11:42 +00:00
static int ett_pfcp_assoc_rel_req_flags = - 1 ;
2017-11-12 12:51:00 +00:00
static int ett_pfcp_upiri_flags = - 1 ;
2018-02-22 21:28:25 +00:00
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 ;
2018-07-11 23:19:26 +00:00
static int ett_pfcp_sdf_filter_id = - 1 ;
2018-02-28 20:20:49 +00:00
static int ett_pfcp_subsequent_volume_quota = - 1 ;
2018-04-09 11:55:07 +00:00
static int ett_pfcp_additional_usage_reports_information = - 1 ;
2018-05-04 21:42:09 +00:00
static int ett_pfcp_mac_address = - 1 ;
static int ett_pfcp_c_tag = - 1 ;
static int ett_pfcp_c_tag_dei = - 1 ;
static int ett_pfcp_s_tag = - 1 ;
static int ett_pfcp_s_tag_dei = - 1 ;
static int ett_pfcp_proxying = - 1 ;
static int ett_pfcp_ethernet_filter_properties = - 1 ;
2018-07-11 23:19:26 +00:00
static int ett_pfcp_user_id = - 1 ;
static int ett_pfcp_ethernet_pdu_session_information = - 1 ;
2019-05-14 17:12:15 +00:00
static int ett_pfcp_adf = - 1 ;
static int ett_pfcp_aurl = - 1 ;
static int ett_pfcp_adnp = - 1 ;
2018-02-22 21:28:25 +00:00
2017-09-03 13:38:23 +00:00
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_to_large = EI_INIT ;
static expert_field ei_pfcp_enterprise_ie_3gpp = EI_INIT ;
2017-09-04 11:40:00 +00:00
static expert_field ei_pfcp_ie_encoding_error = EI_INIT ;
2017-09-03 13:38:23 +00:00
2018-08-13 22:43:30 +00:00
static gboolean g_pfcp_session = FALSE ;
static guint32 pfcp_session_count ;
typedef struct pfcp_session_args {
wmem_list_t * seid_list ;
wmem_list_t * ip_list ;
guint64 last_seid ;
address last_ip ;
guint8 last_cause ;
} pfcp_session_args_t ;
typedef struct _pfcp_hdr {
guint8 message ; /* Message type */
guint16 length ; /* Length of header */
gint64 seid ; /* Tunnel 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 ;
typedef struct pfcp_info {
guint64 seid ;
guint32 frame ;
} pfcp_info_t ;
2017-09-03 13:38:23 +00:00
static dissector_table_t pfcp_enterprise_ies_dissector_table ;
2018-08-13 22:43:30 +00:00
static void dissect_pfcp_ies_common ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , gint offset , guint8 message_type , pfcp_session_args_t * args _U_ ) ;
static void dissect_pfcp_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_ ) ;
2018-10-04 16:22:28 +00:00
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_ ) ;
2017-09-04 11:40:00 +00:00
2017-09-06 15:38:12 +00:00
static const true_false_string pfcp_id_predef_dynamic_tfs = {
" Predefined by UP " ,
" Dynamic by CP " ,
} ;
2017-09-03 13:38:23 +00:00
2018-08-09 19:28:16 +00:00
# define PFCP_MSG_RESERVED_0 0
# define PFCP_MSG_HEARTBEAT_REQUEST 1
# define PFCP_MSG_HEARTBEAT_RESPONSE 2
# define PFCP_MSG_PFD_MANAGEMENT_REQUEST 3
# define PFCP_MSG_PFD_MANAGEMENT_RESPONSE 4
# define PFCP_MSG_ASSOCIATION_SETUP_REQUEST 5
# define PFCP_MSG_ASSOCIATION_SETUP_RESPONSE 6
# define PFCP_MSG_ASSOCIATION_UPDATE_REQUEST 7
# define PFCP_MSG_ASSOCIATION_UPDATE_RESPONSE 8
# define PFCP_MSG_ASSOCIATION_RELEASE_REQUEST 9
# define PFCP_MSG_ASSOCIATION_RELEASE_RESPONSE 10
# define PFCP_MSG_VERSION_NOT_SUPPORTED_RESPONSE 11
# define PFCP_MSG_NODE_REPORT_REQEUST 12
# define PFCP_MSG_NODE_REPORT_RERESPONSE 13
# define PFCP_MSG_SESSION_SET_DELETION_REQUEST 14
# define PFCP_MSG_SESSION_SET_DELETION_RESPONSE 15
# define PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST 50
# define PFCP_MSG_SESSION_ESTABLISHMENT_RESPONSE 51
# define PFCP_MSG_SESSION_MODIFICATION_REQUEST 52
# define PFCP_MSG_SESSION_MODIFICATION_RESPONSE 53
# define PFCP_MSG_SESSION_DELETION_REQUEST 54
# define PFCP_MSG_SESSION_DELETION_RESPONSE 55
# define PFCP_MSG_SESSION_REPORT_REQUEST 56
# define PFCP_MSG_SESSION_REPORT_RESPONSE 57
2017-09-03 13:38:23 +00:00
static const value_string pfcp_message_type [ ] = {
{ PFCP_MSG_RESERVED_0 , " Reserved " } ,
2018-05-23 21:11:42 +00:00
/* PFCP Node related messages */
2018-08-09 19:28:16 +00:00
{ PFCP_MSG_HEARTBEAT_REQUEST , " PFCP Heartbeat Request " } ,
{ PFCP_MSG_HEARTBEAT_RESPONSE , " PFCP Heartbeat Response " } ,
{ PFCP_MSG_PFD_MANAGEMENT_REQUEST , " PFCP PFD Management Request " } ,
{ PFCP_MSG_PFD_MANAGEMENT_RESPONSE , " PFCP PFD Management Response " } ,
{ PFCP_MSG_ASSOCIATION_SETUP_REQUEST , " PFCP Association Setup Request " } ,
{ PFCP_MSG_ASSOCIATION_SETUP_RESPONSE , " PFCP Association Setup Response " } ,
{ PFCP_MSG_ASSOCIATION_UPDATE_REQUEST , " PFCP Association Update Request " } ,
{ PFCP_MSG_ASSOCIATION_UPDATE_RESPONSE , " PFCP Association Update Response " } ,
{ PFCP_MSG_ASSOCIATION_RELEASE_REQUEST , " PFCP Association Release Request " } ,
{ PFCP_MSG_ASSOCIATION_RELEASE_RESPONSE , " PFCP Association Release Response " } ,
{ PFCP_MSG_VERSION_NOT_SUPPORTED_RESPONSE , " PFCP Version Not Supported Response " } ,
{ PFCP_MSG_NODE_REPORT_REQEUST , " PFCP Node Report Request " } ,
{ PFCP_MSG_NODE_REPORT_RERESPONSE , " PFCP Node Report Response " } ,
{ PFCP_MSG_SESSION_SET_DELETION_REQUEST , " PFCP Session Set Deletion Request " } ,
{ PFCP_MSG_SESSION_SET_DELETION_RESPONSE , " PFCP Session Set Deletion Response " } ,
2018-04-09 11:55:07 +00:00
//16 to 49 For future use
2018-05-23 21:11:42 +00:00
//PFCP Session related messages
2018-08-09 19:28:16 +00:00
{ PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST , " PFCP Session Establishment Request " } ,
{ PFCP_MSG_SESSION_ESTABLISHMENT_RESPONSE , " PFCP Session Establishment Response " } ,
{ PFCP_MSG_SESSION_MODIFICATION_REQUEST , " PFCP Session Modification Request " } ,
{ PFCP_MSG_SESSION_MODIFICATION_RESPONSE , " PFCP Session Modification Response " } ,
{ PFCP_MSG_SESSION_DELETION_REQUEST , " PFCP Session Deletion Request " } ,
{ PFCP_MSG_SESSION_DELETION_RESPONSE , " PFCP Session Deletion Response " } ,
{ PFCP_MSG_SESSION_REPORT_REQUEST , " PFCP Session Report Request " } ,
{ PFCP_MSG_SESSION_REPORT_RESPONSE , " PFCP Session Report Response " } ,
2018-04-09 11:55:07 +00:00
//58 to 99 For future use
2017-09-03 13:38:23 +00:00
//Other messages
2018-04-09 11:55:07 +00:00
//100 to 255 For future use
2017-09-03 13:38:23 +00:00
{ 0 , NULL }
} ;
static value_string_ext pfcp_message_type_ext = VALUE_STRING_EXT_INIT ( pfcp_message_type ) ;
/* 8.1.2 Information Element Types */
2017-09-04 11:40:00 +00:00
# define PFCP_IE_ID_CREATE_PDR 1
# define PFCP_IE_ID_PDI 2
# define PFCP_IE_CREATE_FAR 3
# define PFCP_IE_FORWARDING_PARAMETERS 4
# define PFCP_IE_DUPLICATING_PARAMETERS 5
# define PFCP_IE_CREATE_URR 6
# define PFCP_IE_CREATE_QER 7
# define PFCP_IE_CREATED_PDR 8
# define PFCP_IE_UPDATE_PDR 9
# define PFCP_IE_UPDATE_FAR 10
# define PFCP_IE_UPD_FORWARDING_PARAM 11
# define PFCP_IE_UPDATE_BAR 12
# define PFCP_IE_UPDATE_URR 13
# define PFCP_IE_UPDATE_QER 14
# define PFCP_IE_REMOVE_PDR 15
# define PFCP_IE_REMOVE_FAR 16
# define PFCP_IE_REMOVE_URR 17
# define PFCP_IE_REMOVE_QER 18
2017-09-03 13:38:23 +00:00
2018-08-09 19:28:16 +00:00
# define PFCP_IE_LOAD_CONTROL_INFORMATION 51
# define PFCP_IE_OVERLOAD_CONTROL_INFORMATION 54
# define PFCP_IE_APPLICATION_IDS_PFDS 58
# define PFCP_IE_PFD_CONTEXT 59
# define PFCP_IE_APPLICATION_DETECTION_INF 68
# define PFCP_IE_QUERY_URR 77
# define PFCP_IE_USAGE_REPORT_SMR 78
# define PFCP_IE_USAGE_REPORT_SDR 79
# define PFCP_IE_USAGE_REPORT_SRR 80
# define PFCP_IE_DOWNLINK_DATA_REPORT 83
# define PFCP_IE_CREATE_BAR 85
# define PFCP_IE_UPDATE_BAR_SMR 86
# define PFCP_IE_REMOVE_BAR 87
# define PFCP_IE_ERROR_INDICATION_REPORT 99
# define PFCP_IE_USER_PLANE_PATH_FAILURE_REPORT 102
# define PFCP_IE_UPDATE_DUPLICATING_PARAMETERS 105
# define PFCP_IE_AGGREGATED_URRS 118
# define PFCP_IE_CREATE_TRAFFIC_ENDPOINT 127
# define PFCP_IE_CREATED_TRAFFIC_ENDPOINT 128
# define PFCP_IE_UPDATE_TRAFFIC_ENDPOINT 129
# define PFCP_IE_REMOVE_TRAFFIC_ENDPOINT 130
# define PFCP_IE_ETHERNET_PACKET_FILTER 132
# define PFCP_IE_ETHERNET_TRAFFIC_INFORMATION 143
2018-10-04 16:22:28 +00:00
# define PFCP_IE_ADDITIONAL_MONITORING_TIME 147
# define PFCP_IE_EVENT_INFORMATION 148
# define PFCP_IE_EVENT_REPORTING 149
2017-09-11 15:57:39 +00:00
2017-09-03 13:38:23 +00:00
static const value_string pfcp_ie_type [ ] = {
{ 0 , " Reserved " } ,
{ 1 , " Create PDR " } , /* Extendable / Table 7.5.2.2-1 */
{ 2 , " PDI " } , /* Extendable / Table 7.5.2.2-2 */
{ 3 , " Create FAR " } , /* Extendable / Table 7.5.2.3-1 */
{ 4 , " Forwarding Parameters " } , /* Extendable / Table 7.5.2.3-2 */
{ 5 , " Duplicating Parameters " } , /* Extendable / Table 7.5.2.3-3 */
{ 6 , " Create URR " } , /* Extendable / Table 7.5.2.4-1 */
{ 7 , " Create QER " } , /* Extendable / Table 7.5.2.5-1 */
{ 8 , " Created PDR " } , /* Extendable / Table 7.5.3.2-1 */
{ 9 , " Update PDR " } , /* Extendable / Table 7.5.4.2-1 */
{ 10 , " Update FAR " } , /* Extendable / Table 7.5.4.3-1 */
{ 11 , " Update Forwarding Parameters " } , /* Extendable / Table 7.5.4.3-2 */
2018-05-23 21:11:42 +00:00
{ 12 , " Update BAR (PFCP Session Report Response) " } , /* Extendable / Table 7.5.9.2-1 */
2017-09-03 13:38:23 +00:00
{ 13 , " Update URR " } , /* Extendable / Table 7.5.4.4 */
{ 14 , " Update QER " } , /* Extendable / Table 7.5.4.5 */
{ 15 , " Remove PDR " } , /* Extendable / Table 7.5.4.6 */
{ 16 , " Remove FAR " } , /* Extendable / Table 7.5.4.7 */
{ 17 , " Remove URR " } , /* Extendable / Table 7.5.4.8 */
{ 18 , " Remove QER " } , /* Extendable / Table 7.5.4.9 */
{ 19 , " Cause " } , /* Fixed / Subclause 8.2.1 */
{ 20 , " Source Interface " } , /* Extendable / Subclause 8.2.2 */
{ 21 , " F-TEID " } , /* Extendable / Subclause 8.2.3 */
2017-11-12 12:51:00 +00:00
{ 22 , " Network Instance " } , /* Variable Length / Subclause 8.2.4 */
2017-09-03 13:38:23 +00:00
{ 23 , " SDF Filter " } , /* Extendable / Subclause 8.2.5 */
{ 24 , " Application ID " } , /* Variable Length / Subclause 8.2.6 */
{ 25 , " Gate Status " } , /* Extendable / Subclause 8.2.7 */
{ 26 , " MBR " } , /* Extendable / Subclause 8.2.8 */
{ 27 , " GBR " } , /* Extendable / Subclause 8.2.9 */
{ 28 , " QER Correlation ID " } , /* Extendable / Subclause 8.2.10 */
{ 29 , " Precedence " } , /* Extendable / Subclause 8.2.11 */
{ 30 , " DL Transport Level Marking " } , /* Extendable / Subclause 8.2.12 */
{ 31 , " Volume Threshold " } , /* Extendable /Subclause 8.2.13 */
{ 32 , " Time Threshold " } , /* Extendable /Subclause 8.2.14 */
{ 33 , " Monitoring Time " } , /* Extendable /Subclause 8.2.15 */
{ 34 , " Subsequent Volume Threshold " } , /* Extendable /Subclause 8.2.16 */
{ 35 , " Subsequent Time Threshold " } , /* Extendable /Subclause 8.2.17 */
{ 36 , " Inactivity Detection Time " } , /* Extendable /Subclause 8.2.18 */
{ 37 , " Reporting Triggers " } , /* Extendable /Subclause 8.2.19 */
{ 38 , " Redirect Information " } , /* Extendable /Subclause 8.2.20 */
{ 39 , " Report Type " } , /* Extendable / Subclause 8.2.21 */
{ 40 , " Offending IE " } , /* Fixed / Subclause 8.2.22 */
{ 41 , " Forwarding Policy " } , /* Extendable / Subclause 8.2.23 */
{ 42 , " Destination Interface " } , /* Extendable / Subclause 8.2.24 */
{ 43 , " UP Function Features " } , /* Extendable / Subclause 8.2.25 */
{ 44 , " Apply Action " } , /* Extendable / Subclause 8.2.26 */
{ 45 , " Downlink Data Service Information " } , /* Extendable / Subclause 8.2.27 */
{ 46 , " Downlink Data Notification Delay " } , /* Extendable / Subclause 8.2.28 */
{ 47 , " DL Buffering Duration " } , /* Extendable / Subclause 8.2.29 */
{ 48 , " DL Buffering Suggested Packet Count " } , /* Variable / Subclause 8.2.30 */
2018-02-27 21:31:25 +00:00
{ 49 , " PFCPSMReq-Flags " } , /* Extendable / Subclause 8.2.31 */
{ 50 , " PFCPSRRsp-Flags " } , /* Extendable / Subclause 8.2.32 */
2017-09-03 13:38:23 +00:00
{ 51 , " Load Control Information " } , /* Extendable / Table 7.5.3.3-1 */
{ 52 , " Sequence Number " } , /* Fixed Length / Subclause 8.2.33 */
{ 53 , " Metric " } , /* Fixed Length / Subclause 8.2.34 */
{ 54 , " Overload Control Information " } , /* Extendable / Table 7.5.3.4-1 */
{ 55 , " Timer " } , /* Extendable / Subclause 8.2 35 */
2019-05-14 17:12:15 +00:00
{ 56 , " PDR ID " } , /* Extendable / Subclause 8.2 36 */
2017-09-03 13:38:23 +00:00
{ 57 , " F-SEID " } , /* Extendable / Subclause 8.2 37 */
{ 58 , " Application ID's PFDs " } , /* Extendable / Table 7.4.3.1-2 */
{ 59 , " PFD context " } , /* Extendable / Table 7.4.3.1-3 */
{ 60 , " Node ID " } , /* Extendable / Subclause 8.2.38 */
{ 61 , " PFD contents " } , /* Extendable / Subclause 8.2.39 */
{ 62 , " Measurement Method " } , /* Extendable / Subclause 8.2.40 */
{ 63 , " Usage Report Trigger " } , /* Extendable / Subclause 8.2.41 */
{ 64 , " Measurement Period " } , /* Extendable / Subclause 8.2.42 */
{ 65 , " FQ-CSID " } , /* Extendable / Subclause 8.2.43 */
{ 66 , " Volume Measurement " } , /* Extendable / Subclause 8.2.44 */
{ 67 , " Duration Measurement " } , /* Extendable / Subclause 8.2.45 */
{ 68 , " Application Detection Information " } , /* Extendable / Table 7.5.8.3-2 */
{ 69 , " Time of First Packet " } , /* Extendable / Subclause 8.2.46 */
{ 70 , " Time of Last Packet " } , /* Extendable / Subclause 8.2.47 */
{ 71 , " Quota Holding Time " } , /* Extendable / Subclause 8.2.48 */
{ 72 , " Dropped DL Traffic Threshold " } , /* Extendable / Subclause 8.2.49 */
{ 73 , " Volume Quota " } , /* Extendable / Subclause 8.2.50 */
{ 74 , " Time Quota " } , /* Extendable / Subclause 8.2.51 */
{ 75 , " Start Time " } , /* Extendable / Subclause 8.2.52 */
{ 76 , " End Time " } , /* Extendable / Subclause 8.2.53 */
{ 77 , " Query URR " } , /* Extendable / Table 7.5.4.10-1 */
2019-05-14 17:12:15 +00:00
{ 78 , " Usage Report (Session Modification Response) " } , /* Extendable / Table 7.5.5.2-1 */
2017-09-03 13:38:23 +00:00
{ 79 , " Usage Report (Session Deletion Response) " } , /* Extendable / Table 7.5.7.2-1 */
{ 80 , " Usage Report (Session Report Request) " } , /* Extendable / Table 7.5.8.3-1 */
{ 81 , " URR ID " } , /* Extendable / Subclause 8.2.54 */
{ 82 , " Linked URR ID " } , /* Extendable / Subclause 8.2.55 */
{ 83 , " Downlink Data Report " } , /* Extendable / Table 7.5.8.2-1 */
{ 84 , " Outer Header Creation " } , /* Extendable / Subclause 8.2.56 */
{ 85 , " Create BAR " } , /* Extendable / Table 7.5.2.6-1 */
{ 86 , " Update BAR (Session Modification Request) " } , /* Extendable / Table 7.5.4.11-1 */
{ 87 , " Remove BAR " } , /* Extendable / Table 7.5.4.12-1 */
{ 88 , " BAR ID " } , /* Extendable / Subclause 8.2.57 */
{ 89 , " CP Function Features " } , /* Extendable / Subclause 8.2.58 */
{ 90 , " Usage Information " } , /* Extendable / Subclause 8.2.59 */
{ 91 , " Application Instance ID " } , /* Variable Length / Subclause 8.2.60 */
{ 92 , " Flow Information " } , /* Extendable / Subclause 8.2.61 */
{ 93 , " UE IP Address " } , /* Extendable / Subclause 8.2.62 */
{ 94 , " Packet Rate " } , /* Extendable / Subclause 8.2.63 */
{ 95 , " Outer Header Removal " } , /* Extendable / Subclause 8.2.64 */
{ 96 , " Recovery Time Stamp " } , /* Extendable / Subclause 8.2.65 */
{ 97 , " DL Flow Level Marking " } , /* Extendable / Subclause 8.2.66 */
{ 98 , " Header Enrichment " } , /* Extendable / Subclause 8.2.67 */
{ 99 , " Error Indication Report " } , /* Extendable / Table 7.5.8.4-1 */
{ 100 , " Measurement Information " } , /* Extendable / Subclause 8.2.68 */
{ 101 , " Node Report Type " } , /* Extendable / Subclause 8.2.69 */
{ 102 , " User Plane Path Failure Report " } , /* Extendable / Table 7.4.5.1.2-1 */
{ 103 , " Remote GTP-U Peer " } , /* Extendable / Subclause 8.2.70 */
{ 104 , " UR-SEQN " } , /* Fixed Length / Subclause 8.2.71 */
{ 105 , " Update Duplicating Parameters " } , /* Extendable / Table 7.5.4.3-3 */
{ 106 , " Activate Predefined Rules " } , /* Variable Length / Subclause 8.2.72 */
{ 107 , " Deactivate Predefined Rules " } , /* Variable Length / Subclause 8.2.73 */
{ 108 , " FAR ID " } , /* Extendable / Subclause 8.2.74 */
{ 109 , " QER ID " } , /* Extendable / Subclause 8.2.75 */
{ 110 , " OCI Flags " } , /* Extendable / Subclause 8.2.76 */
2018-05-23 21:11:42 +00:00
{ 111 , " PFCP Association Release Request " } , /* Extendable / Subclause 8.2.77 */
2017-09-03 13:38:23 +00:00
{ 112 , " Graceful Release Period " } , /* Extendable / Subclause 8.2.78 */
2017-11-10 09:50:09 +00:00
{ 113 , " PDN Type " } , /* Fixed Length / Subclause 8.2.79 */
2017-11-12 12:51:00 +00:00
{ 114 , " Failed Rule ID " } , /* Extendable / Subclause 8.2.80 */
{ 115 , " Time Quota Mechanism " } , /* Extendable / Subclause 8.2.81 */
{ 116 , " User Plane IP Resource Information " } , /* Extendable / Subclause 8.2.82 */
2018-02-19 10:36:57 +00:00
{ 117 , " User Plane Inactivity Timer " } , /* Extendable / Subclause 8.2.83 */
2018-02-27 23:13:29 +00:00
{ 118 , " Aggregated URRs " } , /* Extendable / Table 7.5.2.4-2 */
{ 119 , " Multiplier " } , /* Fixed Length / Subclause 8.2.84 */
{ 120 , " Aggregated URR ID IE " } , /* Fixed Length / Subclause 8.2.85 */
2018-02-28 20:20:49 +00:00
{ 121 , " Subsequent Volume Quota " } , /* Extendable / Subclause 8.2.86 */
{ 122 , " Subsequent Time Quota " } , /* Extendable / Subclause 8.2.87 */
2018-04-10 15:58:35 +00:00
{ 123 , " RQI " } , /* Extendable / Subclause 8.2.88 */
{ 124 , " QFI " } , /* Extendable / Subclause 8.2.89 */
{ 125 , " Query URR Reference " } , /* Extendable / Subclause 8.2.90 */
{ 126 , " Additional Usage Reports Information " } , /* Extendable / Subclause 8.2.91 */
{ 127 , " Create Traffic Endpoint " } , /* Extendable / Table 7.5.2.7 */
{ 128 , " Created Traffic Endpoint " } , /* Extendable / Table 7.5.3.5 */
{ 129 , " Update Traffic Endpoint " } , /* Extendable / Table 7.5.4.13 */
{ 130 , " Remove Traffic Endpoint " } , /* Extendable / Table 7.5.4.14 */
{ 131 , " Traffic Endpoint ID " } , /* Extendable / Subclause 8.2.92*/
2018-05-04 21:42:09 +00:00
{ 132 , " Ethernet Packet Filter " } , /* Extendable / Table 7.5.2.2-3 */
{ 133 , " MAC address " } , /* Extendable / Subclause 8.2.93 */
{ 134 , " C-TAG " } , /* Extendable / Subclause 8.2.94 */
{ 135 , " S-TAG " } , /* Extendable / Subclause 8.2.95 */
{ 136 , " Ethertype " } , /* Extendable / Subclause 8.2.96 */
{ 137 , " Proxying " } , /* Extendable / Subclause 8.2.97 */
{ 138 , " Ethernet Filter ID " } , /* Extendable / Subclause 8.2.98 */
{ 139 , " Ethernet Filter Properties " } , /* Extendable / Subclause 8.2.99 */
2018-07-11 23:19:26 +00:00
{ 140 , " Suggested Buffering Packets Count " } , /* Extendable / Subclause 8.2.100 */
{ 141 , " User ID " } , /* Extendable / Subclause 8.2.101 */
{ 142 , " Ethernet PDU Session Information " } , /* Extendable / Subclause 8.2.102 */
{ 143 , " Ethernet Traffic Information " } , /* Extendable / Table 7.5.8.3-3 */
{ 144 , " MAC Addresses Detected " } , /* Extendable / Subclause 8.2.103 */
{ 145 , " MAC Addresses Removed " } , /* Extendable / Subclause 8.2.104 */
2018-10-04 16:22:28 +00:00
{ 146 , " Ethernet Inactivity Timer " } , /* Extendable / Subclause 8.2.105 */
{ 147 , " Additional Monitoring Time " } , /* Extendable / Table 7.5.2.4-3 */
2019-01-13 16:17:21 +00:00
{ 148 , " Event Quota " } , /* Extendable / Subclause 8.2.112 */
{ 149 , " Event Threshold " } , /* Extendable / Subclause 8.2.113 */
{ 150 , " Subsequent Event Quota " } , /* Extendable / Subclause 8.2.106 */
{ 151 , " Subsequent Event Threshold " } , /* Extendable / Subclause 8.2.107 */
2018-10-04 16:22:28 +00:00
{ 152 , " Trace Information " } , /* Extendable / Subclause 8.2.108 */
{ 153 , " Framed-Route " } , /* Variable Length / Subclause 8.2.109 */
{ 154 , " Framed-Routing " } , /* Fixed Length / Subclause 8.2.110 */
{ 155 , " Framed-IPv6-Route " } , /* Variable Length / Subclause 8.2.111 */
2019-01-13 16:17:21 +00:00
{ 156 , " Event Time Stamp " } , /* Extendable / Subclause 8.2.114 */
{ 157 , " Averaging Window " } , /* Extendable / Subclause 8.2.115 */
{ 158 , " Paging Policy Indicator " } , /* Extendable / Subclause 8.2.116 */
2019-07-04 22:57:12 +00:00
{ 159 , " APN/DNN " } , /* Variable Length / Subclause 8.2.117 */
{ 160 , " 3GPP Interface Type " } , /* Extendable / Subclause 8.2.118 */
//161 to 32767 Spare. For future use.
2018-07-11 23:19:26 +00:00
//32768 to 65535 Vendor-specific IEs.
2017-09-03 13:38:23 +00:00
{ 0 , NULL }
} ;
static value_string_ext pfcp_ie_type_ext = VALUE_STRING_EXT_INIT ( pfcp_ie_type ) ;
2018-08-13 22:43:30 +00:00
/* PFCP Session funcs*/
static guint32
pfcp_get_frame ( 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 ( wmem_packet_scope ( ) , & 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 ) ;
}
}
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 ) ;
}
}
return FALSE ;
}
static void
pfcp_remove_frame_info ( guint32 * f ) {
/* For each ip node */
wmem_tree_foreach ( pfcp_frame_tree , pfcp_call_foreach_ip , ( void * ) f ) ;
}
static void
pfcp_add_session ( guint32 frame , guint32 session ) {
guint32 * f , * session_count ;
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
pfcp_seid_exists ( guint64 seid , wmem_list_t * seid_list ) {
wmem_list_frame_t * elem ;
guint32 * info ;
gboolean found ;
found = FALSE ;
elem = wmem_list_head ( seid_list ) ;
while ( ! found & & elem ) {
info = ( guint32 * ) wmem_list_frame_data ( elem ) ;
found = * info = = seid ;
elem = wmem_list_frame_next ( elem ) ;
}
return found ;
}
static gboolean
pfcp_ip_exists ( address ip , wmem_list_t * ip_list ) {
wmem_list_frame_t * elem ;
address * info ;
gboolean found ;
found = FALSE ;
elem = wmem_list_head ( ip_list ) ;
while ( ! found & & elem ) {
info = ( address * ) wmem_list_frame_data ( elem ) ;
found = addresses_equal ( info , & ip ) ;
elem = wmem_list_frame_next ( elem ) ;
}
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 ;
GHashTableIter iter ;
guint64 seid ;
gchar * 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 ( ) ) ;
}
/* 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 */
/* We look for its session ID */
session = ( guint32 * ) g_hash_table_lookup ( pfcp_session_table , f ) ;
if ( session ) {
g_hash_table_iter_init ( & iter , pfcp_session_table ) ;
while ( g_hash_table_iter_next ( & iter , ( gpointer * ) & fr , ( gpointer * ) & session_count ) ) {
/* 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 it's the session we are looking for, we remove all the frame information */
pfcp_remove_frame_info ( fr ) ;
}
}
}
}
wmem_list_prepend ( info_list , pfcp_info ) ;
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 ) ;
}
}
2018-08-18 16:20:02 +00:00
static gboolean
2018-08-13 22:43:30 +00:00
pfcp_is_cause_accepted ( guint8 cause ) {
return cause = = 1 ;
}
/* Data structure attached to a conversation
* of a session
*/
typedef struct pfcp_session_conv_info_t {
struct pfcp_session_conv_info_t * next ;
GHashTable * unmatched ;
GHashTable * matched ;
} pfcp_session_conv_info_t ;
static pfcp_session_conv_info_t * pfcp_session_info_items = NULL ;
2018-08-05 17:37:11 +00:00
/* Data structure attached to a conversation,
* to keep track of request / response - pairs
*/
typedef struct pfcp_conv_info_t {
2018-08-13 22:43:30 +00:00
struct pfcp_conv_info_t * next ;
2018-08-05 17:37:11 +00:00
wmem_map_t * unmatched ;
wmem_map_t * matched ;
} pfcp_conv_info_t ;
2018-08-13 22:43:30 +00:00
static pfcp_conv_info_t * pfcp_info_items = NULL ;
2018-08-05 17:37:11 +00:00
/* structure used to track responses to requests using sequence number */
typedef struct pfcp_msg_hash_entry {
gboolean is_request ; /* TRUE/FALSE */
guint32 req_frame ; /* frame with request */
nstime_t req_time ; /* req time */
guint32 rep_frame ; /* frame with reply */
gint seq_nr ; /* sequence number */
guint msgtype ; /* messagetype */
} pfcp_msg_hash_t ;
static guint
pfcp_sn_hash ( gconstpointer k )
{
const pfcp_msg_hash_t * key = ( const pfcp_msg_hash_t * ) k ;
return key - > seq_nr ;
}
static gboolean
pfcp_sn_equal_matched ( gconstpointer k1 , gconstpointer k2 )
{
const pfcp_msg_hash_t * key1 = ( const pfcp_msg_hash_t * ) k1 ;
const pfcp_msg_hash_t * key2 = ( const pfcp_msg_hash_t * ) k2 ;
if ( key1 - > req_frame & & key2 - > req_frame & & ( key1 - > req_frame ! = key2 - > req_frame ) ) {
return 0 ;
}
if ( key1 - > rep_frame & & key2 - > rep_frame & & ( key1 - > rep_frame ! = key2 - > rep_frame ) ) {
return 0 ;
}
return key1 - > seq_nr = = key2 - > seq_nr ;
}
static gboolean
pfcp_sn_equal_unmatched ( gconstpointer k1 , gconstpointer k2 )
{
const pfcp_msg_hash_t * key1 = ( const pfcp_msg_hash_t * ) k1 ;
const pfcp_msg_hash_t * key2 = ( const pfcp_msg_hash_t * ) k2 ;
return key1 - > seq_nr = = key2 - > seq_nr ;
}
2017-09-03 13:38:23 +00:00
static void
2018-08-13 22:43:30 +00:00
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 ;
proto_item * it ;
/* PFCP session */
if ( tree ) {
session = ( guint32 * ) g_hash_table_lookup ( pfcp_session_table , & pinfo - > num ) ;
if ( session ) {
it = proto_tree_add_uint ( tree , hf_pfcp_session , tvb , 0 , 0 , * session ) ;
2019-04-03 21:32:30 +00:00
proto_item_set_generated ( it ) ;
2018-08-13 22:43:30 +00:00
}
}
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 ) ;
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 ( ( 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 ) ;
}
}
if ( pfcp_hdr - > message = = PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST ) {
/* If SEREQ and not already in the list then we create a new session*/
pfcp_add_session ( pinfo - > num , pfcp_session_count + + ) ;
}
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 - > dst , ( guint32 ) 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 ) {
/* 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 ) ;
}
}
}
}
}
}
static void
dissect_pfcp_reserved ( 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_ )
2017-09-03 13:38:23 +00:00
{
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_reserved , tvb , 0 , length ) ;
}
2019-01-13 16:17:21 +00:00
/* Functions for C-Tag and S-TAG
* See 8.2 .94 and 8.2 .95
*/
/* From Tables G-2,3 of IEEE standard 802.1Q-2005 (and I-2,3,7 of 2011 and 2015 revisions) */
static const value_string pfcp_vlan_tag_pcp_vals [ ] = {
{ 0 , " Best Effort (default), Drop Eligible " } ,
{ 1 , " Best Effort (default) " } ,
{ 2 , " Critical Applications, Drop Eligible " } ,
{ 3 , " Critical Applications " } ,
{ 4 , " Voice, < 10ms latency and jitter, Drop Eligible " } ,
{ 5 , " Voice, < 10ms latency and jitter " } ,
{ 6 , " Internetwork Control " } ,
{ 7 , " Network Control " } ,
{ 0 , NULL }
} ;
static const true_false_string tfs_eligible_ineligible = {
" Eligible " ,
" Ineligible "
} ;
static int decode_pfcp_c_tag ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item _U_ , gint offset )
{
guint64 flags_val ;
static const int * pfcp_c_tag_flags [ ] = {
& hf_pfcp_spare_b7_b3 ,
& hf_pfcp_c_tag_flags_b2_vid ,
& hf_pfcp_c_tag_flags_b1_dei ,
& hf_pfcp_c_tag_flags_b0_pcp ,
NULL
} ;
/* Octet 5 Spare VID DEI PCP */
proto_tree_add_bitmask_with_flags_ret_uint64 ( 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 , & flags_val ) ;
offset + = 1 ;
// Octet 8 7 6 5 4 3 2 1
// 6 | C-VID |DEI| PCP value |
proto_tree_add_item ( tree , hf_pfcp_c_tag_cvid , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_bitmask_with_flags ( tree , tvb , offset , hf_pfcp_c_tag_dei_flag ,
ett_pfcp_c_tag_dei , pfcp_c_tag_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS ) ;
proto_tree_add_item ( tree , hf_pfcp_c_tag_pcp_value , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
// Octet 7 C-VID value
proto_tree_add_item ( tree , hf_pfcp_c_tag_cvid_value , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
return offset ;
}
static int decode_pfcp_s_tag ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item _U_ , guint offset )
{
guint64 flags_val ;
static const int * pfcp_s_tag_flags [ ] = {
& hf_pfcp_spare_b7_b3 ,
& hf_pfcp_s_tag_flags_b2_vid ,
& hf_pfcp_s_tag_flags_b1_dei ,
& hf_pfcp_s_tag_flags_b0_pcp ,
NULL
} ;
/* Octet 5 Spare VID DEI PCP */
proto_tree_add_bitmask_with_flags_ret_uint64 ( 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 , & flags_val ) ;
offset + = 1 ;
// Octet 8 7 6 5 4 3 2 1
// 6 | S-VID |DEI| PCP value |
proto_tree_add_item ( tree , hf_pfcp_s_tag_svid , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_bitmask_with_flags ( tree , tvb , offset , hf_pfcp_s_tag_dei_flag ,
ett_pfcp_s_tag_dei , pfcp_s_tag_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS ) ;
proto_tree_add_item ( tree , hf_pfcp_s_tag_pcp_value , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
// Octet 7 S-VID value
proto_tree_add_item ( tree , hf_pfcp_s_tag_svid_value , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
return offset ;
}
2017-09-03 13:38:23 +00:00
/*
* 8.2 .1 Cause
*/
2017-09-04 11:40:00 +00:00
static const value_string pfcp_cause_vals [ ] = {
{ 0 , " Reserved " } ,
{ 1 , " Request accepted(success) " } ,
2017-11-13 09:27:46 +00:00
/* 2 - 63 Spare. */
2017-09-04 11:40:00 +00:00
{ 64 , " Request rejected(reason not specified) " } ,
{ 65 , " Session context not found " } ,
{ 66 , " Mandatory IE missing " } ,
{ 67 , " Conditional IE missing " } ,
{ 68 , " Invalid length " } ,
{ 69 , " Mandatory IE incorrect " } ,
{ 70 , " Invalid Forwarding Policy " } ,
{ 71 , " Invalid F - TEID allocation option " } ,
2018-05-23 21:11:42 +00:00
{ 72 , " No established PFCP Association " } ,
2017-09-04 11:40:00 +00:00
{ 73 , " Rule creation / modification Failure " } ,
{ 74 , " PFCP entity in congestion " } ,
{ 75 , " No resources available " } ,
{ 76 , " Service not supported " } ,
{ 77 , " System failure " } ,
2017-11-13 09:27:46 +00:00
/* 78 to 255 Spare for future use in a response message. */
2017-09-04 11:40:00 +00:00
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_cause ( 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 )
2017-09-04 11:40:00 +00:00
{
2018-02-28 21:51:36 +00:00
guint32 value ;
2017-09-04 11:40:00 +00:00
/* Octet 5 Cause value */
2018-02-28 21:51:36 +00:00
proto_tree_add_item_ret_uint ( tree , hf_pfcp2_cause , tvb , 0 , 1 , ENC_BIG_ENDIAN , & value ) ;
2018-08-13 22:43:30 +00:00
if ( g_pfcp_session ) {
args - > last_cause = ( guint8 ) value ;
}
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " %s " , val_to_str_const ( value , pfcp_cause_vals , " Unknown " ) ) ;
2017-09-04 11:40:00 +00:00
}
2018-07-11 23:19:26 +00:00
2017-09-03 13:38:23 +00:00
/*
* 8.2 .2 Source Interface
*/
2017-09-05 15:22:14 +00:00
static const value_string pfcp_source_interface_vals [ ] = {
{ 0 , " Access " } ,
{ 1 , " Core " } ,
2018-10-04 16:22:28 +00:00
{ 2 , " SGi-LAN/N6-LAN " } ,
2017-09-05 15:22:14 +00:00
{ 3 , " CP-function " } ,
{ 0 , NULL }
} ;
2018-07-11 23:19:26 +00:00
static int
decode_pfcp_source_interface ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item , gint offset )
2017-09-05 15:22:14 +00:00
{
guint32 value ;
/* Octet 5 Spare Interface value */
proto_tree_add_item ( tree , hf_pfcp_spare_h1 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item_ret_uint ( tree , hf_pfcp_source_interface , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
offset + = 1 ;
proto_item_append_text ( item , " %s " , val_to_str_const ( value , pfcp_source_interface_vals , " Unknown " ) ) ;
2018-07-11 23:19:26 +00:00
return offset ;
}
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_source_interface ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2018-07-11 23:19:26 +00:00
{
int offset = 0 ;
offset = decode_pfcp_source_interface ( tvb , pinfo , tree , item , offset ) ;
2017-09-05 15:22:14 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2018-07-11 23:19:26 +00:00
2017-11-09 10:34:19 +00:00
/*
2017-09-04 11:40:00 +00:00
* 8.2 .3 F - TEID
2017-09-03 13:38:23 +00:00
*/
2017-09-05 15:22:14 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_f_teid ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-05 15:22:14 +00:00
{
int offset = 0 ;
guint64 fteid_flags_val ;
static const int * pfcp_fteid_flags [ ] = {
& hf_pfcp_fteid_flg_spare ,
2017-11-09 10:34:19 +00:00
& hf_pfcp_fteid_flg_b3_ch_id ,
2017-09-05 15:22:14 +00:00
& hf_pfcp_fteid_flg_b2_ch ,
& hf_pfcp_fteid_flg_b1_v6 ,
& hf_pfcp_fteid_flg_b0_v4 ,
NULL
} ;
2017-11-11 14:41:12 +00:00
/* Octet 5 Spare Spare Spare Spare CHID CH V6 V4*/
2017-09-05 15:22:14 +00:00
proto_tree_add_bitmask_with_flags_ret_uint64 ( tree , tvb , offset , hf_pfcp_f_teid_flags ,
2017-09-06 15:38:12 +00:00
ett_f_teid_flags , pfcp_fteid_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS , & fteid_flags_val ) ;
2017-09-05 15:22:14 +00:00
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 ,
* otherwise the IPv4 address field shall not be present .
* Bit 2 - V6 : If this bit is set to " 1 " and the CH bit is not set , then the IPv6 address field shall be present ,
* otherwise the IPv6 address field shall not be present .
* Bit 3 - CH ( CHOOSE ) : If this bit is set to " 1 " , then the TEID , IPv4 address and IPv6 address fields shall not be
* present and the UP function shall assign an F - TEID with an IP4 or an IPv6 address if the V4 or V6 bit is set respectively .
2017-11-09 10:34:19 +00:00
* This bit shall only be set by the CP function .
* Bit 4 - CHID ( CHOOSE_ID ) : If this bit is set to " 1 " , then the UP function shall assign the same F - TEID to the
2018-05-23 21:11:42 +00:00
* PDRs requested to be created in a PFCP Session Establishment Request or PFCP Session Modification Request with
2017-11-09 10:34:19 +00:00
* the same CHOOSE ID value .
* This bit may only be set to " 1 " if the CH bit is set to " 1 " .
* This bit shall only be set by the CP function .
2017-09-05 15:22:14 +00:00
*/
2017-11-09 10:34:19 +00:00
if ( ( fteid_flags_val & 0x4 ) = = 4 ) {
if ( ( fteid_flags_val & 0x8 ) = = 8 ) {
proto_tree_add_item ( tree , hf_pfcp_f_teid_ch_id , tvb , offset , 1 , ENC_NA ) ;
offset + = 1 ;
}
} else {
2017-11-11 14:41:12 +00:00
/* Octet 6 to 9 TEID */
proto_tree_add_item ( tree , hf_pfcp_f_teid_teid , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " TEID: 0x%s " , tvb_bytes_to_str ( wmem_packet_scope ( ) , tvb , offset , 4 ) ) ;
2017-11-11 14:41:12 +00:00
offset + = 4 ;
2017-11-09 10:34:19 +00:00
if ( ( fteid_flags_val & 0x1 ) = = 1 ) {
/* m to (m+3) IPv4 address */
proto_tree_add_item ( tree , hf_pfcp_f_teid_ipv4 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " , IPv4 %s " , tvb_ip_to_str ( tvb , offset ) ) ;
2017-11-09 10:34:19 +00:00
offset + = 4 ;
}
if ( ( fteid_flags_val & 0x2 ) = = 2 ) {
/* p to (p+15) IPv6 address */
proto_tree_add_item ( tree , hf_pfcp_f_teid_ipv6 , tvb , offset , 16 , ENC_NA ) ;
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " , IPv6 %s " , tvb_ip6_to_str ( tvb , offset ) ) ;
2017-11-09 10:34:19 +00:00
offset + = 16 ;
}
/* If the value of CH bit is set to "0", but the value of CHID bit is "1" */
if ( ( fteid_flags_val & 0x8 ) = = 8 ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_encoding_error , tvb , 0 , 1 ) ;
}
2017-09-05 15:22:14 +00:00
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-03 13:38:23 +00:00
/*
2017-11-12 12:51:00 +00:00
* 8.2 .4 Network Instance
2017-09-03 13:38:23 +00:00
*/
2018-05-03 21:09:31 +00:00
static int
decode_pfcp_network_instance ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item _U_ , gint offset , int length )
{
int name_len ;
2018-07-05 12:08:59 +00:00
if ( length > 0 ) {
name_len = tvb_get_guint8 ( tvb , offset ) ;
if ( name_len < 0x41 ) {
/* APN */
guint8 * apn = NULL ;
int tmp ;
2018-05-03 21:09:31 +00:00
name_len = tvb_get_guint8 ( tvb , offset ) ;
if ( name_len < 0x20 ) {
apn = tvb_get_string_enc ( wmem_packet_scope ( ) , 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 ] = ' . ' ;
}
} else {
apn = tvb_get_string_enc ( wmem_packet_scope ( ) , tvb , offset , length , ENC_ASCII ) ;
}
proto_tree_add_string ( tree , hf_pfcp_network_instance , tvb , offset , length , apn ) ;
2019-01-24 14:40:38 +00:00
proto_item_append_text ( item , " %s " , apn ) ;
2018-05-03 21:09:31 +00:00
} else {
/* Domain name*/
2019-01-24 14:40:38 +00:00
const guint8 * string_value ;
proto_tree_add_item_ret_string ( tree , hf_pfcp_network_instance , tvb , offset , length , ENC_ASCII | ENC_NA , wmem_packet_scope ( ) , & string_value ) ;
proto_item_append_text ( item , " %s " , string_value ) ;
2018-05-03 21:09:31 +00:00
}
}
return offset + length ;
}
2017-09-05 15:22:14 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_network_instance ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-05 15:22:14 +00:00
{
2018-05-03 21:09:31 +00:00
int offset = 0 ;
/* Octet 5 Network Instance
* The Network instance field shall be encoded as an OctetString and shall contain an identifier
* which uniquely identifies a particular Network instance ( e . g . PDN instance ) in the UP function .
* It may be encoded as a Domain Name or an Access Point Name ( APN )
2017-09-05 15:22:14 +00:00
*/
2018-05-03 21:09:31 +00:00
/* Test for Printable character or length indicator(APN), assume first character of Domain name >= 0x41 */
decode_pfcp_network_instance ( tvb , pinfo , tree , item , offset , length ) ;
2017-09-05 15:22:14 +00:00
}
2018-05-03 21:09:31 +00:00
2017-09-03 13:38:23 +00:00
/*
* 8.2 .5 SDF Filter
2017-09-05 15:22:14 +00:00
*/
2017-09-06 15:38:12 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_sdf_filter ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-06 15:38:12 +00:00
{
int offset = 0 ;
guint64 flags_val ;
guint32 fd_length ;
2018-07-11 23:19:26 +00:00
proto_tree * flow_desc_tree , * tos_tree , * spi_tree , * flow_label_tree , * sdf_filter_id_tree ;
2017-09-06 15:38:12 +00:00
static const int * pfcp_sdf_filter_flags [ ] = {
& hf_pfcp_spare_h1 ,
2018-07-11 23:19:26 +00:00
& hf_pfcp_sdf_filter_flags_b4_bid ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_sdf_filter_flags_b3_fl ,
& hf_pfcp_sdf_filter_flags_b2_spi ,
& hf_pfcp_sdf_filter_flags_b1_ttc ,
& hf_pfcp_sdf_filter_flags_b0_fd ,
2017-09-06 15:38:12 +00:00
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 ) ;
offset + = 1 ;
/* Octet 6 Spare*/
proto_tree_add_item ( tree , hf_pfcp_spare , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
if ( ( flags_val & 0x1 ) = = 1 ) {
/* FD (Flow Description): If this bit is set to "1",
* then the Length of Flow Description and the Flow Description fields shall be present
*/
2018-02-22 21:28:25 +00:00
flow_desc_tree = proto_item_add_subtree ( item , ett_pfcp_flow_desc ) ;
2018-04-09 11:55:07 +00:00
/* m to (m+1) Length of Flow Description */
2018-02-22 21:28:25 +00:00
proto_tree_add_item_ret_uint ( flow_desc_tree , hf_pfcp_flow_desc_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & fd_length ) ;
2017-09-18 15:20:36 +00:00
offset + = 2 ;
2017-09-06 15:38:12 +00:00
/* Flow Description
* The Flow Description field , when present , shall be encoded as an OctetString
* as specified in subclause 5.4 .2 of 3 GPP TS 29.212
*/
2018-02-22 21:28:25 +00:00
proto_tree_add_item ( flow_desc_tree , hf_pfcp_flow_desc , tvb , offset , fd_length , ENC_ASCII | ENC_NA ) ;
2017-09-06 15:38:12 +00:00
offset + = fd_length ;
}
if ( ( flags_val & 0x2 ) = = 2 ) {
/* TTC (ToS Traffic Class): If this bit is set to "1", then the ToS Traffic Class field shall be present */
/* ToS Traffic Class field, when present, shall be encoded as an OctetString on two octets
* as specified in subclause 5.3 .15 of 3 GPP TS 29.212
*/
2018-02-22 21:28:25 +00:00
tos_tree = proto_item_add_subtree ( item , ett_pfcp_tos ) ;
proto_tree_add_item ( tos_tree , hf_pfcp_traffic_class , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2018-02-22 20:54:52 +00:00
offset + = 1 ;
2018-02-22 21:28:25 +00:00
proto_tree_add_item ( tos_tree , hf_pfcp_traffic_mask , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2018-02-22 20:54:52 +00:00
offset + = 1 ;
2017-09-06 15:38:12 +00:00
}
if ( ( flags_val & 0x4 ) = = 4 ) {
/* SPI (The Security Parameter Index) field, when present, shall be encoded as an OctetString on four octets and shall
* contain the IPsec security parameter index ( which is a 32 - bit field ) ,
* as specified in subclause 5.3 .51 of 3 GPP TS 29.212
*/
2018-02-22 21:28:25 +00:00
spi_tree = proto_item_add_subtree ( item , ett_pfcp_spi ) ;
proto_tree_add_item ( spi_tree , hf_pfcp_spi , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
2017-09-06 15:38:12 +00:00
offset + = 4 ;
}
if ( ( flags_val & 0x8 ) = = 8 ) {
/* FL (Flow Label), when present, shall be encoded as an OctetString on 3 octets as specified in
* subclause 5.3 .52 of 3 GPP TS 29.212 and shall contain an IPv6 flow label ( which is a 20 - bit field ) .
* The bits 8 to 5 of the octet " v " shall be spare and set to zero , and the remaining 20 bits shall
* contain the IPv6 flow label . */
2018-02-22 21:28:25 +00:00
flow_label_tree = proto_item_add_subtree ( item , ett_pfcp_flow_label ) ;
proto_tree_add_bits_item ( flow_label_tree , hf_pfcp_flow_label_spare_bit , tvb , ( offset < < 3 ) , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( flow_label_tree , hf_pfcp_flow_label , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
2017-11-13 09:27:46 +00:00
offset + = 3 ;
2017-09-06 15:38:12 +00:00
}
2018-07-11 23:19:26 +00:00
if ( ( flags_val & 0x10 ) = = 16 ) {
/* The SDF Filter ID, when present, shall be encoded as an Unsigned32 binary integer value.
* It shall uniquely identify an SDF Filter among all the SDF Filters provisioned for a given PFCP Session . */
sdf_filter_id_tree = proto_item_add_subtree ( item , ett_pfcp_sdf_filter_id ) ;
proto_tree_add_item ( sdf_filter_id_tree , hf_pfcp_sdf_filter_id , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
}
2017-09-06 15:38:12 +00:00
2017-11-13 09:27:46 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
2017-09-06 15:38:12 +00:00
}
2017-09-05 15:22:14 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .6 Application ID
2017-09-05 15:22:14 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_application_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_ )
2017-09-05 15:22:14 +00:00
{
int offset = 0 ;
2019-01-24 14:40:38 +00:00
2017-09-06 15:38:12 +00:00
/* Octet 5 to (n+4) Application Identifier
* The Application Identifier shall be encoded as an OctetString ( see 3 GPP TS 29.212 )
2017-09-05 15:22:14 +00:00
*/
2019-01-24 14:40:38 +00:00
if ( tvb_ascii_isprint ( tvb , offset , length ) )
{
const guint8 * string_value ;
proto_tree_add_item_ret_string ( tree , hf_pfcp_application_id_str , tvb , offset , length , ENC_ASCII | ENC_NA , wmem_packet_scope ( ) , & string_value ) ;
proto_item_append_text ( item , " %s " , string_value ) ;
}
else
{
proto_tree_add_item ( tree , hf_pfcp_application_id , tvb , offset , length , ENC_NA ) ;
}
2017-09-05 15:22:14 +00:00
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .7 Gate Status
2017-09-05 15:22:14 +00:00
*/
2017-09-13 15:22:05 +00:00
static const value_string pfcp_gate_status_vals [ ] = {
{ 0 , " OPEN " } ,
{ 1 , " CLOSED " } ,
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_gate_status ( 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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
static const int * pfcp_gate_status_flags [ ] = {
& hf_pfcp_gate_status_b3b2_ulgate ,
& hf_pfcp_gate_status_b0b1_dlgate ,
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 ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-05 15:22:14 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .8 MBR
2017-09-05 15:22:14 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_mbr ( 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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
2017-11-10 09:50:09 +00:00
int len1 = ( length ! = 10 ) ? length / 2 : 5 ;
/* In case length is not in accordance with documentation */
if ( length ! = 10 ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_encoding_error , tvb , 0 , 1 ) ;
}
2017-09-13 15:22:05 +00:00
/* 5 to 9 UL MBR
* The UL / DL MBR fields shall be encoded as kilobits per second ( 1 kbps = 1000 bps ) in binary value
*/
2017-11-10 09:50:09 +00:00
proto_tree_add_item ( tree , hf_pfcp_ul_mbr , tvb , offset , len1 , ENC_BIG_ENDIAN ) ;
offset + = len1 ;
2017-09-13 15:22:05 +00:00
/* 10 to 14 DL MBR */
2017-11-10 09:50:09 +00:00
proto_tree_add_item ( tree , hf_pfcp_dl_mbr , tvb , offset , len1 , ENC_BIG_ENDIAN ) ;
offset + = len1 ;
2017-09-13 15:22:05 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-05 15:22:14 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .9 GBR
2017-09-05 15:22:14 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_gbr ( 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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
2017-11-10 09:50:09 +00:00
int len1 = ( length ! = 10 ) ? length / 2 : 5 ;
/* In case length is not in accordance with documentation */
if ( length ! = 10 ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_encoding_error , tvb , 0 , 1 ) ;
}
/* 5 to 9 UL GBR
2017-09-13 15:22:05 +00:00
* The UL / DL MBR fields shall be encoded as kilobits per second ( 1 kbps = 1000 bps ) in binary value
*/
2017-11-10 09:50:09 +00:00
proto_tree_add_item ( tree , hf_pfcp_ul_gbr , tvb , offset , len1 , ENC_BIG_ENDIAN ) ;
offset + = len1 ;
2017-09-13 15:22:05 +00:00
2017-11-10 09:50:09 +00:00
/* 10 to 14 DL GBR */
proto_tree_add_item ( tree , hf_pfcp_dl_gbr , tvb , offset , len1 , ENC_BIG_ENDIAN ) ;
offset + = len1 ;
2017-09-13 15:22:05 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-05 15:22:14 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .10 QER Correlation ID
2017-09-05 15:22:14 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_qer_correlation_id ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint32 value ;
/* 5 to 8 QER Correlation ID value */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_qer_correlation_id , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-05 15:22:14 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .11 Precedence
2017-09-05 15:22:14 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_precedence ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-05 15:22:14 +00:00
{
int offset = 0 ;
guint32 value ;
/* Octet 5 5 to 8 Precedence value */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_precedence , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-11-12 12:51:00 +00:00
* 8.2 .12 Transport Level Marking
2017-09-13 07:30:48 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_transport_level_marking ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item _U_ , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
2018-04-09 11:55:07 +00:00
/* Octet 5 to 6 ToS/Traffic Class
2017-09-13 15:22:05 +00:00
* The ToS / Traffic Class shall be encoded on two octets as an OctetString .
* The first octet shall contain the IPv4 Type - of - Service or the IPv6 Traffic - Class field and the second octet shall contain the ToS / Traffic Class mask field
*/
2018-02-22 22:12:15 +00:00
proto_tree_add_item ( tree , hf_pfcp_traffic_class , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( tree , hf_pfcp_traffic_mask , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
2017-09-13 15:22:05 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-13 07:30:48 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .13 Volume Threshold
2017-09-13 07:30:48 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_volume_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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint64 flags_val ;
static const int * pfcp_volume_threshold_flags [ ] = {
& hf_pfcp_spare_b7_b3 ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_volume_threshold_b2_dlvol ,
& hf_pfcp_volume_threshold_b1_ulvol ,
& hf_pfcp_volume_threshold_b0_tovol ,
2017-09-13 15:22:05 +00:00
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 ) ;
offset + = 1 ;
/* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value.
* They shall contain the total , uplink or downlink number of octets respectively .
*/
if ( ( flags_val & 0x1 ) = = 1 ) {
/* m to (m+7) Total Volume
* TOVOL : If this bit is set to " 1 " , then the Total Volume field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_volume_threshold_tovol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( ( flags_val & 0x2 ) = = 2 ) {
2018-04-09 11:55:07 +00:00
/* p to (p+7) Uplink Volume
2017-09-13 15:22:05 +00:00
* ULVOL : If this bit is set to " 1 " , then the Uplink Volume field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_volume_threshold_ulvol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( ( flags_val & 0x4 ) = = 4 ) {
/* q to (q+7) Downlink Volume
* DLVOL : If this bit is set to " 1 " , then the Downlink Volume field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_volume_threshold_dlvol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-13 07:30:48 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .14 Time Threshold
2017-09-13 15:22:05 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_time_threshold ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint value ;
2018-04-09 11:55:07 +00:00
/* Octet 5 to 8 Time Threshold
2017-09-13 15:22:05 +00:00
* The Time Threshold field shall be encoded as an Unsigned32 binary integer value .
* It shall contain the duration in seconds .
*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_time_threshold , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u s " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .15 Monitoring Time
2017-09-13 15:22:05 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_monitoring_time ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-13 15:22:05 +00:00
{
const gchar * time_str ;
int offset = 0 ;
/* The Monitoring Time field shall indicate the monitoring time in UTC time.
* Octets 5 to 8 shall be encoded in the same format as the first four octets
* of the 64 - bit timestamp format as defined in section 6 of IETF RFC 5905.
*/
time_str = tvb_ntp_fmt_ts_sec ( tvb , 0 ) ;
proto_tree_add_string ( tree , hf_pfcp_monitoring_time , tvb , offset , 4 , time_str ) ;
proto_item_append_text ( item , " %s " , time_str ) ;
offset + = 4 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .16 Subsequent Volume Threshold
2017-09-13 15:22:05 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_subseq_volume_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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint64 flags_val ;
static const int * pfcp_subseq_volume_threshold_flags [ ] = {
& hf_pfcp_spare_b7_b3 ,
& hf_pfcp_subseq_volume_threshold_b2_dlvol ,
& hf_pfcp_subseq_volume_threshold_b1_ulvol ,
& hf_pfcp_subseq_volume_threshold_b0_tovol ,
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 ) ;
offset + = 1 ;
/* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value.
* They shall contain the total , uplink or downlink number of octets respectively .
*/
if ( ( flags_val & 0x1 ) = = 1 ) {
/* m to (m+7) Total Volume
* TOVOL : If this bit is set to " 1 " , then the Total Volume field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_subseq_volume_threshold_tovol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( ( flags_val & 0x2 ) = = 2 ) {
2018-04-09 11:55:07 +00:00
/* p to (p+7) Uplink Volume
2017-09-13 15:22:05 +00:00
* ULVOL : If this bit is set to " 1 " , then the Uplink Volume field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_subseq_volume_threshold_ulvol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( ( flags_val & 0x4 ) = = 4 ) {
/* q to (q+7) Downlink Volume
* DLVOL : If this bit is set to " 1 " , then the Downlink Volume field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_subseq_volume_threshold_dlvol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .17 Subsequent Time Threshold
2017-09-13 15:22:05 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_subsequent_time_threshold ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint32 value ;
/* 5 to 8 Subsequent Time Threshold */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_subsequent_time_threshold , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u s " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .18 Inactivity Detection Time
2017-09-13 15:22:05 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_inactivity_detection_time ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint32 value ;
/* 5 to 8 Inactivity Detection Time */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_inactivity_detection_time , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u s " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .19 Reporting Triggers
2017-09-13 07:30:48 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_reporting_triggers ( 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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
2018-02-26 23:44:26 +00:00
static const int * pfcp_reporting_triggers_o5_flags [ ] = {
& hf_pfcp_reporting_triggers_o5_b7_liusa ,
& hf_pfcp_reporting_triggers_o5_b6_droth ,
& hf_pfcp_reporting_triggers_o5_b5_stopt ,
& hf_pfcp_reporting_triggers_o5_b4_start ,
& hf_pfcp_reporting_triggers_o5_b3_quhti ,
& hf_pfcp_reporting_triggers_o5_b2_timth ,
& hf_pfcp_reporting_triggers_o5_b1_volth ,
& hf_pfcp_reporting_triggers_o5_b0_perio ,
NULL
} ;
2019-01-13 16:17:21 +00:00
/* Octet 5 [Bits 15-08] LIUSA DROTH STOPT START QUHTI TIMTH VOLTH PERIO */
proto_tree_add_bitmask_list ( tree , tvb , offset , 1 , pfcp_reporting_triggers_o5_flags , ENC_BIG_ENDIAN ) ;
offset + + ;
if ( offset = = length ) {
return ;
}
2018-02-26 23:44:26 +00:00
static const int * pfcp_reporting_triggers_o6_flags [ ] = {
2018-10-04 16:22:28 +00:00
& hf_pfcp_spare_b7_b5 ,
2019-01-13 16:17:21 +00:00
& hf_pfcp_reporting_triggers_o6_b5_evequ ,
2018-10-04 16:22:28 +00:00
& hf_pfcp_reporting_triggers_o6_b4_eveth ,
2018-07-11 23:19:26 +00:00
& hf_pfcp_reporting_triggers_o6_b3_macar ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_reporting_triggers_o6_b2_envcl ,
& hf_pfcp_reporting_triggers_o6_b1_timqu ,
& hf_pfcp_reporting_triggers_o6_b0_volqu ,
2017-09-13 15:22:05 +00:00
NULL
} ;
2019-01-13 16:17:21 +00:00
/* Octet 6 [Bits 07-00] SPARE SPARE EVEQU EVETH MACAR ENVCL TIMQU VOLQU */
2018-10-04 10:56:13 +00:00
proto_tree_add_bitmask_list ( tree , tvb , offset , 1 , pfcp_reporting_triggers_o6_flags , ENC_BIG_ENDIAN ) ;
2018-02-26 23:44:26 +00:00
offset + + ;
2017-09-13 15:22:05 +00:00
2019-01-13 16:17:21 +00:00
if ( offset = = length ) {
return ;
}
2017-09-13 15:22:05 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-13 07:30:48 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .20 Redirect Information
2017-09-13 07:30:48 +00:00
*/
static const value_string pfcp_redirect_address_type_vals [ ] = {
{ 0 , " IPv4 address " } ,
{ 1 , " IPv6 address " } ,
{ 2 , " URL " } ,
{ 3 , " SIP URI " } ,
2019-07-04 22:57:12 +00:00
{ 4 , " IPv4 and IPv6 addresses " } ,
2017-09-13 07:30:48 +00:00
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
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_ )
2017-09-13 07:30:48 +00:00
{
int offset = 0 ;
guint32 value , 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 ) ;
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 ;
2019-07-04 22:57:12 +00:00
/* 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 .
*/
/* p-(p+1) Other Redirect Server Address Length=b */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_redirect_server_addr_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & addr_len ) ;
offset + = 2 ;
/* (p+2)-(p+2+b-1) Other Redirect Server Address */
2017-09-13 07:30:48 +00:00
proto_tree_add_item ( tree , hf_pfcp_redirect_server_address , tvb , offset , addr_len , ENC_UTF_8 | ENC_NA ) ;
offset + = addr_len ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .21 Report Type
2017-09-13 07:30:48 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
static const int * pfcp_report_type_flags [ ] = {
2018-02-27 21:47:17 +00:00
& hf_pfcp_spare_b7_b4 ,
& hf_pfcp_report_type_b3_upir ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_report_type_b2_erir ,
& hf_pfcp_report_type_b1_usar ,
& hf_pfcp_report_type_b0_dldr ,
2017-09-13 15:22:05 +00:00
NULL
} ;
2018-02-27 21:47:17 +00:00
/* Octet 5 Spare UPIR ERIR USAR DLDR */
2017-09-13 15:22:05 +00:00
proto_tree_add_bitmask_with_flags ( tree , tvb , offset , hf_pfcp_report_type ,
ett_pfcp_report_type , pfcp_report_type_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-13 07:30:48 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .22 Offending IE
2017-09-13 07:30:48 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_offending_ie ( 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_ )
2017-09-13 15:22:05 +00:00
{
guint32 value ;
/* Octet 5 to 6 Type of the offending IE */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_offending_ie , tvb , 0 , 2 , ENC_BIG_ENDIAN , & value ) ;
proto_item_append_text ( item , " %s " , val_to_str_const ( value , pfcp_ie_type , " Unknown " ) ) ;
}
2017-09-13 07:30:48 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .23 Forwarding Policy
2017-09-13 07:30:48 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_forwarding_policy ( 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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint32 id_len ;
/* Octet Forwarding Policy Identifier Length */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_forwarding_policy_id_len , tvb , offset , 1 , ENC_BIG_ENDIAN , & id_len ) ;
offset + = 1 ;
proto_tree_add_item ( tree , hf_pfcp_forwarding_policy_id , tvb , offset , id_len , ENC_NA ) ;
offset + = id_len ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-13 07:30:48 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .24 Destination Interface
2017-09-13 07:30:48 +00:00
*/
static const value_string pfcp_dst_interface_vals [ ] = {
{ 0 , " Access " } ,
{ 1 , " Core " } ,
2018-10-04 16:22:28 +00:00
{ 2 , " SGi-LAN/N6-LAN " } ,
2017-09-13 07:30:48 +00:00
{ 3 , " CP- Function " } ,
{ 4 , " LI Function " } ,
{ 0 , NULL }
} ;
2019-07-04 22:57:12 +00:00
static int
decode_pfcp_destination_interface ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item _U_ , gint offset , int length )
2017-09-13 07:30:48 +00:00
{
guint32 value ;
2018-04-09 11:55:07 +00:00
/* Octet 5 Spare Interface value*/
2017-09-13 07:30:48 +00:00
proto_tree_add_item ( tree , hf_pfcp_spare_h1 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item_ret_uint ( tree , hf_pfcp_dst_interface , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
offset + + ;
proto_item_append_text ( item , " %s " , val_to_str_const ( value , pfcp_dst_interface_vals , " Unknown " ) ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
2019-07-04 22:57:12 +00:00
return length ;
}
static void
dissect_pfcp_destination_interface ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
{
int offset = 0 ;
decode_pfcp_destination_interface ( tvb , pinfo , tree , item , offset , length ) ;
2017-09-13 07:30:48 +00:00
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .25 UP Function Features
2017-09-11 07:26:21 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_up_function_features ( 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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
2018-02-26 23:44:26 +00:00
static const int * pfcp_up_function_features_o5_flags [ ] = {
& hf_pfcp_up_function_features_o5_b7_treu ,
& hf_pfcp_up_function_features_o5_b6_heeu ,
& hf_pfcp_up_function_features_o5_b5_pfdm ,
& hf_pfcp_up_function_features_o5_b4_ftup ,
& hf_pfcp_up_function_features_o5_b3_trst ,
& hf_pfcp_up_function_features_o5_b2_dlbd ,
& hf_pfcp_up_function_features_o5_b1_ddnd ,
& hf_pfcp_up_function_features_o5_b0_bucp ,
NULL
} ;
2019-05-14 17:12:15 +00:00
/* Octet 5 TREU HEEU PFDM FTUP TRST DLBD DDND BUCP */
proto_tree_add_bitmask_list ( tree , tvb , offset , 1 , pfcp_up_function_features_o5_flags , ENC_BIG_ENDIAN ) ;
offset + + ;
if ( offset = = length ) {
return ;
}
2018-02-26 23:44:26 +00:00
static const int * pfcp_up_function_features_o6_flags [ ] = {
2019-05-14 17:12:15 +00:00
& hf_pfcp_spare_b7 ,
& hf_pfcp_up_function_features_o6_b6_pfde ,
2018-10-04 16:22:28 +00:00
& hf_pfcp_up_function_features_o6_b5_frrt ,
& hf_pfcp_up_function_features_o6_b4_trace ,
2018-07-11 23:19:26 +00:00
& hf_pfcp_up_function_features_o6_b3_quoac ,
& hf_pfcp_up_function_features_o6_b2_udbc ,
2018-05-03 21:21:40 +00:00
& hf_pfcp_up_function_features_o6_b1_pdiu ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_up_function_features_o6_b0_empu ,
2017-09-13 15:22:05 +00:00
NULL
} ;
2019-05-14 17:12:15 +00:00
/* Octet 6 Spare PFDE FRRT TRACE QUOAC UDBC PDIU EMPU */
2018-08-24 09:02:27 +00:00
proto_tree_add_bitmask_list ( tree , tvb , offset , 1 , pfcp_up_function_features_o6_flags , ENC_BIG_ENDIAN ) ;
2018-02-26 23:44:26 +00:00
offset + + ;
2017-09-13 15:22:05 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-11 07:26:21 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .26 Apply Action
2017-09-11 07:26:21 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_apply_action ( 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_ )
2017-09-11 07:26:21 +00:00
{
int offset = 0 ;
static const int * pfcp_apply_action_flags [ ] = {
& hf_pfcp_spare_b7_b5 ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_apply_action_flags_b4_dupl ,
& hf_pfcp_apply_action_flags_b3_nocp ,
& hf_pfcp_apply_action_flags_b2_buff ,
& hf_pfcp_apply_action_flags_b1_forw ,
& hf_pfcp_apply_action_flags_b0_drop ,
2017-09-11 07:26:21 +00:00
NULL
} ;
/* Octet 5 Spare Spare Spare DUPL NOCP BUFF FORW DROP */
2017-09-13 15:22:05 +00:00
proto_tree_add_bitmask_with_flags ( tree , tvb , offset , hf_pfcp_apply_action_flags ,
ett_pfcp_apply_action_flags , pfcp_apply_action_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS ) ;
2017-09-11 07:26:21 +00:00
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .27 Downlink Data Service Information
2017-09-13 15:22:05 +00:00
*/
2017-09-19 14:09:35 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_dl_data_service_inf ( 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_ )
2017-09-19 14:09:35 +00:00
{
int offset = 0 ;
guint64 flags ;
static const int * pfcp_dl_data_service_inf_flags [ ] = {
2018-10-04 16:22:28 +00:00
& hf_pfcp_spare_b7_b2 ,
2018-12-17 16:06:37 +00:00
& hf_pfcp_dl_data_service_inf_b1_qfii ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_dl_data_service_inf_b0_ppi ,
2017-09-19 14:09:35 +00:00
NULL
} ;
2018-12-17 16:06:37 +00:00
/* Octet 5 Spare QFII PPI */
2018-02-26 23:44:26 +00:00
proto_tree_add_bitmask_with_flags_ret_uint64 ( tree , tvb , offset , hf_pfcp_dl_data_service_inf_flags ,
2017-09-19 14:09:35 +00:00
ett_pfcp_dl_data_service_inf , pfcp_dl_data_service_inf_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS , & flags ) ;
offset + = 1 ;
2018-10-04 16:22:28 +00:00
2017-09-19 14:09:35 +00:00
/* The PPI flag in octet 5 indicates whether the Paging Policy Indication value in octet 'm' shall be present */
if ( ( flags & 0x1 ) = = 1 ) {
/* m Spare Paging Policy Indication value
* encoded as the DSCP in TOS ( IPv4 ) or TC ( IPv6 ) information received in the IP payload of the GTP - U packet
* from the PGW ( see IETF RFC 2474
*/
proto_tree_add_item ( tree , hf_pfcp_spare_b7_b6 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_pfcp_ppi , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
}
2018-10-04 16:22:28 +00:00
/* The QFII flag in octet 5 indicates whether the QFI value in octet 'p' shall be present */
if ( ( flags & 0x2 ) = = 2 ) {
/* m Spare QFI value
* encoded as the octet 5 of the QFI IE in subclause 8.2 .89 .
*/
proto_tree_add_item ( tree , hf_pfcp_spare_b7_b6 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_pfcp_qfi , tvb , offset , 1 , ENC_NA ) ;
offset + + ;
}
2017-09-19 14:09:35 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-13 15:22:05 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .28 Downlink Data Notification Delay
2017-09-18 15:20:36 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_dl_data_notification_delay ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-18 15:20:36 +00:00
{
int offset = 0 ;
guint32 value ;
/* Octet 5 Delay Value in integer multiples of 50 millisecs, or zero */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_dl_data_notification_delay , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
offset + = 1 ;
proto_item_append_text ( item , " %u ms " , value * 50 ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .29 DL Buffering Duration
2017-09-18 15:20:36 +00:00
*/
static const value_string pfcp_timer_unit_vals [ ] = {
{ 0 , " value is incremented in multiples of 2 seconds " } ,
{ 1 , " value is incremented in multiples of 1 minute " } ,
{ 2 , " value is incremented in multiples of 10 minutes " } ,
{ 3 , " value is incremented in multiples of 1 hour " } ,
{ 4 , " value is incremented in multiples of 10 hour " } ,
{ 5 , " values shall be interpreted as multiples of 1 minute(version 14.0.0) " } ,
{ 6 , " values shall be interpreted as multiples of 1 minute(version 14.0.0) " } ,
{ 7 , " value indicates that the timer is infinite " } ,
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_dl_buffering_dur ( 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_ )
2017-09-18 15:20:36 +00:00
{
int offset = 0 ;
guint32 unit , value ;
/* Octet 5 Timer unit Timer value */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_timer_unit , tvb , offset , 1 , ENC_BIG_ENDIAN , & unit ) ;
proto_tree_add_item_ret_uint ( tree , hf_pfcp_timer_value , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
offset + + ;
2018-02-22 22:48:55 +00:00
if ( ( unit = = 0 ) & & ( value = = 0 ) ) {
2017-09-18 15:20:36 +00:00
proto_item_append_text ( item , " Stopped " ) ;
2018-02-22 22:48:55 +00:00
} else {
switch ( unit ) {
case 0 :
proto_item_append_text ( item , " %u s " , value * 2 ) ;
break ;
case 1 :
proto_item_append_text ( item , " %u min " , value ) ;
break ;
case 2 :
proto_item_append_text ( item , " %u min " , value * 10 ) ;
break ;
case 3 :
proto_item_append_text ( item , " %u hours " , value ) ;
break ;
case 4 :
proto_item_append_text ( item , " %u hours " , value * 10 ) ;
break ;
case 7 :
2018-06-13 12:49:45 +00:00
proto_item_append_text ( item , " Infinite (%u) " , value ) ;
2018-02-22 22:48:55 +00:00
break ;
/* Value 5 and 6 */
default :
proto_item_append_text ( item , " %u min " , value ) ;
break ;
}
2017-09-18 15:20:36 +00:00
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .30 DL Buffering Suggested Packet Count
2017-09-18 15:20:36 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_dl_buffering_suggested_packet_count ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-18 15:20:36 +00:00
{
2018-02-28 21:51:36 +00:00
guint32 value ;
2017-09-18 15:20:36 +00:00
/* Octet 5 to n+4 Packet Count Value
* The length shall be set to 1 or 2 octets .
*/
2018-02-28 21:51:36 +00:00
proto_tree_add_item_ret_uint ( tree , hf_pfcp_packet_count , tvb , 0 , length , ENC_BIG_ENDIAN , & value ) ;
proto_item_append_text ( item , " %u " , value ) ;
2017-09-18 15:20:36 +00:00
}
/*
2018-02-27 21:31:25 +00:00
* 8.2 .31 PFCPSMReq - Flags
2017-09-18 15:20:36 +00:00
*/
2017-09-19 14:09:35 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_pfcpsmreq_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_ )
2017-09-19 14:09:35 +00:00
{
int offset = 0 ;
2018-02-27 21:31:25 +00:00
static const int * pfcp_pfcpsmreq_flags [ ] = {
2017-11-12 12:51:00 +00:00
& hf_pfcp_spare_b7_b3 ,
2018-02-27 21:31:25 +00:00
& hf_pfcp_pfcpsmreq_flags_b2_qaurr ,
& hf_pfcp_pfcpsmreq_flags_b1_sndem ,
& hf_pfcp_pfcpsmreq_flags_b0_drobu ,
2017-09-19 14:09:35 +00:00
NULL
} ;
2017-11-12 12:51:00 +00:00
/* Octet 5 Spare Spare Spare Spare Spare QAURR SNDEM DROBU */
2018-02-27 21:31:25 +00:00
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 ) ;
2017-09-19 14:09:35 +00:00
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-18 15:20:36 +00:00
/*
2018-02-27 21:31:25 +00:00
* 8.2 .32 PFCPSRRsp - Flags
2017-09-18 15:20:36 +00:00
*/
2017-09-19 14:09:35 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_pfcpsrrsp_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_ )
2017-09-19 14:09:35 +00:00
{
int offset = 0 ;
2018-02-27 21:31:25 +00:00
static const int * pfcp_pfcpsrrsp_flags [ ] = {
2017-09-19 14:09:35 +00:00
& hf_pfcp_spare_b7_b1 ,
2018-02-27 21:31:25 +00:00
& hf_pfcp_pfcpsrrsp_flags_b0_drobu ,
2017-09-19 14:09:35 +00:00
NULL
} ;
/* Octet 5 Spare Spare Spare Spare Spare Spare Spare DROBU */
2018-02-27 21:31:25 +00:00
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 ) ;
2017-09-19 14:09:35 +00:00
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-18 15:20:36 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .33 Sequence Number
2017-09-18 15:20:36 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_sequence_number ( 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_ )
2017-09-18 15:20:36 +00:00
{
guint32 value ;
2018-04-09 11:55:07 +00:00
/* Octet 5 to 8 Sequence Number */
2017-09-18 15:20:36 +00:00
proto_tree_add_item_ret_uint ( tree , hf_pfcp_sequence_number , tvb , 0 , 4 , ENC_BIG_ENDIAN , & value ) ;
proto_item_append_text ( item , " %u " , value ) ;
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .34 Metric
2017-09-18 15:20:36 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_metric ( 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_ )
2017-09-18 15:20:36 +00:00
{
guint32 value ;
/* Octet 5 Metric */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_metric , tvb , 0 , 1 , ENC_BIG_ENDIAN , & value ) ;
proto_item_append_text ( item , " %u " , value ) ;
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .35 Timer
2017-09-18 15:20:36 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_timer ( 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_ )
2017-09-18 15:20:36 +00:00
{
int offset = 0 ;
guint32 unit , value ;
/* Octet 5 Timer unit Timer value */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_timer_unit , tvb , offset , 1 , ENC_BIG_ENDIAN , & unit ) ;
proto_tree_add_item_ret_uint ( tree , hf_pfcp_timer_value , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
offset + + ;
2018-02-23 12:18:05 +00:00
if ( ( unit = = 0 ) & & ( value = = 0 ) ) {
2017-09-18 15:20:36 +00:00
proto_item_append_text ( item , " Stopped " ) ;
2018-02-23 12:18:05 +00:00
} else {
switch ( unit ) {
case 0 :
proto_item_append_text ( item , " %u s " , value * 2 ) ;
break ;
case 1 :
proto_item_append_text ( item , " %u min " , value ) ;
break ;
case 2 :
proto_item_append_text ( item , " %u min " , value * 10 ) ;
break ;
case 3 :
proto_item_append_text ( item , " %u hours " , value ) ;
break ;
case 4 :
proto_item_append_text ( item , " %u hours " , value * 10 ) ;
break ;
case 7 :
proto_item_append_text ( item , " %u Infinite " , value ) ;
break ;
/* Value 5 and 6 */
default :
proto_item_append_text ( item , " %u min " , value * 1 ) ;
break ;
}
2017-09-18 15:20:36 +00:00
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2019-05-14 17:12:15 +00:00
* 8.2 .36 PDR ID
2017-09-04 11:40:00 +00:00
*/
2017-11-12 12:51:00 +00:00
static int
decode_pfcp_pdr_id ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item , gint offset )
2017-09-04 11:40:00 +00:00
{
2017-09-05 15:22:14 +00:00
guint32 rule_id ;
2017-09-04 11:40:00 +00:00
/* Octet 5 to 6 Rule ID*/
2017-09-05 15:22:14 +00:00
proto_tree_add_item_ret_uint ( tree , hf_pfcp_pdr_id , tvb , offset , 2 , ENC_BIG_ENDIAN , & rule_id ) ;
2017-09-04 11:40:00 +00:00
offset + = 2 ;
2017-09-05 15:22:14 +00:00
proto_item_append_text ( item , " %u " , rule_id ) ;
2017-11-12 12:51:00 +00:00
return offset ;
}
2018-05-03 21:09:31 +00:00
2017-11-12 12:51:00 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_pdr_id ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-11-12 12:51:00 +00:00
{
int offset = 0 ;
offset = decode_pfcp_pdr_id ( tvb , pinfo , tree , item , offset ) ;
2017-09-04 11:40:00 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .37 F - SEID
*/
2017-09-04 11:40:00 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_f_seid ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args )
2017-09-04 11:40:00 +00:00
{
int offset = 0 ;
2017-09-05 15:22:14 +00:00
guint64 f_seid_flags ;
2018-08-13 22:43:30 +00:00
address * ipv4 = NULL , * ipv6 = NULL ;
guint64 seid_cp , * seid ;
guint32 * session ;
2017-09-04 11:40:00 +00:00
static const int * pfcp_f_seid_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_b1_v4 ,
& hf_pfcp_b0_v6 ,
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 ,
2017-11-11 14:38:43 +00:00
ett_pfcp_f_seid_flags , pfcp_f_seid_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS , & f_seid_flags ) ;
2017-09-04 11:40:00 +00:00
offset + = 1 ;
if ( ( f_seid_flags & 0x3 ) = = 0 ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_encoding_error , tvb , 0 , 1 ) ;
return ;
}
/* Octet 6 to 13 SEID */
2018-08-13 22:43:30 +00:00
//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 ) ;
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " SEID: 0x%s " , tvb_bytes_to_str ( wmem_packet_scope ( ) , tvb , offset , 8 ) ) ;
2017-09-04 11:40:00 +00:00
offset + = 8 ;
/* IPv4 address (if present)*/
if ( ( f_seid_flags & 0x2 ) = = 2 ) {
2018-08-13 22:43:30 +00:00
ipv4 = wmem_new0 ( wmem_packet_scope ( ) , address ) ;
2017-09-04 11:40:00 +00:00
proto_tree_add_item ( tree , hf_pfcp_f_seid_ipv4 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " , IPv4 %s " , tvb_ip_to_str ( tvb , offset ) ) ;
2018-08-13 22:43:30 +00:00
set_address_tvb ( ipv4 , AT_IPv4 , 4 , tvb , offset ) ;
2017-09-04 11:40:00 +00:00
offset + = 4 ;
}
/* IPv6 address (if present)*/
if ( ( f_seid_flags & 0x1 ) = = 1 ) {
2018-08-13 22:43:30 +00:00
ipv6 = wmem_new0 ( wmem_packet_scope ( ) , address ) ;
2017-09-04 11:40:00 +00:00
proto_tree_add_item ( tree , hf_pfcp_f_seid_ipv6 , tvb , offset , 16 , ENC_NA ) ;
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " , IPv6 %s " , tvb_ip6_to_str ( tvb , offset ) ) ;
2018-08-13 22:43:30 +00:00
set_address_tvb ( ipv6 , AT_IPv6 , 16 , tvb , offset ) ;
2017-09-04 11:40:00 +00:00
offset + = 16 ;
}
2018-08-13 22:43:30 +00:00
if ( g_pfcp_session ) {
session = ( guint32 * ) g_hash_table_lookup ( pfcp_session_table , & pinfo - > num ) ;
if ( ! session ) {
/* We save the seid so that we could assignate its corresponding session ID later */
args - > last_seid = seid_cp ;
if ( ! pfcp_seid_exists ( seid_cp , args - > seid_list ) ) {
seid = wmem_new ( wmem_packet_scope ( ) , guint64 ) ;
* seid = seid_cp ;
wmem_list_prepend ( args - > seid_list , seid ) ;
}
if ( ipv4 ! = NULL & & ! pfcp_ip_exists ( * ipv4 , args - > ip_list ) ) {
copy_address_wmem ( wmem_packet_scope ( ) , & args - > last_ip , ipv4 ) ;
wmem_list_prepend ( args - > ip_list , ipv4 ) ;
}
if ( ipv6 ! = NULL & & ! pfcp_ip_exists ( * ipv6 , args - > ip_list ) ) {
copy_address_wmem ( wmem_packet_scope ( ) , & args - > last_ip , ipv6 ) ;
wmem_list_prepend ( args - > ip_list , ipv6 ) ;
}
}
}
2017-09-04 11:40:00 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-11-09 12:58:47 +00:00
/*
* 8.2 .38 Node ID
2017-09-03 13:38:23 +00:00
*/
2017-09-04 11:40:00 +00:00
static const value_string pfcp_node_id_type_vals [ ] = {
{ 0 , " IPv4 address " } ,
{ 1 , " IPv6 address " } ,
{ 2 , " FQDN " } ,
{ 0 , NULL }
} ;
2017-09-03 13:38:23 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_node_id ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-03 13:38:23 +00:00
{
2017-09-04 11:40:00 +00:00
int offset = 0 , name_len , tmp ;
guint32 node_id_type ;
guint8 * fqdn = NULL ;
/* Octet 5 Spare Node ID Type*/
proto_tree_add_item ( tree , hf_pfcp_spare_h1 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item_ret_uint ( tree , hf_pfcp_node_id_type , tvb , offset , 1 , ENC_BIG_ENDIAN , & node_id_type ) ;
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " %s: " , val_to_str_const ( node_id_type , pfcp_node_id_type_vals , " Unknown " ) ) ;
2017-09-04 11:40:00 +00:00
offset + + ;
switch ( node_id_type ) {
2017-11-09 12:58:47 +00:00
case 0 :
/* IPv4 address */
proto_tree_add_item ( tree , hf_pfcp_node_id_ipv4 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " %s " , tvb_ip_to_str ( tvb , offset ) ) ;
2017-11-09 12:58:47 +00:00
offset + = 4 ;
break ;
case 1 :
/* IPv6 address */
proto_tree_add_item ( tree , hf_pfcp_node_id_ipv6 , tvb , offset , 16 , ENC_NA ) ;
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " %s " , tvb_ip6_to_str ( tvb , offset ) ) ;
2017-11-09 12:58:47 +00:00
offset + = 16 ;
break ;
case 2 :
/* FQDN, the Node ID value encoding shall be identical to the encoding of a FQDN
* within a DNS message of section 3.1 of IETF RFC 1035 [ 27 ] but excluding the trailing zero byte .
*/
if ( length > 1 ) {
name_len = tvb_get_guint8 ( tvb , offset ) ;
/* NOTE 1: The FQDN field in the IE is not encoded as a dotted string as commonly used in DNS master zone files. */
2017-12-22 11:48:35 +00:00
if ( name_len < 0x40 ) {
2017-11-09 12:58:47 +00:00
fqdn = tvb_get_string_enc ( wmem_packet_scope ( ) , tvb , offset + 1 , length - 2 , ENC_ASCII ) ;
for ( ; ; ) {
if ( name_len > = length - 2 )
break ;
tmp = name_len ;
name_len = name_len + fqdn [ tmp ] + 1 ;
fqdn [ tmp ] = ' . ' ;
}
2017-09-04 11:40:00 +00:00
}
2017-11-09 12:58:47 +00:00
/* In case the FQDN field is incorrectly in dotted string form.*/
else {
fqdn = tvb_get_string_enc ( wmem_packet_scope ( ) , tvb , offset , length - 1 , ENC_ASCII ) ;
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_encoding_error , tvb , offset , length - 1 ) ;
}
proto_tree_add_string ( tree , hf_pfcp_node_id_fqdn , tvb , offset , length - 1 , fqdn ) ;
proto_item_append_text ( item , " %s " , fqdn ) ;
offset + = length - 1 ;
2017-09-04 11:40:00 +00:00
}
2017-11-09 12:58:47 +00:00
break ;
default :
break ;
2017-09-04 11:40:00 +00:00
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
2017-09-03 13:38:23 +00:00
}
/*
* 8.2 .39 PFD Contents
2017-09-13 15:22:05 +00:00
*/
2017-09-19 14:09:35 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_pfd_contents ( 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_ )
2017-09-19 14:09:35 +00:00
{
int offset = 0 ;
2019-05-23 17:29:33 +00:00
int offset_addition = 0 ;
2017-09-19 14:09:35 +00:00
guint64 flags ;
2019-05-14 17:12:15 +00:00
guint32 len , len_addition ;
proto_tree * afd_tree , * aurl_tree , * adnp_tree ;
2017-09-19 14:09:35 +00:00
static const int * pfcp_pfd_contents_flags [ ] = {
2019-05-14 17:12:15 +00:00
& hf_pfcp_pfd_contents_flags_b7_adnp ,
& hf_pfcp_pfd_contents_flags_b6_aurl ,
& hf_pfcp_pfd_contents_flags_b5_afd ,
& hf_pfcp_pfd_contents_flags_b4_dnp ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_pfd_contents_flags_b3_cp ,
& hf_pfcp_pfd_contents_flags_b2_dn ,
& hf_pfcp_pfd_contents_flags_b1_url ,
& hf_pfcp_pfd_contents_flags_b0_fd ,
2017-09-19 14:09:35 +00:00
NULL
} ;
2019-05-14 17:12:15 +00:00
/* Octet 5 ADNP AURL AFD DNP CP DN URL FD */
2017-09-19 14:09:35 +00:00
proto_tree_add_bitmask_with_flags_ret_uint64 ( tree , tvb , offset , hf_pfcp_pfd_contents_flags ,
ett_pfcp_measurement_method_flags , pfcp_pfd_contents_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT , & flags ) ;
offset + = 1 ;
/* Bit 1 - FD (Flow Description): If this bit is set to "1", then the Length of Flow Description
* and the Flow Description fields shall be present
*/
2019-05-14 17:12:15 +00:00
if ( flags & 0x1 ) {
2017-09-19 14:09:35 +00:00
/* The Flow Description field, when present, shall be encoded as an OctetString
* as specified in subclause 6.4 .3 .7 of 3 GPP TS 29.251
*/
/* m to (m+1) Length of Flow Description */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_flow_desc_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len ) ;
offset + = 2 ;
/* (m+2) to p Flow Description */
2018-02-22 20:54:52 +00:00
proto_tree_add_item ( tree , hf_pfcp_flow_desc , tvb , offset , len , ENC_ASCII | ENC_NA ) ;
2017-09-19 14:09:35 +00:00
offset + = len ;
}
2019-05-14 17:12:15 +00:00
/* Bit 2 - URL (URL): The URL field, when present,
* shall be encoded as an OctetString as specified in subclause 6.4 .3 .8 of 3 GPP TS 29.251 [ 21 ] .
*/
if ( flags & 0x2 ) {
2017-09-19 14:09:35 +00:00
/* q to (q+1) Length of URL */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_url_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len ) ;
offset + = 2 ;
2019-05-14 17:12:15 +00:00
2017-09-19 14:09:35 +00:00
/* (q+2) to r URL */
2019-05-14 17:12:15 +00:00
proto_tree_add_item ( tree , hf_pfcp_url , tvb , offset , len , ENC_ASCII | ENC_NA ) ;
2017-09-19 14:09:35 +00:00
offset + = len ;
}
2019-05-14 17:12:15 +00:00
/* Bit 3 - DN (Domain Name): The Domain Name field, when present,
* shall be encoded as an OctetString as specified in subclause 6.4 .3 .9 of 3 GPP TS 29.251 [ 21 ] .
*/
if ( flags & 0x4 ) {
2017-09-19 14:09:35 +00:00
/* s to (s+1) Length of Domain Name */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_dn_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len ) ;
offset + = 2 ;
2019-05-14 17:12:15 +00:00
2017-09-19 14:09:35 +00:00
/* (s+2) to t Domain Name */
2019-05-14 17:12:15 +00:00
proto_tree_add_item ( tree , hf_pfcp_dn , tvb , offset , len , ENC_ASCII | ENC_NA ) ;
2017-09-19 14:09:35 +00:00
offset + = len ;
}
/* Bit 4 - CP (Custom PFD Content): If this bit is set to "1", then the Length of Custom PFD Content and
* the Custom PFD Content fields shall be present
*/
2019-05-14 17:12:15 +00:00
if ( flags & 0x8 ) {
2017-09-19 14:09:35 +00:00
/* u to (u+1) Length of Custom PFD Content */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_cp_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len ) ;
offset + = 2 ;
2019-05-14 17:12:15 +00:00
2017-09-19 14:09:35 +00:00
/* (u+2) to v Custom PFD Content */
proto_tree_add_item ( tree , hf_pfcp_cp , tvb , offset , len , ENC_NA ) ;
offset + = len ;
}
2019-05-14 17:12:15 +00:00
/* Bit 5 - DNP (Domain Name Protocol): If this bit is set to "1", then the Length of Domain Name Protocol and
* the Domain Name Protocol shall be present , otherwise they shall not be present ; and if this bit is set to " 1 " ,
* the Length of Domain Name and the Domain Name fields shall also be present .
*/
if ( flags & 0x10 ) {
/* The Domain Name Protocol field, when present, shall be encoded as an OctetString
* as specified in subclause 6.4 .3 . x of 3 GPP TS 29.251 [ 21 ] .
*/
/* w to (w+1) Length of Domain Name Protocol */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_dnp_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len ) ;
offset + = 2 ;
/* (w+2) to x Domain Name Protocol */
proto_tree_add_item ( tree , hf_pfcp_dnp , tvb , offset , len , ENC_ASCII | ENC_NA ) ;
offset + = len ;
}
/* Bit 6 - AFD (Additional Flow Description): If this bit is set to "1",
* the Length of Additional Flow Description and the Additional Flow Description field shall be present ,
* otherwise they shall not be present .
*/
if ( flags & 0x20 ) {
/* y to (y+1) Length of Additional Flow Description */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_afd_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len ) ;
offset + = 2 ;
/* (y+2) to z Additional Flow Description */
2019-05-23 17:29:33 +00:00
offset_addition = 0 ;
2019-05-14 17:12:15 +00:00
afd_tree = proto_item_add_subtree ( item , ett_pfcp_adf ) ;
2019-05-23 17:29:33 +00:00
while ( offset_addition < ( int ) len ) {
2019-05-14 17:12:15 +00:00
/* (y+2) to (y+3) Length of Flow Description */
proto_tree_add_item_ret_uint ( afd_tree , hf_pfcp_flow_desc_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len_addition ) ;
2019-05-23 17:29:33 +00:00
offset_addition + = 2 ;
2019-05-14 17:12:15 +00:00
/* (y+4) to i Flow Description */
proto_tree_add_item ( afd_tree , hf_pfcp_flow_desc , tvb , offset , len_addition , ENC_ASCII | ENC_NA ) ;
2019-05-23 17:29:33 +00:00
offset_addition + = len_addition ;
2019-05-14 17:12:15 +00:00
}
2019-05-23 17:29:33 +00:00
offset + = offset_addition ;
2019-05-14 17:12:15 +00:00
}
/* Bit 7 - AURL (Additional URL): If this bit is set to "1",
* the Length of Additional URL and the Additional URL field shall be present ,
* otherwise they shall not be present .
*/
if ( flags & 0x40 ) {
/* a to (a+1) Length of Additional URL */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_aurl_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len ) ;
offset + = 2 ;
/* (a+2) to b Additional URL */
2019-05-23 17:29:33 +00:00
offset_addition = 0 ;
2019-05-14 17:12:15 +00:00
aurl_tree = proto_item_add_subtree ( item , ett_pfcp_aurl ) ;
2019-05-23 17:29:33 +00:00
while ( offset_addition < ( int ) len ) {
2019-05-14 17:12:15 +00:00
/* (a+2) to (a+3) Length of URL */
proto_tree_add_item_ret_uint ( aurl_tree , hf_pfcp_url_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len_addition ) ;
2019-05-23 17:29:33 +00:00
offset_addition + = 2 ;
2019-05-14 17:12:15 +00:00
/* (a+4) to o URL */
proto_tree_add_item ( aurl_tree , hf_pfcp_url , tvb , offset , len_addition , ENC_ASCII | ENC_NA ) ;
2019-05-23 17:29:33 +00:00
offset_addition + = len_addition ;
2019-05-14 17:12:15 +00:00
}
2019-05-23 17:29:33 +00:00
offset + = offset_addition ;
2019-05-14 17:12:15 +00:00
}
/* Bit 8 - ADNP (Additional Domain Name and Domain Name Protocol): If this bit is set to "1",
* the Length of Additional Domain Name and Domain Name Protocol , and the Additional Domain Name and
* Domain Name Protocol field shall be present , otherwise they shall not be present .
*/
if ( flags & 0x80 ) {
/* c to (c+1) Length of Additional Domain Name and Domain Name Protocol */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_adnp_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len ) ;
offset + = 2 ;
/* (c+2) to d Additional Domain Name and Domain Name Protocol */
2019-05-23 17:29:33 +00:00
offset_addition = 0 ;
2019-05-14 17:12:15 +00:00
adnp_tree = proto_item_add_subtree ( item , ett_pfcp_adnp ) ;
2019-05-23 17:29:33 +00:00
while ( offset_addition < ( int ) len ) {
2019-05-14 17:12:15 +00:00
/* (c+2) to (c+3) Length of Domain Name */
proto_tree_add_item_ret_uint ( adnp_tree , hf_pfcp_dn_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len_addition ) ;
2019-05-23 17:29:33 +00:00
offset_addition + = 2 ;
2019-05-14 17:12:15 +00:00
/* (c+4) to pd Domain Name */
proto_tree_add_item ( adnp_tree , hf_pfcp_dn , tvb , offset , len_addition , ENC_ASCII | ENC_NA ) ;
2019-05-23 17:29:33 +00:00
offset_addition + = len_addition ;
2019-05-14 17:12:15 +00:00
/* (pe) to (pe+1) Length of Domain Name Protocol */
proto_tree_add_item_ret_uint ( adnp_tree , hf_pfcp_dnp_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len_addition ) ;
2019-05-23 17:29:33 +00:00
offset_addition + = 2 ;
2019-05-14 17:12:15 +00:00
/* (pe+2) to ph Domain Name Protocol */
proto_tree_add_item ( adnp_tree , hf_pfcp_dnp , tvb , offset , len_addition , ENC_ASCII | ENC_NA ) ;
2019-05-23 17:29:33 +00:00
offset_addition + = len_addition ;
2019-05-14 17:12:15 +00:00
}
2019-05-23 17:29:33 +00:00
offset + = offset_addition ;
2019-05-14 17:12:15 +00:00
}
2017-09-19 14:09:35 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-13 15:22:05 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .40 Measurement Method
2017-09-13 15:22:05 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_measurement_method ( 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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
static const int * pfcp_measurement_method_flags [ ] = {
& hf_pfcp_spare_b7_b3 ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_measurement_method_flags_b2_event ,
& hf_pfcp_measurement_method_flags_b1_volume ,
& hf_pfcp_measurement_method_flags_b0_durat ,
2017-09-13 15:22:05 +00:00
NULL
} ;
2018-02-26 23:44:26 +00:00
/* Octet 5 Spare Spare Spare Spare Spare EVENT VOLUM DURAT */
2017-09-13 15:22:05 +00:00
proto_tree_add_bitmask_with_flags ( tree , tvb , offset , hf_pfcp_measurement_method_flags ,
ett_pfcp_measurement_method_flags , pfcp_measurement_method_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .41 Usage Report Trigger
2017-09-11 15:57:39 +00:00
*/
2017-09-18 15:20:36 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_usage_report_trigger ( 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_ )
2017-09-18 15:20:36 +00:00
{
int offset = 0 ;
2018-02-26 23:44:26 +00:00
static const int * pfcp_usage_report_trigger_o5_flags [ ] = {
& hf_pfcp_usage_report_trigger_o5_b7_immer ,
& hf_pfcp_usage_report_trigger_o5_b6_droth ,
& hf_pfcp_usage_report_trigger_o5_b5_stopt ,
& hf_pfcp_usage_report_trigger_o5_b4_start ,
& hf_pfcp_usage_report_trigger_o5_b3_quhti ,
& hf_pfcp_usage_report_trigger_o5_b2_timth ,
& hf_pfcp_usage_report_trigger_o5_b1_volth ,
& hf_pfcp_usage_report_trigger_o5_b0_perio ,
NULL
} ;
2019-01-13 16:17:21 +00:00
/* Octet 5 IMMER DROTH STOPT START QUHTI TIMTH VOLTH PERIO */
proto_tree_add_bitmask_list ( tree , tvb , offset , 1 , pfcp_usage_report_trigger_o5_flags , ENC_BIG_ENDIAN ) ;
offset + + ;
if ( offset = = length ) {
return ;
}
2018-02-26 23:44:26 +00:00
static const int * pfcp_usage_report_trigger_o6_flags [ ] = {
2018-10-04 16:22:28 +00:00
& hf_pfcp_usage_report_trigger_o6_b7_eveth ,
2018-07-11 23:19:26 +00:00
& hf_pfcp_usage_report_trigger_o6_b6_macar ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_usage_report_trigger_o6_b5_envcl ,
& hf_pfcp_usage_report_trigger_o6_b4_monit ,
& hf_pfcp_usage_report_trigger_o6_b3_termr ,
& hf_pfcp_usage_report_trigger_o6_b2_liusa ,
& hf_pfcp_usage_report_trigger_o6_b1_timqu ,
& hf_pfcp_usage_report_trigger_o6_b0_volqu ,
2017-09-18 15:20:36 +00:00
NULL
} ;
2019-01-13 16:17:21 +00:00
/* Octet 6 EVETH MACAR ENVCL MONIT TERMR LIUSA TIMQU VOLQU */
2018-10-04 10:56:13 +00:00
proto_tree_add_bitmask_list ( tree , tvb , offset , 1 , pfcp_usage_report_trigger_o6_flags , ENC_BIG_ENDIAN ) ;
2018-02-26 23:44:26 +00:00
offset + + ;
2017-09-18 15:20:36 +00:00
2019-01-13 16:17:21 +00:00
if ( offset = = length ) {
return ;
}
static const int * pfcp_usage_report_trigger_o7_flags [ ] = {
& hf_pfcp_usage_report_trigger_o7_b0_evequ ,
NULL
} ;
/* Octet 7 Spare Spare Spare Spare Spare Spare Spare EVEQU */
proto_tree_add_bitmask_list ( tree , tvb , offset , 1 , pfcp_usage_report_trigger_o7_flags , ENC_BIG_ENDIAN ) ;
offset + + ;
if ( offset = = length ) {
return ;
}
2017-09-18 15:20:36 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-11 15:57:39 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .42 Measurement Period
2017-09-11 15:57:39 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_measurement_period ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-11 15:57:39 +00:00
{
int offset = 0 ;
guint32 value ;
/* 5 to 8 Measurement Period*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_measurement_period , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .43 Fully qualified PDN Connection Set Identifier ( FQ - CSID )
2017-09-11 15:57:39 +00:00
*/
static const value_string pfcp_fq_csid_node_id_type_vals [ ] = {
{ 0 , " Node-Address is a global unicast IPv4 address " } ,
{ 1 , " Node-Address is a global unicast IPv6 address " } ,
{ 2 , " Node-Address is a 4 octets long field " } ,
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_fq_csid ( 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_ )
2017-09-11 15:57:39 +00:00
{
int offset = 0 ;
guint32 node_id_type , num_csid ;
2018-04-09 11:55:07 +00:00
/* Octet 5 FQ-CSID Node-ID Type Number of CSIDs= m*/
2017-09-11 15:57:39 +00:00
proto_tree_add_item_ret_uint ( tree , hf_pfcp_fq_csid_node_id_type , tvb , offset , 1 , ENC_BIG_ENDIAN , & node_id_type ) ;
proto_tree_add_item_ret_uint ( tree , hf_pfcp_num_csid , tvb , offset , 1 , ENC_BIG_ENDIAN , & num_csid ) ;
offset + + ;
/* 6 to p Node-Address */
switch ( node_id_type ) {
case 0 :
/* 0 indicates that Node-Address is a global unicast IPv4 address and p = 9 */
proto_tree_add_item ( tree , hf_pfcp_fq_csid_node_id_ipv4 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
break ;
case 1 :
/* 1 indicates that Node-Address is a global unicast IPv6 address and p = 21 */
proto_tree_add_item ( tree , hf_pfcp_fq_csid_node_id_ipv6 , tvb , offset , 16 , ENC_NA ) ;
offset + = 16 ;
break ;
case 2 :
/* 2 indicates that Node-Address is a 4 octets long field with a 32 bit value stored in network order, and p= 9
* Most significant 20 bits are the binary encoded value of ( MCC * 1000 + MNC ) .
* Least significant 12 bits is a 12 bit integer assigned by an operator to an MME , SGW - C , SGW - U , PGW - C or PGW - U
*/
proto_tree_add_item ( tree , hf_pfcp_fq_csid_node_id_mcc_mnc , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_pfcp_fq_csid_node_id_int , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
2017-09-13 10:32:12 +00:00
break ;
2017-09-11 15:57:39 +00:00
default :
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
break ;
}
while ( num_csid > 0 ) {
2017-12-22 11:54:27 +00:00
proto_tree_add_item ( tree , hf_pfcp_fq_csid , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2017-09-11 15:57:39 +00:00
offset + = 2 ;
num_csid - - ;
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .44 Volume Measurement
2017-09-11 15:57:39 +00:00
*/
2017-09-18 15:20:36 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_volume_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_ )
2017-09-18 15:20:36 +00:00
{
int offset = 0 ;
guint64 flags ;
static const int * pfcp_volume_measurement_flags [ ] = {
& hf_pfcp_spare_b7_b3 ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_volume_measurement_b2_dlvol ,
& hf_pfcp_volume_measurement_b1_ulvol ,
& hf_pfcp_volume_measurement_b0_tovol ,
2017-09-18 15:20:36 +00:00
NULL
} ;
/* Octet 5 Spare DLVOL ULVOL TOVOL*/
proto_tree_add_bitmask_with_flags_ret_uint64 ( tree , tvb , offset , hf_pfcp_volume_measurement ,
ett_pfcp_volume_measurement , pfcp_volume_measurement_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT , & flags ) ;
offset + = 1 ;
/* Bit 1 - TOVOL: If this bit is set to "1", then the Total Volume field shall be present*/
if ( ( flags & 0x1 ) = = 1 ) {
/* m to (m+7) Total Volume */
proto_tree_add_item ( tree , hf_pfcp_vol_meas_tovol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
/* Bit 2 - ULVOL: If this bit is set to "1", then the Total Volume field shall be present*/
if ( ( flags & 0x2 ) = = 2 ) {
/* p to (p+7) Uplink Volume */
proto_tree_add_item ( tree , hf_pfcp_vol_meas_ulvol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
/* Bit 3 - DLVOL: If this bit is set to "1", then the Total Volume field shall be present*/
if ( ( flags & 0x4 ) = = 4 ) {
/*q to (q+7) Downlink Volume */
proto_tree_add_item ( tree , hf_pfcp_vol_meas_dlvol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-11 15:57:39 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .45 Duration Measurement
2017-09-11 15:57:39 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_duration_measurement ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-11 15:57:39 +00:00
{
int offset = 0 ;
guint32 value ;
2017-09-13 15:22:05 +00:00
/* 5 to 8 Duration value*/
2017-09-11 15:57:39 +00:00
proto_tree_add_item_ret_uint ( tree , hf_pfcp_duration_measurement , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u s " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .46 Time of First Packet
2017-09-11 15:57:39 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_time_of_first_packet ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-11 15:57:39 +00:00
{
int offset = 0 ;
const gchar * time_str ;
/* Octets 5 to 8 shall be encoded in the same format as the first four octets of the 64-bit timestamp
* format as defined in section 6 of IETF RFC 5905
*/
time_str = tvb_ntp_fmt_ts_sec ( tvb , 0 ) ;
proto_tree_add_string ( tree , hf_pfcp_time_of_first_packet , tvb , offset , 4 , time_str ) ;
proto_item_append_text ( item , " %s " , time_str ) ;
offset + = 4 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .47 Time of Last Packet
2017-09-11 15:57:39 +00:00
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_time_of_last_packet ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-11 15:57:39 +00:00
{
int offset = 0 ;
const gchar * time_str ;
/* Octets 5 to 8 shall be encoded in the same format as the first four octets of the 64-bit timestamp
* format as defined in section 6 of IETF RFC 5905
*/
time_str = tvb_ntp_fmt_ts_sec ( tvb , 0 ) ;
proto_tree_add_string ( tree , hf_pfcp_time_of_last_packet , tvb , offset , 4 , time_str ) ;
proto_item_append_text ( item , " %s " , time_str ) ;
offset + = 4 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .48 Quota Holding Time
2017-09-11 15:57:39 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_quota_holding_time ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint32 value ;
2018-04-09 11:55:07 +00:00
/* Octet 5 to 8 Time Quota value
2017-09-13 15:22:05 +00:00
* TThe Time Quota value shall be encoded as an Unsigned32 binary integer value . It contains a duration in seconds
*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_quota_holding_time , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u s " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-11 15:57:39 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .49 Dropped DL Traffic Threshold
2017-09-11 15:57:39 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_dropped_dl_traffic_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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint64 flags_val ;
static const int * pfcp_dropped_dl_traffic_threshold_flags [ ] = {
2018-10-04 16:22:28 +00:00
& hf_pfcp_dropped_dl_traffic_threshold_b1_dlby ,
2017-09-13 15:22:05 +00:00
& hf_pfcp_dropped_dl_traffic_threshold_b0_dlpa ,
NULL
} ;
2018-10-04 16:22:28 +00:00
/* Octet 5 Spare DLBY DLPA*/
2017-09-13 15:22:05 +00:00
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 ) ;
offset + = 1 ;
if ( ( flags_val & 0x1 ) = = 1 ) {
/* m to (m+7) Downlink Packets
* DLPA : If this bit is set to " 1 " , then the Downlink Packets field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_downlink_packets , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
2018-10-04 16:22:28 +00:00
if ( ( flags_val & 0x2 ) = = 2 ) {
/* o to (o+7) Number of Bytes of Downlink Data
* DLBY : If this bit is set to " 1 " , then the Number of Bytes of Downlink Data field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_bytes_downlink_data , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
2017-09-13 15:22:05 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-11 15:57:39 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .50 Volume Quota
2017-09-11 15:57:39 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_volume_quota ( 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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint64 flags_val ;
static const int * pfcp_volume_quota_flags [ ] = {
& hf_pfcp_spare_b7_b3 ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_volume_quota_b2_dlvol ,
& hf_pfcp_volume_quota_b1_ulvol ,
& hf_pfcp_volume_quota_b0_tovol ,
2017-09-13 15:22:05 +00:00
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 ) ;
offset + = 1 ;
/* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value.
* They shall contain the total , uplink or downlink number of octets respectively .
*/
if ( ( flags_val & 0x1 ) = = 1 ) {
/* m to (m+7) Total Volume
* TOVOL : If this bit is set to " 1 " , then the Total Volume field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_volume_quota_tovol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( ( flags_val & 0x2 ) = = 2 ) {
2018-04-09 11:55:07 +00:00
/* p to (p+7) Uplink Volume
2017-09-13 15:22:05 +00:00
* ULVOL : If this bit is set to " 1 " , then the Uplink Volume field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_volume_quota_ulvol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( ( flags_val & 0x4 ) = = 4 ) {
/* q to (q+7) Downlink Volume
* DLVOL : If this bit is set to " 1 " , then the Downlink Volume field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_volume_quota_dlvol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-11 15:57:39 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .51 Time Quota
2017-09-11 15:57:39 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_time_quota ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint32 value ;
2018-04-09 11:55:07 +00:00
/* Octet 5 to 8 Time Quota value
2017-09-13 15:22:05 +00:00
* TThe Time Quota value shall be encoded as an Unsigned32 binary integer value . It contains a duration in seconds
*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_time_quota , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u s " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-11 15:57:39 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .52 Start Time
2017-09-11 15:57:39 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_start_time ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-13 15:22:05 +00:00
{
const gchar * time_str ;
int offset = 0 ;
/* The Start Time field shall contain a UTC time. Octets 5 to 8 are encoded in the same format as
* the first four octets of the 64 - bit timestamp format as defined in section 6 of IETF RFC 5905 [ 26 ] .
*/
time_str = tvb_ntp_fmt_ts_sec ( tvb , 0 ) ;
proto_tree_add_string ( tree , hf_pfcp_start_time , tvb , offset , 4 , time_str ) ;
proto_item_append_text ( item , " %s " , time_str ) ;
offset + = 4 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-11 15:57:39 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .53 End Time
2017-09-06 15:38:12 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_end_time ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-13 15:22:05 +00:00
{
const gchar * time_str ;
int offset = 0 ;
/* The End Time field shall contain a UTC time. Octets 5 to 8 are encoded in the same format as
* the first four octets of the 64 - bit timestamp format as defined in section 6 of IETF RFC 5905 [ 26 ] .
*/
time_str = tvb_ntp_fmt_ts_sec ( tvb , 0 ) ;
proto_tree_add_string ( tree , hf_pfcp_end_time , tvb , offset , 4 , time_str ) ;
proto_item_append_text ( item , " %s " , time_str ) ;
offset + = 4 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-06 15:38:12 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .54 URR ID
2017-09-06 15:38:12 +00:00
*/
2017-11-12 12:51:00 +00:00
static int
decode_pfcp_urr_id ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item _U_ , guint offset )
2017-09-06 15:38:12 +00:00
{
guint32 urr_id ;
2018-03-12 13:44:15 +00:00
guint8 urr_id_flag ;
2017-09-06 15:38:12 +00:00
/* Octet 5 to 8 URR ID value
* The bit 8 of octet 5 is used to indicate if the Rule ID is dynamically allocated by the CP function
* or predefined in the UP function . If set to 0 , it indicates that the Rule is dynamically provisioned
* by the CP Function . If set to 1 , it indicates that the Rule is predefined in the UP Function
*/
2018-03-12 13:44:15 +00:00
urr_id_flag = tvb_get_guint8 ( tvb , offset ) & 0x80 ;
2017-09-06 15:38:12 +00:00
proto_tree_add_item ( tree , hf_pfcp_urr_id_flg , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item_ret_uint ( tree , hf_pfcp_urr_id , tvb , offset , 4 , ENC_BIG_ENDIAN , & urr_id ) ;
offset + = 4 ;
proto_item_append_text ( item , " %s %u " ,
2018-03-12 13:44:15 +00:00
( ( urr_id_flag ) ? pfcp_id_predef_dynamic_tfs . true_string : pfcp_id_predef_dynamic_tfs . false_string ) ,
2017-09-06 15:38:12 +00:00
( urr_id & 0x7fffffff ) ) ;
2017-11-12 12:51:00 +00:00
return offset ;
}
2018-05-03 21:09:31 +00:00
2017-11-12 12:51:00 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_urr_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_ )
2017-11-12 12:51:00 +00:00
{
int offset = 0 ;
offset = decode_pfcp_urr_id ( tvb , pinfo , tree , item , offset ) ;
2017-09-06 15:38:12 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .55 Linked URR ID IE
2017-09-13 07:30:48 +00:00
*/
2017-09-13 15:22:05 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_linked_urr_id ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint32 value ;
/* Octet 5 to 8 Linked URR ID value
* The Linked URR ID value shall be encoded as an Unsigned32 binary integer value
*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_linked_urr_id , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " %u " , value ) ;
2017-09-13 15:22:05 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-13 07:30:48 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .56 Outer Header Creation
2017-09-11 07:26:21 +00:00
*/
2017-09-13 15:22:05 +00:00
static const value_string pfcp_outer_hdr_desc_vals [ ] = {
2018-02-12 14:30:00 +00:00
{ 0x0100 , " GTP-U/UDP/IPv4 " } ,
{ 0x0200 , " GTP-U/UDP/IPv6 " } ,
{ 0x0300 , " GTP-U/UDP/IPv4/IPv6 " } ,
{ 0x0400 , " UDP/IPv4 " } ,
{ 0x0800 , " UDP/IPv6 " } ,
{ 0x0C00 , " UDP/IPv4/IPv6 " } ,
2019-01-13 16:17:21 +00:00
{ 0x1000 , " IPv4 " } ,
{ 0x2000 , " IPv6 " } ,
{ 0x3000 , " IPv4/IPv6 " } ,
{ 0x4000 , " C-TAG " } ,
{ 0x8000 , " S-TAG " } ,
2017-09-13 15:22:05 +00:00
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
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_ )
2017-09-13 15:22:05 +00:00
{
int offset = 0 ;
guint32 value ;
/* Octet 5 Outer Header Creation Description */
2018-01-24 11:14:37 +00:00
proto_tree_add_item_ret_uint ( tree , hf_pfcp_outer_hdr_desc , tvb , offset , 2 , ENC_BIG_ENDIAN , & value ) ;
offset + = 2 ;
2017-09-13 15:22:05 +00:00
/* 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
*/
2018-02-12 14:30:00 +00:00
if ( ( value & 0x0100 ) | | ( value & 0x0200 ) ) {
2017-09-13 15:22:05 +00:00
proto_tree_add_item ( tree , hf_pfcp_outer_hdr_creation_teid , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
}
2017-11-11 14:44:33 +00:00
/*
* 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
*/
2019-01-13 16:17:21 +00:00
if ( ( value & 0x0100 ) | | ( value & 0x0400 ) | | ( value & 0x1000 ) ) {
2017-09-13 15:22:05 +00:00
proto_tree_add_item ( tree , hf_pfcp_outer_hdr_creation_ipv4 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
}
2017-11-11 14:44:33 +00:00
/*
* 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
*/
2019-01-13 16:17:21 +00:00
if ( ( value & 0x0200 ) | | ( value & 0x0800 ) | | ( value & 0x2000 ) ) {
2017-09-13 15:22:05 +00:00
proto_tree_add_item ( tree , hf_pfcp_outer_hdr_creation_ipv6 , tvb , offset , 16 , ENC_NA ) ;
offset + = 16 ;
}
2017-11-11 14:44:33 +00:00
/*
* 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
*/
2018-02-12 14:30:00 +00:00
if ( ( value & 0x0400 ) | | ( value & 0x0800 ) ) {
2017-09-13 15:22:05 +00:00
proto_tree_add_item ( tree , hf_pfcp_outer_hdr_creation_port , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
}
2019-01-13 16:17:21 +00:00
/*
* t to ( t + 2 ) C - TAG
* The C - TAG field shall be present if the Outer Header Creation Description requests the setting of the C - Tag in Ethernet packet
*/
if ( value & 0x4000 ) {
offset = decode_pfcp_c_tag ( tvb , pinfo , tree , item , offset ) ;
}
/*
* u to ( u + 2 ) S - TAG
* The S - TAG field shall be present if the Outer Header Creation Description requests the setting of the S - Tag in Ethernet packet
*/
if ( value & 0x8000 ) {
offset = decode_pfcp_s_tag ( tvb , pinfo , tree , item , offset ) ;
}
2017-09-13 15:22:05 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-11 07:26:21 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .57 BAR ID
2017-09-11 07:26:21 +00:00
*/
2017-11-12 12:51:00 +00:00
static int
2018-02-28 21:51:36 +00:00
decode_pfcp_bar_id ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item , guint16 offset )
2017-09-11 07:26:21 +00:00
{
2018-02-28 21:51:36 +00:00
guint32 value ;
2017-09-11 07:26:21 +00:00
/* Octet 5 BAR ID value
* The BAR ID value shall be encoded as a binary integer value
*/
2018-02-28 21:51:36 +00:00
proto_tree_add_item_ret_uint ( tree , hf_pfcp_bar_id , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
2017-09-11 07:26:21 +00:00
offset + + ;
2018-05-03 21:09:31 +00:00
proto_item_append_text ( item , " %u " , value ) ;
2017-09-11 07:26:21 +00:00
2017-11-12 12:51:00 +00:00
return offset ;
}
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_bar_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_ )
2017-11-12 12:51:00 +00:00
{
int offset = 0 ;
offset = decode_pfcp_bar_id ( tvb , pinfo , tree , item , offset ) ;
2017-09-11 07:26:21 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .58 CP Function Features
2017-09-11 07:26:21 +00:00
*/
2017-09-18 15:20:36 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_cp_function_features ( 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_ )
2017-09-18 15:20:36 +00:00
{
int offset = 0 ;
static const int * pfcp_cp_function_features_flags [ ] = {
2018-02-26 23:44:26 +00:00
& hf_pfcp_cp_function_features_b1_ovrl ,
& hf_pfcp_cp_function_features_b0_load ,
2017-09-18 15:20:36 +00:00
NULL
} ;
/* Octet 5
* 5 / 1 LOAD
* 5 / 2 OVRL
*/
proto_tree_add_bitmask_with_flags ( tree , tvb , offset , hf_pfcp_cp_function_features ,
ett_pfcp_cp_function_features , pfcp_cp_function_features_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-11 07:26:21 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .59 Usage Information
2017-09-11 07:26:21 +00:00
*/
2017-09-18 15:20:36 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_usage_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_ )
2017-09-18 15:20:36 +00:00
{
int offset = 0 ;
static const int * pfcp_usage_information_flags [ ] = {
& hf_pfcp_spare_h1 ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_usage_information_b3_ube ,
& hf_pfcp_usage_information_b2_uae ,
& hf_pfcp_usage_information_b1_aft ,
& hf_pfcp_usage_information_b0_bef ,
2017-09-18 15:20:36 +00:00
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 ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-11 07:26:21 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .60 Application Instance ID
2017-09-11 07:26:21 +00:00
*/
2017-09-18 15:20:36 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_application_instance_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_ )
2017-09-18 15:20:36 +00:00
{
2019-01-24 14:40:38 +00:00
int offset = 0 ;
2017-09-18 15:20:36 +00:00
/* Octet 5 5 to (n+4) Application Instance Identifier
* The Application Instance Identifier shall be encoded as an OctetString ( see 3 GPP TS 29.212 )
*/
2019-01-24 14:40:38 +00:00
if ( tvb_ascii_isprint ( tvb , offset , length ) )
{
const guint8 * string_value ;
proto_tree_add_item_ret_string ( tree , hf_pfcp_application_instance_id_str , tvb , offset , length , ENC_ASCII | ENC_NA , wmem_packet_scope ( ) , & string_value ) ;
proto_item_append_text ( item , " %s " , string_value ) ;
}
else
{
proto_tree_add_item ( tree , hf_pfcp_application_instance_id , tvb , offset , length , ENC_NA ) ;
}
2017-09-18 15:20:36 +00:00
}
2017-09-11 07:26:21 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .61 Flow Information
2017-09-05 15:22:14 +00:00
*/
2017-09-18 15:20:36 +00:00
static const value_string pfcp_flow_dir_vals [ ] = {
{ 0 , " Unspecified " } ,
{ 1 , " Downlink (traffic to the UE) " } ,
{ 2 , " Uplink (traffic from the UE) " } ,
{ 3 , " Bidirectional " } ,
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_flow_inf ( 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_ )
2017-09-18 15:20:36 +00:00
{
int offset = 0 ;
guint32 len ;
/* Octet 5 Spare Flow Direction */
proto_tree_add_item ( tree , hf_pfcp_spare_b7_b3 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_pfcp_flow_dir , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
/* 6 to 7 Length of Flow Description */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_flow_desc_len , tvb , offset , 2 , ENC_BIG_ENDIAN , & len ) ;
offset + = 2 ;
/* Flow Description
* The Flow Description field , when present , shall be encoded as an OctetString
* as specified in subclause 5.4 .2 of 3 GPP TS 29.212
*/
2018-02-22 20:54:52 +00:00
proto_tree_add_item ( tree , hf_pfcp_flow_desc , tvb , offset , len , ENC_ASCII | ENC_NA ) ;
2017-09-18 15:20:36 +00:00
offset + = len ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-05 15:22:14 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .62 UE IP Address
2017-09-05 15:22:14 +00:00
*/
static const true_false_string pfcp_ue_ip_add_sd_flag_vals = {
" Destination IP address " ,
" Source IP address " ,
} ;
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_ue_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_ )
2017-09-05 15:22:14 +00:00
{
int offset = 0 ;
guint64 ue_ip_address_flags ;
static const int * pfcp_ue_ip_address_flags [ ] = {
2018-10-04 16:22:28 +00:00
& hf_pfcp_spare_b7_b4 ,
& hf_pfcp_ue_ip_address_flag_b3_v6d ,
2017-11-11 14:38:43 +00:00
& hf_pfcp_ue_ip_address_flag_b2_sd ,
& hf_pfcp_ue_ip_address_flag_b1_v4 ,
& hf_pfcp_ue_ip_address_flag_b0_v6 ,
2017-09-05 15:22:14 +00:00
NULL
} ;
2018-10-04 16:22:28 +00:00
/* Octet 5 Spare IPv6D S/D V4 V6*/
2017-09-05 15:22:14 +00:00
proto_tree_add_bitmask_with_flags_ret_uint64 ( tree , tvb , offset , hf_pfcp_ue_ip_address_flags ,
2017-11-11 14:38:43 +00:00
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 ) ;
2017-09-05 15:22:14 +00:00
offset + = 1 ;
2017-11-10 09:50:09 +00:00
/* IPv4 address (if present)*/
if ( ( ue_ip_address_flags & 0x2 ) = = 2 ) {
proto_tree_add_item ( tree , hf_pfcp_ue_ip_addr_ipv4 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
}
2017-12-21 10:34:38 +00:00
/* IPv6 address (if present)*/
if ( ( ue_ip_address_flags & 0x1 ) = = 1 ) {
proto_tree_add_item ( tree , hf_pfcp_ue_ip_add_ipv6 , tvb , offset , 16 , ENC_NA ) ;
offset + = 16 ;
}
2018-10-04 16:22:28 +00:00
/* IPv6 Prefix Delegation Bits (if present)*/
if ( ( ue_ip_address_flags & 0x8 ) = = 8 ) {
proto_tree_add_item ( tree , hf_pfcp_ue_ip_add_ipv6_prefix , tvb , offset , 1 , ENC_NA ) ;
offset + = 1 ;
}
2017-11-10 09:50:09 +00:00
2017-09-05 15:22:14 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .63 Packet Rate
2017-09-05 15:22:14 +00:00
*/
2017-09-18 15:20:36 +00:00
static const value_string pfcp_pr_time_unit_vals [ ] = {
{ 0 , " Minute " } ,
{ 1 , " 6 minutes " } ,
{ 2 , " Hour " } ,
{ 3 , " Day " } ,
2017-10-19 11:39:47 +00:00
{ 4 , " Week " } ,
2017-09-18 15:20:36 +00:00
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_packet_rate ( 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_ )
2017-09-18 15:20:36 +00:00
{
int offset = 0 ;
guint64 flags ;
static const int * pfcp_packet_rate_flags [ ] = {
& hf_pfcp_spare_b7_b2 ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_packet_rate_b1_dlpr ,
& hf_pfcp_packet_rate_b0_ulpr ,
2017-09-18 15:20:36 +00:00
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 ) ;
offset + = 1 ;
/* Bit 1 - ULPR (Uplink Packet Rate): If this bit is set to "1", then octets m to (m+2) shall be present */
if ( ( flags & 0x1 ) = = 1 ) {
/* m */
proto_tree_add_item ( tree , hf_pfcp_spare_b7_b3 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_pfcp_ul_time_unit , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
/* (m+1) to (m+2) Maximum Uplink Packet Rate */
proto_tree_add_item ( tree , hf_pfcp_max_ul_pr , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
}
/* Bit 2 - DLPR (Downlink Packet Rate): If this bit is set to "1", then octets p to (p+2) shall be present*/
if ( ( flags & 0x2 ) = = 2 ) {
proto_tree_add_item ( tree , hf_pfcp_spare_b7_b3 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_pfcp_dl_time_unit , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
/* (m+1) to (m+2) Maximum Uplink Packet Rate */
proto_tree_add_item ( tree , hf_pfcp_max_dl_pr , 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 ) ;
}
}
2017-09-05 15:22:14 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .64 Outer Header Removal
*/
2017-09-06 15:38:12 +00:00
static const value_string pfcp_out_hdr_desc_vals [ ] = {
{ 0 , " GTP-U/UDP/IPv4 " } ,
{ 1 , " GTP-U/UDP/IPv6 " } ,
{ 2 , " UDP/IPv4 " } ,
{ 3 , " UDP/IPv6 " } ,
2019-01-13 16:17:21 +00:00
{ 4 , " IPv4 " } ,
{ 5 , " IPv6 " } ,
{ 6 , " GTP-U/UDP/IP " } ,
{ 7 , " VLAN S-TAG " } ,
{ 8 , " S-TAG and C-TAG " } ,
2017-09-06 15:38:12 +00:00
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_outer_hdr_rem ( 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_ )
2017-09-06 15:38:12 +00:00
{
int offset = 0 ;
guint32 value ;
2019-06-02 07:22:19 +00:00
static const int * pfcp_gtpu_ext_hdr_del_flags [ ] = {
& hf_pfcp_gtpu_ext_hdr_del_b0_pdu_sess_cont ,
NULL
} ;
2017-09-06 15:38:12 +00:00
proto_tree_add_item_ret_uint ( tree , hf_pfcp_out_hdr_desc , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
offset + + ;
proto_item_append_text ( item , " %s " , val_to_str_const ( value , pfcp_out_hdr_desc_vals , " Unknown " ) ) ;
2019-06-02 07:22:19 +00:00
/* Octet 6 GTP-U Extension Header Deletion */
if ( offset < length ) {
proto_tree_add_bitmask_list ( tree , tvb , offset , 1 , pfcp_gtpu_ext_hdr_del_flags , ENC_BIG_ENDIAN ) ;
offset + + ;
}
2017-09-06 15:38:12 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-03 13:38:23 +00:00
/*
* 8.2 .65 Recovery Time Stamp
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_recovery_time_stamp ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-03 13:38:23 +00:00
{
const gchar * time_str ;
int offset = 0 ;
/* indicates the UTC time when the node started. Octets 5 to 8 are encoded in the same format as
* the first four octets of the 64 - bit timestamp format as defined in section 6 of IETF RFC 5905 [ 26 ] .
*/
time_str = tvb_ntp_fmt_ts_sec ( tvb , 0 ) ;
proto_tree_add_string ( tree , hf_pfcp_recovery_time_stamp , tvb , offset , 4 , time_str ) ;
proto_item_append_text ( item , " %s " , time_str ) ;
offset + = 4 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .66 DL Flow Level Marking
2017-09-06 15:38:12 +00:00
*/
2017-09-18 15:20:36 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_dl_flow_level_marking ( 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_ )
2017-09-18 15:20:36 +00:00
{
int offset = 0 ;
guint64 flags_val ;
static const int * pfcp_dl_flow_level_marking_flags [ ] = {
& hf_pfcp_spare_b7_b2 ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_dl_flow_level_marking_b1_sci ,
& hf_pfcp_dl_flow_level_marking_b0_ttc ,
2017-09-18 15:20:36 +00:00
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 ) ;
offset + = 1 ;
/* Bit 1 - TTC (ToS/Traffic Class): If this bit is set to "1",
* then the ToS / Traffic Class field shall be present
*/
if ( ( flags_val & 0x1 ) = = 1 ) {
2018-04-09 11:55:07 +00:00
/* m to (m+1) ToS/Traffic Class
2017-09-18 15:20:36 +00:00
* The ToS / Traffic Class shall be encoded on two octets as an OctetString .
* The first octet shall contain the IPv4 Type - of - Service or the IPv6 Traffic - Class field and
* the second octet shall contain the ToS / Traffic Class mask field
*/
2018-02-22 22:12:15 +00:00
proto_tree_add_item ( tree , hf_pfcp_traffic_class , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( tree , hf_pfcp_traffic_mask , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
2017-09-18 15:20:36 +00:00
}
/* SCI (Service Class Indicator): If this bit is set to "1",
* then the Service Class Indicator field shall be present
*/
if ( ( flags_val & 0x2 ) = = 2 ) {
/* Octets p and (p+1) of the Service Class Indicator field, when present,
* shall be encoded respectively as octets 2 and 3 of the Service Class Indicator Extension Header
* specified in Figure 5.2 .2 .3 - 1 of 3 GPP TS 29.281
*/
proto_tree_add_item ( tree , hf_pfcp_sci , 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 ) ;
}
}
2017-09-06 15:38:12 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .67 Header Enrichment
2017-09-06 15:38:12 +00:00
*/
2017-09-21 13:07:27 +00:00
static const value_string pfcp_header_type_vals [ ] = {
{ 0 , " HTTP " } ,
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_header_enrichment ( 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_ )
2017-09-21 13:07:27 +00:00
{
int offset = 0 ;
guint32 len ;
2018-10-12 06:36:21 +00:00
2017-09-21 13:07:27 +00:00
/* Octet 5 Spare Header Type
*/
proto_tree_add_item ( tree , hf_pfcp_spare_b7_b5 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_pfcp_header_type , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
/* 6 Length of Header Field Name */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_hf_len , tvb , offset , 1 , ENC_BIG_ENDIAN , & len ) ;
offset + + ;
/* 7 to m Header Field Name
* Header Field Name shall be encoded as an OctetString
*/
2018-10-12 06:36:21 +00:00
if ( tvb_ascii_isprint ( tvb , offset , len ) )
proto_tree_add_item ( tree , hf_pfcp_hf_name_str , tvb , offset , len , ENC_ASCII | ENC_NA ) ;
else
proto_tree_add_item ( tree , hf_pfcp_hf_name , tvb , offset , len , ENC_NA ) ;
2017-09-21 13:07:27 +00:00
offset + = len ;
/* p Length of Header Field Value*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_hf_val_len , tvb , offset , 1 , ENC_BIG_ENDIAN , & len ) ;
offset + + ;
/* (p+1) to q Header Field Value */
2018-10-12 06:36:21 +00:00
if ( tvb_ascii_isprint ( tvb , offset , len ) )
proto_tree_add_item ( tree , hf_pfcp_hf_val_str , tvb , offset , len , ENC_ASCII | ENC_NA ) ;
else
proto_tree_add_item ( tree , hf_pfcp_hf_val , tvb , offset , len , ENC_NA ) ;
2017-09-21 13:07:27 +00:00
offset + = len ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-06 15:38:12 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .68 Measurement Information
2017-09-06 15:38:12 +00:00
*/
2017-09-21 13:07:27 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_measurement_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_ )
2017-09-21 13:07:27 +00:00
{
int offset = 0 ;
static const int * pfcp_measurement_info_flags [ ] = {
2019-01-13 16:17:21 +00:00
& hf_pfcp_spare_b7_b4 ,
& hf_pfcp_measurement_info_b3_istm ,
2018-02-27 21:56:45 +00:00
& hf_pfcp_measurement_info_b2_radi ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_measurement_info_b1_inam ,
& hf_pfcp_measurement_info_b0_mbqe ,
2017-09-21 13:07:27 +00:00
NULL
} ;
2019-01-13 16:17:21 +00:00
/* Octet 5 Spare ISTM INAM MBQE */
2017-09-21 13:07:27 +00:00
proto_tree_add_bitmask_with_flags ( tree , tvb , offset , hf_pfcp_measurement_info ,
ett_pfcp_measurement_info , pfcp_measurement_info_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-06 15:38:12 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .69 Node Report Type
2017-09-06 15:38:12 +00:00
*/
2017-09-21 13:07:27 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_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_ )
2017-09-21 13:07:27 +00:00
{
int offset = 0 ;
static const int * pfcp_node_report_type_flags [ ] = {
& hf_pfcp_spare_b7_b1 ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_node_report_type_b0_upfr ,
2017-09-21 13:07:27 +00:00
NULL
} ;
/* Octet 5 Spare INAM 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 ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-06 15:38:12 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .70 Remote GTP - U Peer
2017-09-06 15:38:12 +00:00
*/
2017-09-21 13:07:27 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_remote_gtp_u_peer ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-21 13:07:27 +00:00
{
int offset = 0 ;
guint64 flags ;
2019-07-04 22:57:12 +00:00
guint32 length_di , length_ni ;
2017-09-21 13:07:27 +00:00
static const int * pfcp_remote_gtp_u_peer_flags [ ] = {
2019-07-04 22:57:12 +00:00
& hf_pfcp_spare_b7_b4 ,
& hf_pfcp_remote_gtp_u_peer_flags_b3_ni ,
& hf_pfcp_remote_gtp_u_peer_flags_b2_di ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_remote_gtp_u_peer_flags_b1_v4 ,
& hf_pfcp_remote_gtp_u_peer_flags_b0_v6 ,
2017-09-21 13:07:27 +00:00
NULL
} ;
2019-07-04 22:57:12 +00:00
/* Octet 5 Spare NI DI V4 V6*/
2018-02-26 23:44:26 +00:00
proto_tree_add_bitmask_with_flags_ret_uint64 ( tree , tvb , offset , hf_pfcp_remote_gtp_u_peer_flags ,
2017-11-11 14:38:43 +00:00
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 ) ;
2017-09-21 13:07:27 +00:00
offset + = 1 ;
/* IPv4 address (if present)*/
2019-07-04 22:57:12 +00:00
if ( flags & 0x2 ) {
2017-09-21 13:07:27 +00:00
proto_tree_add_item ( tree , hf_pfcp_remote_gtp_u_peer_ipv4 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " IPv4 %s " , tvb_ip_to_str ( tvb , offset ) ) ;
2017-09-21 13:07:27 +00:00
offset + = 4 ;
}
2018-02-26 22:10:18 +00:00
/* IPv6 address (if present)*/
2019-07-04 22:57:12 +00:00
if ( flags & 0x1 ) {
2018-02-26 22:10:18 +00:00
proto_tree_add_item ( tree , hf_pfcp_remote_gtp_u_peer_ipv6 , tvb , offset , 16 , ENC_NA ) ;
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " IPv6 %s " , tvb_ip6_to_str ( tvb , offset ) ) ;
2018-02-26 22:10:18 +00:00
offset + = 16 ;
}
2019-07-04 22:57:12 +00:00
/* DI (if present)*/
if ( flags & 0x4 ) {
/* Length of Destination Interface field */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_remote_gtp_u_peer_length_di , tvb , offset , 1 , ENC_BIG_ENDIAN , & length_di ) ;
offset + = 1 ;
/* Destination Interface */
offset + = decode_pfcp_destination_interface ( tvb , pinfo , tree , item , offset , length_di ) ;
}
/* NI (if present)*/
if ( flags & 0x8 ) {
/* Length of Network Instance field */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_remote_gtp_u_peer_length_ni , tvb , offset , 1 , ENC_BIG_ENDIAN , & length_ni ) ;
offset + = 1 ;
/* Network Instance */
offset + = decode_pfcp_network_instance ( tvb , pinfo , tree , item , offset , length_ni ) ;
}
2017-09-21 13:07:27 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-06 15:38:12 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .71 UR - SEQN
2017-09-06 15:38:12 +00:00
*/
2017-09-21 13:07:27 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_ur_seqn ( 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_ )
2017-09-21 13:07:27 +00:00
{
guint value ;
/* 5 to 8 UR-SEQN
* The UR - SEQN value shall be encoded as an Unsigned32 binary integer value
*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_ur_seqn , tvb , 0 , 4 , ENC_BIG_ENDIAN , & value ) ;
proto_item_append_text ( item , " %u " , value ) ;
}
2017-09-06 15:38:12 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .72 Activate Predefined Rules
2017-09-06 15:38:12 +00:00
*/
2017-09-11 07:26:21 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_act_predef_rules ( 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_ )
2017-09-11 07:26:21 +00:00
{
int offset = 0 ;
/* Octet 5 to (n+4) Predefined Rules Name
* The Predefined Rules Name field shall be encoded as an OctetString
*/
proto_tree_add_item ( tree , hf_pfcp_predef_rules_name , tvb , offset , length , ENC_NA ) ;
}
2017-09-06 15:38:12 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .73 Deactivate Predefined Rules
2017-09-06 15:38:12 +00:00
*/
2017-09-11 07:26:21 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_deact_predef_rules ( 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_ )
2017-09-11 07:26:21 +00:00
{
int offset = 0 ;
/* Octet 5 to (n+4) Predefined Rules Name
* The Predefined Rules Name field shall be encoded as an OctetString
*/
proto_tree_add_item ( tree , hf_pfcp_predef_rules_name , tvb , offset , length , ENC_NA ) ;
}
2017-09-06 15:38:12 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .74 FAR ID
2017-09-06 15:38:12 +00:00
*/
2017-11-12 12:51:00 +00:00
static int
decode_pfcp_far_id ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item _U_ , gint offset )
2017-09-06 15:38:12 +00:00
{
guint32 far_id ;
2018-03-12 13:44:15 +00:00
guint8 far_id_flag ;
2017-09-06 15:38:12 +00:00
/* Octet 5 to 8 FAR ID value
* The bit 8 of octet 5 is used to indicate if the Rule ID is dynamically allocated
* by the CP function or predefined in the UP function . If set to 0 , it indicates that
* the Rule is dynamically provisioned by the CP Function . If set to 1 , it indicates that
* the Rule is predefined in the UP Function .
*/
2018-03-12 13:44:15 +00:00
far_id_flag = tvb_get_guint8 ( tvb , offset ) & 0x80 ;
2017-09-06 15:38:12 +00:00
proto_tree_add_item ( tree , hf_pfcp_far_id_flg , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item_ret_uint ( tree , hf_pfcp_far_id , tvb , offset , 4 , ENC_BIG_ENDIAN , & far_id ) ;
offset + = 4 ;
proto_item_append_text ( item , " %s %u " ,
2018-03-12 13:44:15 +00:00
( ( far_id_flag ) ? pfcp_id_predef_dynamic_tfs . true_string : pfcp_id_predef_dynamic_tfs . false_string ) ,
2017-09-06 15:38:12 +00:00
( far_id & 0x7fffffff ) ) ;
2017-11-12 12:51:00 +00:00
return offset ;
}
2018-05-03 21:09:31 +00:00
2017-11-12 12:51:00 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_far_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_ )
2017-11-12 12:51:00 +00:00
{
int offset = 0 ;
offset = decode_pfcp_far_id ( tvb , pinfo , tree , item , offset ) ;
2017-09-06 15:38:12 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-03 13:38:23 +00:00
* 8.2 .75 QER ID
2017-09-06 15:38:12 +00:00
*/
2017-11-12 12:51:00 +00:00
static int
decode_pfcp_qer_id ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item _U_ , guint offset )
2017-09-06 15:38:12 +00:00
{
guint32 qer_id ;
2018-03-12 13:44:15 +00:00
guint8 qer_id_flag ;
2017-09-13 15:22:05 +00:00
/* Octet 5 to 8 QER ID value
2017-09-06 15:38:12 +00:00
* The bit 8 of octet 5 is used to indicate if the Rule ID is dynamically allocated by the CP function
* or predefined in the UP function . If set to 0 , it indicates that the Rule is dynamically provisioned
* by the CP Function . If set to 1 , it indicates that the Rule is predefined in the UP Function
*/
2018-03-12 13:44:15 +00:00
qer_id_flag = tvb_get_guint8 ( tvb , offset ) & 0x80 ;
2017-09-06 15:38:12 +00:00
proto_tree_add_item ( tree , hf_pfcp_qer_id_flg , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item_ret_uint ( tree , hf_pfcp_qer_id , tvb , offset , 4 , ENC_BIG_ENDIAN , & qer_id ) ;
offset + = 4 ;
proto_item_append_text ( item , " %s %u " ,
2018-03-12 13:44:15 +00:00
( ( qer_id_flag ) ? pfcp_id_predef_dynamic_tfs . true_string : pfcp_id_predef_dynamic_tfs . false_string ) ,
2017-09-06 15:38:12 +00:00
( qer_id & 0x7fffffff ) ) ;
2017-11-12 12:51:00 +00:00
return offset ;
}
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_qer_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_ )
2017-11-12 12:51:00 +00:00
{
int offset = 0 ;
offset = decode_pfcp_qer_id ( tvb , pinfo , tree , item , offset ) ;
2017-09-06 15:38:12 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2017-09-21 13:07:27 +00:00
* 8.2 .76 OCI Flags
2017-09-06 15:38:12 +00:00
*/
2017-09-21 13:07:27 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_oci_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_ )
2017-09-21 13:07:27 +00:00
{
int offset = 0 ;
static const int * pfcp_oci_flags_flags [ ] = {
& hf_pfcp_spare_b7_b1 ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_oci_flags_b0_aoci ,
2017-09-21 13:07:27 +00:00
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 ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-06 15:38:12 +00:00
/*
2018-02-28 21:51:36 +00:00
* 8.2 .77 PFCP Association Release Request
2017-09-06 15:38:12 +00:00
*/
2017-09-21 13:07:27 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_pfcp_assoc_rel_req ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item _U_ , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2017-09-21 13:07:27 +00:00
{
int offset = 0 ;
2018-05-23 21:11:42 +00:00
static const int * pfcp_pfcp_assoc_rel_req_flags [ ] = {
2017-09-21 13:07:27 +00:00
& hf_pfcp_spare_b7_b1 ,
2018-02-27 22:08:05 +00:00
& hf_pfcp_pfcp_assoc_rel_req_b0_sarr ,
2017-09-21 13:07:27 +00:00
NULL
} ;
/* Octet 5 Spare SARR */
2018-02-27 22:08:05 +00:00
proto_tree_add_bitmask_with_flags ( tree , tvb , offset , hf_pfcp_pfcp_assoc_rel_req_flags ,
2018-05-23 21:11:42 +00:00
ett_pfcp_assoc_rel_req_flags , pfcp_pfcp_assoc_rel_req_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT ) ;
2017-09-21 13:07:27 +00:00
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-06 15:38:12 +00:00
/*
2017-09-03 13:38:23 +00:00
* 8.2 .78 Graceful Release Period
2017-09-06 15:38:12 +00:00
*/
2017-09-19 14:09:35 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_graceful_release_period ( 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_ )
2017-09-19 14:09:35 +00:00
{
int offset = 0 ;
guint32 unit , value ;
2017-09-03 13:38:23 +00:00
2017-09-19 14:09:35 +00:00
/* Octet 5 Timer unit Timer value */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_timer_unit , tvb , offset , 1 , ENC_BIG_ENDIAN , & unit ) ;
proto_tree_add_item_ret_uint ( tree , hf_pfcp_timer_value , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
offset + + ;
2018-02-26 22:19:06 +00:00
if ( ( unit = = 0 ) & & ( value = = 0 ) ) {
2017-09-19 14:09:35 +00:00
proto_item_append_text ( item , " Stopped " ) ;
2018-02-26 22:19:06 +00:00
} else {
switch ( unit ) {
case 0 :
proto_item_append_text ( item , " %u s " , value * 2 ) ;
break ;
case 1 :
proto_item_append_text ( item , " %u min " , value ) ;
break ;
case 2 :
proto_item_append_text ( item , " %u min " , value * 10 ) ;
break ;
case 3 :
proto_item_append_text ( item , " %u hours " , value ) ;
break ;
case 4 :
proto_item_append_text ( item , " %u hours " , value * 10 ) ;
break ;
case 7 :
proto_item_append_text ( item , " %u Infinite " , value ) ;
break ;
/* Value 5 and 6 */
default :
proto_item_append_text ( item , " %u min " , value * 1 ) ;
break ;
}
2017-09-19 14:09:35 +00:00
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-11-10 09:50:09 +00:00
/*
* 8.2 .79 PDN Type
*/
static const value_string pfcp_pdn_type_vals [ ] = {
{ 0 , " Reserved " } ,
{ 1 , " IPv4 " } ,
{ 2 , " IPv6 " } ,
{ 3 , " IPv4V6 " } ,
{ 4 , " Non-IP " } ,
2018-07-11 23:19:26 +00:00
{ 5 , " Ethernet " } ,
2017-11-10 09:50:09 +00:00
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_pdn_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_ )
2017-11-10 09:50:09 +00:00
{
int offset = 0 ;
guint32 value ;
2017-11-12 12:51:00 +00:00
/* Octet 5 Application Identifier
2017-11-10 09:50:09 +00:00
* The Application Identifier shall be encoded as an OctetString ( see 3 GPP TS 29.212 )
*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_pdn_type , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
offset + + ;
proto_item_append_text ( item , " %s " , val_to_str_const ( value , pfcp_pdn_type_vals , " Unknown " ) ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-11-12 12:51:00 +00:00
/*
* 8.2 .80 Failed Rule ID
*/
static const value_string pfcp_failed_rule_id_type_vals [ ] = {
{ 0 , " PDR " } ,
{ 1 , " FAR " } ,
{ 2 , " QER " } ,
{ 3 , " URR " } ,
{ 4 , " BAR " } ,
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_failed_rule_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_ )
2017-11-12 12:51:00 +00:00
{
int offset = 0 ;
guint32 rule_type ;
/* Octet 5 Rule ID Type */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_failed_rule_id_type , tvb , offset , 1 , ENC_BIG_ENDIAN , & rule_type ) ;
offset + + ;
2018-12-20 14:39:32 +00:00
proto_item_append_text ( item , " %s: " , val_to_str_const ( rule_type , pfcp_failed_rule_id_type_vals , " Unknown " ) ) ;
2017-11-12 12:51:00 +00:00
/* 6 to p Rule ID value
* The length and the value of the Rule ID value field shall be set as specified for the
* PDR ID , FAR ID , QER ID , URR ID and BAR ID IE types respectively .
*/
switch ( rule_type ) {
case 0 :
/* PDR ID */
offset = decode_pfcp_pdr_id ( tvb , pinfo , tree , item , offset ) ;
break ;
case 1 :
/* FAR ID */
offset = decode_pfcp_far_id ( tvb , pinfo , tree , item , offset ) ;
break ;
case 2 :
/* QER ID */
offset = decode_pfcp_qer_id ( tvb , pinfo , tree , item , offset ) ;
break ;
case 3 :
/* URR ID */
offset = decode_pfcp_urr_id ( tvb , pinfo , tree , item , offset ) ;
break ;
case 4 :
/* BAR ID */
offset = decode_pfcp_bar_id ( tvb , pinfo , tree , item , offset ) ;
break ;
default :
break ;
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .81 Time Quota Mechanism
*/
static const value_string pfcp_time_qouta_mechanism_bti_type_vals [ ] = {
{ 0 , " CTP " } ,
{ 1 , " DTP " } ,
{ 0 , NULL }
} ;
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_time_qouta_mechanism ( 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_ )
2017-11-12 12:51:00 +00:00
{
int offset = 0 ;
guint32 bti_type ;
/* Octet 5 BIT Type */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_time_qouta_mechanism_bti_type , tvb , offset , 1 , ENC_BIG_ENDIAN , & bti_type ) ;
offset + + ;
proto_item_append_text ( item , " %s " , val_to_str_const ( bti_type , pfcp_time_qouta_mechanism_bti_type_vals , " Unknown " ) ) ;
/* Base Time Interval
* The Base Time Interval , shall be encoded as an Unsigned32
* as specified in subclause 7.2 .29 of 3 GPP TS 32.299
*/
proto_tree_add_item ( tree , hf_pfcp_time_qouta_mechanism_bti , 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 .82 User Plane IP Resource Information
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_user_plane_ip_resource_infomation ( 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_ )
2017-11-12 12:51:00 +00:00
{
int offset = 0 ;
guint64 upiri_flags_val ;
guint32 upiri_teid_range ;
static const int * pfcp_upiri_flags [ ] = {
& hf_pfcp_spare_b7_b6 ,
2018-07-11 23:19:26 +00:00
& hf_pfcp_upiri_flg_b6_assosi ,
2017-11-12 12:51:00 +00:00
& hf_pfcp_upiri_flg_b5_assoni ,
2018-07-05 12:08:59 +00:00
& hf_pfcp_upiri_flg_b2b4_teidri ,
2018-02-26 23:44:26 +00:00
& hf_pfcp_upiri_flags_b1_v6 ,
& hf_pfcp_upiri_flags_b0_v4 ,
2017-11-12 12:51:00 +00:00
NULL
} ;
2018-07-11 23:19:26 +00:00
/* Octet 5 Spare ASSOSI ASSONI TEIDRI TEIDRI TEIDRI V6 V4*/
2017-11-12 12:51:00 +00:00
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 ) ;
2017-11-13 09:27:46 +00:00
2017-11-12 12:51:00 +00:00
/* 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 ,
* otherwise the IPv4 address field shall not be present .
* Bit 2 - V6 : If this bit is set to " 1 " and the CH bit is not set , then the IPv6 address field shall be present ,
* otherwise the IPv6 address field shall not be present .
* Bit 3 - 5 - TEIDRI ( TEID Range Indication ) : the value of this field indicates the number of bits in the most significant
* octet of a TEID that are used to partition the TEID range , e . g . if this field is set to " 4 " , then the first
* 4 bits in the TEID are used to partition the TEID range .
* Bit 6 - ASSONI ( Associated Network Instance ) : if this bit is set to " 1 " , then the Network Instance field shall be present ,
* otherwise the Network Instance field shall not be present ,
* i . e . User Plane IP Resource Information provided can be used by CP function for any Network Instance of
* GTP - U user plane in the UP function .
2018-07-11 23:19:26 +00:00
* Bit 7 - ASSOSI ( Associated Source Interface ) : if this bit is set to " 1 " , then the Source Interface field shall be present ,
* otherwise the Source Interface field shall not be present .
2017-11-12 12:51:00 +00:00
*/
/* Octet 5, bit 3-5, TEID Range Indication */
2017-11-13 09:27:46 +00:00
proto_tree_add_item_ret_uint ( tree , hf_pfcp_upiri_teidri , tvb , offset , 1 , ENC_BIG_ENDIAN , & upiri_teid_range ) ;
offset + = 1 ;
2017-11-12 12:51:00 +00:00
if ( upiri_teid_range > 0 )
{
/* Octet 6 TEID Range */
proto_tree_add_item ( tree , hf_pfcp_upiri_teid_range , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
}
if ( ( upiri_flags_val & 0x1 ) = = 1 ) {
/* m to (m+3) IPv4 address */
proto_tree_add_item ( tree , hf_pfcp_upiri_ipv4 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
}
if ( ( upiri_flags_val & 0x2 ) = = 2 ) {
/* p to (p+15) IPv6 address */
proto_tree_add_item ( tree , hf_pfcp_upiri_ipv6 , tvb , offset , 16 , ENC_NA ) ;
offset + = 16 ;
}
2018-07-05 12:08:59 +00:00
if ( ( upiri_flags_val & 0x20 ) = = 0x20 ) {
2017-11-12 12:51:00 +00:00
/* k to (l) Network Instance */
2018-12-14 13:27:07 +00:00
guint16 ni_len = length - offset ;
if ( ( upiri_flags_val & 0x40 ) = = 0x40 ) {
ni_len - - ;
}
offset = decode_pfcp_network_instance ( tvb , pinfo , tree , item , offset , ni_len ) ;
2017-11-12 12:51:00 +00:00
}
2018-07-11 23:19:26 +00:00
if ( ( upiri_flags_val & 0x40 ) = = 0x40 ) {
/* r Source Interface */
offset = decode_pfcp_source_interface ( tvb , pinfo , tree , item , offset ) ;
}
2017-11-12 12:51:00 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
2017-09-03 13:38:23 +00:00
2017-11-12 12:51:00 +00:00
}
2017-09-03 13:38:23 +00:00
2018-02-15 15:04:34 +00:00
/*
* 8.2 .83 User Plane Inactivity Timer
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_user_plane_inactivity_timer ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item _U_ , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2018-02-15 15:04:34 +00:00
{
int offset = 0 ;
guint32 value ;
/*
* The User Plane Inactivity Timer field shall be encoded as an Unsigned32 binary integer value .
* The timer value " 0 " shall be interpreted as an indication that
* user plane inactivity detection and reporting is stopped .
*/
/* 5 to 8 Inactivity Timer */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_user_plane_inactivity_timer , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
if ( value = = 0 )
proto_item_append_text ( item , " (Stopped) " ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2018-02-27 23:13:29 +00:00
/*
* 8.2 .84 Multiplier
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_multiplier ( 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_ )
2018-02-27 23:13:29 +00:00
{
/* 5 to 12 Value-Digits */
proto_tree_add_item ( tree , hf_pfcp_multiplier_value_digits , tvb , 0 , 8 , ENC_BIG_ENDIAN ) ;
/* 12 to 15 Exponent */
proto_tree_add_item ( tree , hf_pfcp_multiplier_exponent , tvb , 8 , 4 , ENC_BIG_ENDIAN ) ;
}
/*
* 8.2 .85 Aggregated URR ID IE
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_aggregated_urr_id_ie ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item , guint16 length _U_ , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2018-02-27 23:13:29 +00:00
{
2018-02-28 21:51:36 +00:00
guint32 value ;
2018-02-27 23:13:29 +00:00
/* 5 to 8 URR ID */
2018-02-28 21:51:36 +00:00
proto_tree_add_item_ret_uint ( tree , hf_pfcp_aggregated_urr_id_ie_urr_id , tvb , 0 , 4 , ENC_BIG_ENDIAN , & value ) ;
2018-02-27 23:13:29 +00:00
2018-02-28 21:51:36 +00:00
proto_item_append_text ( item , " %u " , value ) ;
2018-02-27 23:13:29 +00:00
}
2018-02-28 20:20:49 +00:00
/*
* 8.2 .86 Subsequent Volume Quota
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_subsequent_volume_quota ( 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_ )
2018-02-28 20:20:49 +00:00
{
int offset = 0 ;
guint64 flags_val ;
static const int * pfcp_subsequent_volume_quota_flags [ ] = {
& hf_pfcp_spare_b7_b3 ,
& hf_pfcp_subsequent_volume_quota_b2_dlvol ,
& hf_pfcp_subsequent_volume_quota_b1_ulvol ,
& hf_pfcp_subsequent_volume_quota_b0_tovol ,
NULL
} ;
/* Octet 5 Spare DLVOL ULVOL TOVOL*/
proto_tree_add_bitmask_with_flags_ret_uint64 ( tree , tvb , offset , hf_pfcp_subsequent_volume_quota ,
ett_pfcp_subsequent_volume_quota , pfcp_subsequent_volume_quota_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT , & flags_val ) ;
offset + = 1 ;
/* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value.
* They shall contain the total , uplink or downlink number of octets respectively .
*/
if ( ( flags_val & 0x1 ) = = 1 ) {
/* m to (m+7) Total Volume
* TOVOL : If this bit is set to " 1 " , then the Total Volume field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_subsequent_volume_quota_tovol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( ( flags_val & 0x2 ) = = 2 ) {
2018-04-09 11:55:07 +00:00
/* p to (p+7) Uplink Volume
2018-02-28 20:20:49 +00:00
* ULVOL : If this bit is set to " 1 " , then the Uplink Volume field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_subsequent_volume_quota_ulvol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( ( flags_val & 0x4 ) = = 4 ) {
/* q to (q+7) Downlink Volume
* DLVOL : If this bit is set to " 1 " , then the Downlink Volume field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_subsequent_volume_quota_dlvol , tvb , offset , 8 , ENC_BIG_ENDIAN ) ;
offset + = 8 ;
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .87 Subsequent Time Quota
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_subsequent_time_quota ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2018-02-28 20:20:49 +00:00
{
int offset = 0 ;
guint value ;
/* Octet 5 to 8 Time Quota
* The Time Quota field shall be encoded as an Unsigned32 binary integer value .
* It shall contain the duration in seconds .
*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_subsequent_time_quota , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u s " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2018-04-09 11:55:07 +00:00
/*
* 8.2 .88 RQI
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_rqi ( 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_ )
2018-04-09 11:55:07 +00:00
{
int offset = 0 ;
proto_tree_add_item ( tree , hf_pfcp_spare_b7_b1 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_pfcp_rqi_flag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
2018-04-10 15:58:35 +00:00
return ;
2018-04-09 11:55:07 +00:00
}
/*
* 8.2 .89 QFI
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_qfi ( 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_ )
2018-04-09 11:55:07 +00:00
{
int offset = 0 ;
2018-10-04 16:22:28 +00:00
/* Octets 5 SPARE QFI
2018-04-09 11:55:07 +00:00
* The Application Identifier shall be encoded as an OctetString
*/
2018-10-04 16:22:28 +00:00
proto_tree_add_item ( tree , hf_pfcp_spare_b7_b6 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_pfcp_qfi , tvb , offset , 1 , ENC_NA ) ;
offset + = 1 ;
2018-04-09 11:55:07 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
2018-04-10 15:58:35 +00:00
return ;
2018-04-09 11:55:07 +00:00
}
/*
* 8.2 .90 Querry URR Reference
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_query_urr_reference ( 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_ )
2018-04-09 11:55:07 +00:00
{
int offset = 0 ;
/* Octets 5 to 8 Query URR Reference value
* The Query URR Reference value shall be encoded as an Unsigned32 binary integer value .
* It shall contain the reference of a query request for URR ( s ) .
*/
proto_tree_add_item ( tree , hf_pfcp_query_urr_reference , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .91 Additional Usage Reports Information
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_additional_usage_reports_information ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item _U_ , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2018-04-09 11:55:07 +00:00
{
int offset = 0 ;
/*
* Octet 8 7 6 5 4 3 2 1
* 5 | AURI | Number of Additional Usage Reports value |
* 6 | Number of Additional Usage Reports value |
*
* The Number of Additional Usage Reports value shall be encoded as
2018-08-09 19:28:16 +00:00
* an unsigned binary integer value on 15 bits .
* Bit 7 of Octet 5 is the most significant bit and bit 1 of Octet 6 is the least significant bit .
* The bit 8 of octet 5 shall encode the AURI ( Additional Usage Reports Indication ) flag { . . . } .
*/
static const int * pfcp_additional_usage_reports_information_flags [ ] = {
& hf_pfcp_additional_usage_reports_information_b15_auri ,
& hf_pfcp_additional_usage_reports_information_b14_b0_number_value ,
NULL
} ;
proto_tree_add_bitmask_with_flags ( tree , tvb , offset , hf_pfcp_additional_usage_reports_information ,
ett_pfcp_additional_usage_reports_information , pfcp_additional_usage_reports_information_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT ) ;
offset + = 2 ;
2018-04-09 11:55:07 +00:00
2018-08-09 19:28:16 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
2018-04-09 11:55:07 +00:00
}
2018-04-10 15:58:35 +00:00
/*
* 8.2 .92 Traffic Endpoint ID
*/
2018-08-13 22:43:30 +00:00
static void dissect_pfcp_traffic_endpoint_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_ )
2018-04-10 15:58:35 +00:00
{
int offset = 0 ;
proto_tree_add_item ( tree , hf_pfcp_traffic_endpoint_id , 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 ;
}
2018-05-04 21:42:09 +00:00
/*
* 8.2 .93 MAC Address
*/
2018-08-13 22:43:30 +00:00
static void dissect_pfcp_mac_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_ )
2018-05-04 21:42:09 +00:00
{
int offset = 0 ;
guint64 flags_val ;
static const int * pfcp_mac_address_flags [ ] = {
& hf_pfcp_spare_b7_b4 ,
& hf_pfcp_mac_address_flags_b3_udes ,
& hf_pfcp_mac_address_flags_b2_usou ,
& hf_pfcp_mac_address_flags_b1_dest ,
& hf_pfcp_mac_address_flags_b0_sour ,
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 ) ;
offset + = 1 ;
// Octets "m to (m+5)" or "n to (n+5)" and "o to (o+5)" or "p to (p+5)", if present,
// shall contain a MAC address value (12-digit hexadecimal numbers).
if ( ( flags_val & 0x1 ) = = 1 ) {
/* m to (m+5) Source MAC Address
* SOUR : If this bit is set to " 1 " , then the Source MAC Address field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_mac_address_source_mac_address , tvb , offset , 6 , ENC_NA ) ;
offset + = 6 ;
}
if ( ( flags_val & 0x2 ) = = 2 ) {
/* n to (n+5) Destination MAC Address
* DEST : If this bit is set to " 1 " , then the Destination MAC Address field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_mac_address_dest_mac_address , tvb , offset , 6 , ENC_NA ) ;
offset + = 6 ;
}
if ( ( flags_val & 0x4 ) = = 4 ) {
/* o to (o+5) Upper Source MAC Address
* USOU : If this bit is set to " 1 " , then the Upper Source MAC Address field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_mac_address_upper_source_mac_address , tvb , offset , 6 , ENC_NA ) ;
offset + = 6 ;
}
if ( ( flags_val & 0x8 ) = = 8 ) {
/* p to (p+5) Upper Destination MAC Address
* UDES : If this bit is set to " 1 " , then the Upper Destination MAC Address field shall be present
*/
proto_tree_add_item ( tree , hf_pfcp_mac_address_upper_dest_mac_address , tvb , offset , 6 , ENC_NA ) ;
offset + = 6 ;
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
return ;
}
/*
* 8.2 .94 C - TAG ( Customer - VLAN tag )
*/
2018-08-13 22:43:30 +00:00
static void dissect_pfcp_c_tag ( 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_ )
2018-05-04 21:42:09 +00:00
{
int offset = 0 ;
2019-01-13 16:17:21 +00:00
offset = decode_pfcp_c_tag ( tvb , pinfo , tree , item , offset ) ;
2018-05-04 21:42:09 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
return ;
}
/*
* 8.2 .95 S - TAG ( Service - VLAN tag )
*/
2018-08-13 22:43:30 +00:00
static void dissect_pfcp_s_tag ( 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_ )
2018-05-04 21:42:09 +00:00
{
int offset = 0 ;
2019-01-13 16:17:21 +00:00
offset = decode_pfcp_s_tag ( tvb , pinfo , tree , item , offset ) ;
2018-05-04 21:42:09 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
return ;
}
/*
* 8.2 .96 Ethertype
*/
2018-08-13 22:43:30 +00:00
static void dissect_pfcp_ethertype ( 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_ )
2018-05-04 21:42:09 +00:00
{
int offset = 0 ;
proto_tree_add_item ( tree , hf_pfcp_ethertype , tvb , offset , 1 , ENC_NA ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
return ;
}
/*
* 8.2 .97 Proxying
*/
2018-08-13 22:43:30 +00:00
static void dissect_pfcp_proxying ( 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_ )
2018-05-04 21:42:09 +00:00
{
int offset = 0 ;
guint64 flags_val ;
static const int * pfcp_proxying_flags [ ] = {
& hf_pfcp_spare_b7_b2 ,
& hf_pfcp_proxying_flags_b1_ins ,
& hf_pfcp_proxying_flags_b0_arp ,
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 ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
return ;
}
/*
* 8.2 .98 Ethertype Filter ID
*/
2018-08-13 22:43:30 +00:00
static void dissect_pfcp_ethertype_filter_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_ )
2018-05-04 21:42:09 +00:00
{
int offset = 0 ;
proto_tree_add_item ( tree , hf_pfcp_ethertype_filter_id , tvb , offset , 4 , ENC_NA ) ;
offset + = 4 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
return ;
}
/*
* 8.2 .99 Ethernet Filter Properties
*/
2018-08-13 22:43:30 +00:00
static void dissect_pfcp_ethernet_filter_properties ( 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_ )
2018-05-04 21:42:09 +00:00
{
int offset = 0 ;
guint64 flags_val ;
static const int * pfcp_ethernet_filter_properties_flags [ ] = {
& hf_pfcp_spare_b7_b1 ,
& hf_pfcp_ethertype_filter_properties_flags_b0_bide ,
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 ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
return ;
}
2018-07-11 23:19:26 +00:00
/*
* 8.2 .100 Suggested Buffering Packets Count
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_suggested_buffering_packets_count ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
2018-07-11 23:19:26 +00:00
{
int offset = 0 ;
guint32 value ;
/* 5 Packet count value */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_suggested_buffering_packets_count_packet_count , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
offset + = 1 ;
proto_item_append_text ( item , " %u packets " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .101 User ID
*/
2018-08-13 22:43:30 +00:00
static void dissect_pfcp_user_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_ )
2018-07-11 23:19:26 +00:00
{
int offset = 0 ;
guint64 flags_val ;
2018-10-04 16:22:28 +00:00
guint32 length_imsi , length_imei , length_msisdn , length_nai ;
2018-10-18 17:36:45 +00:00
const gchar * mei_str ;
2018-07-11 23:19:26 +00:00
static const int * pfcp_user_id_flags [ ] = {
2018-10-04 16:22:28 +00:00
& hf_pfcp_spare_b7_b3 ,
& hf_pfcp_user_id_flags_b3_naif ,
& hf_pfcp_user_id_flags_b2_msisdnf ,
2018-07-11 23:19:26 +00:00
& hf_pfcp_user_id_flags_b1_imeif ,
& hf_pfcp_user_id_flags_b0_imsif ,
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 ) ;
offset + = 1 ;
/* Bit 1 - IMSIF: If this bit is set to "1", then the Length of IMSI and IMSI fields shall be present */
if ( ( flags_val & 0x1 ) = = 1 ) {
/* 6 Length of IMSI */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_user_id_length_of_imsi , tvb , offset , 1 , ENC_BIG_ENDIAN , & length_imsi ) ;
offset + = 1 ;
/* 7 to (a) IMSI */
2018-10-18 17:36:45 +00:00
dissect_e212_imsi ( tvb , pinfo , tree , offset , length_imsi , FALSE ) ;
2018-07-11 23:19:26 +00:00
offset + = length_imsi ;
}
/* Bit 2 - IMEIF: If this bit is set to "1", then the Length of IMEI and IMEI fields shall be present */
if ( ( flags_val & 0x2 ) = = 2 ) {
/* b Length of IMEI */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_user_id_length_of_imei , tvb , offset , 1 , ENC_BIG_ENDIAN , & length_imei ) ;
offset + = 1 ;
2018-10-18 17:36:45 +00:00
2018-10-04 16:22:28 +00:00
/* (b+1) to c IMEI */
2018-10-18 17:36:45 +00:00
/* Fetch the BCD encoded digits from tvb low half byte, formating the digits according to
* a default digit set of 0 - 9 returning " ? " for overdecadic digits a pointer to the EP
* allocated string will be returned .
*/
mei_str = tvb_bcd_dig_to_wmem_packet_str ( tvb , offset , length_imei , NULL , FALSE ) ;
proto_tree_add_string ( tree , hf_pfcp_user_id_imei , tvb , offset , length_imei , mei_str ) ;
2018-07-11 23:19:26 +00:00
offset + = length_imei ;
}
2018-10-04 16:22:28 +00:00
/* Bit 3 - MSIDNF: If this bit is set to "1", then the Length of MSISDN and MSISDN fields shall be present */
2018-10-23 12:59:30 +00:00
if ( ( flags_val & 0x4 ) = = 4 ) {
2018-10-04 16:22:28 +00:00
/* d Length of MSISDN */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_user_id_length_of_msisdn , tvb , offset , 1 , ENC_BIG_ENDIAN , & length_msisdn ) ;
offset + = 1 ;
/* (d+1) to e MSISDN */
2018-10-18 17:36:45 +00:00
dissect_e164_msisdn ( tvb , tree , offset , length_msisdn , E164_ENC_BCD ) ;
2018-10-04 16:22:28 +00:00
offset + = length_msisdn ;
}
/* Bit 4 - NAIF: If this bit is set to "1", then the Length of NAI and NAI fields shall be present */
2018-10-23 12:59:30 +00:00
if ( ( flags_val & 0x8 ) = = 8 ) {
2018-10-04 16:22:28 +00:00
/* f Length of NAI */
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 */
2018-10-18 17:36:45 +00:00
proto_tree_add_item ( tree , hf_pfcp_user_id_nai , tvb , offset , length_nai , ENC_ASCII | ENC_NA ) ;
2018-10-04 16:22:28 +00:00
offset + = length_nai ;
}
2018-07-11 23:19:26 +00:00
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
return ;
}
/*
* 8.2 .102 Ethernet PDU Session Information
*/
2018-08-13 22:43:30 +00:00
static void dissect_pfcp_ethernet_pdu_session_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_ )
2018-07-11 23:19:26 +00:00
{
int offset = 0 ;
static const int * pfcp_ethernet_pdu_session_information_flags [ ] = {
& hf_pfcp_spare_b7_b1 ,
& hf_pfcp_ethernet_pdu_session_information_flags_b0_ethi ,
NULL
} ;
/* Octet 5 Spare IMEIF IMSIF */
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 ) ;
offset + = 1 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
return ;
}
/*
* 8.2 .103 MAC Addresses Detected
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_mac_addresses_detected ( 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_ )
2018-07-11 23:19:26 +00:00
{
int offset = 0 ;
guint32 value , i ;
/* 5 Number of MAC addresses */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_mac_addresses_detected_number_of_mac_addresses , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
offset + = 1 ;
/* o to (o+6) MAC Address */
for ( i = 0 ; i < value ; i + + )
{
proto_tree_add_item ( tree , hf_pfcp_mac_addresses_detected_mac_address , tvb , offset , 6 , ENC_NA ) ;
offset + = 6 ;
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .104 MAC Addresses Removed
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_mac_addresses_removed ( 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_ )
2018-07-11 23:19:26 +00:00
{
int offset = 0 ;
guint32 value , i ;
/* 5 Number of MAC addresses */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_mac_addresses_removed_number_of_mac_addresses , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
offset + = 1 ;
/* o to (o+6) MAC Address */
for ( i = 0 ; i < value ; i + + )
{
proto_tree_add_item ( tree , hf_pfcp_mac_addresses_removed_mac_address , tvb , offset , 6 , ENC_NA ) ;
offset + = 6 ;
}
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .105 Ethernet Inactivity Timer
*/
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_ethernet_inactivity_timer ( 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_ )
2018-07-11 23:19:26 +00:00
{
int offset = 0 ;
guint32 value ;
/*
* The Ethernet Inactivity Timer field shall be encoded as an Unsigned32 binary integer value .
*/
/* 5 to 8 Inactivity Timer */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_ethernet_inactivity_timer , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2018-10-04 16:22:28 +00:00
/*
2019-01-13 16:17:21 +00:00
* 8.2 .106 Subsequent Event Quota
2018-10-04 16:22:28 +00:00
*/
static void
2019-01-13 16:17:21 +00:00
dissect_pfcp_subsequent_event_quota ( 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_ )
2018-10-04 16:22:28 +00:00
{
int offset = 0 ;
guint32 value ;
/*
2019-01-13 16:17:21 +00:00
* The Subsequent Event Quota field shall be encoded as an Unsigned32 binary integer value .
2018-10-04 16:22:28 +00:00
*/
2019-01-13 16:17:21 +00:00
/* 5 to 8 Subsequent Event Quota */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_subsequent_event_quota , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
2018-10-04 16:22:28 +00:00
offset + = 4 ;
proto_item_append_text ( item , " %u " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
2019-01-13 16:17:21 +00:00
* 8.2 .107 Subsequent Event Threshold
2018-10-04 16:22:28 +00:00
*/
static void
2019-01-13 16:17:21 +00:00
dissect_pfcp_subsequent_event_threshold ( 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_ )
2018-10-04 16:22:28 +00:00
{
int offset = 0 ;
guint32 value ;
/*
2019-01-13 16:17:21 +00:00
* The Subsequent Event Threshold field shall be encoded as an Unsigned32 binary integer value .
2018-10-04 16:22:28 +00:00
*/
2019-01-13 16:17:21 +00:00
/* 5 to 8 Subsequent Event Threshold */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_subsequent_event_threshold , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
2018-10-04 16:22:28 +00:00
offset + = 4 ;
proto_item_append_text ( item , " %u " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .108 Trace Information
*/
static void
dissect_pfcp_trace_information ( 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 ;
guint32 length_trigger_events , length_list_interfaces , length_ipaddress ;
/* 5 to 7 MCC MNC */
offset = dissect_e212_mcc_mnc ( tvb , pinfo , tree , offset , E212_NONE , TRUE ) ;
/* 8 to 10 Trace ID */
proto_tree_add_item ( tree , hf_pfcp_trace_information_trace_id , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
offset + = 3 ;
/* 11 Length of Trigger Events */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_trace_information_length_trigger_events , tvb , offset , 1 , ENC_BIG_ENDIAN , & length_trigger_events ) ;
offset + = 1 ;
/* 12 to m Trigger Events */
proto_tree_add_item ( tree , hf_pfcp_trace_information_trigger_events , tvb , offset , length_trigger_events , ENC_NA ) ;
offset + = length_trigger_events ;
/* m+1 Session Trace Depth */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_trace_information_session_trace_depth , tvb , offset , 1 , ENC_BIG_ENDIAN , & length_trigger_events ) ;
offset + = 1 ;
/* m+2 Length of List of Interfaces */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_trace_information_length_list_interfaces , tvb , offset , 1 , ENC_BIG_ENDIAN , & length_list_interfaces ) ;
offset + = 1 ;
/* (m+3) to p List of Interfaces */
proto_tree_add_item ( tree , hf_pfcp_trace_information_list_interfaces , tvb , offset , length_trigger_events , ENC_NA ) ;
offset + = length_list_interfaces ;
/* p+1 Length of IP address of Trace Collection Entity */
proto_tree_add_item_ret_uint ( tree , hf_pfcp_trace_information_length_ipaddress , tvb , offset , 1 , ENC_BIG_ENDIAN , & length_ipaddress ) ;
offset + = 1 ;
/* (p+2) to q IP Address */
proto_tree_add_item ( tree , hf_pfcp_trace_information_ipaddress , tvb , offset , length_ipaddress , ENC_NA ) ;
offset + = length_ipaddress ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .109 Frame - Route
*/
static void
dissect_pfcp_frame_route ( 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) Frame-Route
* The Frame - Route field shall be encoded as an Octet String as the value part of the Framed - Route AVP specified in IETF RFC 2865
*/
proto_tree_add_item ( tree , hf_pfcp_frame_route , tvb , 0 , length , ENC_NA ) ;
}
/*
* 8.2 .110 Frame - Routing
*/
static void
dissect_pfcp_frame_routing ( 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) Frame-Routing
* The Frame - Routing field shall be encoded as an Octet String as the value part of the Framed - Routing AVP specified in IETF RFC 2865
*/
proto_tree_add_item ( tree , hf_pfcp_frame_routing , tvb , 0 , length , ENC_NA ) ;
}
/*
* 8.2 .111 Frame - IPv6 - Route
*/
static void
dissect_pfcp_frame_ipv6_route ( 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) Frame-IPv6-Route
* The Frame - IPv6 - Route field shall be encoded as an Octet String as the value part of the Framed - IPv6 - Route AVP specified in IETF RFC 2865
*/
proto_tree_add_item ( tree , hf_pfcp_frame_ipv6_route , tvb , 0 , length , ENC_NA ) ;
}
2019-01-13 16:17:21 +00:00
/*
* 8.2 .112 Event Quota
*/
static void
dissect_pfcp_event_quota ( 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_ )
{
int offset = 0 ;
guint32 value ;
/* 5 to 8 Event Quota
* The Event Quota field shall be encoded as an Unsigned32 binary integer value .
*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_event_quota , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .113 Event Threshold
*/
static void
dissect_pfcp_event_threshold ( 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_ )
{
int offset = 0 ;
guint32 value ;
/* 5 to 8 Event Threshold
* The Event Threshold field shall be encoded as an Unsigned32 binary integer value .
*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_event_threshold , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .114 Event Time Stamp
*/
static void
dissect_pfcp_event_time_stamp ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
{
const gchar * time_str ;
int offset = 0 ;
/* The Event Time Stamp field shall contain a UTC time.
* Octets 5 to 8 shall be encoded in the same format as the first four octets
* of the 64 - bit timestamp format as defined in section 6 of IETF RFC 5905.
*/
time_str = tvb_ntp_fmt_ts_sec ( tvb , 0 ) ;
proto_tree_add_string ( tree , hf_pfcp_event_time_stamp , tvb , offset , 4 , time_str ) ;
proto_item_append_text ( item , " %s " , time_str ) ;
offset + = 4 ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .115 Averaging Window
*/
static void
dissect_pfcp_averaging_window ( 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_ )
{
int offset = 0 ;
guint32 value ;
/* 5 to 8 Averaging Window
* The Averaging Window field shall be encoded as an Unsigned32 binary integer value .
*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_averaging_window , tvb , offset , 4 , ENC_BIG_ENDIAN , & value ) ;
offset + = 4 ;
proto_item_append_text ( item , " %u " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
/*
* 8.2 .116 Paging Policy Indicator ( PPI )
*/
static void
dissect_pfcp_paging_policy_indicator ( 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 ;
guint32 value ;
/* 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 3 GPP TS 38.415
*/
proto_tree_add_item_ret_uint ( tree , hf_pfcp_paging_policy_indicator , tvb , offset , 1 , ENC_BIG_ENDIAN , & value ) ;
offset + + ;
proto_item_append_text ( item , " %u " , value ) ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2019-07-04 22:57:12 +00:00
/*
* 8.2 .117 APN / DNN
*/
static void
dissect_pfcp_apn_dnn ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
{
int offset = 0 ;
/* Octet 5 APN/DNN
* The encoding the APN / DNN field follows 3 GPP TS 23.003 [ 2 ] clause 9.1 .
* The content of the APN / DNN field shall be the full APN / DNN with both the
* APN / DNN Network Identifier and APN / DNN Operator Identifier
*/
/* NOTE: The APN/DNN field is not encoded as a dotted string as commonly used in documentation. */
const guint8 * string_value ;
proto_tree_add_item_ret_string ( tree , hf_pfcp_apn_dnn , tvb , offset , length , ENC_ASCII | ENC_NA , wmem_packet_scope ( ) , & string_value ) ;
proto_item_append_text ( item , " %s " , string_value ) ;
}
/*
* 8.2 .118 3 GPP Interface Type
*/
static const value_string pfcp_tgpp_interface_type_vals [ ] = {
{ 0 , " S1-U " } ,
{ 1 , " S5/S8-U " } ,
{ 2 , " S4-U " } ,
{ 3 , " S11-U " } ,
{ 4 , " S12-U " } ,
{ 5 , " Gn/Gp-U " } ,
{ 6 , " S2a-U " } ,
{ 7 , " S2b-U " } ,
{ 8 , " eNodeB GTP-U interface for DL data forwarding " } ,
{ 9 , " eNodeB GTP-U interface for UL data forwarding " } ,
{ 10 , " SGW/UPF GTP-U interface for DL data forwarding " } ,
{ 11 , " N3 3GPP Access " } ,
{ 12 , " N3 Trusted Non-3GPP Access " } ,
{ 13 , " N3 Untrusted Non-3GPP Access " } ,
{ 14 , " N3 for data forwarding " } ,
{ 15 , " N9 " } ,
{ 0 , NULL }
} ;
static void
dissect_pfcp_tgpp_interface_type ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type _U_ , pfcp_session_args_t * args _U_ )
{
int offset = 0 ;
guint32 tgpp_interface_type ;
/* Octet 5 Spare Node ID Type*/
proto_tree_add_item ( tree , hf_pfcp_spare_h1 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item_ret_uint ( tree , hf_pfcp_tgpp_interface_type , tvb , offset , 1 , ENC_BIG_ENDIAN , & tgpp_interface_type ) ;
proto_item_append_text ( item , " %s: " , val_to_str_const ( tgpp_interface_type , pfcp_tgpp_interface_type_vals , " Unknown " ) ) ;
offset + + ;
if ( offset < length ) {
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_ie_data_not_decoded , tvb , offset , - 1 ) ;
}
}
2017-09-03 13:38:23 +00:00
/* Array of functions to dissect IEs
2018-08-13 22:43:30 +00:00
* ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * item , guint16 length , guint8 message_type , pfcp_session_args_t * args )
2017-09-03 13:38:23 +00:00
*/
typedef struct _pfcp_ie {
2018-08-13 22:43:30 +00:00
void ( * decode ) ( tvbuff_t * , packet_info * , proto_tree * , proto_item * , guint16 , guint8 , pfcp_session_args_t * ) ;
2017-09-03 13:38:23 +00:00
} pfcp_ie_t ;
static const pfcp_ie_t pfcp_ies [ ] = {
/* 0 */ { dissect_pfcp_reserved } ,
2017-09-04 11:40:00 +00:00
/* 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 */
2018-05-23 21:11:42 +00:00
/* 12 */ { dissect_pfcp_update_bar } , /* Update BAR (PFCP Session Report Response) Extendable / Table 7.5.9.2-1 */
2017-09-04 11:40:00 +00:00
/* 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 */
2017-09-05 15:22:14 +00:00
/* 20 */ { dissect_pfcp_source_interface } , /* Source Interface Extendable / Subclause 8.2.2 */
/* 21 */ { dissect_pfcp_f_teid } , /* F-TEID Extendable / Subclause 8.2.3 */
2017-11-12 12:51:00 +00:00
/* 22 */ { dissect_pfcp_network_instance } , /* Network Instance Variable Length / Subclause 8.2.4 */
2017-09-06 15:38:12 +00:00
/* 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 */
2017-09-13 15:22:05 +00:00
/* 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 */
2017-09-05 15:22:14 +00:00
/* 29 */ { dissect_pfcp_precedence } , /* Precedence Extendable / Subclause 8.2.11 */
2017-11-12 12:51:00 +00:00
/* 30 */ { dissect_pfcp_transport_level_marking } , /* Transport Level Marking Extendable / Subclause 8.2.12 */
2017-09-13 15:22:05 +00:00
/* 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 */
2017-09-13 07:30:48 +00:00
/* 38 */ { dissect_pfcp_redirect_information } , /* Redirect Information Extendable /Subclause 8.2.20 */
2017-09-13 15:22:05 +00:00
/* 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 */
2017-09-13 07:30:48 +00:00
/* 42 */ { dissect_pfcp_destination_interface } , /* Destination Interface Extendable / Subclause 8.2.24 */
2017-09-13 15:22:05 +00:00
/* 43 */ { dissect_pfcp_up_function_features } , /* UP Function Features Extendable / Subclause 8.2.25 */
2017-09-11 07:26:21 +00:00
/* 44 */ { dissect_pfcp_apply_action } , /* Apply Action Extendable / Subclause 8.2.26 */
2017-09-19 14:09:35 +00:00
/* 45 */ { dissect_pfcp_dl_data_service_inf } , /* Downlink Data Service Information Extendable / Subclause 8.2.27 */
2017-09-18 15:20:36 +00:00
/* 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 */
2018-02-27 21:31:25 +00:00
/* 49 */ { dissect_pfcp_pfcpsmreq_flags } , /* PFCPSMReq-Flags Extendable / Subclause 8.2.31 */
/* 50 */ { dissect_pfcp_pfcpsrrsp_flags } , /* PFCPSRRsp-Flags Extendable / Subclause 8.2.32 */
2017-09-11 15:57:39 +00:00
/* 51 */ { dissect_pfcp_load_control_information } , /* Load Control Information Extendable / Table 7.5.3.3-1 */
2017-09-18 15:20:36 +00:00
/* 52 */ { dissect_pfcp_sequence_number } , /* Sequence Number Fixed Length / Subclause 8.2.33 */
/* 53 */ { dissect_pfcp_metric } , /* Metric Fixed Length / Subclause 8.2.34 */
2017-09-11 15:57:39 +00:00
/* 54 */ { dissect_pfcp_overload_control_information } , /* Overload Control Information Extendable / Table 7.5.3.4-1 */
2017-09-18 15:20:36 +00:00
/* 55 */ { dissect_pfcp_timer } , /* Timer Extendable / Subclause 8.2 35 */
2019-05-14 17:12:15 +00:00
/* 56 */ { dissect_pfcp_pdr_id } , /* PDR ID Extendable / Subclause 8.2 36 */
2017-09-04 11:40:00 +00:00
/* 57 */ { dissect_pfcp_f_seid } , /* F-SEID Extendable / Subclause 8.2 37 */
2017-09-11 15:57:39 +00:00
/* 58 */ { dissect_pfcp_application_ids_pfds } , /* Application ID's PFDs Extendable / Table 7.4.3.1-2 */
2017-09-18 15:20:36 +00:00
/* 59 */ { dissect_pfcp_pfd_context } , /* PFD context Extendable / Table 7.4.3.1-3 */
2017-09-04 11:40:00 +00:00
/* 60 */ { dissect_pfcp_node_id } , /* Node ID Extendable / Subclause 8.2.38 */
2017-09-19 14:09:35 +00:00
/* 61 */ { dissect_pfcp_pfd_contents } , /* PFD contents Extendable / Subclause 8.2.39 */
2017-09-13 15:22:05 +00:00
/* 62 */ { dissect_pfcp_measurement_method } , /* Measurement Method Extendable / Subclause 8.2.40 */
2017-09-18 15:20:36 +00:00
/* 63 */ { dissect_pfcp_usage_report_trigger } , /* Usage Report Trigger Extendable / Subclause 8.2.41 */
2017-09-11 15:57:39 +00:00
/* 64 */ { dissect_pfcp_measurement_period } , /* Measurement Period Extendable / Subclause 8.2.42 */
/* 65 */ { dissect_pfcp_fq_csid } , /* FQ-CSID Extendable / Subclause 8.2.43 */
2017-09-18 15:20:36 +00:00
/* 66 */ { dissect_pfcp_volume_measurement } , /* Volume Measurement Extendable / Subclause 8.2.44 */
2017-09-11 15:57:39 +00:00
/* 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 */
2017-09-13 15:22:05 +00:00
/* 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 */
2017-09-11 15:57:39 +00:00
/* 77 */ { dissect_pfcp_pfcp_query_urr } , /* Query URR Extendable / Table 7.5.4.10-1 */
2019-05-14 17:12:15 +00:00
/* 78 */ { dissect_pfcp_usage_report_smr } , /* Usage Report (Session Modification Response) Extendable / Table 7.5.5.2-1 */
2017-09-11 15:57:39 +00:00
/* 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 */
2017-09-06 15:38:12 +00:00
/* 81 */ { dissect_pfcp_urr_id } , /* URR ID Extendable / Subclause 8.2.54 */
2017-09-13 15:22:05 +00:00
/* 82 */ { dissect_pfcp_linked_urr_id } , /* Linked URR ID Extendable / Subclause 8.2.55 */
2017-09-11 15:57:39 +00:00
/* 83 */ { dissect_pfcp_downlink_data_report } , /* Downlink Data Report Extendable / Table 7.5.8.2-1 */
2017-09-13 15:22:05 +00:00
/* 84 */ { dissect_pfcp_outer_header_creation } , /* Outer Header Creation Extendable / Subclause 8.2.56 */
2017-09-11 15:57:39 +00:00
/* 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 */
2017-09-11 07:26:21 +00:00
/* 88 */ { dissect_pfcp_bar_id } , /* BAR ID Extendable / Subclause 8.2.57 */
2017-09-18 15:20:36 +00:00
/* 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 */
2017-09-05 15:22:14 +00:00
/* 93 */ { dissect_pfcp_ue_ip_address } , /* UE IP Address Extendable / Subclause 8.2.62 */
2017-09-18 15:20:36 +00:00
/* 94 */ { dissect_pfcp_packet_rate } , /* Packet Rate Extendable / Subclause 8.2.63 */
2017-09-06 15:38:12 +00:00
/* 95 */ { dissect_pfcp_outer_hdr_rem } , /* Outer Header Removal Extendable / Subclause 8.2.64 */
2017-09-21 13:07:27 +00:00
/* 96 */ { dissect_pfcp_recovery_time_stamp } , /* Recovery Time Stamp Extendable / Subclause 8.2.65 */
2017-09-18 15:20:36 +00:00
/* 97 */ { dissect_pfcp_dl_flow_level_marking } , /* DL Flow Level Marking Extendable / Subclause 8.2.66 */
2017-09-21 13:07:27 +00:00
/* 98 */ { dissect_pfcp_header_enrichment } , /* Header Enrichment Extendable / Subclause 8.2.67 */
2017-09-11 15:57:39 +00:00
/* 99 */ { dissect_pfcp_error_indication_report } , /* Error Indication Report Extendable / Table 7.5.8.4-1 */
2017-09-21 13:07:27 +00:00
/* 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 */
2018-02-27 22:08:05 +00:00
/* 111 */ { dissect_pfcp_pfcp_assoc_rel_req } , /* PFCP Association Release Request Extendable / Subclause 8.2.77 */
2017-09-21 13:07:27 +00:00
/* 112 */ { dissect_pfcp_graceful_release_period } , /* Graceful Release Period Extendable / Subclause 8.2.78 */
2017-11-10 09:50:09 +00:00
/* 113 */ { dissect_pfcp_pdn_type } , /* PDN Type Fixed Length / Subclause 8.2.79 */
2017-11-12 12:51:00 +00:00
/* 114 */ { dissect_pfcp_failed_rule_id } , /* Failed Rule ID Extendable / Subclause 8.2.80 */
/* 115 */ { dissect_pfcp_time_qouta_mechanism } , /* Time Quota Mechanism Extendable / Subclause 8.2.81 */
/* 116 */ { dissect_pfcp_user_plane_ip_resource_infomation } , /* User Plane IP Resource Information Extendable / Subclause 8.2.82 */
2018-02-27 23:13:29 +00:00
/* 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 */
2018-02-28 20:20:49 +00:00
/* 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 */
2018-04-09 11:55:07 +00:00
/* 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 */
2018-04-10 15:58:35 +00:00
/* 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 */
2018-07-11 23:19:26 +00:00
/* 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 */
2018-10-04 16:22:28 +00:00
/* 147 */ { dissect_pfcp_additional_monitoring_time } , /* Additional Monitoring Time Extendable / Table 7.5.2.4-3 */
2019-01-13 16:17:21 +00:00
/* 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 */
2018-10-04 16:22:28 +00:00
/* 152 */ { dissect_pfcp_trace_information } , /* Trace Information Extendable / Subclause 8.2.108 */
/* 153 */ { dissect_pfcp_frame_route } , /* Frame-Route Variable Length / Subclause 8.2.109 */
/* 154 */ { dissect_pfcp_frame_routing } , /* Frame-Routing Fixed Length / Subclause 8.2.110 */
/* 155 */ { dissect_pfcp_frame_ipv6_route } , /* Frame-IPv6-Route Variable Length / Subclause 8.2.111 */
2019-01-13 16:17:21 +00:00
/* 156 */ { dissect_pfcp_event_time_stamp } , /* Event 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 */
2019-07-04 22:57:12 +00:00
/* 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 to 32767 Spare. For future use.
2018-07-11 23:19:26 +00:00
//32768 to 65535 Vendor-specific IEs.
2017-09-03 13:38:23 +00:00
{ NULL } , /* End of List */
} ;
# define NUM_PFCP_IES (sizeof(pfcp_ies) / sizeof(pfcp_ie_t))
2017-09-04 11:40:00 +00:00
/* Set up the array to hold "etts" for each IE*/
gint ett_pfcp_elem [ NUM_PFCP_IES - 1 ] ;
2018-08-05 17:37:11 +00:00
static pfcp_msg_hash_t *
2018-08-13 22:43:30 +00:00
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 )
2018-08-05 17:37:11 +00:00
{
pfcp_msg_hash_t pcr , * pcrp = NULL ;
2018-08-13 22:43:30 +00:00
guint32 * session ;
2018-08-05 17:37:11 +00:00
pcr . seq_nr = seq_nr ;
pcr . req_time = pinfo - > abs_ts ;
switch ( msgtype ) {
2018-08-09 19:28:16 +00:00
case PFCP_MSG_HEARTBEAT_REQUEST :
case PFCP_MSG_PFD_MANAGEMENT_REQUEST :
case PFCP_MSG_ASSOCIATION_SETUP_REQUEST :
case PFCP_MSG_ASSOCIATION_UPDATE_REQUEST :
case PFCP_MSG_ASSOCIATION_RELEASE_REQUEST :
case PFCP_MSG_NODE_REPORT_REQEUST :
case PFCP_MSG_SESSION_SET_DELETION_REQUEST :
case PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST :
case PFCP_MSG_SESSION_MODIFICATION_REQUEST :
case PFCP_MSG_SESSION_DELETION_REQUEST :
case PFCP_MSG_SESSION_REPORT_REQUEST :
2018-08-05 17:37:11 +00:00
pcr . is_request = TRUE ;
pcr . req_frame = pinfo - > num ;
pcr . rep_frame = 0 ;
break ;
2018-08-09 19:28:16 +00:00
case PFCP_MSG_HEARTBEAT_RESPONSE :
case PFCP_MSG_PFD_MANAGEMENT_RESPONSE :
case PFCP_MSG_ASSOCIATION_SETUP_RESPONSE :
case PFCP_MSG_ASSOCIATION_UPDATE_RESPONSE :
case PFCP_MSG_ASSOCIATION_RELEASE_RESPONSE :
case PFCP_MSG_VERSION_NOT_SUPPORTED_RESPONSE :
case PFCP_MSG_NODE_REPORT_RERESPONSE :
case PFCP_MSG_SESSION_SET_DELETION_RESPONSE :
case PFCP_MSG_SESSION_ESTABLISHMENT_RESPONSE :
case PFCP_MSG_SESSION_MODIFICATION_RESPONSE :
case PFCP_MSG_SESSION_DELETION_RESPONSE :
case PFCP_MSG_SESSION_REPORT_RESPONSE :
2018-08-05 17:37:11 +00:00
pcr . is_request = FALSE ;
pcr . req_frame = 0 ;
pcr . rep_frame = pinfo - > num ;
break ;
default :
pcr . is_request = FALSE ;
pcr . req_frame = 0 ;
pcr . rep_frame = 0 ;
break ;
}
pcrp = ( pfcp_msg_hash_t * ) wmem_map_lookup ( pfcp_info - > matched , & pcr ) ;
if ( pcrp ) {
pcrp - > is_request = pcr . is_request ;
} else {
/* no match, let's try to make one */
switch ( msgtype ) {
2018-08-09 19:28:16 +00:00
case PFCP_MSG_HEARTBEAT_REQUEST :
case PFCP_MSG_PFD_MANAGEMENT_REQUEST :
case PFCP_MSG_ASSOCIATION_SETUP_REQUEST :
case PFCP_MSG_ASSOCIATION_UPDATE_REQUEST :
case PFCP_MSG_ASSOCIATION_RELEASE_REQUEST :
case PFCP_MSG_NODE_REPORT_REQEUST :
case PFCP_MSG_SESSION_SET_DELETION_REQUEST :
case PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST :
case PFCP_MSG_SESSION_MODIFICATION_REQUEST :
case PFCP_MSG_SESSION_DELETION_REQUEST :
case PFCP_MSG_SESSION_REPORT_REQUEST :
2018-08-05 17:37:11 +00:00
pcr . seq_nr = seq_nr ;
pcrp = ( pfcp_msg_hash_t * ) wmem_map_remove ( pfcp_info - > unmatched , & pcr ) ;
/* if we can't reuse the old one, grab a new chunk */
if ( ! pcrp ) {
pcrp = wmem_new ( wmem_file_scope ( ) , pfcp_msg_hash_t ) ;
}
pcrp - > seq_nr = seq_nr ;
pcrp - > req_frame = pinfo - > num ;
pcrp - > req_time = pinfo - > abs_ts ;
pcrp - > rep_frame = 0 ;
pcrp - > msgtype = msgtype ;
pcrp - > is_request = TRUE ;
wmem_map_insert ( pfcp_info - > unmatched , pcrp , pcrp ) ;
return NULL ;
break ;
2018-08-09 19:28:16 +00:00
case PFCP_MSG_HEARTBEAT_RESPONSE :
case PFCP_MSG_PFD_MANAGEMENT_RESPONSE :
case PFCP_MSG_ASSOCIATION_SETUP_RESPONSE :
case PFCP_MSG_ASSOCIATION_UPDATE_RESPONSE :
case PFCP_MSG_ASSOCIATION_RELEASE_RESPONSE :
case PFCP_MSG_VERSION_NOT_SUPPORTED_RESPONSE :
case PFCP_MSG_NODE_REPORT_RERESPONSE :
case PFCP_MSG_SESSION_SET_DELETION_RESPONSE :
case PFCP_MSG_SESSION_ESTABLISHMENT_RESPONSE :
case PFCP_MSG_SESSION_MODIFICATION_RESPONSE :
case PFCP_MSG_SESSION_DELETION_RESPONSE :
case PFCP_MSG_SESSION_REPORT_RESPONSE :
2018-08-05 17:37:11 +00:00
pcr . seq_nr = seq_nr ;
pcrp = ( pfcp_msg_hash_t * ) wmem_map_lookup ( pfcp_info - > unmatched , & pcr ) ;
if ( pcrp ) {
if ( ! pcrp - > rep_frame ) {
wmem_map_remove ( pfcp_info - > unmatched , pcrp ) ;
pcrp - > rep_frame = pinfo - > num ;
pcrp - > is_request = FALSE ;
wmem_map_insert ( pfcp_info - > matched , pcrp , pcrp ) ;
}
}
break ;
default :
break ;
}
}
/* we have found a match */
if ( pcrp ) {
proto_item * it ;
if ( pcrp - > is_request ) {
it = proto_tree_add_uint ( tree , hf_pfcp_response_in , tvb , 0 , 0 , pcrp - > rep_frame ) ;
2019-04-03 21:32:30 +00:00
proto_item_set_generated ( it ) ;
2018-08-05 17:37:11 +00:00
} else {
nstime_t ns ;
it = proto_tree_add_uint ( tree , hf_pfcp_response_to , tvb , 0 , 0 , pcrp - > req_frame ) ;
2019-04-03 21:32:30 +00:00
proto_item_set_generated ( it ) ;
2018-08-05 17:37:11 +00:00
nstime_delta ( & ns , & pinfo - > abs_ts , & pcrp - > req_time ) ;
it = proto_tree_add_time ( tree , hf_pfcp_response_time , tvb , 0 , 0 , & ns ) ;
2019-04-03 21:32:30 +00:00
proto_item_set_generated ( it ) ;
2018-08-13 22:43:30 +00:00
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 ) ;
if ( ! session ) {
session = ( guint32 * ) g_hash_table_lookup ( pfcp_session_table , & pcrp - > req_frame ) ;
if ( session ! = NULL ) {
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 ) ;
}
}
2018-08-05 17:37:11 +00:00
}
}
return pcrp ;
}
2017-09-04 11:40:00 +00:00
/* 7.2.3.3 Grouped Information Elements */
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
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 ) ;
2018-08-13 22:43:30 +00:00
dissect_pfcp_ies_common ( new_tvb , pinfo , grouped_tree , 0 , message_type , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_ID_PDI ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_ID_CREATE_PDR ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_CREATE_FAR ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_FORWARDING_PARAMETERS ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_DUPLICATING_PARAMETERS ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_CREATE_URR ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_CREATE_QER ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_CREATED_PDR ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_UPDATE_PDR ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_UPDATE_FAR ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_UPD_FORWARDING_PARAM ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_UPDATE_BAR ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_UPDATE_URR ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_UPDATE_QER ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_REMOVE_PDR ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_REMOVE_FAR ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_REMOVE_URR ] , args ) ;
2017-09-04 11:40:00 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-04 11:40:00 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_REMOVE_QER ] , args ) ;
2017-09-04 11:40:00 +00:00
}
2017-09-03 13:38:23 +00:00
2017-09-11 15:57:39 +00:00
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_LOAD_CONTROL_INFORMATION ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_OVERLOAD_CONTROL_INFORMATION ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_APPLICATION_IDS_PFDS ] , args ) ;
2017-09-11 15:57:39 +00:00
}
2017-09-18 15:20:36 +00:00
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-18 15:20:36 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_PFD_CONTEXT ] , args ) ;
2017-09-18 15:20:36 +00:00
}
2017-09-11 15:57:39 +00:00
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_APPLICATION_DETECTION_INF ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_QUERY_URR ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_USAGE_REPORT_SMR ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_USAGE_REPORT_SDR ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_USAGE_REPORT_SRR ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_DOWNLINK_DATA_REPORT ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_CREATE_BAR ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_UPDATE_BAR_SMR ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_REMOVE_BAR ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_ERROR_INDICATION_REPORT ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_USER_PLANE_PATH_FAILURE_REPORT ] , args ) ;
2017-09-11 15:57:39 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2017-09-11 15:57:39 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_UPDATE_DUPLICATING_PARAMETERS ] , args ) ;
2017-09-11 15:57:39 +00:00
}
2018-02-27 23:13:29 +00:00
static void
2018-08-13 22:43:30 +00:00
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 )
2018-02-27 23:13:29 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_AGGREGATED_URRS ] , args ) ;
2018-02-27 23:13:29 +00:00
}
2017-09-11 15:57:39 +00:00
2018-04-10 15:58:35 +00:00
static void
2018-08-13 22:43:30 +00:00
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 )
2018-04-10 15:58:35 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_CREATE_TRAFFIC_ENDPOINT ] , args ) ;
2018-04-10 15:58:35 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2018-04-10 15:58:35 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_CREATED_TRAFFIC_ENDPOINT ] , args ) ;
2018-04-10 15:58:35 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2018-04-10 15:58:35 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_UPDATE_TRAFFIC_ENDPOINT ] , args ) ;
2018-04-10 15:58:35 +00:00
}
static void
2018-08-13 22:43:30 +00:00
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 )
2018-04-10 15:58:35 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_REMOVE_TRAFFIC_ENDPOINT ] , args ) ;
2018-04-10 15:58:35 +00:00
}
2018-05-04 21:42:09 +00:00
static void
2018-08-13 22:43:30 +00:00
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 )
2018-05-04 21:42:09 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_ETHERNET_PACKET_FILTER ] , args ) ;
2018-05-04 21:42:09 +00:00
}
2018-07-11 23:19:26 +00:00
static void
2018-08-13 22:43:30 +00:00
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 )
2018-07-11 23:19:26 +00:00
{
2018-08-13 22:43:30 +00:00
dissect_pfcp_grouped_ie ( tvb , pinfo , tree , item , length , message_type , ett_pfcp_elem [ PFCP_IE_ETHERNET_TRAFFIC_INFORMATION ] , args ) ;
2018-07-11 23:19:26 +00:00
}
2018-10-04 16:22:28 +00:00
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 ) ;
}
2017-09-03 13:38:23 +00:00
static void
2018-08-13 22:43:30 +00:00
dissect_pfcp_ies_common ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , gint offset , guint8 message_type , pfcp_session_args_t * args )
2017-09-03 13:38:23 +00:00
{
proto_tree * ie_tree ;
proto_item * ti ;
tvbuff_t * ie_tvb ;
2018-07-10 10:52:05 +00:00
guint16 type , length ;
2017-09-03 13:38:23 +00:00
guint16 enterprise_id ;
/* 8.1.1 Information Element Format */
/*
Octets 8 7 6 5 4 3 2 1
1 to 2 Type = xxx ( decimal )
3 to 4 Length = n
p to ( p + 1 ) Enterprise ID
k to ( n + 4 ) IE specific data or content of a grouped IE
If the Bit 8 of Octet 1 is not set , this indicates that the IE is defined by 3 GPP and the Enterprise ID is absent .
If Bit 8 of Octet 1 is set , this indicates that the IE is defined by a vendor and the Enterprise ID is present
identified by the Enterprise ID
*/
/*Enterprise ID : if the IE type value is within the range of 32768 to 65535,
* this field shall contain the IANA - assigned " SMI Network Management Private Enterprise Codes "
* value of the vendor defining the IE .
*/
2018-07-10 10:52:05 +00:00
/* Length: this field contains the length of the IE excluding the first four octets, which are common for all IEs */
2017-09-03 13:38:23 +00:00
/* Process the IEs*/
while ( offset < ( gint ) tvb_reported_length ( tvb ) ) {
/* Octet 1 -2 */
type = tvb_get_ntohs ( tvb , offset ) ;
length = tvb_get_ntohs ( tvb , offset + 2 ) ;
if ( ( type & 0x8000 ) = = 0x8000 ) {
enterprise_id = tvb_get_ntohs ( tvb , offset + 4 ) ;
ie_tree = proto_tree_add_subtree_format ( tree , tvb , offset , 4 + length , ett_pfcp_ie , & ti , " Enterprise %s specific IE: %u " ,
try_enterprises_lookup ( enterprise_id ) ,
2018-07-10 10:52:05 +00:00
type ) ;
2017-09-03 13:38:23 +00:00
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 ;
/* Bit 8 of Octet 1 is set, this indicates that the IE is defined by a vendor and the Enterprise ID is present */
2018-11-04 19:01:40 +00:00
proto_tree_add_item ( ie_tree , hf_pfcp_enterprise_id , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2017-12-22 11:56:17 +00:00
2018-06-13 15:56:32 +00:00
/*
* 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 .
*/
2018-07-05 12:08:59 +00:00
if ( length = = 0 ) {
2018-06-13 15:56:32 +00:00
proto_item_append_text ( ti , " [IE to be removed] " ) ;
2018-07-10 10:52:05 +00:00
/* Adding offset for EnterpriseID as Bit 8 of Octet 1 is set, the Enterprise ID is present */
offset + = 2 ;
2018-06-13 15:56:32 +00:00
} else {
/* give the whole IE to the subdissector */
2018-07-10 10:52:05 +00:00
ie_tvb = tvb_new_subset_length ( tvb , offset - 4 , length + 4 ) ;
2018-07-05 12:08:59 +00:00
if ( ! dissector_try_uint_new ( pfcp_enterprise_ies_dissector_table , enterprise_id , ie_tvb , pinfo , ie_tree , FALSE , ti ) ) {
2018-11-04 19:01:40 +00:00
proto_tree_add_item ( ie_tree , hf_pfcp_enterprise_data , ie_tvb , 6 , - 1 , ENC_NA ) ;
2018-07-05 12:08:59 +00:00
}
2018-06-13 15:56:32 +00:00
}
2017-09-03 13:38:23 +00:00
offset + = length ;
2017-09-04 11:40:00 +00:00
} else {
int tmp_ett ;
if ( type < ( NUM_PFCP_IES - 1 ) ) {
tmp_ett = ett_pfcp_elem [ type ] ;
} else {
tmp_ett = ett_pfcp_ie ;
}
ie_tree = proto_tree_add_subtree_format ( tree , tvb , offset , 4 + length , tmp_ett , & ti , " %s : " ,
2017-09-03 13:38:23 +00:00
val_to_str_ext_const ( type , & pfcp_ie_type_ext , " Unknown " ) ) ;
proto_tree_add_item ( ie_tree , hf_pfcp2_ie , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
proto_tree_add_item ( ie_tree , hf_pfcp2_ie_len , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
2018-06-13 15:56:32 +00:00
/*
* 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 = = 0 ) {
proto_item_append_text ( ti , " [IE to be removed] " ) ;
} else {
if ( type < ( NUM_PFCP_IES - 1 ) ) {
ie_tvb = tvb_new_subset_length ( tvb , offset , length ) ;
if ( pfcp_ies [ type ] . decode ) {
2018-08-13 22:43:30 +00:00
( * pfcp_ies [ type ] . decode ) ( ie_tvb , pinfo , ie_tree , ti , length , message_type , args ) ;
2018-06-13 15:56:32 +00:00
} 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 ) ;
}
2017-09-03 13:38:23 +00:00
} else {
2018-06-13 15:56:32 +00:00
/* IE id outside of array, We have no decoding function for it */
proto_tree_add_expert ( ie_tree , pinfo , & ei_pfcp_ie_not_decoded_to_large , tvb , offset , length ) ;
2017-09-03 13:38:23 +00:00
}
}
offset + = length ;
}
}
}
static int
dissect_pfcp ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ )
{
proto_item * item ;
proto_tree * sub_tree ;
int offset = 0 ;
guint64 pfcp_flags ;
2018-08-13 22:43:30 +00:00
guint8 message_type , cause_aux ;
2017-09-03 13:38:23 +00:00
guint32 length ;
2018-05-15 20:28:05 +00:00
guint32 length_remaining ;
2018-08-05 17:37:11 +00:00
int seq_no = 0 ;
conversation_t * conversation ;
pfcp_conv_info_t * pfcp_info ;
2018-08-13 22:43:30 +00:00
pfcp_session_args_t * args = NULL ;
pfcp_hdr_t * pfcp_hdr = NULL ;
2017-09-03 13:38:23 +00:00
static const int * pfcp_hdr_flags [ ] = {
& hf_pfcp_version ,
& hf_pfcp_spare_b4 ,
& hf_pfcp_spare_b3 ,
& hf_pfcp_spare_b2 ,
& hf_pfcp_mp_flag ,
& hf_pfcp_s_flag ,
NULL
} ;
2018-08-13 22:43:30 +00:00
pfcp_hdr = wmem_new0 ( wmem_packet_scope ( ) , pfcp_hdr_t ) ;
/* Setting the SEID to -1 to say that the SEID is not valid for this packet */
pfcp_hdr - > seid = - 1 ;
2017-09-03 13:38:23 +00:00
col_set_str ( pinfo - > cinfo , COL_PROTOCOL , " PFCP " ) ;
col_clear ( pinfo - > cinfo , COL_INFO ) ;
message_type = tvb_get_guint8 ( tvb , 1 ) ;
col_set_str ( pinfo - > cinfo , COL_INFO , val_to_str_ext_const ( message_type , & pfcp_message_type_ext , " Unknown " ) ) ;
2018-08-13 22:43:30 +00:00
if ( g_pfcp_session ) {
args = wmem_new0 ( wmem_packet_scope ( ) , pfcp_session_args_t ) ;
args - > last_cause = 1 ; /* It stores the last cause decoded. Cause accepted by default */
/* We create the auxiliary lists */
args - > seid_list = wmem_list_new ( wmem_packet_scope ( ) ) ;
args - > ip_list = wmem_list_new ( wmem_packet_scope ( ) ) ;
}
2017-09-03 13:38:23 +00:00
2018-08-05 17:37:11 +00:00
/* Do we have a conversation for this connection? */
conversation = find_or_create_conversation ( pinfo ) ;
/* Do we already know this conversation? */
pfcp_info = ( pfcp_conv_info_t * ) conversation_get_proto_data ( conversation , proto_pfcp ) ;
if ( pfcp_info = = NULL ) {
/* No. Attach that information to the conversation,
* and add it to the list of information structures .
*/
pfcp_info = wmem_new ( wmem_file_scope ( ) , pfcp_conv_info_t ) ;
/* Request/response matching tables */
pfcp_info - > matched = wmem_map_new ( wmem_file_scope ( ) , pfcp_sn_hash , pfcp_sn_equal_matched ) ;
pfcp_info - > unmatched = wmem_map_new ( wmem_file_scope ( ) , pfcp_sn_hash , pfcp_sn_equal_unmatched ) ;
conversation_add_proto_data ( conversation , proto_pfcp , pfcp_info ) ;
}
2017-09-03 13:38:23 +00:00
item = proto_tree_add_item ( tree , proto_pfcp , tvb , 0 , - 1 , ENC_NA ) ;
sub_tree = proto_item_add_subtree ( item , ett_pfcp ) ;
/* 7.2.2 Message Header */
/*
Octet 8 7 6 5 4 3 2 1
1 | Version | Spare | Spare | Spare | MP | S |
2 | Message Type |
3 | Message Length ( 1 st Octet ) |
4 | Message Length ( 2 nd Octet ) |
m to | If S flag is set to 1 , then SEID shall be |
k ( m + 7 ) | placed into octets 5 - 12. Otherwise , SEID field |
| is not present at all . |
n to | Sequence Number |
( n + 2 ) | |
( n + 3 ) | Spare |
*/
/* Octet 1 */
proto_tree_add_bitmask_with_flags_ret_uint64 ( sub_tree , tvb , offset , hf_pfcp_hdr_flags ,
ett_pfcp_flags , pfcp_hdr_flags , ENC_BIG_ENDIAN , BMT_NO_FALSE | BMT_NO_INT , & pfcp_flags ) ;
offset + = 1 ;
/* Octet 2 Message Type */
2018-08-13 22:43:30 +00:00
pfcp_hdr - > message = tvb_get_guint8 ( tvb , offset ) ;
proto_tree_add_uint ( sub_tree , hf_pfcp_msg_type , tvb , offset , 1 , pfcp_hdr - > message ) ;
2017-09-03 13:38:23 +00:00
offset + = 1 ;
/* Octet 3 - 4 Message Length */
proto_tree_add_item_ret_uint ( sub_tree , hf_pfcp_msg_length , tvb , offset , 2 , ENC_BIG_ENDIAN , & length ) ;
2017-10-26 12:57:39 +00:00
offset + = 2 ;
2018-05-15 20:28:05 +00:00
/*
* The length field shall indicate the length of the message in octets
* excluding the mandatory part of the PFCP header ( the first 4 octets ) .
*/
length_remaining = tvb_reported_length_remaining ( tvb , offset ) ;
if ( length ! = length_remaining ) {
proto_tree_add_expert_format ( sub_tree , pinfo , & ei_pfcp_ie_encoding_error , tvb , offset , - 1 , " Invalid Length for the message: %d instead of %d " , length , length_remaining ) ;
}
2017-09-03 13:38:23 +00:00
if ( ( pfcp_flags & 0x1 ) = = 1 ) {
/* If S flag is set to 1, then SEID shall be placed into octets 5-12*/
/* Session Endpoint Identifier 8 Octets */
2018-08-13 22:43:30 +00:00
pfcp_hdr - > seid = tvb_get_ntohi64 ( tvb , offset ) ;
proto_tree_add_uint64 ( sub_tree , hf_pfcp_seid , tvb , offset , 8 , pfcp_hdr - > seid ) ;
2017-09-03 13:38:23 +00:00
offset + = 8 ;
}
2018-04-09 11:55:07 +00:00
/* 7.2.2.2 PFCP Header for Node Related Messages */
2017-09-03 13:38:23 +00:00
/*
Octet 8 7 6 5 4 3 2 1
1 | Version | Spare | Spare | Spare | MP = 0 | S = 0 |
2 | Message Type |
3 | Message Length ( 1 st Octet ) |
4 | Message Length ( 2 nd Octet ) |
5 | Sequence Number ( 1 st Octet ) |
6 | Sequence Number ( 2 st Octet ) |
7 | Sequence Number ( 3 st Octet ) |
8 | Spare |
*/
2018-08-05 17:37:11 +00:00
proto_tree_add_item_ret_uint ( sub_tree , hf_pfcp_seqno , tvb , offset , 3 , ENC_BIG_ENDIAN , & seq_no ) ;
2017-09-03 13:38:23 +00:00
offset + = 3 ;
2018-08-05 17:37:11 +00:00
2017-09-03 13:38:23 +00:00
if ( ( pfcp_flags & 0x2 ) = = 0x2 ) {
/* If the "MP" flag is set to "1", then bits 8 to 5 of octet 16 shall indicate the message priority.*/
proto_tree_add_item ( sub_tree , hf_pfcp_mp , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( sub_tree , hf_pfcp_spare_h0 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
} else {
proto_tree_add_item ( sub_tree , hf_pfcp_spare_oct , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
}
offset + + ;
/* Dissect the IEs in the message */
2018-08-13 22:43:30 +00:00
dissect_pfcp_ies_common ( tvb , pinfo , sub_tree , offset , message_type , args ) ;
/* Use sequence number to track Req/Resp pairs */
cause_aux = 16 ; /* Cause accepted by default. Only used when args is NULL */
if ( args & & ! PINFO_FD_VISITED ( pinfo ) ) {
/* We insert the lists inside the table*/
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 ) ;
if ( args ) {
pfcp_track_session ( tvb , pinfo , sub_tree , pfcp_hdr , args - > seid_list , args - > ip_list , args - > last_seid , args - > last_ip ) ;
}
2017-09-03 13:38:23 +00:00
return tvb_reported_length ( tvb ) ;
}
/* Enterprise IE decoding 3GPP */
static int
dissect_pfcp_3gpp_enterprise_ies ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data )
{
proto_item * top_item = ( proto_item * ) data ;
/* We are give the complete ie, but the first 6 octets are dissected in the pfcp dissector*/
proto_item_append_text ( top_item , " Enterprise ID set to '10415' shall not be used for the vendor specific IEs. " ) ;
proto_tree_add_expert ( tree , pinfo , & ei_pfcp_enterprise_ie_3gpp , tvb , 0 , - 1 ) ;
return tvb_reported_length ( tvb ) ;
}
2018-08-13 22:43:30 +00:00
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 ( ) ) ;
}
static void
pfcp_cleanup ( void )
{
pfcp_session_conv_info_t * pfcp_info ;
/* Free up state attached to the pfcp_info structures */
for ( pfcp_info = pfcp_session_info_items ; pfcp_info ! = NULL ; ) {
pfcp_session_conv_info_t * next ;
g_hash_table_destroy ( pfcp_info - > matched ) ;
pfcp_info - > matched = NULL ;
g_hash_table_destroy ( pfcp_info - > unmatched ) ;
pfcp_info - > unmatched = NULL ;
next = pfcp_info - > next ;
pfcp_info = next ;
}
/* Free up state attached to the pfcp session structures */
pfcp_info_items = NULL ;
if ( pfcp_session_table ! = NULL ) {
g_hash_table_destroy ( pfcp_session_table ) ;
}
pfcp_session_table = NULL ;
}
2017-09-03 13:38:23 +00:00
void
proto_register_pfcp ( void )
{
static hf_register_info hf_pfcp [ ] = {
{ & hf_pfcp_msg_type ,
{ " Message Type " , " pfcp.msg_type " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & pfcp_message_type_ext , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_msg_length ,
{ " Length " , " pfcp.length " ,
2017-11-11 14:47:11 +00:00
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
2017-09-03 13:38:23 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_hdr_flags ,
{ " Flags " , " pfcp.flags " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_version ,
{ " Version " , " pfcp.version " ,
FT_UINT8 , BASE_DEC , NULL , 0xe0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_mp_flag ,
2018-02-28 21:51:36 +00:00
{ " Message Priority (MP) " , " pfcp.mp_flag " ,
2017-09-04 11:40:00 +00:00
FT_BOOLEAN , 8 , NULL , 0x02 ,
2017-09-03 13:38:23 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_s_flag ,
2018-02-28 21:51:36 +00:00
{ " SEID (S) " , " pfcp.s " ,
2017-09-04 11:40:00 +00:00
FT_BOOLEAN , 8 , NULL , 0x01 ,
2017-09-03 13:38:23 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_spare_b2 ,
{ " Spare " , " pfcp.spare_b2 " ,
FT_UINT8 , BASE_DEC , NULL , 0x04 ,
NULL , HFILL }
} ,
{ & hf_pfcp_spare_b3 ,
{ " Spare " , " pfcp.spare_b3 " ,
FT_UINT8 , BASE_DEC , NULL , 0x08 ,
NULL , HFILL }
} ,
{ & hf_pfcp_spare_b4 ,
{ " Spare " , " pfcp.spare_b4 " ,
FT_UINT8 , BASE_DEC , NULL , 0x10 ,
NULL , HFILL }
} ,
2017-09-04 11:40:00 +00:00
{ & hf_pfcp_spare_b5 ,
{ " Spare " , " pfcp.spare_b5 " ,
FT_UINT8 , BASE_DEC , NULL , 0x20 ,
NULL , HFILL }
} ,
{ & hf_pfcp_spare_b6 ,
{ " Spare " , " pfcp.spare_b6 " ,
FT_UINT8 , BASE_DEC , NULL , 0x40 ,
NULL , HFILL }
} ,
{ & hf_pfcp_spare_b7 ,
{ " Spare " , " pfcp.spare_b7 " ,
FT_UINT8 , BASE_DEC , NULL , 0x80 ,
NULL , HFILL }
} ,
2017-09-19 14:09:35 +00:00
{ & hf_pfcp_spare_b7_b6 ,
{ " Spare " , " pfcp.spare_b7_b6 " ,
FT_UINT8 , BASE_DEC , NULL , 0xc0 ,
NULL , HFILL }
} ,
2017-09-11 07:26:21 +00:00
{ & hf_pfcp_spare_b7_b5 ,
{ " Spare " , " pfcp.spare_b7_b5 " ,
FT_UINT8 , BASE_DEC , NULL , 0xe0 ,
NULL , HFILL }
} ,
2017-09-19 14:09:35 +00:00
{ & hf_pfcp_spare_b7_b4 ,
{ " Spare " , " pfcp.spare_b7_b4 " ,
FT_UINT8 , BASE_DEC , NULL , 0xf0 ,
NULL , HFILL }
} ,
2017-09-13 15:22:05 +00:00
{ & hf_pfcp_spare_b7_b3 ,
{ " Spare " , " pfcp.spare_b7_b3 " ,
FT_UINT8 , BASE_DEC , NULL , 0xf8 ,
NULL , HFILL }
} ,
2017-09-18 15:20:36 +00:00
{ & hf_pfcp_spare_b7_b2 ,
{ " Spare " , " pfcp.spare_b7_b2 " ,
FT_UINT8 , BASE_DEC , NULL , 0xfc ,
NULL , HFILL }
} ,
2017-09-19 14:09:35 +00:00
{ & hf_pfcp_spare_b7_b1 ,
{ " Spare " , " pfcp.spare_b7_b1 " ,
FT_UINT8 , BASE_DEC , NULL , 0xfe ,
NULL , HFILL }
} ,
2017-09-03 13:38:23 +00:00
{ & hf_pfcp_spare_oct ,
{ " Spare " , " pfcp.spare_oct " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_spare_h0 ,
{ " Spare " , " pfcp.spare_h0 " ,
FT_UINT8 , BASE_DEC , NULL , 0x0f ,
NULL , HFILL }
} ,
2017-09-04 11:40:00 +00:00
{ & hf_pfcp_spare_h1 ,
{ " Spare " , " pfcp.spare_h1 " ,
FT_UINT8 , BASE_DEC , NULL , 0xf0 ,
NULL , HFILL }
} ,
2017-09-06 15:38:12 +00:00
{ & hf_pfcp_spare ,
{ " Spare " , " pfcp.spare " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-03 13:38:23 +00:00
{ & hf_pfcp_seid ,
{ " SEID " , " pfcp.seid " ,
2017-11-11 14:47:11 +00:00
FT_UINT64 , BASE_HEX , NULL , 0x0 ,
2017-09-03 13:38:23 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_seqno ,
{ " Sequence Number " , " pfcp.seqno " ,
FT_UINT24 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-08-05 17:37:11 +00:00
{ & hf_pfcp_response_in ,
{ " Response In " , " pfcp.response_in " ,
FT_FRAMENUM , BASE_NONE , FRAMENUM_TYPE ( FT_FRAMENUM_RESPONSE ) , 0x0 ,
" The response to this PFCP request is in this frame " , HFILL }
} ,
{ & hf_pfcp_response_to ,
{ " Response To " , " pfcp.response_to " ,
FT_FRAMENUM , BASE_NONE , FRAMENUM_TYPE ( FT_FRAMENUM_RESPONSE ) , 0x0 ,
" This is a response to the PFCP request in this frame " , HFILL }
} ,
{ & hf_pfcp_response_time ,
{ " Response Time " , " pfcp.response_time " ,
FT_RELATIVE_TIME , BASE_NONE , NULL , 0x0 ,
" The time between the Request and the Response " , HFILL }
} ,
2018-08-13 22:43:30 +00:00
{ & hf_pfcp_session ,
{ " Session " , " pfcp.session " ,
FT_UINT32 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
2017-09-03 13:38:23 +00:00
{ & hf_pfcp_mp ,
{ " Message Priority " , " pfcp.mp " ,
FT_UINT24 , BASE_DEC , NULL , 0xf0 ,
NULL , HFILL }
} ,
2018-11-04 19:01:40 +00:00
{ & hf_pfcp_enterprise_id ,
{ " Enterprise ID " , " pfcp.enterprise_id " ,
2017-09-03 13:38:23 +00:00
FT_UINT16 , BASE_ENTERPRISES , STRINGS_ENTERPRISES ,
0x0 , NULL , HFILL } } ,
2018-11-04 19:01:40 +00:00
{ & hf_pfcp_enterprise_data ,
{ " Enterprise IE Data " , " pfcp.enterprise_ie_data " ,
2018-07-05 12:08:59 +00:00
FT_BYTES , BASE_NONE , NULL , 0 ,
NULL , HFILL }
} ,
2017-09-03 13:38:23 +00:00
{ & hf_pfcp2_ie ,
{ " IE Type " , " pfcp.ie_type " ,
FT_UINT16 , BASE_DEC | BASE_EXT_STRING , & pfcp_ie_type_ext , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp2_enterprise_ie ,
{ " Enterprise specific IE Type " , " pfcp.enterprise_ie " ,
2018-07-10 10:52:05 +00:00
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
2017-09-03 13:38:23 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp2_ie_len ,
2017-11-11 14:47:11 +00:00
{ " IE Length " , " pfcp.ie_len " ,
2017-09-03 13:38:23 +00:00
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_recovery_time_stamp ,
{ " Recovery Time Stamp " , " pfcp.recovery_time_stamp " ,
FT_STRING , BASE_NONE , NULL , 0 ,
NULL , HFILL }
} ,
2017-09-04 11:40:00 +00:00
{ & hf_pfcp2_cause ,
{ " Cause " , " pfcp.cause " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_cause_vals ) , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_node_id_type ,
{ " Node ID Type " , " pfcp.node_id_type " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_node_id_type_vals ) , 0x0f ,
NULL , HFILL }
} ,
{ & hf_pfcp_node_id_ipv4 ,
{ " Node ID IPv4 " , " pfcp.node_id_ipv4 " ,
FT_IPv4 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_node_id_ipv6 ,
{ " Node ID IPv6 " , " pfcp.node_id_ipv6 " ,
FT_IPv6 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_node_id_fqdn ,
{ " Node ID FQDN " , " pfcp.node_id_fqdn " ,
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 ,
2017-11-11 14:38:43 +00:00
{ " V6 (IPv6) " , " pfcp.f_seid_flags.v6 " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x01 ,
2017-09-04 11:40:00 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_b1_v4 ,
2017-11-11 14:38:43 +00:00
{ " V4 (IPv4) " , " pfcp.f_seid_flags.v4 " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x02 ,
2017-09-04 11:40:00 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_f_seid_ipv4 ,
{ " IPv4 address " , " pfcp.f_seid.ipv4 " ,
FT_IPv4 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_f_seid_ipv6 ,
{ " IPv6 address " , " pfcp.f_seid.ipv6 " ,
FT_IPv6 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_pdr_id ,
{ " Rule ID " , " pfcp.pdr_id " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-05 15:22:14 +00:00
{ & hf_pfcp_precedence ,
{ " Precedence " , " pfcp.precedence " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_source_interface ,
{ " Source Interface " , " pfcp.source_interface " ,
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 " ,
2017-11-09 12:58:47 +00:00
FT_UINT8 , BASE_DEC , NULL , 0xf0 ,
2017-09-05 15:22:14 +00:00
NULL , HFILL }
} ,
2017-11-09 10:34:19 +00:00
{ & hf_pfcp_fteid_flg_b3_ch_id ,
{ " CHID (CHOOSE_ID) " , " pfcp.f_teid_flags.ch_id " ,
FT_BOOLEAN , 8 , NULL , 0x08 ,
NULL , HFILL }
} ,
2017-09-05 15:22:14 +00:00
{ & hf_pfcp_fteid_flg_b2_ch ,
{ " CH (CHOOSE) " , " pfcp.f_teid_flags.ch " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
NULL , HFILL }
} ,
{ & hf_pfcp_fteid_flg_b1_v6 ,
2017-11-11 14:38:43 +00:00
{ " V6 (IPv6) " , " pfcp.f_teid_flags.v6 " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x02 ,
2017-09-05 15:22:14 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_fteid_flg_b0_v4 ,
2017-11-11 14:38:43 +00:00
{ " V4 (IPv4) " , " pfcp.f_teid_flags.v4 " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x01 ,
2017-09-05 15:22:14 +00:00
NULL , HFILL }
} ,
2017-11-09 10:34:19 +00:00
{ & hf_pfcp_f_teid_ch_id ,
{ " Choose Id " , " pfcp.f_teid.choose_id " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-11-11 14:41:12 +00:00
{ & hf_pfcp_f_teid_teid ,
{ " TEID " , " pfcp.f_teid.teid " ,
FT_UINT32 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-05 15:22:14 +00:00
{ & hf_pfcp_f_teid_ipv4 ,
{ " IPv4 address " , " pfcp.f_teid.ipv4_addr " ,
FT_IPv4 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_f_teid_ipv6 ,
{ " IPv6 address " , " pfcp.f_teid.ipv6_addr " ,
FT_IPv6 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-11-12 12:51:00 +00:00
{ & hf_pfcp_network_instance ,
{ " Network Instance " , " pfcp.network_instance " ,
2018-05-03 21:09:31 +00:00
FT_STRING , BASE_NONE , NULL , 0x0 ,
2017-09-05 15:22:14 +00:00
NULL , HFILL }
} ,
2017-11-10 09:50:09 +00:00
{ & hf_pfcp_pdn_type ,
{ " PDN Type " , " pfcp.pdn_type " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_pdn_type_vals ) , 0x7 ,
NULL , HFILL }
} ,
2018-02-27 23:13:29 +00:00
{ & hf_pfcp_multiplier_value_digits ,
{ " Value Digits " , " pfcp.multiplier.value_digits " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_multiplier_exponent ,
{ " Exponent " , " pfcp.multiplier.exponent " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_aggregated_urr_id_ie_urr_id ,
{ " URR ID " , " pfcp.aggregated_urr_id_ie.urr_id " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-11-12 12:51:00 +00:00
{ & hf_pfcp_failed_rule_id_type ,
{ " Failed Rule ID Type " , " pfcp.failed_rule_id_type " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_failed_rule_id_type_vals ) , 0x7 ,
NULL , HFILL }
} ,
{ & hf_pfcp_time_qouta_mechanism_bti_type ,
{ " Base Time Interval Type " , " pfcp.time_qouta_mechanism_bti_type " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_time_qouta_mechanism_bti_type_vals ) , 0x3 ,
NULL , HFILL }
} ,
{ & hf_pfcp_time_qouta_mechanism_bti ,
{ " Base Time Interval " , " pfcp.time_qouta_mechanism_bti " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-05 15:22:14 +00:00
{ & hf_pfcp_ue_ip_address_flags ,
{ " Flags " , " pfcp.ue_ip_address_flags " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-11-11 14:38:43 +00:00
{ & 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 ,
2017-09-05 15:22:14 +00:00
NULL , HFILL }
} ,
2017-11-11 14:38:43 +00:00
{ & hf_pfcp_ue_ip_address_flag_b1_v4 ,
{ " V4 (IPv4) " , " pfcp.ue_ip_address_flag.v4 " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x02 ,
2017-09-05 15:22:14 +00:00
NULL , HFILL }
} ,
2017-11-11 14:38:43 +00:00
{ & hf_pfcp_ue_ip_address_flag_b2_sd ,
2017-09-05 15:22:14 +00:00
{ " S/D " , " pfcp.ue_ip_address_flag.sd " ,
FT_BOOLEAN , 8 , TFS ( & pfcp_ue_ip_add_sd_flag_vals ) , 0x04 ,
NULL , HFILL }
} ,
2018-10-04 16:22:28 +00:00
{ & hf_pfcp_ue_ip_address_flag_b3_v6d ,
{ " IPv6D " , " pfcp.ue_ip_address_flag.v6d " ,
FT_BOOLEAN , 8 , TFS ( & pfcp_ue_ip_add_sd_flag_vals ) , 0x08 ,
NULL , HFILL }
} ,
2017-09-05 15:22:14 +00:00
{ & hf_pfcp_ue_ip_addr_ipv4 ,
{ " IPv4 address " , " pfcp.ue_ip_addr_ipv4 " ,
FT_IPv4 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_ue_ip_add_ipv6 ,
{ " IPv6 address " , " pfcp.ue_ip_addr_ipv6 " ,
FT_IPv6 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-10-04 16:22:28 +00:00
{ & hf_pfcp_ue_ip_add_ipv6_prefix ,
{ " IPv6 Prefix " , " pfcp.ue_ip_addr_ipv6_prefix " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-05 15:22:14 +00:00
{ & hf_pfcp_application_id ,
{ " Application Identifier " , " pfcp.application_id " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2019-01-24 14:40:38 +00:00
{ & hf_pfcp_application_id_str ,
{ " Application Identifier " , " pfcp.application_id_str " ,
FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-06 15:38:12 +00:00
{ & hf_pfcp_sdf_filter_flags ,
{ " Flags " , " pfcp.sdf_filter_flags " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_sdf_filter_flags_b0_fd ,
2017-09-06 15:38:12 +00:00
{ " FD (Flow Description) " , " pfcp.sdf_filter.fd " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_sdf_filter_flags_b1_ttc ,
2017-09-06 15:38:12 +00:00
{ " TTC (ToS Traffic Class) " , " pfcp.sdf_filter.ttc " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_sdf_filter_flags_b2_spi ,
2017-09-06 15:38:12 +00:00
{ " SPI (Security Parameter Index) " , " pfcp.sdf_filter.spi " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_sdf_filter_flags_b3_fl ,
2017-09-06 15:38:12 +00:00
{ " FL (Flow Label) " , " pfcp.sdf_filter.fl " ,
FT_BOOLEAN , 8 , NULL , 0x08 ,
NULL , HFILL }
} ,
2018-07-11 23:19:26 +00:00
{ & hf_pfcp_sdf_filter_flags_b4_bid ,
{ " BID (Bidirectional SDF Filter) " , " pfcp.sdf_filter.bid " ,
FT_BOOLEAN , 8 , NULL , 0x10 ,
NULL , HFILL }
} ,
2017-09-06 15:38:12 +00:00
{ & hf_pfcp_flow_desc_len ,
{ " Length of Flow Description " , " pfcp.flow_desc_len " ,
2017-09-18 15:20:36 +00:00
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
2017-09-06 15:38:12 +00:00
NULL , HFILL }
} ,
2018-02-22 20:54:52 +00:00
{ & hf_pfcp_flow_desc ,
{ " Flow Description " , " pfcp.flow_desc " ,
FT_STRING , BASE_NONE , NULL , 0x0 ,
2017-09-06 15:38:12 +00:00
NULL , HFILL }
} ,
2018-02-22 20:54:52 +00:00
{ & hf_pfcp_traffic_class ,
{ " ToS Traffic Class " , " pfcp.traffic_class " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_traffic_mask ,
{ " Mask field " , " pfcp.traffic_mask " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
2017-09-06 15:38:12 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_spi ,
2018-02-22 20:54:52 +00:00
{ " Security Parameter Index " , " pfcp.spi " ,
FT_UINT32 , BASE_HEX , NULL , 0x0 ,
2017-09-06 15:38:12 +00:00
NULL , HFILL }
} ,
2018-02-22 20:54:52 +00:00
{ & hf_pfcp_flow_label_spare_bit ,
{ " Spare bit " , " pfcp.flow_label_spare_bit " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_flow_label ,
{ " Flow Label " , " pfcp.flow_label " ,
FT_UINT24 , BASE_HEX , NULL , 0x0FFFFF ,
2017-09-06 15:38:12 +00:00
NULL , HFILL }
} ,
2018-07-11 23:19:26 +00:00
{ & hf_pfcp_sdf_filter_id ,
{ " SDF Filter ID " , " pfcp.sdf_filter_id " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-06 15:38:12 +00:00
{ & hf_pfcp_out_hdr_desc ,
{ " Outer Header Removal Description " , " pfcp.out_hdr_desc " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_out_hdr_desc_vals ) , 0x0 ,
NULL , HFILL }
} ,
2019-06-02 07:22:19 +00:00
{ & hf_pfcp_gtpu_ext_hdr_del_b0_pdu_sess_cont ,
{ " PDU Session Container to be deleted " , " pfcp.gtpu_ext_hdr_del.pdu_sess_cont " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2017-09-06 15:38:12 +00:00
{ & hf_pfcp_far_id_flg ,
{ " Allocation type " , " pfcp.far_id_flg " ,
FT_BOOLEAN , 32 , TFS ( & pfcp_id_predef_dynamic_tfs ) , 0x80000000 ,
NULL , HFILL }
} ,
{ & hf_pfcp_far_id ,
{ " FAR ID " , " pfcp.far_id " ,
FT_UINT32 , BASE_DEC , NULL , 0x7fffffff ,
NULL , HFILL }
} ,
{ & hf_pfcp_urr_id_flg ,
{ " Allocation type " , " pfcp.urr_id_flg " ,
FT_BOOLEAN , 32 , TFS ( & pfcp_id_predef_dynamic_tfs ) , 0x80000000 ,
NULL , HFILL }
} ,
{ & hf_pfcp_urr_id ,
{ " URR ID " , " pfcp.urr_id " ,
FT_UINT32 , BASE_DEC , NULL , 0x7fffffff ,
NULL , HFILL }
} ,
{ & hf_pfcp_qer_id_flg ,
{ " Allocation type " , " pfcp.qer_id_flg " ,
FT_BOOLEAN , 32 , TFS ( & pfcp_id_predef_dynamic_tfs ) , 0x80000000 ,
NULL , HFILL }
} ,
{ & hf_pfcp_qer_id ,
{ " QER ID " , " pfcp.qer_id " ,
FT_UINT32 , BASE_DEC , NULL , 0x7fffffff ,
NULL , HFILL }
} ,
2017-09-11 07:26:21 +00:00
{ & hf_pfcp_predef_rules_name ,
{ " Predefined Rules Name " , " pfcp.predef_rules_name " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_apply_action_flags ,
{ " Flags " , " pfcp.apply_action_flags " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_apply_action_flags_b0_drop ,
2017-09-11 07:26:21 +00:00
{ " DROP (Drop) " , " pfcp.apply_action.drop " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_apply_action_flags_b1_forw ,
2017-09-11 07:26:21 +00:00
{ " FORW (Forward) " , " pfcp.apply_action.forw " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_apply_action_flags_b2_buff ,
2017-09-11 07:26:21 +00:00
{ " BUFF (Buffer) " , " pfcp.apply_action.buff " ,
2017-11-08 12:25:11 +00:00
FT_BOOLEAN , 8 , NULL , 0x04 ,
2017-09-11 07:26:21 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_apply_action_flags_b3_nocp ,
2017-09-11 07:26:21 +00:00
{ " NOCP (Notify the CP function) " , " pfcp.apply_action.nocp " ,
2017-11-08 12:25:11 +00:00
FT_BOOLEAN , 8 , NULL , 0x08 ,
2017-09-11 07:26:21 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_apply_action_flags_b4_dupl ,
2017-09-11 07:26:21 +00:00
{ " DUPL (Duplicate) " , " pfcp.apply_action.dupl " ,
FT_BOOLEAN , 8 , NULL , 0x10 ,
NULL , HFILL }
} ,
{ & hf_pfcp_bar_id ,
{ " BAR ID " , " pfcp.bar_id " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-11 15:57:39 +00:00
{ & hf_pfcp_fq_csid_node_id_type ,
{ " FQ-CSID Node-ID Type " , " pfcp.fq_csid_node_id_type " ,
2017-09-13 10:32:12 +00:00
FT_UINT8 , BASE_DEC , VALS ( pfcp_fq_csid_node_id_type_vals ) , 0xf0 ,
2017-09-11 15:57:39 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_num_csid ,
{ " Number of CSID " , " pfcp.num_csid " ,
FT_UINT8 , BASE_DEC , NULL , 0x0f ,
NULL , HFILL }
} ,
{ & hf_pfcp_fq_csid_node_id_ipv4 ,
{ " Node-Address " , " pfcp.q_csid_node_id.ipv4 " ,
FT_IPv4 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_fq_csid_node_id_ipv6 ,
{ " Node-Address " , " pfcp.q_csid_node_id.ipv6 " ,
FT_IPv6 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_fq_csid_node_id_mcc_mnc ,
{ " Node-Address MCC MNC " , " pfcp.q_csid_node_id.mcc_mnc " ,
FT_UINT32 , BASE_DEC , NULL , 0xfffff000 ,
NULL , HFILL }
} ,
{ & hf_pfcp_fq_csid_node_id_int ,
{ " Node-Address Number " , " pfcp.q_csid_node_id.int " ,
FT_UINT32 , BASE_DEC , NULL , 0x00000fff ,
NULL , HFILL }
} ,
{ & hf_pfcp_fq_csid ,
{ " PDN Connection Set Identifier (CSID) " , " pfcp.csid " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_measurement_period ,
{ " Measurement Period " , " pfcp.measurement_period " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_duration_measurement ,
{ " Duration " , " pfcp.duration_measurement " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_time_of_first_packet ,
{ " Time of First Packet " , " pfcp.time_of_first_packet " ,
FT_STRING , BASE_NONE , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_time_of_last_packet ,
{ " Time of Last Packet " , " pfcp.time_of_last_packet " ,
FT_STRING , BASE_NONE , NULL , 0 ,
NULL , HFILL }
} ,
2017-09-13 07:30:48 +00:00
{ & hf_pfcp_dst_interface ,
{ " Interface " , " pfcp.dst_interface " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_dst_interface_vals ) , 0x0f ,
NULL , HFILL }
} ,
{ & hf_pfcp_redirect_address_type ,
{ " Redirect Address Type " , " pfcp.redirect_address_type " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_redirect_address_type_vals ) , 0x0f ,
NULL , HFILL }
} ,
{ & hf_pfcp_redirect_server_addr_len ,
{ " Redirect Server Address Length " , " pfcp.redirect_server_addr_len " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_redirect_server_address ,
{ " Redirect Server Address " , " pfcp.redirect_server_address " ,
FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2019-07-04 22:57:12 +00:00
{ & hf_pfcp_other_redirect_server_addr_len ,
{ " Other Redirect Server Address Length " , " pfcp.other_redirect_server_addr_len " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_other_redirect_server_address ,
{ " Other Redirect Server Address " , " pfcp.other_redirect_server_address " ,
FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-13 15:22:05 +00:00
{ & hf_pfcp_linked_urr_id ,
{ " Linked URR ID " , " pfcp.linked_urr_id " ,
2018-08-17 08:55:54 +00:00
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_outer_hdr_desc ,
{ " Outer Header Creation Description " , " pfcp.outer_hdr_desc " ,
2018-02-12 14:30:00 +00:00
FT_UINT16 , BASE_DEC , VALS ( pfcp_outer_hdr_desc_vals ) , 0x0 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_outer_hdr_creation_teid ,
{ " TEID " , " pfcp.outer_hdr_creation.teid " ,
2017-11-11 14:47:11 +00:00
FT_UINT32 , BASE_HEX , NULL , 0x0 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_outer_hdr_creation_ipv4 ,
{ " IPv4 Address " , " pfcp.outer_hdr_creation.ipv4 " ,
FT_IPv4 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_outer_hdr_creation_ipv6 ,
{ " IPv6 Address " , " pfcp.outer_hdr_creation.ipv6 " ,
FT_IPv6 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_outer_hdr_creation_port ,
{ " Port Number " , " pfcp.outer_hdr_creation.port " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_time_threshold ,
{ " Time Threshold " , " pfcp.time_threshold " ,
2018-02-22 22:19:50 +00:00
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_forwarding_policy_id_len ,
{ " Forwarding Policy Identifier Length " , " pfcp.forwarding_policy_id_len " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_forwarding_policy_id ,
{ " Forwarding Policy Identifier " , " pfcp.forwarding_policy_id " ,
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 }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_measurement_method_flags_b0_durat ,
2017-09-13 15:22:05 +00:00
{ " DURAT (Duration) " , " pfcp.measurement_method_flags.durat " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_measurement_method_flags_b1_volume ,
2017-09-13 15:22:05 +00:00
{ " VOLUM (Volume) " , " pfcp.measurement_method_flags.volume " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_measurement_method_flags_b2_event ,
2017-09-13 15:22:05 +00:00
{ " EVENT (Event) " , " pfcp.measurement_method_flags.event " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subsequent_time_threshold ,
{ " Subsequent Time Threshold " , " pfcp.subsequent_time_threshold " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_inactivity_detection_time ,
{ " Inactivity Detection Time " , " pfcp.inactivity_detection_time " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_monitoring_time ,
{ " Monitoring Time " , " pfcp.monitoring_time " ,
FT_STRING , BASE_NONE , NULL , 0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_reporting_triggers_o5_b0_perio ,
2017-12-21 14:21:09 +00:00
{ " PERIO (Periodic Reporting) " , " pfcp.reporting_triggers_flags.perio " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x01 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_reporting_triggers_o5_b1_volth ,
2017-12-21 14:21:09 +00:00
{ " VOLTH (Volume Threshold) " , " pfcp.reporting_triggers_flags.volth " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x02 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_reporting_triggers_o5_b2_timth ,
2018-04-09 11:55:07 +00:00
{ " TIMTH (Time Threshold) " , " pfcp.reporting_triggers_flags.timth " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x04 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_reporting_triggers_o5_b3_quhti ,
2017-09-13 15:22:05 +00:00
{ " QUHTI (Quota Holding Time) " , " pfcp.reporting_triggers_flags.quhti " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x08 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_reporting_triggers_o5_b4_start ,
2017-09-13 15:22:05 +00:00
{ " START (Start of Traffic) " , " pfcp.reporting_triggers_flags.start " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x10 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_reporting_triggers_o5_b5_stopt ,
2017-09-13 15:22:05 +00:00
{ " STOPT (Stop of Traffic) " , " pfcp.reporting_triggers_flags.stopt " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x20 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_reporting_triggers_o5_b6_droth ,
2017-09-13 15:22:05 +00:00
{ " DROTH (Dropped DL Traffic Threshold) " , " pfcp.reporting_triggers_flags.droth " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x40 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_reporting_triggers_o5_b7_liusa ,
2017-09-13 15:22:05 +00:00
{ " LIUSA (Linked Usage Reporting) " , " pfcp.reporting_triggers_flags.liusa " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x80 ,
NULL , HFILL }
} ,
{ & hf_pfcp_reporting_triggers_o6_b0_volqu ,
{ " VOLQU (Volume Quota) " , " pfcp.reporting_triggers_flags.volqu " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
{ & hf_pfcp_reporting_triggers_o6_b1_timqu ,
{ " TIMQU (Time Quota) " , " pfcp.reporting_triggers_flags.timqu " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
{ & hf_pfcp_reporting_triggers_o6_b2_envcl ,
{ " ENVCL (Envelope Closure) " , " pfcp.reporting_triggers_flags.envcl " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
2018-07-11 23:19:26 +00:00
{ & hf_pfcp_reporting_triggers_o6_b3_macar ,
{ " MACAR (MAC Addresses Reporting) " , " pfcp.reporting_triggers_flags.macar " ,
FT_BOOLEAN , 8 , NULL , 0x08 ,
NULL , HFILL }
} ,
2018-10-04 16:22:28 +00:00
{ & hf_pfcp_reporting_triggers_o6_b4_eveth ,
{ " EVETH (Event Threshold) " , " pfcp.reporting_triggers_flags.eveth " ,
FT_BOOLEAN , 8 , NULL , 0x10 ,
NULL , HFILL }
} ,
2019-01-13 16:17:21 +00:00
{ & hf_pfcp_reporting_triggers_o6_b5_evequ ,
{ " EVEQU (Event Quota) " , " pfcp.reporting_triggers_flags.evequ " ,
FT_BOOLEAN , 8 , NULL , 0x20 ,
NULL , HFILL }
} ,
2017-12-21 14:21:09 +00:00
2019-01-13 16:17:21 +00:00
{ & hf_pfcp_usage_report_trigger_o7_b0_evequ ,
{ " EVEQU (Event Quota) " , " pfcp.usage_report_trigger_flags.evequ " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o6_b0_volqu ,
2017-12-21 14:21:09 +00:00
{ " VOLQU (Volume Quota) " , " pfcp.usage_report_trigger_flags.volqu " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x01 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o6_b1_timqu ,
2017-12-21 14:21:09 +00:00
{ " TIMQU (Time Quota) " , " pfcp.usage_report_trigger_flags.timqu " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x02 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o6_b2_liusa ,
2018-04-09 11:55:07 +00:00
{ " LIUSA (Linked Usage Reporting) " , " pfcp.usage_report_trigger_flags.liusa " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x04 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o6_b3_termr ,
2017-12-21 14:21:09 +00:00
{ " TERMR (Termination Report) " , " pfcp.usage_report_trigger.term " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x08 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o6_b4_monit ,
2017-12-21 14:21:09 +00:00
{ " MONIT (Monitoring Time) " , " pfcp.usage_report_trigger.monit " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x10 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o6_b5_envcl ,
2017-12-21 14:21:09 +00:00
{ " ENVCL (Envelope Closure) " , " pfcp.usage_report_trigger_flags.envcl " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x20 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-10-04 16:22:28 +00:00
{ & hf_pfcp_usage_report_trigger_o6_b7_eveth ,
{ " EVETH (Event Threshold) " , " pfcp.usage_report_trigger_flags.eveth " ,
FT_BOOLEAN , 8 , NULL , 0x80 ,
NULL , HFILL }
} ,
2018-07-11 23:19:26 +00:00
{ & hf_pfcp_usage_report_trigger_o6_b6_macar ,
{ " MACAR (MAC Addresses Reporting) " , " pfcp.usage_report_trigger_flags.macar " ,
FT_BOOLEAN , 8 , NULL , 0x40 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o5_b0_perio ,
2017-12-21 14:21:09 +00:00
{ " PERIO (Periodic Reporting) " , " pfcp.usage_report_trigger_flags.perio " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x01 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o5_b1_volth ,
2017-12-21 14:21:09 +00:00
{ " VOLTH (Volume Threshold) " , " pfcp.usage_report_trigger_flags.volth " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x02 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o5_b2_timth ,
2017-12-21 14:21:09 +00:00
{ " TIMTH (Time Threshold) " , " pfcp.usage_report_trigger_flags.timth " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x04 ,
2017-11-12 12:51:00 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o5_b3_quhti ,
2017-12-21 14:21:09 +00:00
{ " QUHTI (Quota Holding Time) " , " pfcp.usage_report_trigger_flags.quhti " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x08 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o5_b4_start ,
2017-12-21 14:21:09 +00:00
{ " START (Start of Traffic) " , " pfcp.usage_report_trigger_flags.start " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x10 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o5_b5_stopt ,
2017-12-21 14:21:09 +00:00
{ " STOPT (Stop of Traffic) " , " pfcp.usage_report_trigger_flags.stopt " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x20 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o5_b6_droth ,
2017-12-21 14:21:09 +00:00
{ " DROTH (Dropped DL Traffic Threshold) " , " pfcp.usage_report_trigger_flags.droth " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x40 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_report_trigger_o5_b7_immer ,
2017-12-21 14:21:09 +00:00
{ " IMMER (Immediate Report) " , " pfcp.usage_report_trigger.immer " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x80 ,
2017-12-21 14:21:09 +00:00
NULL , HFILL }
} ,
2017-09-13 15:22:05 +00:00
{ & hf_pfcp_volume_threshold ,
{ " Flags " , " pfcp.volume_threshold " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_volume_threshold_b0_tovol ,
{ " TOVOL " , " pfcp.volume_threshold_flags.tovol " ,
2017-09-13 15:22:05 +00:00
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_volume_threshold_b1_ulvol ,
{ " ULVOL " , " pfcp.volume_threshold_flags.ulvol " ,
2017-09-13 15:22:05 +00:00
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_volume_threshold_b2_dlvol ,
{ " DLVOL " , " pfcp.volume_threshold_flags.dlvol " ,
2017-09-13 15:22:05 +00:00
FT_BOOLEAN , 8 , NULL , 0x04 ,
NULL , HFILL }
} ,
{ & hf_pfcp_volume_threshold_tovol ,
{ " Total Volume " , " pfcp.volume_threshold.tovol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_volume_threshold_ulvol ,
{ " Uplink Volume " , " pfcp.volume_threshold.ulvol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_volume_threshold_dlvol ,
{ " Downlink Volume " , " pfcp.volume_threshold.dlvol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_volume_quota ,
{ " Flags " , " pfcp.volume_quota " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_volume_quota_b0_tovol ,
{ " TOVOL " , " pfcp.volume_quota_flags.tovol " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
{ & hf_pfcp_volume_quota_b1_ulvol ,
{ " ULVOL " , " pfcp.volume_quota_flags.ulvol " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
{ & hf_pfcp_volume_quota_b2_dlvol ,
{ " DLVOL " , " pfcp.volume_quota_flags.dlvol " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
NULL , HFILL }
} ,
2017-09-13 15:22:05 +00:00
{ & hf_pfcp_volume_quota_tovol ,
{ " Total Volume " , " pfcp.volume_quota.tovol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_volume_quota_ulvol ,
{ " Uplink Volume " , " pfcp.volume_quota.ulvol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_volume_quota_dlvol ,
{ " Downlink Volume " , " pfcp.volume_quota.dlvol " ,
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 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subseq_volume_threshold_b1_ulvol ,
{ " ULVOL " , " pfcp.subseq_volume_threshold.ulvol_flg " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subseq_volume_threshold_b2_dlvol ,
{ " DLVOL " , " pfcp.subseq_volume_threshold.dlvol_flg " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subseq_volume_threshold_tovol ,
{ " Total Volume " , " pfcp.subseq_volume_threshold.tovol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subseq_volume_threshold_ulvol ,
{ " Uplink Volume " , " pfcp.subseq_volume_threshold.ulvol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subseq_volume_threshold_dlvol ,
{ " Downlink Volume " , " pfcp.subseq_volume_threshold.dlvol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_time_quota ,
{ " Time Quota " , " pfcp.time_quota " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_start_time ,
{ " Start Time " , " pfcp.start_time " ,
FT_STRING , BASE_NONE , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_end_time ,
{ " End Time " , " pfcp.start_time " ,
FT_STRING , BASE_NONE , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_quota_holding_time ,
{ " Quota Holding Time " , " pfcp.quota_holding_time " ,
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 ,
NULL , HFILL }
} ,
2018-10-04 16:22:28 +00:00
{ & hf_pfcp_dropped_dl_traffic_threshold_b1_dlby ,
{ " DLBY " , " pfcp.dropped_dl_traffic_threshold.dlby_flg " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
2017-09-13 15:22:05 +00:00
{ & hf_pfcp_downlink_packets ,
{ " Downlink Packets " , " pfcp.downlink_packets " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-10-04 16:22:28 +00:00
{ & hf_pfcp_bytes_downlink_data ,
{ " Bytes of Downlink Data " , " pfcp.bytes_downlink_data " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-13 15:22:05 +00:00
{ & hf_pfcp_qer_correlation_id ,
{ " QER Correlation ID " , " pfcp.qer_correlation_id " ,
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.ulgate " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_gate_status_vals ) , 0x03 ,
NULL , HFILL }
} ,
{ & hf_pfcp_gate_status_b3b2_ulgate ,
{ " UL Gate " , " pfcp.gate_status.ulgate " ,
2018-02-22 21:56:40 +00:00
FT_UINT8 , BASE_DEC , VALS ( pfcp_gate_status_vals ) , 0x0c ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_ul_mbr ,
{ " UL MBR " , " pfcp.ul_mbr " ,
FT_UINT40 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_dl_mbr ,
{ " DL MBR " , " pfcp.dl_mbr " ,
FT_UINT40 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_ul_gbr ,
{ " UL GBR " , " pfcp.ul_gbr " ,
FT_UINT40 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_dl_gbr ,
{ " DL GBR " , " pfcp.dl_gbr " ,
FT_UINT40 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_report_type ,
{ " Flags " , " pfcp.report_type " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-27 21:47:17 +00:00
{ & hf_pfcp_report_type_b3_upir ,
{ " UPIR (User Plane Inactivity Report) " , " pfcp.report_type.upir " ,
FT_BOOLEAN , 8 , NULL , 0x08 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_report_type_b2_erir ,
2018-01-18 10:55:53 +00:00
{ " ERIR (Error Indication Report) " , " pfcp.report_type.erir " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_report_type_b1_usar ,
2017-09-13 15:22:05 +00:00
{ " USAR (Usage Report) " , " pfcp.report_type.usar " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_report_type_b0_dldr ,
2018-01-18 10:55:53 +00:00
{ " DLDR (Downlink Data Report) " , " pfcp.report_type.dldr " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_offending_ie ,
{ " Type of the offending IE " , " pfcp.offending_ie " ,
FT_UINT16 , BASE_DEC | BASE_EXT_STRING , & pfcp_ie_type_ext , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_up_function_features_o5_b0_bucp ,
2017-09-13 15:22:05 +00:00
{ " BUCP " , " pfcp.up_function_features.bucp " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x01 ,
2017-09-13 15:22:05 +00:00
" Downlink Data Buffering in CP function " , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_up_function_features_o5_b1_ddnd ,
2017-09-13 15:22:05 +00:00
{ " DDND " , " pfcp.up_function_features.ddnd " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x02 ,
2017-09-13 15:22:05 +00:00
" Buffering parameter 'Downlink Data Notification Delay " , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_up_function_features_o5_b2_dlbd ,
2017-09-13 15:22:05 +00:00
{ " DLBD " , " pfcp.up_function_features.dlbd " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x04 ,
2017-09-13 15:22:05 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_up_function_features_o5_b3_trst ,
2017-09-13 15:22:05 +00:00
{ " TRST " , " pfcp.up_function_features.trst " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x08 ,
2017-09-13 15:22:05 +00:00
" Traffic Steering " , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_up_function_features_o5_b4_ftup ,
2017-09-13 15:22:05 +00:00
{ " FTUP " , " pfcp.up_function_features.ftup " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x10 ,
2017-09-13 15:22:05 +00:00
" F-TEID allocation / release in the UP function " , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_up_function_features_o5_b5_pfdm ,
2017-09-13 15:22:05 +00:00
{ " PFDM " , " pfcp.up_function_features.pfdm " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x20 ,
2017-09-13 15:22:05 +00:00
" PFD Management procedure " , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_up_function_features_o5_b6_heeu ,
2017-09-13 15:22:05 +00:00
{ " HEEU " , " pfcp.up_function_features.heeu " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x40 ,
2017-09-13 15:22:05 +00:00
" Header Enrichment of Uplink traffic " , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_up_function_features_o5_b7_treu ,
2017-09-13 15:22:05 +00:00
{ " TREU " , " pfcp.up_function_features.treu " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x80 ,
2017-09-13 15:22:05 +00:00
" Traffic Redirection Enforcement in the UP function " , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_up_function_features_o6_b0_empu ,
2017-09-13 15:22:05 +00:00
{ " EMPU " , " pfcp.up_function_features.empu " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x01 ,
2017-09-13 15:22:05 +00:00
" Sending of End Marker packets " , HFILL }
} ,
2018-05-03 21:21:40 +00:00
{ & hf_pfcp_up_function_features_o6_b1_pdiu ,
{ " PDIU " , " pfcp.up_function_features.pdiu " ,
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x02 ,
" Support of PDI optimised signalling " , HFILL }
} ,
2018-07-11 23:19:26 +00:00
{ & hf_pfcp_up_function_features_o6_b2_udbc ,
{ " UDBC " , " pfcp.up_function_features.udbc " ,
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x04 ,
" Support of UL/DL Buffering Control " , HFILL }
} ,
{ & hf_pfcp_up_function_features_o6_b3_quoac ,
{ " QUOAC " , " pfcp.up_function_features.quoac " ,
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x08 ,
2019-05-14 17:12:15 +00:00
" The UP function supports being provisioned with the Quota Action to apply when reaching quotas " , HFILL }
2018-07-11 23:19:26 +00:00
} ,
2018-10-04 16:22:28 +00:00
{ & hf_pfcp_up_function_features_o6_b4_trace ,
{ " TRACE " , " pfcp.up_function_features.trace " ,
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x10 ,
" The UP function supports Trace " , HFILL }
} ,
{ & hf_pfcp_up_function_features_o6_b5_frrt ,
{ " FRRT " , " pfcp.up_function_features.frrt " ,
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x20 ,
" The UP function supports Framed Routing " , HFILL }
} ,
2019-05-14 17:12:15 +00:00
{ & hf_pfcp_up_function_features_o6_b6_pfde ,
{ " PFDE " , " pfcp.up_function_features.pfde " ,
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x40 ,
" The UP function supports a PFD Contents including a property with multiple values " , HFILL }
} ,
2017-09-18 15:20:36 +00:00
{ & hf_pfcp_sequence_number ,
{ " Sequence Number " , " pfcp.sequence_number " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_metric ,
{ " Metric " , " pfcp.metric " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_timer_unit ,
{ " Timer unit " , " pfcp.timer_unit " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_timer_unit_vals ) , 0xe0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_timer_value ,
{ " Timer value " , " pfcp.timer_value " ,
FT_UINT8 , BASE_DEC , NULL , 0x1f ,
NULL , HFILL }
} ,
{ & hf_pfcp_volume_measurement ,
{ " Flags " , " pfcp.volume_measurement " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_volume_measurement_b0_tovol ,
{ " TOVOL " , " pfcp.volume_measurement_flags.tovol " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
{ & hf_pfcp_volume_measurement_b1_ulvol ,
{ " ULVOL " , " pfcp.volume_measurement_flags.ulvol " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
{ & hf_pfcp_volume_measurement_b2_dlvol ,
{ " DLVOL " , " pfcp.volume_measurement_flags.dlvol " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
NULL , HFILL }
} ,
2017-09-18 15:20:36 +00:00
{ & hf_pfcp_vol_meas_tovol ,
{ " Total Volume " , " pfcp.volume_measurement.tovol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_vol_meas_ulvol ,
{ " Uplink Volume " , " pfcp.volume_measurement.ulvol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_vol_meas_dlvol ,
{ " Downlink Volume " , " pfcp.volume_measurement.dlvol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_cp_function_features ,
{ " Flags " , " pfcp.cp_function_features " ,
2017-12-21 11:00:11 +00:00
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
2017-09-18 15:20:36 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_cp_function_features_b0_load ,
2017-09-18 15:20:36 +00:00
{ " LOAD " , " pfcp.cp_function_features.load " ,
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x01 ,
" Load Control " , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_cp_function_features_b1_ovrl ,
2017-09-18 15:20:36 +00:00
{ " OVRL " , " pfcp.cp_function_features.ovrl " ,
FT_BOOLEAN , 8 , TFS ( & tfs_supported_not_supported ) , 0x02 ,
" Overload Control " , HFILL }
} ,
{ & hf_pfcp_usage_information ,
{ " Flags " , " pfcp.usage_information " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_information_b0_bef ,
2017-09-18 15:20:36 +00:00
{ " BEF (Before) " , " pfcp.usage_information.bef " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_information_b1_aft ,
2017-09-18 15:20:36 +00:00
{ " AFT (After) " , " pfcp.usage_information.aft " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_information_b2_uae ,
2017-09-18 15:20:36 +00:00
{ " UAE (Usage After Enforcement) " , " pfcp.usage_information.uae " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_usage_information_b3_ube ,
2017-09-18 15:20:36 +00:00
{ " UBE (Usage Before Enforcement) " , " pfcp.usage_information.ube " ,
FT_BOOLEAN , 8 , NULL , 0x08 ,
NULL , HFILL }
} ,
{ & hf_pfcp_application_instance_id ,
{ " Application Instance Identifier " , " pfcp.application_instance_id " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2019-01-24 14:40:38 +00:00
{ & hf_pfcp_application_instance_id_str ,
{ " Application Instance Identifier " , " pfcp.application_instance_id_str " ,
FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-18 15:20:36 +00:00
{ & hf_pfcp_flow_dir ,
{ " Flow Direction " , " pfcp.flow_dir " ,
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 }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_packet_rate_b0_ulpr ,
2017-09-18 15:20:36 +00:00
{ " ULPR (Uplink Packet Rate) " , " pfcp.packet_rate.ulpr " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x01 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_packet_rate_b1_dlpr ,
2017-09-18 15:20:36 +00:00
{ " DLPR (Downlink Packet Rate) " , " pfcp.packet_rate.dlpr " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x02 ,
NULL , HFILL }
} ,
{ & hf_pfcp_ul_time_unit ,
{ " Uplink Time Unit " , " pfcp.ul_time_unit " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_pr_time_unit_vals ) , 0x07 ,
NULL , HFILL }
} ,
{ & hf_pfcp_max_ul_pr ,
{ " Maximum Uplink Packet Rate " , " pfcp.max_ul_pr " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_dl_time_unit ,
{ " Downlink Time Unit " , " pfcp.dl_time_unit " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_pr_time_unit_vals ) , 0x07 ,
NULL , HFILL }
} ,
{ & hf_pfcp_max_dl_pr ,
{ " Maximum Downlink Packet Rate " , " pfcp.max_dl_pr " ,
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 }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_dl_flow_level_marking_b0_ttc ,
2017-09-18 15:20:36 +00:00
{ " TTC (ToS/Traffic Class) " , " pfcp.dl_flow_level_marking.ttc " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x01 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_dl_flow_level_marking_b1_sci ,
2017-09-18 15:20:36 +00:00
{ " SCI(Service Class Indicator) " , " pfcp.dl_flow_level_marking.sci " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x02 ,
NULL , HFILL }
} ,
{ & hf_pfcp_sci ,
{ " Service Class Indicator " , " pfcp.sci " ,
FT_UINT16 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_dl_data_notification_delay ,
{ " Delay Value " , " pfcp.dl_data_notification_delay " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
" Delay Value in integer multiples of 50 millisecs, or zero " , HFILL }
} ,
{ & hf_pfcp_packet_count ,
{ " Packet Count " , " pfcp.packet_count " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_dl_data_service_inf_flags ,
2017-09-19 14:09:35 +00:00
{ " Flags " , " pfcp.dl_data_service_inf_flags " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_dl_data_service_inf_b0_ppi ,
2017-09-19 14:09:35 +00:00
{ " PPI(Paging Policy Indication) " , " pfcp.dl_data_service_inf.ppi " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x01 ,
NULL , HFILL }
} ,
2018-12-17 16:06:37 +00:00
{ & hf_pfcp_dl_data_service_inf_b1_qfii ,
{ " QFII(QoS Flow Identifier) " , " pfcp.dl_data_service_inf.qfii " ,
2018-10-04 16:22:28 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x02 ,
NULL , HFILL }
} ,
2017-09-19 14:09:35 +00:00
{ & hf_pfcp_ppi ,
2018-10-04 16:22:28 +00:00
{ " Paging Policy Indication " , " pfcp.dl_data_service_inf.ppi " ,
2017-09-19 14:09:35 +00:00
FT_UINT16 , BASE_DEC , NULL , 0x7f ,
NULL , HFILL }
} ,
2018-02-27 21:31:25 +00:00
{ & hf_pfcp_pfcpsmreq_flags ,
{ " Flags " , " pfcp.smreq_flags " ,
2017-09-19 14:09:35 +00:00
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-27 21:31:25 +00:00
{ & hf_pfcp_pfcpsmreq_flags_b0_drobu ,
{ " DROBU (Drop Buffered Packets) " , " pfcp.smreq_flags.drobu " ,
2017-09-19 14:09:35 +00:00
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2018-02-27 21:31:25 +00:00
{ & hf_pfcp_pfcpsmreq_flags_b1_sndem ,
{ " SNDEM (Send End Marker Packets) " , " pfcp.smreq_flags.sndem " ,
2017-09-19 14:09:35 +00:00
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
2018-02-27 21:31:25 +00:00
{ & hf_pfcp_pfcpsmreq_flags_b2_qaurr ,
{ " QAURR (Query All URRs) " , " pfcp.smreq_flags.qaurr " ,
2017-11-12 12:51:00 +00:00
FT_BOOLEAN , 8 , NULL , 0x04 ,
NULL , HFILL }
} ,
2018-02-27 21:31:25 +00:00
{ & hf_pfcp_pfcpsrrsp_flags ,
{ " Flags " , " pfcp.srrsp_flags " ,
2017-09-19 14:09:35 +00:00
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-27 21:31:25 +00:00
{ & hf_pfcp_pfcpsrrsp_flags_b0_drobu ,
{ " DROBU (Drop Buffered Packets) " , " pfcp.srrsp_flags.drobu " ,
2018-02-26 23:44:26 +00:00
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2017-09-19 14:09:35 +00:00
{ & hf_pfcp_pfd_contents_flags ,
{ " Flags " , " pfcp.pfd_contents_flags " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_pfd_contents_flags_b0_fd ,
2017-09-19 14:09:35 +00:00
{ " FD (Flow Description) " , " pfcp.pfd_contents_flags.fd " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_pfd_contents_flags_b1_url ,
2017-09-19 14:09:35 +00:00
{ " URL (URL) " , " pfcp.pfd_contents_flags.url " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_pfd_contents_flags_b2_dn ,
2017-09-19 14:09:35 +00:00
{ " DN (Domain Name) " , " pfcp.pfd_contents_flags.dn " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_pfd_contents_flags_b3_cp ,
2017-09-19 14:09:35 +00:00
{ " CP (Custom PFD Content) " , " pfcp.pfd_contents_flags.cp " ,
FT_BOOLEAN , 8 , NULL , 0x08 ,
NULL , HFILL }
} ,
2019-05-14 17:12:15 +00:00
{ & hf_pfcp_pfd_contents_flags_b4_dnp ,
{ " DNP (Domain Name Protocol) " , " pfcp.pfd_contents_flags.dnp " ,
FT_BOOLEAN , 8 , NULL , 0x10 ,
NULL , HFILL }
} ,
{ & hf_pfcp_pfd_contents_flags_b5_afd ,
{ " AFD (Additional Flow Description) " , " pfcp.pfd_contents_flags.afd " ,
FT_BOOLEAN , 8 , NULL , 0x20 ,
NULL , HFILL }
} ,
{ & hf_pfcp_pfd_contents_flags_b6_aurl ,
{ " AURL (Additional URL) " , " pfcp.pfd_contents_flags.aurl " ,
FT_BOOLEAN , 8 , NULL , 0x40 ,
NULL , HFILL }
} ,
{ & hf_pfcp_pfd_contents_flags_b7_adnp ,
{ " ADNP (Additional Domain Name and Domain Name Protocol) " , " pfcp.pfd_contents_flags.adnp " ,
FT_BOOLEAN , 8 , NULL , 0x80 ,
NULL , HFILL }
} ,
2017-09-19 14:09:35 +00:00
{ & hf_pfcp_url_len ,
{ " Length of URL " , " pfcp.url_len " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_url ,
{ " URL " , " pfcp.url " ,
2019-05-14 17:12:15 +00:00
FT_STRING , BASE_NONE , NULL , 0x0 ,
2017-09-19 14:09:35 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_dn_len ,
{ " Length of Domain Name " , " pfcp.dn_len " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_dn ,
{ " Domain Name " , " pfcp.dn " ,
2019-05-14 17:12:15 +00:00
FT_STRING , BASE_NONE , NULL , 0x0 ,
2017-09-19 14:09:35 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_cp_len ,
{ " Length of Custom PFD Content " , " pfcp.cp_len " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_cp ,
{ " Custom PFD Content " , " pfcp.cp " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2019-05-14 17:12:15 +00:00
{ & hf_pfcp_dnp_len ,
{ " Length of Domain Name Protocol " , " pfcp.dnp_len " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_dnp ,
{ " Domain Name Protocol " , " pfcp.dn " ,
FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_afd_len ,
{ " Length of Additional Flow Description " , " pfcp.adf_len " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_aurl_len ,
{ " Length of Additional URL " , " pfcp.aurl_len " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_adnp_len ,
{ " Length of Additional Domain Name and Domain Name Protocol " , " pfcp.adnp_len " ,
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-21 13:07:27 +00:00
{ & hf_pfcp_header_type ,
{ " Header Type " , " pfcp.header_type " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_header_type_vals ) , 0x1f ,
NULL , HFILL }
} ,
{ & hf_pfcp_hf_len ,
{ " Length of Header Field Name " , " pfcp.hf_len " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_hf_name ,
{ " Header Field Name " , " pfcp.hf_name " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-10-12 06:36:21 +00:00
{ & hf_pfcp_hf_name_str ,
{ " Header Field Name " , " pfcp.hf_name_str " ,
FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-21 13:07:27 +00:00
{ & hf_pfcp_hf_val_len ,
{ " Length of Header Field Value " , " pfcp.hf_val_len " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_hf_val ,
{ " Header Field Value " , " pfcp.hf_val " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-10-12 06:36:21 +00:00
{ & hf_pfcp_hf_val_str ,
{ " Header Field Value " , " pfcp.hf_val_str " ,
FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2017-09-21 13:07:27 +00:00
{ & hf_pfcp_measurement_info ,
{ " Flags " , " pfcp.measurement_info " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_measurement_info_b0_mbqe ,
2017-09-21 13:07:27 +00:00
{ " MBQE (Measurement Before QoS Enforcement) " , " pfcp.measurement_info.fd " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_measurement_info_b1_inam ,
2017-09-21 13:07:27 +00:00
{ " INAM (Inactive Measurement) " , " pfcp.measurement_info.inam " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
2018-02-27 21:56:45 +00:00
{ & hf_pfcp_measurement_info_b2_radi ,
{ " RADI (Reduced Application Detection Information) " , " pfcp.measurement_info.radi " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
NULL , HFILL }
} ,
2019-01-13 16:17:21 +00:00
{ & hf_pfcp_measurement_info_b3_istm ,
{ " ISTM (Immediate Start Time Metering) " , " pfcp.measurement_info.istm " ,
FT_BOOLEAN , 8 , NULL , 0x08 ,
NULL , HFILL }
} ,
2017-09-21 13:07:27 +00:00
{ & hf_pfcp_node_report_type ,
{ " Flags " , " pfcp.node_report_type " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_node_report_type_b0_upfr ,
2017-09-21 13:07:27 +00:00
{ " UPFR (User Plane Path Failure Report) " , " pfcp.node_report_type.upfr " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_remote_gtp_u_peer_flags ,
{ " Flags " , " pfcp.remote_gtp_u_peer_flags " ,
2017-09-21 13:07:27 +00:00
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_remote_gtp_u_peer_flags_b0_v6 ,
{ " V6 (IPv6) " , " pfcp.remote_gtp_u_peer_flags.v6 " ,
2017-11-11 14:38:43 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x01 ,
2017-09-21 13:07:27 +00:00
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_remote_gtp_u_peer_flags_b1_v4 ,
{ " V4 (IPv4) " , " pfcp.remote_gtp_u_peer_flags.v4 " ,
2017-11-11 14:38:43 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x02 ,
2017-09-21 13:07:27 +00:00
NULL , HFILL }
} ,
2019-07-04 22:57:12 +00:00
{ & hf_pfcp_remote_gtp_u_peer_flags_b2_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 " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x08 ,
NULL , HFILL }
} ,
2017-09-21 13:07:27 +00:00
{ & hf_pfcp_remote_gtp_u_peer_ipv4 ,
{ " IPv4 address " , " pfcp.node_id_ipv4 " ,
FT_IPv4 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_remote_gtp_u_peer_ipv6 ,
{ " IPv6 address " , " pfcp.node_id_ipv6 " ,
FT_IPv6 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2019-07-04 22:57:12 +00:00
{ & hf_pfcp_remote_gtp_u_peer_length_di ,
{ " Length of Destination Interface field " , " pfcp.node_id_length_di " ,
FT_UINT8 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_remote_gtp_u_peer_length_ni ,
{ " Length of Network Instance field " , " pfcp.node_id_length_ni " ,
FT_UINT8 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
2017-09-21 13:07:27 +00:00
{ & 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 }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_oci_flags_b0_aoci ,
2017-09-21 13:07:27 +00:00
{ " AOCI: Associate OCI with Node ID " , " pfcp.oci_flags.aoci " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2018-02-27 22:08:05 +00:00
{ & hf_pfcp_pfcp_assoc_rel_req_flags ,
{ " Flags " , " pfcp.assoc_rel_req " ,
2017-09-21 13:07:27 +00:00
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-27 22:08:05 +00:00
{ & hf_pfcp_pfcp_assoc_rel_req_b0_sarr ,
{ " SARR (PFCP Association Release Request) " , " pfcp.assoc_rel_req.sarr " ,
2017-09-21 13:07:27 +00:00
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
2017-11-12 12:51:00 +00:00
{ & hf_pfcp_upiri_flags ,
{ " Flags " , " pfcp.upiri_flags " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-07-11 23:19:26 +00:00
{ & hf_pfcp_upiri_flg_b6_assosi ,
{ " ASSOSI (Associated Source Instance) " , " pfcp.upiri_flags.assosi " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x40 ,
NULL , HFILL }
} ,
2017-11-12 12:51:00 +00:00
{ & hf_pfcp_upiri_flg_b5_assoni ,
{ " ASSONI (Associated Network Instance) " , " pfcp.upiri_flags.assoni " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x20 ,
NULL , HFILL }
} ,
2018-07-05 12:08:59 +00:00
{ & hf_pfcp_upiri_flg_b2b4_teidri ,
{ " TEIDRI (TEID Range Indication) " , " pfcp.upiri_flags.teidri " ,
FT_UINT8 , BASE_HEX , NULL , 0x1c ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_upiri_flags_b1_v6 ,
2017-11-12 12:51:00 +00:00
{ " V6 (IPv6) " , " pfcp.upiri_flags.v6 " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x02 ,
NULL , HFILL }
} ,
2018-02-26 23:44:26 +00:00
{ & hf_pfcp_upiri_flags_b0_v4 ,
2017-11-12 12:51:00 +00:00
{ " V4 (IPv4) " , " pfcp.upiri_flags.v4 " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x01 ,
NULL , HFILL }
} ,
{ & hf_pfcp_upiri_teidri ,
{ " TEID Range Indication " , " pfcp.upiri.teidri " ,
2017-12-22 12:44:14 +00:00
FT_UINT8 , BASE_DEC , NULL , 0x1C ,
2017-11-12 12:51:00 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_upiri_teid_range ,
{ " TEID " , " pfcp.upiri.teid_range " ,
FT_UINT32 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_upiri_ipv4 ,
{ " IPv4 address " , " pfcp.upiri.ipv4_addr " ,
FT_IPv4 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_upiri_ipv6 ,
{ " IPv6 address " , " pfcp.upiri.ipv6_addr " ,
FT_IPv6 , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-15 15:04:34 +00:00
{ & hf_pfcp_user_plane_inactivity_timer ,
{ " User Plane Inactivity Timer " , " pfcp.user_plane_inactivity_time " ,
FT_UINT32 , BASE_DEC | BASE_UNIT_STRING , & units_seconds , 0 ,
NULL , HFILL }
} ,
2017-09-13 15:22:05 +00:00
2018-02-28 20:20:49 +00:00
{ & hf_pfcp_subsequent_volume_quota ,
{ " Flags " , " pfcp.subsequent_volume_quota " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subsequent_volume_quota_b0_tovol ,
{ " TOVOL " , " pfcp.subsequent_volume_quota_flags.tovol " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subsequent_volume_quota_b1_ulvol ,
{ " ULVOL " , " pfcp.subsequent_volume_quota_flags.ulvol " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subsequent_volume_quota_b2_dlvol ,
{ " DLVOL " , " pfcp.subsequent_volume_quota_flags.dlvol " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subsequent_volume_quota_tovol ,
{ " Total Volume " , " pfcp.subsequent_volume_quota.tovol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subsequent_volume_quota_ulvol ,
{ " Uplink Volume " , " pfcp.subsequent_volume_quota.ulvol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subsequent_volume_quota_dlvol ,
{ " Downlink Volume " , " pfcp.subsequent_volume_quota.dlvol " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_subsequent_time_quota ,
{ " Subsequent Time Quota " , " pfcp.subsequent_time_quota " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-04-09 11:55:07 +00:00
{ & hf_pfcp_rqi_flag ,
{ " RQI " , " pfcp.rqi_flag " ,
FT_BOOLEAN , 8 , NULL , 0x01 ,
NULL , HFILL }
} ,
{ & hf_pfcp_qfi ,
{ " QFI " , " pfcp.qfi_value " ,
2018-10-04 16:22:28 +00:00
FT_UINT8 , BASE_HEX , NULL , 0x7f ,
2018-04-09 11:55:07 +00:00
NULL , HFILL }
} ,
{ & hf_pfcp_query_urr_reference ,
{ " Query URR Reference " , " pfcp.query_urr_reference " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_additional_usage_reports_information ,
{ " Additional Usage Reports Information " , " pfcp.additional_usage_reports_information " ,
FT_UINT16 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_additional_usage_reports_information_b15_auri ,
{ " AURI (Additional Usage Reports Indication) " , " pfcp.additional_usage_reports_information_auri " ,
FT_BOOLEAN , 16 , NULL , 0x8000 ,
NULL , HFILL }
} ,
{ & hf_pfcp_additional_usage_reports_information_b14_b0_number_value ,
{ " Number of Additional Usage Reports value " , " pfcp.additional_usage_reports_information_value " ,
FT_UINT16 , BASE_DEC , NULL , 0x7FFF ,
NULL , HFILL }
} ,
2018-04-10 15:58:35 +00:00
{ & hf_pfcp_traffic_endpoint_id ,
{ " Traffic Endpoint ID " , " pfcp.traffic_endpoint_id " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
2018-02-28 20:20:49 +00:00
2018-05-04 21:42:09 +00:00
{ & 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 ,
NULL , HFILL }
} ,
{ & hf_pfcp_mac_address_flags_b1_dest ,
{ " DEST " , " pfcp.mac_address.flags.dest " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x02 ,
NULL , HFILL }
} ,
{ & hf_pfcp_mac_address_flags_b2_usou ,
{ " USUO " , " pfcp.mac_address.flags.usuo " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x04 ,
NULL , HFILL }
} ,
{ & hf_pfcp_mac_address_flags_b3_udes ,
{ " UDES " , " pfcp.mac_address.flags.udes " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x08 ,
NULL , HFILL }
} ,
{ & hf_pfcp_mac_address_source_mac_address ,
{ " Source MAC Address " , " pfcp.mac_address.sour " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_mac_address_dest_mac_address ,
{ " Destination MAC Address " , " pfcp.mac_address.dest " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_mac_address_upper_source_mac_address ,
{ " Upper Source MAC Address " , " pfcp.mac_address.usou " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_mac_address_upper_dest_mac_address ,
{ " Upper Destination MAC Address " , " pfcp.mac_address.udes " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
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 ,
" Priority code point " , HFILL }
} ,
{ & hf_pfcp_c_tag_flags_b1_dei ,
{ " DEI " , " pfcp.c_tag.flags.dei " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
" Drop eligible indicator " , HFILL }
} ,
{ & hf_pfcp_c_tag_flags_b2_vid ,
{ " VID " , " pfcp.c_tag.flags.vid " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
" VLAN identifier " , HFILL }
} ,
{ & hf_pfcp_c_tag_cvid ,
{ " C-VLAN " , " pfcp.c_tag.cvid " ,
FT_UINT8 , BASE_HEX , NULL , 0xF0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_c_tag_dei_flag ,
{ " Drop eligible indicator (DEI) " , " pfcp.c_tag.dei_flag " ,
FT_BOOLEAN , 8 , TFS ( & tfs_eligible_ineligible ) , 0x08 ,
NULL , HFILL }
} ,
{ & hf_pfcp_c_tag_pcp_value ,
{ " Priority code point (PCP) " , " pfcp.c_tag.pcp " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_vlan_tag_pcp_vals ) , 0x07 ,
NULL , HFILL }
} ,
{ & hf_pfcp_c_tag_cvid_value ,
{ " C-VLAN value " , " pfcp.c_tag.cvid_value " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
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 ,
" Priority code point " , HFILL }
} ,
{ & hf_pfcp_s_tag_flags_b1_dei ,
{ " DEI " , " pfcp.s_tag.flags.dei " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
" Drop eligible indicator " , HFILL }
} ,
{ & hf_pfcp_s_tag_flags_b2_vid ,
{ " VID " , " pfcp.s_tag.flags.vid " ,
FT_BOOLEAN , 8 , NULL , 0x04 ,
" VLAN identifier " , HFILL }
} ,
{ & hf_pfcp_s_tag_svid ,
{ " S-VLAN " , " pfcp.s_tag.svid " ,
FT_UINT8 , BASE_HEX , NULL , 0xF0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_s_tag_dei_flag ,
{ " Drop eligible indicator (DEI) " , " pfcp.s_tag.dei_flag " ,
FT_BOOLEAN , 8 , TFS ( & tfs_eligible_ineligible ) , 0x08 ,
NULL , HFILL }
} ,
{ & hf_pfcp_s_tag_pcp_value ,
{ " Priority code point (PCP) " , " pfcp.s_tag.pcp " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_vlan_tag_pcp_vals ) , 0x07 ,
NULL , HFILL }
} ,
{ & hf_pfcp_s_tag_svid_value ,
{ " S-VLAN value " , " pfcp.s_tag.svid_value " ,
FT_UINT8 , BASE_HEX , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_ethertype ,
{ " Ethertype " , " pfcp.ethertype " ,
FT_UINT16 , BASE_HEX , VALS ( etype_vals ) , 0x0 ,
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 ,
NULL , HFILL }
} ,
{ & hf_pfcp_proxying_flags_b1_ins ,
{ " INS " , " pfcp.proxying.flags.ins " ,
FT_BOOLEAN , 8 , NULL , 0x02 ,
NULL , HFILL }
} ,
{ & hf_pfcp_ethertype_filter_id ,
{ " Ethertype Filter ID " , " pfcp.ethertype_filter_id " ,
FT_UINT64 , BASE_DEC , NULL , 0x0 ,
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 ,
NULL , HFILL }
} ,
2018-07-11 23:19:26 +00:00
{ & hf_pfcp_suggested_buffering_packets_count_packet_count ,
{ " Packet count " , " pfcp.suggested_buffering_packets_count.packet_count " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
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 ,
NULL , HFILL }
} ,
{ & hf_pfcp_user_id_flags_b1_imeif ,
{ " IMEIF " , " pfcp.user_id.flags.imeif " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x02 ,
NULL , HFILL }
} ,
2018-10-04 16:22:28 +00:00
{ & hf_pfcp_user_id_flags_b2_msisdnf ,
{ " MSISDNF " , " pfcp.user_id.flags.msisdnf " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x04 ,
NULL , HFILL }
} ,
{ & hf_pfcp_user_id_flags_b3_naif ,
{ " NAIF " , " pfcp.user_id.flags.naif " ,
FT_BOOLEAN , 8 , TFS ( & tfs_present_not_present ) , 0x08 ,
NULL , HFILL }
} ,
2018-07-11 23:19:26 +00:00
{ & hf_pfcp_user_id_length_of_imsi ,
{ " Length of IMSI " , " pfcp.user_id.length_of_imsi " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_user_id_length_of_imei ,
{ " Length of IMEI " , " pfcp.user_id.length_of_imei " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_user_id_imei ,
{ " IMEI " , " pfcp.user_id.imei " ,
2018-10-18 17:36:45 +00:00
FT_STRING , BASE_NONE , NULL , 0 ,
2018-07-11 23:19:26 +00:00
NULL , HFILL }
} ,
2018-10-04 16:22:28 +00:00
{ & hf_pfcp_user_id_length_of_msisdn ,
{ " Length of MSISDN " , " pfcp.user_id.length_of_msisdn " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_user_id_length_of_nai ,
{ " Length of NAI " , " pfcp.user_id.length_of_nai " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_user_id_nai ,
{ " NAI " , " pfcp.user_id.nai " ,
2018-10-18 17:36:45 +00:00
FT_STRING , BASE_NONE , NULL , 0x0 ,
2018-10-04 16:22:28 +00:00
NULL , HFILL }
} ,
2018-07-11 23:19:26 +00:00
{ & 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 ,
NULL , HFILL }
} ,
{ & hf_pfcp_mac_addresses_detected_number_of_mac_addresses ,
{ " Number of MAC addresses " , " pfcp.mac_addresses_detected.number_of_mac_addresses " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_mac_addresses_detected_mac_address ,
{ " MAC Address " , " pfcp.mac_addresses_detected.mac_address " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_mac_addresses_removed_number_of_mac_addresses ,
{ " Number of MAC addresses " , " pfcp.mac_addresses_removed.number_of_mac_address " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_mac_addresses_removed_mac_address ,
{ " MAC Address " , " pfcp.mac_addresses_removed.mac_addresses " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_ethernet_inactivity_timer ,
{ " Ethernet Inactivity Timer " , " pfcp.ethernet " ,
FT_UINT32 , BASE_DEC | BASE_UNIT_STRING , & units_seconds , 0 ,
NULL , HFILL }
} ,
2018-10-04 16:22:28 +00:00
2019-01-13 16:17:21 +00:00
{ & hf_pfcp_subsequent_event_quota ,
{ " Subsequent Event Quota " , " pfcp.subsequent_event_quota " ,
2018-10-04 16:22:28 +00:00
FT_UINT32 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
2019-01-13 16:17:21 +00:00
{ & hf_pfcp_subsequent_event_threshold ,
{ " Subsequent Event Threshold " , " pfcp.subsequent_event_threshold " ,
2018-10-04 16:22:28 +00:00
FT_UINT32 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_trace_information_trace_id ,
{ " Trace ID " , " pfcp.trace_information.traceid " ,
FT_UINT24 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_trace_information_length_trigger_events ,
{ " Length of Trigger Events " , " pfcp.trace_information.length_trigger_events " ,
FT_UINT8 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_trace_information_trigger_events ,
{ " Trigger Events " , " pfcp.trace_information.trigger_events " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_trace_information_session_trace_depth ,
{ " Session Trace Depth " , " pfcp.trace_information.session_trace_depth " ,
FT_UINT8 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_trace_information_length_list_interfaces ,
{ " Length of List of Interfaces " , " pfcp.trace_information.length_list_interfaces " ,
FT_UINT8 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_trace_information_list_interfaces ,
{ " List of Interfaces " , " pfcp.trace_information.list_interfaces " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_trace_information_length_ipaddress ,
{ " Length of IP Address " , " pfcp.trace_information.length_ipaddress " ,
FT_UINT8 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_trace_information_ipaddress ,
{ " IP Address " , " pfcp.trace_information.ipaddress " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_frame_route ,
{ " Frame-Route " , " pfcp.frame_route " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_frame_routing ,
{ " Frame-Routing " , " pfcp.frame_routing " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_frame_ipv6_route ,
{ " Frame-IPv6-Route " , " pfcp.frame_ipv6_route " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2019-01-13 16:17:21 +00:00
{ & hf_pfcp_event_quota ,
{ " Event Quota " , " pfcp.event_quota " ,
FT_UINT32 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_event_threshold ,
{ " Event Threshold " , " pfcp.event_threshold " ,
FT_UINT32 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_event_time_stamp ,
{ " Event Time Stamp " , " pfcp.event_time_stamp " ,
FT_STRING , BASE_NONE , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_averaging_window ,
{ " Averaging Window " , " pfcp.averaging_window " ,
FT_UINT32 , BASE_DEC , NULL , 0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_paging_policy_indicator ,
{ " Paging Policy Indicator (PPI) " , " pfcp.ppi " ,
FT_UINT8 , BASE_DEC , NULL , 0x7 ,
NULL , HFILL }
} ,
2019-07-04 22:57:12 +00:00
{ & hf_pfcp_apn_dnn ,
{ " APN/DNN " , " pfcp.apn_dnn " ,
FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_pfcp_tgpp_interface_type ,
{ " 3GPP Interface Type " , " pfcp.tgpp_interface_type " ,
FT_UINT8 , BASE_DEC , VALS ( pfcp_tgpp_interface_type_vals ) , 0x3f ,
NULL , HFILL }
} ,
2017-09-03 13:38:23 +00:00
} ;
/* Setup protocol subtree array */
2019-05-14 17:12:15 +00:00
# define NUM_INDIVIDUAL_ELEMS_PFCP 52
2017-09-04 11:40:00 +00:00
gint * ett [ NUM_INDIVIDUAL_ELEMS_PFCP +
( NUM_PFCP_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 ;
2017-09-05 15:22:14 +00:00
ett [ 5 ] = & ett_f_teid_flags ;
ett [ 6 ] = & ett_pfcp_ue_ip_address_flags ;
2017-09-06 15:38:12 +00:00
ett [ 7 ] = & ett_pfcp_sdf_filter_flags ;
2017-09-11 07:26:21 +00:00
ett [ 8 ] = & ett_pfcp_apply_action_flags ;
2017-09-13 15:22:05 +00:00
ett [ 9 ] = & ett_pfcp_measurement_method_flags ;
ett [ 10 ] = & ett_pfcp_reporting_triggers ;
ett [ 11 ] = & ett_pfcp_volume_threshold ;
ett [ 12 ] = & ett_pfcp_volume_quota ;
ett [ 13 ] = & ett_pfcp_subseq_volume_threshold ;
ett [ 14 ] = & ett_pfcp_dropped_dl_traffic_threshold ;
ett [ 15 ] = & ett_pfcp_gate_status ;
ett [ 16 ] = & ett_pfcp_report_type ;
ett [ 17 ] = & ett_pfcp_up_function_features ;
2017-09-18 15:20:36 +00:00
ett [ 18 ] = & ett_pfcp_report_trigger ;
ett [ 19 ] = & ett_pfcp_volume_measurement ;
ett [ 20 ] = & ett_pfcp_cp_function_features ;
ett [ 21 ] = & ett_pfcp_usage_information ;
ett [ 22 ] = & ett_pfcp_packet_rate ;
ett [ 23 ] = & ett_pfcp_pfcp_dl_flow_level_marking ;
2017-09-19 14:09:35 +00:00
ett [ 24 ] = & ett_pfcp_dl_data_service_inf ;
2018-02-27 21:31:25 +00:00
ett [ 25 ] = & ett_pfcp_pfcpsmreq ;
ett [ 26 ] = & ett_pfcp_pfcpsrrsp ;
2017-09-21 13:07:27 +00:00
ett [ 27 ] = & ett_pfcp_measurement_info ;
ett [ 28 ] = & ett_pfcp_node_report_type ;
2017-09-23 19:47:48 +00:00
ett [ 29 ] = & ett_pfcp_remote_gtp_u_peer ;
ett [ 30 ] = & ett_pfcp_oci_flags ;
2018-05-23 21:11:42 +00:00
ett [ 31 ] = & ett_pfcp_assoc_rel_req_flags ;
2017-11-12 12:51:00 +00:00
ett [ 32 ] = & ett_pfcp_upiri_flags ;
2018-02-22 21:28:25 +00:00
ett [ 33 ] = & ett_pfcp_flow_desc ;
ett [ 34 ] = & ett_pfcp_tos ;
ett [ 35 ] = & ett_pfcp_spi ;
ett [ 36 ] = & ett_pfcp_flow_label ;
2018-02-28 20:20:49 +00:00
ett [ 37 ] = & ett_pfcp_subsequent_volume_quota ;
2018-04-09 11:55:07 +00:00
ett [ 38 ] = & ett_pfcp_additional_usage_reports_information ;
2018-05-04 21:42:09 +00:00
ett [ 39 ] = & ett_pfcp_mac_address ;
ett [ 40 ] = & ett_pfcp_c_tag ;
2018-10-19 14:09:38 +00:00
ett [ 41 ] = & ett_pfcp_c_tag_dei ;
ett [ 42 ] = & ett_pfcp_s_tag ;
ett [ 43 ] = & ett_pfcp_s_tag_dei ;
ett [ 44 ] = & ett_pfcp_proxying ;
ett [ 45 ] = & ett_pfcp_ethernet_filter_properties ;
ett [ 46 ] = & ett_pfcp_user_id ;
ett [ 47 ] = & ett_pfcp_ethernet_pdu_session_information ;
ett [ 48 ] = & ett_pfcp_sdf_filter_id ;
2019-05-14 17:12:15 +00:00
ett [ 49 ] = & ett_pfcp_adf ;
ett [ 50 ] = & ett_pfcp_aurl ;
ett [ 51 ] = & ett_pfcp_adnp ;
2017-09-13 15:22:05 +00:00
2017-09-03 13:38:23 +00:00
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_to_large , { " pfcp.ie_not_decoded " , PI_UNDECODED , PI_NOTE , " IE not decoded yet(WS:IE id to large) " , EXPFILL } } ,
{ & ei_pfcp_enterprise_ie_3gpp , { " pfcp.ie_enterprise_3gpp " , PI_PROTOCOL , PI_ERROR , " IE not decoded yet(WS:No vendor dissector) " , EXPFILL } } ,
2018-05-04 22:00:08 +00:00
{ & ei_pfcp_ie_encoding_error , { " pfcp.ie_encoding_error " , PI_PROTOCOL , PI_ERROR , " IE wrongly encoded " , EXPFILL } } ,
2017-09-03 13:38:23 +00:00
} ;
2018-08-13 22:43:30 +00:00
module_t * module_pfcp ;
2017-09-03 13:38:23 +00:00
expert_module_t * expert_pfcp ;
2017-09-04 11:40:00 +00:00
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 ] ;
}
2017-09-03 13:38:23 +00:00
proto_pfcp = proto_register_protocol ( " Packet Forwarding Control Protocol " , " PFCP " , " pfcp " ) ;
pfcp_handle = register_dissector ( " pfcp " , dissect_pfcp , proto_pfcp ) ;
2018-08-13 22:43:30 +00:00
module_pfcp = prefs_register_protocol ( proto_pfcp , proto_reg_handoff_pfcp ) ;
2017-09-03 13:38:23 +00:00
proto_register_field_array ( proto_pfcp , hf_pfcp , array_length ( hf_pfcp ) ) ;
proto_register_subtree_array ( ett , array_length ( ett ) ) ;
expert_pfcp = expert_register_protocol ( proto_pfcp ) ;
expert_register_field_array ( expert_pfcp , ei , array_length ( ei ) ) ;
/* Register dissector table for enterprise IE dissectors */
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 ) ;
2018-08-13 22:43:30 +00:00
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 ) ;
2017-09-03 13:38:23 +00:00
}
void
proto_reg_handoff_pfcp ( void )
{
2018-08-13 22:43:30 +00:00
dissector_add_uint ( " udp.port " , g_pfcp_port , pfcp_handle ) ;
2017-09-03 13:38:23 +00:00
/* 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 ) ;
}
/*
* Editor modelines - http : //www.wireshark.org/tools/modelines.html
*
* Local variables :
* c - basic - offset : 4
* tab - width : 8
* indent - tabs - mode : nil
* End :
*
* vi : set shiftwidth = 4 tabstop = 8 expandtab :
* : indentSize = 4 : tabSize = 8 : noTabs = true :
*/