1 /* packet-pfcp.c
2  *
3  * Routines for Packet Forwarding Control Protocol (PFCP) dissection
4  *
5  * Copyright 2017-2018, Anders Broman <anders.broman@ericsson.com>
6  *
7  * Wireshark - Network traffic analyzer
8  * By Gerald Combs <gerald@wireshark.org>
9  * Copyright 1998 Gerald Combs
10  *
11  * SPDX-License-Identifier: GPL-2.0-or-later
12  *
13  * Ref 3GPP TS 29.244 V17.1.0 (2021-06-29)
14  */
15 #include "config.h"
16 
17 #include <epan/packet.h>
18 #include <epan/conversation.h>
19 #include <epan/etypes.h>
20 #include <epan/expert.h>
21 #include <epan/sminmpec.h>
22 #include <epan/addr_resolv.h> /* Needed for BASE_ENTERPRISES */
23 #include "packet-e164.h"
24 #include "packet-e212.h"
25 #include "packet-ip.h"
26 
27 void proto_register_pfcp(void);
28 void proto_reg_handoff_pfcp(void);
29 
30 static dissector_handle_t pfcp_handle;
31 static dissector_handle_t pfcp_3gpp_ies_handle;
32 static dissector_handle_t pfcp_travelping_ies_handle;
33 static dissector_handle_t pfcp_bbf_ies_handle;
34 
35 #define UDP_PORT_PFCP  8805
36 static guint g_pfcp_port = UDP_PORT_PFCP;
37 
38 static int proto_pfcp = -1;
39 
40 static int hf_pfcp_msg_type = -1;
41 static int hf_pfcp_msg_length = -1;
42 static int hf_pfcp_hdr_flags = -1;
43 static int hf_pfcp_version = -1;
44 static int hf_pfcp_fo_flag = -1;
45 static int hf_pfcp_mp_flag = -1;
46 static int hf_pfcp_s_flag = -1;
47 static int hf_pfcp_seid = -1;
48 static int hf_pfcp_seqno = -1;
49 static int hf_pfcp_mp = -1;
50 
51 static int hf_pfcp2_ie = -1;
52 static int hf_pfcp2_ie_len = -1;
53 static int hf_pfcp2_enterprise_ie = -1;
54 static int hf_pfcp_enterprise_id = -1;
55 static int hf_pfcp_enterprise_data = -1;
56 
57 static int hf_pfcp_response_in = -1;
58 static int hf_pfcp_response_to = -1;
59 static int hf_pfcp_response_time = -1;
60 
61 static int hf_pfcp_session = -1;
62 
63 static int hf_pfcp_spare_b2 = -1;
64 static int hf_pfcp_spare_b3 = -1;
65 static int hf_pfcp_spare_b4 = -1;
66 static int hf_pfcp_spare_b5 = -1;
67 static int hf_pfcp_spare_b6 = -1;
68 static int hf_pfcp_spare_b7 = -1;
69 static int hf_pfcp_spare_b7_b6 = -1;
70 static int hf_pfcp_spare_b7_b5 = -1;
71 static int hf_pfcp_spare_b7_b4 = -1;
72 static int hf_pfcp_spare_b7_b3 = -1;
73 static int hf_pfcp_spare_b7_b2 = -1;
74 static int hf_pfcp_spare_b7_b1 = -1;
75 static int hf_pfcp_spare_h0 = -1;
76 static int hf_pfcp_spare_h1 = -1;
77 static int hf_pfcp_spare_oct = -1;
78 static int hf_pfcp_spare = -1;
79 
80 static int hf_pfcp2_cause = -1;
81 static int hf_pfcp_node_id_type = -1;
82 static int hf_pfcp_node_id_ipv4 = -1;
83 static int hf_pfcp_node_id_ipv6 = -1;
84 static int hf_pfcp_node_id_fqdn = -1;
85 static int hf_pfcp_recovery_time_stamp = -1;
86 static int hf_pfcp_f_seid_flags = -1;
87 static int hf_pfcp_b0_v6 = -1;
88 static int hf_pfcp_b1_v4 = -1;
89 static int hf_pfcp_f_seid_ipv4 = -1;
90 static int hf_pfcp_f_seid_ipv6 = -1;
91 static int hf_pfcp_pdr_id = -1;
92 static int hf_pfcp_precedence = -1;
93 static int hf_pfcp_source_interface = -1;
94 static int hf_pfcp_f_teid_flags = -1;
95 static int hf_pfcp_fteid_flg_spare = -1;
96 static int hf_pfcp_fteid_flg_b3_ch_id = -1;
97 static int hf_pfcp_fteid_flg_b2_ch = -1;
98 static int hf_pfcp_fteid_flg_b1_v6 = -1;
99 static int hf_pfcp_fteid_flg_b0_v4 = -1;
100 static int hf_pfcp_f_teid_ch_id = -1;
101 static int hf_pfcp_f_teid_teid = -1;
102 static int hf_pfcp_f_teid_ipv4 = -1;
103 static int hf_pfcp_f_teid_ipv6 = -1;
104 static int hf_pfcp_network_instance = -1;
105 static int hf_pfcp_pdn_type = -1;
106 static int hf_pfcp_failed_rule_id_type = -1;
107 static int hf_pfcp_time_quota_mechanism_bti_type = -1;
108 static int hf_pfcp_time_quota_mechanism_bti = -1;
109 static int hf_pfcp_multiplier_value_digits = -1;
110 static int hf_pfcp_multiplier_exponent = -1;
111 
112 static int hf_pfcp_ue_ip_address_flags = -1;
113 static int hf_pfcp_ue_ip_address_flag_b0_v6 = -1;
114 static int hf_pfcp_ue_ip_address_flag_b1_v4 = -1;
115 static int hf_pfcp_ue_ip_address_flag_b2_sd = -1;
116 static int hf_pfcp_ue_ip_address_flag_b3_v6d = -1;
117 static int hf_pfcp_ue_ip_address_flag_b4_chv4 = -1;
118 static int hf_pfcp_ue_ip_address_flag_b5_chv6 = -1;
119 static int hf_pfcp_ue_ip_address_flag_b6_v6pl = -1;
120 static int hf_pfcp_ue_ip_addr_ipv4 = -1;
121 static int hf_pfcp_ue_ip_add_ipv6 = -1;
122 static int hf_pfcp_ue_ip_add_ipv6_prefix = -1;
123 static int hf_pfcp_ue_ip_add_ipv6pd = -1;
124 static int hf_pfcp_ue_ip_add_ipv6_prefix_length = -1;
125 static int hf_pfcp_application_id = -1;
126 static int hf_pfcp_application_id_str = -1;
127 
128 static int hf_pfcp_sdf_filter_flags = -1;
129 static int hf_pfcp_sdf_filter_flags_b0_fd = -1;
130 static int hf_pfcp_sdf_filter_flags_b1_ttc = -1;
131 static int hf_pfcp_sdf_filter_flags_b2_spi = -1;
132 static int hf_pfcp_sdf_filter_flags_b3_fl = -1;
133 static int hf_pfcp_sdf_filter_flags_b4_bid = -1;
134 
135 static int hf_pfcp_flow_desc_len = -1;
136 static int hf_pfcp_flow_desc = -1;
137 static int hf_pfcp_traffic_class = -1;
138 static int hf_pfcp_traffic_mask = -1;
139 static int hf_pfcp_traffic_dscp = -1;
140 static int hf_pfcp_spi = -1;
141 static int hf_pfcp_flow_label_spare_bit = -1;
142 static int hf_pfcp_flow_label = -1;
143 static int hf_pfcp_sdf_filter_id = -1;
144 
145 static int hf_pfcp_out_hdr_desc = -1;
146 static int hf_pfcp_gtpu_ext_hdr_del_b0_pdu_sess_cont = -1;
147 static int hf_pfcp_far_id_flg = -1;
148 static int hf_pfcp_far_id = -1;
149 static int hf_pfcp_urr_id_flg = -1;
150 static int hf_pfcp_urr_id = -1;
151 static int hf_pfcp_qer_id_flg = -1;
152 static int hf_pfcp_qer_id = -1;
153 static int hf_pfcp_predef_rules_name = -1;
154 
155 
156 
157 static int hf_pfcp_apply_action_flags_o6_b4_mbsu = -1;
158 static int hf_pfcp_apply_action_flags_o6_b3_fssm = -1;
159 static int hf_pfcp_apply_action_flags_o6_b2_ddpn = -1;
160 static int hf_pfcp_apply_action_flags_o6_b1_bdpn = -1;
161 static int hf_pfcp_apply_action_flags_o6_b0_edrt = -1;
162 static int hf_pfcp_apply_action_flags_o5_b7_dfrt = -1;
163 static int hf_pfcp_apply_action_flags_o5_b6_ipmd = -1;
164 static int hf_pfcp_apply_action_flags_o5_b5_ipma = -1;
165 static int hf_pfcp_apply_action_flags_o5_b4_dupl = -1;
166 static int hf_pfcp_apply_action_flags_o5_b3_nocp = -1;
167 static int hf_pfcp_apply_action_flags_o5_b2_buff = -1;
168 static int hf_pfcp_apply_action_flags_o5_b1_forw = -1;
169 static int hf_pfcp_apply_action_flags_o5_b0_drop = -1;
170 
171 static int hf_pfcp_bar_id = -1;
172 static int hf_pfcp_fq_csid_node_id_type = -1;
173 static int hf_pfcp_num_csid = -1;
174 static int hf_pfcp_fq_csid_node_id_ipv4 = -1;
175 static int hf_pfcp_fq_csid_node_id_ipv6 = -1;
176 static int hf_pfcp_fq_csid_node_id_mcc_mnc = -1;
177 static int hf_pfcp_fq_csid_node_id_int = -1;
178 static int hf_pfcp_fq_csid = -1;
179 static int hf_pfcp_fq_csid_node_type = -1;
180 static int hf_pfcp_measurement_period = -1;
181 static int hf_pfcp_duration_measurement = -1;
182 static int hf_pfcp_time_of_first_packet = -1;
183 static int hf_pfcp_time_of_last_packet = -1;
184 static int hf_pfcp_dst_interface = -1;
185 static int hf_pfcp_redirect_address_type = -1;
186 static int hf_pfcp_redirect_server_addr_len = -1;
187 static int hf_pfcp_redirect_server_address = -1;
188 static int hf_pfcp_other_redirect_server_addr_len = -1;
189 static int hf_pfcp_other_redirect_server_address = -1;
190 static int hf_pfcp_outer_hdr_desc = -1;
191 static int hf_pfcp_outer_hdr_creation_teid = -1;
192 static int hf_pfcp_outer_hdr_creation_ipv4 = -1;
193 static int hf_pfcp_outer_hdr_creation_ipv6 = -1;
194 static int hf_pfcp_outer_hdr_creation_port = -1;
195 static int hf_pfcp_time_threshold = -1;
196 static int hf_pfcp_forwarding_policy_id_len = -1;
197 static int hf_pfcp_forwarding_policy_id = -1;
198 
199 static int hf_pfcp_measurement_method_flags = -1;
200 static int hf_pfcp_measurement_method_flags_b0_durat = -1;
201 static int hf_pfcp_measurement_method_flags_b1_volume = -1;
202 static int hf_pfcp_measurement_method_flags_b2_event = -1;
203 
204 static int hf_pfcp_subsequent_time_threshold = -1;
205 static int hf_pfcp_inactivity_detection_time = -1;
206 static int hf_pfcp_monitoring_time = -1;
207 
208 static int hf_pfcp_reporting_triggers_o5_b7_liusa = -1;
209 static int hf_pfcp_reporting_triggers_o5_b6_droth = -1;
210 static int hf_pfcp_reporting_triggers_o5_b5_stopt = -1;
211 static int hf_pfcp_reporting_triggers_o5_b4_start = -1;
212 static int hf_pfcp_reporting_triggers_o5_b3_quhti = -1;
213 static int hf_pfcp_reporting_triggers_o5_b2_timth = -1;
214 static int hf_pfcp_reporting_triggers_o5_b1_volth = -1;
215 static int hf_pfcp_reporting_triggers_o5_b0_perio = -1;
216 static int hf_pfcp_reporting_triggers_o6_b7_quvti = -1;
217 static int hf_pfcp_reporting_triggers_o6_b6_ipmjl = -1;
218 static int hf_pfcp_reporting_triggers_o6_b5_evequ = -1;
219 static int hf_pfcp_reporting_triggers_o6_b4_eveth = -1;
220 static int hf_pfcp_reporting_triggers_o6_b3_macar = -1;
221 static int hf_pfcp_reporting_triggers_o6_b2_envcl = -1;
222 static int hf_pfcp_reporting_triggers_o6_b1_timqu = -1;
223 static int hf_pfcp_reporting_triggers_o6_b0_volqu = -1;
224 static int hf_pfcp_reporting_triggers_o7_b0_reemr = -1;
225 
226 static int hf_pfcp_volume_threshold = -1;
227 static int hf_pfcp_volume_threshold_b2_dlvol = -1;
228 static int hf_pfcp_volume_threshold_b1_ulvol = -1;
229 static int hf_pfcp_volume_threshold_b0_tovol = -1;
230 static int hf_pfcp_volume_threshold_tovol = -1;
231 static int hf_pfcp_volume_threshold_ulvol = -1;
232 static int hf_pfcp_volume_threshold_dlvol = -1;
233 
234 static int hf_pfcp_volume_quota = -1;
235 static int hf_pfcp_volume_quota_b2_dlvol = -1;
236 static int hf_pfcp_volume_quota_b1_ulvol = -1;
237 static int hf_pfcp_volume_quota_b0_tovol = -1;
238 static int hf_pfcp_volume_quota_tovol = -1;
239 static int hf_pfcp_volume_quota_ulvol = -1;
240 static int hf_pfcp_volume_quota_dlvol = -1;
241 
242 static int hf_pfcp_subseq_volume_threshold = -1;
243 static int hf_pfcp_subseq_volume_threshold_b2_dlvol = -1;
244 static int hf_pfcp_subseq_volume_threshold_b1_ulvol = -1;
245 static int hf_pfcp_subseq_volume_threshold_b0_tovol = -1;
246 static int hf_pfcp_subseq_volume_threshold_tovol = -1;
247 static int hf_pfcp_subseq_volume_threshold_ulvol = -1;
248 static int hf_pfcp_subseq_volume_threshold_dlvol = -1;
249 
250 static int hf_pfcp_time_quota = -1;
251 static int hf_pfcp_start_time = -1;
252 static int hf_pfcp_end_time = -1;
253 static int hf_pfcp_quota_holding_time = -1;
254 static int hf_pfcp_dropped_dl_traffic_threshold = -1;
255 static int hf_pfcp_dropped_dl_traffic_threshold_b1_dlby = -1;
256 static int hf_pfcp_dropped_dl_traffic_threshold_b0_dlpa = -1;
257 static int hf_pfcp_downlink_packets = -1;
258 static int hf_pfcp_bytes_downlink_data = -1;
259 static int hf_pfcp_qer_correlation_id = -1;
260 static int hf_pfcp_gate_status = -1;
261 static int hf_pfcp_gate_status_b0b1_dlgate = -1;
262 static int hf_pfcp_gate_status_b3b2_ulgate = -1;
263 static int hf_pfcp_ul_mbr = -1;
264 static int hf_pfcp_dl_mbr = -1;
265 static int hf_pfcp_ul_gbr = -1;
266 static int hf_pfcp_dl_gbr = -1;
267 
268 static int hf_pfcp_report_type = -1;
269 static int hf_pfcp_report_type_b6_uisr = -1;
270 static int hf_pfcp_report_type_b5_sesr = -1;
271 static int hf_pfcp_report_type_b4_tmir = -1;
272 static int hf_pfcp_report_type_b3_upir = -1;
273 static int hf_pfcp_report_type_b2_erir = -1;
274 static int hf_pfcp_report_type_b1_usar = -1;
275 static int hf_pfcp_report_type_b0_dldr = -1;
276 
277 static int hf_pfcp_offending_ie = -1;
278 static int hf_pfcp_offending_ie_value = -1;
279 
280 
281 static int hf_pfcp_up_function_features_o11_b0_drqos = -1;
282 static int hf_pfcp_up_function_features_o10_b7_dnsts = -1;
283 static int hf_pfcp_up_function_features_o10_b6_iprep = -1;
284 static int hf_pfcp_up_function_features_o10_b5_resps = -1;
285 static int hf_pfcp_up_function_features_o10_b4_upber = -1;
286 static int hf_pfcp_up_function_features_o10_b3_l2tp = -1;
287 static int hf_pfcp_up_function_features_o10_b2_nspoc = -1;
288 static int hf_pfcp_up_function_features_o10_b1_quoaf = -1;
289 static int hf_pfcp_up_function_features_o10_b0_rttwp = -1;
290 static int hf_pfcp_up_function_features_o9_b7_rds = -1;
291 static int hf_pfcp_up_function_features_o9_b6_ddds = -1;
292 static int hf_pfcp_up_function_features_o9_b5_ethar = -1;
293 static int hf_pfcp_up_function_features_o9_b4_ciot = -1;
294 static int hf_pfcp_up_function_features_o9_b3_mt_edt = -1;
295 static int hf_pfcp_up_function_features_o9_b2_gpqm = -1;
296 static int hf_pfcp_up_function_features_o9_b1_qfqm = -1;
297 static int hf_pfcp_up_function_features_o9_b0_atsss_ll = -1;
298 static int hf_pfcp_up_function_features_o8_b7_mptcp = -1;
299 static int hf_pfcp_up_function_features_o8_b6_tscu = -1;
300 static int hf_pfcp_up_function_features_o8_b5_ip6pl = -1;
301 static int hf_pfcp_up_function_features_o8_b4_iptv = -1;
302 static int hf_pfcp_up_function_features_o8_b3_norp = -1;
303 static int hf_pfcp_up_function_features_o8_b2_vtime = -1;
304 static int hf_pfcp_up_function_features_o8_b1_rttl = -1;
305 static int hf_pfcp_up_function_features_o8_b0_mpas = -1;
306 static int hf_pfcp_up_function_features_o7_b7_gcom = -1;
307 static int hf_pfcp_up_function_features_o7_b6_bundl = -1;
308 static int hf_pfcp_up_function_features_o7_b5_mte_n4 = -1;
309 static int hf_pfcp_up_function_features_o7_b4_mnop = -1;
310 static int hf_pfcp_up_function_features_o7_b3_sset = -1;
311 static int hf_pfcp_up_function_features_o7_b2_ueip = -1;
312 static int hf_pfcp_up_function_features_o7_b1_adpdp = -1;
313 static int hf_pfcp_up_function_features_o7_b0_dpdra = -1;
314 static int hf_pfcp_up_function_features_o6_b7_epfar = -1;
315 static int hf_pfcp_up_function_features_o6_b6_pfde = -1;
316 static int hf_pfcp_up_function_features_o6_b5_frrt = -1;
317 static int hf_pfcp_up_function_features_o6_b4_trace = -1;
318 static int hf_pfcp_up_function_features_o6_b3_quoac = -1;
319 static int hf_pfcp_up_function_features_o6_b2_udbc = -1;
320 static int hf_pfcp_up_function_features_o6_b1_pdiu = -1;
321 static int hf_pfcp_up_function_features_o6_b0_empu = -1;
322 static int hf_pfcp_up_function_features_o5_b7_treu = -1;
323 static int hf_pfcp_up_function_features_o5_b6_heeu = -1;
324 static int hf_pfcp_up_function_features_o5_b5_pfdm = -1;
325 static int hf_pfcp_up_function_features_o5_b4_ftup = -1;
326 static int hf_pfcp_up_function_features_o5_b3_trst = -1;
327 static int hf_pfcp_up_function_features_o5_b2_dlbd = -1;
328 static int hf_pfcp_up_function_features_o5_b1_ddnd = -1;
329 static int hf_pfcp_up_function_features_o5_b0_bucp = -1;
330 
331 static int hf_pfcp_sequence_number = -1;
332 static int hf_pfcp_metric = -1;
333 static int hf_pfcp_timer_unit = -1;
334 static int hf_pfcp_timer_value = -1;
335 
336 static int hf_pfcp_usage_report_trigger_o5_b7_immer = -1;
337 static int hf_pfcp_usage_report_trigger_o5_b6_droth = -1;
338 static int hf_pfcp_usage_report_trigger_o5_b5_stopt = -1;
339 static int hf_pfcp_usage_report_trigger_o5_b4_start = -1;
340 static int hf_pfcp_usage_report_trigger_o5_b3_quhti = -1;
341 static int hf_pfcp_usage_report_trigger_o5_b2_timth = -1;
342 static int hf_pfcp_usage_report_trigger_o5_b1_volth = -1;
343 static int hf_pfcp_usage_report_trigger_o5_b0_perio = -1;
344 static int hf_pfcp_usage_report_trigger_o6_b7_eveth = -1;
345 static int hf_pfcp_usage_report_trigger_o6_b6_macar = -1;
346 static int hf_pfcp_usage_report_trigger_o6_b5_envcl = -1;
347 static int hf_pfcp_usage_report_trigger_o6_b4_monit = -1;
348 static int hf_pfcp_usage_report_trigger_o6_b3_termr = -1;
349 static int hf_pfcp_usage_report_trigger_o6_b2_liusa = -1;
350 static int hf_pfcp_usage_report_trigger_o6_b1_timqu = -1;
351 static int hf_pfcp_usage_report_trigger_o6_b0_volqu = -1;
352 static int hf_pfcp_usage_report_trigger_o7_b4_emrre = -1;
353 static int hf_pfcp_usage_report_trigger_o7_b3_quvti = -1;
354 static int hf_pfcp_usage_report_trigger_o7_b2_ipmjl = -1;
355 static int hf_pfcp_usage_report_trigger_o7_b1_tebur = -1;
356 static int hf_pfcp_usage_report_trigger_o7_b0_evequ = -1;
357 
358 static int hf_pfcp_volume_measurement = -1;
359 static int hf_pfcp_volume_measurement_b5_dlnop = -1;
360 static int hf_pfcp_volume_measurement_b4_ulnop = -1;
361 static int hf_pfcp_volume_measurement_b3_tonop = -1;
362 static int hf_pfcp_volume_measurement_b2_dlvol = -1;
363 static int hf_pfcp_volume_measurement_b1_ulvol = -1;
364 static int hf_pfcp_volume_measurement_b0_tovol = -1;
365 static int hf_pfcp_vol_meas_tovol = -1;
366 static int hf_pfcp_vol_meas_ulvol = -1;
367 static int hf_pfcp_vol_meas_dlvol = -1;
368 static int hf_pfcp_vol_meas_tonop = -1;
369 static int hf_pfcp_vol_meas_ulnop = -1;
370 static int hf_pfcp_vol_meas_dlnop = -1;
371 
372 static int hf_pfcp_cp_function_features_o6_b0_psucc = -1;
373 static int hf_pfcp_cp_function_features_o5_b7_uiaur = -1;
374 static int hf_pfcp_cp_function_features_o5_b6_ardr = -1;
375 static int hf_pfcp_cp_function_features_o5_b5_mpas = -1;
376 static int hf_pfcp_cp_function_features_o5_b4_bundl = -1;
377 static int hf_pfcp_cp_function_features_o5_b3_sset = -1;
378 static int hf_pfcp_cp_function_features_o5_b2_epfar = -1;
379 static int hf_pfcp_cp_function_features_o5_b1_ovrl = -1;
380 static int hf_pfcp_cp_function_features_o5_b0_load = -1;
381 
382 static int hf_pfcp_usage_information = -1;
383 static int hf_pfcp_usage_information_b3_ube = -1;
384 static int hf_pfcp_usage_information_b2_uae = -1;
385 static int hf_pfcp_usage_information_b1_aft = -1;
386 static int hf_pfcp_usage_information_b0_bef = -1;
387 
388 static int hf_pfcp_application_instance_id = -1;
389 static int hf_pfcp_application_instance_id_str = -1;
390 static int hf_pfcp_flow_dir = -1;
391 static int hf_pfcp_packet_rate = -1;
392 static int hf_pfcp_packet_rate_b0_ulpr = -1;
393 static int hf_pfcp_packet_rate_b1_dlpr = -1;
394 static int hf_pfcp_packet_rate_b2_aprc = -1;
395 static int hf_pfcp_ul_time_unit = -1;
396 static int hf_pfcp_max_ul_pr = -1;
397 static int hf_pfcp_dl_time_unit = -1;
398 static int hf_pfcp_max_dl_pr = -1;
399 static int hf_pfcp_a_ul_time_unit = -1;
400 static int hf_pfcp_a_max_ul_pr = -1;
401 static int hf_pfcp_a_dl_time_unit = -1;
402 static int hf_pfcp_a_max_dl_pr = -1;
403 
404 static int hf_pfcp_dl_flow_level_marking = -1;
405 static int hf_pfcp_dl_flow_level_marking_b0_ttc = -1;
406 static int hf_pfcp_dl_flow_level_marking_b1_sci = -1;
407 
408 static int hf_pfcp_sci = -1;
409 static int hf_pfcp_dl_data_notification_delay = -1;
410 static int hf_pfcp_packet_count = -1;
411 static int hf_pfcp_dl_data_service_inf_flags = -1;
412 static int hf_pfcp_dl_data_service_inf_b0_ppi = -1;
413 static int hf_pfcp_dl_data_service_inf_b1_qfii = -1;
414 static int hf_pfcp_ppi = -1;
415 
416 static int hf_pfcp_pfcpsmreq_flags = -1;
417 static int hf_pfcp_pfcpsmreq_flags_b0_drobu = -1;
418 static int hf_pfcp_pfcpsmreq_flags_b1_sndem = -1;
419 static int hf_pfcp_pfcpsmreq_flags_b2_qaurr = -1;
420 static int hf_pfcp_pfcpsmreq_flags_b3_sumpc = -1;
421 static int hf_pfcp_pfcpsmreq_flags_b4_rumuc = -1;
422 
423 static int hf_pfcp_pfcpsrrsp_flags = -1;
424 static int hf_pfcp_pfcpsrrsp_flags_b0_drobu = -1;
425 
426 static int hf_pfcp_pfd_contents_flags = -1;
427 static int hf_pfcp_pfd_contents_flags_b7_adnp = -1;
428 static int hf_pfcp_pfd_contents_flags_b6_aurl = -1;
429 static int hf_pfcp_pfd_contents_flags_b5_afd = -1;
430 static int hf_pfcp_pfd_contents_flags_b4_dnp = -1;
431 static int hf_pfcp_pfd_contents_flags_b3_cp = -1;
432 static int hf_pfcp_pfd_contents_flags_b2_dn = -1;
433 static int hf_pfcp_pfd_contents_flags_b1_url = -1;
434 static int hf_pfcp_pfd_contents_flags_b0_fd = -1;
435 
436 static int hf_pfcp_url_len = -1;
437 static int hf_pfcp_url = -1;
438 static int hf_pfcp_dn_len = -1;
439 static int hf_pfcp_dn = -1;
440 static int hf_pfcp_cp_len = -1;
441 static int hf_pfcp_cp = -1;
442 static int hf_pfcp_dnp_len = -1;
443 static int hf_pfcp_dnp = -1;
444 static int hf_pfcp_afd_len = -1;
445 static int hf_pfcp_aurl_len = -1;
446 static int hf_pfcp_adnp_len = -1;
447 static int hf_pfcp_header_type = -1;
448 static int hf_pfcp_hf_len = -1;
449 static int hf_pfcp_hf_name = -1;
450 static int hf_pfcp_hf_val_len = -1;
451 static int hf_pfcp_hf_val = -1;
452 
453 static int hf_pfcp_measurement_info = -1;
454 static int hf_pfcp_measurement_info_b0_mbqe = -1;
455 static int hf_pfcp_measurement_info_b1_inam = -1;
456 static int hf_pfcp_measurement_info_b2_radi = -1;
457 static int hf_pfcp_measurement_info_b3_istm = -1;
458 static int hf_pfcp_measurement_info_b4_mnop = -1;
459 static int hf_pfcp_measurement_info_b5_sspoc = -1;
460 static int hf_pfcp_measurement_info_b6_aspoc = -1;
461 static int hf_pfcp_measurement_info_b7_ciam = -1;
462 
463 static int hf_pfcp_node_report_type = -1;
464 static int hf_pfcp_node_report_type_b0_upfr = -1;
465 static int hf_pfcp_node_report_type_b1_uprr = -1;
466 static int hf_pfcp_node_report_type_b2_ckdr = -1;
467 static int hf_pfcp_node_report_type_b3_gpqr = -1;
468 
469 static int hf_pfcp_remote_gtp_u_peer_flags = -1;
470 static int hf_pfcp_remote_gtp_u_peer_flags_b0_v6 = -1;
471 static int hf_pfcp_remote_gtp_u_peer_flags_b1_v4 = -1;
472 static int hf_pfcp_remote_gtp_u_peer_flags_b2_di = -1;
473 static int hf_pfcp_remote_gtp_u_peer_flags_b3_ni = -1;
474 static int hf_pfcp_remote_gtp_u_peer_ipv4 = -1;
475 static int hf_pfcp_remote_gtp_u_peer_ipv6 = -1;
476 static int hf_pfcp_remote_gtp_u_peer_length_di = -1;
477 static int hf_pfcp_remote_gtp_u_peer_length_ni = -1;
478 static int hf_pfcp_ur_seqn = -1;
479 
480 static int hf_pfcp_oci_flags = -1;
481 static int hf_pfcp_oci_flags_b0_aoci = -1;
482 
483 static int hf_pfcp_pfcp_assoc_rel_req_flags = -1;
484 static int hf_pfcp_pfcp_assoc_rel_req_b0_sarr = -1;
485 
486 static int hf_pfcp_upiri_flags = -1;
487 static int hf_pfcp_upiri_flags_b0_v4 = -1;
488 static int hf_pfcp_upiri_flags_b1_v6 = -1;
489 static int hf_pfcp_upiri_flg_b6_assosi = -1;
490 static int hf_pfcp_upiri_flg_b5_assoni = -1;
491 static int hf_pfcp_upiri_flg_b2b4_teidri = -1;
492 static int hf_pfcp_upiri_teidri = -1;
493 static int hf_pfcp_upiri_teid_range = -1;
494 static int hf_pfcp_upiri_ipv4 = -1;
495 static int hf_pfcp_upiri_ipv6 = -1;
496 
497 static int hf_pfcp_user_plane_inactivity_timer = -1;
498 
499 static int hf_pfcp_subsequent_volume_quota = -1;
500 static int hf_pfcp_subsequent_volume_quota_b2_dlvol = -1;
501 static int hf_pfcp_subsequent_volume_quota_b1_ulvol = -1;
502 static int hf_pfcp_subsequent_volume_quota_b0_tovol = -1;
503 static int hf_pfcp_subsequent_volume_quota_tovol = -1;
504 static int hf_pfcp_subsequent_volume_quota_ulvol = -1;
505 static int hf_pfcp_subsequent_volume_quota_dlvol = -1;
506 
507 static int hf_pfcp_subsequent_time_quota = -1;
508 
509 static int hf_pfcp_rqi_flag = -1;
510 static int hf_pfcp_qfi = -1;
511 static int hf_pfcp_query_urr_reference = -1;
512 static int hf_pfcp_additional_usage_reports_information = -1;
513 static int hf_pfcp_additional_usage_reports_information_b14_b0_number_value = -1;
514 static int hf_pfcp_additional_usage_reports_information_b15_auri = -1;
515 static int hf_pfcp_traffic_endpoint_id = -1;
516 
517 static int hf_pfcp_mac_address_flags = -1;
518 static int hf_pfcp_mac_address_flags_b3_udes = -1;
519 static int hf_pfcp_mac_address_flags_b2_usou = -1;
520 static int hf_pfcp_mac_address_flags_b1_dest = -1;
521 static int hf_pfcp_mac_address_flags_b0_sour = -1;
522 static int hf_pfcp_mac_address_upper_dest_mac_address = -1;
523 static int hf_pfcp_mac_address_upper_source_mac_address = -1;
524 static int hf_pfcp_mac_address_dest_mac_address = -1;
525 static int hf_pfcp_mac_address_source_mac_address = -1;
526 
527 static int hf_pfcp_c_tag_flags = -1;
528 static int hf_pfcp_c_tag_flags_b2_vid = -1;
529 static int hf_pfcp_c_tag_flags_b1_dei = -1;
530 static int hf_pfcp_c_tag_flags_b0_pcp = -1;
531 static int hf_pfcp_c_tag_cvid = -1;
532 static int hf_pfcp_c_tag_dei_flag = -1;
533 static int hf_pfcp_c_tag_pcp_value = -1;
534 
535 static int hf_pfcp_s_tag_flags = -1;
536 static int hf_pfcp_s_tag_flags_b2_vid = -1;
537 static int hf_pfcp_s_tag_flags_b1_dei = -1;
538 static int hf_pfcp_s_tag_flags_b0_pcp = -1;
539 static int hf_pfcp_s_tag_svid = -1;
540 static int hf_pfcp_s_tag_dei_flag = -1;
541 static int hf_pfcp_s_tag_pcp_value = -1;
542 
543 static int hf_pfcp_ethertype = -1;
544 
545 static int hf_pfcp_proxying_flags = -1;
546 static int hf_pfcp_proxying_flags_b1_ins = -1;
547 static int hf_pfcp_proxying_flags_b0_arp = -1;
548 
549 static int hf_pfcp_ethertype_filter_id = -1;
550 
551 static int hf_pfcp_ethertype_filter_properties_flags = -1;
552 static int hf_pfcp_ethertype_filter_properties_flags_b0_bide = -1;
553 
554 static int hf_pfcp_suggested_buffering_packets_count_packet_count = -1;
555 
556 static int hf_pfcp_user_id_flags = -1;
557 static int hf_pfcp_user_id_flags_b6_peif = -1;
558 static int hf_pfcp_user_id_flags_b5_gpsif = -1;
559 static int hf_pfcp_user_id_flags_b4_supif = -1;
560 static int hf_pfcp_user_id_flags_b3_naif = -1;
561 static int hf_pfcp_user_id_flags_b2_msisdnf = -1;
562 static int hf_pfcp_user_id_flags_b1_imeif = -1;
563 static int hf_pfcp_user_id_flags_b0_imsif = -1;
564 static int hf_pfcp_user_id_length_of_imsi = -1;
565 static int hf_pfcp_user_id_length_of_imei = -1;
566 static int hf_pfcp_user_id_imei = -1;
567 static int hf_pfcp_user_id_length_of_msisdn = -1;
568 static int hf_pfcp_user_id_length_of_nai = -1;
569 static int hf_pfcp_user_id_nai = -1;
570 static int hf_pfcp_user_id_length_of_supi = -1;
571 static int hf_pfcp_user_id_supi = -1;
572 static int hf_pfcp_user_id_length_of_gpsi = -1;
573 static int hf_pfcp_user_id_gpsi = -1;
574 static int hf_pfcp_user_id_length_of_pei = -1;
575 static int hf_pfcp_user_id_pei = -1;
576 
577 static int hf_pfcp_ethernet_pdu_session_information_flags = -1;
578 static int hf_pfcp_ethernet_pdu_session_information_flags_b0_ethi = -1;
579 
580 static int hf_pfcp_mac_addresses_detected_number_of_mac_addresses = -1;
581 static int hf_pfcp_mac_addresses_detected_mac_address = -1;
582 static int hf_pfcp_mac_addresses_detected_length_of_ctag = -1;
583 static int hf_pfcp_mac_addresses_detected_length_of_stag = -1;
584 
585 static int hf_pfcp_mac_addresses_removed_number_of_mac_addresses = -1;
586 static int hf_pfcp_mac_addresses_removed_mac_address = -1;
587 static int hf_pfcp_mac_addresses_removed_length_of_ctag = -1;
588 static int hf_pfcp_mac_addresses_removed_length_of_stag = -1;
589 
590 static int hf_pfcp_ethernet_inactivity_timer = -1;
591 
592 static int hf_pfcp_subsequent_event_quota = -1;
593 
594 static int hf_pfcp_subsequent_event_threshold = -1;
595 
596 static int hf_pfcp_trace_information_trace_id = -1;
597 static int hf_pfcp_trace_information_length_trigger_events = -1;
598 static int hf_pfcp_trace_information_trigger_events = -1;
599 static int hf_pfcp_trace_information_session_trace_depth = -1;
600 static int hf_pfcp_trace_information_length_list_interfaces = -1;
601 static int hf_pfcp_trace_information_list_interfaces = -1;
602 static int hf_pfcp_trace_information_length_ipaddress = -1;
603 static int hf_pfcp_trace_information_ipv4 = -1;
604 static int hf_pfcp_trace_information_ipv6 = -1;
605 
606 static int hf_pfcp_framed_route = -1;
607 static int hf_pfcp_framed_routing = -1;
608 static int hf_pfcp_framed_ipv6_route = -1;
609 
610 static int hf_pfcp_event_quota = -1;
611 
612 static int hf_pfcp_event_threshold = -1;
613 
614 static int hf_pfcp_time_stamp = -1;
615 
616 static int hf_pfcp_averaging_window = -1;
617 
618 static int hf_pfcp_paging_policy_indicator = -1;
619 
620 static int hf_pfcp_apn_dnn = -1;
621 
622 static int hf_pfcp_tgpp_interface_type = -1;
623 
624 static int hf_pfcp_pfcpsrreq_flags = -1;
625 static int hf_pfcp_pfcpsrreq_flags_b0_psdbu = -1;
626 
627 static int hf_pfcp_pfcpaureq_flags = -1;
628 static int hf_pfcp_pfcpaureq_flags_b0_parps = -1;
629 
630 static int hf_pfcp_activation_time = -1;
631 static int hf_pfcp_deactivation_time = -1;
632 
633 static int hf_pfcp_mar_id = -1;
634 
635 static int hf_pfcp_steering_functionality = -1;
636 static int hf_pfcp_steering_mode = -1;
637 
638 static int hf_pfcp_weight = -1;
639 static int hf_pfcp_priority = -1;
640 
641 static int hf_pfcp_ue_ip_address_pool_length = -1;
642 static int hf_pfcp_ue_ip_address_pool_identity = -1;
643 
644 static int hf_pfcp_pfcp_alternative_smf_ip_address_flags = -1;
645 static int hf_pfcp_alternative_smf_ip_address_ipv4 = -1;
646 static int hf_pfcp_alternative_smf_ip_address_ipv6 = -1;
647 
648 static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags = -1;
649 static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b3_dcaroni = -1;
650 static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b2_prin6i = -1;
651 static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b1_prin19i = -1;
652 static int hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b0_priueai = -1;
653 
654 static int hf_pfcp_validity_time_value = -1;
655 
656 static int hf_pfcp_number_of_reports = -1;
657 
658 static int hf_pfcp_pfcpasrsp_flags_flags = -1;
659 static int hf_pfcp_pfcpasrsp_flags_flags_b1_uupsi = -1;
660 static int hf_pfcp_pfcpasrsp_flags_flags_b0_psrei = -1;
661 
662 static int hf_pfcp_cp_pfcp_entity_ip_address_flags = -1;
663 static int hf_pfcp_cp_pfcp_entity_ip_address_ipv4 = -1;
664 static int hf_pfcp_cp_pfcp_entity_ip_address_ipv6 = -1;
665 
666 static int hf_pfcp_pfcpsereq_flags_flags = -1;
667 static int hf_pfcp_pfcpsereq_flags_flags_b1_sumpc = -1;
668 static int hf_pfcp_pfcpsereq_flags_flags_b0_resti = -1;
669 
670 static int hf_pfcp_ip_multicast_address_flags = -1;
671 static int hf_pfcp_ip_multicast_address_flags_b3_any = -1;
672 static int hf_pfcp_ip_multicast_address_flags_b2_range = -1;
673 static int hf_pfcp_ip_multicast_address_start_ipv4 = -1;
674 static int hf_pfcp_ip_multicast_address_start_ipv6 = -1;
675 static int hf_pfcp_ip_multicast_address_end_ipv4 = -1;
676 static int hf_pfcp_ip_multicast_address_end_ipv6 = -1;
677 
678 static int hf_pfcp_source_ip_address_flags = -1;
679 static int hf_pfcp_source_ip_address_flags_b2_mpl = -1;
680 static int hf_pfcp_source_ip_address_ipv4 = -1;
681 static int hf_pfcp_source_ip_address_ipv6 = -1;
682 static int hf_pfcp_source_ip_address_mask_prefix_lengt = -1;
683 
684 static int hf_pfcp_packet_rate_status_flags = -1;
685 static int hf_pfcp_packet_rate_status_flags_b2_apr = -1;
686 static int hf_pfcp_packet_rate_status_flags_b1_dl = -1;
687 static int hf_pfcp_packet_rate_status_flags_b0_ul = -1;
688 static int hf_pfcp_packet_rate_status_ul = -1;
689 static int hf_pfcp_packet_rate_status_dl = -1;
690 static int hf_pfcp_packet_rate_status_apr_ul = -1;
691 static int hf_pfcp_packet_rate_status_apr_dl = -1;
692 static int hf_pfcp_packet_rate_status_validity_time = -1;
693 
694 static int hf_pfcp_create_bridge_info_for_tsc_flags = -1;
695 static int hf_pfcp_create_bridge_info_for_tsc_flags_b0_bii = -1;
696 
697 static int hf_pfcp_ds_tt_port_number = -1;
698 
699 static int hf_pfcp_nw_tt_port_number = -1;
700 
701 static int hf_pfcp_5gs_user_plane_node_flags = -1;
702 static int hf_pfcp_5gs_user_plane_node_flags_b0_bid = -1;
703 static int hf_pfcp_5gs_user_plane_node_value = -1;
704 
705 static int hf_pfcp_port_management_information = -1;
706 
707 static int hf_pfcp_requested_clock_drift_control_information_flags = -1;
708 static int hf_pfcp_requested_clock_drift_control_information_flags_b1_rrcr = -1;
709 static int hf_pfcp_requested_clock_drift_control_information_flags_b0_rrto = -1;
710 
711 static int hf_pfcp_time_domain_number_value = -1;
712 
713 static int hf_pfcp_time_offset_threshold = -1;
714 
715 static int hf_pfcp_cumulative_rate_ratio_threshold = -1;
716 
717 static int hf_pfcp_time_offset_measurement = -1;
718 
719 static int hf_pfcp_cumulative_rate_ratio_measurement = -1;
720 
721 static int hf_pfcp_srr_id = -1;
722 
723 static int hf_pfcp_requested_access_availability_control_information_flags = -1;
724 static int hf_pfcp_requested_access_availability_control_information_flags_b0_rrca = -1;
725 
726 static int hf_pfcp_availability_status = -1;
727 static int hf_pfcp_availability_type = -1;
728 
729 static int hf_pfcp_mptcp_control_information_flags = -1;
730 static int hf_pfcp_mptcp_control_information_flags_b0_tci = -1;
731 
732 static int hf_pfcp_atsss_ll_control_information_flags = -1;
733 static int hf_pfcp_atsss_ll_control_information_flags_b0_lli = -1;
734 
735 static int hf_pfcp_pmf_control_information_flags = -1;
736 static int hf_pfcp_pmf_control_information_flags_b2_pqpm = -1;
737 static int hf_pfcp_pmf_control_information_flags_b1_drtti = -1;
738 static int hf_pfcp_pmf_control_information_flags_b0_pmfi = -1;
739 static int hf_pfcp_pmf_control_information_number_of_qfi = -1;
740 
741 static int hf_pfcp_mptcp_address_information_flags = -1;
742 static int hf_pfcp_mptcp_address_information_flags_b1_v6 = -1;
743 static int hf_pfcp_mptcp_address_information_flags_b0_v4 = -1;
744 static int hf_pfcp_mptcp_proxy_type = -1;
745 static int hf_pfcp_mptcp_proxy_port = -1;
746 static int hf_pfcp_mptcp_proxy_ip_address_ipv4 = -1;
747 static int hf_pfcp_mptcp_proxy_ip_address_ipv6 = -1;
748 
749 static int hf_pfcp_ue_link_specific_ip_address_flags = -1;
750 static int hf_pfcp_ue_link_specific_ip_address_flags_b3_nv6 = -1;
751 static int hf_pfcp_ue_link_specific_ip_address_flags_b2_nv4 = -1;
752 static int hf_pfcp_ue_link_specific_ip_address_flags_b1_v6 = -1;
753 static int hf_pfcp_ue_link_specific_ip_address_flags_b0_v4 = -1;
754 static int hf_pfcp_ue_link_specific_ip_address_3gpp_ipv4 = -1;
755 static int hf_pfcp_ue_link_specific_ip_address_3gpp_ipv6 = -1;
756 static int hf_pfcp_ue_link_specific_ip_address_non3gpp_ipv4 = -1;
757 static int hf_pfcp_ue_link_specific_ip_address_non3gpp_ipv6 = -1;
758 
759 static int hf_pfcp_pmf_address_information_flags = -1;
760 static int hf_pfcp_pmf_address_information_flags_b2_mac = -1;
761 static int hf_pfcp_pmf_address_information_flags_b1_v6 = -1;
762 static int hf_pfcp_pmf_address_information_flags_b0_v4 = -1;
763 static int hf_pfcp_pmf_address_ipv4 = -1;
764 static int hf_pfcp_pmf_address_ipv6 = -1;
765 static int hf_pfcp_pmf_port_3gpp = -1;
766 static int hf_pfcp_pmf_port_non3gpp = -1;
767 static int hf_pfcp_pmf_mac_address_3gpp = -1;
768 static int hf_pfcp_pmf_mac_address_non3gpp = -1;
769 
770 static int hf_pfcp_atsss_ll_information_flags = -1;
771 static int hf_pfcp_atsss_ll_information_flags_b0_lli = -1;
772 
773 static int hf_pfcp_data_network_access_identifier = -1;
774 
775 static int hf_pfcp_packet_delay_milliseconds = -1;
776 
777 static int hf_pfcp_qos_report_trigger_flags = -1;
778 static int hf_pfcp_qos_report_trigger_flags_b2_ire = -1;
779 static int hf_pfcp_qos_report_trigger_flags_b1_thr = -1;
780 static int hf_pfcp_qos_report_trigger_flags_b0_per = -1;
781 
782 static int hf_pfcp_gtp_u_path_interface_type_flags = -1;
783 static int hf_pfcp_gtp_u_path_interface_type_flags_b1_n3 = -1;
784 static int hf_pfcp_gtp_u_path_interface_type_flags_b0_n9 = -1;
785 
786 static int hf_pfcp_requested_qos_monitoring_flags = -1;
787 static int hf_pfcp_requested_qos_monitoring_flags_b3_gtpupm = -1;
788 static int hf_pfcp_requested_qos_monitoring_flags_b2_rp = -1;
789 static int hf_pfcp_requested_qos_monitoring_flags_b1_ul = -1;
790 static int hf_pfcp_requested_qos_monitoring_flags_b0_dl = -1;
791 
792 static int hf_pfcp_reporting_frequency_flags = -1;
793 static int hf_pfcp_reporting_frequency_flags_b2_sesrl = -1;
794 static int hf_pfcp_reporting_frequency_flags_b1_perio = -1;
795 static int hf_pfcp_reporting_frequency_flags_b0_evett = -1;
796 
797 static int hf_pfcp_packet_delay_thresholds_flags = -1;
798 static int hf_pfcp_packet_delay_thresholds_flags_b2_rp = -1;
799 static int hf_pfcp_packet_delay_thresholds_flags_b1_ul = -1;
800 static int hf_pfcp_packet_delay_thresholds_flags_b0_dl = -1;
801 static int hf_pfcp_packet_delay_thresholds_downlink = -1;
802 static int hf_pfcp_packet_delay_thresholds_uplink = -1;
803 static int hf_pfcp_packet_delay_thresholds_roundtrip = -1;
804 
805 static int hf_pfcp_minimum_wait_time_seconds = -1;
806 
807 
808 static int hf_pfcp_qos_monitoring_measurement_flags = -1;
809 static int hf_pfcp_qos_monitoring_measurement_flags_b3_plmf = -1;
810 static int hf_pfcp_qos_monitoring_measurement_flags_b2_rp = -1;
811 static int hf_pfcp_qos_monitoring_measurement_flags_b1_ul = -1;
812 static int hf_pfcp_qos_monitoring_measurement_flags_b0_dl = -1;
813 static int hf_pfcp_qos_monitoring_measurement_downlink = -1;
814 static int hf_pfcp_qos_monitoring_measurement_uplink = -1;
815 static int hf_pfcp_qos_monitoring_measurement_roundtrip = -1;
816 
817 static int hf_pfcp_mt_edt_control_information_flags = -1;
818 static int hf_pfcp_mt_edt_control_information_flags_b0_rdsi = -1;
819 
820 static int hf_pfcp_dl_data_packets_size = -1;
821 
822 static int hf_pfcp_qer_control_indications_o5_b0_rcsr = -1;
823 
824 static int hf_pfcp_nf_instance_id = -1;
825 
826 static int hf_pfcp_s_nssai_sst = -1;
827 static int hf_pfcp_s_nssai_sd = -1;
828 
829 static int hf_pfcp_ip_version_flags = -1;
830 static int hf_pfcp_ip_version_flags_b1_v6 = -1;
831 static int hf_pfcp_ip_version_flags_b0_v4 = -1;
832 
833 static int hf_pfcp_pfcpasreq_flags_flags = -1;
834 static int hf_pfcp_pfcpasreq_flags_flags_b0_uupsi = -1;
835 
836 static int hf_pfcp_data_status_flags = -1;
837 static int hf_pfcp_data_status_flags_b1_buff = -1;
838 static int hf_pfcp_data_status_flags_b0_drop = -1;
839 
840 static int hf_pfcp_rds_configuration_information_flags = -1;
841 static int hf_pfcp_rds_configuration_information_flags_b0_rds = -1;
842 
843 static int hf_pfcp_mptcp_application_indication_flags = -1;
844 static int hf_pfcp_mptcp_application_indication_flags_b0_mai = -1;
845 
846 static int hf_pfcp_user_plane_nodemanagement_information_container = -1;
847 
848 static int hf_pfcp_number_of_ue_ip_addresses_flags = -1;
849 static int hf_pfcp_number_of_ue_ip_addresses_b1_ipv6 = -1;
850 static int hf_pfcp_number_of_ue_ip_addresses_b0_ipv4 = -1;
851 static int hf_pfcp_number_of_ue_ip_addresses_ipv6 = -1;
852 static int hf_pfcp_number_of_ue_ip_addresses_ipv4 = -1;
853 
854 static int hf_pfcp_validity_timer = -1;
855 
856 static int hf_pfcp_rattype = -1;
857 
858 static int hf_pfcp_l2tp_user_authentication_proxy_authen_type_value = -1;
859 static int hf_pfcp_l2tp_user_authentication_flags = -1;
860 static int hf_pfcp_l2tp_user_authentication_b3_pai = -1;
861 static int hf_pfcp_l2tp_user_authentication_b2_par = -1;
862 static int hf_pfcp_l2tp_user_authentication_b1_pac = -1;
863 static int hf_pfcp_l2tp_user_authentication_b0_pan = -1;
864 static int hf_pfcp_l2tp_user_authentication_proxy_authen_name_len = -1;
865 static int hf_pfcp_l2tp_user_authentication_proxy_authen_name = -1;
866 static int hf_pfcp_l2tp_user_authentication_proxy_authen_challenge_len = -1;
867 static int hf_pfcp_l2tp_user_authentication_proxy_authen_challenge = -1;
868 static int hf_pfcp_l2tp_user_authentication_proxy_authen_response_len = -1;
869 static int hf_pfcp_l2tp_user_authentication_proxy_authen_response = -1;
870 static int hf_pfcp_l2tp_user_authentication_proxy_authen_id = -1;
871 
872 static int hf_pfcp_lns_address_ipv4 = -1;
873 static int hf_pfcp_lns_address_ipv6 = -1;
874 
875 static int hf_pfcp_tunnel_preference_value = -1;
876 
877 static int hf_pfcp_calling_number_value = -1;
878 static int hf_pfcp_called_number_value = -1;
879 
880 static int hf_pfcp_l2tp_session_indications_o5_b2_rensa = -1;
881 static int hf_pfcp_l2tp_session_indications_o5_b1_redsa = -1;
882 static int hf_pfcp_l2tp_session_indications_o5_b0_reuia = -1;
883 
884 static int hf_pfcp_maximum_receive_unit = -1;
885 
886 static int hf_pfcp_thresholds_flags = -1;
887 static int hf_pfcp_thresholds_flags_b1_plr = -1;
888 static int hf_pfcp_thresholds_flags_b0_rtt = -1;
889 static int hf_pfcp_thresholds_rtt = -1;
890 static int hf_pfcp_thresholds_plr = -1;
891 
892 static int hf_pfcp_l2tp_steering_mode_indications_o5_b1_ueai = -1;
893 static int hf_pfcp_l2tp_steering_mode_indications_o5_b0_albi = -1;
894 
895 static int hf_pfcp_group_id = -1;
896 
897 static int hf_pfcp_cp_ip_address_flags = -1;
898 static int hf_pfcp_cp_ip_address_ipv4 = -1;
899 static int hf_pfcp_cp_ip_address_ipv6 = -1;
900 
901 static int hf_pfcp_ip_address_and_port_number_replacement_flags = -1;
902 static int hf_pfcp_ip_address_and_port_number_replacement_flag_b0_v4 = -1;
903 static int hf_pfcp_ip_address_and_port_number_replacement_flag_b1_v6 = -1;
904 static int hf_pfcp_ip_address_and_port_number_replacement_flag_b2_dpn = -1;
905 static int hf_pfcp_ip_address_and_port_number_replacement_flag_b3_sipv4 = -1;
906 static int hf_pfcp_ip_address_and_port_number_replacement_flag_b4_sipv6 = -1;
907 static int hf_pfcp_ip_address_and_port_number_replacement_flag_b5_spn = -1;
908 static int hf_pfcp_ip_address_and_port_number_replacement_destination_ipv4 = -1;
909 static int hf_pfcp_ip_address_and_port_number_replacement_destination_ipv6 = -1;
910 static int hf_pfcp_ip_address_and_port_number_replacement_destination_port = -1;
911 static int hf_pfcp_ip_address_and_port_number_replacement_source_ipv4 = -1;
912 static int hf_pfcp_ip_address_and_port_number_replacement_source_ipv6 = -1;
913 static int hf_pfcp_ip_address_and_port_number_replacement_source_port = -1;
914 
915 static int hf_pfcp_dns_query_filter_pattern_len = -1;
916 static int hf_pfcp_dns_query_filter_pattern = -1;
917 
918 static int hf_pfcp_event_notification_uri = -1;
919 
920 static int hf_pfcp_notification_correlation_id = -1;
921 
922 static int hf_pfcp_reporting_flags_o5_b0_dupl = -1;
923 
924 static int hf_pfcp_mbs_session_identifier_flags = -1;
925 static int hf_pfcp_mbs_session_identifier_flag_b0_tmgi = -1;
926 static int hf_pfcp_mbs_session_identifier_flag_b1_ssmi = -1;
927 static int hf_pfcp_mbs_session_identifier_tmgi = -1;
928 static int hf_pfcp_mbs_session_identifier_ssmi = -1;
929 
930 static int hf_pfcp_multicast_transport_information_endpoint_identifier = -1;
931 static int hf_pfcp_multicast_transport_information_distribution_address_type = -1;
932 static int hf_pfcp_multicast_transport_information_distribution_address_length = -1;
933 static int hf_pfcp_multicast_transport_information_distribution_address_ipv4 = -1;
934 static int hf_pfcp_multicast_transport_information_distribution_address_ipv6 = -1;
935 static int hf_pfcp_multicast_transport_information_source_address_type = -1;
936 static int hf_pfcp_multicast_transport_information_source_address_length = -1;
937 static int hf_pfcp_multicast_transport_information_source_address_ipv4 = -1;
938 static int hf_pfcp_multicast_transport_information_source_address_ipv6 = -1;
939 
940 static int hf_pfcp_mbsn4mbreq_flags_o5_b1_jmbssm = -1;
941 static int hf_pfcp_mbsn4mbreq_flags_o5_b0_pllssm = -1;
942 
943 static int hf_pfcp_local_ingress_tunnel_flags = -1;
944 static int hf_pfcp_local_ingress_tunnel_flags_b2_ch = -1;
945 static int hf_pfcp_local_ingress_tunnel_flags_b1_v6 = -1;
946 static int hf_pfcp_local_ingress_tunnel_flags_b0_v4 = -1;
947 static int hf_pfcp_local_ingress_tunnel_udp_port = -1;
948 static int hf_pfcp_local_ingress_tunnel_ipv4 = -1;
949 static int hf_pfcp_local_ingress_tunnel_ipv6 = -1;
950 
951 static int hf_pfcp_mbs_unicast_parameters_id = -1;
952 
953 /* Enterprise IEs */
954 /* BBF */
955 static int hf_pfcp_bbf_up_function_features_o7_b4_lcp_keepalive_offload = -1;
956 static int hf_pfcp_bbf_up_function_features_o7_b3_lns = -1;
957 static int hf_pfcp_bbf_up_function_features_o7_b2_lac = -1;
958 static int hf_pfcp_bbf_up_function_features_o7_b1_ipoe = -1;
959 static int hf_pfcp_bbf_up_function_features_o7_b0_pppoe = -1;
960 
961 static int hf_pfcp_bbf_logical_port_id = -1;
962 static int hf_pfcp_bbf_logical_port_id_str = -1;
963 
964 static int hf_pfcp_bbf_outer_hdr_desc = -1;
965 static int hf_pfcp_bbf_outer_hdr_creation_tunnel_id = -1;
966 static int hf_pfcp_bbf_outer_hdr_creation_session_id = -1;
967 
968 static int hf_pfcp_bbf_out_hdr_desc = -1;
969 
970 static int hf_pfcp_bbf_pppoe_session_id = -1;
971 
972 static int hf_pfcp_bbf_ppp_protocol_flags = -1;
973 static int hf_pfcp_bbf_ppp_protocol_b2_control = -1;
974 static int hf_pfcp_bbf_ppp_protocol_b1_data = -1;
975 static int hf_pfcp_bbf_ppp_protocol_b0_specific = -1;
976 static int hf_pfcp_bbf_ppp_protocol = -1;
977 
978 static int hf_pfcp_bbf_verification_timer_interval = -1;
979 static int hf_pfcp_bbf_verification_timer_count = -1;
980 
981 static int hf_pfcp_bbf_ppp_lcp_magic_number_tx = -1;
982 static int hf_pfcp_bbf_ppp_lcp_magic_number_rx = -1;
983 
984 static int hf_pfcp_bbf_mtu = -1;
985 
986 static int hf_pfcp_bbf_l2tp_endp_flags = -1;
987 static int hf_pfcp_bbf_l2tp_endp_flags_b2_ch = -1;
988 static int hf_pfcp_bbf_l2tp_endp_flags_b1_v6 = -1;
989 static int hf_pfcp_bbf_l2tp_endp_flags_b0_v4 = -1;
990 static int hf_pfcp_bbf_l2tp_endp_id_tunnel_id = -1;
991 static int hf_pfcp_bbf_l2tp_endp_id_ipv4 = -1;
992 static int hf_pfcp_bbf_l2tp_endp_id_ipv6 = -1;
993 
994 static int hf_pfcp_bbf_l2tp_session_id = -1;
995 
996 static int hf_pfcp_bbf_l2tp_type_flags = -1;
997 static int hf_pfcp_bbf_l2tp_type_flags_b0_t = -1;
998 
999 /* Travelping */
1000 static int hf_pfcp_travelping_build_id = -1;
1001 static int hf_pfcp_travelping_build_id_str = -1;
1002 static int hf_pfcp_travelping_now = -1;
1003 static int hf_pfcp_travelping_error_message = -1;
1004 static int hf_pfcp_travelping_error_message_str = -1;
1005 static int hf_pfcp_travelping_file_name = -1;
1006 static int hf_pfcp_travelping_file_name_str = -1;
1007 static int hf_pfcp_travelping_line_number = -1;
1008 
1009 static int ett_pfcp = -1;
1010 static int ett_pfcp_flags = -1;
1011 static int ett_pfcp_ie = -1;
1012 static int ett_pfcp_grouped_ie = -1;
1013 static int ett_pfcp_f_seid_flags = -1;
1014 static int ett_f_teid_flags = -1;
1015 static int ett_pfcp_ue_ip_address_flags = -1;
1016 static int ett_pfcp_sdf_filter_flags = -1;
1017 static int ett_pfcp_measurement_method_flags = -1;
1018 static int ett_pfcp_reporting_triggers = -1;
1019 static int ett_pfcp_volume_threshold = -1;
1020 static int ett_pfcp_volume_quota = -1;
1021 static int ett_pfcp_subseq_volume_threshold = -1;
1022 static int ett_pfcp_dropped_dl_traffic_threshold = -1;
1023 static int ett_pfcp_gate_status = -1;
1024 static int ett_pfcp_report_type = -1;
1025 static int ett_pfcp_up_function_features = -1;
1026 static int ett_pfcp_report_trigger = -1;
1027 static int ett_pfcp_volume_measurement = -1;
1028 static int ett_pfcp_usage_information = -1;
1029 static int ett_pfcp_packet_rate = -1;
1030 static int ett_pfcp_pfcp_dl_flow_level_marking = -1;
1031 static int ett_pfcp_dl_data_service_inf = -1;
1032 static int ett_pfcp_pfcpsmreq = -1;
1033 static int ett_pfcp_pfcpsrrsp = -1;
1034 static int ett_pfcp_measurement_info = -1;
1035 static int ett_pfcp_node_report_type = -1;
1036 static int ett_pfcp_remote_gtp_u_peer = -1;
1037 static int ett_pfcp_oci_flags = -1;
1038 static int ett_pfcp_assoc_rel_req_flags = -1;
1039 static int ett_pfcp_upiri_flags = -1;
1040 static int ett_pfcp_flow_desc = -1;
1041 static int ett_pfcp_tos = -1;
1042 static int ett_pfcp_spi = -1;
1043 static int ett_pfcp_flow_label = -1;
1044 static int ett_pfcp_sdf_filter_id = -1;
1045 static int ett_pfcp_subsequent_volume_quota = -1;
1046 static int ett_pfcp_additional_usage_reports_information = -1;
1047 static int ett_pfcp_mac_address = -1;
1048 static int ett_pfcp_c_tag = -1;
1049 static int ett_pfcp_s_tag = -1;
1050 static int ett_pfcp_proxying = -1;
1051 static int ett_pfcp_ethernet_filter_properties = -1;
1052 static int ett_pfcp_user_id = -1;
1053 static int ett_pfcp_ethernet_pdu_session_information = -1;
1054 static int ett_pfcp_adf = -1;
1055 static int ett_pfcp_aurl = -1;
1056 static int ett_pfcp_adnp = -1;
1057 static int ett_pfcp_pfcpsrreq = -1;
1058 static int ett_pfcp_pfcpaureq = -1;
1059 static int ett_pfcp_alternative_smf_ip_address_flags = -1;
1060 static int ett_pfcp_packet_replication_and_detection_carry_on_information = -1;
1061 static int ett_pfcp_pfcpasrsp_flags = -1;
1062 static int ett_pfcp_cp_pfcp_entity_ip_address_flags = -1;
1063 static int ett_pfcp_pfcpsereq_flags = -1;
1064 static int ett_pfcp_ip_multicast_address_flags = -1;
1065 static int ett_pfcp_source_ip_address_flags = -1;
1066 static int ett_pfcp_packet_rate_status = -1;
1067 static int ett_pfcp_create_bridge_info_for_tsc = -1;
1068 static int ett_pfcp_5gs_user_plane_node = -1;
1069 static int ett_pfcp_requested_clock_drift_control_information = -1;
1070 static int ett_pfcp_requested_access_availability_control_information = -1;
1071 static int ett_pfcp_mptcp_control_information = -1;
1072 static int ett_pfcp_atsss_ll_control_information = -1;
1073 static int ett_pfcp_pmf_control_information = -1;
1074 static int ett_pfcp_mptcp_entity_ip_address_information = -1;
1075 static int ett_pfcp_ue_link_specific_entity_ip_address = -1;
1076 static int ett_pfcp_pmf_address_information = -1;
1077 static int ett_pfcp_atsss_ll_information = -1;
1078 static int ett_pfcp_qos_report_trigger = -1;
1079 static int ett_pfcp_gtp_u_path_interface_type = -1;
1080 static int ett_pfcp_requested_qos_monitoring = -1;
1081 static int ett_pfcp_reporting_frequency = -1;
1082 static int ett_pfcp_packet_delay_thresholds = -1;
1083 static int ett_pfcp_qos_monitoring_measurement = -1;
1084 static int ett_pfcp_monitoring_measurement = -1;
1085 static int ett_pfcp_ip_version = -1;
1086 static int ett_pfcp_pfcpasreq_flags = -1;
1087 static int ett_pfcp_data_status_flags = -1;
1088 static int ett_pfcp_rds_configuration_information_flags = -1;
1089 static int ett_pfcp_number_of_ue_ip_addresses_flags = -1;
1090 static int ett_pfcp_l2tp_user_authentication_flags = -1;
1091 static int ett_pfcp_thresholds = -1;
1092 static int ett_pfcp_cp_ip_address_flags = -1;
1093 static int ett_pfcp_ip_address_and_port_number_replacement_flags = -1;
1094 static int ett_pfcp_mbs_session_identifier_flags = -1;
1095 static int ett_local_ingress_tunnel_flags = -1;
1096 
1097 static int ett_pfcp_enterprise_travelping_error_report = -1;
1098 
1099 static int ett_pfcp_bbf_ppp_protocol_flags = -1;
1100 static int ett_pfcp_bbf_l2tp_endp_flags = -1;
1101 static int ett_pfcp_bbf_l2tp_type_flags = -1;
1102 static int ett_pfcp_bbf_ppp_lcp_connectivity = -1;
1103 static int ett_pfcp_bbf_l2tp_tunnel = -1;
1104 
1105 static expert_field ei_pfcp_ie_reserved = EI_INIT;
1106 static expert_field ei_pfcp_ie_data_not_decoded = EI_INIT;
1107 static expert_field ei_pfcp_ie_not_decoded_null = EI_INIT;
1108 static expert_field ei_pfcp_ie_not_decoded_too_large = EI_INIT;
1109 static expert_field ei_pfcp_enterprise_ie_3gpp = EI_INIT;
1110 static expert_field ei_pfcp_ie_encoding_error = EI_INIT;
1111 
1112 
1113 static gboolean g_pfcp_session = FALSE;
1114 static guint32 pfcp_session_count;
1115 
1116 typedef struct pfcp_rule_ids {
1117     guint32 far;
1118     guint32 pdr;
1119     guint32 qer;
1120     guint32 urr;
1121     guint32 bar;
1122     guint32 mar;
1123     guint32 srr;
1124 } pfcp_rule_ids_t;
1125 
1126 typedef struct pfcp_session_args {
1127     wmem_list_t *seid_list;
1128     wmem_list_t *ip_list;
1129     guint64 last_seid;
1130     address last_ip;
1131     guint8 last_cause;
1132     pfcp_rule_ids_t last_rule_ids;
1133 } pfcp_session_args_t;
1134 
1135 typedef struct _pfcp_hdr {
1136     guint8 message; /* Message type */
1137     guint16 length; /* Length of header */
1138     gint64 seid;    /* Tunnel End-point ID */
1139 } pfcp_hdr_t;
1140 
1141 /* Relation between frame -> session */
1142 GHashTable* pfcp_session_table;
1143 /* Relation between <seid,ip> -> frame */
1144 wmem_tree_t* pfcp_frame_tree;
1145 
1146 typedef struct pfcp_info {
1147     guint64 seid;
1148     guint32 frame;
1149 } pfcp_info_t;
1150 
1151 typedef struct _pfcp_sub_dis_t {
1152     guint8 message_type;
1153     pfcp_session_args_t *args;
1154 } pfcp_sub_dis_t;
1155 
1156 static dissector_table_t pfcp_enterprise_ies_dissector_table;
1157 
1158 static void dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint offset, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1159 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_);
1160 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_);
1161 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_);
1162 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_);
1163 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_);
1164 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_);
1165 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_);
1166 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_);
1167 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_);
1168 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_);
1169 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_);
1170 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_);
1171 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_);
1172 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_);
1173 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_);
1174 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_);
1175 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_);
1176 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_);
1177 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_);
1178 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_);
1179 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_);
1180 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_);
1181 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_);
1182 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_);
1183 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_);
1184 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_);
1185 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_);
1186 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_);
1187 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_);
1188 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_);
1189 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_);
1190 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_);
1191 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_);
1192 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_);
1193 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_);
1194 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_);
1195 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_);
1196 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_);
1197 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_);
1198 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_);
1199 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_);
1200 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_);
1201 static void dissect_pfcp_create_mar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1202 static void dissect_pfcp_update_mar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1203 static void dissect_pfcp_remove_mar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1204 static void dissect_pfcp_access_forwarding_action_information_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1205 static void dissect_pfcp_access_forwarding_action_information_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1206 static void dissect_pfcp_update_access_forwarding_action_information_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1207 static void dissect_pfcp_update_access_forwarding_action_information_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1208 static void dissect_pfcp_user_plane_path_recovery_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1209 static void dissect_pfcp_pfcp_session_retention_information_within_pfcp_association_setup_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1210 static void dissect_ip_multicast_addressing_info_within_pfcp_session_establishment_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1211 static void dissect_pfcp_join_ip_multicast_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1212 static void dissect_pfcp_leave_ip_multicast_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1213 static void dissect_pfcp_created_bridge_info_for_tsc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1214 static void dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1215 static void dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1216 static void dissect_pfcp_tsc_management_information_ie_within_pfcp_session_report_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1217 static void dissect_pfcp_clock_drift_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1218 static void dissect_pfcp_clock_drift_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1219 static void dissect_pfcp_remove_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1220 static void dissect_pfcp_create_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1221 static void dissect_pfcp_update_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1222 static void dissect_pfcp_session_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1223 static void dissect_pfcp_access_availability_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1224 static void dissect_pfcp_access_availability_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1225 static void dissect_pfcp_provide_atsss_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1226 static void dissect_pfcp_atsss_control_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1227 static void dissect_pfcp_mptcp_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1228 static void dissect_pfcp_atsss_ll_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1229 static void dissect_pfcp_pmf_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1230 static void dissect_pfcp_ue_ip_address_pool_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1231 static void dissect_pfcp_gtp_u_path_qos_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1232 static void dissect_pfcp_gtp_u_path_qos_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1233 static void dissect_pfcp_qos_information_in_gtp_u_path_qos_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1234 static void dissect_pfcp_qos_monitoring_per_qos_flow_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1235 static void dissect_pfcp_qos_monitoring_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1236 static void dissect_pfcp_packet_rate_status_report_ie_within_pfcp_session_deletion_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1237 static void dissect_pfcp_ethernet_context_information_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1238 static void dissect_pfcp_redundant_transmission_detection_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1239 static void dissect_pfcp_updated_pdr_ie_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1240 static void dissect_pfcp_provide_rds_configuration_information_ie_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1241 static void dissect_pfcp_query_packet_rate_status_ie_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1242 static void dissect_pfcp_query_packet_rate_status_report_ie_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1243 static void dissect_pfcp_ue_ip_address_usage_information_ie_within_pfcp_association_update_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1244 static void dissect_pfcp_redundant_transmission_forward_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1245 static void dissect_pfcp_transport_dealy_reporting_ie_in_create_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1246 static void dissect_pfcp_partial_failure_information_within_pfcp_session_establishment_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1247 static void dissect_pfcp_partial_failure_information_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1248 static void dissect_pfcp_l2tp_tunnel_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1249 static void dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1250 static void dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1251 static void dissect_pfcp_pfcp_session_change_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1252 static void dissect_pfcp_direct_reporting_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1253 static void dissect_pfcp_mbs_session_n4mb_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1254 static void dissect_pfcp_mbs_multicast_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1255 static void dissect_pfcp_add_mbs_unicast_parameters_ie_in_create_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1256 static void dissect_pfcp_mbs_session_n4mb_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1257 static void dissect_pfcp_remove_mbs_unicast_parameters_ie_in_update_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args _U_);
1258 
1259 static const true_false_string pfcp_id_predef_dynamic_tfs = {
1260     "Predefined by UP",
1261     "Dynamic by CP",
1262 };
1263 
1264 #define PFCP_MSG_RESERVED_0                                 0
1265 
1266 #define PFCP_MSG_HEARTBEAT_REQUEST                          1
1267 #define PFCP_MSG_HEARTBEAT_RESPONSE                         2
1268 #define PFCP_MSG_PFD_MANAGEMENT_REQUEST                     3
1269 #define PFCP_MSG_PFD_MANAGEMENT_RESPONSE                    4
1270 #define PFCP_MSG_ASSOCIATION_SETUP_REQUEST                  5
1271 #define PFCP_MSG_ASSOCIATION_SETUP_RESPONSE                 6
1272 #define PFCP_MSG_ASSOCIATION_UPDATE_REQUEST                 7
1273 #define PFCP_MSG_ASSOCIATION_UPDATE_RESPONSE                8
1274 #define PFCP_MSG_ASSOCIATION_RELEASE_REQUEST                9
1275 #define PFCP_MSG_ASSOCIATION_RELEASE_RESPONSE               10
1276 #define PFCP_MSG_VERSION_NOT_SUPPORTED_RESPONSE             11
1277 #define PFCP_MSG_NODE_REPORT_REQEUST                        12
1278 #define PFCP_MSG_NODE_REPORT_RERESPONSE                     13
1279 #define PFCP_MSG_SESSION_SET_DELETION_REQUEST               14
1280 #define PFCP_MSG_SESSION_SET_DELETION_RESPONSE              15
1281 #define PFCP_MSG_SESSION_SET_MODIFICATION_REQUEST           16
1282 #define PFCP_MSG_SESSION_SET_MODIFICATION_RESPONSE          17
1283 #define PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST              50
1284 #define PFCP_MSG_SESSION_ESTABLISHMENT_RESPONSE             51
1285 #define PFCP_MSG_SESSION_MODIFICATION_REQUEST               52
1286 #define PFCP_MSG_SESSION_MODIFICATION_RESPONSE              53
1287 #define PFCP_MSG_SESSION_DELETION_REQUEST                   54
1288 #define PFCP_MSG_SESSION_DELETION_RESPONSE                  55
1289 #define PFCP_MSG_SESSION_REPORT_REQUEST                     56
1290 #define PFCP_MSG_SESSION_REPORT_RESPONSE                    57
1291 
1292 static const value_string pfcp_message_type[] = {
1293     {PFCP_MSG_RESERVED_0,             "Reserved"},
1294     /* PFCP Node related messages */
1295 
1296     { PFCP_MSG_HEARTBEAT_REQUEST, "PFCP Heartbeat Request"},
1297     { PFCP_MSG_HEARTBEAT_RESPONSE, "PFCP Heartbeat Response"},
1298     { PFCP_MSG_PFD_MANAGEMENT_REQUEST, "PFCP PFD Management Request"},
1299     { PFCP_MSG_PFD_MANAGEMENT_RESPONSE, "PFCP PFD Management Response"},
1300     { PFCP_MSG_ASSOCIATION_SETUP_REQUEST, "PFCP Association Setup Request"},
1301     { PFCP_MSG_ASSOCIATION_SETUP_RESPONSE, "PFCP Association Setup Response"},
1302     { PFCP_MSG_ASSOCIATION_UPDATE_REQUEST, "PFCP Association Update Request"},
1303     { PFCP_MSG_ASSOCIATION_UPDATE_RESPONSE, "PFCP Association Update Response"},
1304     { PFCP_MSG_ASSOCIATION_RELEASE_REQUEST, "PFCP Association Release Request"},
1305     { PFCP_MSG_ASSOCIATION_RELEASE_RESPONSE, "PFCP Association Release Response"},
1306     { PFCP_MSG_VERSION_NOT_SUPPORTED_RESPONSE, "PFCP Version Not Supported Response"},
1307     { PFCP_MSG_NODE_REPORT_REQEUST, "PFCP Node Report Request"},
1308     { PFCP_MSG_NODE_REPORT_RERESPONSE, "PFCP Node Report Response"},
1309     { PFCP_MSG_SESSION_SET_DELETION_REQUEST, "PFCP Session Set Deletion Request"},
1310     { PFCP_MSG_SESSION_SET_DELETION_RESPONSE, "PFCP Session Set Deletion Response"},
1311     { PFCP_MSG_SESSION_SET_MODIFICATION_REQUEST, "PFCP Session Set Modification Request"},
1312     { PFCP_MSG_SESSION_SET_MODIFICATION_RESPONSE, "PFCP Session Set Modification Response"},
1313     //18 to 49    For future use
1314     //PFCP Session related messages
1315     { PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST, "PFCP Session Establishment Request"},
1316     { PFCP_MSG_SESSION_ESTABLISHMENT_RESPONSE, "PFCP Session Establishment Response"},
1317     { PFCP_MSG_SESSION_MODIFICATION_REQUEST, "PFCP Session Modification Request"},
1318     { PFCP_MSG_SESSION_MODIFICATION_RESPONSE, "PFCP Session Modification Response"},
1319     { PFCP_MSG_SESSION_DELETION_REQUEST, "PFCP Session Deletion Request"},
1320     { PFCP_MSG_SESSION_DELETION_RESPONSE, "PFCP Session Deletion Response"},
1321     { PFCP_MSG_SESSION_REPORT_REQUEST, "PFCP Session Report Request"},
1322     { PFCP_MSG_SESSION_REPORT_RESPONSE, "PFCP Session Report Response"},
1323     //58 to 99    For future use
1324     //Other messages
1325     //100 to 255     For future use
1326     {0, NULL}
1327 };
1328 static value_string_ext pfcp_message_type_ext = VALUE_STRING_EXT_INIT(pfcp_message_type);
1329 
1330 /* 8.1.2    Information Element Types */
1331 #define PFCP_IE_ID_CREATE_PDR                   1
1332 #define PFCP_IE_ID_PDI                          2
1333 #define PFCP_IE_CREATE_FAR                      3
1334 #define PFCP_IE_FORWARDING_PARAMETERS           4
1335 #define PFCP_IE_DUPLICATING_PARAMETERS          5
1336 #define PFCP_IE_CREATE_URR                      6
1337 #define PFCP_IE_CREATE_QER                      7
1338 #define PFCP_IE_CREATED_PDR                     8
1339 #define PFCP_IE_UPDATE_PDR                      9
1340 #define PFCP_IE_UPDATE_FAR                     10
1341 #define PFCP_IE_UPD_FORWARDING_PARAM   11
1342 #define PFCP_IE_UPDATE_BAR                     12
1343 #define PFCP_IE_UPDATE_URR                     13
1344 #define PFCP_IE_UPDATE_QER                     14
1345 #define PFCP_IE_REMOVE_PDR                     15
1346 #define PFCP_IE_REMOVE_FAR                     16
1347 #define PFCP_IE_REMOVE_URR                     17
1348 #define PFCP_IE_REMOVE_QER                     18
1349 
1350 #define PFCP_IE_LOAD_CONTROL_INFORMATION          51
1351 #define PFCP_IE_OVERLOAD_CONTROL_INFORMATION      54
1352 #define PFCP_IE_APPLICATION_IDS_PFDS              58
1353 #define PFCP_IE_PFD_CONTEXT                       59
1354 #define PFCP_IE_APPLICATION_DETECTION_INF         68
1355 #define PFCP_IE_QUERY_URR                         77
1356 #define PFCP_IE_USAGE_REPORT_SMR                  78
1357 #define PFCP_IE_USAGE_REPORT_SDR                  79
1358 #define PFCP_IE_USAGE_REPORT_SRR                  80
1359 #define PFCP_IE_DOWNLINK_DATA_REPORT              83
1360 #define PFCP_IE_CREATE_BAR                        85
1361 #define PFCP_IE_UPDATE_BAR_SMR                    86
1362 #define PFCP_IE_REMOVE_BAR                        87
1363 #define PFCP_IE_ERROR_INDICATION_REPORT           99
1364 #define PFCP_IE_USER_PLANE_PATH_FAILURE_REPORT   102
1365 #define PFCP_IE_UPDATE_DUPLICATING_PARAMETERS    105
1366 #define PFCP_IE_AGGREGATED_URRS                  118
1367 #define PFCP_IE_CREATE_TRAFFIC_ENDPOINT          127
1368 #define PFCP_IE_CREATED_TRAFFIC_ENDPOINT         128
1369 #define PFCP_IE_UPDATE_TRAFFIC_ENDPOINT          129
1370 #define PFCP_IE_REMOVE_TRAFFIC_ENDPOINT          130
1371 #define PFCP_IE_ETHERNET_PACKET_FILTER           132
1372 #define PFCP_IE_ETHERNET_TRAFFIC_INFORMATION     143
1373 #define PFCP_IE_ADDITIONAL_MONITORING_TIME       147
1374 #define PFCP_IE_EVENT_INFORMATION                148
1375 #define PFCP_IE_EVENT_REPORTING                  149
1376 #define PFCP_IE_CREATE_MAR                       165
1377 #define PFCP_IE_ACCESS_FORWARDING_ACTION_INORMATION_1 166
1378 #define PFCP_IE_ACCESS_FORWARDING_ACTION_INORMATION_2 167
1379 #define PFCP_IE_REMOVE_MAR                       168
1380 #define PFCP_IE_UPDATE_MAR                       169
1381 #define PFCP_IE_UPDATE_ACCESS_FORWARDING_ACTION_INORMATION_1 175
1382 #define PFCP_IE_UPDATE_ACCESS_FORWARDING_ACTION_INORMATION_2 176
1383 #define PFCP_IE_PFCP_SESSION_RETENTION_INFORMATION_WITHIN_ASSOCIATION_SETUP_REQUEST 183
1384 #define PFCP_IE_USER_PLANE_PATH_RECOVERY_REPORT  187
1385 #define PFCP_IE_IP_MULTICAST_ADDRESSING_INFO     189
1386 #define PFCP_IE_JOIN_IP_MULTICAST_INFORMATION    189
1387 #define PFCP_IE_LEAVE_IP_MULTICAST_INFORMATION   190
1388 #define PFCP_IE_CREATED_BRIDGE_INFO_FOR_TSC      195
1389 #define PFCP_IE_TSC_MANAGEMENT_INFORMATION_WITHIN_PCFP_SESSION_MODIFICATION_REQUEST    199
1390 #define PFCP_IE_TSC_MANAGEMENT_INFORMATION_WITHIN_PCFP_SESSION_MODIFICATION_RESPONSE   200
1391 #define PFCP_IE_TSC_MANAGEMENT_INFORMATION_WITHIN_PCFP_SESSION_REPORT_REQUEST          201
1392 #define PFCP_IE_CLOCK_DRIFT_CONTROL_INFORMATION  203
1393 #define PFCP_IE_CLOCK_DRIFT_REPORT               205
1394 #define PFCP_IE_REMOVE_SRR                       211
1395 #define PFCP_IE_CREATE_SRR                       212
1396 #define PFCP_IE_UPDATE_SRR                       213
1397 #define PFCP_IE_SESSION_REPORT                   214
1398 #define PFCP_IE_ACCESS_AVAILABILITY_CONTROL_INFORMATION 216
1399 #define PFCP_IE_ACCESS_AVAILABILITY_REPORT       218
1400 #define PFCP_IE_PROVICE_ATSSS_CONTROL_INFORMATION 220
1401 #define PFCP_IE_ATSSS_CONTROl_PARAMETERS         221
1402 #define PFCP_IE_MPTCP_PARAMETERS                 225
1403 #define PFCP_IE_ATSSS_LL_PARAMETERS              226
1404 #define PFCP_IE_PMF_PARAMETERS                   227
1405 #define PFCP_IE_UE_IP_ADDRESS_POOL_INFORMATION   233
1406 #define PFCP_IE_GTP_U_PATH_QOS_CONTROL_INFORMATION 238
1407 #define PFCP_IE_GTP_U_PATH_QOS_REPORT            239
1408 #define PFCP_IE_QOS_INFORMATION_IN_GTP_U_PATH_QOS_REPORT 240
1409 #define PFCP_IE_QOS_MONITORING_PER_QOS_FLOW_CONTROL_INFORMATION 242
1410 #define PFCP_IE_QOS_MONITORING_REPORT            247
1411 #define PFCP_IE_PACKET_RATE_STATUS_REPORT_IE_WITHIN_PFCP_SESSION_DELETION_RESPONSE 252
1412 #define PCFP_IE_ETHERNET_CONTEXT_INFORMATION_WITHIN_PFCP_SESSION_MODIFICATION_REQUEST 254
1413 #define PFCP_IE_REDUNDANT_TRANSMISSION_DETECTION_PARAMETERS_IE_IN_PDI 255
1414 #define PFCP_IE_UPDATED_PDR_IE_WITHIN_PFCP_SESSION_MODIFICATION_RESPONSE 256
1415 #define PFCP_IE_PROVIDE_RDS_CONFIGURATION_INFORMATION_IE_WITHIN_PCFP_SESSION_ESTABLISHMENT_REQUEST 261
1416 #define PFCP_IE_QUERY_PACKET_RATE_STATUS_IE_WITHIN_PCFP_SESSION_ESTABLISHMENT_REQUEST 263
1417 #define PFCP_IE_QUERY_PACKET_RATE_STATUS_REPORT_IE_WITHIN_PCFP_SESSION_ESTABLISHMENT_RESPONSE 264
1418 #define PFCP_IE_UE_IP_ADDRESS_USAGE_INFORMATION_IE_WITHIN_PFCP_ASSOCIATION_UPDATE_REQUEST 267
1419 #define PFCP_IE_REDUNDANT_TRANSMISSION_FORWARD_PARAMETERS_IE_IN_FAR 270
1420 #define PFCP_IE_TRANSPORT_DELAY_REPORTING 271
1421 #define PFCP_IE_PARTIAL_FAILURE_INFORMATION_WITHIN_PFCP_SESSION_ESTABLISHMENT_RESPONSE 272
1422 #define PFCP_IE_PARTIAL_FAILURE_INFORMATION_WITHIN_PFCP_SESSION_MODIFICATION_RESPONSE 273
1423 #define PFCP_IE_L2TP_TUNNEL_INFORMATION 276
1424 #define PFCP_IE_L2TP_SESSION_INFORMATION_WITHIN_PFCP_SESSION_ESTABLISHMENT_REQUEST 277
1425 #define PFCP_IE_L2TP_SESSION_INFORMATION_WITHIN_PFCP_SESSION_ESTABLISHMENT_RESPONSE 279
1426 #define PFCP_IE_PFCP_SESSION_CHANGE_INFO 290
1427 #define PFCP_IE_DIRECT_REPORTING_INFORMATION 295
1428 #define PFCP_IE_MBS_SESSION_N4MB_CONTROL_INFORMATION 300
1429 #define PFCP_IE_MBS_MULTICAST_PARAMETERS 301
1430 #define PFCP_IE_ADD_MBS_UNICAST_PARAMETERS_IE_IN_CREATE_FAR 302
1431 #define PFCP_IE_MBS_SESSION_N4MB_INFORMATION 300
1432 #define PFCP_IE_REMOVE_MBS_UNICAST_PARAMETERS_IE_IN_UPDATE_FAR 304
1433 
1434 
1435 static const value_string pfcp_ie_type[] = {
1436 
1437     { 0, "Reserved"},
1438     { 1, "Create PDR"},                                             /* Extendable / Table 7.5.2.2-1 */
1439     { 2, "PDI"},                                                    /* Extendable / Table 7.5.2.2-2 */
1440     { 3, "Create FAR"},                                             /* Extendable / Table 7.5.2.3-1 */
1441     { 4, "Forwarding Parameters"},                                  /* Extendable / Table 7.5.2.3-2 */
1442     { 5, "Duplicating Parameters"},                                 /* Extendable / Table 7.5.2.3-3 */
1443     { 6, "Create URR"},                                             /* Extendable / Table 7.5.2.4-1 */
1444     { 7, "Create QER"},                                             /* Extendable / Table 7.5.2.5-1 */
1445     { 8, "Created PDR"},                                            /* Extendable / Table 7.5.3.2-1 */
1446     { 9, "Update PDR" },                                            /* Extendable / Table 7.5.4.2-1 */
1447     { 10, "Update FAR" },                                           /* Extendable / Table 7.5.4.3-1 */
1448     { 11, "Update Forwarding Parameters" },                         /* Extendable / Table 7.5.4.3-2 */
1449     { 12, "Update BAR (PFCP Session Report Response)" },            /* Extendable / Table 7.5.9.2-1 */
1450     { 13, "Update URR" },                                           /* Extendable / Table 7.5.4.4 */
1451     { 14, "Update QER" },                                           /* Extendable / Table 7.5.4.5 */
1452     { 15, "Remove PDR" },                                           /* Extendable / Table 7.5.4.6 */
1453     { 16, "Remove FAR" },                                           /* Extendable / Table 7.5.4.7 */
1454     { 17, "Remove URR" },                                           /* Extendable / Table 7.5.4.8 */
1455     { 18, "Remove QER" },                                           /* Extendable / Table 7.5.4.9 */
1456     { 19, "Cause" },                                                /* Fixed / Subclause 8.2.1 */
1457     { 20, "Source Interface" },                                     /* Extendable / Subclause 8.2.2 */
1458     { 21, "F-TEID" },                                               /* Extendable / Subclause 8.2.3 */
1459     { 22, "Network Instance" },                                     /* Variable Length / Subclause 8.2.4 */
1460     { 23, "SDF Filter" },                                           /* Extendable / Subclause 8.2.5 */
1461     { 24, "Application ID" },                                       /* Variable Length / Subclause 8.2.6 */
1462     { 25, "Gate Status" },                                          /* Extendable / Subclause 8.2.7 */
1463     { 26, "MBR" },                                                  /* Extendable / Subclause 8.2.8 */
1464     { 27, "GBR" },                                                  /* Extendable / Subclause 8.2.9 */
1465     { 28, "QER Correlation ID" },                                   /* Extendable / Subclause 8.2.10 */
1466     { 29, "Precedence" },                                           /* Extendable / Subclause 8.2.11 */
1467     { 30, "Transport Level Marking" },                              /* Extendable / Subclause 8.2.12 */
1468     { 31, "Volume Threshold" },                                     /* Extendable /Subclause 8.2.13 */
1469     { 32, "Time Threshold" },                                       /* Extendable /Subclause 8.2.14 */
1470     { 33, "Monitoring Time" },                                      /* Extendable /Subclause 8.2.15 */
1471     { 34, "Subsequent Volume Threshold" },                          /* Extendable /Subclause 8.2.16 */
1472     { 35, "Subsequent Time Threshold" },                            /* Extendable /Subclause 8.2.17 */
1473     { 36, "Inactivity Detection Time" },                            /* Extendable /Subclause 8.2.18 */
1474     { 37, "Reporting Triggers" },                                   /* Extendable /Subclause 8.2.19 */
1475     { 38, "Redirect Information" },                                 /* Extendable /Subclause 8.2.20 */
1476     { 39, "Report Type" },                                          /* Extendable / Subclause 8.2.21 */
1477     { 40, "Offending IE" },                                         /* Fixed / Subclause 8.2.22 */
1478     { 41, "Forwarding Policy" },                                    /* Extendable / Subclause 8.2.23 */
1479     { 42, "Destination Interface" },                                /* Extendable / Subclause 8.2.24 */
1480     { 43, "UP Function Features" },                                 /* Extendable / Subclause 8.2.25 */
1481     { 44, "Apply Action" },                                         /* Extendable / Subclause 8.2.26 */
1482     { 45, "Downlink Data Service Information" },                    /* Extendable / Subclause 8.2.27 */
1483     { 46, "Downlink Data Notification Delay" },                     /* Extendable / Subclause 8.2.28 */
1484     { 47, "DL Buffering Duration" },                                /* Extendable / Subclause 8.2.29 */
1485     { 48, "DL Buffering Suggested Packet Count" },                  /* Variable / Subclause 8.2.30 */
1486     { 49, "PFCPSMReq-Flags" },                                      /* Extendable / Subclause 8.2.31 */
1487     { 50, "PFCPSRRsp-Flags" },                                      /* Extendable / Subclause 8.2.32 */
1488     { 51, "Load Control Information" },                             /* Extendable / Table 7.5.3.3-1 */
1489     { 52, "Sequence Number" },                                      /* Fixed Length / Subclause 8.2.33 */
1490     { 53, "Metric" },                                               /* Fixed Length / Subclause 8.2.34 */
1491     { 54, "Overload Control Information" },                         /* Extendable / Table 7.5.3.4-1 */
1492     { 55, "Timer" },                                                /* Extendable / Subclause 8.2 35 */
1493     { 56, "PDR ID" },                                               /* Extendable / Subclause 8.2 36 */
1494     { 57, "F-SEID" },                                               /* Extendable / Subclause 8.2 37 */
1495     { 58, "Application ID's PFDs" },                                /* Extendable / Table 7.4.3.1-2 */
1496     { 59, "PFD context" },                                          /* Extendable / Table 7.4.3.1-3 */
1497     { 60, "Node ID" },                                              /* Extendable / Subclause 8.2.38 */
1498     { 61, "PFD contents" },                                         /* Extendable / Subclause 8.2.39 */
1499     { 62, "Measurement Method" },                                   /* Extendable / Subclause 8.2.40 */
1500     { 63, "Usage Report Trigger" },                                 /* Extendable / Subclause 8.2.41 */
1501     { 64, "Measurement Period" },                                   /* Extendable / Subclause 8.2.42 */
1502     { 65, "FQ-CSID" },                                              /* Extendable / Subclause 8.2.43 */
1503     { 66, "Volume Measurement" },                                   /* Extendable / Subclause 8.2.44 */
1504     { 67, "Duration Measurement" },                                 /* Extendable / Subclause 8.2.45 */
1505     { 68, "Application Detection Information" },                    /* Extendable / Table 7.5.8.3-2 */
1506     { 69, "Time of First Packet" },                                 /* Extendable / Subclause 8.2.46 */
1507     { 70, "Time of Last Packet" },                                  /* Extendable / Subclause 8.2.47 */
1508     { 71, "Quota Holding Time" },                                   /* Extendable / Subclause 8.2.48 */
1509     { 72, "Dropped DL Traffic Threshold" },                         /* Extendable / Subclause 8.2.49 */
1510     { 73, "Volume Quota" },                                         /* Extendable / Subclause 8.2.50 */
1511     { 74, "Time Quota" },                                           /* Extendable / Subclause 8.2.51 */
1512     { 75, "Start Time" },                                           /* Extendable / Subclause 8.2.52 */
1513     { 76, "End Time" },                                             /* Extendable / Subclause 8.2.53 */
1514     { 77, "Query URR" },                                            /* Extendable / Table 7.5.4.10-1 */
1515     { 78, "Usage Report (Session Modification Response)" },         /* Extendable / Table 7.5.5.2-1 */
1516     { 79, "Usage Report (Session Deletion Response)" },             /* Extendable / Table 7.5.7.2-1 */
1517     { 80, "Usage Report (Session Report Request)" },                /* Extendable / Table 7.5.8.3-1 */
1518     { 81, "URR ID" },                                               /* Extendable / Subclause 8.2.54 */
1519     { 82, "Linked URR ID" },                                        /* Extendable / Subclause 8.2.55 */
1520     { 83, "Downlink Data Report" },                                 /* Extendable / Table 7.5.8.2-1 */
1521     { 84, "Outer Header Creation" },                                /* Extendable / Subclause 8.2.56 */
1522     { 85, "Create BAR" },                                           /* Extendable / Table 7.5.2.6-1 */
1523     { 86, "Update BAR (Session Modification Request)" },            /* Extendable / Table 7.5.4.11-1 */
1524     { 87, "Remove BAR" },                                           /* Extendable / Table 7.5.4.12-1 */
1525     { 88, "BAR ID" },                                               /* Extendable / Subclause 8.2.57 */
1526     { 89, "CP Function Features" },                                 /* Extendable / Subclause 8.2.58 */
1527     { 90, "Usage Information" },                                    /* Extendable / Subclause 8.2.59 */
1528     { 91, "Application Instance ID" },                              /* Variable Length / Subclause 8.2.60 */
1529     { 92, "Flow Information" },                                     /* Extendable / Subclause 8.2.61 */
1530     { 93, "UE IP Address" },                                        /* Extendable / Subclause 8.2.62 */
1531     { 94, "Packet Rate" },                                          /* Extendable / Subclause 8.2.63 */
1532     { 95, "Outer Header Removal" },                                 /* Extendable / Subclause 8.2.64 */
1533     { 96, "Recovery Time Stamp" },                                  /* Extendable / Subclause 8.2.65 */
1534     { 97, "DL Flow Level Marking" },                                /* Extendable / Subclause 8.2.66 */
1535     { 98, "Header Enrichment" },                                    /* Extendable / Subclause 8.2.67 */
1536     { 99, "Error Indication Report" },                              /* Extendable / Table 7.5.8.4-1 */
1537     { 100, "Measurement Information" },                             /* Extendable / Subclause 8.2.68 */
1538     { 101, "Node Report Type" },                                    /* Extendable / Subclause 8.2.69 */
1539     { 102, "User Plane Path Failure Report" },                      /* Extendable / Table 7.4.5.1.2-1 */
1540     { 103, "Remote GTP-U Peer" },                                   /* Extendable / Subclause 8.2.70 */
1541     { 104, "UR-SEQN" },                                             /* Fixed Length / Subclause 8.2.71 */
1542     { 105, "Update Duplicating Parameters" },                       /* Extendable / Table 7.5.4.3-3 */
1543     { 106, "Activate Predefined Rules" },                           /* Variable Length / Subclause 8.2.72 */
1544     { 107, "Deactivate Predefined Rules" },                         /* Variable Length / Subclause 8.2.73 */
1545     { 108, "FAR ID" },                                              /* Extendable / Subclause 8.2.74 */
1546     { 109, "QER ID" },                                              /* Extendable / Subclause 8.2.75 */
1547     { 110, "OCI Flags" },                                           /* Extendable / Subclause 8.2.76 */
1548     { 111, "PFCP Association Release Request" },                    /* Extendable / Subclause 8.2.77 */
1549     { 112, "Graceful Release Period" },                             /* Extendable / Subclause 8.2.78 */
1550     { 113, "PDN Type" },                                            /* Fixed Length / Subclause 8.2.79 */
1551     { 114, "Failed Rule ID" },                                      /* Extendable / Subclause 8.2.80 */
1552     { 115, "Time Quota Mechanism" },                                /* Extendable / Subclause 8.2.81 */
1553     { 116, "User Plane IP Resource Information (removed in Rel 16.3)" }, /* Extendable / Subclause 8.2.82 */
1554     { 117, "User Plane Inactivity Timer" },                         /* Extendable / Subclause 8.2.83 */
1555     { 118, "Aggregated URRs" },                                     /* Extendable / Table 7.5.2.4-2 */
1556     { 119, "Multiplier" },                                          /* Fixed Length / Subclause 8.2.84 */
1557     { 120, "Aggregated URR ID IE" },                                /* Fixed Length / Subclause 8.2.85 */
1558     { 121, "Subsequent Volume Quota" },                             /* Extendable / Subclause 8.2.86 */
1559     { 122, "Subsequent Time Quota" },                               /* Extendable / Subclause 8.2.87 */
1560     { 123, "RQI" },                                                 /* Extendable / Subclause 8.2.88 */
1561     { 124, "QFI" },                                                 /* Extendable / Subclause 8.2.89 */
1562     { 125, "Query URR Reference" },                                 /* Extendable / Subclause 8.2.90 */
1563     { 126, "Additional Usage Reports Information" },                /* Extendable / Subclause 8.2.91 */
1564     { 127, "Create Traffic Endpoint" },                             /* Extendable / Table 7.5.2.7 */
1565     { 128, "Created Traffic Endpoint" },                            /* Extendable / Table 7.5.3.5 */
1566     { 129, "Update Traffic Endpoint" },                             /* Extendable / Table 7.5.4.13 */
1567     { 130, "Remove Traffic Endpoint" },                             /* Extendable / Table 7.5.4.14 */
1568     { 131, "Traffic Endpoint ID" },                                 /* Extendable / Subclause 8.2.92*/
1569     { 132, "Ethernet Packet Filter"},                               /* Extendable / Table 7.5.2.2-3 */
1570     { 133, "MAC address"},                                          /* Extendable / Subclause 8.2.93 */
1571     { 134, "C-TAG"},                                                /* Extendable / Subclause 8.2.94 */
1572     { 135, "S-TAG"},                                                /* Extendable / Subclause 8.2.95 */
1573     { 136, "Ethertype"},                                            /* Extendable / Subclause 8.2.96 */
1574     { 137, "Proxying"},                                             /* Extendable / Subclause 8.2.97 */
1575     { 138, "Ethernet Filter ID"},                                   /* Extendable / Subclause 8.2.98 */
1576     { 139, "Ethernet Filter Properties"},                           /* Extendable / Subclause 8.2.99 */
1577     { 140, "Suggested Buffering Packets Count"},                    /* Extendable / Subclause 8.2.100 */
1578     { 141, "User ID"},                                              /* Extendable / Subclause 8.2.101 */
1579     { 142, "Ethernet PDU Session Information"},                     /* Extendable / Subclause 8.2.102 */
1580     { 143, "Ethernet Traffic Information"},                         /* Extendable / Table 7.5.8.3-3 */
1581     { 144, "MAC Addresses Detected"},                               /* Extendable / Subclause 8.2.103 */
1582     { 145, "MAC Addresses Removed"},                                /* Extendable / Subclause 8.2.104 */
1583     { 146, "Ethernet Inactivity Timer"},                            /* Extendable / Subclause 8.2.105 */
1584     { 147, "Additional Monitoring Time"},                           /* Extendable / Table 7.5.2.4-3 */
1585     { 148, "Event Quota"},                                          /* Extendable / Subclause 8.2.112 */
1586     { 149, "Event Threshold"},                                      /* Extendable / Subclause 8.2.113 */
1587     { 150, "Subsequent Event Quota"},                               /* Extendable / Subclause 8.2.106 */
1588     { 151, "Subsequent Event Threshold"},                           /* Extendable / Subclause 8.2.107 */
1589     { 152, "Trace Information"},                                    /* Extendable / Subclause 8.2.108 */
1590     { 153, "Framed-Route"},                                         /* Variable Length  / Subclause 8.2.109 */
1591     { 154, "Framed-Routing"},                                       /* Fixed Length  / Subclause 8.2.110 */
1592     { 155, "Framed-IPv6-Route"},                                    /* Variable Length  / Subclause 8.2.111 */
1593     { 156, "Time Stamp"},                                           /* Extendable / Subclause 8.2.114 */
1594     { 157, "Averaging Window"},                                     /* Extendable / Subclause 8.2.115 */
1595     { 158, "Paging Policy Indicator"},                              /* Extendable / Subclause 8.2.116 */
1596     { 159, "APN/DNN"},                                              /* Variable Length  / Subclause 8.2.117 */
1597     { 160, "3GPP Interface Type"},                                  /* Extendable / Subclause 8.2.118 */
1598     { 161, "PFCPSRReq-Flags"},                                      /* ExtendableClause 8.2.119 */
1599     { 162, "PFCPAUReq-Flags"},                                      /* ExtendableClause 8.2.120 */
1600     { 163, "Activation Time"},                                      /* Extendable Clause 8.2.121 */
1601     { 164, "Deactivation Time"},                                    /* Extendable Clause 8.2.122 */
1602     { 165, "Create MAR"},                                           /* Extendable / Table 7.5.2.8-1 */
1603     { 166, "Access Forwarding Action Information 1"},               /* Extendable / Table 7.5.2.8-2 */
1604     { 167, "Access Forwarding Action Information 2"},               /* Extendable / Table 7.5.2.8-3 */
1605     { 168, "Remove MAR"},                                           /* Extendable / Table 7.5.2.15-1 */
1606     { 169, "Update MAR"},                                           /* Extendable / Table 7.5.2.16-1 */
1607     { 175, "Update Access Forwarding Action Information 1"},        /* Fixed / Clause 8.2.126 */
1608     { 176, "Update Access Forwarding Action Information 2"},        /* Extendable / Clause 8.2.127 */
1609     { 177, "UE IP address Pool Identity"},                          /* Variable Length / Clause 8.2.128 */
1610     { 178, "Alternative SMF IP Address"},                           /* Extendable / Clause 8.2.129 */
1611     { 179, "Packet Replication and Detection Carry-On Information"},/* Extendable / Clause 8.2.130 */
1612     { 180, "SMF Set ID"},                                           /* Extendable / Clause 8.2.131 */
1613     { 181, "Quota Validity Time"},                                  /* Extendable / Clause 8.2.132 */
1614     { 182, "Number of Reports"},                                    /* Fixed / Clause 8.2.133 */
1615     { 183, "PFCP Session Retention Information (within PFCP Association Setup Request)"}, /* Extendable / Table 7.4.4.1-2 */
1616     { 184, "PFCPASRsp-Flags"},                                      /* Extendable / Clause 8.2.134 */
1617     { 185, "CP PFCP Entity IP Address"},                            /* Extendable / Clause 8.2.135 */
1618     { 186, "PFCPSEReq-Flags"},                                      /* Extendable / Clause 8.2.136 */
1619     { 187, "User Plane Path Recovery Report"},                      /* Extendable / Table 7.4.5.1.3-1 */
1620     { 188, "IP Multicast Addressing Info within PFCP Session Establishment Request"}, /* Extendable / Clause 7.5.2.2-4 */
1621     { 189, "Join IP Multicast Information IE within Usage Report"}, /* Extendable / Table 7.5.8.3-4 */
1622     { 190, "Leave IP Multicast Information IE within Usage Report"},/* Extendable / Table 7.5.8.3-5 */
1623     { 191, "IP Multicast Address"},                                 /* Extendable / Clause 8.2.137 */
1624     { 192, "Source IP Address"},                                    /* Extendable / Clause 8.2.138 */
1625     { 193, "Packet Rate Status"},                                   /* Extendable / Clause 8.2.139 */
1626     { 194, "Create Bridge Info for TSC"},                           /* Extendable / Clause 8.2.140 */
1627     { 195, "Created Bridge Info for TSC"},                          /* Extendable / Table 7.5.3.6-1 */
1628     { 196, "DS-TT Port Number"},                                    /* Fixed Length / Clause 8.2.141 */
1629     { 197, "NW-TT Port Number"},                                    /* Fixed Length / Clause 8.2.142 */
1630     { 198, "5GS User Plane Node"},                                  /* Extendable / Clause 8.2.143 */
1631     { 199, "TSC Management Information IE within PFCP Session Modification Request"}, /* Extendable / Table 7.5.4.18-1 */
1632     { 200, "Port Management Information for TSC IE within PFCP Session Modification Response"}, /* Extendable / Table 7.5.5.3-1 */
1633     { 201, "Port Management Information for TSC IE within PFCP Session Report Request"}, /* Extendable / Table 7.5.8.5-1 */
1634     { 202, "Port Management Information Container"},                /* Variable Length / Clause 8.2.144 */
1635     { 203, "Clock Drift Control Information"},                      /* Extendable / Table 7.4.4.1.2-1 */
1636     { 204, "Requested Clock Drift Information"},                    /* Extendable / Clause 8.2.145 */
1637     { 205, "Clock Drift Report"},                                   /* Extendable / Table 7.4.5.1.4-1 */
1638     { 206, "Time Domain Number"},                                   /* Extendable / Clause 8.2.146 */
1639     { 207, "Time Offset Threshold"},                                /* Extendable / Clause 8.2.147 */
1640     { 208, "Cumulative rateRatio Threshold"},                       /* Extendable / Clause 8.2.148 */
1641     { 209, "Time Offset Measurement"},                              /* Extendable / Clause 8.2.149 */
1642     { 210, "Cumulative rateRatio Measurement"},                     /* Extendable / Clause 8.2.150 */
1643     { 211, "Remove SRR"},                                           /* Extendable/ Table 7.5.4.19-1 */
1644     { 212, "Create SRR"},                                           /* Extendable/ Table 7.5.2.9-1 */
1645     { 213, "Update SRR"},                                           /* Extendable/ Table 7.5.4.21-1 */
1646     { 214, "Session Report"},                                       /* Extendable / Table 7.5.8.7-1 */
1647     { 215, "SRR ID"},                                               /* Extendable / Clause 8.2.151 */
1648     { 216, "Access Availability Control Information"},              /* Extendable / Table 7.5.2.9-2 */
1649     { 217, "Requested Access Availability Information"},            /* Extendable / Clause 8.2.152 */
1650     { 218, "Access Availability Report"},                           /* Extendable / Table 7.5.8.6-2 */
1651     { 219, "Access Availability Information"},                      /* Extendable / Clause 8.2.153 */
1652     { 220, "Provide ATSSS Control Information"},                    /* Extendable / Table 7.5.2.10-1 */
1653     { 221, "ATSSS Control Parameters"},                             /* Extendable / Table 7.5.3.7-1 */
1654     { 222, "MPTCP Control Information"},                            /* Extendable / Clause 8.2.154 */
1655     { 223, "ATSSS-LL Control Information"},                         /* Extendable / Clause 8.2.155 */
1656     { 224, "PMF Control Information"},                              /* Extendable / Clause 8.2.156 */
1657     { 225, "MPTCP Parameters"},                                     /* Extendable / Table 7.5.3.7-2 */
1658     { 226, "ATSSS-LL Parameters"},                                  /* Extendable / Table 7.5.3.7-3 */
1659     { 227, "PMF Parameters"},                                       /* Extendable / Table 7.5.3.7-4 */
1660     { 228, "MPTCP Address Information"},                            /* Extendable / Clause 8.2.157 */
1661     { 229, "UE Link-Specific IP Address"},                          /* Extendable / Clause 8.2.158 */
1662     { 230, "PMF Address Information"},                              /* Extendable / Clause 8.2.159 */
1663     { 231, "ATSSS-LL Information"},                                 /* Extendable / Clause 8.2.160 */
1664     { 232, "Data Network Access Identifier"},                       /* Variable Length / Clause 8.2.161 */
1665     { 233, "UE IP address Pool Information"},                       /* Extendable / Table 7.4.4.1-3 */
1666     { 234, "Average Packet Delay"},                                 /* Extendable / Clause 8.2.162 */
1667     { 235, "Minimum Packet Delay"},                                 /* Extendable / Clause 8.2.163 */
1668     { 236, "Maximum Packet Delay"},                                 /* Extendable / Clause 8.2.164 */
1669     { 237, "QoS Report Trigger"},                                   /* Extendable / Clause 8.2.165 */
1670     { 238, "GTP-U Path QoS Control Information"},                   /* Extendable / Table 7.4.4.1.3-1 */
1671     { 239, "GTP-U Path QoS Report (PFCP Node Report Request)"},     /* Extendable / Table 7.4.5.1.5-1 */
1672     { 240, "QoS Information in GTP-U Path QoS Report"},             /* Extendable / Table 7.4.5.1.6-1 */
1673     { 241, "GTP-U Path Interface Type"},                            /* Extendable / Clause 8.2.166 */
1674     { 242, "QoS Monitoring per QoS flow Control Information"},      /* Extendable / Table 7.5.2.9-3 */
1675     { 243, "Requested QoS Monitoring"},                             /* Extendable / Clause 8.2.167 */
1676     { 244, "Reporting Frequency"},                                  /* Extendable / Clause 8.2.168 */
1677     { 245, "Packet Delay Thresholds"},                              /* Extendable / Clause 8.2.169 */
1678     { 246, "Minimum Wait Time"},                                    /* Extendable / Clause 8.2.170 */
1679     { 247, "QoS Monitoring Report"},                                /* Extendable / Table 7.5.8.6-3 */
1680     { 248, "QoS Monitoring Measurement"},                           /* Extendable / Clause 8.2.171 */
1681     { 249, "MT-EDT Control Information"},                           /* Extendable / Clause 8.2.172 */
1682     { 250, "DL Data Packets Size"},                                 /* Extendable / Clause 8.2.173 */
1683     { 251, "QER Control Indications"},                              /* Extendable / Clause 8.2.174 */
1684     { 252, "Packet Rate Status Report IE within PFCP Session Deletion Response"}, /* Extendable / Table 7.5.7.1-2 */
1685     { 253, "NF Instance ID"},                                       /* Extendable / Clause 8.2.175 */
1686     { 255, "Redundant Transmission Detection Parameters IE in PDI"}, /* Extendable / Table 7.5.2.2-5 */
1687     { 256, "Updated PDR"},                                          /* Extendable / Table 7.5.9.3-1 */
1688     { 257, "S-NSSAI"},                                              /* Fixed Length / Clause 8.2.176 */
1689     { 258, "IP version"},                                           /* Extendable / Clause 8.2.177 */
1690     { 259, "PFCPASReq-Flags"},                                      /* Extendable / Clause 8.2.178 */
1691     { 260, "Data Status"},                                          /* Extendable / Clause 8.2.179 */
1692     { 261, "Provide RDS Configuration Information IE within PFCP Session Establishment Request"}, /* Extendable / Table 7.5.2.11-1  */
1693     { 262, "RDS Configuration Information"},                        /* Extendable / Clause 8.2.180  */
1694     { 263, "Query Packet Rate Status IE within PFCP Session Modification Request"}, /* Extendable / Table 7.5.4.22-1  */
1695     { 264, "Query Packet Rate Status Report IE within PFCP Session Modification Response"}, /* Extendable / Table 7.5.5.4-1  */
1696     { 265, "MPTCP Applicable Indication"},                          /* Extendable / Clause 8.2.181 */
1697     { 266, "User Plane NodeManagement Information Container"},              /* Variable Length / Clause 8.2.182 */
1698     { 267, "UE IP Address Usage Information"},                      /* Extendable / Table 7.4.4.3.1-1 */
1699     { 268, "Number of UE IP Addresses"},                            /* Extendable / Clause 8.2.183 */
1700     { 269, "Validity Timer"},                                       /* Extendable / Clause 8.2.184 */
1701     { 270, "Redundant Transmission Forwarding Parameters"},         /* Extendable / Table 7.5.2.3-4 */
1702     { 271, "Transport Delay Reporting"},                            /* Extendable / Table 7.5.2.2-6 */
1703     { 272, "Partial Failure Information"},                          /* Extendable / Table 7.5.3.1-2 */
1704     { 273, "Partial Failure Information within PFCP Session Modification Response (Removed in Rel 17.2.0)"},   /* Extendable / Table 7.5.5.1-2 */
1705     { 274, "Offending IE Information"},                             /* Extendable / Clause 8.2.185 */
1706     { 275, "RAT Type"},                                             /* Extendable / Clause 8.2.186 */
1707     { 276, "L2TP Tunnel Information"},                              /* Extendable / Table 7.5.2.1-2 */
1708     { 277, "L2TP Session Information within PFCP Session Establishment Request"},   /* Extendable / Table 7.5.2.1-3 */
1709     { 278, "L2TP User Authentication"},                             /* Variable Length / Clause 8.2.187 */
1710     { 279, "L2TP Session Information within PFCP Session Establishment Response"},   /* Extendable / Table 7.5.3.1-3 */
1711     { 280, "LNS Address"},                                          /* Variable Length / Clause 8.2.188 */
1712     { 281, "Tunnel Preference"},                                    /* Fixed / Clause 8.2.189 */
1713     { 282, "Calling Number"},                                       /* Variable Length / Clause 8.2.190 */
1714     { 283, "Called Number"},                                        /* Variable Length / Clause 8.2.191 */
1715     { 284, "L2TP Session Indications"},                             /* Extendable / Clause 8.2.192 */
1716     { 285, "DNS Server Address"},                                   /* Extendable / Clause 8.2.193 */
1717     { 286, "NBNS Server Address"},                                  /* Fixed / Clause 8.2.194 */
1718     { 287, "Maximum Receive Unit"},                                 /* Variable Length / Clause 8.2.195 */
1719     { 288, "Thresholds"},                                           /* Variable Length / Clause 8.2.196 */
1720     { 289, "Steering Mode Indicator"},                              /* Extendable / Clause 8.2.197 */
1721     { 290, "PFCP Session Change Info"},                             /* Extendable / Table 7.4.7.1-2 */
1722     { 291, "Group ID"},                                             /* Fixed / Clause 8.2.198 */
1723     { 292, "CP IP Address"},                                        /* Extendable / Clause 8.2.199 */
1724     { 293, "IP Address and Port Number Replacement"},               /* Variable Length / Clause 8.2.200 */
1725     { 294, "DNS Query Filter"},                                     /* Variable Length / Clause 8.2.201 */
1726     { 295, "Direct Reporting Information"},                         /* Extendable / Table 7.5.2.9-4 */
1727     { 296, "Event Notification URI"},                               /* Variable Length / Clause 8.2.202 */
1728     { 297, "Notification Correlation ID"},                          /* Variable Length / Clause 8.2.203 */
1729     { 298, "Reporting Flags"},                                      /* Extendable / Clause 8.2.204 */
1730     { 299, "Predefined Rules Name"},                                /* Variable Length / Clause 8.2.205 */
1731     { 300, "MBS Session N4mb Control Information"},                 /* Extendable / Table 7.5.2.1-5 */
1732     { 301, "MBS Multicast Parameters"},                             /* Extendable / Table 7.5.2.3-5 */
1733     { 302, "Add MBS Unicast Parameters IE in Create FAR"},          /* Extendable / Table 7.5.2.3-6 */
1734     { 303, "MBS Session N4mb Information"},                         /* Extendable / Table 7.5.3.1-4 */
1735     { 304, "Remove MBS Unicast Parameters IE in Update FAR"},       /* Extendable / Table 7.5.4.3-4 */
1736     { 305, "MBS Session Identifier"},                               /* Extendable Length / Clause 8.2.206 */
1737     { 306, "Multicast Transport Information"},                      /* Extendable Length / Clause 8.2.207 */
1738     { 307, "MBSN4mbReq Flags"},                                     /* Extendable Length / Clause 8.2.208 */
1739     { 308, "Local Ingress Tunnel"},                                 /* Extendable Length / Clause 8.2.209 */
1740     { 309, "MBS Unicast Parameters ID"},                            /* Extendable Length / Clause 8.2.210 */
1741     //310 to 32767 Spare. For future use.
1742     //32768 to 65535 Vendor-specific IEs.
1743     {0, NULL}
1744 };
1745 
1746 static value_string_ext pfcp_ie_type_ext = VALUE_STRING_EXT_INIT(pfcp_ie_type);
1747 
1748 /* PFCP Session funcs*/
1749 static guint32
pfcp_get_frame(packet_info * pinfo,address ip,guint64 seid,guint32 * frame)1750 pfcp_get_frame(packet_info *pinfo, address ip, guint64 seid, guint32 *frame) {
1751     gboolean found = FALSE;
1752     wmem_list_frame_t *elem;
1753     pfcp_info_t *info;
1754     wmem_list_t *info_list;
1755     gchar *ip_str;
1756 
1757     /* First we get the seid list*/
1758     ip_str = address_to_str(pinfo->pool, &ip);
1759     info_list = (wmem_list_t*)wmem_tree_lookup_string(pfcp_frame_tree, ip_str, 0);
1760     if (info_list != NULL) {
1761         elem = wmem_list_head(info_list);
1762         while (!found && elem) {
1763             info = (pfcp_info_t*)wmem_list_frame_data(elem);
1764             if (seid == info->seid) {
1765                 *frame = info->frame;
1766                 return 1;
1767             }
1768             elem = wmem_list_frame_next(elem);
1769         }
1770     }
1771     return 0;
1772 }
1773 
1774 static gboolean
pfcp_call_foreach_ip(const void * key _U_,void * value,void * data)1775 pfcp_call_foreach_ip(const void *key _U_, void *value, void *data){
1776     wmem_list_frame_t * elem;
1777     wmem_list_t *info_list = (wmem_list_t *)value;
1778     pfcp_info_t *info;
1779     guint32* frame = (guint32*)data;
1780 
1781     /* We loop over the <seid, frame> list */
1782     elem = wmem_list_head(info_list);
1783     while (elem) {
1784         info = (pfcp_info_t*)wmem_list_frame_data(elem);
1785         if (info->frame == *frame) {
1786             wmem_list_frame_t * del = elem;
1787             /* proceed to next request */
1788             elem = wmem_list_frame_next(elem);
1789             /* If we find the frame we remove its information from the list */
1790             wmem_list_remove_frame(info_list, del);
1791             wmem_free(wmem_file_scope(), info);
1792         }
1793         else {
1794             elem = wmem_list_frame_next(elem);
1795         }
1796     }
1797 
1798     return FALSE;
1799 }
1800 
1801 static void
pfcp_remove_frame_info(guint32 * f)1802 pfcp_remove_frame_info(guint32 *f) {
1803     /* For each ip node */
1804     wmem_tree_foreach(pfcp_frame_tree, pfcp_call_foreach_ip, (void *)f);
1805 }
1806 
1807 static void
pfcp_add_session(guint32 frame,guint32 session)1808 pfcp_add_session(guint32 frame, guint32 session) {
1809     guint32 *f, *session_count;
1810 
1811     f = wmem_new0(wmem_file_scope(), guint32);
1812     session_count = wmem_new0(wmem_file_scope(), guint32);
1813     *f = frame;
1814     *session_count = session;
1815     g_hash_table_insert(pfcp_session_table, f, session_count);
1816 }
1817 
1818 static gboolean
pfcp_seid_exists(guint64 seid,wmem_list_t * seid_list)1819 pfcp_seid_exists(guint64 seid, wmem_list_t *seid_list) {
1820     wmem_list_frame_t *elem;
1821     guint32 *info;
1822     gboolean found;
1823     found = FALSE;
1824     elem = wmem_list_head(seid_list);
1825     while (!found && elem) {
1826         info = (guint32*)wmem_list_frame_data(elem);
1827         found = *info == seid;
1828         elem = wmem_list_frame_next(elem);
1829     }
1830     return found;
1831 }
1832 
1833 static gboolean
pfcp_ip_exists(address ip,wmem_list_t * ip_list)1834 pfcp_ip_exists(address ip, wmem_list_t *ip_list) {
1835     wmem_list_frame_t *elem;
1836     address *info;
1837     gboolean found;
1838     found = FALSE;
1839     elem = wmem_list_head(ip_list);
1840     while (!found && elem) {
1841         info = (address*)wmem_list_frame_data(elem);
1842         found = addresses_equal(info, &ip);
1843         elem = wmem_list_frame_next(elem);
1844     }
1845     return found;
1846 }
1847 
1848 static gboolean
pfcp_info_exists(pfcp_info_t * wanted,wmem_list_t * info_list)1849 pfcp_info_exists(pfcp_info_t *wanted, wmem_list_t *info_list) {
1850     wmem_list_frame_t *elem;
1851     pfcp_info_t *info;
1852     gboolean found;
1853     found = FALSE;
1854     elem = wmem_list_head(info_list);
1855     while (!found && elem) {
1856         info = (pfcp_info_t*)wmem_list_frame_data(elem);
1857         found = wanted->seid == info->seid;
1858         elem = wmem_list_frame_next(elem);
1859     }
1860     return found;
1861 }
1862 
1863 static void
pfcp_fill_map(wmem_list_t * seid_list,wmem_list_t * ip_list,guint32 frame)1864 pfcp_fill_map(wmem_list_t *seid_list, wmem_list_t *ip_list, guint32 frame) {
1865     wmem_list_frame_t *elem_ip, *elem_seid;
1866     pfcp_info_t *pfcp_info;
1867     wmem_list_t * info_list; /* List of <seids,frames>*/
1868     guint32 *f, *session, *fr, *session_count;
1869     GHashTableIter iter;
1870     guint64 seid;
1871     gchar *ip;
1872 
1873     elem_ip = wmem_list_head(ip_list);
1874 
1875     while (elem_ip) {
1876         ip = address_to_str(wmem_file_scope(), (address*)wmem_list_frame_data(elem_ip));
1877         /* We check if a seid list exists for this ip */
1878         info_list = (wmem_list_t*)wmem_tree_lookup_string(pfcp_frame_tree, ip, 0);
1879         if (info_list == NULL) {
1880             info_list = wmem_list_new(wmem_file_scope());
1881         }
1882 
1883         /* We loop over the seid list */
1884         elem_seid = wmem_list_head(seid_list);
1885         while (elem_seid) {
1886             seid = *(guint64*)wmem_list_frame_data(elem_seid);
1887             f = wmem_new0(wmem_file_scope(), guint32);
1888             *f = frame;
1889             pfcp_info = wmem_new0(wmem_file_scope(), pfcp_info_t);
1890             pfcp_info->seid = seid;
1891             pfcp_info->frame = *f;
1892 
1893             if (pfcp_info_exists(pfcp_info, info_list)) {
1894                 /* If the seid and ip already existed, that means that we need to remove old info about that session */
1895                 /* We look for its session ID */
1896                 session = (guint32 *)g_hash_table_lookup(pfcp_session_table, f);
1897                 if (session) {
1898                     g_hash_table_iter_init(&iter, pfcp_session_table);
1899 
1900                     while (g_hash_table_iter_next(&iter, (gpointer*)&fr, (gpointer*)&session_count)) {
1901                         /* If the msg has the same session ID and it's not the upd req we have to remove its info */
1902                         if (*session_count == *session) {
1903                             /* If it's the session we are looking for, we remove all the frame information */
1904                             pfcp_remove_frame_info(fr);
1905                         }
1906                     }
1907                 }
1908             }
1909             wmem_list_prepend(info_list, pfcp_info);
1910             elem_seid = wmem_list_frame_next(elem_seid);
1911         }
1912         wmem_tree_insert_string(pfcp_frame_tree, ip, info_list, 0);
1913         elem_ip = wmem_list_frame_next(elem_ip);
1914     }
1915 }
1916 
1917 static gboolean
pfcp_is_cause_accepted(guint8 cause)1918 pfcp_is_cause_accepted(guint8 cause) {
1919     return cause == 1;
1920 }
1921 
1922 /* Data structure attached to a conversation
1923 *  of a session
1924 */
1925 typedef struct pfcp_session_conv_info_t {
1926     struct pfcp_session_conv_info_t *next;
1927     GHashTable             *unmatched;
1928     GHashTable             *matched;
1929 } pfcp_session_conv_info_t;
1930 
1931 static pfcp_session_conv_info_t *pfcp_session_info_items = NULL;
1932 
1933 /* Data structure attached to a conversation,
1934 *  to keep track of request/response-pairs
1935 */
1936 typedef struct pfcp_conv_info_t {
1937     struct pfcp_conv_info_t *next;
1938     wmem_map_t             *unmatched;
1939     wmem_map_t             *matched;
1940 } pfcp_conv_info_t;
1941 
1942 static pfcp_conv_info_t *pfcp_info_items = NULL;
1943 
1944 /* structure used to track responses to requests using sequence number */
1945 typedef struct pfcp_msg_hash_entry {
1946     gboolean is_request;    /* TRUE/FALSE */
1947     guint32 req_frame;      /* frame with request */
1948     nstime_t req_time;      /* req time */
1949     guint32 rep_frame;      /* frame with reply */
1950     gint seq_nr;            /* sequence number */
1951     guint msgtype;          /* messagetype */
1952 } pfcp_msg_hash_t;
1953 
1954 static guint
pfcp_sn_hash(gconstpointer k)1955 pfcp_sn_hash(gconstpointer k)
1956 {
1957     const pfcp_msg_hash_t *key = (const pfcp_msg_hash_t *)k;
1958 
1959     return key->seq_nr;
1960 }
1961 
1962 static gboolean
pfcp_sn_equal_matched(gconstpointer k1,gconstpointer k2)1963 pfcp_sn_equal_matched(gconstpointer k1, gconstpointer k2)
1964 {
1965     const pfcp_msg_hash_t *key1 = (const pfcp_msg_hash_t *)k1;
1966     const pfcp_msg_hash_t *key2 = (const pfcp_msg_hash_t *)k2;
1967 
1968     if (key1->req_frame && key2->req_frame && (key1->req_frame != key2->req_frame)) {
1969         return 0;
1970     }
1971 
1972     if (key1->rep_frame && key2->rep_frame && (key1->rep_frame != key2->rep_frame)) {
1973         return 0;
1974     }
1975 
1976     return key1->seq_nr == key2->seq_nr;
1977 }
1978 
1979 static gboolean
pfcp_sn_equal_unmatched(gconstpointer k1,gconstpointer k2)1980 pfcp_sn_equal_unmatched(gconstpointer k1, gconstpointer k2)
1981 {
1982     const pfcp_msg_hash_t *key1 = (const pfcp_msg_hash_t *)k1;
1983     const pfcp_msg_hash_t *key2 = (const pfcp_msg_hash_t *)k2;
1984 
1985     return key1->seq_nr == key2->seq_nr;
1986 }
1987 
1988 static void
pfcp_track_session(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,pfcp_hdr_t * pfcp_hdr,wmem_list_t * seid_list,wmem_list_t * ip_list,guint64 last_seid _U_,address last_ip _U_)1989 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_)
1990 {
1991     guint32 *session, frame_seid_cp;
1992     proto_item *it;
1993 
1994     /* PFCP session */
1995     if (tree) {
1996         session = (guint32*)g_hash_table_lookup(pfcp_session_table, &pinfo->num);
1997         if (session) {
1998             it = proto_tree_add_uint(tree, hf_pfcp_session, tvb, 0, 0, *session);
1999             proto_item_set_generated(it);
2000         }
2001     }
2002 
2003     if (!PINFO_FD_VISITED(pinfo)) {
2004         /* If the message does not have any session ID */
2005         session = (guint32*)g_hash_table_lookup(pfcp_session_table, &pinfo->num);
2006         if (!session) {
2007             /* 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 */
2008             if ((pfcp_hdr->message != PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST && pfcp_hdr->message != PFCP_MSG_SESSION_ESTABLISHMENT_RESPONSE &&
2009                 pfcp_hdr->message != PFCP_MSG_SESSION_MODIFICATION_REQUEST && pfcp_hdr->message != PFCP_MSG_SESSION_MODIFICATION_RESPONSE &&
2010                 pfcp_hdr->message != PFCP_MSG_SESSION_DELETION_REQUEST && pfcp_hdr->message != PFCP_MSG_SESSION_DELETION_RESPONSE &&
2011                 pfcp_hdr->message != PFCP_MSG_SESSION_REPORT_REQUEST && pfcp_hdr->message != PFCP_MSG_SESSION_REPORT_RESPONSE)) {
2012                 /* If the lists are not empty*/
2013                 if (wmem_list_count(seid_list) && wmem_list_count(ip_list)) {
2014                     pfcp_remove_frame_info(&pinfo->num);
2015                 }
2016             }
2017             if (pfcp_hdr->message == PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST){
2018                 /* If SEREQ and not already in the list then we create a new session*/
2019                 pfcp_add_session(pinfo->num, pfcp_session_count++);
2020             }
2021             else if (pfcp_hdr->message != PFCP_MSG_SESSION_ESTABLISHMENT_RESPONSE) {
2022                 /* 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
2023                 the corresponding session ID */
2024                 if ((pfcp_get_frame(pinfo, pinfo->dst, (guint32)pfcp_hdr->seid, &frame_seid_cp) == 1)) {
2025                     /* Then we have to set its session ID */
2026                     session = (guint32*)g_hash_table_lookup(pfcp_session_table, &frame_seid_cp);
2027                     if (session != NULL) {
2028                         /* We add the corresponding session to the list so that when a response came we can associate its session ID*/
2029                         pfcp_add_session(pinfo->num, *session);
2030                     }
2031                 }
2032             }
2033         }
2034     }
2035 }
2036 
2037 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_)2038 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_)
2039 {
2040     proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_reserved, tvb, 0, length);
2041 }
2042 
2043 /* Functions for C-Tag and S-TAG
2044  * See 8.2.94 and 8.2.95
2045  */
2046 
2047 /* From Tables G-2,3 of IEEE standard 802.1Q-2005 (and I-2,3,7 of 2011 and 2015 revisions) */
2048 static const value_string pfcp_vlan_tag_pcp_vals[] = {
2049   { 0, "Best Effort (default), Drop Eligible"            },
2050   { 1, "Best Effort (default)"                           },
2051   { 2, "Critical Applications, Drop Eligible"            },
2052   { 3, "Critical Applications"                           },
2053   { 4, "Voice, < 10ms latency and jitter, Drop Eligible" },
2054   { 5, "Voice, < 10ms latency and jitter"                },
2055   { 6, "Internetwork Control"                            },
2056   { 7, "Network Control"                                 },
2057   { 0, NULL                                              }
2058 };
2059 
2060 static const true_false_string tfs_eligible_ineligible = {
2061     "Eligible",
2062     "Ineligible"
2063 };
2064 
decode_pfcp_c_tag(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,gint offset)2065 static int decode_pfcp_c_tag(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, gint offset)
2066 {
2067     static const crumb_spec_t pfcp_c_tag_cvid_crumbs[] = {
2068         { 0, 4 },
2069         { 8, 8 },
2070         { 0, 0 }
2071     };
2072 
2073     static int * const pfcp_c_tag_flags[] = {
2074         &hf_pfcp_spare_b7_b3,
2075         &hf_pfcp_c_tag_flags_b2_vid,
2076         &hf_pfcp_c_tag_flags_b1_dei,
2077         &hf_pfcp_c_tag_flags_b0_pcp,
2078         NULL
2079     };
2080     /* Octet 5  Spare   VID   DEI   PCP */
2081     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_c_tag_flags,
2082         ett_pfcp_c_tag, pfcp_c_tag_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
2083     offset += 1;
2084 
2085     //  Octet     8     7     6     5     4     3     2     1
2086     //    6    | C-VID value            |DEI|   PCP value     |
2087     //    7    | C-VID value                                  |
2088     proto_tree_add_split_bits_item_ret_val(tree, hf_pfcp_c_tag_cvid, tvb, offset << 3, pfcp_c_tag_cvid_crumbs, NULL);
2089     proto_tree_add_item(tree, hf_pfcp_c_tag_dei_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
2090     proto_tree_add_item(tree, hf_pfcp_c_tag_pcp_value, tvb, offset, 1, ENC_BIG_ENDIAN);
2091     offset += 2;
2092 
2093     return offset;
2094 }
2095 
decode_pfcp_s_tag(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint offset)2096 static int decode_pfcp_s_tag(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint offset)
2097 {
2098     static const crumb_spec_t pfcp_s_tag_svid_crumbs[] = {
2099         { 0, 4 },
2100         { 8, 8 },
2101         { 0, 0 }
2102     };
2103 
2104     static int * const pfcp_s_tag_flags[] = {
2105         &hf_pfcp_spare_b7_b3,
2106         &hf_pfcp_s_tag_flags_b2_vid,
2107         &hf_pfcp_s_tag_flags_b1_dei,
2108         &hf_pfcp_s_tag_flags_b0_pcp,
2109         NULL
2110     };
2111     /* Octet 5  Spare   VID   DEI   PCP */
2112     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_s_tag_flags,
2113         ett_pfcp_s_tag, pfcp_s_tag_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
2114     offset += 1;
2115 
2116     //  Octet     8     7     6     5     4     3     2     1
2117     //    6    | S-VID value            |DEI|   PCP value     |
2118     //    7    | S-VID value                                  |
2119     proto_tree_add_split_bits_item_ret_val(tree, hf_pfcp_s_tag_svid, tvb, offset << 3, pfcp_s_tag_svid_crumbs, NULL);
2120     proto_tree_add_item(tree, hf_pfcp_s_tag_dei_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
2121     proto_tree_add_item(tree, hf_pfcp_s_tag_pcp_value, tvb, offset, 1, ENC_BIG_ENDIAN);
2122     offset += 2;
2123 
2124     return offset;
2125 }
2126 
2127 /*
2128  * 8.2.1    Cause
2129  */
2130 static const value_string pfcp_cause_vals[] = {
2131 
2132     {  0, "Reserved" },
2133     {  1, "Request accepted(success)" },
2134     {  2, "More Usage Report to send" },
2135     {  3, "Request partially accepted" },
2136     /* 4 - 63 Spare. */
2137     { 64, "Request rejected(reason not specified)" },
2138     { 65, "Session context not found" },
2139     { 66, "Mandatory IE missing" },
2140     { 67, "Conditional IE missing" },
2141     { 68, "Invalid length" },
2142     { 69, "Mandatory IE incorrect" },
2143     { 70, "Invalid Forwarding Policy" },
2144     { 71, "Invalid F - TEID allocation option" },
2145     { 72, "No established PFCP Association" },
2146     { 73, "Rule creation / modification Failure" },
2147     { 74, "PFCP entity in congestion" },
2148     { 75, "No resources available" },
2149     { 76, "Service not supported" },
2150     { 77, "System failure" },
2151     { 78, "Redirection Requested" },
2152     { 79, "All dynamic addresses are occupied" },
2153     { 80, "Unknown Pre-defined Rule" },
2154     { 81, "Unknown Application ID" },
2155     { 82, "L2TP tunnel Establishment failure" },
2156     { 83, "L2TP session Establishment failure" },
2157     { 84, "L2TP tunnel release" },
2158     { 85, "L2TP session release" },
2159     /* 86 to 255 Spare for future use in a response message. */
2160     {0, NULL}
2161 };
2162 
2163 static void
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)2164 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)
2165 {
2166     guint32 value;
2167     /* Octet 5 Cause value */
2168     proto_tree_add_item_ret_uint(tree, hf_pfcp2_cause, tvb, 0, 1, ENC_BIG_ENDIAN, &value);
2169     if (g_pfcp_session) {
2170         args->last_cause = (guint8)value;
2171     }
2172     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_cause_vals, "Unknown"));
2173 }
2174 
2175 /*
2176  * 8.2.2    Source Interface
2177  */
2178 static const value_string pfcp_source_interface_vals[] = {
2179 
2180     { 0, "Access" },
2181     { 1, "Core" },
2182     { 2, "SGi-LAN/N6-LAN" },
2183     { 3, "CP-function" },
2184     { 4, "5G VN Internal" },
2185     { 0, NULL }
2186 };
2187 static int
decode_pfcp_source_interface(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item,gint offset)2188 decode_pfcp_source_interface(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, gint offset)
2189 {
2190     guint32 value;
2191     /* Octet 5 Spare    Interface value */
2192     proto_tree_add_item(tree, hf_pfcp_spare_h1, tvb, offset, 1, ENC_BIG_ENDIAN);
2193     proto_tree_add_item_ret_uint(tree, hf_pfcp_source_interface, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
2194     offset += 1;
2195 
2196     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_source_interface_vals, "Unknown"));
2197 
2198     return offset;
2199 
2200 }
2201 static void
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_)2202 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_)
2203 {
2204     int offset = 0;
2205 
2206     offset = decode_pfcp_source_interface(tvb, pinfo, tree, item, offset);
2207 
2208     if (offset < length) {
2209         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2210     }
2211 
2212 }
2213 
2214 /*
2215  * 8.2.3    F-TEID
2216  */
2217 static void
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_)2218 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_)
2219 {
2220     int offset = 0;
2221     guint64 fteid_flags_val;
2222 
2223     static int * const pfcp_fteid_flags[] = {
2224         &hf_pfcp_fteid_flg_spare,
2225         &hf_pfcp_fteid_flg_b3_ch_id,
2226         &hf_pfcp_fteid_flg_b2_ch,
2227         &hf_pfcp_fteid_flg_b1_v6,
2228         &hf_pfcp_fteid_flg_b0_v4,
2229         NULL
2230     };
2231     /* Octet 5  Spare  Spare  Spare  Spare  CHID  CH  V6  V4*/
2232     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_f_teid_flags,
2233         ett_f_teid_flags, pfcp_fteid_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &fteid_flags_val);
2234     offset += 1;
2235     /* The following flags are coded within Octet 5:
2236      * 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,
2237      *         otherwise the IPv4 address field shall not be present.
2238      * 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,
2239      *         otherwise the IPv6 address field shall not be present.
2240      * Bit 3 - CH (CHOOSE): If this bit is set to "1", then the TEID, IPv4 address and IPv6 address fields shall not be
2241      *         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.
2242      *         This bit shall only be set by the CP function.
2243      * Bit 4 - CHID (CHOOSE_ID):If this bit is set to "1", then the UP function shall assign the same F-TEID to the
2244      *         PDRs requested to be created in a PFCP Session Establishment Request or PFCP Session Modification Request with
2245      *         the same CHOOSE ID value.
2246      *         This bit may only be set to "1" if the CH bit is set to "1".
2247      *         This bit shall only be set by the CP function.
2248      */
2249 
2250     if ((fteid_flags_val & 0x4) == 4) {
2251         if ((fteid_flags_val & 0x8) == 8) {
2252             proto_tree_add_item(tree, hf_pfcp_f_teid_ch_id, tvb, offset, 1, ENC_NA);
2253             offset += 1;
2254         }
2255     } else {
2256 
2257         /* Octet 6 to 9    TEID */
2258         proto_tree_add_item(tree, hf_pfcp_f_teid_teid, tvb, offset, 4, ENC_BIG_ENDIAN);
2259         proto_item_append_text(item, "TEID: 0x%s", tvb_bytes_to_str(pinfo->pool, tvb, offset, 4));
2260         offset += 4;
2261 
2262         if ((fteid_flags_val & 0x1) == 1) {
2263             /* m to (m+3)    IPv4 address */
2264             proto_tree_add_item(tree, hf_pfcp_f_teid_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
2265             proto_item_append_text(item, ", IPv4 %s", tvb_ip_to_str(pinfo->pool, tvb, offset));
2266             offset += 4;
2267         }
2268         if ((fteid_flags_val & 0x2) == 2) {
2269             /* p to (p+15)   IPv6 address */
2270             proto_tree_add_item(tree, hf_pfcp_f_teid_ipv6, tvb, offset, 16, ENC_NA);
2271             proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset));
2272             offset += 16;
2273         }
2274         /* If the value of CH bit is set to "0", but the value of CHID bit is "1" */
2275         if ((fteid_flags_val & 0x8) == 8) {
2276             proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, 0, 1);
2277         }
2278     }
2279     if (offset < length) {
2280         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2281     }
2282 
2283 }
2284 /*
2285  * 8.2.4    Network Instance
2286  */
2287 static int
decode_pfcp_network_instance(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,gint offset,int length)2288 decode_pfcp_network_instance(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, gint offset, int length)
2289 {
2290 
2291     int      name_len;
2292 
2293     if (length > 0) {
2294         name_len = tvb_get_guint8(tvb, offset);
2295         if (name_len < 0x41) {
2296             /* APN */
2297             guint8 *apn = NULL;
2298             int     tmp;
2299 
2300             name_len = tvb_get_guint8(tvb, offset);
2301 
2302             if (name_len < 0x20) {
2303                 apn = tvb_get_string_enc(pinfo->pool, tvb, offset + 1, length - 1, ENC_ASCII);
2304                 for (;;) {
2305                     if (name_len >= length - 1)
2306                         break;
2307                     tmp = name_len;
2308                     name_len = name_len + apn[tmp] + 1;
2309                     apn[tmp] = '.';
2310                 }
2311             } else {
2312                 apn = tvb_get_string_enc(pinfo->pool, tvb, offset, length, ENC_ASCII);
2313             }
2314             proto_tree_add_string(tree, hf_pfcp_network_instance, tvb, offset, length, apn);
2315             proto_item_append_text(item, "%s", apn);
2316 
2317         } else {
2318             /* Domain name*/
2319             const guint8* string_value;
2320             proto_tree_add_item_ret_string(tree, hf_pfcp_network_instance, tvb, offset, length, ENC_ASCII | ENC_NA, pinfo->pool, &string_value);
2321             proto_item_append_text(item, "%s", string_value);
2322         }
2323     }
2324 
2325     return offset + length;
2326 }
2327 static void
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_)2328 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_)
2329 {
2330     int      offset = 0;
2331 
2332     /* Octet 5   Network Instance
2333      * The Network instance field shall be encoded as an OctetString and shall contain an identifier
2334      * which uniquely identifies a particular Network instance (e.g. PDN instance) in the UP function.
2335      * It may be encoded as a Domain Name or an Access Point Name (APN)
2336      */
2337      /* Test for Printable character or length indicator(APN), assume first character of Domain name >= 0x41 */
2338 
2339     decode_pfcp_network_instance(tvb, pinfo, tree, item, offset, length);
2340 
2341 }
2342 
2343 /*
2344  * 8.2.5    SDF Filter
2345  */
2346 static void
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_)2347 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_)
2348 {
2349     int offset = 0;
2350     guint64 flags_val;
2351     guint32 fd_length;
2352     proto_tree *flow_desc_tree, *tos_tree, *spi_tree, *flow_label_tree, *sdf_filter_id_tree;
2353 
2354     static int * const pfcp_sdf_filter_flags[] = {
2355         &hf_pfcp_spare_h1,
2356         &hf_pfcp_sdf_filter_flags_b4_bid,
2357         &hf_pfcp_sdf_filter_flags_b3_fl,
2358         &hf_pfcp_sdf_filter_flags_b2_spi,
2359         &hf_pfcp_sdf_filter_flags_b1_ttc,
2360         &hf_pfcp_sdf_filter_flags_b0_fd,
2361         NULL
2362     };
2363     /* Octet 5  Spare   FL  SPI TTC FD*/
2364     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_sdf_filter_flags,
2365         ett_pfcp_sdf_filter_flags, pfcp_sdf_filter_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &flags_val);
2366     offset += 1;
2367     /* Octet 6 Spare*/
2368     proto_tree_add_item(tree, hf_pfcp_spare, tvb, offset, 1, ENC_BIG_ENDIAN);
2369     offset += 1;
2370 
2371     if ((flags_val & 0x1) == 1) {
2372         /* FD (Flow Description): If this bit is set to "1",
2373          * then the Length of Flow Description and the Flow Description fields shall be present
2374          */
2375         flow_desc_tree = proto_item_add_subtree(item, ett_pfcp_flow_desc);
2376         /* m to (m+1)    Length of Flow Description */
2377         proto_tree_add_item_ret_uint(flow_desc_tree, hf_pfcp_flow_desc_len, tvb, offset, 2, ENC_BIG_ENDIAN, &fd_length);
2378         offset += 2;
2379         /* Flow Description
2380          * The Flow Description field, when present, shall be encoded as an OctetString
2381          * as specified in subclause 5.4.2 of 3GPP TS 29.212
2382          */
2383         proto_tree_add_item(flow_desc_tree, hf_pfcp_flow_desc, tvb, offset, fd_length, ENC_ASCII|ENC_NA);
2384         offset += fd_length;
2385     }
2386     if ((flags_val & 0x2) == 2) {
2387         /* TTC (ToS Traffic Class): If this bit is set to "1", then the ToS Traffic Class field shall be present */
2388         /* ToS Traffic Class field, when present, shall be encoded as an OctetString on two octets
2389          * as specified in subclause 5.3.15 of 3GPP TS 29.212
2390          */
2391         tos_tree = proto_item_add_subtree(item, ett_pfcp_tos);
2392         proto_tree_add_item(tos_tree, hf_pfcp_traffic_class, tvb, offset, 1, ENC_BIG_ENDIAN);
2393         offset += 1;
2394         proto_tree_add_item(tos_tree, hf_pfcp_traffic_mask, tvb, offset, 1, ENC_BIG_ENDIAN);
2395         offset += 1;
2396     }
2397 
2398     if ((flags_val & 0x4) == 4) {
2399         /* SPI (The Security Parameter Index) field, when present, shall be encoded as an OctetString on four octets and shall
2400          * contain the IPsec security parameter index (which is a 32-bit field),
2401          * as specified in subclause 5.3.51 of 3GPP TS 29.212
2402          */
2403         spi_tree = proto_item_add_subtree(item, ett_pfcp_spi);
2404         proto_tree_add_item(spi_tree, hf_pfcp_spi, tvb, offset, 4, ENC_BIG_ENDIAN);
2405         offset += 4;
2406     }
2407     if ((flags_val & 0x8) == 8) {
2408         /* FL (Flow Label), when present, shall be encoded as an OctetString on 3 octets as specified in
2409          * subclause 5.3.52 of 3GPP TS 29.212 and shall contain an IPv6 flow label (which is a 20-bit field).
2410          * The bits 8 to 5 of the octet "v" shall be spare and set to zero, and the remaining 20 bits shall
2411          * contain the IPv6 flow label.*/
2412         flow_label_tree = proto_item_add_subtree(item, ett_pfcp_flow_label);
2413         proto_tree_add_bits_item(flow_label_tree, hf_pfcp_flow_label_spare_bit, tvb, (offset<<3), 4, ENC_BIG_ENDIAN);
2414         proto_tree_add_item(flow_label_tree, hf_pfcp_flow_label, tvb, offset, 3, ENC_BIG_ENDIAN);
2415         offset += 3;
2416     }
2417     if ((flags_val & 0x10) == 16) {
2418         /* The SDF Filter ID, when present, shall be encoded as an Unsigned32 binary integer value.
2419          * It shall uniquely identify an SDF Filter among all the SDF Filters provisioned for a given PFCP Session. */
2420         sdf_filter_id_tree = proto_item_add_subtree(item, ett_pfcp_sdf_filter_id);
2421         proto_tree_add_item(sdf_filter_id_tree, hf_pfcp_sdf_filter_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2422         offset += 4;
2423     }
2424 
2425     if (offset < length) {
2426         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2427     }
2428 }
2429 /*
2430  * 8.2.6    Application ID
2431  */
2432 static void
dissect_pfcp_application_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_)2433 dissect_pfcp_application_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_)
2434 {
2435     int offset = 0;
2436 
2437     /* Octet 5 to (n+4) Application Identifier
2438     * The Application Identifier shall be encoded as an OctetString (see 3GPP TS 29.212)
2439     */
2440     if (tvb_ascii_isprint(tvb, offset, length))
2441     {
2442         const guint8* string_value;
2443         proto_tree_add_item_ret_string(tree, hf_pfcp_application_id_str, tvb, offset, length, ENC_ASCII | ENC_NA, pinfo->pool, &string_value);
2444         proto_item_append_text(item, "%s", string_value);
2445     }
2446     else
2447     {
2448         proto_tree_add_item(tree, hf_pfcp_application_id, tvb, offset, length, ENC_NA);
2449     }
2450 }
2451 /*
2452  * 8.2.7    Gate Status
2453  */
2454 static const value_string pfcp_gate_status_vals[] = {
2455     { 0, "OPEN" },
2456     { 1, "CLOSED" },
2457     { 0, NULL }
2458 };
2459 
2460 
2461 static void
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_)2462 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_)
2463 {
2464     int offset = 0;
2465 
2466     static int * const pfcp_gate_status_flags[] = {
2467         &hf_pfcp_gate_status_b3b2_ulgate,
2468         &hf_pfcp_gate_status_b0b1_dlgate,
2469         NULL
2470     };
2471     /* Octet 5  Spare   UL Gate DL Gate */
2472     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_gate_status,
2473         ett_pfcp_gate_status, pfcp_gate_status_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
2474     offset += 1;
2475 
2476     if (offset < length) {
2477         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2478     }
2479 
2480 }
2481 
2482 
2483 /*
2484  * 8.2.8    MBR
2485  */
2486 static void
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_)2487 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_)
2488 {
2489     int offset = 0;
2490     int len1 = (length != 10) ? length/2 : 5;
2491 
2492     /* In case length is not in accordance with documentation */
2493     if ( length != 10) {
2494         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, 0, 1);
2495     }
2496 
2497     /* 5 to 9   UL MBR
2498     * The UL/DL MBR fields shall be encoded as kilobits per second (1 kbps = 1000 bps) in binary value
2499     */
2500     proto_tree_add_item(tree, hf_pfcp_ul_mbr, tvb, offset, len1, ENC_BIG_ENDIAN);
2501     offset += len1;
2502 
2503     /* 10 to 14 DL MBR */
2504     proto_tree_add_item(tree, hf_pfcp_dl_mbr, tvb, offset, len1, ENC_BIG_ENDIAN);
2505     offset += len1;
2506 
2507     if (offset < length) {
2508         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2509     }
2510 
2511 }
2512 
2513 /*
2514  * 8.2.9    GBR
2515  */
2516 static void
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_)2517 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_)
2518 {
2519     int offset = 0;
2520     int len1 = (length != 10) ? length/2 : 5;
2521 
2522     /* In case length is not in accordance with documentation */
2523     if ( length != 10) {
2524         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, 0, 1);
2525     }
2526 
2527     /* 5 to 9   UL GBR
2528     * The UL/DL MBR fields shall be encoded as kilobits per second (1 kbps = 1000 bps) in binary value
2529     */
2530     proto_tree_add_item(tree, hf_pfcp_ul_gbr, tvb, offset, len1, ENC_BIG_ENDIAN);
2531     offset += len1;
2532 
2533     /* 10 to 14 DL GBR */
2534     proto_tree_add_item(tree, hf_pfcp_dl_gbr, tvb, offset, len1, ENC_BIG_ENDIAN);
2535     offset += len1;
2536 
2537     if (offset < length) {
2538         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2539     }
2540 
2541 }
2542 
2543 /*
2544  * 8.2.10   QER Correlation ID
2545  */
2546 static void
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_)2547 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_)
2548 {
2549     int offset = 0;
2550     guint32 value;
2551     /* 5 to 8   QER Correlation ID value */
2552     proto_tree_add_item_ret_uint(tree, hf_pfcp_qer_correlation_id, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
2553     offset += 4;
2554 
2555     proto_item_append_text(item, "%u", value);
2556 
2557     if (offset < length) {
2558         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2559     }
2560 
2561 }
2562 /*
2563  * 8.2.11   Precedence
2564  */
2565 static void
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_)2566 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_)
2567 {
2568     int offset = 0;
2569     guint32 value;
2570     /* Octet 5 5 to 8   Precedence value */
2571     proto_tree_add_item_ret_uint(tree, hf_pfcp_precedence, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
2572     offset += 4;
2573 
2574     proto_item_append_text(item, "%u", value);
2575 
2576     if (offset < length) {
2577         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2578     }
2579 
2580 }
2581 /*
2582  * 8.2.12   Transport Level Marking
2583  */
2584 static void
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_)2585 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_)
2586 {
2587     int offset = 0;
2588     proto_item *dscp_it;
2589     const gchar *dscp_str;
2590     guint32 tos, mask;
2591 
2592     /* Octet 5 to 6    ToS/Traffic Class
2593     * The ToS/Traffic Class shall be encoded on two octets as an OctetString.
2594     * 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
2595     */
2596     proto_tree_add_item_ret_uint(tree, hf_pfcp_traffic_class, tvb, offset, 1, ENC_BIG_ENDIAN, &tos);
2597     offset += 1;
2598     proto_tree_add_item_ret_uint(tree, hf_pfcp_traffic_mask, tvb, offset, 1, ENC_BIG_ENDIAN, &mask);
2599     offset += 1;
2600 
2601     /* display DSCP value */
2602     dscp_str = val_to_str_ext_const(((tos & mask) >> 2), &dscp_vals_ext, "Unknown");
2603     dscp_it = proto_tree_add_string(tree, hf_pfcp_traffic_dscp, tvb, 0, 2, dscp_str);
2604     proto_item_set_generated(dscp_it);
2605 
2606     if (offset < length) {
2607         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2608     }
2609 
2610 }
2611 
2612 /*
2613  * 8.2.13   Volume Threshold
2614  */
2615 static void
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_)2616 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_)
2617 {
2618     int offset = 0;
2619     guint64 flags_val;
2620 
2621     static int * const pfcp_volume_threshold_flags[] = {
2622         &hf_pfcp_spare_b7_b3,
2623         &hf_pfcp_volume_threshold_b2_dlvol,
2624         &hf_pfcp_volume_threshold_b1_ulvol,
2625         &hf_pfcp_volume_threshold_b0_tovol,
2626         NULL
2627     };
2628     /* Octet 5  Spare   DLVOL   ULVOL   TOVOL*/
2629     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_volume_threshold,
2630         ett_pfcp_volume_threshold, pfcp_volume_threshold_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
2631     offset += 1;
2632 
2633     /* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value.
2634     * They shall contain the total, uplink or downlink number of octets respectively.
2635     */
2636     if ((flags_val & 0x1) == 1) {
2637         /* m to (m+7)   Total Volume
2638         * TOVOL: If this bit is set to "1", then the Total Volume field shall be present
2639         */
2640         proto_tree_add_item(tree, hf_pfcp_volume_threshold_tovol, tvb, offset, 8, ENC_BIG_ENDIAN);
2641         offset += 8;
2642     }
2643     if ((flags_val & 0x2) == 2) {
2644         /* p to (p+7)    Uplink Volume
2645         * ULVOL: If this bit is set to "1", then the Uplink Volume field shall be present
2646         */
2647         proto_tree_add_item(tree, hf_pfcp_volume_threshold_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
2648         offset += 8;
2649     }
2650     if ((flags_val & 0x4) == 4) {
2651         /* q to (q+7)   Downlink Volume
2652         * DLVOL: If this bit is set to "1", then the Downlink Volume field shall be present
2653         */
2654         proto_tree_add_item(tree, hf_pfcp_volume_threshold_dlvol, tvb, offset, 8, ENC_BIG_ENDIAN);
2655         offset += 8;
2656     }
2657 
2658     if (offset < length) {
2659         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2660     }
2661 }
2662 /*
2663  * 8.2.14   Time Threshold
2664  */
2665 static void
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_)2666 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_)
2667 {
2668     int offset = 0;
2669     guint value;
2670 
2671     /* Octet 5 to 8    Time Threshold
2672     * The Time Threshold field shall be encoded as an Unsigned32 binary integer value.
2673     * It shall contain the duration in seconds.
2674     */
2675     proto_tree_add_item_ret_uint(tree, hf_pfcp_time_threshold, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
2676     offset += 4;
2677 
2678     proto_item_append_text(item, "%u s", value);
2679 
2680     if (offset < length) {
2681         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2682     }
2683 
2684 }
2685 
2686 /*
2687  * 8.2.15   Monitoring Time
2688  */
2689 static void
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_)2690 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_)
2691 {
2692     char *time_str;
2693     int offset = 0;
2694 
2695     /* The Monitoring Time field shall indicate the monitoring time in UTC time.
2696     * Octets 5 to 8 shall be encoded in the same format as the first four octets
2697     * of the 64-bit timestamp format as defined in section 6 of IETF RFC 5905.
2698     */
2699     proto_tree_add_item_ret_time_string(tree, hf_pfcp_monitoring_time, tvb, offset, 4, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str);
2700     proto_item_append_text(item, "%s", time_str);
2701     offset += 4;
2702 
2703     if (offset < length) {
2704         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2705     }
2706 
2707 }
2708 /*
2709  * 8.2.16   Subsequent Volume Threshold
2710  */
2711 static void
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_)2712 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_)
2713 {
2714     int offset = 0;
2715     guint64 flags_val;
2716 
2717     static int * const pfcp_subseq_volume_threshold_flags[] = {
2718         &hf_pfcp_spare_b7_b3,
2719         &hf_pfcp_subseq_volume_threshold_b2_dlvol,
2720         &hf_pfcp_subseq_volume_threshold_b1_ulvol,
2721         &hf_pfcp_subseq_volume_threshold_b0_tovol,
2722         NULL
2723     };
2724     /* Octet 5  Spare   DLVOL   ULVOL   TOVOL*/
2725     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_subseq_volume_threshold,
2726         ett_pfcp_subseq_volume_threshold, pfcp_subseq_volume_threshold_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
2727     offset += 1;
2728 
2729     /* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value.
2730     * They shall contain the total, uplink or downlink number of octets respectively.
2731     */
2732     if ((flags_val & 0x1) == 1) {
2733         /* m to (m+7)   Total Volume
2734         * TOVOL: If this bit is set to "1", then the Total Volume field shall be present
2735         */
2736         proto_tree_add_item(tree, hf_pfcp_subseq_volume_threshold_tovol, tvb, offset, 8, ENC_BIG_ENDIAN);
2737         offset += 8;
2738     }
2739     if ((flags_val & 0x2) == 2) {
2740         /* p to (p+7)    Uplink Volume
2741         * ULVOL: If this bit is set to "1", then the Uplink Volume field shall be present
2742         */
2743         proto_tree_add_item(tree, hf_pfcp_subseq_volume_threshold_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
2744         offset += 8;
2745     }
2746     if ((flags_val & 0x4) == 4) {
2747         /* q to (q+7)   Downlink Volume
2748         * DLVOL: If this bit is set to "1", then the Downlink Volume field shall be present
2749         */
2750         proto_tree_add_item(tree, hf_pfcp_subseq_volume_threshold_dlvol, tvb, offset, 8, ENC_BIG_ENDIAN);
2751         offset += 8;
2752     }
2753 
2754     if (offset < length) {
2755         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2756     }
2757 }
2758 
2759 /*
2760  * 8.2.17   Subsequent Time Threshold
2761  */
2762 static void
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_)2763 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_)
2764 {
2765     int offset = 0;
2766     guint32 value;
2767     /* 5 to 8   Subsequent Time Threshold */
2768     proto_tree_add_item_ret_uint(tree, hf_pfcp_subsequent_time_threshold, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
2769     offset += 4;
2770 
2771     proto_item_append_text(item, "%u s", value);
2772 
2773     if (offset < length) {
2774         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2775     }
2776 }
2777 /*
2778  * 8.2.18   Inactivity Detection Time
2779  */
2780 static void
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_)2781 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_)
2782 {
2783     int offset = 0;
2784     guint32 value;
2785     /* 5 to 8   Inactivity Detection Time */
2786     proto_tree_add_item_ret_uint(tree, hf_pfcp_inactivity_detection_time, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
2787     offset += 4;
2788 
2789     proto_item_append_text(item, "%u s", value);
2790 
2791     if (offset < length) {
2792         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2793     }
2794 }
2795 
2796 /*
2797  * 8.2.19   Reporting Triggers
2798  */
2799 static void
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_)2800 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_)
2801 {
2802     int offset = 0;
2803 
2804     static int * const pfcp_reporting_triggers_o5_flags[] = {
2805         &hf_pfcp_reporting_triggers_o5_b7_liusa,
2806         &hf_pfcp_reporting_triggers_o5_b6_droth,
2807         &hf_pfcp_reporting_triggers_o5_b5_stopt,
2808         &hf_pfcp_reporting_triggers_o5_b4_start,
2809         &hf_pfcp_reporting_triggers_o5_b3_quhti,
2810         &hf_pfcp_reporting_triggers_o5_b2_timth,
2811         &hf_pfcp_reporting_triggers_o5_b1_volth,
2812         &hf_pfcp_reporting_triggers_o5_b0_perio,
2813         NULL
2814     };
2815     /* Octet 5 LIUSA   DROTH   STOPT   START   QUHTI   TIMTH   VOLTH   PERIO */
2816     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_reporting_triggers_o5_flags, ENC_BIG_ENDIAN);
2817     offset++;
2818 
2819     if (offset == length) {
2820         return;
2821     }
2822 
2823     static int * const pfcp_reporting_triggers_o6_flags[] = {
2824         &hf_pfcp_reporting_triggers_o6_b7_quvti,
2825         &hf_pfcp_reporting_triggers_o6_b6_ipmjl,
2826         &hf_pfcp_reporting_triggers_o6_b5_evequ,
2827         &hf_pfcp_reporting_triggers_o6_b4_eveth,
2828         &hf_pfcp_reporting_triggers_o6_b3_macar,
2829         &hf_pfcp_reporting_triggers_o6_b2_envcl,
2830         &hf_pfcp_reporting_triggers_o6_b1_timqu,
2831         &hf_pfcp_reporting_triggers_o6_b0_volqu,
2832         NULL
2833     };
2834     /* Octet 6 QUVTI   IPMJL   EVEQU   EVETH   MACAR   ENVCL   TIMQU   VOLQU */
2835     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_reporting_triggers_o6_flags, ENC_BIG_ENDIAN);
2836     offset++;
2837 
2838     if (offset == length) {
2839         return;
2840     }
2841 
2842     static int * const pfcp_reporting_triggers_o7_flags[] = {
2843         &hf_pfcp_spare_b7_b1,
2844         &hf_pfcp_reporting_triggers_o7_b0_reemr,
2845         NULL
2846     };
2847     /* Octet 7 Spare   Spare   Spare   Spare   Spare   Spare   Spare   REEMR */
2848     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_reporting_triggers_o7_flags, ENC_BIG_ENDIAN);
2849     offset++;
2850 
2851     if (offset == length) {
2852         return;
2853     }
2854 
2855 
2856     if (offset < length) {
2857         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2858     }
2859 
2860 }
2861 
2862 /*
2863  * 8.2.20   Redirect Information
2864  */
2865 static const value_string pfcp_redirect_address_type_vals[] = {
2866 
2867     { 0, "IPv4 address" },
2868     { 1, "IPv6 address" },
2869     { 2, "URL" },
2870     { 3, "SIP URI" },
2871     { 4, "IPv4 and IPv6 addresses" },
2872     { 0, NULL }
2873 };
2874 
2875 static void
dissect_pfcp_redirect_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)2876 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_)
2877 {
2878     int offset = 0;
2879     guint32 value, addr_len;
2880 
2881     /* Octet Spare  Redirect Address Type */
2882     proto_tree_add_item(tree, hf_pfcp_spare_h1, tvb, offset, 1, ENC_BIG_ENDIAN);
2883     proto_tree_add_item_ret_uint(tree, hf_pfcp_redirect_address_type, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
2884     offset++;
2885 
2886     /* 6-7  Redirect Server Address Length=a */
2887     proto_tree_add_item_ret_uint(tree, hf_pfcp_redirect_server_addr_len, tvb, offset, 2, ENC_BIG_ENDIAN, &addr_len);
2888     offset+=2;
2889 
2890     /* 8-(8+a-1)  Redirect Server Address */
2891     proto_tree_add_item(tree, hf_pfcp_redirect_server_address, tvb, offset, addr_len, ENC_UTF_8 | ENC_NA);
2892     offset += addr_len;
2893 
2894     /* If the Redirect Address type is set to "IPv4 and IPv6 address",
2895      * the Redirect Information IE shall include an IPv4 address and
2896      * an IPv6 address in the Redirect Server Address IE and Other Redirect Server Address.
2897      */
2898 
2899     /* Redirect Information is an extensible IE. It was extended with the Other Redirect Server Address
2900      * in version 15.6.0, before that version not including the Other Redirect Server Address was fine
2901      */
2902     if (offset < length) {
2903         /* p-(p+1)  Other Redirect Server Address Length=b */
2904         proto_tree_add_item_ret_uint(tree, hf_pfcp_other_redirect_server_addr_len, tvb, offset, 2, ENC_BIG_ENDIAN, &addr_len);
2905         offset+=2;
2906 
2907         /* (p+2)-(p+2+b-1)  Other Redirect Server Address */
2908         proto_tree_add_item(tree, hf_pfcp_other_redirect_server_address, tvb, offset, addr_len, ENC_UTF_8 | ENC_NA);
2909         offset += addr_len;
2910     }
2911 
2912     if (offset < length) {
2913         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2914     }
2915 }
2916 /*
2917  * 8.2.21   Report Type
2918  */
2919 static void
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_)2920 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_)
2921 {
2922     int offset = 0;
2923 
2924     static int * const pfcp_report_type_flags[] = {
2925         &hf_pfcp_spare_b7,
2926         &hf_pfcp_report_type_b6_uisr,
2927         &hf_pfcp_report_type_b5_sesr,
2928         &hf_pfcp_report_type_b4_tmir,
2929         &hf_pfcp_report_type_b3_upir,
2930         &hf_pfcp_report_type_b2_erir,
2931         &hf_pfcp_report_type_b1_usar,
2932         &hf_pfcp_report_type_b0_dldr,
2933         NULL
2934     };
2935     /* Octet 5  Spare   UISR   SESR    TMIR   UPIR   ERIR    USAR    DLDR */
2936     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_report_type,
2937         ett_pfcp_report_type, pfcp_report_type_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
2938     offset += 1;
2939 
2940     if (offset < length) {
2941         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2942     }
2943 
2944 }
2945 /*
2946  * 8.2.22   Offending IE
2947  */
2948 static void
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_)2949 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_)
2950 {
2951     guint32 value;
2952     /* Octet 5 to 6 Type of the offending IE */
2953     proto_tree_add_item_ret_uint(tree, hf_pfcp_offending_ie, tvb, 0, 2, ENC_BIG_ENDIAN, &value);
2954 
2955     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_ie_type, "Unknown"));
2956 
2957 }
2958 /*
2959  * 8.2.23   Forwarding Policy
2960  */
2961 static void
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_)2962 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_)
2963 {
2964     int offset = 0;
2965     guint32 id_len;
2966 
2967     /* Octet Forwarding Policy Identifier Length */
2968     proto_tree_add_item_ret_uint(tree, hf_pfcp_forwarding_policy_id_len, tvb, offset, 1, ENC_BIG_ENDIAN, &id_len);
2969     offset += 1;
2970 
2971     proto_tree_add_item(tree, hf_pfcp_forwarding_policy_id, tvb, offset, id_len, ENC_NA);
2972     offset += id_len;
2973 
2974     if (offset < length) {
2975         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2976     }
2977 
2978 }
2979 /*
2980  * 8.2.24   Destination Interface
2981  */
2982 static const value_string pfcp_dst_interface_vals[] = {
2983 
2984     { 0, "Access" },
2985     { 1, "Core" },
2986     { 2, "SGi-LAN/N6-LAN" },
2987     { 3, "CP- Function" },
2988     { 4, "LI Function" },
2989     { 5, "5G VN Internal" },
2990     { 0, NULL }
2991 };
2992 
2993 static int
decode_pfcp_destination_interface(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,gint offset,int length)2994 decode_pfcp_destination_interface(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, gint offset, int length)
2995 {
2996     guint32 value;
2997 
2998     /* Octet 5    Spare    Interface value*/
2999     proto_tree_add_item(tree, hf_pfcp_spare_h1, tvb, offset, 1, ENC_BIG_ENDIAN);
3000     proto_tree_add_item_ret_uint(tree, hf_pfcp_dst_interface, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
3001     offset++;
3002 
3003     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_dst_interface_vals, "Unknown"));
3004 
3005     if (offset < length) {
3006         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3007     }
3008 
3009     return length;
3010 }
3011 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_)3012 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_)
3013 {
3014     int offset = 0;
3015 
3016     decode_pfcp_destination_interface(tvb, pinfo, tree, item, offset, length);
3017 
3018 }
3019 /*
3020  * 8.2.25   UP Function Features
3021  */
3022 static void
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_)3023 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_)
3024 {
3025     int offset = 0;
3026 
3027     static int * const pfcp_up_function_features_o5_flags[] = {
3028         &hf_pfcp_up_function_features_o5_b7_treu,
3029         &hf_pfcp_up_function_features_o5_b6_heeu,
3030         &hf_pfcp_up_function_features_o5_b5_pfdm,
3031         &hf_pfcp_up_function_features_o5_b4_ftup,
3032         &hf_pfcp_up_function_features_o5_b3_trst,
3033         &hf_pfcp_up_function_features_o5_b2_dlbd,
3034         &hf_pfcp_up_function_features_o5_b1_ddnd,
3035         &hf_pfcp_up_function_features_o5_b0_bucp,
3036         NULL
3037     };
3038     /* Octet 5  TREU    HEEU    PFDM    FTUP    TRST    DLBD    DDND    BUCP */
3039     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o5_flags, ENC_BIG_ENDIAN);
3040     offset++;
3041 
3042     if (offset == length) {
3043         return;
3044     }
3045 
3046     static int * const pfcp_up_function_features_o6_flags[] = {
3047         &hf_pfcp_up_function_features_o6_b7_epfar,
3048         &hf_pfcp_up_function_features_o6_b6_pfde,
3049         &hf_pfcp_up_function_features_o6_b5_frrt,
3050         &hf_pfcp_up_function_features_o6_b4_trace,
3051         &hf_pfcp_up_function_features_o6_b3_quoac,
3052         &hf_pfcp_up_function_features_o6_b2_udbc,
3053         &hf_pfcp_up_function_features_o6_b1_pdiu,
3054         &hf_pfcp_up_function_features_o6_b0_empu,
3055         NULL
3056     };
3057     /* Octet 6  EPFAR   PFDE   FRRT    TRACE   QUOAC   UDBC    PDIU    EMPU */
3058     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o6_flags, ENC_BIG_ENDIAN);
3059     offset++;
3060 
3061     if (offset == length) {
3062         return;
3063     }
3064 
3065     static int * const pfcp_up_function_features_o7_flags[] = {
3066         &hf_pfcp_up_function_features_o7_b7_gcom,
3067         &hf_pfcp_up_function_features_o7_b6_bundl,
3068         &hf_pfcp_up_function_features_o7_b5_mte_n4,
3069         &hf_pfcp_up_function_features_o7_b4_mnop,
3070         &hf_pfcp_up_function_features_o7_b3_sset,
3071         &hf_pfcp_up_function_features_o7_b2_ueip,
3072         &hf_pfcp_up_function_features_o7_b1_adpdp,
3073         &hf_pfcp_up_function_features_o7_b0_dpdra,
3074         NULL
3075     };
3076     /* Octet 7  GCOM   BUNDL   MTE N4    MNOP   SSET   UEIP    ADPDP    DPDRA */
3077     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o7_flags, ENC_BIG_ENDIAN);
3078     offset++;
3079 
3080     if (offset == length) {
3081         return;
3082     }
3083 
3084     static int * const pfcp_up_function_features_o8_flags[] = {
3085         &hf_pfcp_up_function_features_o8_b7_mptcp,
3086         &hf_pfcp_up_function_features_o8_b6_tscu,
3087         &hf_pfcp_up_function_features_o8_b5_ip6pl,
3088         &hf_pfcp_up_function_features_o8_b4_iptv,
3089         &hf_pfcp_up_function_features_o8_b3_norp,
3090         &hf_pfcp_up_function_features_o8_b2_vtime,
3091         &hf_pfcp_up_function_features_o8_b1_rttl,
3092         &hf_pfcp_up_function_features_o8_b0_mpas,
3093         NULL
3094     };
3095     /* Octet 8  MPTCP   TSCU   IP6PL    IPTV   NORP   VTIME    RTTL    MPAS */
3096     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o8_flags, ENC_BIG_ENDIAN);
3097     offset += 1;
3098 
3099     if (offset == length) {
3100         return;
3101     }
3102 
3103     static int * const pfcp_up_function_features_o9_flags[] = {
3104         &hf_pfcp_up_function_features_o9_b7_rds,
3105         &hf_pfcp_up_function_features_o9_b6_ddds,
3106         &hf_pfcp_up_function_features_o9_b5_ethar,
3107         &hf_pfcp_up_function_features_o9_b4_ciot,
3108         &hf_pfcp_up_function_features_o9_b3_mt_edt,
3109         &hf_pfcp_up_function_features_o9_b2_gpqm,
3110         &hf_pfcp_up_function_features_o9_b1_qfqm,
3111         &hf_pfcp_up_function_features_o9_b0_atsss_ll,
3112         NULL
3113     };
3114     /* Octet 9  SPARE   ETHAR   CIOT    MT-EDT   GPQM    QFQM    ATSSS-LL */
3115     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o9_flags, ENC_BIG_ENDIAN);
3116     offset += 1;
3117 
3118     if (offset == length) {
3119         return;
3120     }
3121 
3122     static int * const pfcp_up_function_features_o10_flags[] = {
3123         &hf_pfcp_up_function_features_o10_b7_dnsts,
3124         &hf_pfcp_up_function_features_o10_b6_iprep,
3125         &hf_pfcp_up_function_features_o10_b5_resps,
3126         &hf_pfcp_up_function_features_o10_b4_upber,
3127         &hf_pfcp_up_function_features_o10_b3_l2tp,
3128         &hf_pfcp_up_function_features_o10_b2_nspoc,
3129         &hf_pfcp_up_function_features_o10_b1_quoaf,
3130         &hf_pfcp_up_function_features_o10_b0_rttwp,
3131         NULL
3132     };
3133     /* Octet 10  DNSTS   IPREP   RESPS    UPBER   L2TP   NSPOC    QUOAF    RTTWP */
3134     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o10_flags, ENC_BIG_ENDIAN);
3135     offset += 1;
3136 
3137     if (offset == length) {
3138         return;
3139     }
3140 
3141     static int * const pfcp_up_function_features_o11_flags[] = {
3142         &hf_pfcp_spare_b7_b1,
3143         &hf_pfcp_up_function_features_o11_b0_drqos,
3144         NULL
3145     };
3146     /* Octet 10  Spare    DRQOS */
3147     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_up_function_features_o11_flags, ENC_BIG_ENDIAN);
3148     offset += 1;
3149 
3150     if (offset == length) {
3151         return;
3152     }
3153 
3154     if (offset < length) {
3155         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3156     }
3157 
3158 }
3159 /*
3160  * 8.2.26   Apply Action
3161  */
3162 static void
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_)3163 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_)
3164 {
3165     int offset = 0;
3166 
3167     static int * const pfcp_apply_action_o5_flags[] = {
3168         &hf_pfcp_apply_action_flags_o5_b7_dfrt,
3169         &hf_pfcp_apply_action_flags_o5_b6_ipmd,
3170         &hf_pfcp_apply_action_flags_o5_b5_ipma,
3171         &hf_pfcp_apply_action_flags_o5_b4_dupl,
3172         &hf_pfcp_apply_action_flags_o5_b3_nocp,
3173         &hf_pfcp_apply_action_flags_o5_b2_buff,
3174         &hf_pfcp_apply_action_flags_o5_b1_forw,
3175         &hf_pfcp_apply_action_flags_o5_b0_drop,
3176         NULL
3177     };
3178     /* Octet 5  DFRT   IPMD   IPMA   DUPL    NOCP    BUFF    FORW    DROP */
3179     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_apply_action_o5_flags, ENC_BIG_ENDIAN);
3180     offset += 1;
3181 
3182     if (offset == length) {
3183         return;
3184     }
3185 
3186     static int * const pfcp_apply_action_o6_flags[] = {
3187         &hf_pfcp_spare_b7_b5,
3188         &hf_pfcp_apply_action_flags_o6_b4_mbsu,
3189         &hf_pfcp_apply_action_flags_o6_b3_fssm,
3190         &hf_pfcp_apply_action_flags_o6_b2_ddpn,
3191         &hf_pfcp_apply_action_flags_o6_b1_bdpn,
3192         &hf_pfcp_apply_action_flags_o6_b0_edrt,
3193         NULL
3194     };
3195     /* Octet 6  Spare   MBSU    FSSM    DDPN    BDPN    EDRT */
3196     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_apply_action_o6_flags, ENC_BIG_ENDIAN);
3197     offset += 1;
3198 
3199     if (offset < length) {
3200         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3201     }
3202 
3203 }
3204 /*
3205  * 8.2.27   Downlink Data Service Information
3206  */
3207 static void
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_)3208 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_)
3209 {
3210     int offset = 0;
3211     guint64 flags;
3212 
3213     static int * const pfcp_dl_data_service_inf_flags[] = {
3214         &hf_pfcp_spare_b7_b2,
3215         &hf_pfcp_dl_data_service_inf_b1_qfii,
3216         &hf_pfcp_dl_data_service_inf_b0_ppi,
3217         NULL
3218     };
3219     /* Octet 5  Spare   QFII    PPI */
3220     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_dl_data_service_inf_flags,
3221         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);
3222     offset += 1;
3223 
3224     /* The PPI flag in octet 5 indicates whether the Paging Policy Indication value in octet 'm' shall be present */
3225     if ((flags & 0x1) == 1) {
3226         /* m    Spare   Paging Policy Indication value
3227          * encoded as the DSCP in TOS (IPv4) or TC (IPv6) information received in the IP payload of the GTP-U packet
3228          * from the PGW (see IETF RFC 2474
3229          */
3230         proto_tree_add_item(tree, hf_pfcp_spare_b7_b6, tvb, offset, 1, ENC_BIG_ENDIAN);
3231         proto_tree_add_item(tree, hf_pfcp_ppi, tvb, offset, 1, ENC_BIG_ENDIAN);
3232         offset++;
3233     }
3234 
3235     /* The QFII flag in octet 5 indicates whether the QFI value in octet 'p' shall be present */
3236     if ((flags & 0x2) == 2) {
3237         /* m    Spare   QFI value
3238          * encoded as the octet 5 of the QFI IE in subclause 8.2.89.
3239          */
3240         proto_tree_add_item(tree, hf_pfcp_spare_b7_b6, tvb, offset, 1, ENC_BIG_ENDIAN);
3241         proto_tree_add_item(tree, hf_pfcp_qfi, tvb, offset, 1, ENC_NA);
3242         offset++;
3243     }
3244 
3245     if (offset < length) {
3246         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3247     }
3248 
3249 }
3250 /*
3251  * 8.2.28   Downlink Data Notification Delay
3252  */
3253 static void
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_)3254 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_)
3255 {
3256     int offset = 0;
3257     guint32 value;
3258     /* Octet 5 Delay Value in integer multiples of 50 millisecs, or zero */
3259     proto_tree_add_item_ret_uint(tree, hf_pfcp_dl_data_notification_delay, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
3260     offset += 1;
3261 
3262     proto_item_append_text(item, "%u ms", value * 50);
3263 
3264     if (offset < length) {
3265         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3266     }
3267 }
3268 
3269 /*
3270  * 8.2.29   DL Buffering Duration
3271  */
3272 static const value_string pfcp_timer_unit_vals[] = {
3273     { 0, "value is incremented in multiples of 2 seconds" },
3274     { 1, "value is incremented in multiples of 1 minute" },
3275     { 2, "value is incremented in multiples of 10 minutes" },
3276     { 3, "value is incremented in multiples of 1 hour" },
3277     { 4, "value is incremented in multiples of 10 hour" },
3278     { 5, "values shall be interpreted as multiples of 1 minute(version 14.0.0)" },
3279     { 6, "values shall be interpreted as multiples of 1 minute(version 14.0.0)" },
3280     { 7, "value indicates that the timer is infinite" },
3281     { 0, NULL }
3282 };
3283 
3284 static void
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_)3285 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_)
3286 {
3287     int offset = 0;
3288     guint32 unit, value;
3289 
3290     /* Octet 5  Timer unit  Timer value */
3291     proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_unit, tvb, offset, 1, ENC_BIG_ENDIAN, &unit);
3292     proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
3293     offset++;
3294 
3295     if ((unit == 0) && (value == 0)) {
3296         proto_item_append_text(item, " Stopped");
3297     } else {
3298         switch (unit) {
3299         case 0:
3300             proto_item_append_text(item, "%u s", value * 2);
3301             break;
3302         case 1:
3303             proto_item_append_text(item, "%u min", value);
3304             break;
3305         case 2:
3306             proto_item_append_text(item, "%u min", value * 10);
3307             break;
3308         case 3:
3309             proto_item_append_text(item, "%u hours", value);
3310             break;
3311         case 4:
3312             proto_item_append_text(item, "%u hours", value * 10);
3313             break;
3314         case 7:
3315             proto_item_append_text(item, "Infinite (%u)", value);
3316             break;
3317             /* Value 5 and 6 */
3318         default:
3319             proto_item_append_text(item, "%u min", value);
3320             break;
3321         }
3322     }
3323 
3324     if (offset < length) {
3325         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3326     }
3327 
3328 }
3329 
3330 /*
3331  * 8.2.30   DL Buffering Suggested Packet Count
3332  */
3333 static void
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_)3334 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_)
3335 {
3336     guint32 value;
3337     /* Octet 5 to n+4 Packet Count Value
3338     * The length shall be set to 1 or 2 octets.
3339     */
3340     proto_tree_add_item_ret_uint(tree, hf_pfcp_packet_count, tvb, 0, length, ENC_BIG_ENDIAN, &value);
3341 
3342     proto_item_append_text(item, "%u", value);
3343 }
3344 /*
3345  * 8.2.31   PFCPSMReq-Flags
3346  */
3347 static void
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_)3348 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_)
3349 {
3350     int offset = 0;
3351 
3352     static int * const pfcp_pfcpsmreq_flags[] = {
3353         &hf_pfcp_spare_b7_b5,
3354         &hf_pfcp_pfcpsmreq_flags_b4_rumuc,
3355         &hf_pfcp_pfcpsmreq_flags_b3_sumpc,
3356         &hf_pfcp_pfcpsmreq_flags_b2_qaurr,
3357         &hf_pfcp_pfcpsmreq_flags_b1_sndem,
3358         &hf_pfcp_pfcpsmreq_flags_b0_drobu,
3359         NULL
3360     };
3361     /* Octet 5  Spare   Spare   Spare   RUMUC   SUMPC   QAURR   SNDEM   DROBU */
3362     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpsmreq_flags,
3363         ett_pfcp_pfcpsmreq, pfcp_pfcpsmreq_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
3364     offset += 1;
3365 
3366     if (offset < length) {
3367         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3368     }
3369 
3370 }
3371 /*
3372  * 8.2.32   PFCPSRRsp-Flags
3373  */
3374 static void
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_)3375 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_)
3376 {
3377     int offset = 0;
3378 
3379     static int * const pfcp_pfcpsrrsp_flags[] = {
3380         &hf_pfcp_spare_b7_b1,
3381         &hf_pfcp_pfcpsrrsp_flags_b0_drobu,
3382         NULL
3383     };
3384     /* Octet 5  Spare   Spare   Spare   Spare   Spare   Spare   Spare   DROBU */
3385     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpsrrsp_flags,
3386         ett_pfcp_pfcpsrrsp, pfcp_pfcpsrrsp_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
3387     offset += 1;
3388 
3389     if (offset < length) {
3390         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3391     }
3392 
3393 }
3394 
3395 /*
3396  * 8.2.33   Sequence Number
3397  */
3398 static void
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_)3399 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_)
3400 {
3401     guint32 value;
3402     /* Octet 5 to 8    Sequence Number */
3403     proto_tree_add_item_ret_uint(tree, hf_pfcp_sequence_number, tvb, 0, 4, ENC_BIG_ENDIAN, &value);
3404 
3405     proto_item_append_text(item, "%u", value);
3406 
3407 }
3408 
3409 /*
3410  * 8.2.34   Metric
3411  */
3412 static void
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_)3413 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_)
3414 {
3415     guint32 value;
3416     /* Octet 5  Metric */
3417     proto_tree_add_item_ret_uint(tree, hf_pfcp_metric, tvb, 0, 1, ENC_BIG_ENDIAN, &value);
3418 
3419     proto_item_append_text(item, "%u", value);
3420 
3421 }
3422 
3423 /*
3424  * 8.2.35   Timer
3425  */
3426 static void
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_)3427 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_)
3428 {
3429     int offset = 0;
3430     guint32 unit, value;
3431 
3432     /* Octet 5  Timer unit  Timer value */
3433     proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_unit, tvb, offset, 1, ENC_BIG_ENDIAN, &unit);
3434     proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
3435     offset++;
3436 
3437     if ((unit == 0) && (value == 0)) {
3438         proto_item_append_text(item, " Stopped");
3439     } else {
3440         switch (unit) {
3441         case 0:
3442             proto_item_append_text(item, "%u s", value * 2);
3443             break;
3444         case 1:
3445             proto_item_append_text(item, "%u min", value);
3446             break;
3447         case 2:
3448             proto_item_append_text(item, "%u min", value * 10);
3449             break;
3450         case 3:
3451             proto_item_append_text(item, "%u hours", value);
3452             break;
3453         case 4:
3454             proto_item_append_text(item, "%u hours", value * 10);
3455             break;
3456         case 7:
3457             proto_item_append_text(item, "%u Infinite", value);
3458             break;
3459             /* Value 5 and 6 */
3460         default:
3461             proto_item_append_text(item, "%u min", value * 1);
3462             break;
3463         }
3464     }
3465 
3466     if (offset < length) {
3467         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3468     }
3469 
3470 }
3471 
3472 /*
3473  * 8.2.36   PDR ID
3474  */
3475 static int
decode_pfcp_pdr_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item,gint offset,pfcp_session_args_t * args)3476 decode_pfcp_pdr_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, gint offset, pfcp_session_args_t *args)
3477 {
3478     guint32 rule_id;
3479     /* Octet 5 to 6 Rule ID*/
3480     proto_tree_add_item_ret_uint(tree, hf_pfcp_pdr_id, tvb, offset, 2, ENC_BIG_ENDIAN, &rule_id);
3481     offset += 2;
3482 
3483     proto_item_append_text(item, "%u", rule_id);
3484 
3485     if (args) {
3486         args->last_rule_ids.pdr = rule_id;
3487     }
3488 
3489     return offset;
3490 }
3491 
3492 static void
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)3493 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)
3494 {
3495     int offset = 0;
3496 
3497     offset = decode_pfcp_pdr_id(tvb, pinfo, tree, item, offset, args);
3498 
3499     if (offset < length) {
3500         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3501     }
3502 }
3503 /*
3504  * 8.2.37   F-SEID
3505  */
3506 static void
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)3507 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)
3508 {
3509     int offset = 0;
3510     guint64 f_seid_flags;
3511     address *ipv4 = NULL, *ipv6 = NULL;
3512     guint64 seid_cp, *seid;
3513     guint32 *session;
3514 
3515     static int * const pfcp_f_seid_flags[] = {
3516         &hf_pfcp_spare_b7,
3517         &hf_pfcp_spare_b6,
3518         &hf_pfcp_spare_b5,
3519         &hf_pfcp_spare_b4,
3520         &hf_pfcp_spare_b3,
3521         &hf_pfcp_spare_b2,
3522         &hf_pfcp_b1_v4,
3523         &hf_pfcp_b0_v6,
3524         NULL
3525     };
3526     /* Octet 5  Spare   Spare   Spare   Spare   Spare   Spare   V4  V6*/
3527     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_f_seid_flags,
3528         ett_pfcp_f_seid_flags, pfcp_f_seid_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &f_seid_flags);
3529     offset += 1;
3530 
3531     if ((f_seid_flags & 0x3) == 0) {
3532         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, 0, 1);
3533         return;
3534     }
3535     /* Octet 6 to 13    SEID  */
3536     //proto_tree_add_item(tree, hf_pfcp_seid, tvb, offset, 8, ENC_BIG_ENDIAN);
3537     proto_tree_add_item_ret_uint64(tree, hf_pfcp_seid, tvb, offset, 8, ENC_BIG_ENDIAN, &seid_cp);
3538     proto_item_append_text(item, "SEID: 0x%s", tvb_bytes_to_str(pinfo->pool, tvb, offset, 8));
3539     offset += 8;
3540     /* IPv4 address (if present)*/
3541     if ((f_seid_flags & 0x2) == 2) {
3542         ipv4 = wmem_new0(pinfo->pool, address);
3543         proto_tree_add_item(tree, hf_pfcp_f_seid_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
3544         proto_item_append_text(item, ", IPv4 %s", tvb_ip_to_str(pinfo->pool, tvb, offset));
3545         set_address_tvb(ipv4, AT_IPv4, 4, tvb, offset);
3546         offset += 4;
3547     }
3548     /* IPv6 address (if present)*/
3549     if ((f_seid_flags & 0x1) == 1) {
3550         ipv6 = wmem_new0(pinfo->pool, address);
3551         proto_tree_add_item(tree, hf_pfcp_f_seid_ipv6, tvb, offset, 16, ENC_NA);
3552         proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset));
3553         set_address_tvb(ipv6, AT_IPv6, 16, tvb, offset);
3554         offset += 16;
3555     }
3556 
3557     if (g_pfcp_session) {
3558         session = (guint32 *)g_hash_table_lookup(pfcp_session_table, &pinfo->num);
3559         if (!session) {
3560             /* We save the seid so that we could assignate its corresponding session ID later */
3561             args->last_seid = seid_cp;
3562             if (!pfcp_seid_exists(seid_cp, args->seid_list)) {
3563                 seid = wmem_new(pinfo->pool, guint64);
3564                 *seid = seid_cp;
3565                 wmem_list_prepend(args->seid_list, seid);
3566             }
3567             if (ipv4 != NULL && !pfcp_ip_exists(*ipv4, args->ip_list)) {
3568                 copy_address_wmem(pinfo->pool, &args->last_ip, ipv4);
3569                 wmem_list_prepend(args->ip_list, ipv4);
3570             }
3571             if (ipv6 != NULL && !pfcp_ip_exists(*ipv6, args->ip_list)) {
3572                 copy_address_wmem(pinfo->pool, &args->last_ip, ipv6);
3573                 wmem_list_prepend(args->ip_list, ipv6);
3574             }
3575         }
3576     }
3577 
3578     if (offset < length) {
3579         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3580     }
3581 }
3582 
3583 /*
3584  *   8.2.38   Node ID
3585  */
3586 
3587 static const value_string pfcp_node_id_type_vals[] = {
3588 
3589     { 0, "IPv4 address" },
3590     { 1, "IPv6 address" },
3591     { 2, "FQDN" },
3592     { 0, NULL }
3593 };
3594 
3595 static int
decode_pfcp_fqdn(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,gint offset,guint16 length)3596 decode_pfcp_fqdn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, gint offset, guint16 length)
3597 {
3598     int name_len, tmp;
3599     guint8 *fqdn = NULL;
3600 
3601     /* FQDN, the Node ID value encoding shall be identical to the encoding of a FQDN
3602     * within a DNS message of section 3.1 of IETF RFC 1035 [27] but excluding the trailing zero byte.
3603     */
3604     if (length > 0)
3605     {
3606         name_len = tvb_get_guint8(tvb, offset);
3607         /* NOTE 1: The FQDN field in the IE is not encoded as a dotted string as commonly used in DNS master zone files. */
3608         if (name_len < 0x40) {
3609             fqdn = tvb_get_string_enc(pinfo->pool, tvb, offset + 1, length - 2, ENC_ASCII);
3610             for (;;) {
3611                 if (name_len >= length - 2)
3612                     break;
3613                 tmp = name_len;
3614                 name_len = name_len + fqdn[tmp] + 1;
3615                 fqdn[tmp] = '.';
3616             }
3617         }
3618         /* In case the FQDN field is incorrectly in dotted string form.*/
3619         else {
3620             fqdn = tvb_get_string_enc(pinfo->pool, tvb, offset, length - 1, ENC_ASCII);
3621             proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, offset, length - 1);
3622         }
3623         proto_tree_add_string(tree, hf_pfcp_node_id_fqdn, tvb, offset, length - 1, fqdn);
3624         proto_item_append_text(item, "%s", fqdn);
3625         offset += length - 1;
3626     }
3627     return offset;
3628 }
3629 
3630 static int
decode_pfcp_address(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,gint offset,guint16 length)3631 decode_pfcp_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, gint offset, guint16 length)
3632 {
3633     guint32 node_id_type;
3634 
3635     /* Octet 5    Spare Node ID Type*/
3636     proto_tree_add_item(tree, hf_pfcp_spare_h1, tvb, offset, 1, ENC_BIG_ENDIAN);
3637     proto_tree_add_item_ret_uint(tree, hf_pfcp_node_id_type, tvb, offset, 1, ENC_BIG_ENDIAN, &node_id_type);
3638     proto_item_append_text(item, "%s: ", val_to_str_const(node_id_type, pfcp_node_id_type_vals, "Unknown"));
3639     offset++;
3640 
3641     switch (node_id_type) {
3642         case 0:
3643             /* IPv4 address */
3644             proto_tree_add_item(tree, hf_pfcp_node_id_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
3645             proto_item_append_text(item, "%s", tvb_ip_to_str(pinfo->pool, tvb, offset));
3646             offset += 4;
3647             break;
3648         case 1:
3649             /* IPv6 address */
3650             proto_tree_add_item(tree, hf_pfcp_node_id_ipv6, tvb, offset, 16, ENC_NA);
3651             proto_item_append_text(item, "%s", tvb_ip6_to_str(pinfo->pool, tvb, offset));
3652             offset += 16;
3653             break;
3654         case 2:
3655             /* FQDN */
3656             offset = decode_pfcp_fqdn(tvb, pinfo, tree, item, offset, length);
3657             break;
3658         default:
3659             break;
3660     }
3661     return offset;
3662 }
3663 static void
dissect_pfcp_node_id(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)3664 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_)
3665 {
3666     int offset = 0;
3667 
3668     offset = decode_pfcp_address(tvb, pinfo, tree, item, offset, length);
3669 
3670     if (offset < length) {
3671         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3672     }
3673 
3674 }
3675 /*
3676  * 8.2.39   PFD Contents
3677  */
3678 static void
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_)3679 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_)
3680 {
3681     int offset = 0;
3682     int dissected_len = 0;
3683     guint64 flags;
3684     guint32 len;
3685     proto_tree *afd_tree, *aurl_tree, *adnp_tree;
3686 
3687     static int * const pfcp_pfd_contents_flags[] = {
3688         &hf_pfcp_pfd_contents_flags_b7_adnp,
3689         &hf_pfcp_pfd_contents_flags_b6_aurl,
3690         &hf_pfcp_pfd_contents_flags_b5_afd,
3691         &hf_pfcp_pfd_contents_flags_b4_dnp,
3692         &hf_pfcp_pfd_contents_flags_b3_cp,
3693         &hf_pfcp_pfd_contents_flags_b2_dn,
3694         &hf_pfcp_pfd_contents_flags_b1_url,
3695         &hf_pfcp_pfd_contents_flags_b0_fd,
3696         NULL
3697     };
3698     /* Octet 5  ADNP   AURL   AFD   DNP   CP   DN   URL   FD */
3699     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_pfd_contents_flags,
3700         ett_pfcp_measurement_method_flags, pfcp_pfd_contents_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
3701     offset += 1;
3702 
3703     // Octet 6 Spare Octet
3704     proto_tree_add_item(tree, hf_pfcp_spare_oct, tvb, offset, 1, ENC_BIG_ENDIAN);
3705     offset += 1;
3706 
3707     /* Bit 1 - FD (Flow Description): If this bit is set to "1", then the Length of Flow Description
3708      * and the Flow Description fields shall be present
3709      */
3710     if (flags & 0x1) {
3711         /* The Flow Description field, when present, shall be encoded as an OctetString
3712         * as specified in subclause 6.4.3.7 of 3GPP TS 29.251
3713         */
3714         /* m to (m+1)   Length of Flow Description */
3715         proto_tree_add_item_ret_uint(tree, hf_pfcp_flow_desc_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
3716         offset += 2;
3717 
3718         /* (m+2) to p   Flow Description */
3719         proto_tree_add_item(tree, hf_pfcp_flow_desc, tvb, offset, len, ENC_ASCII|ENC_NA);
3720         offset += len;
3721     }
3722 
3723     /* Bit 2 - URL (URL): The URL field, when present,
3724      * shall be encoded as an OctetString as specified in subclause 6.4.3.8 of 3GPP TS 29.251 [21].
3725     */
3726     if (flags & 0x2) {
3727         /* q to (q+1)   Length of URL */
3728         proto_tree_add_item_ret_uint(tree, hf_pfcp_url_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
3729         offset += 2;
3730 
3731         /* (q+2) to r   URL */
3732         proto_tree_add_item(tree, hf_pfcp_url, tvb, offset, len, ENC_ASCII|ENC_NA);
3733         offset += len;
3734 
3735     }
3736 
3737     /* Bit 3 - DN (Domain Name): The Domain Name field, when present,
3738      * shall be encoded as an OctetString as specified in subclause 6.4.3.9 of 3GPP TS 29.251 [21].
3739      */
3740     if (flags & 0x4) {
3741         /* s to (s+1)   Length of Domain Name */
3742         proto_tree_add_item_ret_uint(tree, hf_pfcp_dn_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
3743         offset += 2;
3744 
3745         /* (s+2) to t   Domain Name */
3746         proto_tree_add_item(tree, hf_pfcp_dn, tvb, offset, len, ENC_ASCII|ENC_NA);
3747         offset += len;
3748     }
3749 
3750     /* Bit 4 - CP (Custom PFD Content): If this bit is set to "1", then the Length of Custom PFD Content and
3751      * the Custom PFD Content fields shall be present
3752      */
3753     if (flags & 0x8) {
3754         /* u to (u+1)   Length of Custom PFD Content */
3755         proto_tree_add_item_ret_uint(tree, hf_pfcp_cp_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
3756         offset += 2;
3757 
3758         /* (u+2) to v   Custom PFD Content */
3759         proto_tree_add_item(tree, hf_pfcp_cp, tvb, offset, len, ENC_NA);
3760         offset += len;
3761     }
3762 
3763     /* Bit 5 - DNP (Domain Name Protocol): If this bit is set to "1", then the Length of Domain Name Protocol and
3764      * the Domain Name Protocol shall be present, otherwise they shall not be present; and if this bit is set to "1",
3765      * the Length of Domain Name and the Domain Name fields shall also be present.
3766      */
3767     if (flags & 0x10) {
3768         /* The Domain Name Protocol field, when present, shall be encoded as an OctetString
3769          * as specified in subclause 6.4.3.x of 3GPP TS 29.251 [21].
3770         */
3771         /* w to (w+1)   Length of Domain Name Protocol */
3772         proto_tree_add_item_ret_uint(tree, hf_pfcp_dnp_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
3773         offset += 2;
3774 
3775         /* (w+2) to x   Domain Name Protocol */
3776         proto_tree_add_item(tree, hf_pfcp_dnp, tvb, offset, len, ENC_ASCII|ENC_NA);
3777         offset += len;
3778     }
3779 
3780 
3781     /* Bit 6 - AFD (Additional Flow Description): If this bit is set to "1",
3782      * the Length of Additional Flow Description and the Additional Flow Description field shall be present,
3783      * otherwise they shall not be present.
3784     */
3785     if (flags & 0x20) {
3786         /* y to (y+1)   Length of Additional Flow Description */
3787         proto_tree_add_item_ret_uint(tree, hf_pfcp_afd_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
3788         offset += 2;
3789 
3790         /* (y+2) to z   Additional Flow Description */
3791         dissected_len = 0;
3792         afd_tree = proto_item_add_subtree(item, ett_pfcp_adf);
3793         while (dissected_len < (int)len) {
3794             guint32 flow_desc_len;
3795             /* (y+2) to (y+3)   Length of Flow Description */
3796             proto_tree_add_item_ret_uint(afd_tree, hf_pfcp_flow_desc_len, tvb, offset, 2, ENC_BIG_ENDIAN, &flow_desc_len);
3797             offset += 2;
3798             dissected_len += 2;
3799 
3800             /* (y+4) to i   Flow Description */
3801             proto_tree_add_item(afd_tree, hf_pfcp_flow_desc, tvb, offset+2, flow_desc_len, ENC_ASCII|ENC_NA);
3802             offset += flow_desc_len;
3803             dissected_len += flow_desc_len;
3804         }
3805     }
3806 
3807     /* Bit 7 - AURL (Additional URL): If this bit is set to "1",
3808      * the Length of Additional URL and the Additional URL field shall be present,
3809      * otherwise they shall not be present.
3810      */
3811     if (flags & 0x40) {
3812         /* a to (a+1)   Length of Additional URL */
3813         proto_tree_add_item_ret_uint(tree, hf_pfcp_aurl_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
3814         offset += 2;
3815 
3816         /* (a+2) to b   Additional URL */
3817         dissected_len = 0;
3818         aurl_tree = proto_item_add_subtree(item, ett_pfcp_aurl);
3819         while (dissected_len < (int)len) {
3820             guint32 url_len;
3821             /* (a+2) to (a+3)   Length of URL */
3822             proto_tree_add_item_ret_uint(aurl_tree, hf_pfcp_url_len, tvb, offset, 2, ENC_BIG_ENDIAN, &url_len);
3823             dissected_len += 2;
3824             offset += 2;
3825 
3826             /* (a+4) to o   URL */
3827             proto_tree_add_item(aurl_tree, hf_pfcp_url, tvb, offset, url_len, ENC_ASCII|ENC_NA);
3828             dissected_len += url_len;
3829             offset += url_len;
3830         }
3831     }
3832 
3833     /* Bit 8 - ADNP (Additional Domain Name and Domain Name Protocol): If this bit is set to "1",
3834      * the Length of Additional Domain Name and Domain Name Protocol, and the Additional Domain Name and
3835      * Domain Name Protocol field shall be present, otherwise they shall not be present.
3836      */
3837     if (flags & 0x80) {
3838         /* c to (c+1)   Length of Additional Domain Name and Domain Name Protocol */
3839         proto_tree_add_item_ret_uint(tree, hf_pfcp_adnp_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
3840         offset += 2;
3841 
3842         /* (c+2) to d   Additional Domain Name and Domain Name Protocol */
3843         dissected_len = 0;
3844         adnp_tree = proto_item_add_subtree(item, ett_pfcp_adnp);
3845         while (dissected_len < (int)len) {
3846             guint32 domain_name_len, domain_name_prot_len;
3847             /* (c+2) to (c+3)   Length of Domain Name */
3848             proto_tree_add_item_ret_uint(adnp_tree, hf_pfcp_dn_len, tvb, offset, 2, ENC_BIG_ENDIAN, &domain_name_len);
3849             dissected_len += 2;
3850             offset += 2;
3851 
3852             /* (c+4) to pd   Domain Name */
3853             proto_tree_add_item(adnp_tree, hf_pfcp_dn, tvb, offset, domain_name_len, ENC_ASCII|ENC_NA);
3854             dissected_len += domain_name_len;
3855             offset += domain_name_len;
3856 
3857             /* (pe) to (pe+1)   Length of Domain Name Protocol */
3858             proto_tree_add_item_ret_uint(adnp_tree, hf_pfcp_dnp_len, tvb, offset, 2, ENC_BIG_ENDIAN, &domain_name_prot_len);
3859             dissected_len += 2;
3860             offset += 2;
3861 
3862             /* (pe+2) to ph   Domain Name Protocol */
3863             proto_tree_add_item(adnp_tree, hf_pfcp_dnp, tvb, offset, domain_name_prot_len, ENC_ASCII|ENC_NA);
3864             dissected_len += domain_name_prot_len;
3865             offset += domain_name_prot_len;
3866         }
3867     }
3868 
3869     if (offset < length) {
3870         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3871     }
3872 
3873 }
3874 /*
3875  * 8.2.40   Measurement Method
3876  */
3877 static void
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_)3878 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_)
3879 {
3880     int offset = 0;
3881 
3882     static int * const pfcp_measurement_method_flags[] = {
3883         &hf_pfcp_spare_b7_b3,
3884         &hf_pfcp_measurement_method_flags_b2_event,
3885         &hf_pfcp_measurement_method_flags_b1_volume,
3886         &hf_pfcp_measurement_method_flags_b0_durat,
3887         NULL
3888     };
3889     /* Octet 5  Spare   Spare   Spare   Spare   Spare   EVENT   VOLUM   DURAT */
3890     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_measurement_method_flags,
3891         ett_pfcp_measurement_method_flags, pfcp_measurement_method_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
3892     offset += 1;
3893 
3894     if (offset < length) {
3895         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3896     }
3897 
3898 }
3899 
3900 /*
3901  * 8.2.41   Usage Report Trigger
3902  */
3903 static void
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_)3904 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_)
3905 {
3906     int offset = 0;
3907 
3908     static int * const pfcp_usage_report_trigger_o5_flags[] = {
3909         &hf_pfcp_usage_report_trigger_o5_b7_immer,
3910         &hf_pfcp_usage_report_trigger_o5_b6_droth,
3911         &hf_pfcp_usage_report_trigger_o5_b5_stopt,
3912         &hf_pfcp_usage_report_trigger_o5_b4_start,
3913         &hf_pfcp_usage_report_trigger_o5_b3_quhti,
3914         &hf_pfcp_usage_report_trigger_o5_b2_timth,
3915         &hf_pfcp_usage_report_trigger_o5_b1_volth,
3916         &hf_pfcp_usage_report_trigger_o5_b0_perio,
3917         NULL
3918     };
3919     /* Octet 5  IMMER   DROTH   STOPT   START   QUHTI   TIMTH   VOLTH   PERIO */
3920     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_usage_report_trigger_o5_flags, ENC_BIG_ENDIAN);
3921     offset++;
3922 
3923     if (offset == length) {
3924         return;
3925     }
3926 
3927     static int * const pfcp_usage_report_trigger_o6_flags[] = {
3928         &hf_pfcp_usage_report_trigger_o6_b7_eveth,
3929         &hf_pfcp_usage_report_trigger_o6_b6_macar,
3930         &hf_pfcp_usage_report_trigger_o6_b5_envcl,
3931         &hf_pfcp_usage_report_trigger_o6_b4_monit,
3932         &hf_pfcp_usage_report_trigger_o6_b3_termr,
3933         &hf_pfcp_usage_report_trigger_o6_b2_liusa,
3934         &hf_pfcp_usage_report_trigger_o6_b1_timqu,
3935         &hf_pfcp_usage_report_trigger_o6_b0_volqu,
3936         NULL
3937     };
3938     /* Octet 6  EVETH   MACAR   ENVCL   MONIT   TERMR   LIUSA   TIMQU   VOLQU */
3939     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_usage_report_trigger_o6_flags, ENC_BIG_ENDIAN);
3940     offset++;
3941 
3942     if (offset == length) {
3943         return;
3944     }
3945 
3946     static int * const pfcp_usage_report_trigger_o7_flags[] = {
3947         &hf_pfcp_spare_b7_b5,
3948         &hf_pfcp_usage_report_trigger_o7_b4_emrre,
3949         &hf_pfcp_usage_report_trigger_o7_b3_quvti,
3950         &hf_pfcp_usage_report_trigger_o7_b2_ipmjl,
3951         &hf_pfcp_usage_report_trigger_o7_b1_tebur,
3952         &hf_pfcp_usage_report_trigger_o7_b0_evequ,
3953         NULL
3954     };
3955     /* Octet 7  Spare   Spare   Spare   EMRRE   QUVTI   IPMJL   TEBUR   EVEQU */
3956     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_usage_report_trigger_o7_flags, ENC_BIG_ENDIAN);
3957     offset++;
3958 
3959     if (offset == length) {
3960         return;
3961     }
3962 
3963     if (offset < length) {
3964         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3965     }
3966 
3967 }
3968 
3969 /*
3970  * 8.2.42   Measurement Period
3971  */
3972 static void
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_)3973 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_)
3974 {
3975     int offset = 0;
3976     guint32 value;
3977     /* 5 to 8   Measurement Period*/
3978     proto_tree_add_item_ret_uint(tree, hf_pfcp_measurement_period, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
3979     offset += 4;
3980 
3981     proto_item_append_text(item, "%u", value);
3982 
3983     if (offset < length) {
3984         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3985     }
3986 }
3987 
3988 /*
3989  * 8.2.43   Fully qualified PDN Connection Set Identifier (FQ-CSID)
3990  */
3991 static const value_string pfcp_fq_csid_node_id_type_vals[] = {
3992 
3993     { 0, "Node-Address is a global unicast IPv4 address" },
3994     { 1, "Node-Address is a global unicast IPv6 address" },
3995     { 2, "Node-Address is a 4 octets long field" },
3996     { 0, NULL }
3997 };
3998 
3999 static const value_string pfcp_fq_csid_node_type_vals[] = {
4000 
4001     { 0, "MME" },
4002     { 1, "SGW-C" },
4003     { 2, "PGW-C" },
4004     { 3, "ePDG" },
4005     { 4, "TWAN" },
4006     { 5, "PGW-U/SGW-U" },
4007     { 0, NULL }
4008 };
4009 
4010 static void
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_)4011 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_)
4012 {
4013     int offset = 0;
4014     guint32 node_id_type, num_csid;
4015 
4016     /* Octet 5  FQ-CSID Node-ID Type    Number of CSIDs= m*/
4017     proto_tree_add_item_ret_uint(tree, hf_pfcp_fq_csid_node_id_type, tvb, offset, 1, ENC_BIG_ENDIAN, &node_id_type);
4018     proto_tree_add_item_ret_uint(tree, hf_pfcp_num_csid, tvb, offset, 1, ENC_BIG_ENDIAN, &num_csid);
4019     offset++;
4020 
4021     /* 6 to p   Node-Address  */
4022     switch (node_id_type) {
4023     case 0:
4024         /* 0    indicates that Node-Address is a global unicast IPv4 address and p = 9 */
4025         proto_tree_add_item(tree, hf_pfcp_fq_csid_node_id_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
4026         offset += 4;
4027         break;
4028     case 1:
4029         /* 1    indicates that Node-Address is a global unicast IPv6 address and p = 21 */
4030         proto_tree_add_item(tree, hf_pfcp_fq_csid_node_id_ipv6, tvb, offset, 16, ENC_NA);
4031         offset += 16;
4032         break;
4033     case 2:
4034         /* 2    indicates that Node-Address is a 4 octets long field with a 32 bit value stored in network order, and p= 9
4035          *      Most significant 20 bits are the binary encoded value of (MCC * 1000 + MNC).
4036          *      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
4037          */
4038         proto_tree_add_item(tree, hf_pfcp_fq_csid_node_id_mcc_mnc, tvb, offset, 4, ENC_BIG_ENDIAN);
4039         proto_tree_add_item(tree, hf_pfcp_fq_csid_node_id_int, tvb, offset, 4, ENC_BIG_ENDIAN);
4040         offset += 4;
4041         break;
4042     default:
4043         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4044         break;
4045     }
4046 
4047     while (num_csid > 0) {
4048         proto_tree_add_item(tree, hf_pfcp_fq_csid, tvb, offset, 2, ENC_BIG_ENDIAN);
4049         offset += 2;
4050         num_csid--;
4051     }
4052 
4053     if (offset < length) {
4054         proto_tree_add_item(tree, hf_pfcp_spare_b7_b4, tvb, offset, 1, ENC_BIG_ENDIAN);
4055         proto_tree_add_item(tree, hf_pfcp_fq_csid_node_type, tvb, offset, 1, ENC_BIG_ENDIAN);
4056         offset++;
4057     }
4058 
4059     if (offset < length) {
4060         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4061     }
4062 
4063 }
4064 /*
4065  * 8.2.44   Volume Measurement
4066  */
4067 static void
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_)4068 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_)
4069 {
4070     int offset = 0;
4071     guint64 flags;
4072 
4073     static int * const pfcp_volume_measurement_flags[] = {
4074         &hf_pfcp_spare_b7_b6,
4075         &hf_pfcp_volume_measurement_b5_dlnop,
4076         &hf_pfcp_volume_measurement_b4_ulnop,
4077         &hf_pfcp_volume_measurement_b3_tonop,
4078         &hf_pfcp_volume_measurement_b2_dlvol,
4079         &hf_pfcp_volume_measurement_b1_ulvol,
4080         &hf_pfcp_volume_measurement_b0_tovol,
4081         NULL
4082     };
4083     /* Octet 5  Spare   DLNOP   ULNOP   TONOP   DLVOL   ULVOL   TOVOL*/
4084     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_volume_measurement,
4085         ett_pfcp_volume_measurement, pfcp_volume_measurement_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
4086     offset += 1;
4087 
4088     /* Bit 1 - TOVOL: If this bit is set to "1", then the Total Volume field shall be present*/
4089     if ((flags & 0x1)) {
4090         /* m to (m+7)   Total Volume */
4091         proto_tree_add_item(tree, hf_pfcp_vol_meas_tovol, tvb, offset, 8, ENC_BIG_ENDIAN);
4092         offset += 8;
4093     }
4094     /* Bit 2 - ULVOL: If this bit is set to "1", then the Total Volume field shall be present*/
4095     if ((flags & 0x2)) {
4096         /* p to (p+7)   Uplink Volume */
4097         proto_tree_add_item(tree, hf_pfcp_vol_meas_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
4098         offset += 8;
4099     }
4100     /* Bit 3 - DLVOL: If this bit is set to "1", then the Total Volume field shall be present*/
4101     if ((flags & 0x4)) {
4102         /*q to (q+7)    Downlink Volume */
4103         proto_tree_add_item(tree, hf_pfcp_vol_meas_dlvol, tvb, offset, 8, ENC_BIG_ENDIAN);
4104         offset += 8;
4105     }
4106     /* Bit 4 - TONOP: If this bit is set to "1", then the Total Number of Packets field shall be present*/
4107     if ((flags & 0x8)) {
4108         /* r to (r+7)   Total Number of Packets */
4109         proto_tree_add_item(tree, hf_pfcp_vol_meas_tonop, tvb, offset, 8, ENC_BIG_ENDIAN);
4110         offset += 8;
4111     }
4112     /* Bit 5 - ULNOP: If this bit is set to "1", then the Total Number of Packets field shall be present*/
4113     if ((flags & 0x10)) {
4114         /* s to (s+7)   Uplink Number of Packets */
4115         proto_tree_add_item(tree, hf_pfcp_vol_meas_ulnop, tvb, offset, 8, ENC_BIG_ENDIAN);
4116         offset += 8;
4117     }
4118     /* Bit 6 - DLNOP: If this bit is set to "1", then the Total Number of Packets field shall be present*/
4119     if ((flags & 0x20)) {
4120         /*t to (t+7)    Downlink Number of Packets */
4121         proto_tree_add_item(tree, hf_pfcp_vol_meas_dlnop, tvb, offset, 8, ENC_BIG_ENDIAN);
4122         offset += 8;
4123     }
4124 
4125     if (offset < length) {
4126         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4127     }
4128 
4129 }
4130 /*
4131  * 8.2.45   Duration Measurement
4132  */
4133 static void
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_)4134 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_)
4135 {
4136     int offset = 0;
4137     guint32 value;
4138     /* 5 to 8   Duration value*/
4139     proto_tree_add_item_ret_uint(tree, hf_pfcp_duration_measurement, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
4140     offset += 4;
4141 
4142     proto_item_append_text(item, "%u s", value);
4143 
4144     if (offset < length) {
4145         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4146     }
4147 }
4148 /*
4149  * 8.2.46   Time of First Packet
4150  */
4151 static void
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_)4152 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_)
4153 {
4154     int offset = 0;
4155     char *time_str;
4156 
4157     /* Octets 5 to 8 shall be encoded in the same format as the first four octets of the 64-bit timestamp
4158      * format as defined in section 6 of IETF RFC 5905
4159      */
4160 
4161     proto_tree_add_item_ret_time_string(tree, hf_pfcp_time_of_first_packet, tvb, offset, 4, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str);
4162     proto_item_append_text(item, "%s", time_str);
4163     offset += 4;
4164 
4165     if (offset < length) {
4166         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4167     }
4168 }
4169 /*
4170  * 8.2.47   Time of Last Packet
4171  */
4172 static void
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_)4173 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_)
4174 {
4175     int offset = 0;
4176     char *time_str;
4177 
4178     /* Octets 5 to 8 shall be encoded in the same format as the first four octets of the 64-bit timestamp
4179     * format as defined in section 6 of IETF RFC 5905
4180     */
4181 
4182     proto_tree_add_item_ret_time_string(tree, hf_pfcp_time_of_last_packet, tvb, offset, 4, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str);
4183     proto_item_append_text(item, "%s", time_str);
4184     offset += 4;
4185 
4186     if (offset < length) {
4187         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4188     }
4189 }
4190 /*
4191  * 8.2.48   Quota Holding Time
4192  */
4193 static void
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_)4194 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_)
4195 {
4196     int offset = 0;
4197     guint32 value;
4198     /* Octet 5 to 8    Time Quota value
4199     * TThe Time Quota value shall be encoded as an Unsigned32 binary integer value. It contains a duration in seconds
4200     */
4201     proto_tree_add_item_ret_uint(tree, hf_pfcp_quota_holding_time, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
4202     offset += 4;
4203 
4204     proto_item_append_text(item, "%u s", value);
4205 
4206     if (offset < length) {
4207         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4208     }
4209 
4210 }
4211 
4212 /*
4213  * 8.2.49   Dropped DL Traffic Threshold
4214  */
4215 static void
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_)4216 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_)
4217 {
4218     int offset = 0;
4219     guint64 flags_val;
4220 
4221     static int * const pfcp_dropped_dl_traffic_threshold_flags[] = {
4222         &hf_pfcp_dropped_dl_traffic_threshold_b1_dlby,
4223         &hf_pfcp_dropped_dl_traffic_threshold_b0_dlpa,
4224         NULL
4225     };
4226     /* Octet 5  Spare   DLBY    DLPA*/
4227     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_dropped_dl_traffic_threshold,
4228         ett_pfcp_dropped_dl_traffic_threshold, pfcp_dropped_dl_traffic_threshold_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
4229     offset += 1;
4230 
4231     if ((flags_val & 0x1) == 1) {
4232         /* m to (m+7)   Downlink Packets
4233         * DLPA: If this bit is set to "1", then the Downlink Packets field shall be present
4234         */
4235         proto_tree_add_item(tree, hf_pfcp_downlink_packets, tvb, offset, 8, ENC_BIG_ENDIAN);
4236         offset += 8;
4237     }
4238 
4239     if ((flags_val & 0x2) == 2) {
4240         /* o to (o+7)   Number of Bytes of Downlink Data
4241         * DLBY: If this bit is set to "1", then the Number of Bytes of Downlink Data field shall be present
4242         */
4243         proto_tree_add_item(tree, hf_pfcp_bytes_downlink_data, tvb, offset, 8, ENC_BIG_ENDIAN);
4244         offset += 8;
4245     }
4246 
4247     if (offset < length) {
4248         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4249     }
4250 }
4251 /*
4252  * 8.2.50   Volume Quota
4253  */
4254 static void
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_)4255 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_)
4256 {
4257     int offset = 0;
4258     guint64 flags_val;
4259 
4260     static int * const pfcp_volume_quota_flags[] = {
4261         &hf_pfcp_spare_b7_b3,
4262         &hf_pfcp_volume_quota_b2_dlvol,
4263         &hf_pfcp_volume_quota_b1_ulvol,
4264         &hf_pfcp_volume_quota_b0_tovol,
4265         NULL
4266     };
4267     /* Octet 5  Spare   DLVOL   ULVOL   TOVOL*/
4268     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_volume_quota,
4269         ett_pfcp_volume_quota, pfcp_volume_quota_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
4270     offset += 1;
4271 
4272     /* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value.
4273     * They shall contain the total, uplink or downlink number of octets respectively.
4274     */
4275     if ((flags_val & 0x1) == 1) {
4276         /* m to (m+7)   Total Volume
4277         * TOVOL: If this bit is set to "1", then the Total Volume field shall be present
4278         */
4279         proto_tree_add_item(tree, hf_pfcp_volume_quota_tovol, tvb, offset, 8, ENC_BIG_ENDIAN);
4280         offset += 8;
4281     }
4282     if ((flags_val & 0x2) == 2) {
4283         /* p to (p+7)    Uplink Volume
4284         * ULVOL: If this bit is set to "1", then the Uplink Volume field shall be present
4285         */
4286         proto_tree_add_item(tree, hf_pfcp_volume_quota_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
4287         offset += 8;
4288     }
4289     if ((flags_val & 0x4) == 4) {
4290         /* q to (q+7)   Downlink Volume
4291         * DLVOL: If this bit is set to "1", then the Downlink Volume field shall be present
4292         */
4293         proto_tree_add_item(tree, hf_pfcp_volume_quota_dlvol, tvb, offset, 8, ENC_BIG_ENDIAN);
4294         offset += 8;
4295     }
4296 
4297     if (offset < length) {
4298         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4299     }
4300 }
4301 /*
4302  * 8.2.51   Time Quota
4303  */
4304 static void
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_)4305 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_)
4306 {
4307     int offset = 0;
4308     guint32 value;
4309     /* Octet 5 to 8    Time Quota value
4310     * TThe Time Quota value shall be encoded as an Unsigned32 binary integer value. It contains a duration in seconds
4311     */
4312     proto_tree_add_item_ret_uint(tree, hf_pfcp_time_quota, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
4313     offset += 4;
4314 
4315     proto_item_append_text(item, "%u s", value);
4316 
4317     if (offset < length) {
4318         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4319     }
4320 
4321 }
4322 /*
4323  * 8.2.52   Start Time
4324  */
4325 static void
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_)4326 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_)
4327 {
4328     char *time_str;
4329     int offset = 0;
4330 
4331     /* The Start Time field shall contain a UTC time. Octets 5 to 8 are encoded in the same format as
4332     * the first four octets of the 64-bit timestamp format as defined in section 6 of IETF RFC 5905 [26].
4333     */
4334     proto_tree_add_item_ret_time_string(tree, hf_pfcp_start_time, tvb, offset, 4, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str);
4335     proto_item_append_text(item, "%s", time_str);
4336     offset += 4;
4337 
4338     if (offset < length) {
4339         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4340     }
4341 
4342 }
4343 /*
4344  * 8.2.53   End Time
4345  */
4346 static void
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_)4347 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_)
4348 {
4349     char *time_str;
4350     int offset = 0;
4351 
4352     /* The End Time field shall contain a UTC time. Octets 5 to 8 are encoded in the same format as
4353     * the first four octets of the 64-bit timestamp format as defined in section 6 of IETF RFC 5905 [26].
4354     */
4355     proto_tree_add_item_ret_time_string(tree, hf_pfcp_end_time, tvb, offset, 4, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str);
4356     proto_item_append_text(item, "%s", time_str);
4357     offset += 4;
4358 
4359     if (offset < length) {
4360         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4361     }
4362 
4363 }
4364 
4365 /*
4366  * 8.2.54   URR ID
4367  */
4368 static int
decode_pfcp_urr_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint offset,pfcp_session_args_t * args)4369 decode_pfcp_urr_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint offset, pfcp_session_args_t *args)
4370 {
4371     guint32 urr_id;
4372     /* Octet 5 to 8 URR ID value
4373     * The bit 8 of octet 5 is used to indicate if the Rule ID is dynamically allocated by the CP function
4374     * or predefined in the UP function. If set to 0, it indicates that the Rule is dynamically provisioned
4375     * by the CP Function. If set to 1, it indicates that the Rule is predefined in the UP Function
4376     */
4377     urr_id = tvb_get_guint32(tvb, offset, ENC_BIG_ENDIAN);
4378 
4379     proto_tree_add_item(tree, hf_pfcp_urr_id_flg, tvb, offset, 4, ENC_BIG_ENDIAN);
4380     proto_tree_add_item(tree, hf_pfcp_urr_id, tvb, offset, 4, ENC_BIG_ENDIAN);
4381     offset += 4;
4382 
4383     proto_item_append_text(item, "%s %u",
4384         tfs_get_string((urr_id & 0x80000000), &pfcp_id_predef_dynamic_tfs),
4385         (urr_id & 0x7fffffff));
4386 
4387     if (args) {
4388         args->last_rule_ids.urr = urr_id;
4389     }
4390 
4391     return offset;
4392 }
4393 
4394 static void
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)4395 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)
4396 {
4397     int offset = 0;
4398 
4399     offset = decode_pfcp_urr_id(tvb, pinfo, tree, item, offset, args);
4400 
4401     if (offset < length) {
4402         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4403     }
4404 
4405 }
4406 /*
4407  * 8.2.55   Linked URR ID IE
4408  */
4409 static void
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_)4410 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_)
4411 {
4412     int offset = 0;
4413 
4414     /* Octet 5 to 8 Linked URR ID value
4415     * The Linked URR ID value shall be encoded as an Unsigned32 binary integer value
4416     */
4417     offset = decode_pfcp_urr_id(tvb, pinfo, tree, item, offset, NULL);
4418 
4419     if (offset < length) {
4420         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4421     }
4422 
4423 }
4424 /*
4425  * 8.2.56   Outer Header Creation
4426  */
4427 
4428 static const value_string pfcp_outer_hdr_desc_vals[] = {
4429 
4430     { 0x000100, "GTP-U/UDP/IPv4 " },
4431     { 0x000200, "GTP-U/UDP/IPv6 " },
4432     { 0x000300, "GTP-U/UDP/IPv4/IPv6 " },
4433     { 0x000400, "UDP/IPv4 " },
4434     { 0x000800, "UDP/IPv6 " },
4435     { 0x000C00, "UDP/IPv4/IPv6 " },
4436     { 0x001000, "IPv4 " },
4437     { 0x002000, "IPv6 " },
4438     { 0x003000, "IPv4/IPv6 " },
4439     { 0x004000, "C-TAG " },
4440     { 0x008000, "S-TAG " },
4441     { 0x010000, "N19 Indication " },
4442     { 0x020000, "N6 Indication " },
4443     { 0x040000, "Low Layer SSM and C-TEID " },
4444     { 0, NULL }
4445 };
4446 
4447 static void
dissect_pfcp_outer_header_creation(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)4448 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_)
4449 {
4450     int offset = 0;
4451     guint32 value;
4452 
4453     /* Octet 5  Outer Header Creation Description */
4454     proto_tree_add_item_ret_uint(tree, hf_pfcp_outer_hdr_desc, tvb, offset, 2, ENC_BIG_ENDIAN, &value);
4455     offset += 2;
4456 
4457     /* m to (m+3)   TEID
4458      * The TEID field shall be present if the Outer Header Creation Description requests the creation of a GTP-U header.
4459      * Otherwise it shall not be present
4460      */
4461     if ((value & 0x000100) || (value & 0x000200)) {
4462         proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_teid, tvb, offset, 4, ENC_BIG_ENDIAN);
4463         offset += 4;
4464     }
4465 
4466     /*
4467     * p to (p+3)   IPv4
4468     * The IPv4 Address field shall be present if the Outer Header Creation Description requests the creation of a IPv4 header
4469     */
4470     if ((value & 0x000100) || (value & 0x000400) || (value & 0x001000)) {
4471         proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
4472         offset += 4;
4473     }
4474 
4475     /*
4476     * q to (q+15)   IPv6
4477     * The IPv6 Address field shall be present if the Outer Header Creation Description requests the creation of a IPv6 header
4478     */
4479     if ((value & 0x000200) || (value & 0x000800) || (value & 0x002000)) {
4480         proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_ipv6, tvb, offset, 16, ENC_NA);
4481         offset += 16;
4482     }
4483 
4484     /*
4485     * r to (r+1)   Port Number
4486     * The Port Number field shall be present if the Outer Header Creation Description requests the creation of a UDP/IP header
4487     */
4488     if ((value & 0x000400) || (value & 0x000800)) {
4489         proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_port, tvb, offset, 2, ENC_BIG_ENDIAN);
4490         offset += 2;
4491     }
4492 
4493     /*
4494     * t to (t+2)   C-TAG
4495     * The C-TAG field shall be present if the Outer Header Creation Description requests the setting of the C-Tag in Ethernet packet
4496     */
4497     if (value & 0x004000) {
4498         offset = decode_pfcp_c_tag(tvb, pinfo, tree, item, offset);
4499     }
4500 
4501     /*
4502     * u to (u+2)   S-TAG
4503     * The S-TAG field shall be present if the Outer Header Creation Description requests the setting of the S-Tag in Ethernet packet
4504     */
4505     if (value & 0x008000) {
4506         offset = decode_pfcp_s_tag(tvb, pinfo, tree, item, offset);
4507     }
4508 
4509     if (offset < length) {
4510         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4511     }
4512 
4513 }
4514 /*
4515  * 8.2.57   BAR ID
4516  */
4517 static int
decode_pfcp_bar_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item,guint16 offset,pfcp_session_args_t * args)4518 decode_pfcp_bar_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 offset, pfcp_session_args_t *args)
4519 {
4520     guint32 value;
4521     /* Octet 5 BAR ID value
4522     * The BAR ID value shall be encoded as a binary integer value
4523     */
4524     proto_tree_add_item_ret_uint(tree, hf_pfcp_bar_id, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
4525     offset++;
4526     proto_item_append_text(item, "%u", value);
4527 
4528     if (args) {
4529         args->last_rule_ids.bar = value;
4530     }
4531 
4532     return offset;
4533 }
4534 static void
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)4535 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)
4536 {
4537     int offset = 0;
4538 
4539     offset = decode_pfcp_bar_id(tvb, pinfo, tree, item, offset, args);
4540 
4541     if (offset < length) {
4542         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4543     }
4544 
4545 }
4546 
4547 /*
4548  * 8.2.58   CP Function Features
4549  */
4550 static void
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_)4551 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_)
4552 {
4553     int offset = 0;
4554 
4555     static int * const pfcp_cp_function_features_o5_flags[] = {
4556         &hf_pfcp_cp_function_features_o5_b7_uiaur,
4557         &hf_pfcp_cp_function_features_o5_b6_ardr,
4558         &hf_pfcp_cp_function_features_o5_b5_mpas,
4559         &hf_pfcp_cp_function_features_o5_b4_bundl,
4560         &hf_pfcp_cp_function_features_o5_b3_sset,
4561         &hf_pfcp_cp_function_features_o5_b2_epfar,
4562         &hf_pfcp_cp_function_features_o5_b1_ovrl,
4563         &hf_pfcp_cp_function_features_o5_b0_load,
4564         NULL
4565     };
4566     /* Octet 5  UIAUR   ARDR    MPAS    BUNDL   SSET   EPFAR   OVRL   LOAD */
4567     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_cp_function_features_o5_flags, ENC_BIG_ENDIAN);
4568     offset++;
4569 
4570     if (offset == length) {
4571         return;
4572     }
4573 
4574     static int * const pfcp_cp_function_features_o6_flags[] = {
4575         &hf_pfcp_spare_b7_b1,
4576         &hf_pfcp_cp_function_features_o6_b0_psucc,
4577         NULL
4578     };
4579     /* Octet 6  Spare   Spare    Spare    Spare   Spare   Spare   Spare   PSUCC */
4580     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_cp_function_features_o6_flags, ENC_BIG_ENDIAN);
4581     offset++;
4582 
4583     if (offset < length) {
4584         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4585     }
4586 
4587 }
4588 
4589 /*
4590  * 8.2.59   Usage Information
4591  */
4592 static void
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_)4593 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_)
4594 {
4595     int offset = 0;
4596 
4597     static int * const pfcp_usage_information_flags[] = {
4598         &hf_pfcp_spare_h1,
4599         &hf_pfcp_usage_information_b3_ube,
4600         &hf_pfcp_usage_information_b2_uae,
4601         &hf_pfcp_usage_information_b1_aft,
4602         &hf_pfcp_usage_information_b0_bef,
4603         NULL
4604     };
4605     /* Octet 5  Spare   UBE UAE AFT BEF */
4606     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_usage_information,
4607         ett_pfcp_usage_information, pfcp_usage_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
4608     offset += 1;
4609 
4610     if (offset < length) {
4611         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4612     }
4613 
4614 }
4615 
4616 /*
4617  * 8.2.60   Application Instance ID
4618  */
4619 static void
dissect_pfcp_application_instance_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_)4620 dissect_pfcp_application_instance_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_)
4621 {
4622     int offset = 0;
4623 
4624     /* Octet 5 5 to (n+4)   Application Instance Identifier
4625      * The Application Instance Identifier shall be encoded as an OctetString (see 3GPP TS 29.212)
4626      */
4627     if (tvb_ascii_isprint(tvb, offset, length))
4628     {
4629         const guint8* string_value;
4630         proto_tree_add_item_ret_string(tree, hf_pfcp_application_instance_id_str, tvb, offset, length, ENC_ASCII | ENC_NA, pinfo->pool, &string_value);
4631         proto_item_append_text(item, "%s", string_value);
4632     }
4633     else
4634     {
4635         proto_tree_add_item(tree, hf_pfcp_application_instance_id, tvb, offset, length, ENC_NA);
4636     }
4637 }
4638 
4639 /*
4640  * 8.2.61   Flow Information
4641  */
4642 static const value_string pfcp_flow_dir_vals[] = {
4643     { 0, "Unspecified" },
4644     { 1, "Downlink (traffic to the UE)" },
4645     { 2, "Uplink (traffic from the UE)" },
4646     { 3, "Bidirectional" },
4647     { 0, NULL }
4648 };
4649 
4650 static void
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_)4651 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_)
4652 {
4653     int offset = 0;
4654     guint32 len;
4655     /* Octet 5 Spare    Flow Direction */
4656     proto_tree_add_item(tree, hf_pfcp_spare_b7_b3, tvb, offset, 1, ENC_BIG_ENDIAN);
4657     proto_tree_add_item(tree, hf_pfcp_flow_dir, tvb, offset, 1, ENC_BIG_ENDIAN);
4658     offset++;
4659 
4660     /* 6 to 7   Length of Flow Description */
4661     proto_tree_add_item_ret_uint(tree, hf_pfcp_flow_desc_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
4662     offset += 2;
4663     /* Flow Description
4664     * The Flow Description field, when present, shall be encoded as an OctetString
4665     * as specified in subclause 5.4.2 of 3GPP TS 29.212
4666     */
4667     proto_tree_add_item(tree, hf_pfcp_flow_desc, tvb, offset, len, ENC_ASCII|ENC_NA);
4668     offset += len;
4669 
4670     if (offset < length) {
4671         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4672     }
4673 
4674 }
4675 
4676 /*
4677  * 8.2.62   UE IP Address
4678  */
4679 static const true_false_string pfcp_ue_ip_add_sd_flag_vals = {
4680     "Destination IP address",
4681     "Source IP address",
4682 };
4683 
4684 static void
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_)4685 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_)
4686 {
4687     int offset = 0;
4688     guint64 ue_ip_address_flags;
4689 
4690     static int * const pfcp_ue_ip_address_flags[] = {
4691         &hf_pfcp_spare_b7,
4692         &hf_pfcp_ue_ip_address_flag_b6_v6pl,
4693         &hf_pfcp_ue_ip_address_flag_b5_chv6,
4694         &hf_pfcp_ue_ip_address_flag_b4_chv4,
4695         &hf_pfcp_ue_ip_address_flag_b3_v6d,
4696         &hf_pfcp_ue_ip_address_flag_b2_sd,
4697         &hf_pfcp_ue_ip_address_flag_b1_v4,
4698         &hf_pfcp_ue_ip_address_flag_b0_v6,
4699         NULL
4700     };
4701     /* Octet 5  Spare   IPV6PL  CHV6    CHV4   IPv6D   S/D     V4      V6*/
4702     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_ue_ip_address_flags,
4703         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);
4704     offset += 1;
4705 
4706     /* IPv4 address (if present)*/
4707     if ((ue_ip_address_flags & 0x2)) {
4708         proto_tree_add_item(tree, hf_pfcp_ue_ip_addr_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
4709         offset += 4;
4710     }
4711     /* IPv6 address (if present)*/
4712     if ((ue_ip_address_flags & 0x1)) {
4713         proto_tree_add_item(tree, hf_pfcp_ue_ip_add_ipv6, tvb, offset, 16, ENC_NA);
4714         offset += 16;
4715     }
4716     /* IPv6 Prefix Delegation Bits (if present)*/
4717     if ((ue_ip_address_flags & 0x8)) {
4718         proto_tree_add_item(tree, hf_pfcp_ue_ip_add_ipv6_prefix, tvb, offset, 1, ENC_NA);
4719         offset += 1;
4720         proto_tree_add_item(tree, hf_pfcp_ue_ip_add_ipv6pd, tvb, offset, 16, ENC_NA);
4721         offset += 16;
4722     }
4723     /* IPv6 Prefix Lengths (if present)*/
4724     if ((ue_ip_address_flags & 0x40)) {
4725         proto_tree_add_item(tree, hf_pfcp_ue_ip_add_ipv6_prefix_length, tvb, offset, 1, ENC_NA);
4726         offset += 1;
4727     }
4728 
4729     if (offset < length) {
4730         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4731     }
4732 
4733 }
4734 /*
4735  * 8.2.63   Packet Rate
4736  */
4737 static const value_string pfcp_pr_time_unit_vals[] = {
4738     { 0, "Minute" },
4739     { 1, "6 minutes" },
4740     { 2, "Hour" },
4741     { 3, "Day" },
4742     { 4, "Week" },
4743     { 0, NULL }
4744 };
4745 
4746 static void
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_)4747 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_)
4748 {
4749     int offset = 0;
4750     guint64 flags;
4751 
4752     static int * const pfcp_packet_rate_flags[] = {
4753         &hf_pfcp_spare_b7_b4,
4754         &hf_pfcp_packet_rate_b2_aprc,
4755         &hf_pfcp_packet_rate_b1_dlpr,
4756         &hf_pfcp_packet_rate_b0_ulpr,
4757         NULL
4758     };
4759     /* Octet 5  Spare   DLPR    ULPR */
4760     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_packet_rate,
4761         ett_pfcp_packet_rate, pfcp_packet_rate_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
4762     offset += 1;
4763 
4764     /* Bit 1 - ULPR (Uplink Packet Rate): If this bit is set to "1", then octets m to (m+2) shall be present */
4765     if ((flags & 0x1)) {
4766         /* m */
4767         proto_tree_add_item(tree, hf_pfcp_spare_b7_b3, tvb, offset, 1, ENC_BIG_ENDIAN);
4768         proto_tree_add_item(tree, hf_pfcp_ul_time_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
4769         offset += 1;
4770         /* (m+1) to (m+2)   Maximum Uplink Packet Rate */
4771         proto_tree_add_item(tree, hf_pfcp_max_ul_pr, tvb, offset, 2, ENC_BIG_ENDIAN);
4772         offset += 2;
4773     }
4774     /* Bit 2 - DLPR (Downlink Packet Rate): If this bit is set to "1", then octets p to (p+2) shall be present*/
4775     if ((flags & 0x2)) {
4776         /* p */
4777         proto_tree_add_item(tree, hf_pfcp_spare_b7_b3, tvb, offset, 1, ENC_BIG_ENDIAN);
4778         proto_tree_add_item(tree, hf_pfcp_dl_time_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
4779         offset += 1;
4780         /* (p+1) to (p+2)   Maximum Uplink Packet Rate */
4781         proto_tree_add_item(tree, hf_pfcp_max_dl_pr, tvb, offset, 2, ENC_BIG_ENDIAN);
4782         offset += 2;
4783     }
4784     /* Bit 4 - APRC (Additional Packet Rate Control) */
4785     if ((flags & 0x8)) {
4786         /* If bit 1 (ULPR) is set to "1", then octets q to (q+2), the Additional Maximum Uplink Packet Rate shall be present. */
4787         if ((flags & 0x1)) {
4788             /* q */
4789             proto_tree_add_item(tree, hf_pfcp_spare_b7_b3, tvb, offset, 1, ENC_BIG_ENDIAN);
4790             proto_tree_add_item(tree, hf_pfcp_a_ul_time_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
4791             offset += 1;
4792             /* (q+1) to (q+2)   Additional Maximum Uplink Packet Rate */
4793             proto_tree_add_item(tree, hf_pfcp_a_max_ul_pr, tvb, offset, 2, ENC_BIG_ENDIAN);
4794             offset += 2;
4795         }
4796         /* If bit 2 (DLPR) is set to "1", then octets r to (r+2), the Additional Maximum Downlink Packet Rate shall be present. */
4797         if ((flags & 0x2)) {
4798             /* r */
4799             proto_tree_add_item(tree, hf_pfcp_spare_b7_b3, tvb, offset, 1, ENC_BIG_ENDIAN);
4800             proto_tree_add_item(tree, hf_pfcp_a_dl_time_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
4801             offset += 1;
4802             /* (r+1) to (r+2)   Additional Maximum Uplink Packet Rate */
4803             proto_tree_add_item(tree, hf_pfcp_a_max_dl_pr, tvb, offset, 2, ENC_BIG_ENDIAN);
4804             offset += 2;
4805         }
4806     }
4807 
4808     if (offset < length) {
4809         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4810     }
4811 
4812 }
4813 
4814 /*
4815  * 8.2.64   Outer Header Removal
4816  */
4817 static const value_string pfcp_out_hdr_desc_vals[] = {
4818     { 0, "GTP-U/UDP/IPv4" },
4819     { 1, "GTP-U/UDP/IPv6" },
4820     { 2, "UDP/IPv4" },
4821     { 3, "UDP/IPv6 " },
4822     { 4, "IPv4" },
4823     { 5, "IPv6 " },
4824     { 6, "GTP-U/UDP/IP" },
4825     { 7, "VLAN S-TAG" },
4826     { 8, "S-TAG and C-TAG" },
4827     { 0, NULL }
4828 };
4829 
4830 static void
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_)4831 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_)
4832 {
4833     int offset = 0;
4834     guint32 value;
4835 
4836     static int * const pfcp_gtpu_ext_hdr_del_flags[] = {
4837         &hf_pfcp_gtpu_ext_hdr_del_b0_pdu_sess_cont,
4838         NULL
4839     };
4840 
4841     proto_tree_add_item_ret_uint(tree, hf_pfcp_out_hdr_desc, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
4842     offset++;
4843     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_out_hdr_desc_vals, "Unknown"));
4844 
4845     /* Octet 6  GTP-U Extension Header Deletion */
4846     if (offset < length) {
4847         proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_gtpu_ext_hdr_del_flags, ENC_BIG_ENDIAN);
4848         offset++;
4849     }
4850 
4851     if (offset < length) {
4852         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4853     }
4854 }
4855  /*
4856  * 8.2.65   Recovery Time Stamp
4857  */
4858 
4859 static void
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_)4860 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_)
4861 {
4862     char *time_str;
4863     int offset = 0;
4864 
4865     /* indicates the UTC time when the node started. Octets 5 to 8 are encoded in the same format as
4866     * the first four octets of the 64-bit timestamp format as defined in section 6 of IETF RFC 5905 [26].
4867     */
4868     proto_tree_add_item_ret_time_string(tree, hf_pfcp_recovery_time_stamp, tvb, offset, 4, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str);
4869     proto_item_append_text(item, "%s", time_str);
4870     offset += 4;
4871 
4872     if (offset < length) {
4873         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4874     }
4875 
4876 }
4877 /*
4878  * 8.2.66   DL Flow Level Marking
4879  */
4880 static void
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_)4881 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_)
4882 {
4883     int offset = 0;
4884     guint64 flags_val;
4885 
4886     static int * const pfcp_dl_flow_level_marking_flags[] = {
4887         &hf_pfcp_spare_b7_b2,
4888         &hf_pfcp_dl_flow_level_marking_b1_sci,
4889         &hf_pfcp_dl_flow_level_marking_b0_ttc,
4890         NULL
4891     };
4892     /* Octet 5  Spare   SCI TTC*/
4893     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_dl_flow_level_marking,
4894         ett_pfcp_pfcp_dl_flow_level_marking, pfcp_dl_flow_level_marking_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
4895     offset += 1;
4896 
4897     /* Bit 1 - TTC (ToS/Traffic Class): If this bit is set to "1",
4898      * then the ToS/Traffic Class field shall be present
4899      */
4900     if ((flags_val & 0x1) == 1) {
4901         /* m to (m+1)    ToS/Traffic Class
4902         * The ToS/Traffic Class shall be encoded on two octets as an OctetString.
4903         * The first octet shall contain the IPv4 Type-of-Service or the IPv6 Traffic-Class field and
4904         * the second octet shall contain the ToS/Traffic Class mask field
4905         */
4906         proto_tree_add_item(tree, hf_pfcp_traffic_class, tvb, offset, 1, ENC_BIG_ENDIAN);
4907         offset += 1;
4908         proto_tree_add_item(tree, hf_pfcp_traffic_mask, tvb, offset, 1, ENC_BIG_ENDIAN);
4909         offset += 1;
4910     }
4911     /* SCI (Service Class Indicator): If this bit is set to "1",
4912      * then the Service Class Indicator field shall be present
4913      */
4914     if ((flags_val & 0x2) == 2) {
4915         /* Octets p and (p+1) of the Service Class Indicator field, when present,
4916         * shall be encoded respectively as octets 2 and 3 of the Service Class Indicator Extension Header
4917         * specified in Figure 5.2.2.3-1 of 3GPP TS 29.281
4918         */
4919         proto_tree_add_item(tree, hf_pfcp_sci, tvb, offset, 2, ENC_BIG_ENDIAN);
4920         offset += 2;
4921     }
4922 
4923     if (offset < length) {
4924         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4925     }
4926 
4927 }
4928 
4929 /*
4930  * 8.2.67   Header Enrichment
4931  */
4932 static const value_string pfcp_header_type_vals[] = {
4933     { 0, "HTTP" },
4934     { 0, NULL }
4935 };
4936 
4937 static void
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_)4938 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_)
4939 {
4940     int offset = 0;
4941     guint32 len;
4942 
4943     /* Octet 5 Spare    Header Type
4944     */
4945     proto_tree_add_item(tree, hf_pfcp_spare_b7_b5, tvb, offset, 1, ENC_BIG_ENDIAN);
4946     proto_tree_add_item(tree, hf_pfcp_header_type, tvb, offset, 1, ENC_BIG_ENDIAN);
4947     offset++;
4948 
4949     /* 6    Length of Header Field Name */
4950     proto_tree_add_item_ret_uint(tree, hf_pfcp_hf_len, tvb, offset, 1, ENC_BIG_ENDIAN, &len);
4951     offset++;
4952 
4953     /* 7 to m Header Field Name
4954      * Header Field Name shall be encoded as an OctetString
4955      */
4956     proto_tree_add_item(tree, hf_pfcp_hf_name, tvb, offset, len, ENC_NA);
4957     offset+= len;
4958 
4959     /* p    Length of Header Field Value*/
4960     proto_tree_add_item_ret_uint(tree, hf_pfcp_hf_val_len, tvb, offset, 1, ENC_BIG_ENDIAN, &len);
4961     offset++;
4962 
4963     /* (p+1) to q   Header Field Value */
4964     proto_tree_add_item(tree, hf_pfcp_hf_val, tvb, offset, len, ENC_NA);
4965     offset += len;
4966 
4967     if (offset < length) {
4968         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4969     }
4970 }
4971 
4972 /*
4973  * 8.2.68   Measurement Information
4974  */
4975 static void
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_)4976 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_)
4977 {
4978     int offset = 0;
4979 
4980     static int * const pfcp_measurement_info_flags[] = {
4981         &hf_pfcp_measurement_info_b7_ciam,
4982         &hf_pfcp_measurement_info_b6_aspoc,
4983         &hf_pfcp_measurement_info_b5_sspoc,
4984         &hf_pfcp_measurement_info_b4_mnop,
4985         &hf_pfcp_measurement_info_b3_istm,
4986         &hf_pfcp_measurement_info_b2_radi,
4987         &hf_pfcp_measurement_info_b1_inam,
4988         &hf_pfcp_measurement_info_b0_mbqe,
4989         NULL
4990     };
4991     /* Octet 5  CIAM   ASPOC   SSPOC   MNOP    ISTM    INAM    MBQE */
4992     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_measurement_info,
4993         ett_pfcp_measurement_info, pfcp_measurement_info_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
4994     offset += 1;
4995 
4996     if (offset < length) {
4997         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
4998     }
4999 
5000 }
5001 /*
5002  * 8.2.69   Node Report Type
5003  */
5004 static void
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_)5005 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_)
5006 {
5007     int offset = 0;
5008 
5009     static int * const pfcp_node_report_type_flags[] = {
5010         &hf_pfcp_spare_b7_b1,
5011         &hf_pfcp_node_report_type_b3_gpqr,
5012         &hf_pfcp_node_report_type_b2_ckdr,
5013         &hf_pfcp_node_report_type_b1_uprr,
5014         &hf_pfcp_node_report_type_b0_upfr,
5015         NULL
5016     };
5017     /* Octet 5  Spare   GPQR   CKDR   UPRR    MBQE */
5018     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_node_report_type,
5019         ett_pfcp_node_report_type, pfcp_node_report_type_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
5020     offset += 1;
5021 
5022     if (offset < length) {
5023         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5024     }
5025 
5026 }
5027 /*
5028  * 8.2.70   Remote GTP-U Peer
5029  */
5030 static void
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_)5031 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_)
5032 {
5033     int offset = 0;
5034     guint64 flags;
5035     guint32 length_di, length_ni;
5036 
5037     static int * const pfcp_remote_gtp_u_peer_flags[] = {
5038         &hf_pfcp_spare_b7_b4,
5039         &hf_pfcp_remote_gtp_u_peer_flags_b3_ni,
5040         &hf_pfcp_remote_gtp_u_peer_flags_b2_di,
5041         &hf_pfcp_remote_gtp_u_peer_flags_b1_v4,
5042         &hf_pfcp_remote_gtp_u_peer_flags_b0_v6,
5043         NULL
5044     };
5045     /* Octet 5  Spare   NI DI V4  V6*/
5046     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_remote_gtp_u_peer_flags,
5047         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);
5048     offset += 1;
5049 
5050     /* IPv4 address (if present)*/
5051     if (flags & 0x2) {
5052         proto_tree_add_item(tree, hf_pfcp_remote_gtp_u_peer_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
5053         proto_item_append_text(item, "IPv4 %s ", tvb_ip_to_str(pinfo->pool, tvb, offset));
5054         offset += 4;
5055     }
5056     /* IPv6 address (if present)*/
5057     if (flags & 0x1) {
5058         proto_tree_add_item(tree, hf_pfcp_remote_gtp_u_peer_ipv6, tvb, offset, 16, ENC_NA);
5059         proto_item_append_text(item, "IPv6 %s ", tvb_ip6_to_str(pinfo->pool, tvb, offset));
5060         offset += 16;
5061     }
5062     /* DI (if present)*/
5063     if (flags & 0x4) {
5064         /* Length of Destination Interface field */
5065         proto_tree_add_item_ret_uint(tree, hf_pfcp_remote_gtp_u_peer_length_di, tvb, offset, 2, ENC_BIG_ENDIAN, &length_di);
5066         offset += 2;
5067 
5068         /* Destination Interface */
5069         offset += decode_pfcp_destination_interface(tvb, pinfo, tree, item, offset, length_di);
5070     }
5071     /* NI (if present)*/
5072     if (flags & 0x8) {
5073         /* Length of Network Instance field */
5074         proto_tree_add_item_ret_uint(tree, hf_pfcp_remote_gtp_u_peer_length_ni, tvb, offset, 2, ENC_BIG_ENDIAN, &length_ni);
5075         offset += 2;
5076 
5077         /* Network Instance */
5078         offset += decode_pfcp_network_instance(tvb, pinfo, tree, item, offset, length_ni);
5079     }
5080 
5081     if (offset < length) {
5082         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5083     }
5084 
5085 }
5086 
5087 /*
5088  * 8.2.71   UR-SEQN
5089  */
5090 static void
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_)5091 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_)
5092 {
5093     guint value;
5094 
5095     /* 5 to 8   UR-SEQN
5096     * The UR-SEQN value shall be encoded as an Unsigned32 binary integer value
5097     */
5098     proto_tree_add_item_ret_uint(tree, hf_pfcp_ur_seqn, tvb, 0, 4, ENC_BIG_ENDIAN, &value);
5099 
5100     proto_item_append_text(item, "%u", value);
5101 
5102 
5103 }
5104 
5105 /*
5106  * 8.2.72   Activate Predefined Rules
5107  */
5108 static void
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_)5109 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_)
5110 {
5111     int offset = 0;
5112     /* Octet 5 to (n+4) Predefined Rules Name
5113     * The Predefined Rules Name field shall be encoded as an OctetString
5114     */
5115     proto_tree_add_item(tree, hf_pfcp_predef_rules_name, tvb, offset, length, ENC_NA);
5116 }
5117 /*
5118  * 8.2.73   Deactivate Predefined Rules
5119  */
5120 static void
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_)5121 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_)
5122 {
5123     int offset = 0;
5124     /* Octet 5 to (n+4) Predefined Rules Name
5125     * The Predefined Rules Name field shall be encoded as an OctetString
5126     */
5127     proto_tree_add_item(tree, hf_pfcp_predef_rules_name, tvb, offset, length, ENC_NA);
5128 }
5129 /*
5130  * 8.2.74   FAR ID
5131  */
5132 static int
decode_pfcp_far_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,gint offset,pfcp_session_args_t * args)5133 decode_pfcp_far_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, gint offset, pfcp_session_args_t *args)
5134 {
5135     guint32 far_id;
5136     /* Octet 5 to 8 FAR ID value
5137      * The bit 8 of octet 5 is used to indicate if the Rule ID is dynamically allocated
5138      * by the CP function or predefined in the UP function. If set to 0, it indicates that
5139      * the Rule is dynamically provisioned by the CP Function. If set to 1, it indicates that
5140      * the Rule is predefined in the UP Function.
5141      */
5142     far_id = tvb_get_guint32(tvb, offset, ENC_BIG_ENDIAN);
5143 
5144     proto_tree_add_item(tree, hf_pfcp_far_id_flg, tvb, offset, 4, ENC_BIG_ENDIAN);
5145     proto_tree_add_item(tree, hf_pfcp_far_id, tvb, offset, 4, ENC_BIG_ENDIAN);
5146     offset += 4;
5147 
5148     proto_item_append_text(item, "%s %u",
5149         tfs_get_string((far_id & 0x80000000), &pfcp_id_predef_dynamic_tfs),
5150         (far_id & 0x7fffffff));
5151 
5152     if (args) {
5153         args->last_rule_ids.far = far_id;
5154     }
5155 
5156     return offset;
5157 }
5158 
5159 static void
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)5160 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)
5161 {
5162     int offset = 0;
5163 
5164     offset = decode_pfcp_far_id(tvb, pinfo, tree, item, offset, args);
5165 
5166     if (offset < length) {
5167         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5168     }
5169 
5170 }
5171 /*
5172  * 8.2.75   QER ID
5173  */
5174 static int
decode_pfcp_qer_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint offset,pfcp_session_args_t * args)5175 decode_pfcp_qer_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint offset, pfcp_session_args_t *args)
5176 {
5177     guint32 qer_id;
5178     /* Octet 5 to 8 QER ID value
5179     * The bit 8 of octet 5 is used to indicate if the Rule ID is dynamically allocated by the CP function
5180     * or predefined in the UP function. If set to 0, it indicates that the Rule is dynamically provisioned
5181     * by the CP Function. If set to 1, it indicates that the Rule is predefined in the UP Function
5182     */
5183     qer_id = tvb_get_guint32(tvb, offset, ENC_BIG_ENDIAN);
5184 
5185     proto_tree_add_item(tree, hf_pfcp_qer_id_flg, tvb, offset, 4, ENC_BIG_ENDIAN);
5186     proto_tree_add_item(tree, hf_pfcp_qer_id, tvb, offset, 4, ENC_BIG_ENDIAN);
5187     offset += 4;
5188 
5189     proto_item_append_text(item, "%s %u",
5190         tfs_get_string((qer_id & 0x80000000), &pfcp_id_predef_dynamic_tfs),
5191         (qer_id & 0x7fffffff));
5192 
5193     if (args) {
5194         args->last_rule_ids.qer = qer_id;
5195     }
5196 
5197     return offset;
5198 }
5199 static void
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)5200 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)
5201 {
5202     int offset = 0;
5203 
5204     offset = decode_pfcp_qer_id(tvb, pinfo, tree, item, offset, args);
5205 
5206     if (offset < length) {
5207         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5208     }
5209 
5210 }
5211 /*
5212  * 8.2.76   OCI Flags
5213  */
5214 static void
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_)5215 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_)
5216 {
5217     int offset = 0;
5218 
5219     static int * const pfcp_oci_flags_flags[] = {
5220         &hf_pfcp_spare_b7_b1,
5221         &hf_pfcp_oci_flags_b0_aoci,
5222         NULL
5223     };
5224     /* Octet 5  Spare   AOCI */
5225     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_oci_flags,
5226         ett_pfcp_oci_flags, pfcp_oci_flags_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
5227     offset += 1;
5228 
5229     if (offset < length) {
5230         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5231     }
5232 
5233 }
5234 
5235 /*
5236  * 8.2.77   PFCP Association Release Request
5237  */
5238 static void
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_)5239 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_)
5240 {
5241     int offset = 0;
5242 
5243     static int * const pfcp_pfcp_assoc_rel_req_flags[] = {
5244         &hf_pfcp_spare_b7_b1,
5245         &hf_pfcp_pfcp_assoc_rel_req_b0_sarr,
5246         NULL
5247     };
5248     /* Octet 5  Spare    SARR */
5249     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcp_assoc_rel_req_flags,
5250         ett_pfcp_assoc_rel_req_flags, pfcp_pfcp_assoc_rel_req_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
5251     offset += 1;
5252 
5253     if (offset < length) {
5254         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5255     }
5256 
5257 }
5258 
5259 /*
5260  * 8.2.78   Graceful Release Period
5261  */
5262 static void
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_)5263 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_)
5264 {
5265     int offset = 0;
5266     guint32 unit, value;
5267 
5268     /* Octet 5  Timer unit  Timer value */
5269     proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_unit, tvb, offset, 1, ENC_BIG_ENDIAN, &unit);
5270     proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
5271     offset++;
5272 
5273     if ((unit == 0) && (value == 0)) {
5274         proto_item_append_text(item, " Stopped");
5275     } else {
5276         switch (unit) {
5277         case 0:
5278             proto_item_append_text(item, "%u s", value * 2);
5279             break;
5280         case 1:
5281             proto_item_append_text(item, "%u min", value);
5282             break;
5283         case 2:
5284             proto_item_append_text(item, "%u min", value * 10);
5285             break;
5286         case 3:
5287             proto_item_append_text(item, "%u hours", value);
5288             break;
5289         case 4:
5290             proto_item_append_text(item, "%u hours", value * 10);
5291             break;
5292         case 7:
5293             proto_item_append_text(item, "%u Infinite", value);
5294             break;
5295             /* Value 5 and 6 */
5296         default:
5297             proto_item_append_text(item, "%u min", value * 1);
5298             break;
5299         }
5300     }
5301 
5302     if (offset < length) {
5303         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5304     }
5305 
5306 }
5307 /*
5308  * 8.2.79    PDN Type
5309  */
5310 static const value_string pfcp_pdn_type_vals[] = {
5311     { 0, "Reserved" },
5312     { 1, "IPv4" },
5313     { 2, "IPv6" },
5314     { 3, "IPv4V6" },
5315     { 4, "Non-IP" },
5316     { 5, "Ethernet" },
5317     { 0, NULL }
5318 };
5319 
5320 static void
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_)5321 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_)
5322 {
5323     int offset = 0;
5324     guint32 value;
5325     /* Octet 5  Application Identifier
5326     * The Application Identifier shall be encoded as an OctetString (see 3GPP TS 29.212)
5327     */
5328     proto_tree_add_item_ret_uint(tree, hf_pfcp_pdn_type, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
5329     offset++;
5330 
5331     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_pdn_type_vals, "Unknown"));
5332 
5333     if (offset < length) {
5334         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5335     }
5336 }
5337 /*
5338  * 8.2.80    Failed Rule ID
5339  */
5340 static const value_string pfcp_failed_rule_id_type_vals[] = {
5341     { 0, "PDR" },
5342     { 1, "FAR" },
5343     { 2, "QER" },
5344     { 3, "URR" },
5345     { 4, "BAR" },
5346     { 5, "MAR" },
5347     { 6, "SRR" },
5348     { 0, NULL }
5349 };
5350 
5351 /*
5352  * 8.2.123   MAR ID
5353  */
5354 static int
decode_pfcp_mar_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item,gint offset,pfcp_session_args_t * args)5355 decode_pfcp_mar_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, gint offset, pfcp_session_args_t *args)
5356 {
5357     guint32 mar_id;
5358     /* Octet 5 to 6 MAR ID*/
5359     proto_tree_add_item_ret_uint(tree, hf_pfcp_mar_id, tvb, offset, 2, ENC_BIG_ENDIAN, &mar_id);
5360     offset += 2;
5361 
5362     proto_item_append_text(item, "%u", mar_id);
5363 
5364     if (args) {
5365         args->last_rule_ids.mar = mar_id;
5366     }
5367 
5368     return offset;
5369 }
5370 /*
5371  * 8.2.151   SRR ID
5372  */
5373 static int
decode_pfcp_srr_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item,gint offset,pfcp_session_args_t * args)5374 decode_pfcp_srr_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, gint offset, pfcp_session_args_t *args)
5375 {
5376     guint32 srr_id;
5377     /* Oct 5 The SRR ID value shall be encoded as a binary integer value. */
5378     proto_tree_add_item_ret_uint(tree, hf_pfcp_srr_id, tvb, offset, 1, ENC_BIG_ENDIAN, &srr_id);
5379     offset += 1;
5380 
5381     proto_item_append_text(item, "%u", srr_id);
5382 
5383     if (args) {
5384         args->last_rule_ids.srr = srr_id;
5385     }
5386 
5387     return offset;
5388 }
5389 
5390 static void
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_)5391 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_)
5392 {
5393     int offset = 0;
5394     guint32 rule_type;
5395 
5396     /* Octet 5  Rule ID Type */
5397     proto_tree_add_item_ret_uint(tree, hf_pfcp_failed_rule_id_type, tvb, offset, 1, ENC_BIG_ENDIAN, &rule_type);
5398     offset++;
5399 
5400     proto_item_append_text(item, "%s: ", val_to_str_const(rule_type, pfcp_failed_rule_id_type_vals, "Unknown"));
5401 
5402     /* 6 to p  Rule ID value
5403     * The length and the value of the Rule ID value field shall be set as specified for the
5404     * PDR ID, FAR ID, QER ID, URR ID, BAR ID, MAR ID and SRR ID IE types respectively.
5405     */
5406     switch (rule_type) {
5407         case 0:
5408             /* PDR ID */
5409             offset = decode_pfcp_pdr_id(tvb, pinfo, tree, item, offset, NULL);
5410             break;
5411         case 1:
5412             /* FAR ID */
5413             offset = decode_pfcp_far_id(tvb, pinfo, tree, item, offset, NULL);
5414             break;
5415         case 2:
5416             /* QER ID */
5417             offset = decode_pfcp_qer_id(tvb, pinfo, tree, item, offset, NULL);
5418             break;
5419         case 3:
5420             /* URR ID */
5421             offset = decode_pfcp_urr_id(tvb, pinfo, tree, item, offset, NULL);
5422             break;
5423         case 4:
5424             /* BAR ID */
5425             offset = decode_pfcp_bar_id(tvb, pinfo, tree, item, offset, NULL);
5426             break;
5427         case 5:
5428             /* MAR ID */
5429             offset = decode_pfcp_mar_id(tvb, pinfo, tree, item, offset, NULL);
5430             break;
5431         case 6:
5432             /* SRR ID */
5433             offset = decode_pfcp_srr_id(tvb, pinfo, tree, item, offset, NULL);
5434             break;
5435         default:
5436             break;
5437     }
5438 
5439     if (offset < length) {
5440         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5441     }
5442 }
5443 /*
5444  * 8.2.81    Time Quota Mechanism
5445  */
5446 static const value_string pfcp_time_quota_mechanism_bti_type_vals[] = {
5447     { 0, "CTP" },
5448     { 1, "DTP" },
5449     { 0, NULL }
5450 };
5451 
5452 static void
dissect_pfcp_time_quota_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_)5453 dissect_pfcp_time_quota_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_)
5454 {
5455     int offset = 0;
5456     guint32 bti_type;
5457 
5458     /* Octet 5  BIT Type */
5459     proto_tree_add_item_ret_uint(tree, hf_pfcp_time_quota_mechanism_bti_type, tvb, offset, 1, ENC_BIG_ENDIAN, &bti_type);
5460     offset++;
5461 
5462     proto_item_append_text(item, "%s", val_to_str_const(bti_type, pfcp_time_quota_mechanism_bti_type_vals, "Unknown"));
5463 
5464     /* Base Time Interval
5465     * The Base Time Interval, shall be encoded as an Unsigned32
5466     * as specified in subclause 7.2.29 of 3GPP TS 32.299
5467     */
5468     proto_tree_add_item(tree, hf_pfcp_time_quota_mechanism_bti, tvb, offset, 4, ENC_BIG_ENDIAN);
5469     offset += 4;
5470 
5471     if (offset < length) {
5472         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5473     }
5474 }
5475 /*
5476  * 8.2.82    User Plane IP Resource Information (removed in Rel 16.3)
5477  */
5478 static void
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_)5479 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_)
5480 {
5481     int offset = 0;
5482     guint64 upiri_flags_val;
5483     guint32 upiri_teid_range;
5484 
5485     static int * const pfcp_upiri_flags[] = {
5486         &hf_pfcp_spare_b7_b6,
5487         &hf_pfcp_upiri_flg_b6_assosi,
5488         &hf_pfcp_upiri_flg_b5_assoni,
5489         &hf_pfcp_upiri_flg_b2b4_teidri,
5490         &hf_pfcp_upiri_flags_b1_v6,
5491         &hf_pfcp_upiri_flags_b0_v4,
5492         NULL
5493     };
5494     /* Octet 5  Spare  ASSOSI  ASSONI  TEIDRI  TEIDRI  TEIDRI  V6  V4*/
5495     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_upiri_flags,
5496         ett_pfcp_upiri_flags, pfcp_upiri_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &upiri_flags_val);
5497 
5498     /* The following flags are coded within Octet 5:
5499      * 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,
5500      *           otherwise the IPv4 address field shall not be present.
5501      * 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,
5502      *           otherwise the IPv6 address field shall not be present.
5503      * Bit 3-5 - TEIDRI (TEID Range Indication): the value of this field indicates the number of bits in the most significant
5504      *           octet of a TEID that are used to partition the TEID range, e.g. if this field is set to "4", then the first
5505      *           4 bits in the TEID are used to partition the TEID range.
5506      * Bit 6   - ASSONI (Associated Network Instance): if this bit is set to "1", then the Network Instance field shall be present,
5507      *           otherwise the Network Instance field shall not be present,
5508      *           i.e. User Plane IP Resource Information provided can be used by CP function for any Network Instance of
5509      *           GTP-U user plane in the UP function.
5510      * Bit 7   - ASSOSI (Associated Source Interface): if this bit is set to "1", then the Source Interface field shall be present,
5511      *           otherwise the Source Interface field shall not be present.
5512      */
5513 
5514     /* Octet 5, bit 3-5, TEID Range Indication */
5515     proto_tree_add_item_ret_uint(tree, hf_pfcp_upiri_teidri, tvb, offset, 1, ENC_BIG_ENDIAN, &upiri_teid_range);
5516     offset += 1;
5517 
5518     if (upiri_teid_range > 0)
5519     {
5520         /* Octet t    TEID Range */
5521         proto_tree_add_item(tree, hf_pfcp_upiri_teid_range, tvb, offset, 1, ENC_BIG_ENDIAN);
5522         offset++;
5523     }
5524 
5525     if ((upiri_flags_val & 0x1) == 1) {
5526         /* m to (m+3)    IPv4 address */
5527         proto_tree_add_item(tree, hf_pfcp_upiri_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
5528         offset += 4;
5529     }
5530     if ((upiri_flags_val & 0x2) == 2) {
5531         /* p to (p+15)   IPv6 address */
5532         proto_tree_add_item(tree, hf_pfcp_upiri_ipv6, tvb, offset, 16, ENC_NA);
5533         offset += 16;
5534     }
5535     if ((upiri_flags_val & 0x20) == 0x20) {
5536         /* k to (l)   Network Instance */
5537         guint16 ni_len = length - offset;
5538         if ((upiri_flags_val & 0x40) == 0x40) {
5539             ni_len--;
5540         }
5541         offset = decode_pfcp_network_instance(tvb, pinfo, tree, item, offset, ni_len);
5542     }
5543     if ((upiri_flags_val & 0x40) == 0x40) {
5544         /* r   Source Interface */
5545         offset = decode_pfcp_source_interface(tvb, pinfo, tree, item, offset);
5546     }
5547     if (offset < length) {
5548         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5549     }
5550 
5551 }
5552 
5553 /*
5554  * 8.2.83    User Plane Inactivity Timer
5555  */
5556 static void
dissect_pfcp_user_plane_inactivity_timer(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)5557 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_)
5558 {
5559     int offset = 0;
5560     guint32 value;
5561     /*
5562     * The User Plane Inactivity Timer field shall be encoded as an Unsigned32 binary integer value.
5563     * The timer value "0" shall be interpreted as an indication that
5564     * user plane inactivity detection and reporting is stopped.
5565     */
5566 
5567     /* 5 to 8   Inactivity Timer */
5568     proto_tree_add_item_ret_uint(tree, hf_pfcp_user_plane_inactivity_timer, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
5569     offset += 4;
5570 
5571     if(value == 0)
5572         proto_item_append_text(item, " (Stopped)");
5573 
5574     if (offset < length) {
5575         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5576     }
5577 
5578 }
5579 
5580 /*
5581  * 8.2.84    Multiplier
5582  */
5583 static void
dissect_pfcp_multiplier(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length _U_,guint8 message_type _U_,pfcp_session_args_t * args _U_)5584 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_)
5585 {
5586 
5587     /* 5 to 12  Value-Digits */
5588     proto_tree_add_item(tree, hf_pfcp_multiplier_value_digits, tvb, 0, 8, ENC_BIG_ENDIAN);
5589 
5590     /* 12 to 15  Exponent */
5591     proto_tree_add_item(tree, hf_pfcp_multiplier_exponent, tvb, 8, 4, ENC_BIG_ENDIAN);
5592 
5593 }
5594 
5595 /*
5596  * 8.2.85    Aggregated URR ID IE
5597  */
5598 static void
dissect_pfcp_aggregated_urr_id_ie(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item,guint16 length _U_,guint8 message_type _U_,pfcp_session_args_t * args _U_)5599 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_)
5600 {
5601     /* 5 to 8  URR ID */
5602     decode_pfcp_urr_id(tvb, pinfo, tree, item, 0, NULL);
5603 }
5604 
5605 /*
5606  * 8.2.86   Subsequent Volume Quota
5607  */
5608 static void
dissect_pfcp_subsequent_volume_quota(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)5609 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_)
5610 {
5611     int offset = 0;
5612     guint64 flags_val;
5613 
5614     static int * const pfcp_subsequent_volume_quota_flags[] = {
5615         &hf_pfcp_spare_b7_b3,
5616         &hf_pfcp_subsequent_volume_quota_b2_dlvol,
5617         &hf_pfcp_subsequent_volume_quota_b1_ulvol,
5618         &hf_pfcp_subsequent_volume_quota_b0_tovol,
5619         NULL
5620     };
5621     /* Octet 5  Spare   DLVOL   ULVOL   TOVOL*/
5622     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_subsequent_volume_quota,
5623         ett_pfcp_subsequent_volume_quota, pfcp_subsequent_volume_quota_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
5624     offset += 1;
5625 
5626     /* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value.
5627     * They shall contain the total, uplink or downlink number of octets respectively.
5628     */
5629     if ((flags_val & 0x1) == 1) {
5630         /* m to (m+7)   Total Volume
5631         * TOVOL: If this bit is set to "1", then the Total Volume field shall be present
5632         */
5633         proto_tree_add_item(tree, hf_pfcp_subsequent_volume_quota_tovol, tvb, offset, 8, ENC_BIG_ENDIAN);
5634         offset += 8;
5635     }
5636     if ((flags_val & 0x2) == 2) {
5637         /* p to (p+7)    Uplink Volume
5638         * ULVOL: If this bit is set to "1", then the Uplink Volume field shall be present
5639         */
5640         proto_tree_add_item(tree, hf_pfcp_subsequent_volume_quota_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
5641         offset += 8;
5642     }
5643     if ((flags_val & 0x4) == 4) {
5644         /* q to (q+7)   Downlink Volume
5645         * DLVOL: If this bit is set to "1", then the Downlink Volume field shall be present
5646         */
5647         proto_tree_add_item(tree, hf_pfcp_subsequent_volume_quota_dlvol, tvb, offset, 8, ENC_BIG_ENDIAN);
5648         offset += 8;
5649     }
5650 
5651     if (offset < length) {
5652         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5653     }
5654 }
5655 
5656 /*
5657  * 8.2.87   Subsequent Time Quota
5658  */
5659 static void
dissect_pfcp_subsequent_time_quota(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)5660 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_)
5661 {
5662     int offset = 0;
5663     guint value;
5664 
5665     /* Octet 5 to 8 Time Quota
5666     * The Time Quota field shall be encoded as an Unsigned32 binary integer value.
5667     * It shall contain the duration in seconds.
5668     */
5669     proto_tree_add_item_ret_uint(tree, hf_pfcp_subsequent_time_quota, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
5670     offset += 4;
5671 
5672     proto_item_append_text(item, "%u s", value);
5673 
5674     if (offset < length) {
5675         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5676     }
5677 
5678 }
5679 
5680 /*
5681  * 8.2.88   RQI
5682  */
5683 static void
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_)5684 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_)
5685 {
5686     int offset = 0;
5687 
5688     proto_tree_add_item(tree, hf_pfcp_spare_b7_b1, tvb, offset, 1, ENC_BIG_ENDIAN);
5689     proto_tree_add_item(tree, hf_pfcp_rqi_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
5690     offset += 1;
5691 
5692     if (offset < length) {
5693         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5694     }
5695     return;
5696 }
5697 
5698 /*
5699  * 8.2.89   QFI
5700  */
5701 static int
decode_pfcp_qfi(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,gint offset)5702 decode_pfcp_qfi(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, gint offset)
5703 {
5704     /*     Octets 5 SPARE   QFI
5705      *    The Application Identifier shall be encoded as an OctetString
5706      */
5707     proto_tree_add_item(tree, hf_pfcp_spare_b7_b6, tvb, offset, 1, ENC_BIG_ENDIAN);
5708     proto_tree_add_item(tree, hf_pfcp_qfi, tvb, offset, 1, ENC_NA);
5709     offset += 1;
5710 
5711     return offset;
5712 }
5713 static void
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_)5714 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_)
5715 {
5716     int offset = 0;
5717 
5718     offset = decode_pfcp_qfi(tvb, pinfo, tree, item, offset);
5719 
5720     if (offset < length) {
5721         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5722     }
5723     return;
5724 }
5725 
5726 /*
5727  * 8.2.90   Querry URR Reference
5728  */
5729 static void
dissect_pfcp_query_urr_reference(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)5730 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_)
5731 {
5732     int offset = 0;
5733 
5734     /* Octets 5 to 8 Query URR Reference value
5735      * The Query URR Reference value shall be encoded as an Unsigned32 binary integer value.
5736      * It shall contain the reference of a query request for URR(s).
5737      */
5738     proto_tree_add_item(tree, hf_pfcp_query_urr_reference, tvb, offset, 4, ENC_BIG_ENDIAN);
5739     offset += 4;
5740 
5741     if (offset < length) {
5742         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5743     }
5744 
5745 }
5746 
5747 /*
5748  * 8.2.91    Additional Usage Reports Information
5749  */
5750 static void
dissect_pfcp_additional_usage_reports_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)5751 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_)
5752 {
5753     int offset = 0;
5754     /*
5755      *    Octet    8      7   6      5      4      3      2         1
5756      *    5    | AURI |   Number of Additional Usage Reports value  |
5757      *    6    |    Number of Additional Usage Reports value     |
5758      *
5759      *  The Number of Additional Usage Reports value shall be encoded as
5760      *  an unsigned binary integer value on 15 bits.
5761      *  Bit 7 of Octet 5 is the most significant bit and bit 1 of Octet 6 is the least significant bit.
5762      *  The bit 8 of octet 5 shall encode the AURI (Additional Usage Reports Indication) flag{...}.
5763     */
5764     static int * const pfcp_additional_usage_reports_information_flags[] = {
5765         &hf_pfcp_additional_usage_reports_information_b15_auri,
5766         &hf_pfcp_additional_usage_reports_information_b14_b0_number_value,
5767         NULL
5768     };
5769     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_additional_usage_reports_information,
5770             ett_pfcp_additional_usage_reports_information, pfcp_additional_usage_reports_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
5771     offset += 2;
5772 
5773     if (offset < length) {
5774         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5775     }
5776 }
5777 
5778 /*
5779  *   8.2.92 Traffic Endpoint ID
5780  */
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_)5781 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_)
5782 {
5783     int offset = 0;
5784 
5785     proto_tree_add_item(tree, hf_pfcp_traffic_endpoint_id, tvb, offset, 1, ENC_BIG_ENDIAN);
5786     offset += 1;
5787 
5788     if (offset < length) {
5789         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5790     }
5791     return;
5792 }
5793 
5794 /*
5795  *   8.2.93 MAC Address
5796  */
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_)5797 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_)
5798 {
5799     int offset = 0;
5800     guint64 flags_val;
5801 
5802     static int * const pfcp_mac_address_flags[] = {
5803         &hf_pfcp_spare_b7_b4,
5804         &hf_pfcp_mac_address_flags_b3_udes,
5805         &hf_pfcp_mac_address_flags_b2_usou,
5806         &hf_pfcp_mac_address_flags_b1_dest,
5807         &hf_pfcp_mac_address_flags_b0_sour,
5808         NULL
5809     };
5810     /* Octet 5  Spare   EDES    USOU   DEST   SOUR */
5811     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_mac_address_flags,
5812         ett_pfcp_mac_address, pfcp_mac_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &flags_val);
5813     offset += 1;
5814 
5815     // Octets "m to (m+5)" or "n to (n+5)" and "o to (o+5)" or "p to (p+5)", if present,
5816     // shall contain a MAC address value (12-digit hexadecimal numbers).
5817     if ((flags_val & 0x1) == 1) {
5818         /* m to (m+5)   Source MAC Address
5819         * SOUR: If this bit is set to "1", then the Source MAC Address field shall be present
5820         */
5821         proto_tree_add_item(tree, hf_pfcp_mac_address_source_mac_address, tvb, offset, 6, ENC_NA);
5822         offset += 6;
5823     }
5824 
5825     if ((flags_val & 0x2) == 2) {
5826         /* n to (n+5)    Destination MAC Address
5827         * DEST: If this bit is set to "1", then the Destination MAC Address field shall be present
5828         */
5829         proto_tree_add_item(tree, hf_pfcp_mac_address_dest_mac_address, tvb, offset, 6, ENC_NA);
5830         offset += 6;
5831     }
5832 
5833     if ((flags_val & 0x4) == 4) {
5834         /* o to (o+5)   Upper Source MAC Address
5835         * USOU: If this bit is set to "1", then the Upper Source MAC Address field shall be present
5836         */
5837         proto_tree_add_item(tree, hf_pfcp_mac_address_upper_source_mac_address, tvb, offset, 6, ENC_NA);
5838         offset += 6;
5839     }
5840 
5841     if ((flags_val & 0x8) == 8) {
5842         /* p to (p+5)   Upper Destination MAC Address
5843         * UDES: If this bit is set to "1", then the Upper Destination MAC Address field shall be present
5844         */
5845         proto_tree_add_item(tree, hf_pfcp_mac_address_upper_dest_mac_address, tvb, offset, 6, ENC_NA);
5846         offset += 6;
5847     }
5848 
5849     if (offset < length) {
5850         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5851     }
5852     return;
5853 }
5854 
5855 /*
5856  *   8.2.94 C-TAG (Customer-VLAN tag)
5857  */
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_)5858 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_)
5859 {
5860     int offset = 0;
5861 
5862     offset = decode_pfcp_c_tag(tvb, pinfo, tree, item, offset);
5863 
5864     if (offset < length) {
5865         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5866     }
5867     return;
5868 }
5869 
5870 /*
5871  *   8.2.95 S-TAG (Service-VLAN tag)
5872  */
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_)5873 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_)
5874 {
5875     int offset = 0;
5876 
5877     offset = decode_pfcp_s_tag(tvb, pinfo, tree, item, offset);
5878 
5879     if (offset < length) {
5880         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5881     }
5882     return;
5883 }
5884 
5885 /*
5886  *   8.2.96 Ethertype
5887  */
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_)5888 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_)
5889 {
5890     int offset = 0;
5891 
5892     proto_tree_add_item(tree, hf_pfcp_ethertype, tvb, offset, 2, ENC_NA);
5893     offset += 2;
5894 
5895     if (offset < length) {
5896         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5897     }
5898     return;
5899 }
5900 
5901 /*
5902  *   8.2.97 Proxying
5903  */
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_)5904 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_)
5905 {
5906     int offset = 0;
5907     guint64 flags_val;
5908 
5909     static int * const pfcp_proxying_flags[] = {
5910         &hf_pfcp_spare_b7_b2,
5911         &hf_pfcp_proxying_flags_b1_ins,
5912         &hf_pfcp_proxying_flags_b0_arp,
5913         NULL
5914     };
5915     /* Octet 5  Spare  INS   ARP */
5916     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_proxying_flags,
5917         ett_pfcp_proxying, pfcp_proxying_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
5918     offset += 1;
5919 
5920     if (offset < length) {
5921         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5922     }
5923     return;
5924 }
5925 
5926 /*
5927  *   8.2.98 Ethertype Filter ID
5928  */
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_)5929 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_)
5930 {
5931     int offset = 0;
5932 
5933     proto_tree_add_item(tree, hf_pfcp_ethertype_filter_id, tvb, offset, 4, ENC_NA);
5934     offset += 4;
5935 
5936     if (offset < length) {
5937         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5938     }
5939     return;
5940 }
5941 
5942 /*
5943  *   8.2.99 Ethernet Filter Properties
5944  */
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_)5945 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_)
5946 {
5947     int offset = 0;
5948     guint64 flags_val;
5949 
5950     static int * const pfcp_ethernet_filter_properties_flags[] = {
5951         &hf_pfcp_spare_b7_b1,
5952         &hf_pfcp_ethertype_filter_properties_flags_b0_bide,
5953         NULL
5954     };
5955     /* Octet 5  Spare  BIDE */
5956     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_ethertype_filter_properties_flags,
5957         ett_pfcp_ethernet_filter_properties, pfcp_ethernet_filter_properties_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
5958     offset += 1;
5959 
5960     if (offset < length) {
5961         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5962     }
5963     return;
5964 }
5965 
5966 /*
5967  * 8.2.100   Suggested Buffering Packets Count
5968  */
5969 static void
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_)5970 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_)
5971 {
5972     int offset = 0;
5973     guint32 value;
5974     /* 5   Packet count value */
5975     proto_tree_add_item_ret_uint(tree, hf_pfcp_suggested_buffering_packets_count_packet_count, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
5976     offset += 1;
5977 
5978     proto_item_append_text(item, "%u packets", value);
5979 
5980     if (offset < length) {
5981         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
5982     }
5983 }
5984 
5985 /*
5986  *   8.2.101 User ID
5987  */
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_)5988 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_)
5989 {
5990     int offset = 0;
5991     guint64 flags_val;
5992     guint32 length_imsi, length_imei, length_msisdn, length_nai, length_supi, length_gpsi, length_pei;
5993 
5994     static int * const pfcp_user_id_flags[] = {
5995         &hf_pfcp_spare_b7,
5996         &hf_pfcp_user_id_flags_b6_peif,
5997         &hf_pfcp_user_id_flags_b5_gpsif,
5998         &hf_pfcp_user_id_flags_b4_supif,
5999         &hf_pfcp_user_id_flags_b3_naif,
6000         &hf_pfcp_user_id_flags_b2_msisdnf,
6001         &hf_pfcp_user_id_flags_b1_imeif,
6002         &hf_pfcp_user_id_flags_b0_imsif,
6003         NULL
6004     };
6005     /* Octet 5  Spare   IMEIF   IMSIF */
6006     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_user_id_flags,
6007         ett_pfcp_user_id, pfcp_user_id_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &flags_val);
6008     offset += 1;
6009 
6010     /* Bit 1 - IMSIF: If this bit is set to "1", then the Length of IMSI and IMSI fields shall be present */
6011     if ((flags_val & 0x1)) {
6012         /* 6   Length of IMSI */
6013         proto_tree_add_item_ret_uint(tree, hf_pfcp_user_id_length_of_imsi, tvb, offset, 1, ENC_BIG_ENDIAN, &length_imsi);
6014         offset += 1;
6015         /* 7 to (a)    IMSI */
6016         dissect_e212_imsi(tvb, pinfo, tree,  offset, length_imsi, FALSE);
6017         offset += length_imsi;
6018     }
6019 
6020     /* Bit 2 - IMEIF: If this bit is set to "1", then the Length of IMEI and IMEI fields shall be present */
6021     if ((flags_val & 0x2)) {
6022         /* b   Length of IMEI */
6023         proto_tree_add_item_ret_uint(tree, hf_pfcp_user_id_length_of_imei, tvb, offset, 1, ENC_BIG_ENDIAN, &length_imei);
6024         offset += 1;
6025 
6026         /* (b+1) to c    IMEI */
6027         /* Fetch the BCD encoded digits from tvb low half byte, formating the digits according to
6028         * a default digit set of 0-9 returning "?" for overdecadic digits a pointer to the EP
6029         * allocated string will be returned.
6030         */
6031         proto_tree_add_item(tree, hf_pfcp_user_id_imei, tvb, offset, length_imei, ENC_BCD_DIGITS_0_9);
6032         offset += length_imei;
6033     }
6034 
6035     /* Bit 3 - MSIDNF: If this bit is set to "1", then the Length of MSISDN and MSISDN fields shall be present */
6036     if ((flags_val & 0x4)) {
6037         /* d   Length of MSISDN */
6038         proto_tree_add_item_ret_uint(tree, hf_pfcp_user_id_length_of_msisdn, tvb, offset, 1, ENC_BIG_ENDIAN, &length_msisdn);
6039         offset += 1;
6040         /* (d+1) to e    MSISDN */
6041         dissect_e164_msisdn(tvb, tree, offset, length_msisdn, E164_ENC_BCD);
6042         offset += length_msisdn;
6043     }
6044 
6045     /* Bit 4 - NAIF: If this bit is set to "1", then the Length of NAI and NAI fields shall be present */
6046     if ((flags_val & 0x8)) {
6047         /* f   Length of NAI */
6048         proto_tree_add_item_ret_uint(tree, hf_pfcp_user_id_length_of_nai, tvb, offset, 1, ENC_BIG_ENDIAN, &length_nai);
6049         offset += 1;
6050         /* (f+1) to g    NAI */
6051         proto_tree_add_item(tree, hf_pfcp_user_id_nai, tvb, offset, length_nai, ENC_ASCII|ENC_NA);
6052         offset += length_nai;
6053     }
6054 
6055     /* Bit 5 - SUPIF: If this bit is set to "1", then the Length of SUPI and SUPI fields shall be present */
6056     if ((flags_val & 0x10)) {
6057         /* f   Length of SUPI */
6058         proto_tree_add_item_ret_uint(tree, hf_pfcp_user_id_length_of_supi, tvb, offset, 1, ENC_BIG_ENDIAN, &length_supi);
6059         offset += 1;
6060         /* (f+1) to g    SUPI */
6061         proto_tree_add_item(tree, hf_pfcp_user_id_supi, tvb, offset, length_supi, ENC_ASCII|ENC_NA);
6062         offset += length_supi;
6063     }
6064 
6065     /* Bit 6 - GPSIF: If this bit is set to "1", then the Length of GPSI and GPSI fields shall be present */
6066     if ((flags_val & 0x20)) {
6067         /* f   Length of GPSI */
6068         proto_tree_add_item_ret_uint(tree, hf_pfcp_user_id_length_of_gpsi, tvb, offset, 1, ENC_BIG_ENDIAN, &length_gpsi);
6069         offset += 1;
6070         /* (f+1) to g    GPSI */
6071         proto_tree_add_item(tree, hf_pfcp_user_id_gpsi, tvb, offset, length_gpsi, ENC_ASCII|ENC_NA);
6072         offset += length_gpsi;
6073     }
6074 
6075     /* Bit 7 - PEIF: If this bit is set to "1", then the Length of PEI and PEI fields shall be present */
6076     if ((flags_val & 0x40)) {
6077         /* f   Length of PEI */
6078         proto_tree_add_item_ret_uint(tree, hf_pfcp_user_id_length_of_pei, tvb, offset, 1, ENC_BIG_ENDIAN, &length_pei);
6079         offset += 1;
6080         /* (f+1) to g    PEI */
6081         proto_tree_add_item(tree, hf_pfcp_user_id_pei, tvb, offset, length_pei, ENC_ASCII|ENC_NA);
6082         offset += length_pei;
6083     }
6084 
6085     if (offset < length) {
6086         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6087     }
6088     return;
6089 }
6090 
6091 /*
6092  *   8.2.102 Ethernet PDU Session Information
6093  */
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_)6094 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_)
6095 {
6096     int offset = 0;
6097 
6098     static int * const pfcp_ethernet_pdu_session_information_flags[] = {
6099         &hf_pfcp_spare_b7_b1,
6100         &hf_pfcp_ethernet_pdu_session_information_flags_b0_ethi,
6101         NULL
6102     };
6103     /* Octet 5  Spare   ETHI */
6104     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_ethernet_pdu_session_information_flags,
6105         ett_pfcp_ethernet_pdu_session_information, pfcp_ethernet_pdu_session_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS);
6106     offset += 1;
6107 
6108     if (offset < length) {
6109         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6110     }
6111     return;
6112 }
6113 
6114 /*
6115  * 8.2.103   MAC Addresses Detected
6116  */
6117 static void
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_)6118 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_)
6119 {
6120     int offset = 0;
6121     guint32 value, i, length_ctag, length_stag;
6122 
6123     /* 5   Number of MAC addresses  */
6124     proto_tree_add_item_ret_uint(tree, hf_pfcp_mac_addresses_detected_number_of_mac_addresses, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
6125     offset += 1;
6126 
6127     /* o to (o+6) MAC Address  */
6128     for (i = 0; i < value; i++)
6129     {
6130         proto_tree_add_item(tree, hf_pfcp_mac_addresses_detected_mac_address, tvb, offset, 6, ENC_NA);
6131         offset += 6;
6132     }
6133 
6134     if (offset == length) {
6135         return;
6136     }
6137 
6138     /* s   Length of C-TAG */
6139     proto_tree_add_item_ret_uint(tree, hf_pfcp_mac_addresses_detected_length_of_ctag, tvb, offset, 1, ENC_BIG_ENDIAN, &length_ctag);
6140     offset += 1;
6141     /* (s+1) to t    C-TAG */
6142     if (length_ctag > 0)
6143     {
6144         offset = decode_pfcp_c_tag(tvb, pinfo, tree, item, offset);
6145     }
6146 
6147     /* u   Length of S-TAG */
6148     proto_tree_add_item_ret_uint(tree, hf_pfcp_mac_addresses_detected_length_of_stag, tvb, offset, 1, ENC_BIG_ENDIAN, &length_stag);
6149     offset += 1;
6150     /* (u+1) to v    S-TAG */
6151     if (length_stag > 0)
6152     {
6153         offset = decode_pfcp_s_tag(tvb, pinfo, tree, item, offset);
6154     }
6155 
6156     if (offset < length) {
6157         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6158     }
6159 }
6160 
6161 /*
6162  * 8.2.104   MAC Addresses Removed
6163  */
6164 static void
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_)6165 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_)
6166 {
6167     int offset = 0;
6168     guint32 value, i, length_ctag, length_stag;
6169 
6170     /* 5   Number of MAC addresses  */
6171     proto_tree_add_item_ret_uint(tree, hf_pfcp_mac_addresses_removed_number_of_mac_addresses, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
6172     offset += 1;
6173 
6174     /* o to (o+6) MAC Address  */
6175     for (i = 0; i < value; i++)
6176     {
6177         proto_tree_add_item(tree, hf_pfcp_mac_addresses_removed_mac_address, tvb, offset, 6, ENC_NA);
6178         offset += 6;
6179     }
6180 
6181     if (offset == length) {
6182         return;
6183     }
6184 
6185     /* s   Length of C-TAG */
6186     proto_tree_add_item_ret_uint(tree, hf_pfcp_mac_addresses_removed_length_of_ctag, tvb, offset, 1, ENC_BIG_ENDIAN, &length_ctag);
6187     offset += 1;
6188     /* (s+1) to t    C-TAG */
6189     if (length_ctag > 0)
6190     {
6191         offset = decode_pfcp_c_tag(tvb, pinfo, tree, item, offset);
6192     }
6193 
6194     /* u   Length of S-TAG */
6195     proto_tree_add_item_ret_uint(tree, hf_pfcp_mac_addresses_removed_length_of_stag, tvb, offset, 1, ENC_BIG_ENDIAN, &length_stag);
6196     offset += 1;
6197     /* (u+1) to v    S-TAG */
6198     if (length_stag > 0)
6199     {
6200         offset = decode_pfcp_s_tag(tvb, pinfo, tree, item, offset);
6201     }
6202 
6203     if (offset < length) {
6204         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6205     }
6206 }
6207 
6208 /*
6209  * 8.2.105    Ethernet Inactivity Timer
6210  */
6211 static void
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_)6212 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_)
6213 {
6214     int offset = 0;
6215     guint32 value;
6216     /*
6217     * The Ethernet Inactivity Timer field shall be encoded as an Unsigned32 binary integer value.
6218     */
6219 
6220     /* 5 to 8   Inactivity Timer */
6221     proto_tree_add_item_ret_uint(tree, hf_pfcp_ethernet_inactivity_timer, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
6222     offset += 4;
6223 
6224     if (offset < length) {
6225         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6226     }
6227 
6228 }
6229 
6230 /*
6231  * 8.2.106   Subsequent Event Quota
6232  */
6233 static void
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_)6234 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_)
6235 {
6236     int offset = 0;
6237     guint32 value;
6238     /*
6239     * The Subsequent Event Quota field shall be encoded as an Unsigned32 binary integer value.
6240     */
6241 
6242     /* 5 to 8   Subsequent Event Quota */
6243     proto_tree_add_item_ret_uint(tree, hf_pfcp_subsequent_event_quota, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
6244     offset += 4;
6245 
6246     proto_item_append_text(item, "%u", value);
6247 
6248     if (offset < length) {
6249         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6250     }
6251 }
6252 
6253 /*
6254  * 8.2.107   Subsequent Event Threshold
6255  */
6256 static void
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_)6257 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_)
6258 {
6259     int offset = 0;
6260     guint32 value;
6261     /*
6262     * The Subsequent Event Threshold field shall be encoded as an Unsigned32 binary integer value.
6263     */
6264 
6265     /* 5 to 8   Subsequent Event Threshold */
6266     proto_tree_add_item_ret_uint(tree, hf_pfcp_subsequent_event_threshold, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
6267     offset += 4;
6268 
6269     proto_item_append_text(item, "%u", value);
6270 
6271     if (offset < length) {
6272         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6273     }
6274 }
6275 
6276 /*
6277  * 8.2.108   Trace Information
6278  */
6279 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_)6280 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_)
6281 {
6282     int offset = 0;
6283     guint32 length_trigger_events, length_list_interfaces, length_ipaddress;
6284 
6285     /* 5 to 7   MCC MNC */
6286     offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, offset, E212_NONE, TRUE);
6287 
6288     /* 8 to 10   Trace ID */
6289     proto_tree_add_item(tree, hf_pfcp_trace_information_trace_id, tvb, offset, 3, ENC_BIG_ENDIAN);
6290     offset += 3;
6291 
6292     /* 11   Length of Trigger Events */
6293     proto_tree_add_item_ret_uint(tree, hf_pfcp_trace_information_length_trigger_events, tvb, offset, 1, ENC_BIG_ENDIAN, &length_trigger_events);
6294     offset += 1;
6295 
6296     /* 12 to m   Trigger Events */
6297     proto_tree_add_item(tree, hf_pfcp_trace_information_trigger_events, tvb, offset, length_trigger_events, ENC_NA);
6298     offset += length_trigger_events;
6299 
6300     /* m+1   Session Trace Depth */
6301     proto_tree_add_item(tree, hf_pfcp_trace_information_session_trace_depth, tvb, offset, 1, ENC_BIG_ENDIAN);
6302     offset += 1;
6303 
6304     /* m+2   Length of List of Interfaces */
6305     proto_tree_add_item_ret_uint(tree, hf_pfcp_trace_information_length_list_interfaces, tvb, offset, 1, ENC_BIG_ENDIAN, &length_list_interfaces);
6306     offset += 1;
6307 
6308     /* (m+3) to p   List of Interfaces */
6309     proto_tree_add_item(tree, hf_pfcp_trace_information_list_interfaces, tvb, offset, length_list_interfaces, ENC_NA);
6310     offset += length_list_interfaces;
6311 
6312     /* p+1   Length of IP address of Trace Collection Entity  */
6313     proto_tree_add_item_ret_uint(tree, hf_pfcp_trace_information_length_ipaddress, tvb, offset, 1, ENC_BIG_ENDIAN, &length_ipaddress);
6314     offset += 1;
6315 
6316     /* (p+2) to q   IP Address of Trace Collection Entity */
6317     if (length_ipaddress == 4) {
6318         proto_tree_add_item(tree, hf_pfcp_trace_information_ipv4, tvb, offset, length_ipaddress, ENC_NA);
6319     } else if (length_ipaddress == 16) {
6320         proto_tree_add_item(tree, hf_pfcp_trace_information_ipv6, tvb, offset, length_ipaddress, ENC_NA);
6321     }
6322     offset += length_ipaddress;
6323 
6324     if (offset < length) {
6325         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6326     }
6327 }
6328 
6329 /*
6330  * 8.2.109    Framed-Route
6331  */
6332 static void
dissect_pfcp_framed_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_)6333 dissect_pfcp_framed_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_)
6334 {
6335     /* Octet 5 to (n+4) Framed-Route
6336     * The Framed-Route field shall be encoded as an Octet String as the value part of the Framed-Route AVP specified in IETF RFC 2865
6337     * RFC 2865:
6338     * The Text field is one or more octets, and its contents are
6339     *  implementation dependent.  It is intended to be human readable and
6340     *  MUST NOT affect operation of the protocol.  It is recommended that
6341     *  the message contain UTF-8 encoded 10646 [7] characters.
6342     */
6343     proto_tree_add_item(tree, hf_pfcp_framed_route, tvb, 0, length, ENC_UTF_8|ENC_NA);
6344 }
6345 
6346 /*
6347  * 8.2.110    Framed-Routing
6348  */
6349 static void
dissect_pfcp_framed_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_)6350 dissect_pfcp_framed_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_)
6351 {
6352     /* Octet 5 to (n+4) Framed-Routing
6353     * The Framed-Routing field shall be encoded as an Octet String as the value part of the Framed-Routing AVP specified in IETF RFC 2865
6354     */
6355     proto_tree_add_item(tree, hf_pfcp_framed_routing, tvb, 0, length, ENC_NA);
6356 }
6357 
6358 /*
6359  * 8.2.111    Framed-IPv6-Route
6360  */
6361 static void
dissect_pfcp_framed_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_)6362 dissect_pfcp_framed_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_)
6363 {
6364     /* Octet 5 to (n+4) Framed-IPv6-Route
6365     * The Framed-IPv6-Route field shall be encoded as an Octet String as the value part of the Framed-IPv6-Route AVP specified in RFC 3162
6366     * RFC 3162
6367     * "...It is intended to be human readable..."
6368     */
6369     proto_tree_add_item(tree, hf_pfcp_framed_ipv6_route, tvb, 0, length, ENC_UTF_8|ENC_NA);
6370 }
6371 
6372 /*
6373  * 8.2.112   Event Quota
6374  */
6375 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_)6376 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_)
6377 {
6378     int offset = 0;
6379     guint32 value;
6380 
6381     /* 5 to 8   Event Quota
6382     * The Event Quota field shall be encoded as an Unsigned32 binary integer value.
6383     */
6384     proto_tree_add_item_ret_uint(tree, hf_pfcp_event_quota, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
6385     offset += 4;
6386 
6387     proto_item_append_text(item, "%u", value);
6388 
6389     if (offset < length) {
6390         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6391     }
6392 }
6393 
6394 /*
6395  * 8.2.113   Event Threshold
6396  */
6397 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_)6398 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_)
6399 {
6400     int offset = 0;
6401     guint32 value;
6402 
6403     /* 5 to 8   Event Threshold
6404     * The Event Threshold field shall be encoded as an Unsigned32 binary integer value.
6405     */
6406     proto_tree_add_item_ret_uint(tree, hf_pfcp_event_threshold, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
6407     offset += 4;
6408 
6409     proto_item_append_text(item, "%u", value);
6410 
6411     if (offset < length) {
6412         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6413     }
6414 }
6415 
6416 /*
6417  * 8.2.114   Time Stamp
6418  */
6419 static void
dissect_pfcp_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_)6420 dissect_pfcp_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_)
6421 {
6422     char *time_str;
6423     int offset = 0;
6424 
6425     /* The Time Stamp field shall contain a UTC time.
6426     * Octets 5 to 8 shall be encoded in the same format as the first four octets
6427     * of the 64-bit timestamp format as defined in section 6 of IETF RFC 5905.
6428     */
6429     proto_tree_add_item_ret_time_string(tree, hf_pfcp_time_stamp, tvb, offset, 4, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str);
6430     proto_item_append_text(item, "%s", time_str);
6431     offset += 4;
6432 
6433     if (offset < length) {
6434         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6435     }
6436 }
6437 
6438 /*
6439  * 8.2.115   Averaging Window
6440  */
6441 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_)6442 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_)
6443 {
6444     int offset = 0;
6445     guint32 value;
6446 
6447     /* 5 to 8   Averaging Window
6448     * The Averaging Window field shall be encoded as an Unsigned32 binary integer value.
6449     */
6450     proto_tree_add_item_ret_uint(tree, hf_pfcp_averaging_window, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
6451     offset += 4;
6452 
6453     proto_item_append_text(item, "%u", value);
6454 
6455     if (offset < length) {
6456         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6457     }
6458 }
6459 
6460 /*
6461  * 8.2.116   Paging Policy Indicator (PPI)
6462  */
6463 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_)6464 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_)
6465 {
6466     int offset = 0;
6467     guint32 value;
6468 
6469     /* Octet 5  Paging Policy Indicator (PPI)
6470     * The PPI shall be encoded as a value between 0 and 7, as specified in clause 5.5.3.7 of 3GPP TS 38.415
6471     */
6472     proto_tree_add_item_ret_uint(tree, hf_pfcp_paging_policy_indicator, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
6473     offset++;
6474 
6475     proto_item_append_text(item, "%u", value);
6476 
6477     if (offset < length) {
6478         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6479     }
6480 }
6481 
6482 /*
6483  * 8.2.117    APN/DNN
6484  */
6485 static void
dissect_pfcp_apn_dnn(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)6486 dissect_pfcp_apn_dnn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item , guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
6487 {
6488     int      offset = 0;
6489 
6490     /* Octet 5   APN/DNN
6491      * The encoding the APN/DNN field follows 3GPP TS 23.003 [2] clause 9.1.
6492      * The content of the APN/DNN field shall be the full APN/DNN with both the
6493      * APN/DNN Network Identifier and APN/DNN Operator Identifier
6494      */
6495      /* NOTE: The APN/DNN field is not encoded as a dotted string as commonly used in documentation. */
6496 
6497     const guint8* string_value;
6498     proto_tree_add_item_ret_string(tree, hf_pfcp_apn_dnn, tvb, offset, length, ENC_APN_STR | ENC_NA, pinfo->pool, &string_value);
6499     proto_item_append_text(item, "%s", string_value);
6500 
6501 }
6502 
6503 /*
6504  *   8.2.118   3GPP Interface Type
6505  */
6506 
6507 static const value_string pfcp_tgpp_interface_type_vals[] = {
6508 
6509     { 0, "S1-U" },
6510     { 1, "S5/S8-U" },
6511     { 2, "S4-U" },
6512     { 3, "S11-U" },
6513     { 4, "S12" },
6514     { 5, "Gn/Gp-U" },
6515     { 6, "S2a-U" },
6516     { 7, "S2b-U" },
6517     { 8, "eNodeB GTP-U interface for DL data forwarding" },
6518     { 9, "eNodeB GTP-U interface for UL data forwarding" },
6519     { 10, "SGW/UPF GTP-U interface for DL data forwarding" },
6520     { 11, "N3 3GPP Access" },
6521     { 12, "N3 Trusted Non-3GPP Access" },
6522     { 13, "N3 Untrusted Non-3GPP Access" },
6523     { 14, "N3 for data forwarding" },
6524     { 15, "N9 (or N9 for non-roaming)" },
6525     { 16, "SGi" },
6526     { 17, "N6" },
6527     { 18, "N19" },
6528     { 19, "S8-U" },
6529     { 20, "Gp-U" },
6530     { 21, "N9 for roaming" },
6531     { 22, "Iu-U" },
6532     { 23, "N9 for data forwarding" },
6533     { 24, "Sxa-U" },
6534     { 25, "Sxb-U" },
6535     { 26, "Sxc-U" },
6536     { 27, "N4-U" },
6537     { 28, "SGW/UPF GTP-U interface for UL data forwarding" },
6538     { 0, NULL }
6539 };
6540 
6541 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_)6542 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_)
6543 {
6544     int offset = 0;
6545     guint32 tgpp_interface_type;
6546 
6547     /* Octet 5    Spare Node ID Type*/
6548     proto_tree_add_item(tree, hf_pfcp_spare_h1, tvb, offset, 1, ENC_BIG_ENDIAN);
6549     proto_tree_add_item_ret_uint(tree, hf_pfcp_tgpp_interface_type, tvb, offset, 1, ENC_BIG_ENDIAN, &tgpp_interface_type);
6550     proto_item_append_text(item, "%s: ", val_to_str_const(tgpp_interface_type, pfcp_tgpp_interface_type_vals, "Unknown"));
6551     offset++;
6552 
6553     if (offset < length) {
6554         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6555     }
6556 
6557 }
6558 
6559 /*
6560  * 8.2.119   PFCPSRReq-Flags
6561  */
6562 static void
dissect_pfcp_pfcpsrreq_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_)6563 dissect_pfcp_pfcpsrreq_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_)
6564 {
6565     int offset = 0;
6566 
6567     static int * const pfcp_pfcpsrreq_flags[] = {
6568         &hf_pfcp_spare_b7_b1,
6569         &hf_pfcp_pfcpsrreq_flags_b0_psdbu,
6570         NULL
6571     };
6572     /* Octet 5  Spare   Spare   Spare   Spare   Spare   Spare   Spare   PSDBU */
6573     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpsrreq_flags,
6574         ett_pfcp_pfcpsrreq, pfcp_pfcpsrreq_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
6575     offset += 1;
6576 
6577     if (offset < length) {
6578         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6579     }
6580 
6581 }
6582 
6583 /*
6584  * 8.2.120   PFCPAUReq-Flags
6585  */
6586 static void
dissect_pfcp_pfcpaureq_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_)6587 dissect_pfcp_pfcpaureq_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_)
6588 {
6589     int offset = 0;
6590 
6591     static int * const pfcp_pfcpaureq_flags[] = {
6592         &hf_pfcp_spare_b7_b1,
6593         &hf_pfcp_pfcpaureq_flags_b0_parps,
6594         NULL
6595     };
6596     /* Octet 5  Spare   Spare   Spare   Spare   Spare   Spare   Spare   PSDBU */
6597     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpaureq_flags,
6598         ett_pfcp_pfcpaureq, pfcp_pfcpaureq_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
6599     offset += 1;
6600 
6601     if (offset < length) {
6602         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6603     }
6604 
6605 }
6606 
6607 /*
6608  * 8.2.121   Activation Time
6609  */
6610 static void
dissect_pfcp_activation_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_)6611 dissect_pfcp_activation_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_)
6612 {
6613     int offset = 0;
6614     char *time_str;
6615 
6616     /* Octets 5 to 8 shall be encoded in the same format as the first four octets of the 64-bit timestamp
6617      * format as defined in section 6 of IETF RFC 5905
6618      */
6619 
6620     proto_tree_add_item_ret_time_string(tree, hf_pfcp_activation_time, tvb, offset, 4, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str);
6621     proto_item_append_text(item, "%s", time_str);
6622     offset += 4;
6623 
6624     if (offset < length) {
6625         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6626     }
6627 }
6628 
6629 /*
6630  * 8.2.122   Deactivation Time
6631  */
6632 static void
dissect_pfcp_deactivation_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_)6633 dissect_pfcp_deactivation_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_)
6634 {
6635     int offset = 0;
6636     char *time_str;
6637 
6638     /* Octets 5 to 8 shall be encoded in the same format as the first four octets of the 64-bit timestamp
6639      * format as defined in section 6 of IETF RFC 5905
6640      */
6641 
6642     proto_tree_add_item_ret_time_string(tree, hf_pfcp_deactivation_time, tvb, offset, 4, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str);
6643     proto_item_append_text(item, "%s", time_str);
6644     offset += 4;
6645 
6646     if (offset < length) {
6647         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6648     }
6649 }
6650 
6651 /*
6652  * 8.2.123   MAR ID
6653  */
6654 
6655 static void
dissect_pfcp_mar_id(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args)6656 dissect_pfcp_mar_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args)
6657 {
6658     int offset = 0;
6659 
6660     offset = decode_pfcp_mar_id(tvb, pinfo, tree, item, offset, args);
6661 
6662     if (offset < length) {
6663         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6664     }
6665 }
6666 
6667 /*
6668  * 8.2.124    Steering Functionality
6669  */
6670 static const value_string pfcp_steering_functionality_vals[] = {
6671     { 0, "ATSSS-LL" },
6672     { 1, "MPTCP" },
6673     { 0, NULL }
6674 };
6675 
6676 static void
dissect_pfcp_steering_functionality(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_)6677 dissect_pfcp_steering_functionality(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_)
6678 {
6679     int offset = 0;
6680     guint32 value;
6681     /* Octet 5  Steering Functionality Value
6682     * The Steering Functionality shall be encoded as a 4 bits binary
6683     */
6684     proto_tree_add_item_ret_uint(tree, hf_pfcp_steering_functionality, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
6685     offset++;
6686 
6687     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_steering_functionality_vals, "Unknown"));
6688 
6689     if (offset < length) {
6690         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6691     }
6692 }
6693 
6694 /*
6695  * 8.2.125    Steering Mode
6696  */
6697 static const value_string pfcp_steering_mode_vals[] = {
6698     { 0, "Active-Standby" },
6699     { 1, "Smallest Delay" },
6700     { 2, "Load Balancing" },
6701     { 3, "Priority-based" },
6702     { 0, NULL }
6703 };
6704 
6705 static void
dissect_pfcp_steering_mode(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_)6706 dissect_pfcp_steering_mode(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_)
6707 {
6708     int offset = 0;
6709     guint32 value;
6710     /* Octet 5  Steering Mode Value
6711     * The Steering Mode shall be encoded as a 4 bits binary
6712     */
6713     proto_tree_add_item_ret_uint(tree, hf_pfcp_steering_mode, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
6714     offset++;
6715 
6716     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_steering_mode_vals, "Unknown"));
6717 
6718     if (offset < length) {
6719         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6720     }
6721 }
6722 
6723 /*
6724  * 8.2.126   Weight
6725  */
6726 static void
dissect_pfcp_weight(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_)6727 dissect_pfcp_weight(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_)
6728 {
6729     guint32 value;
6730     /* Octet 5  Weight */
6731     proto_tree_add_item_ret_uint(tree, hf_pfcp_weight, tvb, 0, 1, ENC_BIG_ENDIAN, &value);
6732 
6733     proto_item_append_text(item, "%u", value);
6734 
6735 }
6736 
6737 /*
6738  * 8.2.127    Priority
6739  */
6740 static const value_string pfcp_priority_vals[] = {
6741     { 0, "Active" },
6742     { 1, "Standby" },
6743     { 2, "No Standby" },
6744     { 3, "High" },
6745     { 4, "Low" },
6746     { 0, NULL }
6747 };
6748 
6749 static void
dissect_pfcp_priority(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_)6750 dissect_pfcp_priority(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_)
6751 {
6752     int offset = 0;
6753     guint32 value;
6754     /* Octet 5  Priority Value
6755     * The Priority shall be encoded as a 4 bits binary.
6756     */
6757     proto_tree_add_item_ret_uint(tree, hf_pfcp_priority, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
6758     offset++;
6759 
6760     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_priority_vals, "Unknown"));
6761 
6762     if (offset < length) {
6763         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6764     }
6765 }
6766 
6767 /*
6768  * 8.2.128   UE IP address Pool Identity
6769  */
6770 static void
dissect_pfcp_ue_ip_address_pool_identity(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)6771 dissect_pfcp_ue_ip_address_pool_identity(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
6772 {
6773     int offset = 0;
6774     guint32 pool_length;
6775 
6776     /* Octet 7 to "k" UE IP address Pool Identity
6777     * The UE IP address Pool Identity field shall be encoded as an OctetString
6778     * (see the Framed-Ipv6-Pool and Framed-Pool in clause 12.6.3 of 3GPP TS 29.561).
6779     */
6780     proto_tree_add_item_ret_uint(tree, hf_pfcp_ue_ip_address_pool_length, tvb, 0, 2, ENC_BIG_ENDIAN, &pool_length);
6781     offset += 2;
6782 
6783     proto_tree_add_item(tree, hf_pfcp_ue_ip_address_pool_identity, tvb, offset, pool_length, ENC_NA);
6784     offset += pool_length;
6785 
6786     if (offset < length) {
6787         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6788     }
6789 }
6790 
6791 /*
6792  * 8.2.129   Alternative SMF IP Address
6793  */
6794 static void
dissect_pfcp_alternative_smf_ip_address(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)6795 dissect_pfcp_alternative_smf_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
6796 {
6797     int offset = 0;
6798     guint64 alternative_smf_ip_address_flags;
6799 
6800     static int * const pfcp_alternative_smf_ip_address_flags[] = {
6801         &hf_pfcp_spare_b7_b2,
6802         &hf_pfcp_b1_v4,
6803         &hf_pfcp_b0_v6,
6804         NULL
6805     };
6806     /* Octet 5  Spare   V4  V6 */
6807     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_pfcp_alternative_smf_ip_address_flags,
6808         ett_pfcp_alternative_smf_ip_address_flags, pfcp_alternative_smf_ip_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &alternative_smf_ip_address_flags);
6809     offset += 1;
6810 
6811     /* IPv4 address (if present) */
6812     if (alternative_smf_ip_address_flags & 0x2) {
6813         proto_tree_add_item(tree, hf_pfcp_alternative_smf_ip_address_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
6814         proto_item_append_text(item, ", IPv4 %s", tvb_ip_to_str(pinfo->pool, tvb, offset));
6815         offset += 4;
6816     }
6817     /* IPv6 address (if present) */
6818     if (alternative_smf_ip_address_flags & 0x1) {
6819         proto_tree_add_item(tree, hf_pfcp_alternative_smf_ip_address_ipv6, tvb, offset, 16, ENC_NA);
6820         proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset));
6821         offset += 16;
6822     }
6823 
6824     if (offset < length) {
6825         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6826     }
6827 }
6828 
6829 /*
6830  * 8.2.130   Packet Replication and Detection Carry-On Information
6831  */
6832 static void
dissect_pfcp_packet_replication_and_detection_carry_on_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)6833 dissect_pfcp_packet_replication_and_detection_carry_on_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
6834 {
6835     int offset = 0;
6836 
6837     static int * const pfcp_packet_replication_and_detection_carry_on_information_flags[] = {
6838         &hf_pfcp_spare_b7_b4,
6839         &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b3_dcaroni,
6840         &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b2_prin6i,
6841         &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b1_prin19i,
6842         &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b0_priueai,
6843         NULL
6844     };
6845     /* Octet 5  Spare   Spare   Spare   Spare   DCARONI   PRIN6I   PRIN19I   PRIUEAI */
6846     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_packet_replication_and_detection_carry_on_information_flags,
6847         ett_pfcp_packet_replication_and_detection_carry_on_information, pfcp_packet_replication_and_detection_carry_on_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
6848     offset += 1;
6849 
6850     if (offset < length) {
6851         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6852     }
6853 }
6854 
6855 /*
6856  * 8.2.131   SMF Set ID
6857  */
6858 static void
dissect_pfcp_smf_set_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)6859 dissect_pfcp_smf_set_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
6860 {
6861     int offset = 0;
6862 
6863     /* Octet 5  Spare */
6864     proto_tree_add_item(tree, hf_pfcp_spare, tvb, offset, 1, ENC_BIG_ENDIAN);
6865     offset++;
6866 
6867     /* 6 to m  FQDN */
6868     offset = decode_pfcp_fqdn(tvb, pinfo, tree, item, offset, length);
6869 
6870     if (offset < length) {
6871         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6872     }
6873 }
6874 
6875 /*
6876  * 8.2.132   Quota Validity Time
6877  */
6878 static void
dissect_pfcp_quota_validity_time(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)6879 dissect_pfcp_quota_validity_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
6880 {
6881     int offset = 0;
6882     guint value;
6883 
6884     /* The Quota Validity Time value shall be encoded as an Unsigned32 binary integer value. */
6885     proto_tree_add_item_ret_uint(tree, hf_pfcp_validity_time_value, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
6886     offset += 4;
6887 
6888     proto_item_append_text(item, "%u", value);
6889 
6890     if (offset < length) {
6891         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6892     }
6893 }
6894 
6895 /*
6896  * 8.2.133   Number of Reports
6897  */
6898 static void
dissect_pfcp_number_of_reports(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_)6899 dissect_pfcp_number_of_reports(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_)
6900 {
6901     guint value;
6902 
6903     /* Number of Reports, an Unigned16 binary integer value excluding the first value "0". */
6904     proto_tree_add_item_ret_uint(tree, hf_pfcp_number_of_reports, tvb, 0, length, ENC_BIG_ENDIAN, &value);
6905     proto_item_append_text(item, "%u", value);
6906 }
6907 
6908 /*
6909  * 8.2.134   PFCPASRsp-Flags
6910  */
6911 static void
dissect_pfcp_pfcpasrsp_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_)6912 dissect_pfcp_pfcpasrsp_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_)
6913 {
6914     int offset = 0;
6915 
6916     static int * const pfcp_pfcpasrsp_flags_flags[] = {
6917         &hf_pfcp_spare_b7_b2,
6918         &hf_pfcp_pfcpasrsp_flags_flags_b1_uupsi,
6919         &hf_pfcp_pfcpasrsp_flags_flags_b0_psrei,
6920         NULL
6921     };
6922     /* Octet 5  Spare   UUPSI   PSREI */
6923     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpasrsp_flags_flags,
6924         ett_pfcp_pfcpasrsp_flags, pfcp_pfcpasrsp_flags_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
6925     offset += 1;
6926 
6927     if (offset < length) {
6928         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6929     }
6930 }
6931 
6932 /*
6933  * 8.2.135   CP PFCP Entity IP Address
6934  */
6935 static void
dissect_pfcp_cp_pfcp_entity_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_)6936 dissect_pfcp_cp_pfcp_entity_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_)
6937 {
6938     int offset = 0;
6939     guint64 cp_pfcp_entity_ip_address_flags;
6940 
6941     static int * const pfcp_cp_pfcp_entity_ip_address_flags[] = {
6942         &hf_pfcp_spare_b7_b2,
6943         &hf_pfcp_b1_v4,
6944         &hf_pfcp_b0_v6,
6945         NULL
6946     };
6947     /* Octet 5  Spare   V4  V6 */
6948     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_cp_pfcp_entity_ip_address_flags,
6949         ett_pfcp_cp_pfcp_entity_ip_address_flags, pfcp_cp_pfcp_entity_ip_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &cp_pfcp_entity_ip_address_flags);
6950     offset += 1;
6951 
6952     /* IPv4 address (if present) */
6953     if ((cp_pfcp_entity_ip_address_flags & 0x2)) {
6954         proto_tree_add_item(tree, hf_pfcp_cp_pfcp_entity_ip_address_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
6955         proto_item_append_text(item, ", IPv4 %s", tvb_ip_to_str(pinfo->pool, tvb, offset));
6956         offset += 4;
6957     }
6958     /* IPv6 address (if present) */
6959     if ((cp_pfcp_entity_ip_address_flags & 0x1)) {
6960         proto_tree_add_item(tree, hf_pfcp_cp_pfcp_entity_ip_address_ipv6, tvb, offset, 16, ENC_NA);
6961         proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset));
6962         offset += 16;
6963     }
6964 
6965     if (offset < length) {
6966         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6967     }
6968 }
6969 
6970 /*
6971  * 8.2.136   PFCPSEReq-Flags
6972  */
6973 static void
dissect_pfcp_pfcpsereq_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_)6974 dissect_pfcp_pfcpsereq_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_)
6975 {
6976     int offset = 0;
6977 
6978     static int * const pfcp_pfcpsereq_flags_flags[] = {
6979         &hf_pfcp_spare_b7_b2,
6980         &hf_pfcp_pfcpsereq_flags_flags_b1_sumpc,
6981         &hf_pfcp_pfcpsereq_flags_flags_b0_resti,
6982         NULL
6983     };
6984     /* Octet 5  Spare   SUMPC   RESTI */
6985     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpsereq_flags_flags,
6986         ett_pfcp_pfcpsereq_flags, pfcp_pfcpsereq_flags_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
6987     offset += 1;
6988 
6989     if (offset < length) {
6990         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
6991     }
6992 }
6993 
6994 /*
6995  * 8.2.137   IP Multicast Address
6996  */
6997 static void
dissect_pfcp_ip_multicast_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_)6998 dissect_pfcp_ip_multicast_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_)
6999 {
7000     int offset = 0;
7001     guint64 ip_multicast_address_flags;
7002 
7003     static int * const pfcp_ip_multicast_address_flags[] = {
7004         &hf_pfcp_spare_b7_b4,
7005         &hf_pfcp_ip_multicast_address_flags_b3_any,
7006         &hf_pfcp_ip_multicast_address_flags_b2_range,
7007         &hf_pfcp_b1_v4,
7008         &hf_pfcp_b0_v6,
7009         NULL
7010     };
7011     /* Octet 5  Spare   A(Any)   R(Range)   V4  V6 */
7012     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_ip_multicast_address_flags,
7013         ett_pfcp_ip_multicast_address_flags, pfcp_ip_multicast_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &ip_multicast_address_flags);
7014     offset += 1;
7015 
7016     /* Any: If this bit is set to "1", this indicates any IP multicast address; in this case, no IP address field shall be included. */
7017     if (!(ip_multicast_address_flags & 0x8)) {
7018         /* IPv4 address (if present) */
7019         if ((ip_multicast_address_flags & 0x2)) {
7020             proto_tree_add_item(tree, hf_pfcp_ip_multicast_address_start_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
7021             offset += 4;
7022         }
7023         /* IPv6 address (if present) */
7024         if ((ip_multicast_address_flags & 0x1)) {
7025             proto_tree_add_item(tree, hf_pfcp_ip_multicast_address_start_ipv6, tvb, offset, 16, ENC_NA);
7026             offset += 16;
7027         }
7028         /* Range */
7029         if ((ip_multicast_address_flags & 0x4)) {
7030             /* IPv4 address (if present) */
7031             if ((ip_multicast_address_flags & 0x2)) {
7032                 proto_tree_add_item(tree, hf_pfcp_ip_multicast_address_end_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
7033                 offset += 4;
7034             }
7035             /* IPv6 address (if present) */
7036             if ((ip_multicast_address_flags & 0x1)) {
7037                 proto_tree_add_item(tree, hf_pfcp_ip_multicast_address_end_ipv6, tvb, offset, 16, ENC_NA);
7038                 offset += 16;
7039             }
7040         }
7041     }
7042 
7043     if (offset < length) {
7044         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
7045     }
7046 }
7047 
7048 /*
7049  * 8.2.138   Source IP Address
7050  */
7051 static void
dissect_pfcp_source_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_)7052 dissect_pfcp_source_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_)
7053 {
7054     int offset = 0;
7055     guint64 source_ip_address_flags;
7056 
7057     static int * const pfcp_source_ip_address_flags[] = {
7058         &hf_pfcp_spare_b7_b3,
7059         &hf_pfcp_source_ip_address_flags_b2_mpl,
7060         &hf_pfcp_b1_v4,
7061         &hf_pfcp_b0_v6,
7062         NULL
7063     };
7064     /* Octet 5  Spare   V4  V6 */
7065     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_source_ip_address_flags,
7066         ett_pfcp_source_ip_address_flags, pfcp_source_ip_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &source_ip_address_flags);
7067     offset += 1;
7068 
7069     /* IPv4 address (if present) */
7070     if ((source_ip_address_flags & 0x2)) {
7071         proto_tree_add_item(tree, hf_pfcp_source_ip_address_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
7072         proto_item_append_text(item, ", IPv4 %s", tvb_ip_to_str(pinfo->pool, tvb, offset));
7073         offset += 4;
7074     }
7075     /* IPv6 address (if present) */
7076     if ((source_ip_address_flags & 0x1)) {
7077         proto_tree_add_item(tree, hf_pfcp_source_ip_address_ipv6, tvb, offset, 16, ENC_NA);
7078         proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset));
7079         offset += 16;
7080     }
7081     /* Mask/Prefix Length (if present) */
7082     if ((source_ip_address_flags & 0x4)) {
7083         proto_tree_add_item(tree, hf_pfcp_source_ip_address_mask_prefix_lengt, tvb, offset, 16, ENC_NA);
7084         proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset));
7085         offset += 16;
7086     }
7087 
7088 
7089     if (offset < length) {
7090         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
7091     }
7092 }
7093 
7094 /*
7095  * 8.2.139   Packet Rate Status
7096  */
7097 static void
dissect_pfcp_packet_rate_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_)7098 dissect_pfcp_packet_rate_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_)
7099 {
7100     int offset = 0;
7101     guint64 flags_val;
7102 
7103     static int * const pfcp_packet_rate_status_flags[] = {
7104         &hf_pfcp_spare_b7_b3,
7105         &hf_pfcp_packet_rate_status_flags_b2_apr,
7106         &hf_pfcp_packet_rate_status_flags_b1_dl,
7107         &hf_pfcp_packet_rate_status_flags_b0_ul,
7108         NULL
7109     };
7110     /* Octet 5  Spare   APR   DL   UL*/
7111     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_packet_rate_status_flags,
7112         ett_pfcp_packet_rate_status, pfcp_packet_rate_status_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
7113     offset += 1;
7114 
7115 
7116     /* Number of Remaining Uplink Packets Allowed */
7117     if ((flags_val & 0x1)) {
7118         proto_tree_add_item(tree, hf_pfcp_packet_rate_status_ul, tvb, offset, 2, ENC_BIG_ENDIAN);
7119         offset += 2;
7120 
7121         if ((flags_val & 0x4)) {
7122             proto_tree_add_item(tree, hf_pfcp_packet_rate_status_apr_ul, tvb, offset, 2, ENC_BIG_ENDIAN);
7123             offset += 2;
7124         }
7125     }
7126     /* Number of Remaining Downlink Packets Allowed */
7127     if ((flags_val & 0x2)) {
7128         proto_tree_add_item(tree, hf_pfcp_packet_rate_status_dl, tvb, offset, 2, ENC_BIG_ENDIAN);
7129         offset += 2;
7130 
7131         /* Additional number of Remaining Downlink Packets Allowed */
7132         if ((flags_val & 0x4)) {
7133             proto_tree_add_item(tree, hf_pfcp_packet_rate_status_apr_dl, tvb, offset, 2, ENC_BIG_ENDIAN);
7134             offset += 2;
7135         }
7136     }
7137     /* Rate Control Status Validity Time */
7138     if (offset < length) {
7139         proto_tree_add_item(tree, hf_pfcp_packet_rate_status_validity_time, tvb, offset, 8, ENC_BIG_ENDIAN);
7140         offset += 8;
7141     }
7142 
7143     if (offset < length) {
7144         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
7145     }
7146 }
7147 
7148 /*
7149  * 8.2.140   Create Bridge Info for TSC
7150  */
7151 static void
dissect_pfcp_create_bridge_info_for_tsc(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7152 dissect_pfcp_create_bridge_info_for_tsc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7153 {
7154     int offset = 0;
7155 
7156     static int * const pfcp_create_bridge_info_for_tsc_flags[] = {
7157         &hf_pfcp_spare_b7_b1,
7158         &hf_pfcp_create_bridge_info_for_tsc_flags_b0_bii,
7159         NULL
7160     };
7161     /* Octet 5  Spare   BII */
7162     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_create_bridge_info_for_tsc_flags,
7163         ett_pfcp_create_bridge_info_for_tsc, pfcp_create_bridge_info_for_tsc_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
7164     offset += 1;
7165 
7166     if (offset < length) {
7167         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
7168     }
7169 }
7170 
7171 /*
7172  * 8.2.141   DS-TT Port Number
7173  */
7174 static void
dissect_pfcp_ds_tt_port_number(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7175 dissect_pfcp_ds_tt_port_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7176 {
7177     guint value;
7178 
7179     /* The DS-TT Port Number shall contain one Port Number value */
7180     proto_tree_add_item_ret_uint(tree, hf_pfcp_ds_tt_port_number, tvb, 0, length, ENC_BIG_ENDIAN, &value);
7181     proto_item_append_text(item, "%u", value);
7182 }
7183 
7184 /*
7185  * 8.2.142   NW-TT Port Number
7186  */
7187 static void
dissect_pfcp_nw_tt_port_number(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7188 dissect_pfcp_nw_tt_port_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7189 {
7190     guint value;
7191 
7192     /* The NW-TT Port Number shall contain one Port Number value */
7193     proto_tree_add_item_ret_uint(tree, hf_pfcp_nw_tt_port_number, tvb, 0, length, ENC_BIG_ENDIAN, &value);
7194     proto_item_append_text(item, "%u", value);
7195 }
7196 
7197 /*
7198  * 8.2.143   5GS User Plane Node
7199  */
7200 static void
dissect_pfcp_5gs_user_plane_node(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7201 dissect_pfcp_5gs_user_plane_node(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7202 {
7203     int offset = 0;
7204     guint64 flags_val;
7205 
7206     static int * const pfcp_5gs_user_plane_node_flags[] = {
7207         &hf_pfcp_spare_b7_b4,
7208         &hf_pfcp_5gs_user_plane_node_flags_b0_bid,
7209         NULL
7210     };
7211     /* Octet 5  Spare   BID */
7212     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_5gs_user_plane_node_flags,
7213         ett_pfcp_5gs_user_plane_node, pfcp_5gs_user_plane_node_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &flags_val);
7214     offset += 1;
7215 
7216     // Bit 1 – BID: If this bit is set to "1", then the Use Plane value field shall be present,
7217     // The Bridge ID value is defined in IEEE.802.1Q clause 14.2.5 and value shall be encoded as an Unisigned64 binary integer.
7218     if ((flags_val & 0x1)) {
7219         proto_tree_add_item(tree, hf_pfcp_5gs_user_plane_node_value, tvb, offset, 6, ENC_NA);
7220         offset += 6;
7221     }
7222 
7223     if (offset < length) {
7224         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
7225     }
7226 }
7227 
7228 /*
7229  * 8.2.144   Port Management Information Container
7230  */
7231 static void
dissect_pfcp_port_management_information_container(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7232 dissect_pfcp_port_management_information_container(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7233 {
7234     /* Oct 5 The Port Management Information field shall be encoded as an Octet String. */
7235     proto_tree_add_item(tree, hf_pfcp_port_management_information, tvb, 0, length, ENC_NA);
7236 }
7237 
7238 /*
7239  * 8.2.145   Requested Clock Drift Information
7240  */
7241 static void
dissect_pfcp_requested_clock_drift_control_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7242 dissect_pfcp_requested_clock_drift_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7243 {
7244     int offset = 0;
7245 
7246     static int * const pfcp_requested_clock_drift_control_information_flags[] = {
7247         &hf_pfcp_spare_b7_b2,
7248         &hf_pfcp_requested_clock_drift_control_information_flags_b1_rrcr,
7249         &hf_pfcp_requested_clock_drift_control_information_flags_b0_rrto,
7250         NULL
7251     };
7252     /* Octet 5  Spare   BII */
7253     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_requested_clock_drift_control_information_flags,
7254         ett_pfcp_requested_clock_drift_control_information, pfcp_requested_clock_drift_control_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
7255     offset += 1;
7256 
7257     if (offset < length) {
7258         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7259     }
7260 }
7261 
7262 /*
7263  * 8.2.146  Time Domain Number
7264  */
7265 static void
dissect_pfcp_time_domain_number(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_)7266 dissect_pfcp_time_domain_number(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_)
7267 {
7268     int offset = 0;
7269     guint value;
7270 
7271     /* Oct 5 The TSN Time Domain Number value field shall be encoded as a binary integer value. */
7272     proto_tree_add_item_ret_uint(tree, hf_pfcp_time_domain_number_value, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
7273     offset++;
7274 
7275     proto_item_append_text(item, "%u", value);
7276 
7277     if (offset < length) {
7278         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7279     }
7280 }
7281 
7282 /*
7283  * 8.2.147   Time Offset Threshold
7284  */
7285 static void
dissect_pfcp_time_offset_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_)7286 dissect_pfcp_time_offset_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_)
7287 {
7288     int offset = 0;
7289 
7290     /* Oct 5 to 12 The Time Offset Threshold field shall be encoded as a signed64 binary integer value. It shall contain the Time Offset Threshold in nanoseconds. */
7291     proto_tree_add_item(tree, hf_pfcp_time_offset_threshold, tvb, offset, 8, ENC_BIG_ENDIAN);
7292     offset += 8;
7293 
7294     if (offset < length) {
7295         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7296     }
7297 }
7298 
7299 /*
7300  * 8.2.148   Cumulative rateRatio Threshold
7301  */
7302 static void
dissect_pfcp_cumulative_rate_ratio_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_)7303 dissect_pfcp_cumulative_rate_ratio_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_)
7304 {
7305     int offset = 0;
7306 
7307     /* Oct 5 The Cumulative rateRatio Threshold field shall be encoded as the cumulativeRateRatio (Integer32) specified in clauses 14.4.2 and 15.6 of IEEE Std 802.1AS-Rev/D7.3 [58], i.e. the quantity "(rateRatio- 1.0)(2^41)". */
7308     proto_tree_add_item(tree, hf_pfcp_cumulative_rate_ratio_threshold, tvb, offset, 4, ENC_BIG_ENDIAN);
7309     offset += 4;
7310 
7311     if (offset < length) {
7312         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7313     }
7314 }
7315 
7316 /*
7317  * 8.2.149   Time Offset Measurement
7318  */
7319 static void
dissect_pfcp_time_offset_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_)7320 dissect_pfcp_time_offset_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_)
7321 {
7322     int offset = 0;
7323 
7324     /* Oct 5 The Time Offset Measurement field shall be encoded as a signed64 binary integer value. It shall contain the Time Offset Measurement in nanoseconds. */
7325     proto_tree_add_item(tree, hf_pfcp_time_offset_measurement, tvb, offset, 8, ENC_BIG_ENDIAN);
7326     offset += 8;
7327 
7328     if (offset < length) {
7329         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7330     }
7331 }
7332 
7333 /*
7334  * 8.2.150   Cumulative rateRatio Measurement
7335  */
7336 static void
dissect_pfcp_cumulative_rate_ratio_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_)7337 dissect_pfcp_cumulative_rate_ratio_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_)
7338 {
7339     int offset = 0;
7340 
7341     /* Oct 5 The Cumulative rateRatio Measurement field shall be encoded as the cumulativeRateRatio (Integer32) specified in clauses 14.4.2 and 15.6 of IEEE Std 802.1AS-Rev/D7.3 [58], i.e. the quantity "(rateRatio- 1.0)(2^41)".  */
7342     proto_tree_add_item(tree, hf_pfcp_cumulative_rate_ratio_measurement, tvb, offset, 4, ENC_BIG_ENDIAN);
7343     offset += 4;
7344 
7345     if (offset < length) {
7346         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7347     }
7348 }
7349 
7350 /*
7351  * 8.2.151   SRR ID
7352  */
7353 
7354 static void
dissect_pfcp_srr_id(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args)7355 dissect_pfcp_srr_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args)
7356 {
7357     int offset = 0;
7358 
7359     offset = decode_pfcp_srr_id(tvb, pinfo, tree, item, offset, args);
7360 
7361     if (offset < length) {
7362         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
7363     }
7364 }
7365 
7366 /*
7367  * 8.2.152   Requested Access Availability Information
7368  */
7369 static void
dissect_pfcp_requested_access_availability_control_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7370 dissect_pfcp_requested_access_availability_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7371 {
7372     int offset = 0;
7373 
7374     static int * const pfcp_requested_access_availability_control_information_flags[] = {
7375         &hf_pfcp_spare_b7_b1,
7376         &hf_pfcp_requested_access_availability_control_information_flags_b0_rrca,
7377         NULL
7378     };
7379     /* Octet 5  Spare   RRCA */
7380     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_requested_access_availability_control_information_flags,
7381         ett_pfcp_requested_access_availability_control_information, pfcp_requested_access_availability_control_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
7382     offset += 1;
7383 
7384     if (offset < length) {
7385         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7386     }
7387 }
7388 
7389 /*
7390  * 8.2.153   Access Availability Information
7391  */
7392 static const value_string pfcp_availability_status_vals[] = {
7393     { 0, "Access has become unavailable" },
7394     { 1, "Access has become available" },
7395     { 0, NULL }
7396 };
7397 static const value_string pfcp_availability_type_vals[] = {
7398     { 0, "3GPP access type" },
7399     { 1, "Non-3GPP access type" },
7400     { 0, NULL }
7401 };
7402 
7403 static void
dissect_pfcp_access_availability_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_)7404 dissect_pfcp_access_availability_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_)
7405 {
7406     int offset = 0;
7407 
7408     /* Octet 5 */
7409     /* Availability Status */
7410     proto_tree_add_item(tree, hf_pfcp_availability_status, tvb, offset, 1, ENC_BIG_ENDIAN);
7411 
7412     /* Access Type  */
7413     proto_tree_add_item(tree, hf_pfcp_availability_type, tvb, offset, 1, ENC_BIG_ENDIAN);
7414     offset++;
7415 
7416     if (offset < length) {
7417         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7418     }
7419 }
7420 
7421 /*
7422  * 8.2.154   MPTCP Control Information
7423  */
7424 static void
dissect_pfcp_mptcp_control_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7425 dissect_pfcp_mptcp_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7426 {
7427     int offset = 0;
7428 
7429     static int * const pfcp_mptcp_control_information_flags[] = {
7430         &hf_pfcp_spare_b7_b1,
7431         &hf_pfcp_mptcp_control_information_flags_b0_tci,
7432         NULL
7433     };
7434     /* Octet 5  Spare   RRCA */
7435     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_mptcp_control_information_flags,
7436         ett_pfcp_mptcp_control_information, pfcp_mptcp_control_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
7437     offset += 1;
7438 
7439     if (offset < length) {
7440         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7441     }
7442 }
7443 
7444 /*
7445  * 8.2.155   ATSSS-LL Control Information
7446  */
7447 static void
dissect_pfcp_atsss_ll_control_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7448 dissect_pfcp_atsss_ll_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7449 {
7450     int offset = 0;
7451 
7452     static int * const pfcp_atsss_ll_control_information_flags[] = {
7453         &hf_pfcp_spare_b7_b1,
7454         &hf_pfcp_atsss_ll_control_information_flags_b0_lli,
7455         NULL
7456     };
7457     /* Octet 5  Spare   RRCA */
7458     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_atsss_ll_control_information_flags,
7459         ett_pfcp_atsss_ll_control_information, pfcp_atsss_ll_control_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
7460     offset += 1;
7461 
7462 
7463     if (offset < length) {
7464         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7465     }
7466 }
7467 
7468 /*
7469  * 8.2.156   PMF Control Information
7470  */
7471 static void
dissect_pfcp_pmf_control_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7472 dissect_pfcp_pmf_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7473 {
7474     int offset = 0;
7475     guint64 flags;
7476     guint32 value, i;
7477 
7478     static int * const pfcp_pmf_control_information_flags[] = {
7479         &hf_pfcp_spare_b7_b3,
7480         &hf_pfcp_pmf_control_information_flags_b2_pqpm,
7481         &hf_pfcp_pmf_control_information_flags_b1_drtti,
7482         &hf_pfcp_pmf_control_information_flags_b0_pmfi,
7483         NULL
7484     };
7485     /* Octet 5  Spare   PQPM   DRTTI   RRCA */
7486     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_pmf_control_information_flags,
7487         ett_pfcp_pmf_control_information, pfcp_pmf_control_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
7488     offset += 1;
7489 
7490     /* QFI */
7491     if ((flags & 0x4)) {
7492         /* 6   Number of QFI  */
7493         proto_tree_add_item_ret_uint(tree, hf_pfcp_pmf_control_information_number_of_qfi, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
7494         offset += 1;
7495 
7496         /* 7 to (7+p+1) QFI  */
7497         for (i = 0; i < value; i++)
7498         {
7499             offset = decode_pfcp_qfi(tvb, pinfo, tree, item, offset);
7500         }
7501     }
7502 
7503     if (offset < length) {
7504         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7505     }
7506 }
7507 
7508 /*
7509  * 8.2.157   MPTCP Address Information
7510  */
7511 static void
dissect_pfcp_mptcp_address_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7512 dissect_pfcp_mptcp_address_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7513 {
7514     int offset = 0;
7515     guint64 mptcp_address_flags;
7516 
7517     static int * const pfcp_mptcp_ip_address_information_flags[] = {
7518         &hf_pfcp_spare_b7_b2,
7519         &hf_pfcp_mptcp_address_information_flags_b1_v6,
7520         &hf_pfcp_mptcp_address_information_flags_b0_v4,
7521         NULL
7522     };
7523     /* Octet 5  Spare   V6  V4 */
7524     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_mptcp_address_information_flags,
7525         ett_pfcp_mptcp_entity_ip_address_information, pfcp_mptcp_ip_address_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &mptcp_address_flags);
7526     offset += 1;
7527 
7528     /* Octet 6  MPTCP Proxy Type */
7529     proto_tree_add_item(tree, hf_pfcp_mptcp_proxy_type, tvb, offset, 1, ENC_NA);
7530     offset++;
7531 
7532     /* Octet 7 to 8  MPTCP Proxy Port */
7533     proto_tree_add_item(tree, hf_pfcp_mptcp_proxy_port, tvb, offset, 2, ENC_BIG_ENDIAN);
7534     offset += 2;
7535 
7536     /* MPTCP Proxy IPv4 address (if present) */
7537     if ((mptcp_address_flags & 0x1)) {
7538         proto_tree_add_item(tree, hf_pfcp_mptcp_proxy_ip_address_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
7539         proto_item_append_text(item, ", IPv4 %s", tvb_ip_to_str(pinfo->pool, tvb, offset));
7540         offset += 4;
7541     }
7542     /* MPTCP Proxy IPv6 address (if present) */
7543     if ((mptcp_address_flags & 0x2)) {
7544         proto_tree_add_item(tree, hf_pfcp_mptcp_proxy_ip_address_ipv6, tvb, offset, 16, ENC_NA);
7545         proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset));
7546         offset += 16;
7547     }
7548 
7549     if (offset < length) {
7550         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
7551     }
7552 }
7553 
7554 /*
7555  * 8.2.158   UE Link-Specific IP Address
7556  */
7557 static void
dissect_pfcp_ue_link_specific_ip_address(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7558 dissect_pfcp_ue_link_specific_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7559 {
7560     int offset = 0;
7561     guint64 ue_link_specific_ip_address_flags;
7562 
7563     static int * const pfcp_ue_link_specific_ip_address_flags[] = {
7564         &hf_pfcp_spare_b7_b4,
7565         &hf_pfcp_ue_link_specific_ip_address_flags_b3_nv6,
7566         &hf_pfcp_ue_link_specific_ip_address_flags_b2_nv4,
7567         &hf_pfcp_ue_link_specific_ip_address_flags_b1_v6,
7568         &hf_pfcp_ue_link_specific_ip_address_flags_b0_v4,
7569         NULL
7570     };
7571     /* Octet 5  Spare  NV6  NV4  V6  V4 */
7572     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_ue_link_specific_ip_address_flags,
7573         ett_pfcp_ue_link_specific_entity_ip_address, pfcp_ue_link_specific_ip_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &ue_link_specific_ip_address_flags);
7574     offset += 1;
7575 
7576     /* UE Link-Specific IPv4 Address for 3GPP Access (if present) */
7577     if ((ue_link_specific_ip_address_flags & 0x1)) {
7578         proto_tree_add_item(tree, hf_pfcp_ue_link_specific_ip_address_3gpp_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
7579         offset += 4;
7580     }
7581     /* UE Link-Specific IPv6 Address for 3GPP Access (if present) */
7582     if ((ue_link_specific_ip_address_flags & 0x2)) {
7583         proto_tree_add_item(tree, hf_pfcp_ue_link_specific_ip_address_3gpp_ipv6, tvb, offset, 16, ENC_NA);
7584         offset += 16;
7585     }
7586 
7587     /* UE Link-Specific IPv4 Address for Non-3GPP Access (if present) */
7588     if ((ue_link_specific_ip_address_flags & 0x1)) {
7589         proto_tree_add_item(tree, hf_pfcp_ue_link_specific_ip_address_non3gpp_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
7590         offset += 4;
7591     }
7592     /* UE Link-Specific IPv6 Address for Non-3GPP Access (if present) */
7593     if ((ue_link_specific_ip_address_flags & 0x2)) {
7594         proto_tree_add_item(tree, hf_pfcp_ue_link_specific_ip_address_non3gpp_ipv6, tvb, offset, 16, ENC_NA);
7595         offset += 16;
7596     }
7597     if (offset < length) {
7598         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
7599     }
7600 }
7601 
7602 /*
7603  * 8.2.159   PMF Address Information
7604  */
7605 static void
dissect_pfcp_pmf_address_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7606 dissect_pfcp_pmf_address_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7607 {
7608     int offset = 0;
7609     guint64 pmf_address_information_flags;
7610 
7611     static int * const pfcp_pmf_address_information_flags[] = {
7612         &hf_pfcp_spare_b7_b3,
7613         &hf_pfcp_pmf_address_information_flags_b2_mac,
7614         &hf_pfcp_pmf_address_information_flags_b1_v6,
7615         &hf_pfcp_pmf_address_information_flags_b0_v4,
7616         NULL
7617     };
7618     /* Octet 5  Spare   MAC V6  V4 */
7619     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_pmf_address_information_flags,
7620         ett_pfcp_pmf_address_information, pfcp_pmf_address_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &pmf_address_information_flags);
7621     offset += 1;
7622 
7623     /* p to (p+3) PMF IPv4 address (if present) */
7624     if ((pmf_address_information_flags & 0x1)) {
7625         proto_tree_add_item(tree, hf_pfcp_pmf_address_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
7626         offset += 4;
7627     }
7628     /* q to (q+15) PMF IPv6 address (if present) */
7629     if ((pmf_address_information_flags & 0x2)) {
7630         proto_tree_add_item(tree, hf_pfcp_pmf_address_ipv6, tvb, offset, 16, ENC_NA);
7631         offset += 16;
7632     }
7633     /* r to (r+1) PMF Port for 3GPP */
7634     proto_tree_add_item(tree, hf_pfcp_pmf_port_3gpp, tvb, offset, 2, ENC_BIG_ENDIAN);
7635     offset += 2;
7636 
7637     /* s to (s+1) PMF Port for Non-3GPP */
7638     proto_tree_add_item(tree, hf_pfcp_pmf_port_non3gpp, tvb, offset, 2, ENC_BIG_ENDIAN);
7639     offset += 2;
7640 
7641     /* t to (t+5) PMF MAC address for 3GPP access (if present)*/
7642     if ((pmf_address_information_flags & 0x4)) {
7643         proto_tree_add_item(tree, hf_pfcp_pmf_mac_address_3gpp, tvb, offset, 6, ENC_NA);
7644         offset += 6;
7645     }
7646 
7647     /* u to (u+5) PMF MAC address for Non-3GPP access (if present)*/
7648     if ((pmf_address_information_flags & 0x4)) {
7649         proto_tree_add_item(tree, hf_pfcp_pmf_mac_address_non3gpp, tvb, offset, 6, ENC_NA);
7650         offset += 6;
7651     }
7652 
7653     if (offset < length) {
7654         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
7655     }
7656 }
7657 
7658 /*
7659  * 8.2.160   ATSSS-LL Information
7660  */
7661 static void
dissect_pfcp_atsss_ll_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_)7662 dissect_pfcp_atsss_ll_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_)
7663 {
7664     int offset = 0;
7665 
7666     static int * const pfcp_atsss_ll_information_flags[] = {
7667         &hf_pfcp_spare_b7_b1,
7668         &hf_pfcp_atsss_ll_information_flags_b0_lli,
7669         NULL
7670     };
7671     /* Octet 5  Spare   LLI */
7672     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_atsss_ll_information_flags,
7673         ett_pfcp_atsss_ll_information, pfcp_atsss_ll_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
7674     offset += 1;
7675 
7676     if (offset < length) {
7677         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7678     }
7679 }
7680 
7681 /*
7682  * 8.2.161   Data Network Access Identifier
7683  */
7684 static void
dissect_pfcp_data_network_access_identifier(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_)7685 dissect_pfcp_data_network_access_identifier(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_)
7686 {
7687     int offset = 0;
7688 
7689     /* Octet 5 to (n+4) Data Network Access Identifier
7690     * The Data Network Access Identifier field shall be encoded as an OctetString
7691     */
7692     proto_tree_add_item(tree, hf_pfcp_data_network_access_identifier, tvb, offset, length, ENC_NA);
7693 }
7694 
7695 /*
7696  * 8.2.162   Average Packet Delay
7697  */
7698 static void
dissect_pfcp_average_packet_delay(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_)7699 dissect_pfcp_average_packet_delay(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_)
7700 {
7701     int offset = 0;
7702 
7703     /* Octet 5 to 8 Delay Value in milliseconds */
7704     proto_tree_add_item(tree, hf_pfcp_packet_delay_milliseconds, tvb, offset, 4, ENC_BIG_ENDIAN);
7705     offset += 4;
7706 
7707     if (offset < length) {
7708         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7709     }
7710 }
7711 
7712 /*
7713  * 8.2.163   Minimum Packet Delay
7714  */
7715 static void
dissect_pfcp_minimum_packet_delay(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_)7716 dissect_pfcp_minimum_packet_delay(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_)
7717 {
7718     int offset = 0;
7719 
7720     /* Octet 5 to 8 Delay Value in milliseconds */
7721     proto_tree_add_item(tree, hf_pfcp_packet_delay_milliseconds, tvb, offset, 4, ENC_BIG_ENDIAN);
7722     offset += 4;
7723 
7724     if (offset < length) {
7725         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7726     }
7727 }
7728 
7729 /*
7730  * 8.2.164   Maximum Packet Delay
7731  */
7732 static void
dissect_pfcp_maximum_packet_delay(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_)7733 dissect_pfcp_maximum_packet_delay(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_)
7734 {
7735     int offset = 0;
7736 
7737     /* Octet 5 to 8 Delay Value in milliseconds */
7738     proto_tree_add_item(tree, hf_pfcp_packet_delay_milliseconds, tvb, offset, 4, ENC_BIG_ENDIAN);
7739     offset += 4;
7740 
7741     if (offset < length) {
7742         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7743     }
7744 }
7745 
7746 /*
7747  * 8.2.165   QoS Report Trigger
7748  */
7749 static void
dissect_pfcp_qos_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_)7750 dissect_pfcp_qos_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_)
7751 {
7752     int offset = 0;
7753 
7754     static int * const pfcp_qos_report_trigger_flags[] = {
7755         &hf_pfcp_spare_b7_b3,
7756         &hf_pfcp_qos_report_trigger_flags_b2_ire,
7757         &hf_pfcp_qos_report_trigger_flags_b1_thr,
7758         &hf_pfcp_qos_report_trigger_flags_b0_per,
7759         NULL
7760     };
7761     /* Octet 5  Spare   IRE THR PER */
7762     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_qos_report_trigger_flags,
7763         ett_pfcp_qos_report_trigger, pfcp_qos_report_trigger_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
7764     offset += 1;
7765 
7766     if (offset < length) {
7767         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7768     }
7769 }
7770 
7771 /*
7772  * 8.2.166   GTP-U Path Interface Type
7773  */
7774 static void
dissect_pfcp_gtp_u_path_interface_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_)7775 dissect_pfcp_gtp_u_path_interface_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_)
7776 {
7777     int offset = 0;
7778 
7779     static int * const pfcp_gtp_u_path_interface_type_flags[] = {
7780         &hf_pfcp_spare_b7_b2,
7781         &hf_pfcp_gtp_u_path_interface_type_flags_b1_n3,
7782         &hf_pfcp_gtp_u_path_interface_type_flags_b0_n9,
7783         NULL
7784     };
7785     /* Octet 5  Spare   N3  N9 */
7786     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_gtp_u_path_interface_type_flags,
7787         ett_pfcp_gtp_u_path_interface_type, pfcp_gtp_u_path_interface_type_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
7788     offset += 1;
7789 
7790     if (offset < length) {
7791         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7792     }
7793 }
7794 
7795 /*
7796  * 8.2.167   Requested QoS Monitoring
7797  */
7798 static void
dissect_pfcp_requested_qos_monitoring(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_)7799 dissect_pfcp_requested_qos_monitoring(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_)
7800 {
7801     int offset = 0;
7802 
7803     static int * const pfcp_requested_qos_monitoring_flags[] = {
7804         &hf_pfcp_spare_b7_b4,
7805         &hf_pfcp_requested_qos_monitoring_flags_b3_gtpupm,
7806         &hf_pfcp_requested_qos_monitoring_flags_b2_rp,
7807         &hf_pfcp_requested_qos_monitoring_flags_b1_ul,
7808         &hf_pfcp_requested_qos_monitoring_flags_b0_dl,
7809         NULL
7810     };
7811     /* Octet 5  Spare   GTPUPM   RP  Ul  DL */
7812     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_requested_qos_monitoring_flags,
7813         ett_pfcp_requested_qos_monitoring, pfcp_requested_qos_monitoring_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
7814     offset += 1;
7815 
7816     if (offset < length) {
7817         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7818     }
7819 }
7820 
7821 /*
7822  * 8.2.168   Reporting Frequency
7823  */
7824 static void
dissect_pfcp_reporting_frequency(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_)7825 dissect_pfcp_reporting_frequency(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_)
7826 {
7827     int offset = 0;
7828 
7829     static int * const pfcp_reporting_frequency_flags[] = {
7830         &hf_pfcp_spare_b7_b3,
7831         &hf_pfcp_reporting_frequency_flags_b2_sesrl,
7832         &hf_pfcp_reporting_frequency_flags_b1_perio,
7833         &hf_pfcp_reporting_frequency_flags_b0_evett,
7834         NULL
7835     };
7836     /* Octet 5  Spare   RP  Ul  DL */
7837     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_reporting_frequency_flags,
7838         ett_pfcp_reporting_frequency, pfcp_reporting_frequency_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
7839     offset += 1;
7840 
7841     if (offset < length) {
7842         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7843     }
7844 }
7845 
7846 /*
7847  * 8.2.169   Packet Delay Thresholds
7848  */
7849 static void
dissect_pfcp_packet_delay_thresholds(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_)7850 dissect_pfcp_packet_delay_thresholds(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_)
7851 {
7852     int offset = 0;
7853     guint64 packet_delay_thresholds_flags;
7854 
7855     static int * const pfcp_packet_delay_thresholds_flags[] = {
7856         &hf_pfcp_spare_b7_b3,
7857         &hf_pfcp_packet_delay_thresholds_flags_b2_rp,
7858         &hf_pfcp_packet_delay_thresholds_flags_b1_ul,
7859         &hf_pfcp_packet_delay_thresholds_flags_b0_dl,
7860         NULL
7861     };
7862     /* Octet 5  Spare   RP  Ul  DL */
7863     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_packet_delay_thresholds_flags,
7864         ett_pfcp_packet_delay_thresholds, pfcp_packet_delay_thresholds_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &packet_delay_thresholds_flags);
7865     offset += 1;
7866 
7867     /* m to (m+3) Downlink packet delay threshold */
7868     if ((packet_delay_thresholds_flags & 0x1)) {
7869         proto_tree_add_item(tree, hf_pfcp_packet_delay_thresholds_downlink, tvb, offset, 4, ENC_BIG_ENDIAN);
7870         offset += 4;
7871     }
7872 
7873     /* p to (p+3) Uplink packet delay threshold */
7874     if ((packet_delay_thresholds_flags & 0x2)) {
7875         proto_tree_add_item(tree, hf_pfcp_packet_delay_thresholds_uplink, tvb, offset, 4, ENC_BIG_ENDIAN);
7876         offset += 4;
7877     }
7878 
7879     /* q to (q+3) Round trip packet delay threshold */
7880     if ((packet_delay_thresholds_flags & 0x4)) {
7881         proto_tree_add_item(tree, hf_pfcp_packet_delay_thresholds_roundtrip, tvb, offset, 4, ENC_BIG_ENDIAN);
7882         offset += 4;
7883     }
7884 
7885     if (offset < length) {
7886         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7887     }
7888 }
7889 
7890 /*
7891  * 8.2.170   Minimum Wait Time
7892  */
7893 static void
dissect_pfcp_minimum_wait_time(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_)7894 dissect_pfcp_minimum_wait_time(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_)
7895 {
7896     int offset = 0;
7897 
7898     /* Octet 5 to 8     Minimum Wait Time */
7899     proto_tree_add_item(tree, hf_pfcp_minimum_wait_time_seconds, tvb, offset, 4, ENC_BIG_ENDIAN);
7900     offset += 4;
7901 
7902     if (offset < length) {
7903         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7904     }
7905 }
7906 
7907 /*
7908  * 8.2.171   QoS Monitoring Measurement
7909  */
7910 static void
dissect_pfcp_qos_monitoring_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_)7911 dissect_pfcp_qos_monitoring_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_)
7912 {
7913     int offset = 0;
7914     guint64 qos_monitoring_measurement_flags;
7915 
7916     static int * const pfcp_qos_monitoring_measurement_flags[] = {
7917         &hf_pfcp_spare_b7_b4,
7918         &hf_pfcp_qos_monitoring_measurement_flags_b3_plmf,
7919         &hf_pfcp_qos_monitoring_measurement_flags_b2_rp,
7920         &hf_pfcp_qos_monitoring_measurement_flags_b1_ul,
7921         &hf_pfcp_qos_monitoring_measurement_flags_b0_dl,
7922         NULL
7923     };
7924     /* Octet 5  Spare   RP  Ul  DL */
7925     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_qos_monitoring_measurement_flags,
7926         ett_pfcp_qos_monitoring_measurement, pfcp_qos_monitoring_measurement_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &qos_monitoring_measurement_flags);
7927     offset += 1;
7928 
7929     /* m to (m+3) Downlink packet delay threshold */
7930     if ((qos_monitoring_measurement_flags & 0x1)) {
7931         proto_tree_add_item(tree, hf_pfcp_qos_monitoring_measurement_downlink, tvb, offset, 4, ENC_BIG_ENDIAN);
7932         offset += 4;
7933     }
7934 
7935     /* p to (p+3) Uplink packet delay threshold */
7936     if ((qos_monitoring_measurement_flags & 0x2)) {
7937         proto_tree_add_item(tree, hf_pfcp_qos_monitoring_measurement_uplink, tvb, offset, 4, ENC_BIG_ENDIAN);
7938         offset += 4;
7939     }
7940 
7941     /* q to (q+3) Round trip packet delay threshold */
7942     if ((qos_monitoring_measurement_flags & 0x4)) {
7943         proto_tree_add_item(tree, hf_pfcp_qos_monitoring_measurement_roundtrip, tvb, offset, 4, ENC_BIG_ENDIAN);
7944         offset += 4;
7945     }
7946 
7947     if (offset < length) {
7948         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7949     }
7950 }
7951 
7952 /*
7953  * 8.2.172   MT-EDT Control Information
7954  */
7955 static void
dissect_pfcp_mt_edt_control_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7956 dissect_pfcp_mt_edt_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7957 {
7958     int offset = 0;
7959 
7960     static int * const pfcp_mt_edt_control_information_flags[] = {
7961         &hf_pfcp_spare_b7_b1,
7962         &hf_pfcp_mt_edt_control_information_flags_b0_rdsi,
7963         NULL
7964     };
7965     /* Octet 5  Spare   RDSI */
7966     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_mt_edt_control_information_flags,
7967         ett_pfcp_monitoring_measurement, pfcp_mt_edt_control_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
7968     offset += 1;
7969 
7970     if (offset < length) {
7971         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7972     }
7973 }
7974 
7975 /*
7976  * 8.2.173   DL Data Packets Size
7977  */
7978 static void
dissect_pfcp_dl_data_packets_size(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_)7979 dissect_pfcp_dl_data_packets_size(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_)
7980 {
7981     int offset = 0;
7982 
7983     /* Oct 5 to 6 DL Data Packets Size  */
7984     proto_tree_add_item(tree, hf_pfcp_dl_data_packets_size, tvb, offset, 2, ENC_BIG_ENDIAN);
7985     offset += 2;
7986 
7987     if (offset < length) {
7988         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
7989     }
7990 }
7991 
7992 /*
7993  * 8.2.174   QER Control Indications
7994  */
7995 static void
dissect_pfcp_qer_control_indications(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)7996 dissect_pfcp_qer_control_indications(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
7997 {
7998     int offset = 0;
7999 
8000     static int * const pfcp_qer_control_indications_o5_flags[] = {
8001         &hf_pfcp_spare_b7_b1,
8002         &hf_pfcp_qer_control_indications_o5_b0_rcsr,
8003         NULL
8004     };
8005     /* Octet 5  Spare    RCSR */
8006     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_qer_control_indications_o5_flags, ENC_BIG_ENDIAN);
8007     offset++;
8008 
8009     if (offset < length) {
8010         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8011     }
8012 
8013 }
8014 
8015 /*
8016  * 8.2.175   NF Instance ID
8017  */
8018 static void
dissect_pfcp_nf_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_)8019 dissect_pfcp_nf_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_)
8020 {
8021     int offset = 0;
8022 
8023     /* Octet 5 to 20    NF Instance ID */
8024     proto_tree_add_item(tree, hf_pfcp_nf_instance_id, tvb, offset, length, ENC_NA);
8025 }
8026 
8027 /*
8028  * 8.2.176   S-NSSAI
8029  */
8030 static void
dissect_pfcp_s_nssai(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_)8031 dissect_pfcp_s_nssai(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_)
8032 {
8033     int offset = 0;
8034 
8035     /* Octet 5    SST */
8036     proto_tree_add_item(tree, hf_pfcp_s_nssai_sst, tvb, offset, 1, ENC_NA);
8037     offset++;
8038 
8039     /* Octet 6 to 8    SD */
8040     proto_tree_add_item(tree, hf_pfcp_s_nssai_sd, tvb, offset, 3, ENC_NA);
8041     offset += 3;
8042 
8043     if (offset < length) {
8044         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8045     }
8046 }
8047 
8048 /*
8049  * 8.2.177    IP version
8050  */
8051 static void
dissect_pfcp_ip_version(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_)8052 dissect_pfcp_ip_version(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_)
8053 {
8054     int offset = 0;
8055 
8056     static int * const pfcp_ip_version_flags[] = {
8057         &hf_pfcp_spare_b7_b2,
8058         &hf_pfcp_ip_version_flags_b1_v6,
8059         &hf_pfcp_ip_version_flags_b0_v4,
8060         NULL
8061     };
8062     /* Octet 5  Spare  V6  V4 */
8063     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_ip_version_flags,
8064         ett_pfcp_ip_version, pfcp_ip_version_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS);
8065     offset += 1;
8066 
8067     if (offset < length) {
8068         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8069     }
8070 }
8071 
8072 /*
8073  * 8.2.178   PFCPASReq-Flags
8074  */
8075 static void
dissect_pfcp_pfcpasreq_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_)8076 dissect_pfcp_pfcpasreq_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_)
8077 {
8078     int offset = 0;
8079 
8080     static int * const pfcp_pfcpasreq_flags_flags[] = {
8081         &hf_pfcp_spare_b7_b1,
8082         &hf_pfcp_pfcpasreq_flags_flags_b0_uupsi,
8083         NULL
8084     };
8085     /* Octet 5  Spare   UUPSI */
8086     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpasreq_flags_flags,
8087         ett_pfcp_pfcpasreq_flags, pfcp_pfcpasreq_flags_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
8088     offset += 1;
8089 
8090     if (offset < length) {
8091         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8092     }
8093 }
8094 
8095 /*
8096  * 8.2.179   Data Status
8097  */
8098 static void
dissect_pfcp_data_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_)8099 dissect_pfcp_data_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_)
8100 {
8101     int offset = 0;
8102 
8103     static int * const pfcp_data_status_flags[] = {
8104         &hf_pfcp_spare_b7_b2,
8105         &hf_pfcp_data_status_flags_b1_buff,
8106         &hf_pfcp_data_status_flags_b0_drop,
8107         NULL
8108     };
8109     /* Octet 5  Spare   BUFF    DROP */
8110     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_data_status_flags,
8111         ett_pfcp_data_status_flags, pfcp_data_status_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
8112     offset += 1;
8113 
8114     if (offset < length) {
8115         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8116     }
8117 }
8118 
8119 /*
8120  * 8.2.180   RDS Configuration Information
8121  */
8122 static void
dissect_pfcp_rds_configuration_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_)8123 dissect_pfcp_rds_configuration_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_)
8124 {
8125     int offset = 0;
8126 
8127     static int * const pfcp_rds_configuration_information_flags[] = {
8128         &hf_pfcp_spare_b7_b1,
8129         &hf_pfcp_rds_configuration_information_flags_b0_rds,
8130         NULL
8131     };
8132     /* Octet 5  Spare   RDS */
8133     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_rds_configuration_information_flags,
8134         ett_pfcp_rds_configuration_information_flags, pfcp_rds_configuration_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
8135     offset += 1;
8136 
8137     if (offset < length) {
8138         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8139     }
8140 }
8141 
8142 /*
8143  * 8.2.181   MPTCP Application Indication
8144  */
8145 static void
dissect_pfcp_mptcp_application_indication(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)8146 dissect_pfcp_mptcp_application_indication(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8147 {
8148     int offset = 0;
8149 
8150     static int * const pfcp_mptcp_application_indication_flags[] = {
8151         &hf_pfcp_spare_b7_b1,
8152         &hf_pfcp_mptcp_application_indication_flags_b0_mai,
8153         NULL
8154     };
8155     /* Octet 5  Spare   MAI */
8156     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_mptcp_application_indication_flags,
8157         ett_pfcp_rds_configuration_information_flags, pfcp_mptcp_application_indication_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
8158     offset += 1;
8159 
8160     if (offset < length) {
8161         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8162     }
8163 }
8164 
8165 /*
8166  * 8.2.182   User Plane NodeManagement Information Container
8167  */
8168 static void
dissect_pfcp_user_plane_nodemanagement_information_container(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)8169 dissect_pfcp_user_plane_nodemanagement_information_container(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8170 {
8171     int offset = 0;
8172     /* Octet 5 to (n+4) User Plane NodeManagement Information Container
8173     * The User Plane NodeManagement Information Container field shall be encoded as an OctetString.
8174     */
8175     proto_tree_add_item(tree, hf_pfcp_user_plane_nodemanagement_information_container, tvb, offset, length, ENC_NA);
8176 }
8177 
8178 /*
8179  * 8.2.183   Number of UE IP Addresses
8180  */
8181 static void
dissect_pfcp_number_of_ue_ip_addresses(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_)8182 dissect_pfcp_number_of_ue_ip_addresses(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_)
8183 {
8184     int offset = 0;
8185     guint64 number_of_ue_ip_addresses_flags;
8186 
8187     static int * const pfcp_number_of_ue_ip_addresses_flags[] = {
8188         &hf_pfcp_spare_b7_b2,
8189         &hf_pfcp_number_of_ue_ip_addresses_b1_ipv6,
8190         &hf_pfcp_number_of_ue_ip_addresses_b0_ipv4,
8191         NULL
8192     };
8193     /* Octet 5  Spare   Spare   Spare   Spare   Spare   Spare   IPv6  IPv4*/
8194     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_number_of_ue_ip_addresses_flags,
8195         ett_pfcp_number_of_ue_ip_addresses_flags, pfcp_number_of_ue_ip_addresses_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &number_of_ue_ip_addresses_flags);
8196     offset += 1;
8197 
8198     /* a to (a+3)  Number of UE IPv4 Addresses */
8199     if ((number_of_ue_ip_addresses_flags & 0x1) == 1) {
8200         proto_tree_add_item(tree, hf_pfcp_number_of_ue_ip_addresses_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
8201         offset += 4;
8202     }
8203     /* b to (b+3)  Number of UE IPv6 Addresses */
8204     if ((number_of_ue_ip_addresses_flags & 0x2) == 2) {
8205         proto_tree_add_item(tree, hf_pfcp_number_of_ue_ip_addresses_ipv6, tvb, offset, 4, ENC_BIG_ENDIAN);
8206         offset += 4;
8207     }
8208 
8209     if (offset < length) {
8210         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8211     }
8212 }
8213 
8214 /*
8215  * 8.2.184   Validity Timer
8216  */
8217 static void
dissect_pfcp_validity_timer(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)8218 dissect_pfcp_validity_timer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8219 {
8220     int offset = 0;
8221     guint32 value;
8222     /* Octet 5 to 6    Validity Timer
8223     * The Validity Timer value shall be encoded as an Unsigned16 binary integer value. It contains a duration in seconds
8224     */
8225     proto_tree_add_item_ret_uint(tree, hf_pfcp_validity_timer, tvb, offset, 2, ENC_BIG_ENDIAN, &value);
8226     offset += 2;
8227 
8228     proto_item_append_text(item, "%u s", value);
8229 
8230     if (offset < length) {
8231         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8232     }
8233 
8234 }
8235 
8236 /*
8237  * 8.2.185   Offending IE Information
8238  */
8239 static void
dissect_pfcp_offending_ie_information(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_)8240 dissect_pfcp_offending_ie_information(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_)
8241 {
8242     int offset = 0;
8243     guint32 value;
8244 
8245     /* Octet 5 to 6 Type of the offending IE */
8246     proto_tree_add_item_ret_uint(tree, hf_pfcp_offending_ie, tvb, offset, 2, ENC_BIG_ENDIAN, &value);
8247     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_ie_type, "Unknown"));
8248     offset += 2;
8249 
8250     /* Octets 7 to (n+4) shall contain the value of the offending IE that caused the failure */
8251     proto_tree_add_item(tree, hf_pfcp_offending_ie_value, tvb, offset, 4, ENC_BIG_ENDIAN);
8252 }
8253 
8254 /*
8255  * 8.2.186    RAT Type
8256  */
8257 static const value_string pfcp_rattype_vals[] = {
8258     { 0, "Reserved" },
8259     { 1, "UTRAN" },
8260     { 2, "GERAN" },
8261     { 3, "WLAN" },
8262     { 4, "GAN" },
8263     { 5, "HSPA Evolution" },
8264     { 6, "EUTRAN (WB-E-UTRAN)" },
8265     { 7, "Virtual" },
8266     { 8, "EUTRAN-NB-IoT" },
8267     { 9, "LTE-M" },
8268     { 10, "NR" },
8269     { 0, NULL }
8270 };
8271 
8272 static void
dissect_pfcp_rattype(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_)8273 dissect_pfcp_rattype(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_)
8274 {
8275     int offset = 0;
8276     guint32 value;
8277     /* Octet 5  RAT Type  */
8278     proto_tree_add_item_ret_uint(tree, hf_pfcp_rattype, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
8279     offset++;
8280 
8281     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_rattype_vals, "Unknown"));
8282 
8283     if (offset < length) {
8284         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8285     }
8286 }
8287 
8288 /*
8289  * 8.2.187    L2TP User Authentication
8290  */
8291 static void
dissect_pfcp_l2tp_user_authentication(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_)8292 dissect_pfcp_l2tp_user_authentication(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_)
8293 {
8294     int offset = 0;
8295     guint64 l2tp_user_authentication_flags;
8296     guint32 l2tp_length;
8297 
8298     static int * const pfcp_l2tp_user_authentication_flags[] = {
8299         &hf_pfcp_spare_b7_b4,
8300         &hf_pfcp_l2tp_user_authentication_b3_pai,
8301         &hf_pfcp_l2tp_user_authentication_b2_par,
8302         &hf_pfcp_l2tp_user_authentication_b1_pac,
8303         &hf_pfcp_l2tp_user_authentication_b0_pan,
8304         NULL
8305     };
8306 
8307     /* Octet 5-6 Proxy Authen Type Value */
8308     proto_tree_add_item(tree, hf_pfcp_l2tp_user_authentication_proxy_authen_type_value, tvb, offset, 2, ENC_ASCII | ENC_NA);
8309     offset += 2;
8310 
8311     /* Octet 7  Spare   PAI   PAR   PAC  PAN */
8312     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_l2tp_user_authentication_flags,
8313         ett_pfcp_l2tp_user_authentication_flags, pfcp_l2tp_user_authentication_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &l2tp_user_authentication_flags);
8314     offset += 1;
8315 
8316     /* Proxy Authen Name */
8317     if ((l2tp_user_authentication_flags & 0x1)) {
8318         proto_tree_add_item_ret_uint(tree, hf_pfcp_l2tp_user_authentication_proxy_authen_name_len, tvb, offset, 1, ENC_BIG_ENDIAN, &l2tp_length);
8319         offset += 1;
8320         proto_tree_add_item(tree, hf_pfcp_l2tp_user_authentication_proxy_authen_name, tvb, offset, l2tp_length, ENC_ASCII | ENC_NA);
8321         offset += l2tp_length;
8322     }
8323 
8324     /* Proxy Authen Challenge */
8325     if ((l2tp_user_authentication_flags & 0x2)) {
8326         proto_tree_add_item_ret_uint(tree, hf_pfcp_l2tp_user_authentication_proxy_authen_challenge_len, tvb, offset, 1, ENC_BIG_ENDIAN, &l2tp_length);
8327         offset += 1;
8328         proto_tree_add_item(tree, hf_pfcp_l2tp_user_authentication_proxy_authen_challenge, tvb, offset, l2tp_length, ENC_ASCII | ENC_NA);
8329         offset += l2tp_length;
8330     }
8331 
8332     /* Proxy Authen Response */
8333     if ((l2tp_user_authentication_flags & 0x4)) {
8334         proto_tree_add_item_ret_uint(tree, hf_pfcp_l2tp_user_authentication_proxy_authen_response_len, tvb, offset, 1, ENC_BIG_ENDIAN, &l2tp_length);
8335         offset += 1;
8336         proto_tree_add_item(tree, hf_pfcp_l2tp_user_authentication_proxy_authen_response, tvb, offset, l2tp_length, ENC_ASCII | ENC_NA);
8337         offset += l2tp_length;
8338     }
8339 
8340     /* Proxy Authen ID */
8341     if ((l2tp_user_authentication_flags & 0x8)) {
8342         proto_tree_add_item(tree, hf_pfcp_l2tp_user_authentication_proxy_authen_id, tvb, offset, 1, ENC_BIG_ENDIAN);
8343         offset++;
8344     }
8345 
8346     if (offset < length) {
8347         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8348     }
8349 }
8350 
8351 /*
8352  * 8.2.188   LNS Address
8353  */
8354 static void
dissect_pfcp_lns_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_)8355 dissect_pfcp_lns_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_)
8356 {
8357     int offset = 0;
8358 
8359     /* IPv4 address */
8360     if (length == 4) {
8361         proto_tree_add_item(tree, hf_pfcp_lns_address_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
8362         offset += 4;
8363     }
8364     /* IPv6 address */
8365     else if (length == 16) {
8366         proto_tree_add_item(tree, hf_pfcp_lns_address_ipv6, tvb, offset, 16, ENC_NA);
8367         offset += 16;
8368     }
8369 
8370     if (offset < length) {
8371         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8372     }
8373 
8374 }
8375 
8376 /*
8377  * 8.2.189   Tunnel Preference
8378  */
8379 static void
dissect_pfcp_tunnel_preference(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_)8380 dissect_pfcp_tunnel_preference(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_)
8381 {
8382     proto_tree_add_item(tree, hf_pfcp_tunnel_preference_value, tvb, 0, length, ENC_BIG_ENDIAN);
8383 }
8384 
8385 /*
8386  * 8.2.190   Calling Number
8387  */
8388 static void
dissect_pfcp_calling_number(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)8389 dissect_pfcp_calling_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8390 {
8391     proto_tree_add_item(tree, hf_pfcp_calling_number_value, tvb, 0, length, ENC_ASCII | ENC_NA);
8392 }
8393 
8394 /*
8395  * 8.2.191   Called Number
8396  */
8397 static void
dissect_pfcp_called_number(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)8398 dissect_pfcp_called_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8399 {
8400     proto_tree_add_item(tree, hf_pfcp_called_number_value, tvb, 0, length, ENC_ASCII | ENC_NA);
8401 }
8402 
8403 /*
8404  * 8.2.192   L2TP Session Indications
8405  */
8406 static void
dissect_pfcp_l2tp_session_indications(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)8407 dissect_pfcp_l2tp_session_indications(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8408 {
8409     int offset = 0;
8410 
8411     static int * const pfcp_l2tp_session_indications_o5_flags[] = {
8412         &hf_pfcp_spare_b7_b3,
8413         &hf_pfcp_l2tp_session_indications_o5_b2_rensa,
8414         &hf_pfcp_l2tp_session_indications_o5_b1_redsa,
8415         &hf_pfcp_l2tp_session_indications_o5_b0_reuia,
8416         NULL
8417     };
8418     /* Octet 5  Spare   spare    Spare    Spare   Spare   RENSA   REDSA   REUIA */
8419     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_l2tp_session_indications_o5_flags, ENC_BIG_ENDIAN);
8420     offset++;
8421 
8422     if (offset < length) {
8423         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8424     }
8425 
8426 }
8427 
8428 /*
8429  * 8.2.193   DNS Server Address
8430  */
8431 static void
dissect_pfcp_dns_sever_address(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)8432 dissect_pfcp_dns_sever_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8433 {
8434     int offset = 0;
8435 
8436     /* IPv4 address */
8437     proto_tree_add_item(tree, hf_pfcp_node_id_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
8438     proto_item_append_text(item, "%s", tvb_ip_to_str(pinfo->pool, tvb, offset));
8439     offset += 4;
8440 
8441     if (offset < length) {
8442         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8443     }
8444 
8445 }
8446 
8447 /*
8448  * 8.2.194   NBNS Server Address
8449  */
8450 static void
dissect_pfcp_nbns_sever_address(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)8451 dissect_pfcp_nbns_sever_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8452 {
8453     int offset = 0;
8454 
8455     /* IPv4 address */
8456     proto_tree_add_item(tree, hf_pfcp_node_id_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
8457     proto_item_append_text(item, "%s", tvb_ip_to_str(pinfo->pool, tvb, offset));
8458     offset += 4;
8459 
8460     if (offset < length) {
8461         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8462     }
8463 
8464 }
8465 
8466 /*
8467  * 8.2.195   Maximum Receive Unit
8468  */
8469 static void
dissect_pfcp_maximum_receive_unit(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_)8470 dissect_pfcp_maximum_receive_unit(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_)
8471 {
8472     /* Oct 5 to 6   Maximum Receive Unit */
8473     proto_tree_add_item(tree, hf_pfcp_maximum_receive_unit, tvb, 0, length, ENC_BIG_ENDIAN);
8474 }
8475 
8476 /*
8477  * 8.2.196   Thresholds
8478  */
8479 static void
dissect_pfcp_thresholds(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_)8480 dissect_pfcp_thresholds(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_)
8481 {
8482     int offset = 0;
8483     guint64 flags;
8484 
8485     static int * const pfcp_thresholds_flags[] = {
8486         &hf_pfcp_spare_b7_b2,
8487         &hf_pfcp_thresholds_flags_b1_plr,
8488         &hf_pfcp_thresholds_flags_b0_rtt,
8489         NULL
8490     };
8491     /* Octet 5  Spare   PLR   RTT */
8492     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_thresholds_flags,
8493         ett_pfcp_thresholds, pfcp_thresholds_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
8494     offset += 1;
8495 
8496     /* RTT */
8497     if ((flags & 0x1)) {
8498         /* m to (m+1)   RTT  */
8499         proto_tree_add_item(tree, hf_pfcp_thresholds_rtt, tvb, offset, 2, ENC_BIG_ENDIAN);
8500         offset += 2;
8501     }
8502 
8503     /* PLR */
8504     if ((flags & 0x2)) {
8505         /* m to (m+1)   RTT  */
8506         proto_tree_add_item(tree, hf_pfcp_thresholds_plr, tvb, offset, 1, ENC_BIG_ENDIAN);
8507         offset++;
8508     }
8509 
8510     if (offset < length) {
8511         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, length);
8512     }
8513 }
8514 
8515 /*
8516  * 8.2.197   Steering Mode Indicator
8517  */
8518 static void
dissect_pfcp_steering_mode_indications(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)8519 dissect_pfcp_steering_mode_indications(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8520 {
8521     int offset = 0;
8522 
8523     static int * const pfcp_l2tp_steering_mode_indications_o5_flags[] = {
8524         &hf_pfcp_spare_b7_b2,
8525         &hf_pfcp_l2tp_steering_mode_indications_o5_b1_ueai,
8526         &hf_pfcp_l2tp_steering_mode_indications_o5_b0_albi,
8527         NULL
8528     };
8529     /* Octet 5  Spare   spare    Spare    Spare   Spare   Spare   UEAI   ALBI */
8530     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_l2tp_steering_mode_indications_o5_flags, ENC_BIG_ENDIAN);
8531     offset++;
8532 
8533     if (offset < length) {
8534         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8535     }
8536 
8537 }
8538 
8539 /*
8540  * 8.2.198    Group ID
8541  */
8542 static void
dissect_pfcp_group_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)8543 dissect_pfcp_group_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8544 {
8545     /* Octet 5 to (n+4) Group ID */
8546     proto_tree_add_item(tree, hf_pfcp_group_id, tvb, 0, length, ENC_UTF_8|ENC_NA);
8547 }
8548 
8549 /*
8550  * 8.2.199   CP IP Address
8551  */
8552 static void
dissect_pfcp_cp_ip_address(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)8553 dissect_pfcp_cp_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8554 {
8555     int offset = 0;
8556     guint64 cp_ip_address_flags;
8557 
8558     static int * const pfcp_cp_ip_address_flags[] = {
8559         &hf_pfcp_spare_b7_b2,
8560         &hf_pfcp_b1_v4,
8561         &hf_pfcp_b0_v6,
8562         NULL
8563     };
8564     /* Octet 5  Spare   V4  V6 */
8565     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_cp_ip_address_flags,
8566         ett_pfcp_cp_ip_address_flags, pfcp_cp_ip_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &cp_ip_address_flags);
8567     offset += 1;
8568 
8569     /* IPv4 address (if present) */
8570     if (cp_ip_address_flags & 0x2) {
8571         proto_tree_add_item(tree, hf_pfcp_cp_ip_address_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
8572         proto_item_append_text(item, ", IPv4 %s", tvb_ip_to_str(pinfo->pool, tvb, offset));
8573         offset += 4;
8574     }
8575     /* IPv6 address (if present) */
8576     if (cp_ip_address_flags & 0x1) {
8577         proto_tree_add_item(tree, hf_pfcp_cp_ip_address_ipv6, tvb, offset, 16, ENC_NA);
8578         proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset));
8579         offset += 16;
8580     }
8581 
8582     if (offset < length) {
8583         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8584     }
8585 }
8586 
8587 /*
8588  * 8.2.200   IP Address and Port Number Replacement
8589  */
8590 static void
dissect_pfcp_ip_address_and_port_number_replacement(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_)8591 dissect_pfcp_ip_address_and_port_number_replacement(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_)
8592 {
8593     int offset = 0;
8594     guint64 ip_address_and_port_number_replacement_flags;
8595 
8596     static int * const pfcp_ip_address_and_port_number_replacement_flags[] = {
8597         &hf_pfcp_spare_b7_b6,
8598         &hf_pfcp_ip_address_and_port_number_replacement_flag_b5_spn,
8599         &hf_pfcp_ip_address_and_port_number_replacement_flag_b4_sipv6,
8600         &hf_pfcp_ip_address_and_port_number_replacement_flag_b3_sipv4,
8601         &hf_pfcp_ip_address_and_port_number_replacement_flag_b2_dpn,
8602         &hf_pfcp_ip_address_and_port_number_replacement_flag_b1_v6,
8603         &hf_pfcp_ip_address_and_port_number_replacement_flag_b0_v4,
8604         NULL
8605     };
8606     /* Octet 5  Spare  SPN    SIPV6   SIPV4   DPN     V6      V4*/
8607     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_ip_address_and_port_number_replacement_flags,
8608         ett_pfcp_ip_address_and_port_number_replacement_flags, pfcp_ip_address_and_port_number_replacement_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &ip_address_and_port_number_replacement_flags);
8609     offset += 1;
8610 
8611     /* Destination IPv4 address (if present)*/
8612     if ((ip_address_and_port_number_replacement_flags & 0x1)) {
8613         proto_tree_add_item(tree, hf_pfcp_ip_address_and_port_number_replacement_destination_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
8614         offset += 4;
8615     }
8616     /* Destination IPv6 address (if present)*/
8617     if ((ip_address_and_port_number_replacement_flags & 0x2)) {
8618         proto_tree_add_item(tree, hf_pfcp_ip_address_and_port_number_replacement_destination_ipv6, tvb, offset, 16, ENC_NA);
8619         offset += 16;
8620     }
8621     /* Destination Port Number (if present)*/
8622     if ((ip_address_and_port_number_replacement_flags & 0x4)) {
8623         proto_tree_add_item(tree, hf_pfcp_ip_address_and_port_number_replacement_destination_port, tvb, offset, 2, ENC_NA);
8624         offset += 2;
8625     }
8626     /* Source IPv4 address (if present)*/
8627     if ((ip_address_and_port_number_replacement_flags & 0x8)) {
8628         proto_tree_add_item(tree, hf_pfcp_ip_address_and_port_number_replacement_source_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
8629         offset += 4;
8630     }
8631     /* Source IPv6 address (if present)*/
8632     if ((ip_address_and_port_number_replacement_flags & 0x10)) {
8633         proto_tree_add_item(tree, hf_pfcp_ip_address_and_port_number_replacement_source_ipv6, tvb, offset, 16, ENC_NA);
8634         offset += 16;
8635     }
8636     /* Source Port Number (if present)*/
8637     if ((ip_address_and_port_number_replacement_flags & 0x20)) {
8638         proto_tree_add_item(tree, hf_pfcp_ip_address_and_port_number_replacement_source_port, tvb, offset, 2, ENC_NA);
8639         offset += 2;
8640     }
8641 
8642     if (offset < length) {
8643         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8644     }
8645 }
8646 
8647 /*
8648  * 8.2.201    DNS Query Filter
8649  */
8650 static void
dissect_pfcp_dns_query_filter(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_)8651 dissect_pfcp_dns_query_filter(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_)
8652 {
8653     int offset = 0;
8654     guint32 dns_query_length;
8655 
8656     proto_tree_add_item_ret_uint(tree, hf_pfcp_dns_query_filter_pattern_len, tvb, offset, 2, ENC_BIG_ENDIAN, &dns_query_length);
8657     offset += 2;
8658     proto_tree_add_item(tree, hf_pfcp_dns_query_filter_pattern, tvb, offset, dns_query_length, ENC_ASCII | ENC_NA);
8659     offset += dns_query_length;
8660 
8661     if (offset < length) {
8662         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8663     }
8664 }
8665 
8666 /*
8667  * 8.2.202    Event Notification URI
8668  */
8669 static void
dissect_pfcp_event_notification_uri(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_)8670 dissect_pfcp_event_notification_uri(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_)
8671 {
8672     proto_tree_add_item(tree, hf_pfcp_event_notification_uri, tvb, 0, length, ENC_ASCII | ENC_NA);
8673 }
8674 
8675 
8676 /*
8677  * 8.2.203   Notification Correlation ID
8678  */
8679 static void
dissect_pfcp_notification_correlation_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item,guint16 length _U_,guint8 message_type _U_,pfcp_session_args_t * args _U_)8680 dissect_pfcp_notification_correlation_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8681 {
8682     guint32 value;
8683     /* 5 to n+4   Notification Correlation ID value */
8684     proto_tree_add_item_ret_uint(tree, hf_pfcp_notification_correlation_id, tvb, 0, 4, ENC_BIG_ENDIAN, &value);
8685     proto_item_append_text(item, "%u", value);
8686 }
8687 
8688 /*
8689  * 8.2.204   Reporting Flags
8690  */
8691 static void
dissect_pfcp_reporting_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_)8692 dissect_pfcp_reporting_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_)
8693 {
8694     int offset = 0;
8695 
8696     static int * const pfcp_reporting_flags_o5_flags[] = {
8697         &hf_pfcp_spare_b7_b1,
8698         &hf_pfcp_reporting_flags_o5_b0_dupl,
8699         NULL
8700     };
8701     /* Octet 5 Spare   DUPL */
8702     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_reporting_flags_o5_flags, ENC_BIG_ENDIAN);
8703     offset++;
8704 
8705     if (offset == length) {
8706         return;
8707     }
8708 
8709     if (offset < length) {
8710         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8711     }
8712 }
8713 
8714 /*
8715  * 8.2.205   Predefined Rules Name
8716  */
8717 static void
dissect_pfcp_predefined_rules_name(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_)8718 dissect_pfcp_predefined_rules_name(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_)
8719 {
8720     int offset = 0;
8721     /* Octet 5 to (n+4) Predefined Rules Name
8722     * The Predefined Rules Name field shall be encoded as an OctetString
8723     */
8724     proto_tree_add_item(tree, hf_pfcp_predef_rules_name, tvb, offset, length, ENC_NA);
8725 }
8726 
8727 /*
8728  * 8.2.206   MBS Session Identifier
8729  */
8730 static void
dissect_pfcp_mbs_session_identifier(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_)8731 dissect_pfcp_mbs_session_identifier(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_)
8732 {
8733     int offset = 0;
8734     guint64 mbs_session_identifier_flags;
8735 
8736     static int * const pfcp_mbs_session_identifier_flags[] = {
8737         &hf_pfcp_spare_b7_b2,
8738         &hf_pfcp_mbs_session_identifier_flag_b1_ssmi,
8739         &hf_pfcp_mbs_session_identifier_flag_b0_tmgi,
8740         NULL
8741     };
8742     /* Octet 5  Spare     SMI      TMGI */
8743     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_mbs_session_identifier_flags,
8744         ett_pfcp_mbs_session_identifier_flags, pfcp_mbs_session_identifier_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &mbs_session_identifier_flags);
8745     offset += 1;
8746 
8747     /* TMGI (if present)*/
8748     if ((mbs_session_identifier_flags & 0x1)) {
8749         proto_tree_add_item(tree, hf_pfcp_mbs_session_identifier_tmgi, tvb, offset, 6, ENC_NA);
8750         offset += 6;
8751     }
8752     /* SSMI (if present)*/
8753     if ((mbs_session_identifier_flags & 0x2)) {
8754         proto_tree_add_item(tree, hf_pfcp_mbs_session_identifier_ssmi, tvb, offset, -1, ENC_NA);
8755         return;
8756     }
8757 
8758     if (offset < length) {
8759         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8760     }
8761 }
8762 
8763 /*
8764  * 8.2.207   Multicast Transport Information
8765  */
8766 static void
dissect_pfcp_multicast_transport_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_)8767 dissect_pfcp_multicast_transport_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_)
8768 {
8769     int offset = 0;
8770     guint32 distribution_address_type;
8771     guint32 distribution_address_length;
8772     guint32 source_address_type;
8773     guint32 source_address_length;
8774 
8775     /* Oct 5 Spare */
8776     proto_tree_add_item(tree, hf_pfcp_spare_oct, tvb, offset, 1, ENC_BIG_ENDIAN);
8777     offset++;
8778 
8779     /* Oct 6 to 9 Common Tunnel Endpoint Identifer */
8780     proto_tree_add_item(tree, hf_pfcp_multicast_transport_information_endpoint_identifier, tvb, offset, 1, ENC_BIG_ENDIAN);
8781     offset++;
8782 
8783     /* Oct 10 Distribution Address Type && Length */
8784     proto_tree_add_item_ret_uint(tree, hf_pfcp_multicast_transport_information_distribution_address_type, tvb, offset, 1, ENC_BIG_ENDIAN, &distribution_address_type);
8785     proto_tree_add_item_ret_uint(tree, hf_pfcp_multicast_transport_information_distribution_address_length, tvb, offset, 1, ENC_BIG_ENDIAN, &distribution_address_length);
8786     offset++;
8787 
8788     /* Distribution IPv4 address (if present) */
8789     if (distribution_address_type == 0) {
8790         proto_tree_add_item(tree, hf_pfcp_multicast_transport_information_distribution_address_ipv4, tvb, offset, distribution_address_length, ENC_BIG_ENDIAN);
8791         offset += distribution_address_length;
8792     }
8793     /* Distribution IPv6 address (if present) */
8794     if (distribution_address_type == 1) {
8795         proto_tree_add_item(tree, hf_pfcp_multicast_transport_information_distribution_address_ipv6, tvb, offset, distribution_address_length, ENC_NA);
8796         offset += distribution_address_length;
8797     }
8798 
8799     /* Source Address Type && Length */
8800     proto_tree_add_item_ret_uint(tree, hf_pfcp_multicast_transport_information_source_address_type, tvb, offset, 1, ENC_BIG_ENDIAN, &source_address_type);
8801     proto_tree_add_item_ret_uint(tree, hf_pfcp_multicast_transport_information_source_address_length, tvb, offset, 1, ENC_BIG_ENDIAN, &source_address_length);
8802     offset++;
8803 
8804     /* Source IPv4 address (if present) */
8805     if (source_address_type == 0) {
8806         proto_tree_add_item(tree, hf_pfcp_multicast_transport_information_source_address_ipv4, tvb, offset, source_address_length, ENC_BIG_ENDIAN);
8807         offset += source_address_length;
8808     }
8809     /* Source IPv6 address (if present) */
8810     if (source_address_type == 1) {
8811         proto_tree_add_item(tree, hf_pfcp_multicast_transport_information_source_address_ipv6, tvb, offset, source_address_length, ENC_NA);
8812         offset += source_address_length;
8813     }
8814 
8815     if (offset < length) {
8816         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8817     }
8818 }
8819 
8820 /*
8821  * 8.2.208   MBSN4mbReq-Flags
8822  */
8823 static void
dissect_pfcp_mbsn4mbreq_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_)8824 dissect_pfcp_mbsn4mbreq_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_)
8825 {
8826     int offset = 0;
8827 
8828     static int * const pfcp_mbsn4mbreq_flags_o5_flags[] = {
8829         &hf_pfcp_spare_b7_b2,
8830         &hf_pfcp_mbsn4mbreq_flags_o5_b1_jmbssm,
8831         &hf_pfcp_mbsn4mbreq_flags_o5_b0_pllssm,
8832         NULL
8833     };
8834     /* Octet 5 Spare   JMBSSM   PLLSSM */
8835     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_mbsn4mbreq_flags_o5_flags, ENC_BIG_ENDIAN);
8836     offset++;
8837 
8838     if (offset == length) {
8839         return;
8840     }
8841 
8842     if (offset < length) {
8843         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8844     }
8845 }
8846 
8847 /*
8848  * 8.2.3    Local Ingress Tunnel
8849  */
8850 static void
dissect_pfcp_local_ingress_tunnel(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)8851 dissect_pfcp_local_ingress_tunnel(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8852 {
8853     int offset = 0;
8854     guint64 local_ingress_tunnel_flags_val;
8855 
8856     static int * const pfcp_local_ingress_tunnel_flags[] = {
8857         &hf_pfcp_spare_b7_b3,
8858         &hf_pfcp_local_ingress_tunnel_flags_b2_ch,
8859         &hf_pfcp_local_ingress_tunnel_flags_b1_v6,
8860         &hf_pfcp_local_ingress_tunnel_flags_b0_v4,
8861         NULL
8862     };
8863     /* Octet 5  Spare  CH  V6  V4*/
8864     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_local_ingress_tunnel_flags,
8865         ett_local_ingress_tunnel_flags, pfcp_local_ingress_tunnel_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &local_ingress_tunnel_flags_val);
8866     offset += 1;
8867 
8868     /* Bit 3 – CH (CHOOSE): If this bit is set to "1", then the UDP Port, IPv4 address and IPv6 address fields shall not be present */
8869     if ((local_ingress_tunnel_flags_val & 0x4) != 4) {
8870         /* UDP PPort */
8871         proto_tree_add_item(tree, hf_pfcp_local_ingress_tunnel_udp_port, tvb, offset, 2, ENC_BIG_ENDIAN);
8872         offset += 2;
8873 
8874         if ((local_ingress_tunnel_flags_val & 0x1) == 1) {
8875             /* IPv4 address */
8876             proto_tree_add_item(tree, hf_pfcp_local_ingress_tunnel_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
8877             offset += 4;
8878         }
8879         if ((local_ingress_tunnel_flags_val & 0x2) == 2) {
8880             /* IPv6 address */
8881             proto_tree_add_item(tree, hf_pfcp_local_ingress_tunnel_ipv6, tvb, offset, 16, ENC_NA);
8882             offset += 16;
8883         }
8884     }
8885     if (offset < length) {
8886         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
8887     }
8888 
8889 }
8890 
8891 /*
8892  * 8.2.210   MBS Unicast Parameters ID
8893  */
8894 static void
dissect_pfcp_mbs_unicast_parameters_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item,guint16 length _U_,guint8 message_type _U_,pfcp_session_args_t * args _U_)8895 dissect_pfcp_mbs_unicast_parameters_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_, pfcp_session_args_t *args _U_)
8896 {
8897     guint32 value;
8898     /* Octet 5 to 6 MBS Unicast Parameters ID */
8899     proto_tree_add_item_ret_uint(tree, hf_pfcp_mbs_unicast_parameters_id, tvb, 0, 2, ENC_BIG_ENDIAN, &value);
8900     proto_item_append_text(item, "%u", value);
8901 }
8902 
8903 /* Array of functions to dissect IEs
8904 * (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
8905 */
8906 typedef struct _pfcp_ie {
8907     void(*decode) (tvbuff_t *, packet_info *, proto_tree *, proto_item *, guint16, guint8, pfcp_session_args_t *);
8908 } pfcp_ie_t;
8909 
8910 static const pfcp_ie_t pfcp_ies[] = {
8911 /*      0 */    { dissect_pfcp_reserved },
8912 /*      1 */    { dissect_pfcp_create_pdr },                                    /* Create PDR                                       Extendable / Table 7.5.2.2-1 */
8913 /*      2 */    { dissect_pfcp_pdi },                                           /* PDI                                              Extendable / Table 7.5.2.2-2 */
8914 /*      3 */    { dissect_pfcp_create_far },                                    /* Create FAR                                       Extendable / Table 7.5.2.3-1 */
8915 /*      4 */    { dissect_pfcp_forwarding_parameters },                         /* Forwarding Parameters                            Extendable / Table 7.5.2.3-2 */
8916 /*      5 */    { dissect_pfcp_duplicating_parameters },                        /* Duplicating Parameters                           Extendable / Table 7.5.2.3-3 */
8917 /*      6 */    { dissect_pfcp_create_urr },                                    /* Create URR                                       Extendable / Table 7.5.2.4-1 */
8918 /*      7 */    { dissect_pfcp_create_qer },                                    /* Create QER                                       Extendable / Table 7.5.2.5-1 */
8919 /*      8 */    { dissect_pfcp_created_pdr },                                   /* Created PDR                                      Extendable / Table 7.5.3.2-1 */
8920 /*      9 */    { dissect_pfcp_update_pdr },                                    /* Update PDR                                       Extendable / Table 7.5.4.2-1 */
8921 /*     10 */    { dissect_pfcp_update_far },                                    /* Update FAR                                       Extendable / Table 7.5.4.3-1 */
8922 /*     11 */    { dissect_pfcp_upd_forwarding_param },                          /* Update Forwarding Parameters                     Extendable / Table 7.5.4.3-2 */
8923 /*     12 */    { dissect_pfcp_update_bar },                                    /* Update BAR (PFCP Session Report Response)        Extendable / Table 7.5.9.2-1 */
8924 /*     13 */    { dissect_pfcp_update_urr },                                    /* Update URR                                       Extendable / Table 7.5.4.4 */
8925 /*     14 */    { dissect_pfcp_update_qer },                                    /* Update QER                                       Extendable / Table 7.5.4.5 */
8926 /*     15 */    { dissect_pfcp_remove_pdr },                                    /* Remove PDR                                       Extendable / Table 7.5.4.6 */
8927 /*     16 */    { dissect_pfcp_remove_far },                                    /* Remove FAR                                       Extendable / Table 7.5.4.7 */
8928 /*     17 */    { dissect_pfcp_remove_urr },                                    /* Remove URR                                       Extendable / Table 7.5.4.8 */
8929 /*     18 */    { dissect_pfcp_remove_qer },                                    /* Remove QER                                       Extendable / Table 7.5.4.9 */
8930 /*     19 */    { dissect_pfcp_cause },                                         /* Cause                                            Fixed / Subclause 8.2.1 */
8931 /*     20 */    { dissect_pfcp_source_interface },                              /* Source Interface                                 Extendable / Subclause 8.2.2 */
8932 /*     21 */    { dissect_pfcp_f_teid },                                        /* F-TEID                                           Extendable / Subclause 8.2.3 */
8933 /*     22 */    { dissect_pfcp_network_instance },                              /* Network Instance                                 Variable Length / Subclause 8.2.4 */
8934 /*     23 */    { dissect_pfcp_sdf_filter },                                    /* SDF Filter                                       Extendable / Subclause 8.2.5 */
8935 /*     24 */    { dissect_pfcp_application_id },                                /* Application ID                                   Variable Length / Subclause 8.2.6 */
8936 /*     25 */    { dissect_pfcp_gate_status },                                   /* Gate Status                                     Extendable / Subclause 8.2.7 */
8937 /*     26 */    { dissect_pfcp_mbr },                                           /* MBR                                             Extendable / Subclause 8.2.8 */
8938 /*     27 */    { dissect_pfcp_gbr },                                           /* GBR                                             Extendable / Subclause 8.2.9 */
8939 /*     28 */    { dissect_pfcp_qer_correlation_id },                            /* QER Correlation ID                              Extendable / Subclause 8.2.10 */
8940 /*     29 */    { dissect_pfcp_precedence },                                    /* Precedence                                      Extendable / Subclause 8.2.11 */
8941 /*     30 */    { dissect_pfcp_transport_level_marking },                       /* Transport Level Marking                         Extendable / Subclause 8.2.12 */
8942 /*     31 */    { dissect_pfcp_volume_threshold },                              /* Volume Threshold                                Extendable /Subclause 8.2.13 */
8943 /*     32 */    { dissect_pfcp_time_threshold },                                /* Time Threshold                                  Extendable /Subclause 8.2.14 */
8944 /*     33 */    { dissect_pfcp_monitoring_time },                               /* Monitoring Time                                 Extendable /Subclause 8.2.15 */
8945 /*     34 */    { dissect_pfcp_subseq_volume_threshold },                       /* Subsequent Volume Threshold                     Extendable /Subclause 8.2.16 */
8946 /*     35 */    { dissect_pfcp_subsequent_time_threshold },                     /* Subsequent Time Threshold                       Extendable /Subclause 8.2.17 */
8947 /*     36 */    { dissect_pfcp_inactivity_detection_time },                     /* Inactivity Detection Time                       Extendable /Subclause 8.2.18 */
8948 /*     37 */    { dissect_pfcp_reporting_triggers },                            /* Reporting Triggers                              Extendable /Subclause 8.2.19 */
8949 /*     38 */    { dissect_pfcp_redirect_information },                          /* Redirect Information                            Extendable /Subclause 8.2.20 */
8950 /*     39 */    { dissect_pfcp_report_type },                                   /* Report Type                                     Extendable / Subclause 8.2.21 */
8951 /*     40 */    { dissect_pfcp_offending_ie },                                  /* Offending IE                                    Fixed / Subclause 8.2.22 */
8952 /*     41 */    { dissect_pfcp_forwarding_policy },                             /* Forwarding Policy                               Extendable / Subclause 8.2.23 */
8953 /*     42 */    { dissect_pfcp_destination_interface },                         /* Destination Interface                           Extendable / Subclause 8.2.24 */
8954 /*     43 */    { dissect_pfcp_up_function_features },                          /* UP Function Features                            Extendable / Subclause 8.2.25 */
8955 /*     44 */    { dissect_pfcp_apply_action },                                  /* Apply Action                                    Extendable / Subclause 8.2.26 */
8956 /*     45 */    { dissect_pfcp_dl_data_service_inf },                           /* Downlink Data Service Information               Extendable / Subclause 8.2.27 */
8957 /*     46 */    { dissect_pfcp_dl_data_notification_delay },                    /* Downlink Data Notification Delay                Extendable / Subclause 8.2.28 */
8958 /*     47 */    { dissect_pfcp_dl_buffering_dur },                              /* DL Buffering Duration                           Extendable / Subclause 8.2.29 */
8959 /*     48 */    { dissect_pfcp_dl_buffering_suggested_packet_count },           /* DL Buffering Suggested Packet Count             Variable / Subclause 8.2.30 */
8960 /*     49 */    { dissect_pfcp_pfcpsmreq_flags },                               /* PFCPSMReq-Flags                                 Extendable / Subclause 8.2.31 */
8961 /*     50 */    { dissect_pfcp_pfcpsrrsp_flags },                               /* PFCPSRRsp-Flags                                 Extendable / Subclause 8.2.32 */
8962 /*     51 */    { dissect_pfcp_load_control_information },                      /* Load Control Information                        Extendable / Table 7.5.3.3-1 */
8963 /*     52 */    { dissect_pfcp_sequence_number },                               /* Sequence Number                                 Fixed Length / Subclause 8.2.33 */
8964 /*     53 */    { dissect_pfcp_metric },                                        /* Metric                                          Fixed Length / Subclause 8.2.34 */
8965 /*     54 */    { dissect_pfcp_overload_control_information },                  /* Overload Control Information                    Extendable / Table 7.5.3.4-1 */
8966 /*     55 */    { dissect_pfcp_timer },                                         /* Timer                                           Extendable / Subclause 8.2 35 */
8967 /*     56 */    { dissect_pfcp_pdr_id },                                        /* PDR ID                                          Extendable / Subclause 8.2 36 */
8968 /*     57 */    { dissect_pfcp_f_seid },                                        /* F-SEID                                          Extendable / Subclause 8.2 37 */
8969 /*     58 */    { dissect_pfcp_application_ids_pfds },                          /* Application ID's PFDs                           Extendable / Table 7.4.3.1-2 */
8970 /*     59 */    { dissect_pfcp_pfd_context },                                   /* PFD context                                     Extendable / Table 7.4.3.1-3 */
8971 /*     60 */    { dissect_pfcp_node_id },                                       /* Node ID                                         Extendable / Subclause 8.2.38 */
8972 /*     61 */    { dissect_pfcp_pfd_contents },                                  /* PFD contents                                    Extendable / Subclause 8.2.39 */
8973 /*     62 */    { dissect_pfcp_measurement_method },                            /* Measurement Method                              Extendable / Subclause 8.2.40 */
8974 /*     63 */    { dissect_pfcp_usage_report_trigger },                          /* Usage Report Trigger                            Extendable / Subclause 8.2.41 */
8975 /*     64 */    { dissect_pfcp_measurement_period },                            /* Measurement Period                              Extendable / Subclause 8.2.42 */
8976 /*     65 */    { dissect_pfcp_fq_csid },                                       /* FQ-CSID                                         Extendable / Subclause 8.2.43 */
8977 /*     66 */    { dissect_pfcp_volume_measurement },                            /* Volume Measurement                              Extendable / Subclause 8.2.44 */
8978 /*     67 */    { dissect_pfcp_duration_measurement },                          /* Duration Measurement                            Extendable / Subclause 8.2.45 */
8979 /*     68 */    { dissect_pfcp_application_detection_inf },                     /* Application Detection Information               Extendable / Table 7.5.8.3-2 */
8980 /*     69 */    { dissect_pfcp_time_of_first_packet },                          /* Time of First Packet                            Extendable / Subclause 8.2.46 */
8981 /*     70 */    { dissect_pfcp_time_of_last_packet },                           /* Time of Last Packet                             Extendable / Subclause 8.2.47 */
8982 /*     71 */    { dissect_pfcp_quota_holding_time },                            /* Quota Holding Time                              Extendable / Subclause 8.2.48 */
8983 /*     72 */    { dissect_pfcp_dropped_dl_traffic_threshold },                  /* Dropped DL Traffic Threshold                    Extendable / Subclause 8.2.49 */
8984 /*     73 */    { dissect_pfcp_volume_quota },                                  /* Volume Quota                                    Extendable / Subclause 8.2.50 */
8985 /*     74 */    { dissect_pfcp_time_quota },                                    /* Time Quota                                      Extendable / Subclause 8.2.51 */
8986 /*     75 */    { dissect_pfcp_start_time },                                    /* Start Time                                      Extendable / Subclause 8.2.52 */
8987 /*     76 */    { dissect_pfcp_end_time },                                      /* End Time                                        Extendable / Subclause 8.2.53 */
8988 /*     77 */    { dissect_pfcp_pfcp_query_urr },                                /* Query URR                                       Extendable / Table 7.5.4.10-1 */
8989 /*     78 */    { dissect_pfcp_usage_report_smr },                              /* Usage Report (Session Modification Response) Extendable / Table 7.5.5.2-1 */
8990 /*     79 */    { dissect_pfcp_usage_report_sdr },                              /* Usage Report (Session Deletion Response)        Extendable / Table 7.5.7.2-1 */
8991 /*     80 */    { dissect_pfcp_usage_report_srr },                              /* Usage Report (Session Report Request)           Extendable / Table 7.5.8.3-1 */
8992 /*     81 */    { dissect_pfcp_urr_id },                                        /* URR ID                                          Extendable / Subclause 8.2.54 */
8993 /*     82 */    { dissect_pfcp_linked_urr_id },                                 /* Linked URR ID                                   Extendable / Subclause 8.2.55 */
8994 /*     83 */    { dissect_pfcp_downlink_data_report },                          /* Downlink Data Report                            Extendable / Table 7.5.8.2-1 */
8995 /*     84 */    { dissect_pfcp_outer_header_creation },                         /* Outer Header Creation                           Extendable / Subclause 8.2.56 */
8996 /*     85 */    { dissect_pfcp_create_bar },                                    /* Create BAR                                      Extendable / Table 7.5.2.6-1 */
8997 /*     86 */    { dissect_pfcp_update_bar_smr },                                /* Update BAR (Session Modification Request)       Extendable / Table 7.5.4.11-1 */
8998 /*     87 */    { dissect_pfcp_remove_bar },                                    /* Remove BAR                                      Extendable / Table 7.5.4.12-1 */
8999 /*     88 */    { dissect_pfcp_bar_id },                                        /* BAR ID                                          Extendable / Subclause 8.2.57 */
9000 /*     89 */    { dissect_pfcp_cp_function_features },                          /* CP Function Features                            Extendable / Subclause 8.2.58 */
9001 /*     90 */    { dissect_pfcp_usage_information },                             /* Usage Information                               Extendable / Subclause 8.2.59 */
9002 /*     91 */    { dissect_pfcp_application_instance_id },                       /* Application Instance ID                         Variable Length / Subclause 8.2.60 */
9003 /*     92 */    { dissect_pfcp_flow_inf },                                      /* Flow Information                                Extendable / Subclause 8.2.61 */
9004 /*     93 */    { dissect_pfcp_ue_ip_address },                                 /* UE IP Address                                   Extendable / Subclause 8.2.62 */
9005 /*     94 */    { dissect_pfcp_packet_rate },                                   /* Packet Rate                                     Extendable / Subclause 8.2.63 */
9006 /*     95 */    { dissect_pfcp_outer_hdr_rem },                                 /* Outer Header Removal                            Extendable / Subclause 8.2.64 */
9007 /*     96 */    { dissect_pfcp_recovery_time_stamp },                           /* Recovery Time Stamp                             Extendable / Subclause 8.2.65 */
9008 /*     97 */    { dissect_pfcp_dl_flow_level_marking },                         /* DL Flow Level Marking                           Extendable / Subclause 8.2.66 */
9009 /*     98 */    { dissect_pfcp_header_enrichment },                             /* Header Enrichment                               Extendable / Subclause 8.2.67 */
9010 /*     99 */    { dissect_pfcp_error_indication_report },                       /* Error Indication Report                         Extendable / Table 7.5.8.4-1 */
9011 /*    100 */    { dissect_pfcp_measurement_info },                              /* Measurement Information                         Extendable / Subclause 8.2.68 */
9012 /*    101 */    { dissect_pfcp_node_report_type },                              /* Node Report Type                                Extendable / Subclause 8.2.69 */
9013 /*    102 */    { dissect_pfcp_user_plane_path_failure_report },                /* User Plane Path Failure Report                  Extendable / Table 7.4.5.1.2-1 */
9014 /*    103 */    { dissect_pfcp_remote_gtp_u_peer },                             /* Remote GTP-U Peer                               Extendable / Subclause 8.2.70 */
9015 /*    104 */    { dissect_pfcp_ur_seqn },                                       /* UR-SEQN                                         Fixed Length / Subclause 8.2.71 */
9016 /*    105 */    { dissect_pfcp_update_duplicating_parameters },                 /* Update Duplicating Parameters                   Extendable / Table 7.5.4.3-3 */
9017 /*    106 */    { dissect_pfcp_act_predef_rules },                              /* Activate Predefined Rules                       Variable Length / Subclause 8.2.72 */
9018 /*    107 */    { dissect_pfcp_deact_predef_rules },                            /* Deactivate Predefined Rules                     Variable Length / Subclause 8.2.73 */
9019 /*    108 */    { dissect_pfcp_far_id },                                        /* FAR ID                                          Extendable / Subclause 8.2.74 */
9020 /*    109 */    { dissect_pfcp_qer_id },                                        /* QER ID                                          Extendable / Subclause 8.2.75 */
9021 /*    110 */    { dissect_pfcp_oci_flags },                                     /* OCI Flags                                       Extendable / Subclause 8.2.76 */
9022 /*    111 */    { dissect_pfcp_pfcp_assoc_rel_req },                            /* PFCP Association Release Request                Extendable / Subclause 8.2.77 */
9023 /*    112 */    { dissect_pfcp_graceful_release_period },                       /* Graceful Release Period                         Extendable / Subclause 8.2.78 */
9024 /*    113 */    { dissect_pfcp_pdn_type },                                      /* PDN Type                                        Fixed Length / Subclause 8.2.79 */
9025 /*    114 */    { dissect_pfcp_failed_rule_id },                                /* Failed Rule ID                                  Extendable / Subclause 8.2.80 */
9026 /*    115 */    { dissect_pfcp_time_quota_mechanism },                          /* Time Quota Mechanism                            Extendable / Subclause 8.2.81 */
9027 /*    116 */    { dissect_pfcp_user_plane_ip_resource_infomation },             /* User Plane IP Resource Information              Extendable / Subclause 8.2.82 */
9028 /*    117 */    { dissect_pfcp_user_plane_inactivity_timer },                   /* User Plane Inactivity Timer                     Extendable / Subclause 8.2.83 */
9029 /*    118 */    { dissect_pfcp_aggregated_urrs },                               /* Aggregated URRs                                 Extendable / Table 7.5.2.4-2 */
9030 /*    119 */    { dissect_pfcp_multiplier },                                    /* Multiplier                                      Fixed Length / Subclause 8.2.84 */
9031 /*    120 */    { dissect_pfcp_aggregated_urr_id_ie },                          /* Aggregated URR ID IE                            Fixed Length / Subclause 8.2.85 */
9032 /*    121 */    { dissect_pfcp_subsequent_volume_quota },                       /* Subsequent Volume Quota                         Extendable / Subclause 8.2.86 */
9033 /*    122 */    { dissect_pfcp_subsequent_time_quota },                         /* Subsequent Time Quota                           Extendable / Subclause 8.2.87 */
9034 /*    123 */    { dissect_pfcp_rqi },                                           /* RQI                                             Extendable / Subclause 8.2.88 */
9035 /*    124 */    { dissect_pfcp_qfi },                                           /* QFI                                             Extendable / Subclause 8.2.89 */
9036 /*    125 */    { dissect_pfcp_query_urr_reference },                           /* Query URR Reference                             Extendable / Subclause 8.2.90 */
9037 /*    126 */    { dissect_pfcp_additional_usage_reports_information },          /* Additional Usage Reports Information            Extendable /  Subclause 8.2.91 */
9038 /*    127 */    { dissect_pfcp_create_traffic_endpoint },                       /* Create Traffic Endpoint                         Extendable / Table 7.5.2.7 */
9039 /*    128 */    { dissect_pfcp_created_traffic_endpoint },                      /* Created Traffic Endpoint                        Extendable / Table 7.5.3.5 */
9040 /*    129 */    { dissect_pfcp_update_traffic_endpoint },                       /* Update Traffic Endpoint                         Extendable / Table 7.5.4.13 */
9041 /*    130 */    { dissect_pfcp_remove_traffic_endpoint },                       /* Remove Traffic Endpoint                         Extendable / Table 7.5.4.14 */
9042 /*    131 */    { dissect_pfcp_traffic_endpoint_id },                           /* Traffic Endpoint ID                             Extendable / Subclause 8.2.92 */
9043 /*    132 */    { dissect_pfcp_ethernet_packet_filter },                        /* Ethernet Packet Filter IE                       Extendable / Table 7.5.2.2-3 */
9044 /*    133 */    { dissect_pfcp_mac_address },                                   /* MAC address                                     Extendable / Subclause 8.2.93 */
9045 /*    134 */    { dissect_pfcp_c_tag },                                         /* C-TAG                                           Extendable / Subclause 8.2.94 */
9046 /*    135 */    { dissect_pfcp_s_tag },                                         /* S-TAG                                           Extendable / Subclause 8.2.95 */
9047 /*    136 */    { dissect_pfcp_ethertype },                                     /* Ethertype                                       Extendable / Subclause 8.2.96 */
9048 /*    137 */    { dissect_pfcp_proxying },                                      /* Proxying                                        Extendable / Subclause 8.2.97 */
9049 /*    138 */    { dissect_pfcp_ethertype_filter_id },                           /* Ethernet Filter ID                              Extendable / Subclause 8.2.98 */
9050 /*    139 */    { dissect_pfcp_ethernet_filter_properties },                    /* Ethernet Filter Properties                      Extendable / Subclause 8.2.99  */
9051 /*    140 */    { dissect_pfcp_suggested_buffering_packets_count },             /* Suggested Buffering Packets Count               Extendable / Subclause 8.2.100  */
9052 /*    141 */    { dissect_pfcp_user_id },                                       /* User ID                                         Extendable / Subclause 8.2.101  */
9053 /*    142 */    { dissect_pfcp_ethernet_pdu_session_information },              /* Ethernet PDU Session Information                Extendable / Subclause 8.2.102  */
9054 /*    143 */    { dissect_pfcp_ethernet_traffic_information },                  /* Ethernet Traffic Information                    Extendable / Table 7.5.8.3-3  */
9055 /*    144 */    { dissect_pfcp_mac_addresses_detected },                        /* MAC Addresses Detected                          Extendable / Subclause 8.2.103  */
9056 /*    145 */    { dissect_pfcp_mac_addresses_removed },                         /* MAC Addresses Removed                           Extendable / Subclause 8.2.104  */
9057 /*    146 */    { dissect_pfcp_ethernet_inactivity_timer },                     /* Ethernet Inactivity Timer                       Extendable / Subclause 8.2.105  */
9058 /*    147 */    { dissect_pfcp_additional_monitoring_time },                    /* Additional Monitoring Time                      Extendable / Table 7.5.2.4-3  */
9059 /*    148 */    { dissect_pfcp_event_quota },                                   /* Event Quota                                     Extendable / Subclause 8.2.112  */
9060 /*    149 */    { dissect_pfcp_event_threshold },                               /* Event Threshold                                 Extendable / Subclause 8.2.113  */
9061 /*    150 */    { dissect_pfcp_subsequent_event_quota },                        /* Subsequent Event Quota                          Extendable / Subclause 8.2.106  */
9062 /*    151 */    { dissect_pfcp_subsequent_event_threshold },                    /* Subsequent Event Threshold                      Extendable / Subclause 8.2.107  */
9063 /*    152 */    { dissect_pfcp_trace_information },                             /* Trace Information                               Extendable / Subclause 8.2.108  */
9064 /*    153 */    { dissect_pfcp_framed_route },                                  /* Framed-Route                                    Variable Length / Subclause 8.2.109  */
9065 /*    154 */    { dissect_pfcp_framed_routing },                                /* Framed-Routing                                  Fixed Length / Subclause 8.2.110  */
9066 /*    155 */    { dissect_pfcp_framed_ipv6_route },                             /* Framed-IPv6-Route                               Variable Length / Subclause 8.2.111  */
9067 /*    156 */    { dissect_pfcp_time_stamp },                                    /* Time Stamp                                      Extendable / Subclause 8.2.114  */
9068 /*    157 */    { dissect_pfcp_averaging_window },                              /* Averaging Window                                Extendable / Subclause 8.2.115  */
9069 /*    158 */    { dissect_pfcp_paging_policy_indicator },                       /* Paging Policy Indicator                         Extendable / Subclause 8.2.116  */
9070 /*    159 */    { dissect_pfcp_apn_dnn },                                       /* APN/DNN                                         Variable Length / Subclause 8.2.117  */
9071 /*    160 */    { dissect_pfcp_tgpp_interface_type },                           /* 3GPP Interface Type                             Extendable / Subclause 8.2.118  */
9072 /*    161 */    { dissect_pfcp_pfcpsrreq_flags },                               /* PFCPSRReq-Flags                                 Extendable / Subclause 8.2.119  */
9073 /*    162 */    { dissect_pfcp_pfcpaureq_flags },                               /* PFCPAUReq-Flags                                 Extendable / Subclause 8.2.120  */
9074 /*    163 */    { dissect_pfcp_activation_time },                               /* Activation Time                                 Extendable / Subclause 8.2.121  */
9075 /*    164 */    { dissect_pfcp_deactivation_time },                             /* Deactivation Time                               Extendable / Subclause 8.2.122  */
9076 /*    165 */    { dissect_pfcp_create_mar },                                    /* Create MAR                                      Extendable / Table 7.5.2.8-1  */
9077 /*    166 */    { dissect_pfcp_access_forwarding_action_information_1 },        /* Access Forwarding Action Information 1          Extendable / Table 7.5.2.8-2  */
9078 /*    167 */    { dissect_pfcp_access_forwarding_action_information_2 },        /* Access Forwarding Action Information 2          Extendable / Table 7.5.2.8-3  */
9079 /*    168 */    { dissect_pfcp_remove_mar },                                    /* Remove MAR                                      Extendable / Table 7.5.4.15-1*/
9080 /*    169 */    { dissect_pfcp_update_mar },                                    /* Update MAR                                      Extendable / Table 7.5.4.16-1 */
9081 /*    170 */    { dissect_pfcp_mar_id },                                        /* MAR ID                                          Extendable / Subclause 8.2.123  */
9082 /*    171 */    { dissect_pfcp_steering_functionality },                        /* Steering Functionality                          Extendable / Subclause 8.2.124  */
9083 /*    172 */    { dissect_pfcp_steering_mode },                                 /* Steering Mode                                   Extendable / Subclause 8.2.125  */
9084 /*    173 */    { dissect_pfcp_weight },                                        /* Weight                                          Fixed / Clause 8.2.126  */
9085 /*    174 */    { dissect_pfcp_priority },                                      /* Priority                                        Extendable / Subclause 8.2.127  */
9086 /*    175 */    { dissect_pfcp_update_access_forwarding_action_information_1 }, /* Update Access Forwarding Action Information 1   Extendable / Table 7.5.4.16-2  */
9087 /*    176 */    { dissect_pfcp_update_access_forwarding_action_information_2 }, /* Update Access Forwarding Action Information 2   Extendable / Table 7.5.4.16-3  */
9088 /*    177 */    { dissect_pfcp_ue_ip_address_pool_identity },                   /* UE IP address Pool Identity                     Variable Length / Clause 8.2.128  */
9089 /*    178 */    { dissect_pfcp_alternative_smf_ip_address },                    /* Alternative SMF IP Address                      Extendable / Clause 8.2.129  */
9090 /*    179 */    { dissect_pfcp_packet_replication_and_detection_carry_on_information }, /* Packet Replication and Detection Carry-On Information     Extendable / Clause 8.2.130  */
9091 /*    180 */    { dissect_pfcp_smf_set_id },                                    /* SMF Set ID                                      Extendable / Clause 8.2.131  */
9092 /*    181 */    { dissect_pfcp_quota_validity_time },                           /* Quota Validity Time                             Extendable / Clause 8.2.132  */
9093 /*    182 */    { dissect_pfcp_number_of_reports },                             /* Number of Reports                               Fixed / Clause 8.2.133  */
9094 /*    183 */    { dissect_pfcp_pfcp_session_retention_information_within_pfcp_association_setup_request }, /* PFCP Session Retention Information (within PFCP Association Setup Request)  Extendable / Table 7.4.4.1-2  */
9095 /*    184 */    { dissect_pfcp_pfcpasrsp_flags },                               /* PFCPASRsp-Flags                                 Extendable / Clause 8.2.134  */
9096 /*    185 */    { dissect_pfcp_cp_pfcp_entity_ip_address },                     /* CP PFCP Entity IP Address                       Extendable / Clause 8.2.135  */
9097 /*    186 */    { dissect_pfcp_pfcpsereq_flags },                               /* PFCPSEReq-Flags                                 Extendable / Clause 8.2.136  */
9098 /*    187 */    { dissect_pfcp_user_plane_path_recovery_report },               /* User Plane Path Recovery Report                 Extendable / Table 7.4.5.1.3-1  */
9099 /*    188 */    { dissect_ip_multicast_addressing_info_within_pfcp_session_establishment_request }, /* IP Multicast Addressing Info within PFCP Session Establishment Request  Extendable / Clause 7.5.2.2-4  */
9100 /*    189 */    { dissect_pfcp_join_ip_multicast_information },                 /* Join IP Multicast Information IE within Usage Report    Extendable / Table 7.5.8.3-4  */
9101 /*    190 */    { dissect_pfcp_leave_ip_multicast_information },                /* Leave IP Multicast Information IE within Usage Report   Extendable / Table 7.5.8.3-5  */
9102 /*    191 */    { dissect_pfcp_ip_multicast_address },                          /* IP Multicast Address                            Extendable / Clause 8.2.137  */
9103 /*    192 */    { dissect_pfcp_source_ip_address },                             /* Source IP Address                               Extendable / Clause 8.2.138  */
9104 /*    193 */    { dissect_pfcp_packet_rate_status },                            /* Packet Rate Status                              Extendable / Clause 8.2.139  */
9105 /*    194 */    { dissect_pfcp_create_bridge_info_for_tsc },                    /* Create Bridge Info for TSC                      Extendable / Clause 8.2.140  */
9106 /*    195 */    { dissect_pfcp_created_bridge_info_for_tsc },                   /* Created Bridge Info for TSC                     Extendable / Table 7.5.3.6-1  */
9107 /*    196 */    { dissect_pfcp_ds_tt_port_number },                             /* DS-TT Port Number                               Fixed Length / Clause 8.2.141  */
9108 /*    197 */    { dissect_pfcp_nw_tt_port_number },                             /* NW-TT Port Number                               Fixed Length / Clause 8.2.142  */
9109 /*    198 */    { dissect_pfcp_5gs_user_plane_node },                           /* 5GS User Plane Node                             Extendable / Clause 8.2.143  */
9110 /*    199 */    { dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_request }, /* TSC Management Information IE within PFCP Session Modification Request  Extendable / Table 7.5.4.18-1  */
9111 /*    200 */    { dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_response }, /* TSC Management Information IE within PFCP Session Modification Response Extendable / Table 7.5.5.3-1  */
9112 /*    201 */    { dissect_pfcp_tsc_management_information_ie_within_pfcp_session_report_request }, /* TSC Management Information IE within PFCP Session Report Request    Extendable / Table 7.5.8.5-1  */
9113 /*    202 */    { dissect_pfcp_port_management_information_container },         /* Port Management Information Container           Variable Length / Clause 8.2.144  */
9114 /*    203 */    { dissect_pfcp_clock_drift_control_information },               /* Clock Drift Control Information                 Extendable / Table 7.4.4.1.2-1  */
9115 /*    204 */    { dissect_pfcp_requested_clock_drift_control_information },     /* Requested Clock Drift Information               Extendable / Clause 8.2.145  */
9116 /*    205 */    { dissect_pfcp_clock_drift_report },                            /* Clock Drift Report                              Extendable / Table 7.4.5.1.4-1  */
9117 /*    206 */    { dissect_pfcp_time_domain_number  },                            /* Time Domain Number                               Extendable / Clause 8.2.146  */
9118 /*    207 */    { dissect_pfcp_time_offset_threshold },                         /* Time Offset Threshold                           Extendable / Clause 8.2.147  */
9119 /*    208 */    { dissect_pfcp_cumulative_rate_ratio_threshold },               /* Cumulative rateRatio Threshold                  Extendable / Clause 8.2.148  */
9120 /*    209 */    { dissect_pfcp_time_offset_measurement },                       /* Time Offset Measurement                         Extendable / Clause 8.2.149  */
9121 /*    210 */    { dissect_pfcp_cumulative_rate_ratio_measurement },             /* Cumulative rateRatio Measurement                Extendable / Clause 8.2.150  */
9122 /*    211 */    { dissect_pfcp_remove_srr },                                    /* Remove SRR                                      Extendable/ Table 7.5.4.19-1  */
9123 /*    212 */    { dissect_pfcp_create_srr },                                    /* Create SRR                                      Extendable/ Table 7.5.2.9-1  */
9124 /*    213 */    { dissect_pfcp_update_srr },                                    /* Update SRR                                      Extendable/ Table 7.5.4.21-1  */
9125 /*    214 */    { dissect_pfcp_session_report },                                /* Session Report                                  Extendable / Table 7.5.8.7-1  */
9126 /*    215 */    { dissect_pfcp_srr_id },                                        /* SRR ID                                          Extendable / Clause 8.2.151  */
9127 /*    216 */    { dissect_pfcp_access_availability_control_information },       /* Access Availability Control Information         Extendable / Table 7.5.2.9-2  */
9128 /*    217 */    { dissect_pfcp_requested_access_availability_control_information }, /* Requested Access Availability Information       Extendable / Clause 8.2.152  */
9129 /*    218 */    { dissect_pfcp_access_availability_report },                    /* Access Availability Report                      Extendable / Table 7.5.8.6-2  */
9130 /*    219 */    { dissect_pfcp_access_availability_information },               /* Access Availability Information                 Extendable / Clause 8.2.153  */
9131 /*    220 */    { dissect_pfcp_provide_atsss_control_information },             /* Provide ATSSS Control Information               Extendable / Table 7.5.2.10-1  */
9132 /*    221 */    { dissect_pfcp_atsss_control_parameters },                      /* ATSSS Control Parameters                        Extendable / Table 7.5.3.7-1  */
9133 /*    222 */    { dissect_pfcp_mptcp_control_information },                     /* MPTCP Control Information                       Extendable / Clause 8.2.154  */
9134 /*    223 */    { dissect_pfcp_atsss_ll_control_information },                  /* ATSSS-LL Control Information                    Extendable / Clause 8.2.155  */
9135 /*    224 */    { dissect_pfcp_pmf_control_information },                       /* PMF Control Information                         Extendable / Clause 8.2.156  */
9136 /*    225 */    { dissect_pfcp_mptcp_parameters },                              /* MPTCP Parameters                                Extendable / Table 7.5.3.7-2  */
9137 /*    226 */    { dissect_pfcp_atsss_ll_parameters },                           /* ATSSS-LL Parameters                             Extendable / Table 7.5.3.7-3  */
9138 /*    227 */    { dissect_pfcp_pmf_parameters },                                /* PMF Parameters                                  Extendable / Table 7.5.3.7-4  */
9139 /*    228 */    { dissect_pfcp_mptcp_address_information },                     /* MPTCP Address Information                       Extendable / Clause 8.2.157  */
9140 /*    229 */    { dissect_pfcp_ue_link_specific_ip_address },                   /* UE Link-Specific IP Address                     Extendable / Clause 8.2.158  */
9141 /*    230 */    { dissect_pfcp_pmf_address_information },                       /* PMF Address Information                         Extendable / Clause 8.2.159  */
9142 /*    231 */    { dissect_pfcp_atsss_ll_information },                          /* ATSSS-LL Information                            Extendable / Clause 8.2.160  */
9143 /*    232 */    { dissect_pfcp_data_network_access_identifier },                /* Data Network Access Identifier                  Variable Length / Clause 8.2.161  */
9144 /*    233 */    { dissect_pfcp_ue_ip_address_pool_information },                /* UE IP address Pool Information                  Extendable / Table 7.4.4.1-3  */
9145 /*    234 */    { dissect_pfcp_average_packet_delay },                          /* Average Packet Delay                            Extendable / Clause 8.2.162  */
9146 /*    235 */    { dissect_pfcp_minimum_packet_delay },                          /* Minimum Packet Delay                            Extendable / Clause 8.2.163  */
9147 /*    236 */    { dissect_pfcp_maximum_packet_delay },                          /* Maximum Packet Delay                            Extendable / Clause 8.2.164  */
9148 /*    237 */    { dissect_pfcp_qos_report_trigger },                            /* QoS Report Trigger                              Extendable / Clause 8.2.165  */
9149 /*    238 */    { dissect_pfcp_gtp_u_path_qos_control_information },            /* GTP-U Path QoS Control Information              Extendable / Table 7.4.4.1.3-1  */
9150 /*    239 */    { dissect_pfcp_gtp_u_path_qos_report },                         /* GTP-U Path QoS Report (PFCP Node Report Request)    Extendable / Table 7.4.5.1.5-1  */
9151 /*    240 */    { dissect_pfcp_qos_information_in_gtp_u_path_qos_report },      /* QoS Information in GTP-U Path QoS Report        Extendable / Table 7.4.5.1.6-1  */
9152 /*    241 */    { dissect_pfcp_gtp_u_path_interface_type },                     /* GTP-U Path Interface Type                       Extendable / Clause 8.2.166  */
9153 /*    242 */    { dissect_pfcp_qos_monitoring_per_qos_flow_control_information }, /* QoS Monitoring per QoS flow Control Information Extendable / Table 7.5.2.9-3  */
9154 /*    243 */    { dissect_pfcp_requested_qos_monitoring },                      /* Requested QoS Monitoring                        Extendable / Clause 8.2.167  */
9155 /*    244 */    { dissect_pfcp_reporting_frequency },                           /* Reporting Frequency                             Extendable / Clause 8.2.168  */
9156 /*    245 */    { dissect_pfcp_packet_delay_thresholds },                       /* Packet Delay Thresholds                         Extendable / Clause 8.2.169  */
9157 /*    246 */    { dissect_pfcp_minimum_wait_time },                             /* Minimum Wait Time                               Extendable / Clause 8.2.170  */
9158 /*    247 */    { dissect_pfcp_qos_monitoring_report },                         /* QoS Monitoring Report                           Extendable / Table 7.5.8.6-3  */
9159 /*    248 */    { dissect_pfcp_qos_monitoring_measurement },                    /* QoS Monitoring Measurement                      Extendable / Clause 8.2.171  */
9160 /*    249 */    { dissect_pfcp_mt_edt_control_information },                    /* MT-EDT Control Information                      Extendable / Clause 8.2.172  */
9161 /*    250 */    { dissect_pfcp_dl_data_packets_size },                          /* DL Data Packets Size                            Extendable / Clause 8.2.173  */
9162 /*    251 */    { dissect_pfcp_qer_control_indications },                       /* QER Control Indications                         Extendable / Clause 8.2.174  */
9163 /*    252 */    { dissect_pfcp_packet_rate_status_report_ie_within_pfcp_session_deletion_response }, /* Packet Rate Status Report IE within PFCP Session Deletion Response     Extendable / Table 7.5.7.1-2  */
9164 /*    253 */    { dissect_pfcp_nf_instance_id },                                /* NF Instance ID                                  Extendable / Clause 8.2.175  */
9165 /*    254 */    { dissect_pfcp_ethernet_context_information_within_pfcp_session_modification_request }, /* Ethernet Context Information within PFCP Session Modification Request     Extendable / Table 7.5.4.21-1  */
9166 /*    255 */    { dissect_pfcp_redundant_transmission_detection_parameters },   /* Redundant Transmission Detection Parameters               Extendable / Table 7.5.2.2-5  */
9167 /*    256 */    { dissect_pfcp_updated_pdr_ie_within_pfcp_session_modification_response }, /* Updated PDR IE within PFCP Session Modification Response     Extendable / Table 7.5.5.5-1  */
9168 /*    257 */    { dissect_pfcp_s_nssai },                                       /* S-NSSAI                                         Fixed Length / Clause 8.2.176 */
9169 /*    258 */    { dissect_pfcp_ip_version },                                    /* IP version                                      Extendable / Clause 8.2.177 */
9170 /*    259 */    { dissect_pfcp_pfcpasreq_flags },                               /* PFCPASReq-Flags                                 Extendable / Clause 8.2.178 */
9171 /*    260 */    { dissect_pfcp_data_status },                                   /* Data Status                                     Extendable / Clause 8.2.179 */
9172 /*    261 */    { dissect_pfcp_provide_rds_configuration_information_ie_within_pfcp_session_modification_request }, /* Provide RDS Configuration Information IE within PFCP Session Establishment Request   Extendable / Table 7.5.2.11-1  */
9173 /*    262 */    { dissect_pfcp_rds_configuration_information },                 /* RDS Configuration Information                   Extendable / Clause 8.2.180  */
9174 /*    263 */    { dissect_pfcp_query_packet_rate_status_ie_within_pfcp_session_modification_request }, /* Query Packet Rate Status IE within PFCP Session Modification Request      Extendable / Table 7.5.4.22-1  */
9175 /*    264 */    { dissect_pfcp_query_packet_rate_status_report_ie_within_pfcp_session_modification_response }, /* Query Packet Rate Status Report IE within PFCP Session Modification Response      Extendable / Table 7.5.5.4-1  */
9176 /*    265 */    { dissect_pfcp_mptcp_application_indication },                  /* MPTCP Applicable Indication                     Extendable / Clause 8.2.181 */
9177 /*    266 */    { dissect_pfcp_user_plane_nodemanagement_information_container }, /* User Plane NodeManagement Information Container         Variable Length / Clause 8.2.182 */
9178 /*    267 */    { dissect_pfcp_ue_ip_address_usage_information_ie_within_pfcp_association_update_request },       /* UE IP Address Usage Information IE within PFCP Association Update Request         Extendable / Table 7.4.4.3.1-1 */
9179 /*    268 */    { dissect_pfcp_number_of_ue_ip_addresses },                     /* Number of UE IP Addresses                       Variable Length / Clause 8.2.183 */
9180 /*    269 */    { dissect_pfcp_validity_timer },                                /* Validity Timer                                  Variable Length / Clause 8.2.183 */
9181 /*    270 */    { dissect_pfcp_redundant_transmission_forward_parameters },     /* Redundant Transmission Forward Parameters       Variable Length / Clause 8.2.184  */
9182 /*    271 */    { dissect_pfcp_transport_dealy_reporting_ie_in_create_pdr },    /* Transport Delay Reporting IE in Create PDR IE   Extendable / Table 7.5.2.2-6 */
9183 /*    272 */    { dissect_pfcp_partial_failure_information_within_pfcp_session_establishment_response }, /* Partial Failure Information within PFCP Session Establishment Response      Extendable / Table 7.5.3.1-2 */
9184 /*    273 */    { dissect_pfcp_partial_failure_information_within_pfcp_session_modification_response }, /* Partial Failure Information within PFCP Session Modificaton Response      Extendable / Table 7.5.5.1-2 */
9185 /*    274 */    { dissect_pfcp_offending_ie_information },                      /* Offending IE Information                        Variable Length / Clause 8.2.185 */
9186 /*    275 */    { dissect_pfcp_rattype },                                       /* RAT Type                                        Variable Length / Clause 8.2.186 */
9187 /*    276 */    { dissect_pfcp_l2tp_tunnel_information },                       /* L2TP Tunnel Information                         Extendable / Table 7.5.2.1-2  */
9188 /*    277 */    { dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_request },  /* L2TP Session Information within PFCP Session Establishment Request     Extendable / Table 7.5.2.1-3  */
9189 /*    278 */    { dissect_pfcp_l2tp_user_authentication },                      /* L2TP User Authentication                        Variable Length / Clause 8.2.187 */
9190 /*    279 */    { dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_response },  /* L2TP Session Information within PFCP Session Establishment Response     Extendable / Table 7.5.3.1-3  */
9191 /*    280 */    { dissect_pfcp_lns_address },                                   /* LNS Address                                     Variable Length / Clause 8.2.188 */
9192 /*    281 */    { dissect_pfcp_tunnel_preference },                             /* Tunnel Preference                               Fixed / Clause 8.2.189 */
9193 /*    282 */    { dissect_pfcp_calling_number },                                /* Calling Number                                  Variable Length / Clause 8.2.190 */
9194 /*    283 */    { dissect_pfcp_called_number },                                 /* Called Number                                   Variable Length / Clause 8.2.191 */
9195 /*    284 */    { dissect_pfcp_l2tp_session_indications },                      /* L2TP Session Indications                        Extendable / Clause 8.2.192 */
9196 /*    285 */    { dissect_pfcp_dns_sever_address },                             /* DNS Server Address                              Variable Length / Clause 8.2.193 */
9197 /*    286 */    { dissect_pfcp_nbns_sever_address },                            /* NBNS Server Address                             Variable Length / Clause 8.2.194 */
9198 /*    287 */    { dissect_pfcp_maximum_receive_unit },                          /* Maximum Receive Unit                            Fixed / Clause 8.2.195 */
9199 /*    288 */    { dissect_pfcp_thresholds },                                    /* Thresholds                                      Variable Length / Clause 8.2.196 */
9200 /*    289 */    { dissect_pfcp_steering_mode_indications },                     /* Steering Mode Indicator                         Extendable / Clause 8.2.197 */
9201 /*    290 */    { dissect_pfcp_pfcp_session_change_info },                      /* PFCP Session Change Info                        Extendable / Table 7.4.7.1-2  */
9202 /*    291 */    { dissect_pfcp_group_id },                                      /* Group ID                                        Fixed / Clause 8.2.198 */
9203 /*    292 */    { dissect_pfcp_cp_ip_address },                                 /* CP IP Address                                   Variable Length / Clause 8.2.199 */
9204 /*    293 */    { dissect_pfcp_ip_address_and_port_number_replacement },        /* IP Address and Port Number Replacement          Variable Length / Clause 8.2.200 */
9205 /*    294 */    { dissect_pfcp_dns_query_filter },                              /* DNS Query Filter                                Variable Length / Clause 8.2.201 */
9206 /*    295 */    { dissect_pfcp_direct_reporting_information },                  /* Direct Reporting Information                    Extendable / Table 7.5.2.9-4  */
9207 /*    296 */    { dissect_pfcp_event_notification_uri },                        /* Event Notification URI                          Variable Length / Clause 8.2.202 */
9208 /*    297 */    { dissect_pfcp_notification_correlation_id },                   /* Notification Correlation ID                     Fixed / Clause 8.2.203 */
9209 /*    298 */    { dissect_pfcp_reporting_flags },                               /* Reporting Flags                                 Extendable / Clause 8.2.204 */
9210 /*    299 */    { dissect_pfcp_predefined_rules_name },                         /* Predefined Rules Name                           Variable Length / Clause 8.2.205 */
9211 /*    300 */    { dissect_pfcp_mbs_session_n4mb_control_information },          /* MBS Session N4mb Control Information            Extendable / Table 7.5.2.1-5 */
9212 /*    301 */    { dissect_pfcp_mbs_multicast_parameters },                      /* MBS Multicast Parameters                        Extendable / Table 7.5.2.3-5 */
9213 /*    302 */    { dissect_pfcp_add_mbs_unicast_parameters_ie_in_create_far },   /* Addd MBS Unicast Parameters IE in Create FAR    Extendable / Table 7.5.2.3-6 */
9214 /*    303 */    { dissect_pfcp_mbs_session_n4mb_information },                  /* MBS Session N4mb Information                    Extendable / Table 7.5.3.1-4 */
9215 /*    304 */    { dissect_pfcp_remove_mbs_unicast_parameters_ie_in_update_far },/* Remove MBS Unicast Parameters IE in Update FAR  Extendable / Table 7.5.4.3-4 */
9216 /*    305 */    { dissect_pfcp_mbs_session_identifier },                        /* MBS Session Identifier                          Variable Length / Clause 8.2.206 */
9217 /*    306 */    { dissect_pfcp_multicast_transport_information },               /* Multicast Transport Information                 Variable Length / Clause 8.2.207 */
9218 /*    307 */    { dissect_pfcp_mbsn4mbreq_flags },                              /* MBSN4mbReq Flags                                Extendable / Clause 8.2.208 */
9219 /*    308 */    { dissect_pfcp_local_ingress_tunnel },                          /* Local Ingress Tunnel                            Extendable / Clause 8.2.209 */
9220 /*    309 */    { dissect_pfcp_mbs_unicast_parameters_id },                     /* MBS Unicast Parameters ID                       Extendable / Clause 8.2.210 */
9221 //310 to 32767 Spare. For future use.
9222 //32768 to 65535 Vendor-specific IEs.
9223     { NULL },                                                        /* End of List */
9224 };
9225 
9226 #define NUM_PFCP_IES (sizeof(pfcp_ies)/sizeof(pfcp_ie_t))
9227 /* Set up the array to hold "etts" for each IE*/
9228 gint ett_pfcp_elem[NUM_PFCP_IES-1];
9229 
9230 static pfcp_msg_hash_t *
pfcp_match_response(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,gint seq_nr,guint msgtype,pfcp_conv_info_t * pfcp_info,guint8 last_cause)9231 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)
9232 {
9233     pfcp_msg_hash_t   pcr, *pcrp = NULL;
9234     guint32 *session;
9235 
9236     pcr.seq_nr = seq_nr;
9237     pcr.req_time = pinfo->abs_ts;
9238 
9239     switch (msgtype) {
9240     case PFCP_MSG_HEARTBEAT_REQUEST:
9241     case PFCP_MSG_PFD_MANAGEMENT_REQUEST:
9242     case PFCP_MSG_ASSOCIATION_SETUP_REQUEST:
9243     case PFCP_MSG_ASSOCIATION_UPDATE_REQUEST:
9244     case PFCP_MSG_ASSOCIATION_RELEASE_REQUEST:
9245     case PFCP_MSG_NODE_REPORT_REQEUST:
9246     case PFCP_MSG_SESSION_SET_DELETION_REQUEST:
9247     case PFCP_MSG_SESSION_SET_MODIFICATION_REQUEST:
9248     case PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST:
9249     case PFCP_MSG_SESSION_MODIFICATION_REQUEST:
9250     case PFCP_MSG_SESSION_DELETION_REQUEST:
9251     case PFCP_MSG_SESSION_REPORT_REQUEST:
9252         pcr.is_request = TRUE;
9253         pcr.req_frame = pinfo->num;
9254         pcr.rep_frame = 0;
9255         break;
9256     case PFCP_MSG_HEARTBEAT_RESPONSE:
9257     case PFCP_MSG_PFD_MANAGEMENT_RESPONSE:
9258     case PFCP_MSG_ASSOCIATION_SETUP_RESPONSE:
9259     case PFCP_MSG_ASSOCIATION_UPDATE_RESPONSE:
9260     case PFCP_MSG_ASSOCIATION_RELEASE_RESPONSE:
9261     case PFCP_MSG_VERSION_NOT_SUPPORTED_RESPONSE:
9262     case PFCP_MSG_NODE_REPORT_RERESPONSE:
9263     case PFCP_MSG_SESSION_SET_DELETION_RESPONSE:
9264     case PFCP_MSG_SESSION_SET_MODIFICATION_RESPONSE:
9265     case PFCP_MSG_SESSION_ESTABLISHMENT_RESPONSE:
9266     case PFCP_MSG_SESSION_MODIFICATION_RESPONSE:
9267     case PFCP_MSG_SESSION_DELETION_RESPONSE:
9268     case PFCP_MSG_SESSION_REPORT_RESPONSE:
9269 
9270         pcr.is_request = FALSE;
9271         pcr.req_frame = 0;
9272         pcr.rep_frame = pinfo->num;
9273         break;
9274     default:
9275         pcr.is_request = FALSE;
9276         pcr.req_frame = 0;
9277         pcr.rep_frame = 0;
9278         break;
9279     }
9280 
9281     pcrp = (pfcp_msg_hash_t *)wmem_map_lookup(pfcp_info->matched, &pcr);
9282 
9283     if (pcrp) {
9284         pcrp->is_request = pcr.is_request;
9285     } else {
9286         /* no match, let's try to make one */
9287         switch (msgtype) {
9288         case PFCP_MSG_HEARTBEAT_REQUEST:
9289         case PFCP_MSG_PFD_MANAGEMENT_REQUEST:
9290         case PFCP_MSG_ASSOCIATION_SETUP_REQUEST:
9291         case PFCP_MSG_ASSOCIATION_UPDATE_REQUEST:
9292         case PFCP_MSG_ASSOCIATION_RELEASE_REQUEST:
9293         case PFCP_MSG_NODE_REPORT_REQEUST:
9294         case PFCP_MSG_SESSION_SET_DELETION_REQUEST:
9295         case PFCP_MSG_SESSION_SET_MODIFICATION_REQUEST:
9296         case PFCP_MSG_SESSION_ESTABLISHMENT_REQUEST:
9297         case PFCP_MSG_SESSION_MODIFICATION_REQUEST:
9298         case PFCP_MSG_SESSION_DELETION_REQUEST:
9299         case PFCP_MSG_SESSION_REPORT_REQUEST:
9300 
9301             pcr.seq_nr = seq_nr;
9302 
9303             pcrp = (pfcp_msg_hash_t *)wmem_map_remove(pfcp_info->unmatched, &pcr);
9304 
9305             /* if we can't reuse the old one, grab a new chunk */
9306             if (!pcrp) {
9307                 pcrp = wmem_new(wmem_file_scope(), pfcp_msg_hash_t);
9308             }
9309             pcrp->seq_nr = seq_nr;
9310             pcrp->req_frame = pinfo->num;
9311             pcrp->req_time = pinfo->abs_ts;
9312             pcrp->rep_frame = 0;
9313             pcrp->msgtype = msgtype;
9314             pcrp->is_request = TRUE;
9315             wmem_map_insert(pfcp_info->unmatched, pcrp, pcrp);
9316             return NULL;
9317             break;
9318         case PFCP_MSG_HEARTBEAT_RESPONSE:
9319         case PFCP_MSG_PFD_MANAGEMENT_RESPONSE:
9320         case PFCP_MSG_ASSOCIATION_SETUP_RESPONSE:
9321         case PFCP_MSG_ASSOCIATION_UPDATE_RESPONSE:
9322         case PFCP_MSG_ASSOCIATION_RELEASE_RESPONSE:
9323         case PFCP_MSG_VERSION_NOT_SUPPORTED_RESPONSE:
9324         case PFCP_MSG_NODE_REPORT_RERESPONSE:
9325         case PFCP_MSG_SESSION_SET_DELETION_RESPONSE:
9326         case PFCP_MSG_SESSION_SET_MODIFICATION_RESPONSE:
9327         case PFCP_MSG_SESSION_ESTABLISHMENT_RESPONSE:
9328         case PFCP_MSG_SESSION_MODIFICATION_RESPONSE:
9329         case PFCP_MSG_SESSION_DELETION_RESPONSE:
9330         case PFCP_MSG_SESSION_REPORT_RESPONSE:
9331 
9332             pcr.seq_nr = seq_nr;
9333             pcrp = (pfcp_msg_hash_t *)wmem_map_lookup(pfcp_info->unmatched, &pcr);
9334 
9335             if (pcrp) {
9336                 if (!pcrp->rep_frame) {
9337                     wmem_map_remove(pfcp_info->unmatched, pcrp);
9338                     pcrp->rep_frame = pinfo->num;
9339                     pcrp->is_request = FALSE;
9340                     wmem_map_insert(pfcp_info->matched, pcrp, pcrp);
9341                 }
9342             }
9343             break;
9344         default:
9345             break;
9346         }
9347     }
9348 
9349     /* we have found a match */
9350     if (pcrp) {
9351         proto_item *it;
9352 
9353         if (pcrp->is_request) {
9354             it = proto_tree_add_uint(tree, hf_pfcp_response_in, tvb, 0, 0, pcrp->rep_frame);
9355             proto_item_set_generated(it);
9356         } else {
9357             nstime_t ns;
9358 
9359             it = proto_tree_add_uint(tree, hf_pfcp_response_to, tvb, 0, 0, pcrp->req_frame);
9360             proto_item_set_generated(it);
9361             nstime_delta(&ns, &pinfo->abs_ts, &pcrp->req_time);
9362             it = proto_tree_add_time(tree, hf_pfcp_response_time, tvb, 0, 0, &ns);
9363             proto_item_set_generated(it);
9364             if (g_pfcp_session && !PINFO_FD_VISITED(pinfo)) {
9365                 /* PFCP session */
9366                 /* If it's not already in the list */
9367                 session = (guint32 *)g_hash_table_lookup(pfcp_session_table, &pinfo->num);
9368                 if (!session) {
9369                     session = (guint32 *)g_hash_table_lookup(pfcp_session_table, &pcrp->req_frame);
9370                     if (session != NULL) {
9371                         pfcp_add_session(pinfo->num, *session);
9372                     }
9373                 }
9374 
9375                 if (!pfcp_is_cause_accepted(last_cause)){
9376                     /* If the cause is not accepted then we have to remove all the session information about its corresponding request */
9377                     pfcp_remove_frame_info(&pcrp->req_frame);
9378                 }
9379             }
9380         }
9381     }
9382     return pcrp;
9383 }
9384 
9385 /* 7.2.3.3  Grouped Information Elements */
9386 
9387 static void
dissect_pfcp_grouped_ie(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,int ett_index,pfcp_session_args_t * args)9388 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)
9389 {
9390     int         offset = 0;
9391     tvbuff_t   *new_tvb;
9392     proto_tree *grouped_tree;
9393 
9394     proto_item_append_text(item, "[Grouped IE]");
9395     grouped_tree = proto_item_add_subtree(tree, ett_index);
9396 
9397     new_tvb = tvb_new_subset_length(tvb, offset, length);
9398     dissect_pfcp_ies_common(new_tvb, pinfo, grouped_tree, offset, length, message_type, args);
9399 
9400 }
9401 
9402 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)9403 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)
9404 {
9405     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ID_PDI], args);
9406 }
9407 
9408 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)9409 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)
9410 {
9411     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ID_CREATE_PDR], args);
9412     proto_item_append_text(item, ": PDR ID: %u", args->last_rule_ids.pdr);
9413 }
9414 
9415 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)9416 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)
9417 {
9418     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_FAR], args);
9419     proto_item_append_text(item, ": FAR ID: %s %u",
9420                         tfs_get_string((args->last_rule_ids.far & 0x80000000), &pfcp_id_predef_dynamic_tfs),
9421                         (args->last_rule_ids.far & 0x7fffffff));
9422 }
9423 
9424 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)9425 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)
9426 {
9427     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_FORWARDING_PARAMETERS], args);
9428 }
9429 
9430 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)9431 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)
9432 {
9433     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_DUPLICATING_PARAMETERS], args);
9434 }
9435 
9436 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)9437 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)
9438 {
9439     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_URR], args);
9440     proto_item_append_text(item, ": URR ID: %s %u",
9441                         tfs_get_string((args->last_rule_ids.urr & 0x80000000), &pfcp_id_predef_dynamic_tfs),
9442                         (args->last_rule_ids.urr & 0x7fffffff));
9443 }
9444 
9445 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)9446 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)
9447 {
9448     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_QER], args);
9449     proto_item_append_text(item, ": QER ID: %s %u",
9450                         tfs_get_string((args->last_rule_ids.qer & 0x80000000), &pfcp_id_predef_dynamic_tfs),
9451                         (args->last_rule_ids.qer & 0x7fffffff));
9452 }
9453 
9454 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)9455 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)
9456 {
9457     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATED_PDR], args);
9458     proto_item_append_text(item, ": PDR ID: %u", args->last_rule_ids.pdr);
9459 }
9460 
9461 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)9462 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)
9463 {
9464     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_PDR], args);
9465     proto_item_append_text(item, ": PDR ID: %u", args->last_rule_ids.pdr);
9466 }
9467 
9468 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)9469 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)
9470 {
9471     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_FAR], args);
9472     proto_item_append_text(item, ": FAR ID: %s %u",
9473                         tfs_get_string((args->last_rule_ids.far & 0x80000000), &pfcp_id_predef_dynamic_tfs),
9474                         (args->last_rule_ids.far & 0x7fffffff));
9475 }
9476 
9477 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)9478 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)
9479 {
9480     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPD_FORWARDING_PARAM], args);
9481 }
9482 
9483 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)9484 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)
9485 {
9486     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_BAR], args);
9487     proto_item_append_text(item, ": BAR ID: %u", args->last_rule_ids.bar);
9488 }
9489 
9490 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)9491 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)
9492 {
9493     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_URR], args);
9494     proto_item_append_text(item, ": URR ID: %s %u",
9495                         tfs_get_string((args->last_rule_ids.urr & 0x80000000), &pfcp_id_predef_dynamic_tfs),
9496                         (args->last_rule_ids.urr & 0x7fffffff));
9497 }
9498 
9499 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)9500 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)
9501 {
9502     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_QER], args);
9503     proto_item_append_text(item, ": QER ID: %s %u",
9504                         tfs_get_string((args->last_rule_ids.qer & 0x80000000), &pfcp_id_predef_dynamic_tfs),
9505                         (args->last_rule_ids.qer & 0x7fffffff));
9506 }
9507 
9508 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)9509 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)
9510 {
9511     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_PDR], args);
9512     proto_item_append_text(item, ": PDR ID: %u", args->last_rule_ids.pdr);
9513 }
9514 
9515 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)9516 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)
9517 {
9518     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_FAR], args);
9519     proto_item_append_text(item, ": FAR ID: %s %u",
9520                         tfs_get_string((args->last_rule_ids.far & 0x80000000), &pfcp_id_predef_dynamic_tfs),
9521                         (args->last_rule_ids.far & 0x7fffffff));
9522 }
9523 
9524 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)9525 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)
9526 {
9527     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_URR], args);
9528     proto_item_append_text(item, ": URR ID: %s %u",
9529                         tfs_get_string((args->last_rule_ids.urr & 0x80000000), &pfcp_id_predef_dynamic_tfs),
9530                         (args->last_rule_ids.urr & 0x7fffffff));
9531 }
9532 
9533 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)9534 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)
9535 {
9536     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_QER], args);
9537     proto_item_append_text(item, ": QER ID: %s %u",
9538                         tfs_get_string((args->last_rule_ids.qer & 0x80000000), &pfcp_id_predef_dynamic_tfs),
9539                         (args->last_rule_ids.qer & 0x7fffffff));
9540 }
9541 
9542 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)9543 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)
9544 {
9545     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_LOAD_CONTROL_INFORMATION], args);
9546 }
9547 
9548 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)9549 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)
9550 {
9551     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_OVERLOAD_CONTROL_INFORMATION], args);
9552 }
9553 
9554 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)9555 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)
9556 {
9557     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_APPLICATION_IDS_PFDS], args);
9558 }
9559 
9560 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)9561 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)
9562 {
9563     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PFD_CONTEXT], args);
9564 }
9565 
9566 
9567 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)9568 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)
9569 {
9570     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_APPLICATION_DETECTION_INF], args);
9571 }
9572 
9573 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)9574 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)
9575 {
9576     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_QUERY_URR], args);
9577 }
9578 
9579 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)9580 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)
9581 {
9582     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_USAGE_REPORT_SMR], args);
9583     proto_item_append_text(item, ": URR ID: %s %u",
9584                         tfs_get_string((args->last_rule_ids.urr & 0x80000000), &pfcp_id_predef_dynamic_tfs),
9585                         (args->last_rule_ids.urr & 0x7fffffff));
9586 }
9587 
9588 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)9589 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)
9590 {
9591     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_USAGE_REPORT_SDR], args);
9592     proto_item_append_text(item, ": URR ID: %s %u",
9593                         tfs_get_string((args->last_rule_ids.urr & 0x80000000), &pfcp_id_predef_dynamic_tfs),
9594                         (args->last_rule_ids.urr & 0x7fffffff));
9595 }
9596 
9597 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)9598 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)
9599 {
9600     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_USAGE_REPORT_SRR], args);
9601     proto_item_append_text(item, ": URR ID: %s %u",
9602                         tfs_get_string((args->last_rule_ids.urr & 0x80000000), &pfcp_id_predef_dynamic_tfs),
9603                         (args->last_rule_ids.urr & 0x7fffffff));
9604 }
9605 
9606 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)9607 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)
9608 {
9609     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_DOWNLINK_DATA_REPORT], args);
9610 }
9611 
9612 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)9613 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)
9614 {
9615     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_BAR], args);
9616     proto_item_append_text(item, ": BAR ID: %u", args->last_rule_ids.bar);
9617 }
9618 
9619 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)9620 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)
9621 {
9622     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_BAR_SMR], args);
9623     proto_item_append_text(item, ": BAR ID: %u", args->last_rule_ids.bar);
9624 }
9625 
9626 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)9627 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)
9628 {
9629     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_BAR], args);
9630     proto_item_append_text(item, ": BAR ID: %u", args->last_rule_ids.bar);
9631 }
9632 
9633 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)9634 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)
9635 {
9636     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ERROR_INDICATION_REPORT], args);
9637 }
9638 
9639 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)9640 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)
9641 {
9642     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_USER_PLANE_PATH_FAILURE_REPORT], args);
9643 }
9644 
9645 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)9646 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)
9647 {
9648     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_DUPLICATING_PARAMETERS], args);
9649 }
9650 
9651 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)9652 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)
9653 {
9654     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_AGGREGATED_URRS], args);
9655 }
9656 
9657 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)9658 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)
9659 {
9660     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_TRAFFIC_ENDPOINT], args);
9661 }
9662 
9663 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)9664 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)
9665 {
9666     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATED_TRAFFIC_ENDPOINT], args);
9667 }
9668 
9669 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)9670 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)
9671 {
9672     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_TRAFFIC_ENDPOINT], args);
9673 }
9674 
9675 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)9676 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)
9677 {
9678     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_TRAFFIC_ENDPOINT], args);
9679 }
9680 
9681 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)9682 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)
9683 {
9684     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ETHERNET_PACKET_FILTER], args);
9685 }
9686 
9687 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)9688 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)
9689 {
9690     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ETHERNET_TRAFFIC_INFORMATION], args);
9691 }
9692 
9693 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)9694 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)
9695 {
9696     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ADDITIONAL_MONITORING_TIME], args);
9697 }
9698 
9699 static void
dissect_pfcp_create_mar(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9700 dissect_pfcp_create_mar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9701 {
9702     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_MAR], args);
9703     proto_item_append_text(item, ": MAR ID: %u", args->last_rule_ids.mar);
9704 }
9705 
9706 static void
dissect_pfcp_access_forwarding_action_information_1(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9707 dissect_pfcp_access_forwarding_action_information_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9708 {
9709     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ACCESS_FORWARDING_ACTION_INORMATION_1], args);
9710 }
9711 
9712 static void
dissect_pfcp_access_forwarding_action_information_2(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9713 dissect_pfcp_access_forwarding_action_information_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9714 {
9715     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ACCESS_FORWARDING_ACTION_INORMATION_2], args);
9716 }
9717 
9718 static void
dissect_pfcp_update_mar(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9719 dissect_pfcp_update_mar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9720 {
9721     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_MAR], args);
9722     proto_item_append_text(item, ": MAR ID: %u", args->last_rule_ids.mar);
9723 }
9724 
9725 static void
dissect_pfcp_remove_mar(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9726 dissect_pfcp_remove_mar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9727 {
9728     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_MAR], args);
9729     proto_item_append_text(item, ": MAR ID: %u", args->last_rule_ids.mar);
9730 }
9731 
9732 static void
dissect_pfcp_update_access_forwarding_action_information_1(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9733 dissect_pfcp_update_access_forwarding_action_information_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9734 {
9735     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_ACCESS_FORWARDING_ACTION_INORMATION_1], args);
9736 }
9737 
9738 static void
dissect_pfcp_update_access_forwarding_action_information_2(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9739 dissect_pfcp_update_access_forwarding_action_information_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9740 {
9741     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_ACCESS_FORWARDING_ACTION_INORMATION_2], args);
9742 }
9743 
9744 static void
dissect_pfcp_pfcp_session_retention_information_within_pfcp_association_setup_request(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9745 dissect_pfcp_pfcp_session_retention_information_within_pfcp_association_setup_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9746 {
9747     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PFCP_SESSION_RETENTION_INFORMATION_WITHIN_ASSOCIATION_SETUP_REQUEST], args);
9748 }
9749 
9750 static void
dissect_pfcp_user_plane_path_recovery_report(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9751 dissect_pfcp_user_plane_path_recovery_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9752 {
9753     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_USER_PLANE_PATH_RECOVERY_REPORT], args);
9754 }
9755 
9756 static void
dissect_ip_multicast_addressing_info_within_pfcp_session_establishment_request(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9757 dissect_ip_multicast_addressing_info_within_pfcp_session_establishment_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9758 {
9759     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_IP_MULTICAST_ADDRESSING_INFO], args);
9760 }
9761 
9762 static void
dissect_pfcp_join_ip_multicast_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9763 dissect_pfcp_join_ip_multicast_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9764 {
9765     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_JOIN_IP_MULTICAST_INFORMATION], args);
9766 }
9767 
9768 static void
dissect_pfcp_leave_ip_multicast_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9769 dissect_pfcp_leave_ip_multicast_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9770 {
9771     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_LEAVE_IP_MULTICAST_INFORMATION], args);
9772 }
9773 
9774 static void
dissect_pfcp_created_bridge_info_for_tsc(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9775 dissect_pfcp_created_bridge_info_for_tsc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9776 {
9777     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATED_BRIDGE_INFO_FOR_TSC], args);
9778 }
9779 
9780 static void
dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_request(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9781 dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9782 {
9783     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_TSC_MANAGEMENT_INFORMATION_WITHIN_PCFP_SESSION_MODIFICATION_REQUEST], args);
9784 }
9785 
9786 static void
dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_response(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9787 dissect_pfcp_tsc_management_information_ie_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9788 {
9789     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_TSC_MANAGEMENT_INFORMATION_WITHIN_PCFP_SESSION_MODIFICATION_RESPONSE], args);
9790 }
9791 
9792 static void
dissect_pfcp_tsc_management_information_ie_within_pfcp_session_report_request(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9793 dissect_pfcp_tsc_management_information_ie_within_pfcp_session_report_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9794 {
9795     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_TSC_MANAGEMENT_INFORMATION_WITHIN_PCFP_SESSION_REPORT_REQUEST], args);
9796 }
9797 
9798 static void
dissect_pfcp_clock_drift_control_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9799 dissect_pfcp_clock_drift_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9800 {
9801     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CLOCK_DRIFT_CONTROL_INFORMATION], args);
9802 }
9803 
9804 static void
dissect_pfcp_clock_drift_report(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9805 dissect_pfcp_clock_drift_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9806 {
9807     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CLOCK_DRIFT_REPORT], args);
9808 }
9809 
9810 static void
dissect_pfcp_remove_srr(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9811 dissect_pfcp_remove_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9812 {
9813     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_SRR], args);
9814     proto_item_append_text(item, ": SRR ID: %u", args->last_rule_ids.srr);
9815 }
9816 
9817 static void
dissect_pfcp_create_srr(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9818 dissect_pfcp_create_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9819 {
9820     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_CREATE_SRR], args);
9821     proto_item_append_text(item, ": SRR ID: %u", args->last_rule_ids.srr);
9822 }
9823 
9824 static void
dissect_pfcp_update_srr(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9825 dissect_pfcp_update_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9826 {
9827     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATE_SRR], args);
9828     proto_item_append_text(item, ": SRR ID: %u", args->last_rule_ids.srr);
9829 }
9830 
9831 static void
dissect_pfcp_session_report(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9832 dissect_pfcp_session_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9833 {
9834     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_SESSION_REPORT], args);
9835 }
9836 
9837 static void
dissect_pfcp_access_availability_control_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9838 dissect_pfcp_access_availability_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9839 {
9840     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ACCESS_AVAILABILITY_CONTROL_INFORMATION], args);
9841 }
9842 
9843 static void
dissect_pfcp_access_availability_report(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9844 dissect_pfcp_access_availability_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9845 {
9846     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ACCESS_AVAILABILITY_REPORT], args);
9847 }
9848 
9849 static void
dissect_pfcp_provide_atsss_control_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9850 dissect_pfcp_provide_atsss_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9851 {
9852     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PROVICE_ATSSS_CONTROL_INFORMATION], args);
9853 }
9854 
9855 static void
dissect_pfcp_atsss_control_parameters(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9856 dissect_pfcp_atsss_control_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9857 {
9858     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ATSSS_CONTROl_PARAMETERS], args);
9859 }
9860 
9861 static void
dissect_pfcp_mptcp_parameters(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9862 dissect_pfcp_mptcp_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9863 {
9864     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_MPTCP_PARAMETERS], args);
9865 }
9866 
9867 static void
dissect_pfcp_atsss_ll_parameters(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9868 dissect_pfcp_atsss_ll_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9869 {
9870     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ATSSS_LL_PARAMETERS], args);
9871 }
9872 
9873 static void
dissect_pfcp_pmf_parameters(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9874 dissect_pfcp_pmf_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9875 {
9876     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PMF_PARAMETERS], args);
9877 }
9878 
9879 static void
dissect_pfcp_ue_ip_address_pool_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9880 dissect_pfcp_ue_ip_address_pool_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9881 {
9882     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UE_IP_ADDRESS_POOL_INFORMATION], args);
9883 }
9884 
9885 static void
dissect_pfcp_gtp_u_path_qos_control_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9886 dissect_pfcp_gtp_u_path_qos_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9887 {
9888     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_GTP_U_PATH_QOS_CONTROL_INFORMATION], args);
9889 }
9890 
9891 static void
dissect_pfcp_gtp_u_path_qos_report(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9892 dissect_pfcp_gtp_u_path_qos_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9893 {
9894     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_GTP_U_PATH_QOS_REPORT], args);
9895 }
9896 
9897 static void
dissect_pfcp_qos_information_in_gtp_u_path_qos_report(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9898 dissect_pfcp_qos_information_in_gtp_u_path_qos_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9899 {
9900     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_QOS_INFORMATION_IN_GTP_U_PATH_QOS_REPORT], args);
9901 }
9902 
9903 static void
dissect_pfcp_qos_monitoring_per_qos_flow_control_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9904 dissect_pfcp_qos_monitoring_per_qos_flow_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9905 {
9906     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_QOS_MONITORING_PER_QOS_FLOW_CONTROL_INFORMATION], args);
9907 }
9908 
9909 static void
dissect_pfcp_qos_monitoring_report(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9910 dissect_pfcp_qos_monitoring_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9911 {
9912     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_QOS_MONITORING_REPORT], args);
9913 }
9914 
9915 static void
dissect_pfcp_packet_rate_status_report_ie_within_pfcp_session_deletion_response(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9916 dissect_pfcp_packet_rate_status_report_ie_within_pfcp_session_deletion_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9917 {
9918     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PACKET_RATE_STATUS_REPORT_IE_WITHIN_PFCP_SESSION_DELETION_RESPONSE], args);
9919 }
9920 
9921 static void
dissect_pfcp_ethernet_context_information_within_pfcp_session_modification_request(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9922 dissect_pfcp_ethernet_context_information_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9923 {
9924     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PCFP_IE_ETHERNET_CONTEXT_INFORMATION_WITHIN_PFCP_SESSION_MODIFICATION_REQUEST], args);
9925 }
9926 
9927 static void
dissect_pfcp_redundant_transmission_detection_parameters(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9928 dissect_pfcp_redundant_transmission_detection_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9929 {
9930     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REDUNDANT_TRANSMISSION_DETECTION_PARAMETERS_IE_IN_PDI], args);
9931 }
9932 
9933 static void
dissect_pfcp_updated_pdr_ie_within_pfcp_session_modification_response(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9934 dissect_pfcp_updated_pdr_ie_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9935 {
9936     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UPDATED_PDR_IE_WITHIN_PFCP_SESSION_MODIFICATION_RESPONSE], args);
9937 }
9938 
9939 static void
dissect_pfcp_provide_rds_configuration_information_ie_within_pfcp_session_modification_request(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9940 dissect_pfcp_provide_rds_configuration_information_ie_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9941 {
9942     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PROVIDE_RDS_CONFIGURATION_INFORMATION_IE_WITHIN_PCFP_SESSION_ESTABLISHMENT_REQUEST], args);
9943 }
9944 
9945 static void
dissect_pfcp_query_packet_rate_status_ie_within_pfcp_session_modification_request(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9946 dissect_pfcp_query_packet_rate_status_ie_within_pfcp_session_modification_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9947 {
9948     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_QUERY_PACKET_RATE_STATUS_IE_WITHIN_PCFP_SESSION_ESTABLISHMENT_REQUEST], args);
9949 }
9950 
9951 static void
dissect_pfcp_query_packet_rate_status_report_ie_within_pfcp_session_modification_response(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9952 dissect_pfcp_query_packet_rate_status_report_ie_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9953 {
9954     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_QUERY_PACKET_RATE_STATUS_REPORT_IE_WITHIN_PCFP_SESSION_ESTABLISHMENT_RESPONSE], args);
9955 }
9956 
9957 static void
dissect_pfcp_ue_ip_address_usage_information_ie_within_pfcp_association_update_request(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9958 dissect_pfcp_ue_ip_address_usage_information_ie_within_pfcp_association_update_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9959 {
9960     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_UE_IP_ADDRESS_USAGE_INFORMATION_IE_WITHIN_PFCP_ASSOCIATION_UPDATE_REQUEST], args);
9961 }
9962 
9963 static void
dissect_pfcp_redundant_transmission_forward_parameters(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9964 dissect_pfcp_redundant_transmission_forward_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9965 {
9966     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REDUNDANT_TRANSMISSION_FORWARD_PARAMETERS_IE_IN_FAR], args);
9967 }
9968 
9969 static void
dissect_pfcp_transport_dealy_reporting_ie_in_create_pdr(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9970 dissect_pfcp_transport_dealy_reporting_ie_in_create_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9971 {
9972     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_TRANSPORT_DELAY_REPORTING], args);
9973 }
9974 
9975 static void
dissect_pfcp_partial_failure_information_within_pfcp_session_establishment_response(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9976 dissect_pfcp_partial_failure_information_within_pfcp_session_establishment_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9977 {
9978     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PARTIAL_FAILURE_INFORMATION_WITHIN_PFCP_SESSION_ESTABLISHMENT_RESPONSE], args);
9979 }
9980 
9981 static void
dissect_pfcp_partial_failure_information_within_pfcp_session_modification_response(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9982 dissect_pfcp_partial_failure_information_within_pfcp_session_modification_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9983 {
9984     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PARTIAL_FAILURE_INFORMATION_WITHIN_PFCP_SESSION_MODIFICATION_RESPONSE], args);
9985 }
9986 
9987 static void
dissect_pfcp_l2tp_tunnel_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9988 dissect_pfcp_l2tp_tunnel_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9989 {
9990     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_L2TP_TUNNEL_INFORMATION], args);
9991 }
9992 
9993 static void
dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_request(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)9994 dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
9995 {
9996     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_L2TP_SESSION_INFORMATION_WITHIN_PFCP_SESSION_ESTABLISHMENT_REQUEST], args);
9997 }
9998 
9999 static void
dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_response(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)10000 dissect_pfcp_l2tp_session_information_within_pfcp_session_establishment_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
10001 {
10002     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_L2TP_SESSION_INFORMATION_WITHIN_PFCP_SESSION_ESTABLISHMENT_RESPONSE], args);
10003 }
10004 
10005 static void
dissect_pfcp_pfcp_session_change_info(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)10006 dissect_pfcp_pfcp_session_change_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
10007 {
10008     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_PFCP_SESSION_CHANGE_INFO], args);
10009 }
10010 
10011 static void
dissect_pfcp_direct_reporting_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)10012 dissect_pfcp_direct_reporting_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
10013 {
10014     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_DIRECT_REPORTING_INFORMATION], args);
10015 }
10016 
10017 static void
dissect_pfcp_mbs_session_n4mb_control_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)10018 dissect_pfcp_mbs_session_n4mb_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
10019 {
10020     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_MBS_SESSION_N4MB_CONTROL_INFORMATION], args);
10021 }
10022 
10023 static void
dissect_pfcp_mbs_multicast_parameters(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)10024 dissect_pfcp_mbs_multicast_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
10025 {
10026     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_MBS_MULTICAST_PARAMETERS], args);
10027 }
10028 
10029 static void
dissect_pfcp_add_mbs_unicast_parameters_ie_in_create_far(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)10030 dissect_pfcp_add_mbs_unicast_parameters_ie_in_create_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
10031 {
10032     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_ADD_MBS_UNICAST_PARAMETERS_IE_IN_CREATE_FAR], args);
10033 }
10034 
10035 static void
dissect_pfcp_mbs_session_n4mb_information(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)10036 dissect_pfcp_mbs_session_n4mb_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
10037 {
10038     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_MBS_SESSION_N4MB_INFORMATION], args);
10039 }
10040 
10041 static void
dissect_pfcp_remove_mbs_unicast_parameters_ie_in_update_far(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item,guint16 length,guint8 message_type,pfcp_session_args_t * args)10042 dissect_pfcp_remove_mbs_unicast_parameters_ie_in_update_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args)
10043 {
10044     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_IE_REMOVE_MBS_UNICAST_PARAMETERS_IE_IN_UPDATE_FAR], args);
10045 }
10046 
10047 
10048 static void
dissect_pfcp_ies_common(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,gint offset,guint16 length,guint8 message_type,pfcp_session_args_t * args)10049 dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint offset, guint16 length, guint8 message_type, pfcp_session_args_t *args)
10050 {
10051     proto_tree *ie_tree;
10052     proto_item *ti;
10053     tvbuff_t   *ie_tvb;
10054     guint16 type, length_ie;
10055     guint16 enterprise_id;
10056     pfcp_sub_dis_t *pfcp_sub_dis_inf = wmem_new0(pinfo->pool, pfcp_sub_dis_t);
10057 
10058     pfcp_sub_dis_inf->message_type = message_type;
10059     pfcp_sub_dis_inf->args = args;
10060 
10061     /* 8.1.1    Information Element Format */
10062     /*
10063     Octets      8   7   6   5   4   3   2   1
10064     1 to 2      Type = xxx (decimal)
10065     3 to 4      Length = n
10066     p to (p+1)  Enterprise ID
10067     k to (n+4)  IE specific data or content of a grouped IE
10068 
10069     If the Bit 8 of Octet 1 is not set, this indicates that the IE is defined by 3GPP and the Enterprise ID is absent.
10070     If Bit 8 of Octet 1 is set, this indicates that the IE is defined by a vendor and the Enterprise ID is present
10071     identified by the Enterprise ID
10072     */
10073 
10074     /*Enterprise ID : if the IE type value is within the range of 32768 to 65535,
10075      * this field shall contain the IANA - assigned "SMI Network Management Private Enterprise Codes"
10076      * value of the vendor defining the IE.
10077      */
10078     /* Length: this field contains the length of the IE excluding the first four octets, which are common for all IEs */
10079 
10080     /* Process the IEs*/
10081     while (offset < length) {
10082         /* Octet 1 -2 */
10083         type = tvb_get_ntohs(tvb, offset);
10084         length_ie = tvb_get_ntohs(tvb, offset + 2);
10085 
10086         if ((type & 0x8000) == 0x8000 ) {
10087             enterprise_id = tvb_get_ntohs(tvb, offset + 4);
10088             ie_tvb = tvb_new_subset_length(tvb, offset, length_ie + 4);
10089 
10090             if (!dissector_try_uint_new(pfcp_enterprise_ies_dissector_table, enterprise_id, ie_tvb, pinfo, tree, FALSE, pfcp_sub_dis_inf)) {
10091                 /* no Enterprise disector, do some generic decoding */
10092                 ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 + length_ie, ett_pfcp_ie, &ti, "Enterprise %s specific IE: %u",
10093                                                         try_enterprises_lookup(enterprise_id),
10094                                                         type);
10095 
10096                 proto_tree_add_item(ie_tree, hf_pfcp2_enterprise_ie, tvb, offset, 2, ENC_BIG_ENDIAN);
10097                 proto_tree_add_item(ie_tree, hf_pfcp2_ie_len, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
10098 
10099                 /* Bit 8 of Octet 1 is set, this indicates that the IE is defined by a vendor and the Enterprise ID is present */
10100                 proto_tree_add_item(ie_tree, hf_pfcp_enterprise_id, tvb, offset + 4, 2, ENC_BIG_ENDIAN);
10101 
10102                 /*
10103                  * 5.6.3    Modifying the Rules of an Existing PFCP Session
10104                  *
10105                  * Updating the Rule including the IEs to be removed with a null length,
10106                  * e.g. by including the Update URR IE in the PFCP Session Modification Request
10107                  * with the IE(s) to be removed with a null length.
10108                  */
10109                 if (length_ie == 0) {
10110                     proto_item_append_text(ti, "[IE to be removed]");
10111                 } else {
10112                     proto_tree_add_item(ie_tree, hf_pfcp_enterprise_data, ie_tvb, 6, -1, ENC_NA);
10113                 }
10114             }
10115             offset += (4 + length_ie);
10116         } else {
10117             int tmp_ett;
10118             if (type < (NUM_PFCP_IES - 1)) {
10119                 tmp_ett = ett_pfcp_elem[type];
10120             } else {
10121                 tmp_ett = ett_pfcp_ie;
10122             }
10123             ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 + length_ie, tmp_ett, &ti, "%s : ",
10124                 val_to_str_ext_const(type, &pfcp_ie_type_ext, "Unknown"));
10125 
10126             proto_tree_add_item(ie_tree, hf_pfcp2_ie, tvb, offset, 2, ENC_BIG_ENDIAN);
10127             offset += 2;
10128             proto_tree_add_item(ie_tree, hf_pfcp2_ie_len, tvb, offset, 2, ENC_BIG_ENDIAN);
10129             offset += 2;
10130 
10131             /*
10132             * 5.6.3    Modifying the Rules of an Existing PFCP Session
10133             *
10134             * Updating the Rule including the IEs to be removed with a null length,
10135             * e.g. by including the Update URR IE in the PFCP Session Modification Request
10136             * with the IE(s) to be removed with a null length.
10137             */
10138             if( length_ie == 0 ) {
10139                 proto_item_append_text(ti, "[IE to be removed]");
10140             } else {
10141                 if (type < (NUM_PFCP_IES -1)) {
10142                     ie_tvb = tvb_new_subset_length(tvb, offset, length_ie);
10143                     if(pfcp_ies[type].decode){
10144                         (*pfcp_ies[type].decode) (ie_tvb, pinfo, ie_tree, ti, length_ie, message_type, args);
10145                     } else {
10146                         /* NULL function pointer, we have no decoding function*/
10147                         proto_tree_add_expert(ie_tree, pinfo, &ei_pfcp_ie_not_decoded_null, tvb, offset, length_ie);
10148                     }
10149                 } else {
10150                     /* IE id outside of array, We have no decoding function for it */
10151                     proto_tree_add_expert(ie_tree, pinfo, &ei_pfcp_ie_not_decoded_too_large, tvb, offset, length_ie);
10152                 }
10153             }
10154             offset += length_ie;
10155         }
10156     }
10157 }
10158 
10159 static void
dissect_pfcp_enterprise_ies_common(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,guint8 message_type,pfcp_session_args_t * args,guint num_pfcp_enterprise_ies,gint * ett_pfcp_enterprise_elem,const pfcp_ie_t * pfcp_enterprise_ies,value_string_ext * pfcp_ie_enterprise_type_ext)10160 dissect_pfcp_enterprise_ies_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8 message_type, pfcp_session_args_t *args,
10161                                    guint num_pfcp_enterprise_ies, gint * ett_pfcp_enterprise_elem, const pfcp_ie_t * pfcp_enterprise_ies,
10162                                    value_string_ext * pfcp_ie_enterprise_type_ext)
10163 {
10164     proto_tree *ie_tree;
10165     proto_item *ti;
10166     tvbuff_t   *ie_tvb;
10167     gint offset = 0;
10168     guint16 type, length_ie;
10169     int tmp_ett;
10170 
10171     /* Octet 1 -2 */
10172     type = tvb_get_ntohs(tvb, offset) & ~0x8000;
10173     length_ie = tvb_get_ntohs(tvb, offset + 2);
10174 
10175     /* adjust length for Enterprise Id */
10176     length_ie -= 2;
10177 
10178     if (type < (num_pfcp_enterprise_ies - 1)) {
10179         tmp_ett = ett_pfcp_enterprise_elem[type];
10180     } else {
10181         tmp_ett = ett_pfcp_ie;
10182     }
10183 
10184     ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, 6 + length_ie, tmp_ett, &ti, "%s : ",
10185                                             val_to_str_ext_const(type, pfcp_ie_enterprise_type_ext, "Unknown"));
10186 
10187     proto_tree_add_item(ie_tree, hf_pfcp2_enterprise_ie, tvb, offset, 2, ENC_BIG_ENDIAN);
10188     offset += 2;
10189     proto_tree_add_item(ie_tree, hf_pfcp2_ie_len, tvb, offset, 2, ENC_BIG_ENDIAN);
10190     offset += 2;
10191     proto_tree_add_item(ie_tree, hf_pfcp_enterprise_id, tvb, offset, 2, ENC_BIG_ENDIAN);
10192     offset += 2;
10193 
10194     /*
10195      * 5.6.3    Modifying the Rules of an Existing PFCP Session
10196      *
10197      * Updating the Rule including the IEs to be removed with a null length,
10198      * e.g. by including the Update URR IE in the PFCP Session Modification Request
10199      * with the IE(s) to be removed with a null length.
10200      */
10201     if( length_ie == 0 ) {
10202         proto_item_append_text(ti, "[IE to be removed]");
10203     } else {
10204         if (type < (num_pfcp_enterprise_ies - 1)) {
10205             ie_tvb = tvb_new_subset_length(tvb, offset, length_ie);
10206             if(pfcp_enterprise_ies[type].decode){
10207                 (*pfcp_enterprise_ies[type].decode) (ie_tvb, pinfo, ie_tree, ti, length_ie, message_type, args);
10208             } else {
10209                 /* NULL function pointer, we have no decoding function*/
10210                 proto_tree_add_expert(ie_tree, pinfo, &ei_pfcp_ie_not_decoded_null, tvb, offset, length_ie);
10211             }
10212         } else {
10213             /* IE id outside of array, We have no decoding function for it */
10214             proto_tree_add_expert(ie_tree, pinfo, &ei_pfcp_ie_not_decoded_too_large, tvb, offset, length_ie);
10215         }
10216     }
10217 }
10218 
10219 static int
dissect_pfcp_message(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree)10220 dissect_pfcp_message(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
10221 {
10222     proto_item          *item;
10223     proto_tree          *sub_tree;
10224     int                  offset = 0;
10225     guint64              pfcp_flags;
10226     guint8               message_type, cause_aux;
10227     guint32              length;
10228     guint32              length_total;
10229     int                  seq_no = 0;
10230     conversation_t      *conversation;
10231     pfcp_conv_info_t    *pfcp_info;
10232     pfcp_session_args_t *args = NULL;
10233     pfcp_hdr_t          *pfcp_hdr = NULL;
10234 
10235     static int * const pfcp_hdr_flags[] = {
10236         &hf_pfcp_version,
10237         &hf_pfcp_spare_b4,
10238         &hf_pfcp_spare_b3,
10239         &hf_pfcp_fo_flag,
10240         &hf_pfcp_mp_flag,
10241         &hf_pfcp_s_flag,
10242         NULL
10243     };
10244 
10245     pfcp_hdr = wmem_new0(pinfo->pool, pfcp_hdr_t);
10246 
10247     /* Setting the SEID to -1 to say that the SEID is not valid for this packet */
10248     pfcp_hdr->seid = -1;
10249 
10250     col_set_str(pinfo->cinfo, COL_PROTOCOL, "PFCP");
10251     col_clear(pinfo->cinfo, COL_INFO);
10252 
10253     message_type = tvb_get_guint8(tvb, 1);
10254     col_set_str(pinfo->cinfo, COL_INFO, val_to_str_ext_const(message_type, &pfcp_message_type_ext, "Unknown"));
10255 
10256     args = wmem_new0(pinfo->pool, pfcp_session_args_t);
10257     args->last_cause = 1;                                         /* It stores the last cause decoded. Cause accepted by default */
10258     if (g_pfcp_session) {
10259         /* We create the auxiliary lists */
10260         args->seid_list = wmem_list_new(pinfo->pool);
10261         args->ip_list = wmem_list_new(pinfo->pool);
10262     }
10263 
10264     /* Do we have a conversation for this connection? */
10265     conversation = find_or_create_conversation(pinfo);
10266 
10267     /* Do we already know this conversation? */
10268     pfcp_info = (pfcp_conv_info_t *)conversation_get_proto_data(conversation, proto_pfcp);
10269     if (pfcp_info == NULL) {
10270         /* No. Attach that information to the conversation,
10271         * and add it to the list of information structures.
10272         */
10273         pfcp_info = wmem_new(wmem_file_scope(), pfcp_conv_info_t);
10274         /* Request/response matching tables */
10275         pfcp_info->matched = wmem_map_new(wmem_file_scope(), pfcp_sn_hash, pfcp_sn_equal_matched);
10276         pfcp_info->unmatched = wmem_map_new(wmem_file_scope(), pfcp_sn_hash, pfcp_sn_equal_unmatched);
10277 
10278         conversation_add_proto_data(conversation, proto_pfcp, pfcp_info);
10279     }
10280 
10281     item = proto_tree_add_item(tree, proto_pfcp, tvb, 0, -1, ENC_NA);
10282     sub_tree = proto_item_add_subtree(item, ett_pfcp);
10283 
10284     /* 7.2.2    Message Header */
10285     /*
10286         Octet     8     7     6     5     4     3     2     1
10287           1    | Version        |Spare|Spare|  FO  |  MP  |  S  |
10288           2    |        Message Type                            |
10289           3    |        Message Length (1st Octet)              |
10290           4    |        Message Length (2nd Octet)              |
10291         m to   | If S flag is set to 1, then SEID shall be      |
10292         k(m+7) | placed into octets 5-12. Otherwise, SEID field |
10293                | is not present at all.                         |
10294         n to   | Sequence Number                                |
10295         (n+2)  |                                                |
10296         (n+3)  |         Spare                                  |
10297 
10298     */
10299     /* Octet 1 */
10300     proto_tree_add_bitmask_with_flags_ret_uint64(sub_tree, tvb, offset, hf_pfcp_hdr_flags,
10301         ett_pfcp_flags, pfcp_hdr_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &pfcp_flags);
10302     offset += 1;
10303 
10304     /* Octet 2 Message Type */
10305     pfcp_hdr->message = tvb_get_guint8(tvb, offset);
10306     proto_tree_add_uint(sub_tree, hf_pfcp_msg_type, tvb, offset, 1, pfcp_hdr->message);
10307     offset += 1;
10308 
10309     /* Octet 3 - 4 Message Length */
10310     proto_tree_add_item_ret_uint(sub_tree, hf_pfcp_msg_length, tvb, offset, 2, ENC_BIG_ENDIAN, &length);
10311     offset += 2;
10312 
10313     /* length of the message in octets plus the excluded mandatory part of the PFCP header (the first 4 octets) */
10314     length_total = (length + 4);
10315 
10316     if ((pfcp_flags & 0x1) == 1) {
10317         /* If S flag is set to 1, then SEID shall be placed into octets 5-12*/
10318         /* Session Endpoint Identifier 8 Octets */
10319         pfcp_hdr->seid = tvb_get_ntohi64(tvb, offset);
10320         proto_tree_add_uint64(sub_tree, hf_pfcp_seid, tvb, offset, 8, pfcp_hdr->seid);
10321         offset += 8;
10322     }
10323     /* 7.2.2.2    PFCP Header for Node Related Messages */
10324     /*
10325         Octet     8     7     6     5     4     3     2     1
10326           1    | Version        |Spare|Spare| FO=0 | MP=0 | S=0 |
10327           2    |        Message Type                            |
10328           3    |        Message Length (1st Octet)              |
10329           4    |        Message Length (2nd Octet)              |
10330           5    |        Sequence Number (1st Octet)             |
10331           6    |        Sequence Number (2st Octet)             |
10332           7    |        Sequence Number (3st Octet)             |
10333           8    |             Spare                              |
10334     */
10335     proto_tree_add_item_ret_uint(sub_tree, hf_pfcp_seqno, tvb, offset, 3, ENC_BIG_ENDIAN, &seq_no);
10336     offset += 3;
10337 
10338     if ((pfcp_flags & 0x2) == 0x2) {
10339         /* If the "MP" flag is set to "1", then bits 8 to 5 of octet 16 shall indicate the message priority.*/
10340         proto_tree_add_item(sub_tree, hf_pfcp_mp, tvb, offset, 1, ENC_BIG_ENDIAN);
10341         proto_tree_add_item(sub_tree, hf_pfcp_spare_h0, tvb, offset, 1, ENC_BIG_ENDIAN);
10342     } else {
10343         proto_tree_add_item(sub_tree, hf_pfcp_spare_oct, tvb, offset, 1, ENC_BIG_ENDIAN);
10344     }
10345     offset++;
10346 
10347     /* Dissect the IEs in the message */
10348     dissect_pfcp_ies_common(tvb, pinfo, sub_tree, offset, length_total, message_type, args);
10349 
10350     /* Use sequence number to track Req/Resp pairs */
10351     cause_aux = 16; /* Cause accepted by default. Only used when no session tracking enabled */
10352     if (g_pfcp_session && !PINFO_FD_VISITED(pinfo)) {
10353         /* We insert the lists inside the table*/
10354         pfcp_fill_map(args->seid_list, args->ip_list, pinfo->num);
10355         cause_aux = args->last_cause;
10356     }
10357     pfcp_match_response(tvb, pinfo, sub_tree, seq_no, message_type, pfcp_info, cause_aux);
10358     if (g_pfcp_session) {
10359         pfcp_track_session(tvb, pinfo, sub_tree, pfcp_hdr, args->seid_list, args->ip_list, args->last_seid, args->last_ip);
10360     }
10361 
10362     return length_total;
10363 }
10364 
10365 static int
dissect_pfcp(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,void * data _U_)10366 dissect_pfcp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data _U_)
10367 {
10368     int     offset = 0;
10369     guint   length = tvb_reported_length(tvb);
10370 
10371     /* 7.2.1A   PFCP messages bundled in one UDP/IP packet */
10372     /* Each bundled PFCP message shall contain its PFCP message header and may */
10373     /* contain subsequent information element(s) dependent on the type of message. */
10374     do
10375     {
10376         /* The first octet of header, Bit 3 represents the "FO" (Follow On) flag. */
10377         /* If the "FO" flag is set to "1", then another PFCP message follows in the UDP/IP packet */
10378         gboolean follow_on = (tvb_get_guint8(tvb, offset) & 0x04);
10379 
10380         /* length of the message in octets plus the excluded mandatory part of the PFCP header (the first 4 octets) */
10381         guint16 message_length = (tvb_get_guint16(tvb, (offset + 2), 0) + 4);
10382 
10383         tvbuff_t *message_tvb = tvb_new_subset_length(tvb, offset, message_length);
10384         offset += dissect_pfcp_message(message_tvb, pinfo, tree);
10385 
10386         /* Lets warn of faulty FO flag */
10387         if (follow_on) {
10388             if ((length - offset) == 0) {
10389                 proto_tree_add_expert_format(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, offset, -1, "Follow ON flag set but no data left for following message");
10390             }
10391         } else {
10392             if ((length - offset) > 0) {
10393                 proto_tree_add_expert_format(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, offset, -1, "Data left for following message but Follow ON flag is not set");
10394             }
10395         }
10396     } while (length > (guint)offset);
10397 
10398     return length;
10399 }
10400 
10401 /* Enterprise IE decoding 3GPP */
10402 static int
dissect_pfcp_3gpp_enterprise_ies(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,void * data _U_)10403 dissect_pfcp_3gpp_enterprise_ies(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
10404 {
10405     gint offset = 0;
10406     proto_tree *ie_tree;
10407     guint16 type;
10408 
10409     type = tvb_get_ntohs(tvb, offset) & ~0x8000;
10410 
10411     ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_pfcp_ie, NULL,
10412                                             "Enterprise %s specific IE: %u [Enterprise ID set to '10415' shall not be used for the vendor specific IEs]",
10413                                             try_enterprises_lookup(VENDOR_THE3GPP), type);
10414     proto_tree_add_item(ie_tree, hf_pfcp2_enterprise_ie, tvb, offset, 2, ENC_BIG_ENDIAN);
10415     offset += 2;
10416     proto_tree_add_item(ie_tree, hf_pfcp2_ie_len, tvb, offset, 2, ENC_BIG_ENDIAN);
10417     offset += 2;
10418     proto_tree_add_item(ie_tree, hf_pfcp_enterprise_id, tvb, offset, 2, ENC_BIG_ENDIAN);
10419     offset += 2;
10420     proto_tree_add_expert(ie_tree, pinfo, &ei_pfcp_enterprise_ie_3gpp, tvb, offset, -1);
10421 
10422     return tvb_reported_length(tvb);
10423 }
10424 
10425 /* Enterprise IE decoding Broadband Forum
10426  *
10427  * TR-459: Control and User Plane Separation for a disaggregated BNG
10428  */
10429 
10430 static void dissect_pfcp_enterprise_bbf_ppp_lcp_connectivity(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args);
10431 static void dissect_pfcp_enterprise_bbf_l2tp_tunnel(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args);
10432 
10433 #define PFCP_IE_ENTERPRISE_BBF_UP_FUNCTION_FEATURES              0 /* 32768 */
10434 #define PFCP_IE_ENTERPRISE_BBF_LOGICAL_PORT                      1 /* 32769 */
10435 #define PFCP_IE_ENTERPRISE_BBF_OUTER_HEADER_CREATION             2 /* 32770 */
10436 #define PFCP_IE_ENTERPRISE_BBF_OUTER_HEADER_REMOVAL              3 /* 32771 */
10437 #define PFCP_IE_ENTERPRISE_BBF_PPPOE_SESSION_ID                  4 /* 32772 */
10438 #define PFCP_IE_ENTERPRISE_BBF_PPP_PROTOCOL                      5 /* 32773 */
10439 #define PFCP_IE_ENTERPRISE_BBF_VERIFICATION_TIMERS               6 /* 32774 */
10440 #define PFCP_IE_ENTERPRISE_BBF_PPP_LCP_MAGIC_NUMBER              7 /* 32775 */
10441 #define PFCP_IE_ENTERPRISE_BBF_MTU                               8 /* 32776 */
10442 #define PFCP_IE_ENTERPRISE_BBF_L2TP_TUNNEL_ENDPOINT              9 /* 32777 */
10443 #define PFCP_IE_ENTERPRISE_BBF_L2TP_SESSION_ID                  10 /* 32778 */
10444 #define PFCP_IE_ENTERPRISE_BBF_L2TP_TYPE                        11 /* 32779 */
10445 #define PFCP_IE_ENTERPRISE_BBF_PPP_LCP_CONNECTIVITY             12 /* 32780 */
10446 #define PFCP_IE_ENTERPRISE_BBF_L2TP_TUNNEL                      13 /* 32781 */
10447 
10448 static const value_string pfcp_ie_enterprise_bbf_type[] = {
10449     { PFCP_IE_ENTERPRISE_BBF_UP_FUNCTION_FEATURES,              "BBF UP Function Features"},
10450     { PFCP_IE_ENTERPRISE_BBF_LOGICAL_PORT,                      "Logical Port"},
10451     { PFCP_IE_ENTERPRISE_BBF_OUTER_HEADER_CREATION,             "BBF Outer Header Creation"},
10452     { PFCP_IE_ENTERPRISE_BBF_OUTER_HEADER_REMOVAL,              "BBF Outer Header Removal"},
10453     { PFCP_IE_ENTERPRISE_BBF_PPPOE_SESSION_ID,                  "PPPoE Session ID"},
10454     { PFCP_IE_ENTERPRISE_BBF_PPP_PROTOCOL,                      "PPP protocol"},
10455     { PFCP_IE_ENTERPRISE_BBF_VERIFICATION_TIMERS,               "Verification Timers"},
10456     { PFCP_IE_ENTERPRISE_BBF_PPP_LCP_MAGIC_NUMBER,              "PPP LCP Magic Number"},
10457     { PFCP_IE_ENTERPRISE_BBF_MTU,                               "MTU"},
10458     { PFCP_IE_ENTERPRISE_BBF_L2TP_TUNNEL_ENDPOINT,              "L2TP Tunnel Endpoint"},
10459     { PFCP_IE_ENTERPRISE_BBF_L2TP_SESSION_ID,                   "L2TP Session ID"},
10460     { PFCP_IE_ENTERPRISE_BBF_L2TP_TYPE,                         "L2TP Type"},
10461     { PFCP_IE_ENTERPRISE_BBF_PPP_LCP_CONNECTIVITY,              "PPP LCP Connectivity"},
10462     { PFCP_IE_ENTERPRISE_BBF_L2TP_TUNNEL,                       "L2TP Tunnel"},
10463     { 0, NULL }
10464 };
10465 
10466 static value_string_ext pfcp_ie_enterprise_bbf_type_ext = VALUE_STRING_EXT_INIT(pfcp_ie_enterprise_bbf_type);
10467 
10468 /*
10469  * TR-459: 6.6.1 BBF UP Function Features
10470  */
10471 static void
dissect_pfcp_enterprise_bbf_up_function_features(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10472 dissect_pfcp_enterprise_bbf_up_function_features(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10473 {
10474     int offset = 0;
10475 
10476     static int * const pfcp_bbf_up_function_features_o7_flags[] = {
10477         &hf_pfcp_spare_b7_b5,
10478         &hf_pfcp_bbf_up_function_features_o7_b4_lcp_keepalive_offload,
10479         &hf_pfcp_bbf_up_function_features_o7_b3_lns,
10480         &hf_pfcp_bbf_up_function_features_o7_b2_lac,
10481         &hf_pfcp_bbf_up_function_features_o7_b1_ipoe,
10482         &hf_pfcp_bbf_up_function_features_o7_b0_pppoe,
10483         NULL
10484     };
10485 
10486     proto_tree_add_bitmask_list(tree, tvb, offset, 1, pfcp_bbf_up_function_features_o7_flags, ENC_BIG_ENDIAN);
10487     offset += 1;
10488 
10489     // Octet 8 Spare Octet
10490     proto_tree_add_item(tree, hf_pfcp_spare_oct, tvb, offset, 1, ENC_BIG_ENDIAN);
10491     offset += 1;
10492 
10493     // Octet 9 Spare Octet
10494     proto_tree_add_item(tree, hf_pfcp_spare_oct, tvb, offset, 1, ENC_BIG_ENDIAN);
10495     offset += 1;
10496 
10497     // Octet 10 Spare Octet
10498     proto_tree_add_item(tree, hf_pfcp_spare_oct, tvb, offset, 1, ENC_BIG_ENDIAN);
10499     offset += 1;
10500 
10501     if (offset < length) {
10502         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10503     }
10504 }
10505 
10506 /*
10507  * TR-459: 6.6.2 Logical Port
10508  */
10509 static void
dissect_pfcp_enterprise_bbf_logical_port(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10510 dissect_pfcp_enterprise_bbf_logical_port(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10511 {
10512     /* Octet 7 to (n+4) logical-port-id */
10513     if (tvb_ascii_isprint(tvb, 0, length))
10514     {
10515         const guint8* string_value;
10516         proto_tree_add_item_ret_string(tree, hf_pfcp_bbf_logical_port_id_str, tvb, 0, length, ENC_ASCII | ENC_NA, pinfo->pool, &string_value);
10517         proto_item_append_text(item, "%s", string_value);
10518     }
10519     else
10520     {
10521         proto_tree_add_item(tree, hf_pfcp_bbf_logical_port_id, tvb, 0, length, ENC_NA);
10522     }
10523 }
10524 
10525 /*
10526  * TR-459: 6.6.3 BBF Outer Header Creation
10527  */
10528 
10529 static const value_string pfcp_bbf_outer_hdr_desc_vals[] = {
10530 
10531     { 0x000100, "CPR-NSH " },
10532     { 0x000200, "Traffic-Endpoint " },
10533     { 0x000300, "L2TP " },
10534     { 0x000400, "PPP " },
10535     { 0, NULL }
10536 };
10537 
10538 static void
dissect_pfcp_enterprise_bbf_outer_header_creation(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10539 dissect_pfcp_enterprise_bbf_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10540 {
10541     int offset = 0;
10542     guint32 value;
10543 
10544     /* Octet 7  Outer Header Creation Description */
10545     proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_outer_hdr_desc, tvb, offset, 2, ENC_BIG_ENDIAN, &value);
10546     offset += 2;
10547 
10548     /* Octet 9 to 10  Tunnel ID */
10549     proto_tree_add_item(tree, hf_pfcp_bbf_outer_hdr_creation_tunnel_id, tvb, offset, 2, ENC_BIG_ENDIAN);
10550     offset += 2;
10551 
10552     /* Octet 10 to 11  Session ID */
10553     proto_tree_add_item(tree, hf_pfcp_bbf_outer_hdr_creation_session_id, tvb, offset, 2, ENC_BIG_ENDIAN);
10554     offset += 2;
10555 
10556     if (offset < length) {
10557         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10558     }
10559 }
10560 
10561 /*
10562  * TR-459: 6.6.4 BBF Outer Header Removal
10563  */
10564 
10565 static const value_string pfcp_bbf_out_hdr_desc_vals[] = {
10566     { 1, "Ethernet " },
10567     { 2, "PPPoE/Ethernet " },
10568     { 3, "PPP/PPPoE/Ethernet " },
10569     { 4, "L2TP " },
10570     { 5, "PPP/L2TP " },
10571     { 0, NULL }
10572 };
10573 
10574 static void
dissect_pfcp_enterprise_bbf_outer_header_removal(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10575 dissect_pfcp_enterprise_bbf_outer_header_removal(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10576 {
10577     int offset = 0;
10578     guint32 value;
10579 
10580     proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_out_hdr_desc, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
10581     offset++;
10582     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_bbf_out_hdr_desc_vals, "Unknown"));
10583 
10584     if (offset < length) {
10585         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10586     }
10587 }
10588 
10589 /*
10590  * TR-459: 6.6.5 PPPoE Session ID
10591  */
10592 static void
dissect_pfcp_enterprise_bbf_pppoe_session_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10593 dissect_pfcp_enterprise_bbf_pppoe_session_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10594 {
10595     int offset = 0;
10596     guint32 value;
10597 
10598     proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_pppoe_session_id, tvb, offset, 2, ENC_BIG_ENDIAN, &value);
10599     offset += 2;
10600     proto_item_append_text(item, "%u", value);
10601 
10602     if (offset < length) {
10603         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10604     }
10605 }
10606 
10607 /*
10608  * TR-459: 6.6.6 PPP Protocol
10609  */
10610 static void
dissect_pfcp_enterprise_bbf_ppp_protocol(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10611 dissect_pfcp_enterprise_bbf_ppp_protocol(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10612 {
10613     int offset = 0;
10614     guint64 bbf_ppp_flags_val;
10615 
10616     static int * const pfcp_bbf_ppp_protocol_flags[] = {
10617         &hf_pfcp_spare_b7_b3,
10618         &hf_pfcp_bbf_ppp_protocol_b2_control,
10619         &hf_pfcp_bbf_ppp_protocol_b1_data,
10620         &hf_pfcp_bbf_ppp_protocol_b0_specific,
10621         NULL
10622     };
10623     /* Octet 5   control   data    specific D */
10624     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_bbf_ppp_protocol_flags,
10625         ett_pfcp_bbf_ppp_protocol_flags, pfcp_bbf_ppp_protocol_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &bbf_ppp_flags_val);
10626     offset += 1;
10627 
10628     if ((bbf_ppp_flags_val & 0x01) == 1)
10629     {
10630         /* Octet 8 and 9    protocol */
10631         proto_tree_add_item(tree, hf_pfcp_bbf_ppp_protocol, tvb, offset, 2, ENC_BIG_ENDIAN);
10632         offset += 2;
10633     }
10634 
10635     if (offset < length) {
10636         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10637     }
10638 }
10639 
10640 /*
10641  * TR-459: 6.6.7 Verification Timers
10642  */
10643 static void
dissect_pfcp_enterprise_bbf_verification_timers(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10644 dissect_pfcp_enterprise_bbf_verification_timers(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10645 {
10646     int offset = 0;
10647 
10648     proto_tree_add_item(tree, hf_pfcp_bbf_verification_timer_interval, tvb, offset, 2, ENC_BIG_ENDIAN);
10649     offset += 2;
10650 
10651     proto_tree_add_item(tree, hf_pfcp_bbf_verification_timer_count, tvb, offset, 1, ENC_BIG_ENDIAN);
10652     offset += 1;
10653 
10654     if (offset < length) {
10655         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10656     }
10657 }
10658 
10659 /*
10660  * TR-459: 6.6.8 LCP Magic Number
10661  */
10662 static void
dissect_pfcp_enterprise_bbf_ppp_lcp_magic_number(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10663 dissect_pfcp_enterprise_bbf_ppp_lcp_magic_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10664 {
10665     int offset = 0;
10666 
10667     proto_tree_add_item(tree, hf_pfcp_bbf_ppp_lcp_magic_number_tx, tvb, offset, 4, ENC_BIG_ENDIAN);
10668     offset += 4;
10669 
10670     proto_tree_add_item(tree, hf_pfcp_bbf_ppp_lcp_magic_number_rx, tvb, offset, 4, ENC_BIG_ENDIAN);
10671     offset += 4;
10672 
10673     if (offset < length) {
10674         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10675     }
10676 }
10677 
10678 /*
10679  * TR-459: 6.6.9 MTU
10680  */
10681 static void
dissect_pfcp_enterprise_bbf_mtu(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10682 dissect_pfcp_enterprise_bbf_mtu(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10683 {
10684     int offset = 0;
10685     guint32 value;
10686 
10687     proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_mtu, tvb, offset, 2, ENC_BIG_ENDIAN, &value);
10688     offset += 2;
10689     proto_item_append_text(item, "%u", value);
10690 
10691     if (offset < length) {
10692         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10693     }
10694 }
10695 
10696 /*
10697  * TR-459: 6.6.10 L2TP Tunnel Endpoint
10698  */
10699 static void
dissect_pfcp_enterprise_bbf_l2tp_tunnel_endpoint(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10700 dissect_pfcp_enterprise_bbf_l2tp_tunnel_endpoint(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10701 {
10702     int offset = 0;
10703     guint64 bbf_l2tp_endp_flags_val;
10704 
10705     static int * const pfcp_bbf_l2tp_endp_flags[] = {
10706         &hf_pfcp_spare_b7_b3,
10707         &hf_pfcp_bbf_l2tp_endp_flags_b2_ch,
10708         &hf_pfcp_bbf_l2tp_endp_flags_b1_v6,
10709         &hf_pfcp_bbf_l2tp_endp_flags_b0_v4,
10710         NULL
10711     };
10712     /* Octet 5   CH    v4    v6 */
10713     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_bbf_l2tp_endp_flags,
10714         ett_pfcp_bbf_l2tp_endp_flags, pfcp_bbf_l2tp_endp_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &bbf_l2tp_endp_flags_val);
10715     offset += 1;
10716 
10717     proto_tree_add_item(tree, hf_pfcp_bbf_l2tp_endp_id_tunnel_id, tvb, offset, 2, ENC_BIG_ENDIAN);
10718     offset += 2;
10719 
10720     proto_tree_add_item(tree, hf_pfcp_bbf_l2tp_endp_id_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
10721     offset += 4;
10722 
10723     proto_tree_add_item(tree, hf_pfcp_bbf_l2tp_endp_id_ipv6, tvb, offset, 16, ENC_NA);
10724     offset += 16;
10725 
10726     if (offset < length) {
10727         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10728     }
10729 }
10730 
10731 /*
10732  * TR-459: 6.6.11 L2TP Session ID
10733  */
10734 static void
dissect_pfcp_enterprise_bbf_l2tp_session_id(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10735 dissect_pfcp_enterprise_bbf_l2tp_session_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10736 {
10737     int offset = 0;
10738     guint32 value;
10739 
10740     proto_tree_add_item_ret_uint(tree, hf_pfcp_bbf_l2tp_session_id, tvb, offset, 2, ENC_BIG_ENDIAN, &value);
10741     offset += 2;
10742     proto_item_append_text(item, "%u", value);
10743 
10744     if (offset < length) {
10745         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10746     }
10747 }
10748 
10749 
10750 /*
10751  * TR-459: 6.6.12 L2TP Type
10752  */
10753 
10754 static const true_false_string pfcp_bbf_l2tp_type_b0_t_tfs = {
10755     "control",
10756     "data"
10757 };
10758 
10759 static void
dissect_pfcp_enterprise_bbf_l2tp_type(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10760 dissect_pfcp_enterprise_bbf_l2tp_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10761 {
10762     int offset = 0;
10763 
10764     static int * const pfcp_bbf_l2tp_type_flags[] = {
10765         &hf_pfcp_spare_b7_b1,
10766         &hf_pfcp_bbf_l2tp_type_flags_b0_t,
10767         NULL
10768     };
10769     /* Octet 7   T */
10770     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_bbf_l2tp_type_flags,
10771         ett_pfcp_bbf_l2tp_type_flags, pfcp_bbf_l2tp_type_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS);
10772     offset += 1;
10773 
10774     if (offset < length) {
10775         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10776     }
10777 }
10778 
10779 static const pfcp_ie_t pfcp_enterprise_bbf_ies[] = {
10780 /*  32768 */    { dissect_pfcp_enterprise_bbf_up_function_features },
10781 /*  32769 */    { dissect_pfcp_enterprise_bbf_logical_port },
10782 /*  32770 */    { dissect_pfcp_enterprise_bbf_outer_header_creation },
10783 /*  32771 */    { dissect_pfcp_enterprise_bbf_outer_header_removal },
10784 /*  32772 */    { dissect_pfcp_enterprise_bbf_pppoe_session_id },
10785 /*  32773 */    { dissect_pfcp_enterprise_bbf_ppp_protocol },
10786 /*  32774 */    { dissect_pfcp_enterprise_bbf_verification_timers },
10787 /*  32775 */    { dissect_pfcp_enterprise_bbf_ppp_lcp_magic_number },
10788 /*  32776 */    { dissect_pfcp_enterprise_bbf_mtu },
10789 /*  32777 */    { dissect_pfcp_enterprise_bbf_l2tp_tunnel_endpoint },
10790 /*  32778 */    { dissect_pfcp_enterprise_bbf_l2tp_session_id },
10791 /*  32779 */    { dissect_pfcp_enterprise_bbf_l2tp_type },
10792 /*  32780 */    { dissect_pfcp_enterprise_bbf_ppp_lcp_connectivity },
10793 /*  32781 */    { dissect_pfcp_enterprise_bbf_l2tp_tunnel },
10794     { NULL },                                                        /* End of List */
10795 };
10796 
10797 #define NUM_PFCP_ENTERPRISE_BBF_IES (sizeof(pfcp_enterprise_bbf_ies)/sizeof(pfcp_ie_t))
10798 /* Set up the array to hold "etts" for each IE*/
10799 gint ett_pfcp_enterprise_bbf_elem[NUM_PFCP_ENTERPRISE_BBF_IES-1];
10800 
10801 static void
dissect_pfcp_enterprise_bbf_ppp_lcp_connectivity(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type,pfcp_session_args_t * args)10802 dissect_pfcp_enterprise_bbf_ppp_lcp_connectivity(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type, pfcp_session_args_t *args)
10803 {
10804     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_enterprise_bbf_elem[PFCP_IE_ENTERPRISE_BBF_PPP_LCP_CONNECTIVITY], args);
10805 }
10806 
10807 static void
dissect_pfcp_enterprise_bbf_l2tp_tunnel(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type,pfcp_session_args_t * args)10808 dissect_pfcp_enterprise_bbf_l2tp_tunnel(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type, pfcp_session_args_t *args)
10809 {
10810     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_enterprise_bbf_elem[PFCP_IE_ENTERPRISE_BBF_L2TP_TUNNEL], args);
10811 }
10812 
10813 static int
dissect_pfcp_enterprise_bbf_ies(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,void * data)10814 dissect_pfcp_enterprise_bbf_ies(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
10815 {
10816     pfcp_sub_dis_t *pfcp_sub_dis_info = (pfcp_sub_dis_t *)data;
10817 
10818     dissect_pfcp_enterprise_ies_common(tvb, pinfo, tree, pfcp_sub_dis_info->message_type, pfcp_sub_dis_info->args,
10819                                        NUM_PFCP_ENTERPRISE_BBF_IES, ett_pfcp_enterprise_bbf_elem,
10820                                        pfcp_enterprise_bbf_ies, &pfcp_ie_enterprise_bbf_type_ext);
10821     return tvb_reported_length(tvb);
10822 }
10823 
10824 /* Enterprise IE decoding Travelping */
10825 
10826 static void dissect_pfcp_enterprise_travelping_error_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type, pfcp_session_args_t *args);
10827 
10828 /* Enterprise IE decoding Travelping */
10829 #define PFCP_IE_ENTERPRISE_TRAVELPING_BUILD_ID          2
10830 #define PFCP_IE_ENTERPRISE_TRAVELPING_NOW               3
10831 #define PFCP_IE_ENTERPRISE_TRAVELPING_START             4
10832 #define PFCP_IE_ENTERPRISE_TRAVELPING_STOP              5
10833 #define PFCP_IE_ENTERPRISE_TRAVELPING_ERROR_REPORT      6
10834 #define PFCP_IE_ENTERPRISE_TRAVELPING_ERROR_MESSAGE     7
10835 #define PFCP_IE_ENTERPRISE_TRAVELPING_FILE_NAME         8
10836 #define PFCP_IE_ENTERPRISE_TRAVELPING_LINE_NUMBER       9
10837 
10838 static const value_string pfcp_ie_enterprise_travelping_type[] = {
10839     { PFCP_IE_ENTERPRISE_TRAVELPING_BUILD_ID,           "Build Id"},
10840     { PFCP_IE_ENTERPRISE_TRAVELPING_NOW,                "Now"},
10841     { PFCP_IE_ENTERPRISE_TRAVELPING_START,              "Start"},
10842     { PFCP_IE_ENTERPRISE_TRAVELPING_STOP,               "Stop"},
10843     { PFCP_IE_ENTERPRISE_TRAVELPING_ERROR_REPORT,       "Error Report"},
10844     { PFCP_IE_ENTERPRISE_TRAVELPING_ERROR_MESSAGE,      "Error Message"},
10845     { PFCP_IE_ENTERPRISE_TRAVELPING_FILE_NAME,          "File Name"},
10846     { PFCP_IE_ENTERPRISE_TRAVELPING_LINE_NUMBER,        "Line Number"},
10847     { 0, NULL }
10848 };
10849 
10850 static value_string_ext pfcp_ie_enterprise_travelping_type_ext = VALUE_STRING_EXT_INIT(pfcp_ie_enterprise_travelping_type);
10851 
10852 static void
dissect_pfcp_enterprise_travelping_build_id(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10853 dissect_pfcp_enterprise_travelping_build_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10854 {
10855     /* Octet 7 to (n+4) Travelping Build Id */
10856     if (tvb_ascii_isprint(tvb, 0, length))
10857     {
10858         const guint8* string_value;
10859         proto_tree_add_item_ret_string(tree, hf_pfcp_travelping_build_id_str, tvb, 0, length, ENC_ASCII | ENC_NA, pinfo->pool, &string_value);
10860         proto_item_append_text(item, "%s", string_value);
10861     }
10862     else
10863     {
10864         proto_tree_add_item(tree, hf_pfcp_travelping_build_id, tvb, 0, length, ENC_NA);
10865     }
10866 }
10867 
10868 static void
dissect_pfcp_enterprise_travelping_now(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10869 dissect_pfcp_enterprise_travelping_now(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10870 {
10871     int offset = 0;
10872     char *time_str;
10873 
10874     proto_tree_add_item_ret_time_string(tree, hf_pfcp_travelping_now, tvb, 0, 8, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str);
10875     offset += 8;
10876 
10877     proto_item_append_text(item, "%s", time_str);
10878 
10879     if (offset < length) {
10880         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10881     }
10882 }
10883 
10884 static void
dissect_pfcp_enterprise_travelping_start(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10885 dissect_pfcp_enterprise_travelping_start(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10886 {
10887     int offset = 0;
10888     char *time_str;
10889 
10890     proto_tree_add_item_ret_time_string(tree, hf_pfcp_travelping_now, tvb, 0, 8, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str);
10891     offset += 8;
10892 
10893     proto_item_append_text(item, "%s", time_str);
10894 
10895     if (offset < length) {
10896         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10897     }
10898 }
10899 
10900 static void
dissect_pfcp_enterprise_travelping_stop(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10901 dissect_pfcp_enterprise_travelping_stop(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10902 {
10903     int offset = 0;
10904     char *time_str;
10905 
10906     proto_tree_add_item_ret_time_string(tree, hf_pfcp_travelping_now, tvb, offset, 8, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &time_str);
10907     offset += 8;
10908 
10909     proto_item_append_text(item, "%s", time_str);
10910 
10911     if (offset < length) {
10912         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10913     }
10914 }
10915 
10916 static void
dissect_pfcp_enterprise_travelping_error_message(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10917 dissect_pfcp_enterprise_travelping_error_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10918 {
10919     /* Octet 7 to (n+4) Travelping Error Message */
10920     if (tvb_ascii_isprint(tvb, 0, length))
10921     {
10922         const guint8* string_value;
10923         proto_tree_add_item_ret_string(tree, hf_pfcp_travelping_error_message_str, tvb, 0, length, ENC_ASCII | ENC_NA, pinfo->pool, &string_value);
10924         proto_item_append_text(item, "%s", string_value);
10925     }
10926     else
10927     {
10928         proto_tree_add_item(tree, hf_pfcp_travelping_error_message, tvb, 0, length, ENC_NA);
10929     }
10930 }
10931 
10932 static void
dissect_pfcp_enterprise_travelping_file_name(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10933 dissect_pfcp_enterprise_travelping_file_name(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10934 {
10935     /* Octet 7 to (n+4) Travelping Error Message */
10936     if (tvb_ascii_isprint(tvb, 0, length))
10937     {
10938         const guint8* string_value;
10939         proto_tree_add_item_ret_string(tree, hf_pfcp_travelping_file_name_str, tvb, 0, length, ENC_ASCII | ENC_NA, pinfo->pool, &string_value);
10940         proto_item_append_text(item, "%s", string_value);
10941     }
10942     else
10943     {
10944         proto_tree_add_item(tree, hf_pfcp_travelping_file_name, tvb, 0, length, ENC_NA);
10945     }
10946 }
10947 
10948 static void
dissect_pfcp_enterprise_travelping_line_number(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type _U_,pfcp_session_args_t * args _U_)10949 dissect_pfcp_enterprise_travelping_line_number(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, pfcp_session_args_t *args _U_)
10950 {
10951     int offset = 0;
10952     guint32 line_number;
10953 
10954     /* Octet 7 to 10 Travelping Line Number */
10955     proto_tree_add_item_ret_uint(tree, hf_pfcp_travelping_line_number, tvb, offset, 4, ENC_BIG_ENDIAN, &line_number);
10956     offset += 4;
10957 
10958     proto_item_append_text(item, " : %u", line_number);
10959 
10960     if (offset < length) {
10961         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
10962     }
10963 }
10964 
10965 static const pfcp_ie_t pfcp_enterprise_travelping_ies[] = {
10966 /*      0 */    { dissect_pfcp_reserved },
10967 /*      1 */    { dissect_pfcp_reserved },
10968 /*      2 */    { dissect_pfcp_enterprise_travelping_build_id },
10969 /*      3 */    { dissect_pfcp_enterprise_travelping_now },
10970 /*      4 */    { dissect_pfcp_enterprise_travelping_start },
10971 /*      5 */    { dissect_pfcp_enterprise_travelping_stop },
10972 /*      6 */    { dissect_pfcp_enterprise_travelping_error_report },
10973 /*      7 */    { dissect_pfcp_enterprise_travelping_error_message },
10974 /*      8 */    { dissect_pfcp_enterprise_travelping_file_name },
10975 /*      9 */    { dissect_pfcp_enterprise_travelping_line_number },
10976     { NULL },                                                        /* End of List */
10977 };
10978 
10979 #define NUM_PFCP_ENTERPRISE_TRAVELPING_IES (sizeof(pfcp_enterprise_travelping_ies)/sizeof(pfcp_ie_t))
10980 /* Set up the array to hold "etts" for each IE*/
10981 gint ett_pfcp_enterprise_travelping_elem[NUM_PFCP_ENTERPRISE_TRAVELPING_IES-1];
10982 
10983 static void
dissect_pfcp_enterprise_travelping_error_report(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,proto_item * item _U_,guint16 length,guint8 message_type,pfcp_session_args_t * args)10984 dissect_pfcp_enterprise_travelping_error_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type, pfcp_session_args_t *args)
10985 {
10986     dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_enterprise_travelping_elem[PFCP_IE_ENTERPRISE_TRAVELPING_ERROR_REPORT], args);
10987 }
10988 
10989 static int
dissect_pfcp_enterprise_travelping_ies(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,void * data)10990 dissect_pfcp_enterprise_travelping_ies(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
10991 {
10992     pfcp_sub_dis_t *pfcp_sub_dis_info = (pfcp_sub_dis_t *)data;
10993 
10994     dissect_pfcp_enterprise_ies_common(tvb, pinfo, tree, pfcp_sub_dis_info->message_type, pfcp_sub_dis_info->args,
10995                                        NUM_PFCP_ENTERPRISE_TRAVELPING_IES, ett_pfcp_enterprise_travelping_elem,
10996                                        pfcp_enterprise_travelping_ies, &pfcp_ie_enterprise_travelping_type_ext);
10997     return tvb_reported_length(tvb);
10998 }
10999 
11000 static void
pfcp_init(void)11001 pfcp_init(void)
11002 {
11003     pfcp_session_count = 1;
11004     pfcp_session_table = g_hash_table_new(g_int_hash, g_int_equal);
11005     pfcp_frame_tree = wmem_tree_new(wmem_file_scope());
11006 }
11007 
11008 static void
pfcp_cleanup(void)11009 pfcp_cleanup(void)
11010 {
11011     pfcp_session_conv_info_t *pfcp_info;
11012 
11013     /* Free up state attached to the pfcp_info structures */
11014     for (pfcp_info = pfcp_session_info_items; pfcp_info != NULL; ) {
11015         pfcp_session_conv_info_t *next;
11016 
11017         g_hash_table_destroy(pfcp_info->matched);
11018         pfcp_info->matched=NULL;
11019         g_hash_table_destroy(pfcp_info->unmatched);
11020         pfcp_info->unmatched=NULL;
11021 
11022         next = pfcp_info->next;
11023         pfcp_info = next;
11024     }
11025 
11026     /* Free up state attached to the pfcp session structures */
11027     pfcp_info_items = NULL;
11028 
11029     if (pfcp_session_table != NULL) {
11030         g_hash_table_destroy(pfcp_session_table);
11031     }
11032     pfcp_session_table = NULL;
11033 }
11034 
11035 void
proto_register_pfcp(void)11036 proto_register_pfcp(void)
11037 {
11038 
11039     static hf_register_info hf_pfcp[] = {
11040 
11041         { &hf_pfcp_msg_type,
11042         { "Message Type", "pfcp.msg_type",
11043         FT_UINT8, BASE_DEC | BASE_EXT_STRING, &pfcp_message_type_ext, 0x0,
11044         NULL, HFILL }
11045         },
11046         { &hf_pfcp_msg_length,
11047         { "Length", "pfcp.length",
11048         FT_UINT8, BASE_DEC, NULL, 0x0,
11049         NULL, HFILL }
11050         },
11051         { &hf_pfcp_hdr_flags,
11052         { "Flags", "pfcp.flags",
11053         FT_UINT8, BASE_HEX, NULL, 0x0,
11054         NULL, HFILL }
11055         },
11056         { &hf_pfcp_version,
11057         { "Version", "pfcp.version",
11058         FT_UINT8, BASE_DEC, NULL, 0xe0,
11059         NULL, HFILL }
11060         },
11061         { &hf_pfcp_fo_flag,
11062         { "Follow On (FO)", "pfcp.fo_flag",
11063         FT_BOOLEAN, 8, NULL, 0x04,
11064         NULL, HFILL }
11065         },
11066         { &hf_pfcp_mp_flag,
11067         { "Message Priority (MP)", "pfcp.mp_flag",
11068         FT_BOOLEAN, 8, NULL, 0x02,
11069         NULL, HFILL }
11070         },
11071         { &hf_pfcp_s_flag,
11072         { "SEID (S)", "pfcp.s",
11073         FT_BOOLEAN, 8, NULL, 0x01,
11074         NULL, HFILL }
11075         },
11076         { &hf_pfcp_spare_b2,
11077         { "Spare", "pfcp.spare_b2",
11078         FT_UINT8, BASE_DEC, NULL, 0x04,
11079         NULL, HFILL }
11080         },
11081         { &hf_pfcp_spare_b3,
11082         { "Spare", "pfcp.spare_b3",
11083         FT_UINT8, BASE_DEC, NULL, 0x08,
11084         NULL, HFILL }
11085         },
11086         { &hf_pfcp_spare_b4,
11087         { "Spare", "pfcp.spare_b4",
11088         FT_UINT8, BASE_DEC, NULL, 0x10,
11089         NULL, HFILL }
11090         },
11091         { &hf_pfcp_spare_b5,
11092         { "Spare", "pfcp.spare_b5",
11093         FT_UINT8, BASE_DEC, NULL, 0x20,
11094         NULL, HFILL }
11095         },
11096         { &hf_pfcp_spare_b6,
11097         { "Spare", "pfcp.spare_b6",
11098         FT_UINT8, BASE_DEC, NULL, 0x40,
11099         NULL, HFILL }
11100         },
11101         { &hf_pfcp_spare_b7,
11102         { "Spare", "pfcp.spare_b7",
11103         FT_UINT8, BASE_DEC, NULL, 0x80,
11104         NULL, HFILL }
11105         },
11106         { &hf_pfcp_spare_b7_b6,
11107         { "Spare", "pfcp.spare_b7_b6",
11108         FT_UINT8, BASE_DEC, NULL, 0xc0,
11109         NULL, HFILL }
11110         },
11111         { &hf_pfcp_spare_b7_b5,
11112         { "Spare", "pfcp.spare_b7_b5",
11113         FT_UINT8, BASE_DEC, NULL, 0xe0,
11114         NULL, HFILL }
11115         },
11116         { &hf_pfcp_spare_b7_b4,
11117         { "Spare", "pfcp.spare_b7_b4",
11118         FT_UINT8, BASE_DEC, NULL, 0xf0,
11119         NULL, HFILL }
11120         },
11121         { &hf_pfcp_spare_b7_b3,
11122         { "Spare", "pfcp.spare_b7_b3",
11123         FT_UINT8, BASE_DEC, NULL, 0xf8,
11124         NULL, HFILL }
11125         },
11126         { &hf_pfcp_spare_b7_b2,
11127         { "Spare", "pfcp.spare_b7_b2",
11128         FT_UINT8, BASE_DEC, NULL, 0xfc,
11129         NULL, HFILL }
11130         },
11131         { &hf_pfcp_spare_b7_b1,
11132         { "Spare", "pfcp.spare_b7_b1",
11133         FT_UINT8, BASE_DEC, NULL, 0xfe,
11134         NULL, HFILL }
11135         },
11136         { &hf_pfcp_spare_oct,
11137         { "Spare", "pfcp.spare_oct",
11138         FT_UINT8, BASE_DEC, NULL, 0x0,
11139         NULL, HFILL }
11140         },
11141         { &hf_pfcp_spare_h0,
11142         { "Spare", "pfcp.spare_h0",
11143         FT_UINT8, BASE_DEC, NULL, 0x0f,
11144         NULL, HFILL }
11145         },
11146         { &hf_pfcp_spare_h1,
11147         { "Spare", "pfcp.spare_h1",
11148         FT_UINT8, BASE_DEC, NULL, 0xf0,
11149         NULL, HFILL }
11150         },
11151         { &hf_pfcp_spare,
11152         { "Spare", "pfcp.spare",
11153         FT_UINT8, BASE_DEC, NULL, 0x0,
11154         NULL, HFILL }
11155         },
11156         { &hf_pfcp_seid,
11157         { "SEID", "pfcp.seid",
11158         FT_UINT64, BASE_HEX, NULL, 0x0,
11159         NULL, HFILL }
11160         },
11161         { &hf_pfcp_seqno,
11162         { "Sequence Number", "pfcp.seqno",
11163         FT_UINT24, BASE_DEC, NULL, 0x0,
11164         NULL, HFILL }
11165         },
11166         { &hf_pfcp_response_in,
11167         { "Response In", "pfcp.response_in",
11168         FT_FRAMENUM, BASE_NONE, FRAMENUM_TYPE(FT_FRAMENUM_RESPONSE), 0x0,
11169         "The response to this PFCP request is in this frame", HFILL }
11170         },
11171         { &hf_pfcp_response_to,
11172         { "Response To", "pfcp.response_to",
11173         FT_FRAMENUM, BASE_NONE, FRAMENUM_TYPE(FT_FRAMENUM_RESPONSE), 0x0,
11174         "This is a response to the PFCP request in this frame", HFILL }
11175         },
11176         { &hf_pfcp_response_time,
11177         { "Response Time", "pfcp.response_time",
11178         FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0,
11179         "The time between the Request and the Response", HFILL }
11180         },
11181         { &hf_pfcp_session,
11182         { "Session", "pfcp.session",
11183         FT_UINT32, BASE_DEC, NULL, 0,
11184         NULL, HFILL }
11185         },
11186         { &hf_pfcp_mp,
11187         { "Message Priority", "pfcp.mp",
11188         FT_UINT24, BASE_DEC, NULL, 0xf0,
11189         NULL, HFILL }
11190         },
11191         { &hf_pfcp_enterprise_id,
11192         { "Enterprise ID",    "pfcp.enterprise_id",
11193         FT_UINT16, BASE_ENTERPRISES, STRINGS_ENTERPRISES,
11194         0x0, NULL, HFILL } },
11195         { &hf_pfcp_enterprise_data,
11196         { "Enterprise IE Data",    "pfcp.enterprise_ie_data",
11197             FT_BYTES, BASE_NONE, NULL, 0,
11198             NULL, HFILL }
11199         },
11200         { &hf_pfcp2_ie,
11201         { "IE Type", "pfcp.ie_type",
11202         FT_UINT16, BASE_DEC | BASE_EXT_STRING, &pfcp_ie_type_ext, 0x0,
11203         NULL, HFILL }
11204         },
11205         { &hf_pfcp2_enterprise_ie,
11206         { "Enterprise specific IE Type", "pfcp.enterprise_ie",
11207         FT_UINT16, BASE_DEC, NULL, 0x0,
11208         NULL, HFILL }
11209         },
11210         { &hf_pfcp2_ie_len,
11211         { "IE Length", "pfcp.ie_len",
11212         FT_UINT16, BASE_DEC, NULL, 0x0,
11213         NULL, HFILL }
11214         },
11215         { &hf_pfcp_recovery_time_stamp,
11216         { "Recovery Time Stamp", "pfcp.recovery_time_stamp",
11217         FT_ABSOLUTE_TIME, ABSOLUTE_TIME_NTP_UTC, NULL, 0,
11218         NULL, HFILL }
11219         },
11220         { &hf_pfcp2_cause,
11221         { "Cause", "pfcp.cause",
11222         FT_UINT8, BASE_DEC, VALS(pfcp_cause_vals), 0x0,
11223         NULL, HFILL }
11224         },
11225         { &hf_pfcp_node_id_type,
11226         { "Address Type", "pfcp.node_id_type",
11227             FT_UINT8, BASE_DEC, VALS(pfcp_node_id_type_vals), 0x0f,
11228             NULL, HFILL }
11229         },
11230         { &hf_pfcp_node_id_ipv4,
11231         { "IPv4", "pfcp.node_id_ipv4",
11232             FT_IPv4, BASE_NONE, NULL, 0x0,
11233             NULL, HFILL }
11234         },
11235         { &hf_pfcp_node_id_ipv6,
11236         { "IPv6", "pfcp.node_id_ipv6",
11237             FT_IPv6, BASE_NONE, NULL, 0x0,
11238             NULL, HFILL }
11239         },
11240         { &hf_pfcp_node_id_fqdn,
11241         { "FQDN", "pfcp.node_id_fqdn",
11242             FT_STRING, BASE_NONE, NULL, 0x0,
11243             NULL, HFILL }
11244         },
11245         { &hf_pfcp_f_seid_flags,
11246         { "Flags", "pfcp.f_seid_flags",
11247             FT_UINT8, BASE_HEX, NULL, 0x0,
11248             NULL, HFILL }
11249         },
11250         { &hf_pfcp_b0_v6,
11251         { "V6 (IPv6)", "pfcp.f_seid_flags.v6",
11252             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
11253             NULL, HFILL }
11254         },
11255         { &hf_pfcp_b1_v4,
11256         { "V4 (IPv4)", "pfcp.f_seid_flags.v4",
11257             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
11258             NULL, HFILL }
11259         },
11260         { &hf_pfcp_f_seid_ipv4,
11261         { "IPv4 address", "pfcp.f_seid.ipv4",
11262             FT_IPv4, BASE_NONE, NULL, 0x0,
11263             NULL, HFILL }
11264         },
11265         { &hf_pfcp_f_seid_ipv6,
11266         { "IPv6 address", "pfcp.f_seid.ipv6",
11267             FT_IPv6, BASE_NONE, NULL, 0x0,
11268             NULL, HFILL }
11269         },
11270         { &hf_pfcp_pdr_id,
11271         { "Rule ID", "pfcp.pdr_id",
11272             FT_UINT16, BASE_DEC, NULL, 0x0,
11273             NULL, HFILL }
11274         },
11275         { &hf_pfcp_precedence,
11276         { "Precedence", "pfcp.precedence",
11277             FT_UINT16, BASE_DEC, NULL, 0x0,
11278             NULL, HFILL }
11279         },
11280         { &hf_pfcp_source_interface,
11281         { "Source Interface", "pfcp.source_interface",
11282             FT_UINT8, BASE_DEC, VALS(pfcp_source_interface_vals), 0x0f,
11283             NULL, HFILL }
11284         },
11285         { &hf_pfcp_f_teid_flags,
11286         { "Flags", "pfcp.f_teid_flags",
11287             FT_UINT8, BASE_HEX, NULL, 0x0,
11288             NULL, HFILL }
11289         },
11290         { &hf_pfcp_fteid_flg_spare,
11291         { "Spare", "pfcp.fteid_flg.spare",
11292             FT_UINT8, BASE_DEC, NULL, 0xf0,
11293             NULL, HFILL }
11294         },
11295         { &hf_pfcp_fteid_flg_b3_ch_id,
11296         { "CHID (CHOOSE_ID)", "pfcp.f_teid_flags.ch_id",
11297             FT_BOOLEAN, 8, NULL, 0x08,
11298             NULL, HFILL }
11299         },
11300         { &hf_pfcp_fteid_flg_b2_ch,
11301         { "CH (CHOOSE)", "pfcp.f_teid_flags.ch",
11302             FT_BOOLEAN, 8, NULL, 0x04,
11303             NULL, HFILL }
11304         },
11305         { &hf_pfcp_fteid_flg_b1_v6,
11306         { "V6 (IPv6)", "pfcp.f_teid_flags.v6",
11307             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
11308             NULL, HFILL }
11309         },
11310         { &hf_pfcp_fteid_flg_b0_v4,
11311         { "V4 (IPv4)", "pfcp.f_teid_flags.v4",
11312             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
11313             NULL, HFILL }
11314         },
11315         { &hf_pfcp_f_teid_ch_id,
11316         { "Choose Id", "pfcp.f_teid.choose_id",
11317             FT_BYTES, BASE_NONE, NULL, 0x0,
11318             NULL, HFILL }
11319         },
11320         { &hf_pfcp_f_teid_teid,
11321         { "TEID", "pfcp.f_teid.teid",
11322             FT_UINT32, BASE_HEX, NULL, 0x0,
11323             NULL, HFILL }
11324         },
11325         { &hf_pfcp_f_teid_ipv4,
11326         { "IPv4 address", "pfcp.f_teid.ipv4_addr",
11327             FT_IPv4, BASE_NONE, NULL, 0x0,
11328             NULL, HFILL }
11329         },
11330         { &hf_pfcp_f_teid_ipv6,
11331         { "IPv6 address", "pfcp.f_teid.ipv6_addr",
11332             FT_IPv6, BASE_NONE, NULL, 0x0,
11333             NULL, HFILL }
11334         },
11335         { &hf_pfcp_network_instance,
11336         { "Network Instance", "pfcp.network_instance",
11337             FT_STRING, BASE_NONE, NULL, 0x0,
11338             NULL, HFILL }
11339         },
11340         { &hf_pfcp_pdn_type,
11341         { "PDN Type", "pfcp.pdn_type",
11342             FT_UINT8, BASE_DEC, VALS(pfcp_pdn_type_vals), 0x7,
11343             NULL, HFILL }
11344         },
11345         { &hf_pfcp_multiplier_value_digits,
11346         { "Value Digits", "pfcp.multiplier.value_digits",
11347             FT_UINT64, BASE_DEC, NULL, 0x0,
11348             NULL, HFILL }
11349         },
11350         { &hf_pfcp_multiplier_exponent,
11351         { "Exponent", "pfcp.multiplier.exponent",
11352             FT_UINT32, BASE_DEC, NULL, 0x0,
11353             NULL, HFILL }
11354         },
11355         { &hf_pfcp_failed_rule_id_type,
11356         { "Failed Rule ID Type", "pfcp.failed_rule_id_type",
11357             FT_UINT8, BASE_DEC, VALS(pfcp_failed_rule_id_type_vals), 0x7,
11358             NULL, HFILL }
11359         },
11360         { &hf_pfcp_time_quota_mechanism_bti_type,
11361         { "Base Time Interval Type", "pfcp.time_quota_mechanism_bti_type",
11362             FT_UINT8, BASE_DEC, VALS(pfcp_time_quota_mechanism_bti_type_vals), 0x3,
11363             NULL, HFILL }
11364         },
11365         { &hf_pfcp_time_quota_mechanism_bti,
11366         { "Base Time Interval", "pfcp.time_quota_mechanism_bti",
11367             FT_UINT32, BASE_DEC, NULL, 0x0,
11368             NULL, HFILL }
11369         },
11370         { &hf_pfcp_ue_ip_address_flags,
11371         { "Flags", "pfcp.ue_ip_address_flags",
11372             FT_UINT8, BASE_HEX, NULL, 0x0,
11373             NULL, HFILL }
11374         },
11375         { &hf_pfcp_ue_ip_address_flag_b0_v6,
11376         { "V6 (IPv6)", "pfcp.ue_ip_address_flag.v6",
11377             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
11378             NULL, HFILL }
11379         },
11380         { &hf_pfcp_ue_ip_address_flag_b1_v4,
11381         { "V4 (IPv4)", "pfcp.ue_ip_address_flag.v4",
11382             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
11383             NULL, HFILL }
11384         },
11385         { &hf_pfcp_ue_ip_address_flag_b2_sd,
11386         { "S/D", "pfcp.ue_ip_address_flag.sd",
11387             FT_BOOLEAN, 8, TFS(&pfcp_ue_ip_add_sd_flag_vals), 0x04,
11388             NULL, HFILL }
11389         },
11390         { &hf_pfcp_ue_ip_address_flag_b3_v6d,
11391         { "IPv6D", "pfcp.ue_ip_address_flag.v6d",
11392             FT_BOOLEAN, 8, TFS(&pfcp_ue_ip_add_sd_flag_vals), 0x08,
11393             NULL, HFILL }
11394         },
11395         { &hf_pfcp_ue_ip_address_flag_b4_chv4,
11396         { "CHV4", "pfcp.ue_ip_address_flag.chv4",
11397             FT_BOOLEAN, 8, TFS(&pfcp_ue_ip_add_sd_flag_vals), 0x10,
11398             NULL, HFILL }
11399         },
11400         { &hf_pfcp_ue_ip_address_flag_b5_chv6,
11401         { "CHV6", "pfcp.ue_ip_address_flag.chv6",
11402             FT_BOOLEAN, 8, TFS(&pfcp_ue_ip_add_sd_flag_vals), 0x20,
11403             NULL, HFILL }
11404         },
11405         { &hf_pfcp_ue_ip_address_flag_b6_v6pl,
11406         { "IPV6PL", "pfcp.ue_ip_address_flag.v6pl",
11407             FT_BOOLEAN, 8, TFS(&pfcp_ue_ip_add_sd_flag_vals), 0x40,
11408             NULL, HFILL }
11409         },
11410         { &hf_pfcp_ue_ip_addr_ipv4,
11411         { "IPv4 address", "pfcp.ue_ip_addr_ipv4",
11412             FT_IPv4, BASE_NONE, NULL, 0x0,
11413             NULL, HFILL }
11414         },
11415         { &hf_pfcp_ue_ip_add_ipv6,
11416         { "IPv6 address", "pfcp.ue_ip_addr_ipv6",
11417             FT_IPv6, BASE_NONE, NULL, 0x0,
11418             NULL, HFILL }
11419         },
11420         { &hf_pfcp_ue_ip_add_ipv6_prefix,
11421         { "IPv6 Prefix", "pfcp.ue_ip_addr_ipv6_prefix",
11422             FT_UINT8, BASE_DEC, NULL, 0x0,
11423             NULL, HFILL }
11424         },
11425         { &hf_pfcp_ue_ip_add_ipv6pd,
11426         { "IPv6 Delegated Prefix Address", "pfcp.ue_ip_addr_ipv6pd",
11427             FT_IPv6, BASE_NONE, NULL, 0x0,
11428             NULL, HFILL }
11429         },
11430         { &hf_pfcp_ue_ip_add_ipv6_prefix_length,
11431         { "IPv6 Prefix Length", "pfcp.ue_ip_addr_ipv6_prefix_length",
11432             FT_UINT8, BASE_DEC, NULL, 0x0,
11433             NULL, HFILL }
11434         },
11435         { &hf_pfcp_application_id,
11436         { "Application Identifier", "pfcp.application_id",
11437             FT_BYTES, BASE_NONE, NULL, 0x0,
11438             NULL, HFILL }
11439         },
11440         { &hf_pfcp_application_id_str,
11441         { "Application Identifier", "pfcp.application_id_str",
11442             FT_STRING, BASE_NONE, NULL, 0x0,
11443             NULL, HFILL }
11444         },
11445         { &hf_pfcp_sdf_filter_flags,
11446         { "Flags", "pfcp.sdf_filter_flags",
11447             FT_UINT8, BASE_HEX, NULL, 0x0,
11448             NULL, HFILL }
11449         },
11450         { &hf_pfcp_sdf_filter_flags_b0_fd,
11451         { "FD (Flow Description)", "pfcp.sdf_filter.fd",
11452             FT_BOOLEAN, 8, NULL, 0x01,
11453             NULL, HFILL }
11454         },
11455         { &hf_pfcp_sdf_filter_flags_b1_ttc,
11456         { "TTC (ToS Traffic Class)", "pfcp.sdf_filter.ttc",
11457             FT_BOOLEAN, 8, NULL, 0x02,
11458             NULL, HFILL }
11459         },
11460         { &hf_pfcp_sdf_filter_flags_b2_spi,
11461         { "SPI (Security Parameter Index)", "pfcp.sdf_filter.spi",
11462             FT_BOOLEAN, 8, NULL, 0x04,
11463             NULL, HFILL }
11464         },
11465         { &hf_pfcp_sdf_filter_flags_b3_fl,
11466         { "FL (Flow Label)", "pfcp.sdf_filter.fl",
11467             FT_BOOLEAN, 8, NULL, 0x08,
11468             NULL, HFILL }
11469         },
11470         { &hf_pfcp_sdf_filter_flags_b4_bid,
11471         { "BID (Bidirectional SDF Filter)", "pfcp.sdf_filter.bid",
11472             FT_BOOLEAN, 8, NULL, 0x10,
11473             NULL, HFILL }
11474         },
11475         { &hf_pfcp_flow_desc_len,
11476         { "Length of Flow Description", "pfcp.flow_desc_len",
11477             FT_UINT16, BASE_DEC, NULL, 0x0,
11478             NULL, HFILL }
11479         },
11480         { &hf_pfcp_flow_desc,
11481         { "Flow Description", "pfcp.flow_desc",
11482             FT_STRING, BASE_NONE, NULL, 0x0,
11483             NULL, HFILL }
11484         },
11485         { &hf_pfcp_traffic_class,
11486         { "ToS Traffic Class", "pfcp.traffic_class",
11487             FT_UINT8, BASE_HEX, NULL, 0x0,
11488             NULL, HFILL }
11489         },
11490         { &hf_pfcp_traffic_mask,
11491         { "Mask field", "pfcp.traffic_mask",
11492             FT_UINT8, BASE_HEX, NULL, 0x0,
11493             NULL, HFILL }
11494         },
11495         { &hf_pfcp_traffic_dscp,
11496             {"DSCP", "pfcp.traffic_dscp",
11497             FT_STRING, BASE_NONE, NULL, 0x0,
11498             NULL, HFILL}
11499         },
11500         { &hf_pfcp_spi,
11501         { "Security Parameter Index", "pfcp.spi",
11502             FT_UINT32, BASE_HEX, NULL, 0x0,
11503             NULL, HFILL }
11504         },
11505         { &hf_pfcp_flow_label_spare_bit,
11506         { "Spare bit", "pfcp.flow_label_spare_bit",
11507             FT_UINT8, BASE_DEC, NULL, 0x0,
11508             NULL, HFILL }
11509         },
11510         { &hf_pfcp_flow_label,
11511         { "Flow Label", "pfcp.flow_label",
11512             FT_UINT24, BASE_HEX, NULL, 0x0FFFFF,
11513             NULL, HFILL }
11514         },
11515         { &hf_pfcp_sdf_filter_id,
11516         { "SDF Filter ID", "pfcp.sdf_filter_id",
11517             FT_UINT32, BASE_DEC, NULL, 0x0,
11518             NULL, HFILL }
11519         },
11520 
11521         { &hf_pfcp_out_hdr_desc,
11522         { "Outer Header Removal Description", "pfcp.out_hdr_desc",
11523             FT_UINT8, BASE_DEC, VALS(pfcp_out_hdr_desc_vals), 0x0,
11524             NULL, HFILL }
11525         },
11526         { &hf_pfcp_gtpu_ext_hdr_del_b0_pdu_sess_cont,
11527         { "PDU Session Container to be deleted", "pfcp.gtpu_ext_hdr_del.pdu_sess_cont",
11528             FT_BOOLEAN, 8, NULL, 0x01,
11529             NULL, HFILL }
11530         },
11531         { &hf_pfcp_far_id_flg,
11532         { "Allocation type", "pfcp.far_id_flg",
11533             FT_BOOLEAN, 32, TFS(&pfcp_id_predef_dynamic_tfs), 0x80000000,
11534             NULL, HFILL }
11535         },
11536         { &hf_pfcp_far_id,
11537         { "FAR ID", "pfcp.far_id",
11538             FT_UINT32, BASE_DEC, NULL, 0x7fffffff,
11539             NULL, HFILL }
11540         },
11541         { &hf_pfcp_urr_id_flg,
11542         { "Allocation type", "pfcp.urr_id_flg",
11543             FT_BOOLEAN, 32, TFS(&pfcp_id_predef_dynamic_tfs), 0x80000000,
11544             NULL, HFILL }
11545         },
11546         { &hf_pfcp_urr_id,
11547         { "URR ID", "pfcp.urr_id",
11548             FT_UINT32, BASE_DEC, NULL, 0x7fffffff,
11549             NULL, HFILL }
11550         },
11551         { &hf_pfcp_qer_id_flg,
11552         { "Allocation type", "pfcp.qer_id_flg",
11553             FT_BOOLEAN, 32, TFS(&pfcp_id_predef_dynamic_tfs), 0x80000000,
11554             NULL, HFILL }
11555         },
11556         { &hf_pfcp_qer_id,
11557         { "QER ID", "pfcp.qer_id",
11558             FT_UINT32, BASE_DEC, NULL, 0x7fffffff,
11559             NULL, HFILL }
11560         },
11561         { &hf_pfcp_predef_rules_name,
11562         { "Predefined Rules Name", "pfcp.predef_rules_name",
11563             FT_BYTES, BASE_SHOW_ASCII_PRINTABLE, NULL, 0x0,
11564             NULL, HFILL }
11565         },
11566         { &hf_pfcp_apply_action_flags_o5_b0_drop,
11567         { "DROP (Drop)", "pfcp.apply_action.drop",
11568             FT_BOOLEAN, 8, NULL, 0x01,
11569             NULL, HFILL }
11570         },
11571         { &hf_pfcp_apply_action_flags_o5_b1_forw,
11572         { "FORW (Forward)", "pfcp.apply_action.forw",
11573             FT_BOOLEAN, 8, NULL, 0x02,
11574             NULL, HFILL }
11575         },
11576         { &hf_pfcp_apply_action_flags_o5_b2_buff,
11577         { "BUFF (Buffer)", "pfcp.apply_action.buff",
11578             FT_BOOLEAN, 8, NULL, 0x04,
11579             NULL, HFILL }
11580         },
11581         { &hf_pfcp_apply_action_flags_o5_b3_nocp,
11582         { "NOCP (Notify the CP function)", "pfcp.apply_action.nocp",
11583             FT_BOOLEAN, 8, NULL, 0x08,
11584             NULL, HFILL }
11585         },
11586         { &hf_pfcp_apply_action_flags_o5_b4_dupl,
11587         { "DUPL (Duplicate)", "pfcp.apply_action.dupl",
11588             FT_BOOLEAN, 8, NULL, 0x10,
11589             NULL, HFILL }
11590         },
11591         { &hf_pfcp_apply_action_flags_o5_b5_ipma,
11592         { "IPMA (IP Multicast Accept)", "pfcp.apply_action.ipma",
11593             FT_BOOLEAN, 8, NULL, 0x20,
11594             NULL, HFILL }
11595         },
11596         { &hf_pfcp_apply_action_flags_o5_b6_ipmd,
11597         { "IPMD (IP Multicast Deny)", "pfcp.apply_action.ipmd",
11598             FT_BOOLEAN, 8, NULL, 0x40,
11599             NULL, HFILL }
11600         },
11601         { &hf_pfcp_apply_action_flags_o5_b7_dfrt,
11602         { "DFRT (Duplicate for Redundant Transmission)", "pfcp.apply_action.dfrt",
11603             FT_BOOLEAN, 8, NULL, 0x80,
11604             NULL, HFILL }
11605         },
11606         { &hf_pfcp_apply_action_flags_o6_b0_edrt,
11607         { "EDRT (Eliminate Duplicate Packets for Redundant Transmission)", "pfcp.apply_action.edrt",
11608             FT_BOOLEAN, 8, NULL, 0x01,
11609             NULL, HFILL }
11610         },
11611         { &hf_pfcp_apply_action_flags_o6_b1_bdpn,
11612         { "BDPN (Buffered Downlink Packet Notification)", "pfcp.apply_action.bdpn",
11613             FT_BOOLEAN, 8, NULL, 0x02,
11614             NULL, HFILL }
11615         },
11616         { &hf_pfcp_apply_action_flags_o6_b2_ddpn,
11617         { "DDPN (Discared Downlink Packet Notification)", "pfcp.apply_action.ddpn",
11618             FT_BOOLEAN, 8, NULL, 0x04,
11619             NULL, HFILL }
11620         },
11621         { &hf_pfcp_apply_action_flags_o6_b3_fssm,
11622         { "FSSM (Forward packets to lower layer SSM)", "pfcp.apply_action.fssm",
11623             FT_BOOLEAN, 8, NULL, 0x08,
11624             NULL, HFILL }
11625         },
11626         { &hf_pfcp_apply_action_flags_o6_b4_mbsu,
11627         { "MBSU (Forward and replicate MBS data using Unicast transport)", "pfcp.apply_action.mbsu",
11628             FT_BOOLEAN, 8, NULL, 0x10,
11629             NULL, HFILL }
11630         },
11631 
11632         { &hf_pfcp_bar_id,
11633         { "BAR ID", "pfcp.bar_id",
11634             FT_UINT8, BASE_DEC, NULL, 0x0,
11635             NULL, HFILL }
11636         },
11637         { &hf_pfcp_fq_csid_node_id_type,
11638         { "FQ-CSID Node-ID Type", "pfcp.fq_csid_node_id_type",
11639             FT_UINT8, BASE_DEC, VALS(pfcp_fq_csid_node_id_type_vals), 0xf0,
11640             NULL, HFILL }
11641         },
11642         { &hf_pfcp_num_csid,
11643         { "Number of CSID", "pfcp.num_csid",
11644             FT_UINT8, BASE_DEC, NULL, 0x0f,
11645             NULL, HFILL }
11646         },
11647         { &hf_pfcp_fq_csid_node_id_ipv4,
11648         { "Node-Address", "pfcp.q_csid_node_id.ipv4",
11649             FT_IPv4, BASE_NONE, NULL, 0x0,
11650             NULL, HFILL }
11651         },
11652         { &hf_pfcp_fq_csid_node_id_ipv6,
11653         { "Node-Address", "pfcp.q_csid_node_id.ipv6",
11654             FT_IPv6, BASE_NONE, NULL, 0x0,
11655             NULL, HFILL }
11656         },
11657         { &hf_pfcp_fq_csid_node_id_mcc_mnc,
11658         { "Node-Address MCC MNC", "pfcp.q_csid_node_id.mcc_mnc",
11659             FT_UINT32, BASE_DEC, NULL, 0xfffff000,
11660             NULL, HFILL }
11661         },
11662         { &hf_pfcp_fq_csid_node_id_int,
11663         { "Node-Address Number", "pfcp.q_csid_node_id.int",
11664             FT_UINT32, BASE_DEC, NULL, 0x00000fff,
11665             NULL, HFILL }
11666         },
11667         { &hf_pfcp_fq_csid,
11668         { "PDN Connection Set Identifier (CSID)", "pfcp.csid",
11669             FT_UINT16, BASE_DEC, NULL, 0x0,
11670             NULL, HFILL }
11671         },
11672         { &hf_pfcp_fq_csid_node_type,
11673         { "Node Type", "pfcp.fq_csid_node_type",
11674             FT_UINT8, BASE_DEC, VALS(pfcp_fq_csid_node_type_vals), 0x0f,
11675             NULL, HFILL }
11676         },
11677         { &hf_pfcp_measurement_period,
11678         { "Measurement Period", "pfcp.measurement_period",
11679             FT_UINT32, BASE_DEC, NULL, 0x0,
11680             NULL, HFILL }
11681         },
11682         { &hf_pfcp_duration_measurement,
11683         { "Duration", "pfcp.duration_measurement",
11684             FT_UINT32, BASE_DEC, NULL, 0x0,
11685             NULL, HFILL }
11686         },
11687         { &hf_pfcp_time_of_first_packet,
11688         { "Time of First Packet", "pfcp.time_of_first_packet",
11689             FT_ABSOLUTE_TIME, ABSOLUTE_TIME_NTP_UTC, NULL, 0,
11690             NULL, HFILL }
11691         },
11692         { &hf_pfcp_time_of_last_packet,
11693         { "Time of Last Packet", "pfcp.time_of_last_packet",
11694             FT_ABSOLUTE_TIME, ABSOLUTE_TIME_NTP_UTC, NULL, 0,
11695             NULL, HFILL }
11696         },
11697         { &hf_pfcp_dst_interface,
11698         { "Interface", "pfcp.dst_interface",
11699             FT_UINT8, BASE_DEC, VALS(pfcp_dst_interface_vals), 0x0f,
11700             NULL, HFILL }
11701         },
11702         { &hf_pfcp_redirect_address_type,
11703         { "Redirect Address Type", "pfcp.redirect_address_type",
11704             FT_UINT8, BASE_DEC, VALS(pfcp_redirect_address_type_vals), 0x0f,
11705             NULL, HFILL }
11706         },
11707         { &hf_pfcp_redirect_server_addr_len,
11708         { "Redirect Server Address Length", "pfcp.redirect_server_addr_len",
11709             FT_UINT16, BASE_DEC, NULL, 0x0,
11710             NULL, HFILL }
11711         },
11712         { &hf_pfcp_redirect_server_address,
11713         { "Redirect Server Address", "pfcp.redirect_server_address",
11714             FT_STRING, BASE_NONE, NULL, 0x0,
11715             NULL, HFILL }
11716         },
11717         { &hf_pfcp_other_redirect_server_addr_len,
11718         { "Other Redirect Server Address Length", "pfcp.other_redirect_server_addr_len",
11719             FT_UINT16, BASE_DEC, NULL, 0x0,
11720             NULL, HFILL }
11721         },
11722         { &hf_pfcp_other_redirect_server_address,
11723         { "Other Redirect Server Address", "pfcp.other_redirect_server_address",
11724             FT_STRING, BASE_NONE, NULL, 0x0,
11725             NULL, HFILL }
11726         },
11727         { &hf_pfcp_outer_hdr_desc,
11728         { "Outer Header Creation Description", "pfcp.outer_hdr_desc",
11729             FT_UINT16, BASE_DEC, VALS(pfcp_outer_hdr_desc_vals), 0x0,
11730             NULL, HFILL }
11731         },
11732         { &hf_pfcp_outer_hdr_creation_teid,
11733         { "TEID", "pfcp.outer_hdr_creation.teid",
11734             FT_UINT32, BASE_HEX, NULL, 0x0,
11735             NULL, HFILL }
11736         },
11737         { &hf_pfcp_outer_hdr_creation_ipv4,
11738         { "IPv4 Address", "pfcp.outer_hdr_creation.ipv4",
11739             FT_IPv4, BASE_NONE, NULL, 0x0,
11740             NULL, HFILL }
11741         },
11742         { &hf_pfcp_outer_hdr_creation_ipv6,
11743         { "IPv6 Address", "pfcp.outer_hdr_creation.ipv6",
11744             FT_IPv6, BASE_NONE, NULL, 0x0,
11745             NULL, HFILL }
11746         },
11747         { &hf_pfcp_outer_hdr_creation_port,
11748         { "Port Number", "pfcp.outer_hdr_creation.port",
11749             FT_UINT16, BASE_DEC, NULL, 0x0,
11750             NULL, HFILL }
11751         },
11752         { &hf_pfcp_time_threshold,
11753         { "Time Threshold", "pfcp.time_threshold",
11754             FT_UINT32, BASE_DEC, NULL, 0x0,
11755             NULL, HFILL }
11756         },
11757         { &hf_pfcp_forwarding_policy_id_len,
11758         { "Forwarding Policy Identifier Length", "pfcp.forwarding_policy_id_len",
11759             FT_UINT8, BASE_DEC, NULL, 0x0,
11760             NULL, HFILL }
11761         },
11762         { &hf_pfcp_forwarding_policy_id,
11763         { "Forwarding Policy Identifier", "pfcp.forwarding_policy_id",
11764             FT_BYTES, BASE_NONE, NULL, 0x0,
11765             NULL, HFILL }
11766         },
11767         { &hf_pfcp_measurement_method_flags,
11768         { "Flags", "pfcp.measurement_method_flags",
11769             FT_UINT8, BASE_HEX, NULL, 0x0,
11770             NULL, HFILL }
11771         },
11772         { &hf_pfcp_measurement_method_flags_b0_durat,
11773         { "DURAT (Duration)", "pfcp.measurement_method_flags.durat",
11774             FT_BOOLEAN, 8, NULL, 0x01,
11775             NULL, HFILL }
11776         },
11777         { &hf_pfcp_measurement_method_flags_b1_volume,
11778         { "VOLUM (Volume)", "pfcp.measurement_method_flags.volume",
11779             FT_BOOLEAN, 8, NULL, 0x02,
11780             NULL, HFILL }
11781         },
11782         { &hf_pfcp_measurement_method_flags_b2_event,
11783         { "EVENT (Event)", "pfcp.measurement_method_flags.event",
11784             FT_BOOLEAN, 8, NULL, 0x04,
11785             NULL, HFILL }
11786         },
11787         { &hf_pfcp_subsequent_time_threshold,
11788         { "Subsequent Time Threshold", "pfcp.subsequent_time_threshold",
11789             FT_UINT32, BASE_DEC, NULL, 0x0,
11790             NULL, HFILL }
11791         },
11792         { &hf_pfcp_inactivity_detection_time,
11793         { "Inactivity Detection Time", "pfcp.inactivity_detection_time",
11794             FT_UINT32, BASE_DEC, NULL, 0x0,
11795             NULL, HFILL }
11796         },
11797         { &hf_pfcp_monitoring_time,
11798         { "Monitoring Time", "pfcp.monitoring_time",
11799             FT_ABSOLUTE_TIME, ABSOLUTE_TIME_NTP_UTC, NULL, 0,
11800             NULL, HFILL }
11801         },
11802         { &hf_pfcp_reporting_triggers_o5_b0_perio,
11803         { "PERIO (Periodic Reporting)", "pfcp.reporting_triggers_flags.perio",
11804             FT_BOOLEAN, 8, NULL, 0x01,
11805             NULL, HFILL }
11806         },
11807         { &hf_pfcp_reporting_triggers_o5_b1_volth,
11808         { "VOLTH (Volume Threshold)", "pfcp.reporting_triggers_flags.volth",
11809             FT_BOOLEAN, 8, NULL, 0x02,
11810             NULL, HFILL }
11811         },
11812         { &hf_pfcp_reporting_triggers_o5_b2_timth,
11813         { "TIMTH (Time Threshold)", "pfcp.reporting_triggers_flags.timth",
11814             FT_BOOLEAN, 8, NULL, 0x04,
11815             NULL, HFILL }
11816         },
11817         { &hf_pfcp_reporting_triggers_o5_b3_quhti,
11818         { "QUHTI (Quota Holding Time)", "pfcp.reporting_triggers_flags.quhti",
11819             FT_BOOLEAN, 8, NULL, 0x08,
11820             NULL, HFILL }
11821         },
11822         { &hf_pfcp_reporting_triggers_o5_b4_start,
11823         { "START (Start of Traffic)", "pfcp.reporting_triggers_flags.start",
11824             FT_BOOLEAN, 8, NULL, 0x10,
11825             NULL, HFILL }
11826         },
11827         { &hf_pfcp_reporting_triggers_o5_b5_stopt,
11828         { "STOPT (Stop of Traffic)", "pfcp.reporting_triggers_flags.stopt",
11829             FT_BOOLEAN, 8, NULL, 0x20,
11830             NULL, HFILL }
11831         },
11832         { &hf_pfcp_reporting_triggers_o5_b6_droth,
11833         { "DROTH (Dropped DL Traffic Threshold)", "pfcp.reporting_triggers_flags.droth",
11834             FT_BOOLEAN, 8, NULL, 0x40,
11835             NULL, HFILL }
11836         },
11837         { &hf_pfcp_reporting_triggers_o5_b7_liusa,
11838         { "LIUSA (Linked Usage Reporting)", "pfcp.reporting_triggers_flags.liusa",
11839             FT_BOOLEAN, 8, NULL, 0x80,
11840             NULL, HFILL }
11841         },
11842         { &hf_pfcp_reporting_triggers_o6_b0_volqu,
11843         { "VOLQU (Volume Quota)", "pfcp.reporting_triggers_flags.volqu",
11844             FT_BOOLEAN, 8, NULL, 0x01,
11845             NULL, HFILL }
11846         },
11847         { &hf_pfcp_reporting_triggers_o6_b1_timqu,
11848         { "TIMQU (Time Quota)", "pfcp.reporting_triggers_flags.timqu",
11849             FT_BOOLEAN, 8, NULL, 0x02,
11850             NULL, HFILL }
11851         },
11852         { &hf_pfcp_reporting_triggers_o6_b2_envcl,
11853         { "ENVCL (Envelope Closure)", "pfcp.reporting_triggers_flags.envcl",
11854             FT_BOOLEAN, 8, NULL, 0x04,
11855             NULL, HFILL }
11856         },
11857         { &hf_pfcp_reporting_triggers_o6_b3_macar,
11858         { "MACAR (MAC Addresses Reporting)", "pfcp.reporting_triggers_flags.macar",
11859             FT_BOOLEAN, 8, NULL, 0x08,
11860             NULL, HFILL }
11861         },
11862         { &hf_pfcp_reporting_triggers_o6_b4_eveth,
11863         { "EVETH (Event Threshold)", "pfcp.reporting_triggers_flags.eveth",
11864             FT_BOOLEAN, 8, NULL, 0x10,
11865             NULL, HFILL }
11866         },
11867         { &hf_pfcp_reporting_triggers_o6_b5_evequ,
11868         { "EVEQU (Event Quota)", "pfcp.reporting_triggers_flags.evequ",
11869             FT_BOOLEAN, 8, NULL, 0x20,
11870             NULL, HFILL }
11871         },
11872         { &hf_pfcp_reporting_triggers_o6_b6_ipmjl,
11873         { "IPMJL (IP Multicast Join/Leave)", "pfcp.reporting_triggers_flags.ipmjl",
11874             FT_BOOLEAN, 8, NULL, 0x40,
11875             NULL, HFILL }
11876         },
11877         { &hf_pfcp_reporting_triggers_o6_b7_quvti,
11878         { "QUVTI (Quota Validity Time)", "pfcp.reporting_triggers_flags.quvti",
11879             FT_BOOLEAN, 8, NULL, 0x80,
11880             NULL, HFILL }
11881         },
11882         { &hf_pfcp_reporting_triggers_o7_b0_reemr,
11883         { "REEMR (REport the End Marker Reception)", "pfcp.reporting_triggers_flags.reemr",
11884             FT_BOOLEAN, 8, NULL, 0x01,
11885             NULL, HFILL }
11886         },
11887         { &hf_pfcp_usage_report_trigger_o7_b0_evequ,
11888         { "EVEQU (Event Quota)", "pfcp.usage_report_trigger_flags.evequ",
11889             FT_BOOLEAN, 8, NULL, 0x01,
11890             NULL, HFILL }
11891         },
11892         { &hf_pfcp_usage_report_trigger_o7_b1_tebur,
11893         { "TEMUR (Termination By UP function Report)", "pfcp.usage_report_trigger_flags.tebur",
11894             FT_BOOLEAN, 8, NULL, 0x02,
11895             NULL, HFILL }
11896         },
11897         { &hf_pfcp_usage_report_trigger_o7_b2_ipmjl,
11898         { "IPMJL (IP Multicast Join/Leave)", "pfcp.usage_report_trigger_flags.ipmjl",
11899             FT_BOOLEAN, 8, NULL, 0x04,
11900             NULL, HFILL }
11901         },
11902         { &hf_pfcp_usage_report_trigger_o7_b3_quvti,
11903         { "QUVTI (Quota Validity Time)", "pfcp.usage_report_trigger_flags.quvti",
11904             FT_BOOLEAN, 8, NULL, 0x08,
11905             NULL, HFILL }
11906         },
11907         { &hf_pfcp_usage_report_trigger_o7_b4_emrre,
11908         { "EMRRE (End Marker Recetion REport)", "pfcp.usage_report_trigger_flags.emrre",
11909             FT_BOOLEAN, 8, NULL, 0x10,
11910             NULL, HFILL }
11911         },
11912         { &hf_pfcp_usage_report_trigger_o6_b0_volqu,
11913         { "VOLQU (Volume Quota)", "pfcp.usage_report_trigger_flags.volqu",
11914             FT_BOOLEAN, 8, NULL, 0x01,
11915             NULL, HFILL }
11916         },
11917         { &hf_pfcp_usage_report_trigger_o6_b1_timqu,
11918         { "TIMQU (Time Quota)", "pfcp.usage_report_trigger_flags.timqu",
11919             FT_BOOLEAN, 8, NULL, 0x02,
11920             NULL, HFILL }
11921         },
11922         { &hf_pfcp_usage_report_trigger_o6_b2_liusa,
11923         { "LIUSA (Linked Usage Reporting)", "pfcp.usage_report_trigger_flags.liusa",
11924             FT_BOOLEAN, 8, NULL, 0x04,
11925             NULL, HFILL }
11926         },
11927         { &hf_pfcp_usage_report_trigger_o6_b3_termr,
11928         { "TERMR (Termination Report)", "pfcp.usage_report_trigger.term",
11929             FT_BOOLEAN, 8, NULL, 0x08,
11930             NULL, HFILL }
11931         },
11932         { &hf_pfcp_usage_report_trigger_o6_b4_monit,
11933         { "MONIT (Monitoring Time)", "pfcp.usage_report_trigger.monit",
11934             FT_BOOLEAN, 8, NULL, 0x10,
11935             NULL, HFILL }
11936         },
11937         { &hf_pfcp_usage_report_trigger_o6_b5_envcl,
11938         { "ENVCL (Envelope Closure)", "pfcp.usage_report_trigger_flags.envcl",
11939             FT_BOOLEAN, 8, NULL, 0x20,
11940             NULL, HFILL }
11941         },
11942         { &hf_pfcp_usage_report_trigger_o6_b7_eveth,
11943         { "EVETH (Event Threshold)", "pfcp.usage_report_trigger_flags.eveth",
11944             FT_BOOLEAN, 8, NULL, 0x80,
11945             NULL, HFILL }
11946         },
11947         { &hf_pfcp_usage_report_trigger_o6_b6_macar,
11948         { "MACAR (MAC Addresses Reporting)", "pfcp.usage_report_trigger_flags.macar",
11949             FT_BOOLEAN, 8, NULL, 0x40,
11950             NULL, HFILL }
11951         },
11952         { &hf_pfcp_usage_report_trigger_o5_b0_perio,
11953         { "PERIO (Periodic Reporting)", "pfcp.usage_report_trigger_flags.perio",
11954             FT_BOOLEAN, 8, NULL, 0x01,
11955             NULL, HFILL }
11956         },
11957         { &hf_pfcp_usage_report_trigger_o5_b1_volth,
11958         { "VOLTH (Volume Threshold)", "pfcp.usage_report_trigger_flags.volth",
11959             FT_BOOLEAN, 8, NULL, 0x02,
11960             NULL, HFILL }
11961         },
11962         { &hf_pfcp_usage_report_trigger_o5_b2_timth,
11963         { "TIMTH (Time Threshold)", "pfcp.usage_report_trigger_flags.timth",
11964             FT_BOOLEAN, 8, NULL, 0x04,
11965             NULL, HFILL }
11966         },
11967         { &hf_pfcp_usage_report_trigger_o5_b3_quhti,
11968         { "QUHTI (Quota Holding Time)", "pfcp.usage_report_trigger_flags.quhti",
11969             FT_BOOLEAN, 8, NULL, 0x08,
11970             NULL, HFILL }
11971         },
11972         { &hf_pfcp_usage_report_trigger_o5_b4_start,
11973         { "START (Start of Traffic)", "pfcp.usage_report_trigger_flags.start",
11974             FT_BOOLEAN, 8, NULL, 0x10,
11975             NULL, HFILL }
11976         },
11977         { &hf_pfcp_usage_report_trigger_o5_b5_stopt,
11978         { "STOPT (Stop of Traffic)", "pfcp.usage_report_trigger_flags.stopt",
11979             FT_BOOLEAN, 8, NULL, 0x20,
11980             NULL, HFILL }
11981         },
11982         { &hf_pfcp_usage_report_trigger_o5_b6_droth,
11983         { "DROTH (Dropped DL Traffic Threshold)", "pfcp.usage_report_trigger_flags.droth",
11984             FT_BOOLEAN, 8, NULL, 0x40,
11985             NULL, HFILL }
11986         },
11987         { &hf_pfcp_usage_report_trigger_o5_b7_immer,
11988         { "IMMER (Immediate Report)", "pfcp.usage_report_trigger.immer",
11989             FT_BOOLEAN, 8, NULL, 0x80,
11990             NULL, HFILL }
11991         },
11992 
11993         { &hf_pfcp_volume_threshold,
11994         { "Flags", "pfcp.volume_threshold",
11995             FT_UINT8, BASE_HEX, NULL, 0x0,
11996             NULL, HFILL }
11997         },
11998         { &hf_pfcp_volume_threshold_b0_tovol,
11999         { "TOVOL", "pfcp.volume_threshold_flags.tovol",
12000             FT_BOOLEAN, 8, NULL, 0x01,
12001             NULL, HFILL }
12002         },
12003         { &hf_pfcp_volume_threshold_b1_ulvol,
12004         { "ULVOL", "pfcp.volume_threshold_flags.ulvol",
12005             FT_BOOLEAN, 8, NULL, 0x02,
12006             NULL, HFILL }
12007         },
12008         { &hf_pfcp_volume_threshold_b2_dlvol,
12009         { "DLVOL", "pfcp.volume_threshold_flags.dlvol",
12010             FT_BOOLEAN, 8, NULL, 0x04,
12011             NULL, HFILL }
12012         },
12013         { &hf_pfcp_volume_threshold_tovol,
12014         { "Total Volume", "pfcp.volume_threshold.tovol",
12015             FT_UINT64, BASE_DEC, NULL, 0x0,
12016             NULL, HFILL }
12017         },
12018         { &hf_pfcp_volume_threshold_ulvol,
12019         { "Uplink Volume", "pfcp.volume_threshold.ulvol",
12020             FT_UINT64, BASE_DEC, NULL, 0x0,
12021             NULL, HFILL }
12022         },
12023         { &hf_pfcp_volume_threshold_dlvol,
12024         { "Downlink Volume", "pfcp.volume_threshold.dlvol",
12025             FT_UINT64, BASE_DEC, NULL, 0x0,
12026             NULL, HFILL }
12027         },
12028         { &hf_pfcp_volume_quota,
12029         { "Flags", "pfcp.volume_quota",
12030             FT_UINT8, BASE_HEX, NULL, 0x0,
12031             NULL, HFILL }
12032         },
12033         { &hf_pfcp_volume_quota_b0_tovol,
12034         { "TOVOL", "pfcp.volume_quota_flags.tovol",
12035             FT_BOOLEAN, 8, NULL, 0x01,
12036             NULL, HFILL }
12037         },
12038         { &hf_pfcp_volume_quota_b1_ulvol,
12039         { "ULVOL", "pfcp.volume_quota_flags.ulvol",
12040             FT_BOOLEAN, 8, NULL, 0x02,
12041             NULL, HFILL }
12042         },
12043         { &hf_pfcp_volume_quota_b2_dlvol,
12044         { "DLVOL", "pfcp.volume_quota_flags.dlvol",
12045             FT_BOOLEAN, 8, NULL, 0x04,
12046             NULL, HFILL }
12047         },
12048         { &hf_pfcp_volume_quota_tovol,
12049         { "Total Volume", "pfcp.volume_quota.tovol",
12050             FT_UINT64, BASE_DEC, NULL, 0x0,
12051             NULL, HFILL }
12052         },
12053         { &hf_pfcp_volume_quota_ulvol,
12054         { "Uplink Volume", "pfcp.volume_quota.ulvol",
12055             FT_UINT64, BASE_DEC, NULL, 0x0,
12056             NULL, HFILL }
12057         },
12058         { &hf_pfcp_volume_quota_dlvol,
12059         { "Downlink Volume", "pfcp.volume_quota.dlvol",
12060             FT_UINT64, BASE_DEC, NULL, 0x0,
12061             NULL, HFILL }
12062         },
12063         { &hf_pfcp_subseq_volume_threshold,
12064         { "Flags", "pfcp.subseq_volume_threshold",
12065             FT_UINT8, BASE_HEX, NULL, 0x0,
12066             NULL, HFILL }
12067         },
12068         { &hf_pfcp_subseq_volume_threshold_b0_tovol,
12069         { "TOVOL", "pfcp.subseq_volume_threshold.tovol_flg",
12070             FT_BOOLEAN, 8, NULL, 0x01,
12071             NULL, HFILL }
12072         },
12073         { &hf_pfcp_subseq_volume_threshold_b1_ulvol,
12074         { "ULVOL", "pfcp.subseq_volume_threshold.ulvol_flg",
12075             FT_BOOLEAN, 8, NULL, 0x02,
12076             NULL, HFILL }
12077         },
12078         { &hf_pfcp_subseq_volume_threshold_b2_dlvol,
12079         { "DLVOL", "pfcp.subseq_volume_threshold.dlvol_flg",
12080             FT_BOOLEAN, 8, NULL, 0x04,
12081             NULL, HFILL }
12082         },
12083         { &hf_pfcp_subseq_volume_threshold_tovol,
12084         { "Total Volume", "pfcp.subseq_volume_threshold.tovol",
12085             FT_UINT64, BASE_DEC, NULL, 0x0,
12086             NULL, HFILL }
12087         },
12088         { &hf_pfcp_subseq_volume_threshold_ulvol,
12089         { "Uplink Volume", "pfcp.subseq_volume_threshold.ulvol",
12090             FT_UINT64, BASE_DEC, NULL, 0x0,
12091             NULL, HFILL }
12092         },
12093         { &hf_pfcp_subseq_volume_threshold_dlvol,
12094         { "Downlink Volume", "pfcp.subseq_volume_threshold.dlvol",
12095             FT_UINT64, BASE_DEC, NULL, 0x0,
12096             NULL, HFILL }
12097         },
12098         { &hf_pfcp_time_quota,
12099         { "Time Quota", "pfcp.time_quota",
12100             FT_UINT32, BASE_DEC, NULL, 0x0,
12101             NULL, HFILL }
12102         },
12103         { &hf_pfcp_start_time,
12104         { "Start Time", "pfcp.start_time",
12105             FT_ABSOLUTE_TIME, ABSOLUTE_TIME_NTP_UTC, NULL, 0,
12106             NULL, HFILL }
12107         },
12108         { &hf_pfcp_end_time,
12109         { "End Time", "pfcp.end_time",
12110             FT_ABSOLUTE_TIME, ABSOLUTE_TIME_NTP_UTC, NULL, 0,
12111             NULL, HFILL }
12112         },
12113         { &hf_pfcp_quota_holding_time,
12114         { "Quota Holding Time", "pfcp.quota_holding_time",
12115             FT_UINT32, BASE_DEC, NULL, 0x0,
12116             NULL, HFILL }
12117         },
12118         { &hf_pfcp_dropped_dl_traffic_threshold,
12119         { "Flags", "pfcp.dropped_dl_traffic_threshold",
12120             FT_UINT8, BASE_HEX, NULL, 0x0,
12121             NULL, HFILL }
12122         },
12123         { &hf_pfcp_dropped_dl_traffic_threshold_b0_dlpa,
12124         { "DLPA", "pfcp.dropped_dl_traffic_threshold.dlpa_flg",
12125             FT_BOOLEAN, 8, NULL, 0x01,
12126             NULL, HFILL }
12127         },
12128         { &hf_pfcp_dropped_dl_traffic_threshold_b1_dlby,
12129         { "DLBY", "pfcp.dropped_dl_traffic_threshold.dlby_flg",
12130             FT_BOOLEAN, 8, NULL, 0x02,
12131             NULL, HFILL }
12132         },
12133         { &hf_pfcp_downlink_packets,
12134         { "Downlink Packets", "pfcp.downlink_packets",
12135             FT_UINT64, BASE_DEC, NULL, 0x0,
12136             NULL, HFILL }
12137         },
12138         { &hf_pfcp_bytes_downlink_data,
12139         { "Bytes of Downlink Data", "pfcp.bytes_downlink_data",
12140             FT_UINT64, BASE_DEC, NULL, 0x0,
12141             NULL, HFILL }
12142         },
12143         { &hf_pfcp_qer_correlation_id,
12144         { "QER Correlation ID", "pfcp.qer_correlation_id",
12145             FT_UINT32, BASE_DEC, NULL, 0x0,
12146             NULL, HFILL }
12147         },
12148         { &hf_pfcp_gate_status,
12149         { "Flags", "pfcp.gate_status",
12150             FT_UINT8, BASE_HEX, NULL, 0x0,
12151             NULL, HFILL }
12152         },
12153         { &hf_pfcp_gate_status_b0b1_dlgate,
12154         { "DL Gate", "pfcp.gate_status.dlgate",
12155             FT_UINT8, BASE_DEC, VALS(pfcp_gate_status_vals), 0x03,
12156             NULL, HFILL }
12157         },
12158         { &hf_pfcp_gate_status_b3b2_ulgate,
12159         { "UL Gate", "pfcp.gate_status.ulgate",
12160             FT_UINT8, BASE_DEC, VALS(pfcp_gate_status_vals), 0x0c,
12161             NULL, HFILL }
12162         },
12163         { &hf_pfcp_ul_mbr,
12164         { "UL MBR", "pfcp.ul_mbr",
12165             FT_UINT40, BASE_DEC, NULL, 0x0,
12166             NULL, HFILL }
12167         },
12168         { &hf_pfcp_dl_mbr,
12169         { "DL MBR", "pfcp.dl_mbr",
12170             FT_UINT40, BASE_DEC, NULL, 0x0,
12171             NULL, HFILL }
12172         },
12173         { &hf_pfcp_ul_gbr,
12174         { "UL GBR", "pfcp.ul_gbr",
12175             FT_UINT40, BASE_DEC, NULL, 0x0,
12176             NULL, HFILL }
12177         },
12178         { &hf_pfcp_dl_gbr,
12179         { "DL GBR", "pfcp.dl_gbr",
12180             FT_UINT40, BASE_DEC, NULL, 0x0,
12181             NULL, HFILL }
12182         },
12183         { &hf_pfcp_report_type,
12184         { "Flags", "pfcp.report_type",
12185             FT_UINT8, BASE_HEX, NULL, 0x0,
12186             NULL, HFILL }
12187         },
12188         { &hf_pfcp_report_type_b6_uisr,
12189         { "UISR (UP Initiated Session Request)", "pfcp.report_type.uisr",
12190             FT_BOOLEAN, 8, NULL, 0x40,
12191             NULL, HFILL }
12192         },
12193         { &hf_pfcp_report_type_b5_sesr,
12194         { "SESR (Session Report)", "pfcp.report_type.sesr",
12195             FT_BOOLEAN, 8, NULL, 0x20,
12196             NULL, HFILL }
12197         },
12198         { &hf_pfcp_report_type_b4_tmir,
12199         { "TMIR (TSC Management Information Report)", "pfcp.report_type.tmir",
12200             FT_BOOLEAN, 8, NULL, 0x10,
12201             NULL, HFILL }
12202         },
12203         { &hf_pfcp_report_type_b3_upir,
12204         { "UPIR (User Plane Inactivity Report)", "pfcp.report_type.upir",
12205             FT_BOOLEAN, 8, NULL, 0x08,
12206             NULL, HFILL }
12207         },
12208         { &hf_pfcp_report_type_b2_erir,
12209         { "ERIR (Error Indication Report)", "pfcp.report_type.erir",
12210             FT_BOOLEAN, 8, NULL, 0x04,
12211             NULL, HFILL }
12212         },
12213         { &hf_pfcp_report_type_b1_usar,
12214         { "USAR (Usage Report)", "pfcp.report_type.usar",
12215             FT_BOOLEAN, 8, NULL, 0x02,
12216             NULL, HFILL }
12217         },
12218         { &hf_pfcp_report_type_b0_dldr,
12219         { "DLDR (Downlink Data Report)", "pfcp.report_type.dldr",
12220             FT_BOOLEAN, 8, NULL, 0x01,
12221             NULL, HFILL }
12222         },
12223         { &hf_pfcp_offending_ie,
12224         { "Type of the offending IE", "pfcp.offending_ie",
12225             FT_UINT16, BASE_DEC | BASE_EXT_STRING, &pfcp_ie_type_ext, 0x0,
12226             NULL, HFILL }
12227         },
12228         { &hf_pfcp_offending_ie_value,
12229         { "Type of the offending IE", "pfcp.offending_ie",
12230             FT_UINT32, BASE_DEC, NULL, 0x0,
12231             NULL, HFILL }
12232         },
12233 
12234         { &hf_pfcp_up_function_features_o5_b0_bucp,
12235         { "BUCP", "pfcp.up_function_features.bucp",
12236             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
12237             "Downlink Data Buffering in CP function", HFILL }
12238         },
12239         { &hf_pfcp_up_function_features_o5_b1_ddnd,
12240         { "DDND", "pfcp.up_function_features.ddnd",
12241             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
12242             "Buffering parameter 'Downlink Data Notification Delay", HFILL }
12243         },
12244         { &hf_pfcp_up_function_features_o5_b2_dlbd,
12245         { "DLBD", "pfcp.up_function_features.dlbd",
12246             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
12247             NULL, HFILL }
12248         },
12249         { &hf_pfcp_up_function_features_o5_b3_trst,
12250         { "TRST", "pfcp.up_function_features.trst",
12251             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
12252             "Traffic Steering", HFILL }
12253         },
12254         { &hf_pfcp_up_function_features_o5_b4_ftup,
12255         { "FTUP", "pfcp.up_function_features.ftup",
12256             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
12257             "F-TEID allocation / release in the UP function", HFILL }
12258         },
12259         { &hf_pfcp_up_function_features_o5_b5_pfdm,
12260         { "PFDM", "pfcp.up_function_features.pfdm",
12261             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
12262             "PFD Management procedure", HFILL }
12263         },
12264         { &hf_pfcp_up_function_features_o5_b6_heeu,
12265         { "HEEU", "pfcp.up_function_features.heeu",
12266             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
12267             "Header Enrichment of Uplink traffic", HFILL }
12268         },
12269         { &hf_pfcp_up_function_features_o5_b7_treu,
12270         { "TREU", "pfcp.up_function_features.treu",
12271             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
12272             "Traffic Redirection Enforcement in the UP function", HFILL }
12273         },
12274         { &hf_pfcp_up_function_features_o6_b0_empu,
12275         { "EMPU", "pfcp.up_function_features.empu",
12276             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
12277             "Sending of End Marker packets", HFILL }
12278         },
12279         { &hf_pfcp_up_function_features_o6_b1_pdiu,
12280         { "PDIU", "pfcp.up_function_features.pdiu",
12281             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
12282             "Support of PDI optimised signalling", HFILL }
12283         },
12284         { &hf_pfcp_up_function_features_o6_b2_udbc,
12285         { "UDBC", "pfcp.up_function_features.udbc",
12286             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
12287             "Support of UL/DL Buffering Control", HFILL }
12288         },
12289         { &hf_pfcp_up_function_features_o6_b3_quoac,
12290         { "QUOAC", "pfcp.up_function_features.quoac",
12291             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
12292             "The UP function supports being provisioned with the Quota Action to apply when reaching quotas", HFILL }
12293         },
12294         { &hf_pfcp_up_function_features_o6_b4_trace,
12295         { "TRACE", "pfcp.up_function_features.trace",
12296             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
12297             "The UP function supports Trace", HFILL }
12298         },
12299         { &hf_pfcp_up_function_features_o6_b5_frrt,
12300         { "FRRT", "pfcp.up_function_features.frrt",
12301             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
12302             "The UP function supports Framed Routing", HFILL }
12303         },
12304         { &hf_pfcp_up_function_features_o6_b6_pfde,
12305         { "PFDE", "pfcp.up_function_features.pfde",
12306             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
12307             "The UP function supports a PFD Contents including a property with multiple values", HFILL }
12308         },
12309         { &hf_pfcp_up_function_features_o6_b7_epfar,
12310         { "EPFAR", "pfcp.up_function_features.epfar",
12311             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
12312             "The UP function supports the Enhanced PFCP Association Release feature", HFILL }
12313         },
12314         { &hf_pfcp_up_function_features_o7_b0_dpdra,
12315         { "DPDRA", "pfcp.up_function_features.dpdra",
12316             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
12317             "The UP function supports Deferred PDR Activation or Deactivation", HFILL }
12318         },
12319         { &hf_pfcp_up_function_features_o7_b1_adpdp,
12320         { "ADPDP", "pfcp.up_function_features.adpdp",
12321             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
12322             "The UP function supports the Activation and Deactivation of Pre-defined PDRs", HFILL }
12323         },
12324         { &hf_pfcp_up_function_features_o7_b2_ueip,
12325         { "UEIP", "pfcp.up_function_features.ueip",
12326             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
12327             "The UP function supports allocating UE IP addresses or prefixes", HFILL }
12328         },
12329         { &hf_pfcp_up_function_features_o7_b3_sset,
12330         { "SSET", "pfcp.up_function_features.sset",
12331             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
12332             "UP function support of PFCP sessions successively controlled by different SMFs of a same SMF", HFILL }
12333         },
12334         { &hf_pfcp_up_function_features_o7_b4_mnop,
12335         { "MNOP", "pfcp.up_function_features.mnop",
12336             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
12337             "UPF supports measurement of number of packets which is instructed with the flag 'Measurement of Number of Packets' in a URR", HFILL }
12338         },
12339         { &hf_pfcp_up_function_features_o7_b5_mte_n4,
12340         { "MTE N4", "pfcp.up_function_features.mte_n4",
12341             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
12342             "UPF supports multiple instances of Traffic Endpoint IDs in a PDI", HFILL }
12343         },
12344         { &hf_pfcp_up_function_features_o7_b6_bundl,
12345         { "BUNDL", "pfcp.up_function_features.bundl",
12346             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
12347             "PFCP messages bundling", HFILL }
12348         },
12349         { &hf_pfcp_up_function_features_o7_b7_gcom,
12350         { "GCOM", "pfcp.up_function_features.gcom",
12351             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
12352             "UPF support of 5G VN Group Communication", HFILL }
12353         },
12354         { &hf_pfcp_up_function_features_o8_b0_mpas,
12355         { "MPAS", "pfcp.up_function_features.mpas",
12356             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
12357             "UPF support for multiple PFCP associations to the SMFs in an SMF set", HFILL }
12358         },
12359         { &hf_pfcp_up_function_features_o8_b1_rttl,
12360         { "RTTL", "pfcp.up_function_features.rttl",
12361             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
12362             "The UP function supports redundant transmission at transport layer", HFILL }
12363         },
12364         { &hf_pfcp_up_function_features_o8_b2_vtime,
12365         { "VTIME", "pfcp.up_function_features.vtime",
12366             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
12367             "UPF support of quota validity time feature", HFILL }
12368         },
12369         { &hf_pfcp_up_function_features_o8_b3_norp,
12370         { "NORP", "pfcp.up_function_features.norp",
12371             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
12372             "UP function support of Number of Reports", HFILL }
12373         },
12374         { &hf_pfcp_up_function_features_o8_b4_iptv,
12375         { "IPTV", "pfcp.up_function_features.iptv",
12376             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
12377             "UPF support of IPTV service", HFILL }
12378         },
12379         { &hf_pfcp_up_function_features_o8_b5_ip6pl,
12380         { "IP6PL", "pfcp.up_function_features.ip6pl",
12381             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
12382             "UPF supports UE IPv6 address(es) allocation with IPv6 prefix length other than default /64", HFILL }
12383         },
12384         { &hf_pfcp_up_function_features_o8_b6_tscu,
12385         { "TSCU", "pfcp.up_function_features.tscu",
12386             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
12387             "Time Sensitive Communication is supported by the UPF", HFILL }
12388         },
12389         { &hf_pfcp_up_function_features_o8_b7_mptcp,
12390         { "MPTCP", "pfcp.up_function_features.mptcp",
12391             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
12392             "UPF support of MPTCP Proxy functionality", HFILL }
12393         },
12394         { &hf_pfcp_up_function_features_o9_b0_atsss_ll,
12395         { "ATSSS-LL", "pfcp.up_function_features.atsss_ll",
12396             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
12397             "UPF support of ATSSS-LLL steering functionality", HFILL }
12398         },
12399         { &hf_pfcp_up_function_features_o9_b1_qfqm,
12400         { "QFQM", "pfcp.up_function_features.qfqm",
12401             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
12402             "UPF support of per QoS flow per UE QoS monitoring", HFILL }
12403         },
12404         { &hf_pfcp_up_function_features_o9_b2_gpqm,
12405         { "GPQM", "pfcp.up_function_features.gpqm",
12406             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
12407             "UPF support of per GTP-U Path QoS monitoring", HFILL }
12408         },
12409         { &hf_pfcp_up_function_features_o9_b3_mt_edt,
12410         { "MT-EDT", "pfcp.up_function_features.mtedt",
12411             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
12412             "SGW-U support of reporting the size of DL Data Packets", HFILL }
12413         },
12414         { &hf_pfcp_up_function_features_o9_b4_ciot,
12415         { "CIOT", "pfcp.up_function_features.ciot",
12416             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
12417             "UPF support of CIoT feature", HFILL }
12418         },
12419         { &hf_pfcp_up_function_features_o9_b5_ethar,
12420         { "ETHAR", "pfcp.up_function_features.ethar",
12421             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
12422             "UPF support of Ethernet PDU Session Anchor Relocation", HFILL }
12423         },
12424         { &hf_pfcp_up_function_features_o9_b6_ddds,
12425         { "DDDS", "pfcp.up_function_features.ddds",
12426             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
12427             "UPF support of reporting of the first buffred / discarded data for downlink", HFILL }
12428         },
12429         { &hf_pfcp_up_function_features_o9_b7_rds,
12430         { "RDS", "pfcp.up_function_features.rds",
12431             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
12432             "UP function support of Reliable Data Service", HFILL }
12433         },
12434         { &hf_pfcp_up_function_features_o10_b0_rttwp,
12435         { "RTTWP", "pfcp.up_function_features.rttwp",
12436             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
12437             "UPF support of RTT measurement towards the UE without PMF", HFILL }
12438         },
12439         { &hf_pfcp_up_function_features_o10_b1_quoaf,
12440         { "QUOAF", "pfcp.up_function_features.quoaf",
12441             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
12442             "UP function supports being provisioned with the Quota Action Application ID or a Quota Action SDF Filter to apply when reaching quotas", HFILL }
12443         },
12444         { &hf_pfcp_up_function_features_o10_b2_nspoc,
12445         { "QUOAF", "pfcp.up_function_features.nspoc",
12446             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
12447             "UP function supports notifying start of Pause of Charging via user plane", HFILL }
12448         },
12449         { &hf_pfcp_up_function_features_o10_b3_l2tp,
12450         { "L2TP", "pfcp.up_function_features.l2tp",
12451             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
12452             "UP function supports L2TP", HFILL }
12453         },
12454         { &hf_pfcp_up_function_features_o10_b4_upber,
12455         { "UPBER", "pfcp.up_function_features.upber",
12456             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
12457             "UP function supports the uplink packet buffering during EAS relocation", HFILL }
12458         },
12459         { &hf_pfcp_up_function_features_o10_b5_resps,
12460         { "RESPS", "pfcp.up_function_features.resps",
12461             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
12462             "UP function supports Restoration of PFCP Session association", HFILL }
12463         },
12464         { &hf_pfcp_up_function_features_o10_b6_iprep,
12465         { "IPREP", "pfcp.up_function_features.iprep",
12466             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
12467             "UP function supports IP Address and Port number replacement", HFILL }
12468         },
12469         { &hf_pfcp_up_function_features_o10_b7_dnsts,
12470         { "DNSTS", "pfcp.up_function_features.dnsts",
12471             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
12472             "UP function support DNS Traffic Steering based on FQDN in the DNS Query message", HFILL }
12473         },
12474         { &hf_pfcp_up_function_features_o11_b0_drqos,
12475         { "DRQOS", "pfcp.up_function_features.drqos",
12476             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
12477             "UP function supports Direct Reporting of QoS monitoring events to Local NEF or AF", HFILL }
12478         },
12479 
12480         { &hf_pfcp_sequence_number,
12481         { "Sequence Number", "pfcp.sequence_number",
12482             FT_UINT32, BASE_DEC, NULL, 0x0,
12483             NULL, HFILL }
12484         },
12485         { &hf_pfcp_metric,
12486         { "Metric", "pfcp.metric",
12487             FT_UINT8, BASE_DEC, NULL, 0x0,
12488             NULL, HFILL }
12489         },
12490         { &hf_pfcp_timer_unit,
12491         { "Timer unit", "pfcp.timer_unit",
12492             FT_UINT8, BASE_DEC, VALS(pfcp_timer_unit_vals), 0xe0,
12493             NULL, HFILL }
12494         },
12495         { &hf_pfcp_timer_value,
12496         { "Timer value", "pfcp.timer_value",
12497             FT_UINT8, BASE_DEC, NULL, 0x1f,
12498             NULL, HFILL }
12499         },
12500         { &hf_pfcp_volume_measurement,
12501         { "Flags", "pfcp.volume_measurement",
12502             FT_UINT8, BASE_HEX, NULL, 0x0,
12503             NULL, HFILL }
12504         },
12505         { &hf_pfcp_volume_measurement_b0_tovol,
12506         { "TOVOL", "pfcp.volume_measurement_flags.tovol",
12507             FT_BOOLEAN, 8, NULL, 0x01,
12508             NULL, HFILL }
12509         },
12510         { &hf_pfcp_volume_measurement_b1_ulvol,
12511         { "ULVOL", "pfcp.volume_measurement_flags.ulvol",
12512             FT_BOOLEAN, 8, NULL, 0x02,
12513             NULL, HFILL }
12514         },
12515         { &hf_pfcp_volume_measurement_b2_dlvol,
12516         { "DLVOL", "pfcp.volume_measurement_flags.dlvol",
12517             FT_BOOLEAN, 8, NULL, 0x04,
12518             NULL, HFILL }
12519         },
12520         { &hf_pfcp_volume_measurement_b3_tonop,
12521         { "TONOP", "pfcp.volume_measurement_flags.tonop",
12522             FT_BOOLEAN, 8, NULL, 0x08,
12523             NULL, HFILL }
12524         },
12525         { &hf_pfcp_volume_measurement_b4_ulnop,
12526         { "ULNOP", "pfcp.volume_measurement_flags.ulnop",
12527             FT_BOOLEAN, 8, NULL, 0x10,
12528             NULL, HFILL }
12529         },
12530         { &hf_pfcp_volume_measurement_b5_dlnop,
12531         { "DLNOP", "pfcp.volume_measurement_flags.dlnops",
12532             FT_BOOLEAN, 8, NULL, 0x20,
12533             NULL, HFILL }
12534         },
12535         { &hf_pfcp_vol_meas_tovol,
12536         { "Total Volume", "pfcp.volume_measurement.tovol",
12537             FT_UINT64, BASE_DEC, NULL, 0x0,
12538             NULL, HFILL }
12539         },
12540         { &hf_pfcp_vol_meas_ulvol,
12541         { "Uplink Volume", "pfcp.volume_measurement.ulvol",
12542             FT_UINT64, BASE_DEC, NULL, 0x0,
12543             NULL, HFILL }
12544         },
12545         { &hf_pfcp_vol_meas_dlvol,
12546         { "Downlink Volume", "pfcp.volume_measurement.dlvol",
12547             FT_UINT64, BASE_DEC, NULL, 0x0,
12548             NULL, HFILL }
12549         },
12550         { &hf_pfcp_vol_meas_tonop,
12551         { "Total Number of Packets", "pfcp.volume_measurement.tonop",
12552             FT_UINT64, BASE_DEC, NULL, 0x0,
12553             NULL, HFILL }
12554         },
12555         { &hf_pfcp_vol_meas_ulnop,
12556         { "Uplink Number of Packets", "pfcp.volume_measurement.ulnop",
12557             FT_UINT64, BASE_DEC, NULL, 0x0,
12558             NULL, HFILL }
12559         },
12560         { &hf_pfcp_vol_meas_dlnop,
12561         { "Downlink Number of Packets", "pfcp.volume_measurement.dlnop",
12562             FT_UINT64, BASE_DEC, NULL, 0x0,
12563             NULL, HFILL }
12564         },
12565         { &hf_pfcp_cp_function_features_o5_b0_load,
12566         { "LOAD", "pfcp.cp_function_features.load",
12567             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
12568             "Load Control", HFILL }
12569         },
12570         { &hf_pfcp_cp_function_features_o5_b1_ovrl,
12571         { "OVRL", "pfcp.cp_function_features.ovrl",
12572             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
12573             "Overload Control", HFILL }
12574         },
12575         { &hf_pfcp_cp_function_features_o5_b2_epfar,
12576         { "EPFAR", "pfcp.cp_function_features.epfar",
12577             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
12578             "The CP function supports the Enhanced PFCP Association Release feature", HFILL }
12579         },
12580         { &hf_pfcp_cp_function_features_o5_b3_sset,
12581         { "SSET", "pfcp.cp_function_features.sset",
12582             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
12583             "SMF support of PFCP sessions successively controlled by different SMFs of a same SMF Set", HFILL }
12584         },
12585         { &hf_pfcp_cp_function_features_o5_b4_bundl,
12586         { "BUNDL", "pfcp.cp_function_features.bundl",
12587             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
12588             "PFCP messages bundling", HFILL }
12589         },
12590         { &hf_pfcp_cp_function_features_o5_b5_mpas,
12591         { "MPAS", "pfcp.cp_function_features.mpas",
12592             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
12593             "SMF support for multiple PFCP associations from an SMF set to a single UPF", HFILL }
12594         },
12595         { &hf_pfcp_cp_function_features_o5_b6_ardr,
12596         { "ARDR", "pfcp.cp_function_features.ardr",
12597             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
12598             "CP function supports Additional Usage Reports in the PFCP Session Deletion Response", HFILL }
12599         },
12600         { &hf_pfcp_cp_function_features_o5_b7_uiaur,
12601         { "UIAUR", "pfcp.cp_function_features.uiaur",
12602             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
12603             "CP function supports the UE IP Address Usage Reporting feature", HFILL }
12604         },
12605         { &hf_pfcp_cp_function_features_o6_b0_psucc,
12606         { "PSUCC", "pfcp.cp_function_features.psucc",
12607             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
12608             "CP function supports PFCP session establishment or modification with Partial Success", HFILL }
12609         },
12610         { &hf_pfcp_usage_information,
12611         { "Flags", "pfcp.usage_information",
12612             FT_UINT8, BASE_HEX, NULL, 0x0,
12613             NULL, HFILL }
12614         },
12615         { &hf_pfcp_usage_information_b0_bef,
12616         { "BEF (Before)", "pfcp.usage_information.bef",
12617             FT_BOOLEAN, 8, NULL, 0x01,
12618             NULL, HFILL }
12619         },
12620         { &hf_pfcp_usage_information_b1_aft,
12621         { "AFT (After)", "pfcp.usage_information.aft",
12622             FT_BOOLEAN, 8, NULL, 0x02,
12623             NULL, HFILL }
12624         },
12625         { &hf_pfcp_usage_information_b2_uae,
12626         { "UAE (Usage After Enforcement)", "pfcp.usage_information.uae",
12627             FT_BOOLEAN, 8, NULL, 0x04,
12628             NULL, HFILL }
12629         },
12630         { &hf_pfcp_usage_information_b3_ube,
12631         { "UBE (Usage Before Enforcement)", "pfcp.usage_information.ube",
12632             FT_BOOLEAN, 8, NULL, 0x08,
12633             NULL, HFILL }
12634         },
12635         { &hf_pfcp_application_instance_id,
12636         { "Application Instance Identifier", "pfcp.application_instance_id",
12637             FT_BYTES, BASE_NONE, NULL, 0x0,
12638             NULL, HFILL }
12639         },
12640         { &hf_pfcp_application_instance_id_str,
12641         { "Application Instance Identifier", "pfcp.application_instance_id_str",
12642             FT_STRING, BASE_NONE, NULL, 0x0,
12643             NULL, HFILL }
12644         },
12645         { &hf_pfcp_flow_dir,
12646         { "Flow Direction", "pfcp.flow_dir",
12647             FT_UINT8, BASE_DEC, VALS(pfcp_flow_dir_vals), 0x07,
12648             NULL, HFILL }
12649         },
12650         { &hf_pfcp_packet_rate,
12651         { "Flags", "pfcp.packet_rate",
12652             FT_UINT8, BASE_HEX, NULL, 0x0,
12653             NULL, HFILL }
12654         },
12655         { &hf_pfcp_packet_rate_b0_ulpr,
12656         { "ULPR (Uplink Packet Rate)", "pfcp.packet_rate.ulpr",
12657             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
12658             NULL, HFILL }
12659         },
12660         { &hf_pfcp_packet_rate_b1_dlpr,
12661         { "DLPR (Downlink Packet Rate)", "pfcp.packet_rate.dlpr",
12662             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
12663             NULL, HFILL }
12664         },
12665         { &hf_pfcp_packet_rate_b2_aprc,
12666         { "APRC (Additional Packet Rate Control)", "pfcp.packet_rate.aprc",
12667             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
12668             NULL, HFILL }
12669         },
12670         { &hf_pfcp_ul_time_unit,
12671         { "Uplink Time Unit", "pfcp.ul_time_unit",
12672             FT_UINT8, BASE_DEC, VALS(pfcp_pr_time_unit_vals), 0x07,
12673             NULL, HFILL }
12674         },
12675         { &hf_pfcp_max_ul_pr,
12676         { "Maximum Uplink Packet Rate", "pfcp.max_ul_pr",
12677             FT_UINT16, BASE_DEC, NULL, 0x0,
12678             NULL, HFILL }
12679         },
12680         { &hf_pfcp_dl_time_unit,
12681         { "Downlink Time Unit", "pfcp.dl_time_unit",
12682             FT_UINT8, BASE_DEC, VALS(pfcp_pr_time_unit_vals), 0x07,
12683             NULL, HFILL }
12684         },
12685         { &hf_pfcp_max_dl_pr,
12686         { "Maximum Downlink Packet Rate", "pfcp.max_dl_pr",
12687             FT_UINT16, BASE_DEC, NULL, 0x0,
12688             NULL, HFILL }
12689         },
12690         { &hf_pfcp_a_ul_time_unit,
12691         { "Additional Uplink Time Unit", "pfcp.a_ul_time_unit",
12692             FT_UINT8, BASE_DEC, VALS(pfcp_pr_time_unit_vals), 0x07,
12693             NULL, HFILL }
12694         },
12695         { &hf_pfcp_a_max_ul_pr,
12696         { "Additional Maximum Uplink Packet Rate", "pfcp.a_max_ul_pr",
12697             FT_UINT16, BASE_DEC, NULL, 0x0,
12698             NULL, HFILL }
12699         },
12700         { &hf_pfcp_a_dl_time_unit,
12701         { "Additional Downlink Time Unit", "pfcp.a_dl_time_unit",
12702             FT_UINT8, BASE_DEC, VALS(pfcp_pr_time_unit_vals), 0x07,
12703             NULL, HFILL }
12704         },
12705         { &hf_pfcp_a_max_dl_pr,
12706         { "Additional Maximum Downlink Packet Rate", "pfcp.a_max_dl_pr",
12707             FT_UINT16, BASE_DEC, NULL, 0x0,
12708             NULL, HFILL }
12709         },
12710         { &hf_pfcp_dl_flow_level_marking,
12711         { "Flags", "pfcp.dl_flow_level_marking",
12712             FT_UINT8, BASE_HEX, NULL, 0x0,
12713             NULL, HFILL }
12714         },
12715         { &hf_pfcp_dl_flow_level_marking_b0_ttc,
12716         { "TTC (ToS/Traffic Class)", "pfcp.dl_flow_level_marking.ttc",
12717             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
12718             NULL, HFILL }
12719         },
12720         { &hf_pfcp_dl_flow_level_marking_b1_sci,
12721         { "SCI(Service Class Indicator)", "pfcp.dl_flow_level_marking.sci",
12722             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
12723             NULL, HFILL }
12724         },
12725         { &hf_pfcp_sci,
12726         { "Service Class Indicator", "pfcp.sci",
12727             FT_UINT16, BASE_HEX, NULL, 0x0,
12728             NULL, HFILL }
12729         },
12730         { &hf_pfcp_dl_data_notification_delay,
12731         { "Delay Value", "pfcp.dl_data_notification_delay",
12732             FT_UINT8, BASE_DEC, NULL, 0x0,
12733             "Delay Value in integer multiples of 50 millisecs, or zero", HFILL }
12734         },
12735         { &hf_pfcp_packet_count,
12736         { "Packet Count", "pfcp.packet_count",
12737             FT_UINT16, BASE_DEC, NULL, 0x0,
12738             NULL, HFILL }
12739         },
12740         { &hf_pfcp_dl_data_service_inf_flags,
12741         { "Flags", "pfcp.dl_data_service_inf_flags",
12742             FT_UINT8, BASE_HEX, NULL, 0x0,
12743             NULL, HFILL }
12744         },
12745         { &hf_pfcp_dl_data_service_inf_b0_ppi,
12746         { "PPI(Paging Policy Indication)", "pfcp.dl_data_service_inf.ppi",
12747             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
12748             NULL, HFILL }
12749         },
12750         { &hf_pfcp_dl_data_service_inf_b1_qfii,
12751         { "QFII(QoS Flow Identifier)", "pfcp.dl_data_service_inf.qfii",
12752             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
12753             NULL, HFILL }
12754         },
12755         { &hf_pfcp_ppi,
12756         { "Paging Policy Indication", "pfcp.ppi",
12757             FT_UINT16, BASE_DEC, NULL, 0x7f,
12758             NULL, HFILL }
12759         },
12760         { &hf_pfcp_pfcpsmreq_flags,
12761         { "Flags", "pfcp.smreq_flags",
12762             FT_UINT8, BASE_HEX, NULL, 0x0,
12763             NULL, HFILL }
12764         },
12765         { &hf_pfcp_pfcpsmreq_flags_b0_drobu,
12766         { "DROBU (Drop Buffered Packets)", "pfcp.smreq_flags.drobu",
12767             FT_BOOLEAN, 8, NULL, 0x01,
12768             NULL, HFILL }
12769         },
12770         { &hf_pfcp_pfcpsmreq_flags_b1_sndem,
12771         { "SNDEM (Send End Marker Packets)", "pfcp.smreq_flags.sndem",
12772             FT_BOOLEAN, 8, NULL, 0x02,
12773             NULL, HFILL }
12774         },
12775         { &hf_pfcp_pfcpsmreq_flags_b2_qaurr,
12776         { "QAURR (Query All URRs)", "pfcp.smreq_flags.qaurr",
12777             FT_BOOLEAN, 8, NULL, 0x04,
12778             NULL, HFILL }
12779         },
12780         { &hf_pfcp_pfcpsmreq_flags_b3_sumpc,
12781         { "SUMPC (Stop of Usage Measurement to Pause Charging)", "pfcp.smreq_flags.sumpc",
12782             FT_BOOLEAN, 8, NULL, 0x08,
12783             NULL, HFILL }
12784         },
12785         { &hf_pfcp_pfcpsmreq_flags_b4_rumuc,
12786         { "RUMUC (Resume of Usage Measurement to Un-pause of Charging)", "pfcp.smreq_flags.rumuc",
12787             FT_BOOLEAN, 8, NULL, 0x10,
12788             NULL, HFILL }
12789         },
12790         { &hf_pfcp_pfcpsrrsp_flags,
12791         { "Flags", "pfcp.srrsp_flags",
12792             FT_UINT8, BASE_HEX, NULL, 0x0,
12793             NULL, HFILL }
12794         },
12795         { &hf_pfcp_pfcpsrrsp_flags_b0_drobu,
12796         { "DROBU (Drop Buffered Packets)", "pfcp.srrsp_flags.drobu",
12797             FT_BOOLEAN, 8, NULL, 0x01,
12798             NULL, HFILL }
12799         },
12800         { &hf_pfcp_pfd_contents_flags,
12801         { "Flags", "pfcp.pfd_contents_flags",
12802             FT_UINT8, BASE_HEX, NULL, 0x0,
12803             NULL, HFILL }
12804         },
12805         { &hf_pfcp_pfd_contents_flags_b0_fd,
12806         { "FD (Flow Description)", "pfcp.pfd_contents_flags.fd",
12807             FT_BOOLEAN, 8, NULL, 0x01,
12808             NULL, HFILL }
12809         },
12810         { &hf_pfcp_pfd_contents_flags_b1_url,
12811         { "URL (URL)", "pfcp.pfd_contents_flags.url",
12812             FT_BOOLEAN, 8, NULL, 0x02,
12813             NULL, HFILL }
12814         },
12815         { &hf_pfcp_pfd_contents_flags_b2_dn,
12816         { "DN (Domain Name)", "pfcp.pfd_contents_flags.dn",
12817             FT_BOOLEAN, 8, NULL, 0x04,
12818             NULL, HFILL }
12819         },
12820         { &hf_pfcp_pfd_contents_flags_b3_cp,
12821         { "CP (Custom PFD Content)", "pfcp.pfd_contents_flags.cp",
12822             FT_BOOLEAN, 8, NULL, 0x08,
12823             NULL, HFILL }
12824         },
12825         { &hf_pfcp_pfd_contents_flags_b4_dnp,
12826         { "DNP (Domain Name Protocol)", "pfcp.pfd_contents_flags.dnp",
12827             FT_BOOLEAN, 8, NULL, 0x10,
12828             NULL, HFILL }
12829         },
12830         { &hf_pfcp_pfd_contents_flags_b5_afd,
12831         { "AFD (Additional Flow Description)", "pfcp.pfd_contents_flags.afd",
12832             FT_BOOLEAN, 8, NULL, 0x20,
12833             NULL, HFILL }
12834         },
12835         { &hf_pfcp_pfd_contents_flags_b6_aurl,
12836         { "AURL (Additional URL)", "pfcp.pfd_contents_flags.aurl",
12837             FT_BOOLEAN, 8, NULL, 0x40,
12838             NULL, HFILL }
12839         },
12840         { &hf_pfcp_pfd_contents_flags_b7_adnp,
12841         { "ADNP (Additional Domain Name and Domain Name Protocol)", "pfcp.pfd_contents_flags.adnp",
12842             FT_BOOLEAN, 8, NULL, 0x80,
12843             NULL, HFILL }
12844         },
12845         { &hf_pfcp_url_len,
12846         { "Length of URL", "pfcp.url_len",
12847             FT_UINT16, BASE_DEC, NULL, 0x0,
12848             NULL, HFILL }
12849         },
12850         { &hf_pfcp_url,
12851         { "URL", "pfcp.url",
12852             FT_STRING, BASE_NONE, NULL, 0x0,
12853             NULL, HFILL }
12854         },
12855         { &hf_pfcp_dn_len,
12856         { "Length of Domain Name", "pfcp.dn_len",
12857             FT_UINT16, BASE_DEC, NULL, 0x0,
12858             NULL, HFILL }
12859         },
12860         { &hf_pfcp_dn,
12861         { "Domain Name", "pfcp.dn",
12862             FT_STRING, BASE_NONE, NULL, 0x0,
12863             NULL, HFILL }
12864         },
12865         { &hf_pfcp_cp_len,
12866         { "Length of Custom PFD Content", "pfcp.cp_len",
12867             FT_UINT16, BASE_DEC, NULL, 0x0,
12868             NULL, HFILL }
12869         },
12870         { &hf_pfcp_cp,
12871         { "Custom PFD Content", "pfcp.cp",
12872             FT_BYTES, BASE_NONE, NULL, 0x0,
12873             NULL, HFILL }
12874         },
12875         { &hf_pfcp_dnp_len,
12876         { "Length of Domain Name Protocol", "pfcp.dnp_len",
12877             FT_UINT16, BASE_DEC, NULL, 0x0,
12878             NULL, HFILL }
12879         },
12880         { &hf_pfcp_dnp,
12881         { "Domain Name Protocol", "pfcp.dn",
12882             FT_STRING, BASE_NONE, NULL, 0x0,
12883             NULL, HFILL }
12884         },
12885         { &hf_pfcp_afd_len,
12886         { "Length of Additional Flow Description", "pfcp.adf_len",
12887             FT_UINT16, BASE_DEC, NULL, 0x0,
12888             NULL, HFILL }
12889         },
12890         { &hf_pfcp_aurl_len,
12891         { "Length of Additional URL", "pfcp.aurl_len",
12892             FT_UINT16, BASE_DEC, NULL, 0x0,
12893             NULL, HFILL }
12894         },
12895         { &hf_pfcp_adnp_len,
12896         { "Length of Additional Domain Name and Domain Name Protocol", "pfcp.adnp_len",
12897             FT_UINT16, BASE_DEC, NULL, 0x0,
12898             NULL, HFILL }
12899         },
12900         { &hf_pfcp_header_type,
12901         { "Header Type", "pfcp.header_type",
12902             FT_UINT8, BASE_DEC, VALS(pfcp_header_type_vals), 0x1f,
12903             NULL, HFILL }
12904         },
12905         { &hf_pfcp_hf_len,
12906         { "Length of Header Field Name", "pfcp.hf_len",
12907             FT_UINT8, BASE_DEC, NULL, 0x0,
12908             NULL, HFILL }
12909         },
12910         { &hf_pfcp_hf_name,
12911         { "Header Field Name", "pfcp.hf_name",
12912             FT_BYTES, BASE_SHOW_ASCII_PRINTABLE, NULL, 0x0,
12913             NULL, HFILL }
12914         },
12915         { &hf_pfcp_hf_val_len,
12916         { "Length of Header Field Value", "pfcp.hf_val_len",
12917             FT_UINT8, BASE_DEC, NULL, 0x0,
12918             NULL, HFILL }
12919         },
12920         { &hf_pfcp_hf_val,
12921         { "Header Field Value", "pfcp.hf_val",
12922             FT_BYTES, BASE_SHOW_ASCII_PRINTABLE, NULL, 0x0,
12923             NULL, HFILL }
12924         },
12925 
12926         { &hf_pfcp_measurement_info,
12927         { "Flags", "pfcp.measurement_info",
12928             FT_UINT8, BASE_HEX, NULL, 0x0,
12929             NULL, HFILL }
12930         },
12931         { &hf_pfcp_measurement_info_b0_mbqe,
12932         { "MBQE (Measurement Before QoS Enforcement)", "pfcp.measurement_info.fd",
12933             FT_BOOLEAN, 8, NULL, 0x01,
12934             NULL, HFILL }
12935         },
12936         { &hf_pfcp_measurement_info_b1_inam,
12937         { "INAM (Inactive Measurement)", "pfcp.measurement_info.inam",
12938             FT_BOOLEAN, 8, NULL, 0x02,
12939             NULL, HFILL }
12940         },
12941         { &hf_pfcp_measurement_info_b2_radi,
12942         { "RADI (Reduced Application Detection Information)", "pfcp.measurement_info.radi",
12943             FT_BOOLEAN, 8, NULL, 0x04,
12944             NULL, HFILL }
12945         },
12946         { &hf_pfcp_measurement_info_b3_istm,
12947         { "ISTM (Immediate Start Time Metering)", "pfcp.measurement_info.istm",
12948             FT_BOOLEAN, 8, NULL, 0x08,
12949             NULL, HFILL }
12950         },
12951         { &hf_pfcp_measurement_info_b4_mnop,
12952         { "MNOP (Measurement of Number of Packets)", "pfcp.measurement_info.mnop",
12953             FT_BOOLEAN, 8, NULL, 0x10,
12954             NULL, HFILL }
12955         },
12956         { &hf_pfcp_measurement_info_b5_sspoc,
12957         { "SSPOC (Send Start Pause of Charging)", "pfcp.measurement_info.sspoc",
12958             FT_BOOLEAN, 8, NULL, 0x20,
12959             NULL, HFILL }
12960         },
12961         { &hf_pfcp_measurement_info_b6_aspoc,
12962         { "ASPOC (Applicable for Start Pause of Charging)", "pfcp.measurement_info.aspoc",
12963             FT_BOOLEAN, 8, NULL, 0x40,
12964             NULL, HFILL }
12965         },
12966         { &hf_pfcp_measurement_info_b7_ciam,
12967         { "CIAM (Control of Inactive Measurement)", "pfcp.measurement_info.ciam",
12968             FT_BOOLEAN, 8, NULL, 0x80,
12969             NULL, HFILL }
12970         },
12971         { &hf_pfcp_node_report_type,
12972         { "Flags", "pfcp.node_report_type",
12973             FT_UINT8, BASE_HEX, NULL, 0x0,
12974             NULL, HFILL }
12975         },
12976         { &hf_pfcp_node_report_type_b0_upfr,
12977         { "UPFR (User Plane Path Failure Report)", "pfcp.node_report_type.upfr",
12978             FT_BOOLEAN, 8, NULL, 0x01,
12979             NULL, HFILL }
12980         },
12981         { &hf_pfcp_node_report_type_b1_uprr,
12982         { "UPRR (User Plane Path Recovery Report)", "pfcp.node_report_type.uprr",
12983             FT_BOOLEAN, 8, NULL, 0x02,
12984             NULL, HFILL }
12985         },
12986         { &hf_pfcp_node_report_type_b2_ckdr,
12987         { "CKDR (Clock Drift Report)", "pfcp.node_report_type.ckdr",
12988             FT_BOOLEAN, 8, NULL, 0x04,
12989             NULL, HFILL }
12990         },
12991         { &hf_pfcp_node_report_type_b3_gpqr,
12992         { "GPQR (GTP-U Path QoS Report)", "pfcp.node_report_type.gpqr",
12993             FT_BOOLEAN, 8, NULL, 0x08,
12994             NULL, HFILL }
12995         },
12996         { &hf_pfcp_remote_gtp_u_peer_flags,
12997         { "Flags", "pfcp.remote_gtp_u_peer_flags",
12998             FT_UINT8, BASE_HEX, NULL, 0x0,
12999             NULL, HFILL }
13000         },
13001         { &hf_pfcp_remote_gtp_u_peer_flags_b0_v6,
13002         { "V6 (IPv6)", "pfcp.remote_gtp_u_peer_flags.v6",
13003             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
13004             NULL, HFILL }
13005         },
13006         { &hf_pfcp_remote_gtp_u_peer_flags_b1_v4,
13007         { "V4 (IPv4)", "pfcp.remote_gtp_u_peer_flags.v4",
13008             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
13009             NULL, HFILL }
13010         },
13011         { &hf_pfcp_remote_gtp_u_peer_flags_b2_di,
13012         { "DI (Destination Interface)", "pfcp.remote_gtp_u_peer_flags.di",
13013             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
13014             NULL, HFILL }
13015         },
13016         { &hf_pfcp_remote_gtp_u_peer_flags_b3_ni,
13017         { "NI (Network Instance)", "pfcp.remote_gtp_u_peer_flags.ni",
13018             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
13019             NULL, HFILL }
13020         },
13021         { &hf_pfcp_remote_gtp_u_peer_ipv4,
13022         { "IPv4 address", "pfcp.node_id_ipv4",
13023             FT_IPv4, BASE_NONE, NULL, 0x0,
13024             NULL, HFILL }
13025         },
13026         { &hf_pfcp_remote_gtp_u_peer_ipv6,
13027         { "IPv6 address", "pfcp.node_id_ipv6",
13028             FT_IPv6, BASE_NONE, NULL, 0x0,
13029             NULL, HFILL }
13030         },
13031         { &hf_pfcp_remote_gtp_u_peer_length_di,
13032         { "Length of Destination Interface field", "pfcp.node_id_length_di",
13033             FT_UINT16, BASE_DEC, NULL, 0,
13034             NULL, HFILL }
13035         },
13036         { &hf_pfcp_remote_gtp_u_peer_length_ni,
13037         { "Length of Network Instance field", "pfcp.node_id_length_ni",
13038             FT_UINT16, BASE_DEC, NULL, 0,
13039             NULL, HFILL }
13040         },
13041         { &hf_pfcp_ur_seqn,
13042         { "UR-SEQN", "pfcp.ur_seqn",
13043             FT_UINT32, BASE_DEC, NULL, 0x0,
13044             NULL, HFILL }
13045         },
13046         { &hf_pfcp_oci_flags,
13047         { "Flags", "pfcp.oci_flags",
13048             FT_UINT8, BASE_HEX, NULL, 0x0,
13049             NULL, HFILL }
13050         },
13051         { &hf_pfcp_oci_flags_b0_aoci,
13052         { "AOCI: Associate OCI with Node ID", "pfcp.oci_flags.aoci",
13053             FT_BOOLEAN, 8, NULL, 0x01,
13054             NULL, HFILL }
13055         },
13056         { &hf_pfcp_pfcp_assoc_rel_req_flags,
13057         { "Flags", "pfcp.assoc_rel_req",
13058             FT_UINT8, BASE_HEX, NULL, 0x0,
13059             NULL, HFILL }
13060         },
13061         { &hf_pfcp_pfcp_assoc_rel_req_b0_sarr,
13062         { "SARR (PFCP Association Release Request)", "pfcp.assoc_rel_req.sarr",
13063             FT_BOOLEAN, 8, NULL, 0x01,
13064             NULL, HFILL }
13065         },
13066         { &hf_pfcp_upiri_flags,
13067         { "Flags", "pfcp.upiri_flags",
13068             FT_UINT8, BASE_HEX, NULL, 0x0,
13069             NULL, HFILL }
13070         },
13071         { &hf_pfcp_upiri_flg_b6_assosi,
13072         { "ASSOSI (Associated Source Instance)", "pfcp.upiri_flags.assosi",
13073             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x40,
13074             NULL, HFILL }
13075         },
13076         { &hf_pfcp_upiri_flg_b5_assoni,
13077         { "ASSONI (Associated Network Instance)", "pfcp.upiri_flags.assoni",
13078             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20,
13079             NULL, HFILL }
13080         },
13081         { &hf_pfcp_upiri_flg_b2b4_teidri,
13082         { "TEIDRI (TEID Range Indication)", "pfcp.upiri_flags.teidri",
13083             FT_UINT8, BASE_HEX, NULL, 0x1c,
13084             NULL, HFILL }
13085         },
13086         { &hf_pfcp_upiri_flags_b1_v6,
13087         { "V6 (IPv6)", "pfcp.upiri_flags.v6",
13088             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
13089             NULL, HFILL }
13090         },
13091         { &hf_pfcp_upiri_flags_b0_v4,
13092         { "V4 (IPv4)", "pfcp.upiri_flags.v4",
13093             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
13094             NULL, HFILL }
13095         },
13096         { &hf_pfcp_upiri_teidri,
13097         { "TEID Range Indication", "pfcp.upiri.teidri",
13098             FT_UINT8, BASE_DEC, NULL, 0x1C,
13099             NULL, HFILL }
13100         },
13101         { &hf_pfcp_upiri_teid_range,
13102         { "TEID", "pfcp.upiri.teid_range",
13103             FT_UINT32, BASE_HEX, NULL, 0x0,
13104             NULL, HFILL }
13105         },
13106         { &hf_pfcp_upiri_ipv4,
13107         { "IPv4 address", "pfcp.upiri.ipv4_addr",
13108             FT_IPv4, BASE_NONE, NULL, 0x0,
13109             NULL, HFILL }
13110         },
13111         { &hf_pfcp_upiri_ipv6,
13112         { "IPv6 address", "pfcp.upiri.ipv6_addr",
13113             FT_IPv6, BASE_NONE, NULL, 0x0,
13114             NULL, HFILL }
13115         },
13116         { &hf_pfcp_user_plane_inactivity_timer,
13117         { "User Plane Inactivity Timer", "pfcp.user_plane_inactivity_time",
13118             FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_seconds, 0,
13119             NULL, HFILL }
13120         },
13121 
13122         { &hf_pfcp_subsequent_volume_quota,
13123         { "Flags", "pfcp.subsequent_volume_quota",
13124             FT_UINT8, BASE_HEX, NULL, 0x0,
13125             NULL, HFILL }
13126         },
13127         { &hf_pfcp_subsequent_volume_quota_b0_tovol,
13128         { "TOVOL", "pfcp.subsequent_volume_quota_flags.tovol",
13129             FT_BOOLEAN, 8, NULL, 0x01,
13130             NULL, HFILL }
13131         },
13132         { &hf_pfcp_subsequent_volume_quota_b1_ulvol,
13133         { "ULVOL", "pfcp.subsequent_volume_quota_flags.ulvol",
13134             FT_BOOLEAN, 8, NULL, 0x02,
13135             NULL, HFILL }
13136         },
13137         { &hf_pfcp_subsequent_volume_quota_b2_dlvol,
13138         { "DLVOL", "pfcp.subsequent_volume_quota_flags.dlvol",
13139             FT_BOOLEAN, 8, NULL, 0x04,
13140             NULL, HFILL }
13141         },
13142         { &hf_pfcp_subsequent_volume_quota_tovol,
13143         { "Total Volume", "pfcp.subsequent_volume_quota.tovol",
13144             FT_UINT64, BASE_DEC, NULL, 0x0,
13145             NULL, HFILL }
13146         },
13147         { &hf_pfcp_subsequent_volume_quota_ulvol,
13148         { "Uplink Volume", "pfcp.subsequent_volume_quota.ulvol",
13149             FT_UINT64, BASE_DEC, NULL, 0x0,
13150             NULL, HFILL }
13151         },
13152         { &hf_pfcp_subsequent_volume_quota_dlvol,
13153         { "Downlink Volume", "pfcp.subsequent_volume_quota.dlvol",
13154             FT_UINT64, BASE_DEC, NULL, 0x0,
13155             NULL, HFILL }
13156         },
13157 
13158         { &hf_pfcp_subsequent_time_quota,
13159         { "Subsequent Time Quota", "pfcp.subsequent_time_quota",
13160             FT_UINT32, BASE_DEC, NULL, 0x0,
13161             NULL, HFILL }
13162         },
13163         { &hf_pfcp_rqi_flag,
13164         { "RQI", "pfcp.rqi_flag",
13165             FT_BOOLEAN, 8, NULL, 0x01,
13166             NULL, HFILL }
13167         },
13168         { &hf_pfcp_qfi,
13169         { "QFI", "pfcp.qfi_value",
13170             FT_UINT8, BASE_HEX, NULL, 0x7f,
13171             NULL, HFILL }
13172         },
13173         { &hf_pfcp_query_urr_reference,
13174         { "Query URR Reference", "pfcp.query_urr_reference",
13175             FT_UINT32, BASE_DEC, NULL, 0x0,
13176             NULL, HFILL }
13177         },
13178 
13179         { &hf_pfcp_additional_usage_reports_information,
13180         { "Additional Usage Reports Information", "pfcp.additional_usage_reports_information",
13181             FT_UINT16, BASE_HEX, NULL, 0x0,
13182             NULL, HFILL }
13183         },
13184         { &hf_pfcp_additional_usage_reports_information_b15_auri,
13185         { "AURI (Additional Usage Reports Indication)", "pfcp.additional_usage_reports_information_auri",
13186             FT_BOOLEAN, 16, NULL, 0x8000,
13187             NULL, HFILL }
13188         },
13189         { &hf_pfcp_additional_usage_reports_information_b14_b0_number_value,
13190         { "Number of Additional Usage Reports value", "pfcp.additional_usage_reports_information_value",
13191             FT_UINT16, BASE_DEC, NULL, 0x7FFF,
13192             NULL, HFILL }
13193         },
13194         { &hf_pfcp_traffic_endpoint_id,
13195         { "Traffic Endpoint ID", "pfcp.traffic_endpoint_id",
13196             FT_UINT8, BASE_DEC, NULL, 0x0,
13197             NULL, HFILL }
13198         },
13199 
13200         { &hf_pfcp_mac_address_flags,
13201         { "Flags", "pfcp.mac_address.flags",
13202             FT_UINT8, BASE_HEX, NULL, 0x0,
13203             NULL, HFILL }
13204         },
13205         { &hf_pfcp_mac_address_flags_b0_sour,
13206         { "SOUR", "pfcp.mac_address.flags.sour",
13207             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
13208             NULL, HFILL }
13209         },
13210         { &hf_pfcp_mac_address_flags_b1_dest,
13211         { "DEST", "pfcp.mac_address.flags.dest",
13212             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
13213             NULL, HFILL }
13214         },
13215         { &hf_pfcp_mac_address_flags_b2_usou,
13216         { "USUO", "pfcp.mac_address.flags.usuo",
13217             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
13218             NULL, HFILL }
13219         },
13220         { &hf_pfcp_mac_address_flags_b3_udes,
13221         { "UDES", "pfcp.mac_address.flags.udes",
13222             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
13223             NULL, HFILL }
13224         },
13225         { &hf_pfcp_mac_address_source_mac_address,
13226         { "Source MAC Address", "pfcp.mac_address.sour",
13227             FT_BYTES, BASE_NONE, NULL, 0x0,
13228             NULL, HFILL }
13229         },
13230         { &hf_pfcp_mac_address_dest_mac_address,
13231         { "Destination MAC Address", "pfcp.mac_address.dest",
13232             FT_BYTES, BASE_NONE, NULL, 0x0,
13233             NULL, HFILL }
13234         },
13235         { &hf_pfcp_mac_address_upper_source_mac_address,
13236         { "Upper Source MAC Address", "pfcp.mac_address.usou",
13237             FT_BYTES, BASE_NONE, NULL, 0x0,
13238             NULL, HFILL }
13239         },
13240         { &hf_pfcp_mac_address_upper_dest_mac_address,
13241         { "Upper Destination MAC Address", "pfcp.mac_address.udes",
13242             FT_BYTES, BASE_NONE, NULL, 0x0,
13243             NULL, HFILL }
13244         },
13245 
13246         { &hf_pfcp_c_tag_flags,
13247         { "Flags", "pfcp.c_tag.flags",
13248             FT_UINT8, BASE_HEX, NULL, 0x0,
13249             NULL, HFILL }
13250         },
13251         { &hf_pfcp_c_tag_flags_b0_pcp,
13252         { "PCP", "pfcp.c_tag.flags.pcp",
13253             FT_BOOLEAN, 8, NULL, 0x01,
13254             "Priority code point", HFILL }
13255         },
13256         { &hf_pfcp_c_tag_flags_b1_dei,
13257         { "DEI", "pfcp.c_tag.flags.dei",
13258             FT_BOOLEAN, 8, NULL, 0x02,
13259             "Drop eligible indicator", HFILL }
13260         },
13261         { &hf_pfcp_c_tag_flags_b2_vid,
13262         { "VID", "pfcp.c_tag.flags.vid",
13263             FT_BOOLEAN, 8, NULL, 0x04,
13264             "VLAN identifier", HFILL }
13265         },
13266         { &hf_pfcp_c_tag_cvid,
13267         { "C-VID", "pfcp.c_tag.cvid",
13268             FT_UINT16, BASE_HEX, NULL, 0x0,
13269             NULL, HFILL }
13270         },
13271         { &hf_pfcp_c_tag_dei_flag,
13272         { "Drop eligible indicator (DEI)", "pfcp.c_tag.dei_flag",
13273             FT_BOOLEAN, 8, TFS(&tfs_eligible_ineligible), 0x08,
13274             NULL, HFILL }
13275         },
13276         { &hf_pfcp_c_tag_pcp_value,
13277         { "Priority code point (PCP)", "pfcp.c_tag.pcp",
13278             FT_UINT8, BASE_DEC, VALS(pfcp_vlan_tag_pcp_vals), 0x07,
13279             NULL, HFILL }
13280         },
13281 
13282         { &hf_pfcp_s_tag_flags,
13283         { "Flags", "pfcp.s_tag.flags",
13284             FT_UINT8, BASE_HEX, NULL, 0x0,
13285             NULL, HFILL }
13286         },
13287         { &hf_pfcp_s_tag_flags_b0_pcp,
13288         { "PCP", "pfcp.s_tag.flags.pcp",
13289             FT_BOOLEAN, 8, NULL, 0x01,
13290             "Priority code point", HFILL }
13291         },
13292         { &hf_pfcp_s_tag_flags_b1_dei,
13293         { "DEI", "pfcp.s_tag.flags.dei",
13294             FT_BOOLEAN, 8, NULL, 0x02,
13295             "Drop eligible indicator", HFILL }
13296         },
13297         { &hf_pfcp_s_tag_flags_b2_vid,
13298         { "VID", "pfcp.s_tag.flags.vid",
13299             FT_BOOLEAN, 8, NULL, 0x04,
13300             "VLAN identifier", HFILL }
13301         },
13302         { &hf_pfcp_s_tag_svid,
13303         { "S-VID", "pfcp.s_tag.svid",
13304             FT_UINT16, BASE_HEX, NULL, 0x0,
13305             NULL, HFILL }
13306         },
13307         { &hf_pfcp_s_tag_dei_flag,
13308         { "Drop eligible indicator (DEI)", "pfcp.s_tag.dei_flag",
13309             FT_BOOLEAN, 8, TFS(&tfs_eligible_ineligible), 0x08,
13310             NULL, HFILL }
13311         },
13312         { &hf_pfcp_s_tag_pcp_value,
13313         { "Priority code point (PCP)", "pfcp.s_tag.pcp",
13314             FT_UINT8, BASE_DEC, VALS(pfcp_vlan_tag_pcp_vals), 0x07,
13315             NULL, HFILL }
13316         },
13317 
13318         { &hf_pfcp_ethertype,
13319         { "Ethertype", "pfcp.ethertype",
13320             FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0,
13321             NULL, HFILL }
13322         },
13323 
13324         { &hf_pfcp_proxying_flags,
13325         { "Flags", "pfcp.proxying.flags",
13326             FT_UINT8, BASE_HEX, NULL, 0x0,
13327             NULL, HFILL }
13328         },
13329         { &hf_pfcp_proxying_flags_b0_arp,
13330         { "ARP", "pfcp.proxying.flags.arp",
13331             FT_BOOLEAN, 8, NULL, 0x01,
13332             NULL, HFILL }
13333         },
13334         { &hf_pfcp_proxying_flags_b1_ins,
13335         { "INS", "pfcp.proxying.flags.ins",
13336             FT_BOOLEAN, 8, NULL, 0x02,
13337             NULL, HFILL }
13338         },
13339 
13340         { &hf_pfcp_ethertype_filter_id,
13341         { "Ethertype Filter ID", "pfcp.ethertype_filter_id",
13342             FT_UINT64, BASE_DEC, NULL, 0x0,
13343             NULL, HFILL }
13344         },
13345 
13346         { &hf_pfcp_ethertype_filter_properties_flags,
13347         { "Flags", "pfcp.ethertype_filter_properties.flags",
13348             FT_UINT8, BASE_HEX, NULL, 0x0,
13349             NULL, HFILL }
13350         },
13351         { &hf_pfcp_ethertype_filter_properties_flags_b0_bide,
13352         { "BIDE", "pfcp.ethertype_filter_properties.flags.bide",
13353             FT_BOOLEAN, 8, NULL, 0x01,
13354             NULL, HFILL }
13355         },
13356 
13357         { &hf_pfcp_suggested_buffering_packets_count_packet_count,
13358         { "Packet count", "pfcp.suggested_buffering_packets_count.packet_count",
13359             FT_UINT8, BASE_DEC, NULL, 0x0,
13360             NULL, HFILL }
13361         },
13362 
13363         { &hf_pfcp_user_id_flags,
13364         { "Flags", "pfcp.user_id.flags",
13365             FT_UINT8, BASE_HEX, NULL, 0x0,
13366             NULL, HFILL }
13367         },
13368         { &hf_pfcp_user_id_flags_b0_imsif,
13369         { "IMSIF", "pfcp.user_id.flags.imsif",
13370             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
13371             NULL, HFILL }
13372         },
13373         { &hf_pfcp_user_id_flags_b1_imeif,
13374         { "IMEIF", "pfcp.user_id.flags.imeif",
13375             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
13376             NULL, HFILL }
13377         },
13378         { &hf_pfcp_user_id_flags_b2_msisdnf,
13379         { "MSISDNF", "pfcp.user_id.flags.msisdnf",
13380             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
13381             NULL, HFILL }
13382         },
13383         { &hf_pfcp_user_id_flags_b3_naif,
13384         { "NAIF", "pfcp.user_id.flags.naif",
13385             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
13386             NULL, HFILL }
13387         },
13388         { &hf_pfcp_user_id_flags_b4_supif,
13389         { "SUPIF", "pfcp.user_id.flags.supif",
13390             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10,
13391             NULL, HFILL }
13392         },
13393         { &hf_pfcp_user_id_flags_b5_gpsif,
13394         { "GPSIF", "pfcp.user_id.flags.gpsif",
13395             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20,
13396             NULL, HFILL }
13397         },
13398         { &hf_pfcp_user_id_flags_b6_peif,
13399         { "PEIF", "pfcp.user_id.flags.peif",
13400             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x40,
13401             NULL, HFILL }
13402         },
13403 
13404         { &hf_pfcp_user_id_length_of_imsi,
13405         { "Length of IMSI", "pfcp.user_id.length_of_imsi",
13406             FT_UINT8, BASE_DEC, NULL, 0x0,
13407             NULL, HFILL }
13408         },
13409         { &hf_pfcp_user_id_length_of_imei,
13410         { "Length of IMEI", "pfcp.user_id.length_of_imei",
13411             FT_UINT8, BASE_DEC, NULL, 0x0,
13412             NULL, HFILL }
13413         },
13414         { &hf_pfcp_user_id_imei,
13415         { "IMEI", "pfcp.user_id.imei",
13416             FT_STRING, BASE_NONE, NULL, 0,
13417             NULL, HFILL }
13418         },
13419         { &hf_pfcp_user_id_length_of_msisdn,
13420         { "Length of MSISDN", "pfcp.user_id.length_of_msisdn",
13421             FT_UINT8, BASE_DEC, NULL, 0x0,
13422             NULL, HFILL }
13423         },
13424         { &hf_pfcp_user_id_length_of_nai,
13425         { "Length of NAI", "pfcp.user_id.length_of_nai",
13426             FT_UINT8, BASE_DEC, NULL, 0x0,
13427             NULL, HFILL }
13428         },
13429         { &hf_pfcp_user_id_nai,
13430         { "NAI", "pfcp.user_id.nai",
13431             FT_STRING, BASE_NONE, NULL, 0x0,
13432             NULL, HFILL }
13433         },
13434         { &hf_pfcp_user_id_length_of_supi,
13435         { "Length of SUPI", "pfcp.user_id.length_of_supi",
13436             FT_UINT8, BASE_DEC, NULL, 0x0,
13437             NULL, HFILL }
13438         },
13439         { &hf_pfcp_user_id_supi,
13440         { "SUPI", "pfcp.user_id.supi",
13441             FT_STRING, BASE_NONE, NULL, 0x0,
13442             NULL, HFILL }
13443         },
13444         { &hf_pfcp_user_id_length_of_gpsi,
13445         { "Length of GPSI", "pfcp.user_id.length_of_gpsi",
13446             FT_UINT8, BASE_DEC, NULL, 0x0,
13447             NULL, HFILL }
13448         },
13449         { &hf_pfcp_user_id_gpsi,
13450         { "GPSI", "pfcp.user_id.gpsi",
13451             FT_STRING, BASE_NONE, NULL, 0x0,
13452             NULL, HFILL }
13453         },
13454         { &hf_pfcp_user_id_length_of_pei,
13455         { "Length of PEI", "pfcp.user_id.length_of_pei",
13456             FT_UINT8, BASE_DEC, NULL, 0x0,
13457             NULL, HFILL }
13458         },
13459         { &hf_pfcp_user_id_pei,
13460         { "PEI", "pfcp.user_id.pei",
13461             FT_STRING, BASE_NONE, NULL, 0x0,
13462             NULL, HFILL }
13463         },
13464 
13465 
13466         { &hf_pfcp_ethernet_pdu_session_information_flags,
13467         { "Flags", "pfcp.ethernet_pdu_session_information.flags",
13468             FT_UINT8, BASE_HEX, NULL, 0x0,
13469             NULL, HFILL }
13470         },
13471         { &hf_pfcp_ethernet_pdu_session_information_flags_b0_ethi,
13472         { "IMSIF", "pfcp.ethernet_pdu_session_information.flags.ethi",
13473             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
13474             NULL, HFILL }
13475         },
13476 
13477         { &hf_pfcp_mac_addresses_detected_number_of_mac_addresses,
13478         { "Number of MAC addresses", "pfcp.mac_addresses_detected.number_of_mac_addresses",
13479             FT_UINT8, BASE_DEC, NULL, 0x0,
13480             NULL, HFILL }
13481         },
13482         { &hf_pfcp_mac_addresses_detected_mac_address,
13483         { "MAC Address", "pfcp.mac_addresses_detected.mac_address",
13484             FT_BYTES, BASE_NONE, NULL, 0x0,
13485             NULL, HFILL }
13486         },
13487         { &hf_pfcp_mac_addresses_detected_length_of_ctag,
13488         { "Length of C-TAG", "pfcp.mac_addresses_detected.length_of_ctag",
13489             FT_UINT8, BASE_DEC, NULL, 0x0,
13490             NULL, HFILL }
13491         },
13492         { &hf_pfcp_mac_addresses_detected_length_of_stag,
13493         { "Length of S-TAG", "pfcp.mac_addresses_detected.length_of_stag",
13494             FT_UINT8, BASE_DEC, NULL, 0x0,
13495             NULL, HFILL }
13496         },
13497 
13498         { &hf_pfcp_mac_addresses_removed_number_of_mac_addresses,
13499         { "Number of MAC addresses", "pfcp.mac_addresses_removed.number_of_mac_address",
13500             FT_UINT8, BASE_DEC, NULL, 0x0,
13501             NULL, HFILL }
13502         },
13503         { &hf_pfcp_mac_addresses_removed_mac_address,
13504         { "MAC Address", "pfcp.mac_addresses_removed.mac_addresses",
13505             FT_BYTES, BASE_NONE, NULL, 0x0,
13506             NULL, HFILL }
13507         },
13508         { &hf_pfcp_mac_addresses_removed_length_of_ctag,
13509         { "Length of C-TAG", "pfcp.mac_addresses_removed.length_of_ctag",
13510             FT_UINT8, BASE_DEC, NULL, 0x0,
13511             NULL, HFILL }
13512         },
13513         { &hf_pfcp_mac_addresses_removed_length_of_stag,
13514         { "Length of S-TAG", "pfcp.mac_addresses_removed.length_of_stag",
13515             FT_UINT8, BASE_DEC, NULL, 0x0,
13516             NULL, HFILL }
13517         },
13518 
13519         { &hf_pfcp_ethernet_inactivity_timer,
13520         { "Ethernet Inactivity Timer", "pfcp.ethernet",
13521             FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_seconds, 0,
13522             NULL, HFILL }
13523         },
13524 
13525         { &hf_pfcp_subsequent_event_quota,
13526         { "Subsequent Event Quota", "pfcp.subsequent_event_quota",
13527             FT_UINT32, BASE_DEC, NULL, 0,
13528             NULL, HFILL }
13529         },
13530 
13531         { &hf_pfcp_subsequent_event_threshold,
13532         { "Subsequent Event Threshold", "pfcp.subsequent_event_threshold",
13533             FT_UINT32, BASE_DEC, NULL, 0,
13534             NULL, HFILL }
13535         },
13536 
13537         { &hf_pfcp_trace_information_trace_id,
13538         { "Trace ID", "pfcp.trace_information.traceid",
13539             FT_UINT24, BASE_DEC, NULL, 0,
13540             NULL, HFILL }
13541         },
13542         { &hf_pfcp_trace_information_length_trigger_events,
13543         { "Length of Trigger Events", "pfcp.trace_information.length_trigger_events",
13544             FT_UINT8, BASE_DEC, NULL, 0,
13545             NULL, HFILL }
13546         },
13547         { &hf_pfcp_trace_information_trigger_events,
13548         { "Trigger Events", "pfcp.trace_information.trigger_events",
13549             FT_BYTES, BASE_NONE, NULL, 0x0,
13550             NULL, HFILL }
13551         },
13552         { &hf_pfcp_trace_information_session_trace_depth,
13553         { "Session Trace Depth", "pfcp.trace_information.session_trace_depth",
13554             FT_UINT8, BASE_DEC, NULL, 0,
13555             NULL, HFILL }
13556         },
13557         { &hf_pfcp_trace_information_length_list_interfaces,
13558         { "Length of List of Interfaces", "pfcp.trace_information.length_list_interfaces",
13559             FT_UINT8, BASE_DEC, NULL, 0,
13560             NULL, HFILL }
13561         },
13562         { &hf_pfcp_trace_information_list_interfaces,
13563         { "List of Interfaces", "pfcp.trace_information.list_interfaces",
13564             FT_BYTES, BASE_NONE, NULL, 0x0,
13565             NULL, HFILL }
13566         },
13567         { &hf_pfcp_trace_information_length_ipaddress,
13568         { "Length of IP Address", "pfcp.trace_information.length_ipaddress",
13569             FT_UINT8, BASE_DEC, NULL, 0,
13570             NULL, HFILL }
13571         },
13572         { &hf_pfcp_trace_information_ipv4,
13573         { "IP Address of Trace Collection Entity", "pfcp.trace_information.ipv4",
13574             FT_IPv4, BASE_NONE, NULL, 0x0,
13575             NULL, HFILL }
13576         },
13577         { &hf_pfcp_trace_information_ipv6,
13578         { "IP Address of Trace Collection Entity", "pfcp.trace_information.ipv6",
13579             FT_IPv6, BASE_NONE, NULL, 0x0,
13580             NULL, HFILL }
13581         },
13582 
13583         { &hf_pfcp_framed_route,
13584         { "Framed-Route", "pfcp.framed_route",
13585             FT_STRING, BASE_NONE, NULL, 0x0,
13586             NULL, HFILL }
13587         },
13588         { &hf_pfcp_framed_routing,
13589         { "Framed-Routing", "pfcp.framed_routing",
13590             FT_BYTES, BASE_NONE, NULL, 0x0,
13591             NULL, HFILL }
13592         },
13593         { &hf_pfcp_framed_ipv6_route,
13594         { "Framed-IPv6-Route", "pfcp.framed_ipv6_route",
13595             FT_STRING, BASE_NONE, NULL, 0x0,
13596             NULL, HFILL }
13597         },
13598 
13599         { &hf_pfcp_event_quota,
13600         { "Event Quota", "pfcp.event_quota",
13601             FT_UINT32, BASE_DEC, NULL, 0,
13602             NULL, HFILL }
13603         },
13604 
13605         { &hf_pfcp_event_threshold,
13606         { "Event Threshold", "pfcp.event_threshold",
13607             FT_UINT32, BASE_DEC, NULL, 0,
13608             NULL, HFILL }
13609         },
13610 
13611         { &hf_pfcp_time_stamp,
13612         { "Time Stamp", "pfcp.time_stamp",
13613             FT_ABSOLUTE_TIME, ABSOLUTE_TIME_NTP_UTC, NULL, 0,
13614             NULL, HFILL }
13615         },
13616 
13617         { &hf_pfcp_averaging_window,
13618         { "Averaging Window", "pfcp.averaging_window",
13619             FT_UINT32, BASE_DEC, NULL, 0,
13620             NULL, HFILL }
13621         },
13622 
13623         { &hf_pfcp_paging_policy_indicator,
13624         { "Paging Policy Indicator (PPI)", "pfcp.ppi",
13625             FT_UINT8, BASE_DEC, NULL, 0x7,
13626             NULL, HFILL }
13627         },
13628         { &hf_pfcp_apn_dnn,
13629         { "APN/DNN", "pfcp.apn_dnn",
13630             FT_STRING, BASE_NONE, NULL, 0x0,
13631             NULL, HFILL }
13632         },
13633         { &hf_pfcp_tgpp_interface_type,
13634         { "3GPP Interface Type", "pfcp.tgpp_interface_type",
13635             FT_UINT8, BASE_DEC, VALS(pfcp_tgpp_interface_type_vals), 0x3f,
13636             NULL, HFILL }
13637         },
13638 
13639         { &hf_pfcp_pfcpsrreq_flags,
13640         { "Flags", "pfcp.srreq_flags",
13641             FT_UINT8, BASE_HEX, NULL, 0x0,
13642             NULL, HFILL }
13643         },
13644         { &hf_pfcp_pfcpsrreq_flags_b0_psdbu,
13645         { "PSDBU (PFCP Session Deleted By the UP function)", "pfcp.srreq_flags.psdbu",
13646             FT_BOOLEAN, 8, NULL, 0x01,
13647             NULL, HFILL }
13648         },
13649 
13650         { &hf_pfcp_pfcpaureq_flags,
13651         { "Flags", "pfcp.aureq_flags",
13652             FT_UINT8, BASE_HEX, NULL, 0x0,
13653             NULL, HFILL }
13654         },
13655         { &hf_pfcp_pfcpaureq_flags_b0_parps,
13656         { "PARPBS (PFCP Association Release Preparation Start)", "pfcp.aureq_flags.parps",
13657             FT_BOOLEAN, 8, NULL, 0x01,
13658             NULL, HFILL }
13659         },
13660 
13661         { &hf_pfcp_activation_time,
13662         { "Activation Time", "pfcp.activation_time",
13663             FT_ABSOLUTE_TIME, ABSOLUTE_TIME_NTP_UTC, NULL, 0,
13664             NULL, HFILL }
13665         },
13666         { &hf_pfcp_deactivation_time,
13667         { "Deactivation Time", "pfcp.deactivation_time",
13668             FT_ABSOLUTE_TIME, ABSOLUTE_TIME_NTP_UTC, NULL, 0,
13669             NULL, HFILL }
13670         },
13671 
13672         { &hf_pfcp_mar_id,
13673         { "MAR ID", "pfcp.mar_id",
13674             FT_UINT16, BASE_DEC, NULL, 0x0,
13675             NULL, HFILL }
13676         },
13677 
13678         { &hf_pfcp_steering_functionality,
13679         { "Steering Functionality", "pfcp.steering_functionality",
13680             FT_UINT8, BASE_DEC, VALS(pfcp_steering_functionality_vals), 0xF,
13681             NULL, HFILL }
13682         },
13683         { &hf_pfcp_steering_mode,
13684         { "Steering Mode", "pfcp.steering_mode",
13685             FT_UINT8, BASE_DEC, VALS(pfcp_steering_mode_vals), 0xF,
13686             NULL, HFILL }
13687         },
13688 
13689         { &hf_pfcp_weight,
13690         { "Weight", "pfcp.weight",
13691             FT_UINT8, BASE_DEC, NULL, 0x0,
13692             NULL, HFILL }
13693         },
13694         { &hf_pfcp_priority,
13695         { "Priority", "pfcp.priority",
13696             FT_UINT8, BASE_DEC, VALS(pfcp_priority_vals), 0xF,
13697             NULL, HFILL }
13698         },
13699 
13700         { &hf_pfcp_ue_ip_address_pool_length,
13701         { "UE IP address Pool Identity Length", "pfcp.ue_ip_address_pool_length",
13702             FT_UINT16, BASE_DEC, NULL, 0x0,
13703             NULL, HFILL }
13704         },
13705         { &hf_pfcp_ue_ip_address_pool_identity,
13706         { "UE IP address Pool Identity", "pfcp.ue_ip_address_pool_identity",
13707             FT_BYTES, BASE_SHOW_ASCII_PRINTABLE, NULL, 0x0,
13708             NULL, HFILL }
13709         },
13710 
13711 
13712         { &hf_pfcp_pfcp_alternative_smf_ip_address_flags,
13713         { "Flags", "pfcp.alternative_smf_ip_address",
13714             FT_UINT8, BASE_HEX, NULL, 0x0,
13715             NULL, HFILL }
13716         },
13717         { &hf_pfcp_alternative_smf_ip_address_ipv4,
13718         { "IPv4 address", "pfcp.alternative_smf_ip_address.ipv4",
13719             FT_IPv4, BASE_NONE, NULL, 0x0,
13720             NULL, HFILL }
13721         },
13722         { &hf_pfcp_alternative_smf_ip_address_ipv6,
13723         { "IPv6 address", "pfcp.alternative_smf_ip_address.ipv6",
13724             FT_IPv6, BASE_NONE, NULL, 0x0,
13725             NULL, HFILL }
13726         },
13727 
13728         { &hf_pfcp_packet_replication_and_detection_carry_on_information_flags,
13729         { "Flags", "pfcp.hf_pfcp_packet_replication_and_detection_carry_on_information.flags",
13730             FT_UINT8, BASE_HEX, NULL, 0x0,
13731             NULL, HFILL }
13732         },
13733         { &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b0_priueai,
13734         { "PRIUEAI (Packet Replication Information – UE/PDU Session Address Indication)", "pfcp.packet_replication_and_detection_carry_on_information.flags.priueai",
13735             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
13736             NULL, HFILL }
13737         },
13738         { &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b1_prin19i,
13739         { "PRIN19I (Packet Replication Information - N19 Indication)", "pfcp.packet_replication_and_detection_carry_on_information.flags.prin19i",
13740             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
13741             NULL, HFILL }
13742         },
13743         { &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b2_prin6i,
13744         { "PRIN6I (Packet Replication Information - N6 Indication)", "pfcp.packet_replication_and_detection_carry_on_information.flags.prin6i",
13745             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
13746             NULL, HFILL }
13747         },
13748         { &hf_pfcp_packet_replication_and_detection_carry_on_information_flags_b3_dcaroni,
13749         { "DCARONI (Detection Carry-On Indication)", "pfcp.packet_replication_and_detection_carry_on_information.flags.dcaroni",
13750             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
13751             NULL, HFILL }
13752         },
13753 
13754         { &hf_pfcp_validity_time_value,
13755         { "Validity Time value", "pfcp.validity_time_value",
13756             FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_seconds, 0x0,
13757             NULL, HFILL }
13758         },
13759 
13760         { &hf_pfcp_number_of_reports,
13761         { "Number of Reports", "pfcp.number_of_reports",
13762             FT_UINT16, BASE_DEC, NULL, 0x0,
13763             NULL, HFILL }
13764         },
13765 
13766         { &hf_pfcp_pfcpasrsp_flags_flags,
13767         { "Flags", "pfcp.pfcpasrsp_flags.flags",
13768             FT_UINT8, BASE_HEX, NULL, 0x0,
13769             NULL, HFILL }
13770         },
13771         { &hf_pfcp_pfcpasrsp_flags_flags_b0_psrei,
13772         { "PSREI (PFCP Session Retained Indication)", "pfcp.asrsp_flags.flags.psrei",
13773             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
13774             NULL, HFILL }
13775         },
13776         { &hf_pfcp_pfcpasrsp_flags_flags_b1_uupsi,
13777         { "UUPSI (UPF configured for IPUPS indication)", "pfcp.asrsp_flags.flags.uupsi",
13778             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
13779             NULL, HFILL }
13780         },
13781 
13782         { &hf_pfcp_cp_pfcp_entity_ip_address_flags,
13783         { "Flags", "pfcp.cp_pfcp_entity_ip_address",
13784             FT_UINT8, BASE_HEX, NULL, 0x0,
13785             NULL, HFILL }
13786         },
13787         { &hf_pfcp_cp_pfcp_entity_ip_address_ipv4,
13788         { "IPv4 address", "pfcp.cp_pfcp_entity_ip_address.ipv4",
13789             FT_IPv4, BASE_NONE, NULL, 0x0,
13790             NULL, HFILL }
13791         },
13792         { &hf_pfcp_cp_pfcp_entity_ip_address_ipv6,
13793         { "IPv6 address", "pfcp.cp_pfcp_entity_ip_address.ipv6",
13794             FT_IPv6, BASE_NONE, NULL, 0x0,
13795             NULL, HFILL }
13796         },
13797 
13798         { &hf_pfcp_pfcpsereq_flags_flags,
13799         { "Flags", "pfcp.pfcpsereq_flags.flags",
13800             FT_UINT8, BASE_HEX, NULL, 0x0,
13801             NULL, HFILL }
13802         },
13803         { &hf_pfcp_pfcpsereq_flags_flags_b0_resti,
13804         { "RESTI (Restoration Indication)", "pfcp.sereq_flags.flags.resti",
13805             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
13806             NULL, HFILL }
13807         },
13808         { &hf_pfcp_pfcpsereq_flags_flags_b1_sumpc,
13809         { "SUMPC (Stop of Measurement of Pause of Charging)", "pfcp.sereq_flags.flags.sumpc",
13810             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
13811             NULL, HFILL }
13812         },
13813 
13814         { &hf_pfcp_ip_multicast_address_flags,
13815         { "Flags", "pfcp.ip_multicast_address.flags",
13816             FT_UINT8, BASE_HEX, NULL, 0x0,
13817             NULL, HFILL }
13818         },
13819         { &hf_pfcp_ip_multicast_address_flags_b2_range,
13820         { "RANGE", "pfcp.ip_multicast_address.flags.range",
13821             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
13822             NULL, HFILL }
13823         },
13824         { &hf_pfcp_ip_multicast_address_flags_b3_any,
13825         { "ANY", "pfcp.ip_multicast_address.flags.any",
13826             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
13827             NULL, HFILL }
13828         },
13829         { &hf_pfcp_ip_multicast_address_start_ipv4,
13830         { "(Start) IPv4 address", "pfcp.ip_multicast_address.start_ipv4",
13831             FT_IPv4, BASE_NONE, NULL, 0x0,
13832             NULL, HFILL }
13833         },
13834         { &hf_pfcp_ip_multicast_address_start_ipv6,
13835         { "(Start) IPv6 address", "pfcp.ip_multicast_address.start_ipv6",
13836             FT_IPv6, BASE_NONE, NULL, 0x0,
13837             NULL, HFILL }
13838         },
13839         { &hf_pfcp_ip_multicast_address_end_ipv4,
13840         { "(End) IPv4 address", "pfcp.ip_multicast_address.end_ipv4",
13841             FT_IPv4, BASE_NONE, NULL, 0x0,
13842             NULL, HFILL }
13843         },
13844         { &hf_pfcp_ip_multicast_address_end_ipv6,
13845         { "(End) IPv6 address", "pfcp.ip_multicast_address.end_ipv6",
13846             FT_IPv6, BASE_NONE, NULL, 0x0,
13847             NULL, HFILL }
13848         },
13849 
13850         { &hf_pfcp_source_ip_address_flags,
13851         { "Flags", "pfcp.source_ip_address.flags",
13852             FT_UINT8, BASE_HEX, NULL, 0x0,
13853             NULL, HFILL }
13854         },
13855         { &hf_pfcp_source_ip_address_flags_b2_mpl,
13856         { "MPL (Mask/Prefix Length)", "pfcp.source_ip_address.flags.mpl",
13857             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
13858             NULL, HFILL }
13859         },
13860         { &hf_pfcp_source_ip_address_ipv4,
13861         { "IPv4 address", "pfcp.source_ip_address.ipv4",
13862             FT_IPv4, BASE_NONE, NULL, 0x0,
13863             NULL, HFILL }
13864         },
13865         { &hf_pfcp_source_ip_address_ipv6,
13866         { "IPv6 address", "pfcp.source_ip_address.ipv6",
13867             FT_IPv6, BASE_NONE, NULL, 0x0,
13868             NULL, HFILL }
13869         },
13870         { &hf_pfcp_source_ip_address_mask_prefix_lengt,
13871         { "Mask/Prefix Length", "pfcp.source_ip_address.mpl",
13872             FT_UINT8, BASE_DEC, NULL, 0x0,
13873             NULL, HFILL }
13874         },
13875 
13876         { &hf_pfcp_packet_rate_status_flags,
13877         { "Flags", "pfcp.packet_rate_status.flags",
13878             FT_UINT8, BASE_HEX, NULL, 0x0,
13879             NULL, HFILL }
13880         },
13881         { &hf_pfcp_packet_rate_status_flags_b0_ul,
13882         { "UL", "pfcp.packet_rate_status.flags.ul",
13883             FT_BOOLEAN, 8, NULL, 0x01,
13884             NULL, HFILL }
13885         },
13886         { &hf_pfcp_packet_rate_status_flags_b1_dl,
13887         { "DL", "pfcp.packet_rate_status.flags.dl",
13888             FT_BOOLEAN, 8, NULL, 0x02,
13889             NULL, HFILL }
13890         },
13891         { &hf_pfcp_packet_rate_status_flags_b2_apr,
13892         { "APR", "pfcp.packet_rate_status.flags.apr",
13893             FT_BOOLEAN, 8, NULL, 0x04,
13894             NULL, HFILL }
13895         },
13896         { &hf_pfcp_packet_rate_status_ul,
13897         { "UL (remaining uplink packet limit)", "pfcp.packet_rate_status.tovol",
13898             FT_UINT16, BASE_DEC, NULL, 0x0,
13899             NULL, HFILL }
13900         },
13901         { &hf_pfcp_packet_rate_status_dl,
13902         { "DL (remaining downlink packet limit)", "pfcp.packet_rate_status.ulvol",
13903             FT_UINT16, BASE_DEC, NULL, 0x0,
13904             NULL, HFILL }
13905         },
13906         { &hf_pfcp_packet_rate_status_apr_ul,
13907         { "Additional UL (remaining uplink packet limit)", "pfcp.packet_rate_status.apr_tovol",
13908             FT_UINT16, BASE_DEC, NULL, 0x0,
13909             NULL, HFILL }
13910         },
13911         { &hf_pfcp_packet_rate_status_apr_dl,
13912         { "Additional DL (remaining downlink packet limit)", "pfcp.packet_rate_status.apr_ulvol",
13913             FT_UINT16, BASE_DEC, NULL, 0x0,
13914             NULL, HFILL }
13915         },
13916         { &hf_pfcp_packet_rate_status_validity_time,
13917         { "Validity Time value", "pfcp.packet_rate_status.validity_time",
13918             FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_seconds, 0x0,
13919             NULL, HFILL }
13920         },
13921 
13922         { &hf_pfcp_create_bridge_info_for_tsc_flags,
13923         { "Flags", "pfcp.create_bridge_info_for_tsc.flags",
13924             FT_UINT8, BASE_HEX, NULL, 0x0,
13925             NULL, HFILL }
13926         },
13927         { &hf_pfcp_create_bridge_info_for_tsc_flags_b0_bii,
13928         { "BII (Bridge Information Indication)", "pfcp.create_bridge_info_for_tsc.flags.bii",
13929             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
13930             NULL, HFILL }
13931         },
13932 
13933         { &hf_pfcp_ds_tt_port_number,
13934         { "DS-TT Port Number value", "pfcp.ds_tt_port_number",
13935             FT_UINT32, BASE_DEC, NULL, 0x0,
13936             NULL, HFILL }
13937         },
13938 
13939         { &hf_pfcp_nw_tt_port_number,
13940         { "NW-TT Port Number value", "pfcp.nw_tt_port_number",
13941             FT_UINT32, BASE_DEC, NULL, 0x0,
13942             NULL, HFILL }
13943         },
13944 
13945         { &hf_pfcp_5gs_user_plane_node_flags,
13946         { "Flags", "pfcp.5gs_user_plane_node.flags",
13947             FT_UINT8, BASE_HEX, NULL, 0x0,
13948             NULL, HFILL }
13949         },
13950         { &hf_pfcp_5gs_user_plane_node_flags_b0_bid,
13951         { "BID", "pfcp.5gs_user_plane_node.flags.sour",
13952             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
13953             NULL, HFILL }
13954         },
13955         { &hf_pfcp_5gs_user_plane_node_value,
13956         { "Use Plane Node value", "pfcp.5gs_user_plane_node.value",
13957             FT_BYTES, BASE_NONE, NULL, 0x0,
13958             NULL, HFILL }
13959         },
13960 
13961         { &hf_pfcp_port_management_information,
13962         { "Port Management Information", "pfcp.port_management_information",
13963             FT_BYTES, BASE_NONE, NULL, 0x0,
13964             NULL, HFILL }
13965         },
13966 
13967         { &hf_pfcp_requested_clock_drift_control_information_flags,
13968         { "Flags", "pfcp.requested_clock_drift_control_information.flags",
13969             FT_UINT8, BASE_HEX, NULL, 0x0,
13970             NULL, HFILL }
13971         },
13972         { &hf_pfcp_requested_clock_drift_control_information_flags_b0_rrto,
13973         { "RRTO (Request to Report Time Offset)", "pfcp.requested_clock_drift_control_information.flags.rrto",
13974             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
13975             NULL, HFILL }
13976         },
13977         { &hf_pfcp_requested_clock_drift_control_information_flags_b1_rrcr,
13978         { "RRCR (Request to Report Cumulative RateRatio)", "pfcp.requested_clock_drift_control_information.flags.rrcr",
13979             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
13980             NULL, HFILL }
13981         },
13982 
13983         { &hf_pfcp_time_domain_number_value,
13984         { "Time Domain Number value", "pfcp.time_domain_number_value",
13985             FT_UINT8, BASE_DEC, NULL, 0x0,
13986             NULL, HFILL }
13987         },
13988 
13989         { &hf_pfcp_time_offset_threshold,
13990         { "Time Offset Threshold", "pfcp.time_offset_threshold",
13991             FT_UINT64, BASE_DEC, NULL, 0x0,
13992             NULL, HFILL }
13993         },
13994 
13995         { &hf_pfcp_cumulative_rate_ratio_threshold,
13996         { "Cumulative rateRatio Threshold", "pfcp.cumulative_rate_ratio_threshold",
13997             FT_UINT32, BASE_DEC, NULL, 0x0,
13998             NULL, HFILL }
13999         },
14000 
14001 
14002         { &hf_pfcp_time_offset_measurement,
14003         { "Time Offset Measurement", "pfcp.time_offset_measurement",
14004             FT_UINT64, BASE_DEC, NULL, 0x0,
14005             NULL, HFILL }
14006         },
14007 
14008         { &hf_pfcp_cumulative_rate_ratio_measurement,
14009         { "Cumulative rateRatio Measurement", "pfcp.cumulative_rate_ratio_measurement",
14010             FT_UINT32, BASE_DEC, NULL, 0x0,
14011             NULL, HFILL }
14012         },
14013 
14014         { &hf_pfcp_srr_id,
14015         { "SRR ID value", "pfcp.srr_id_value",
14016             FT_UINT8, BASE_DEC, NULL, 0x0,
14017             NULL, HFILL }
14018         },
14019 
14020         { &hf_pfcp_requested_access_availability_control_information_flags,
14021         { "Flags", "pfcp.requested_access_availability_control_information.flags",
14022             FT_UINT8, BASE_HEX, NULL, 0x0,
14023             NULL, HFILL }
14024         },
14025         { &hf_pfcp_requested_access_availability_control_information_flags_b0_rrca,
14026         { "RRCA (Request to Report Change in Access availability)", "pfcp.requested_access_availability_control_information.flags.rrca",
14027             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14028             NULL, HFILL }
14029         },
14030 
14031         { &hf_pfcp_availability_type,
14032         { "Failed Rule ID Type", "pfcp.failed_rule_id_type",
14033             FT_UINT8, BASE_DEC, VALS(pfcp_availability_status_vals), 0xC,
14034             NULL, HFILL }
14035         },
14036         { &hf_pfcp_availability_status,
14037         { "Failed Rule ID Type", "pfcp.failed_rule_id_type",
14038             FT_UINT8, BASE_DEC, VALS(pfcp_availability_type_vals), 0x3,
14039             NULL, HFILL }
14040         },
14041 
14042         { &hf_pfcp_mptcp_control_information_flags,
14043         { "Flags", "pfcp.mptcp_control_information.flags",
14044             FT_UINT8, BASE_HEX, NULL, 0x0,
14045             NULL, HFILL }
14046         },
14047         { &hf_pfcp_mptcp_control_information_flags_b0_tci,
14048         { "TCI (Transport Converter Indication)", "pfcp.mptcp_control_information.flags.tci",
14049             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14050             NULL, HFILL }
14051         },
14052 
14053         { &hf_pfcp_atsss_ll_control_information_flags,
14054         { "Flags", "pfcp.atsss_ll_control_information.flags",
14055             FT_UINT8, BASE_HEX, NULL, 0x0,
14056             NULL, HFILL }
14057         },
14058         { &hf_pfcp_atsss_ll_control_information_flags_b0_lli,
14059         { "LLI: ATSSS-LL steering functionality is required", "pfcp.atsss_ll_control_information.flags.lli",
14060             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14061             NULL, HFILL }
14062         },
14063 
14064         { &hf_pfcp_pmf_control_information_flags,
14065         { "Flags", "pfcp.atsss_ll_control_information.flags",
14066             FT_UINT8, BASE_HEX, NULL, 0x0,
14067             NULL, HFILL }
14068         },
14069         { &hf_pfcp_pmf_control_information_flags_b0_pmfi,
14070         { "PMFI (PMF functionality is required)", "pfcp.pmf_control_information.flags.pmfi",
14071             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14072             NULL, HFILL }
14073         },
14074         { &hf_pfcp_pmf_control_information_flags_b1_drtti,
14075         { "DRTTI (Disallow PMF RTT Indication)", "pfcp.pmf_control_information.flags.drtti",
14076             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14077             NULL, HFILL }
14078         },
14079         { &hf_pfcp_pmf_control_information_flags_b2_pqpm,
14080         { "PQPM (Per Qos flow Performance Measurement indication)", "pfcp.pmf_control_information.flags.pqpm",
14081             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
14082             NULL, HFILL }
14083         },
14084         { &hf_pfcp_pmf_control_information_number_of_qfi,
14085         { "Number of QFI", "pfcp.pmf_control_information.number_of_qfi",
14086             FT_UINT8, BASE_DEC, NULL, 0x0,
14087             NULL, HFILL }
14088         },
14089 
14090         { &hf_pfcp_mptcp_address_information_flags,
14091         { "Flags", "pfcp.mptcp_ip_address_information.flags",
14092             FT_UINT8, BASE_HEX, NULL, 0x0,
14093             NULL, HFILL }
14094         },
14095         { &hf_pfcp_mptcp_address_information_flags_b0_v4,
14096         { "V4", "pfcp.mptcp_ip_address_information.flags.v4",
14097             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14098             NULL, HFILL }
14099         },
14100         { &hf_pfcp_mptcp_address_information_flags_b1_v6,
14101         { "V6", "pfcp.mptcp_ip_address_information.flags.v6",
14102             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14103             NULL, HFILL }
14104         },
14105         { &hf_pfcp_mptcp_proxy_type,
14106         { "MPTCP proxy type", "pfcp.mptcp_proxy.type",
14107             FT_BYTES, BASE_NONE, NULL, 0x0,
14108             NULL, HFILL }
14109         },
14110         { &hf_pfcp_mptcp_proxy_port,
14111         { "MPTCP proxy port", "pfcp.mptcp_proxy.port",
14112             FT_UINT16, BASE_DEC, NULL, 0x0,
14113             NULL, HFILL }
14114         },
14115         { &hf_pfcp_mptcp_proxy_ip_address_ipv4,
14116         { "MPTCP proxy IPv4 address", "pfcp.mptcp_proxy.ipv4",
14117             FT_IPv4, BASE_NONE, NULL, 0x0,
14118             NULL, HFILL }
14119         },
14120         { &hf_pfcp_mptcp_proxy_ip_address_ipv6,
14121         { "MPTCP proxy IPv6 address", "pfcp.mptcp_proxy.ipv6",
14122             FT_IPv6, BASE_NONE, NULL, 0x0,
14123             NULL, HFILL }
14124         },
14125 
14126         { &hf_pfcp_ue_link_specific_ip_address_flags,
14127         { "Flags", "pfcp.ue_link_specific_ip_address.flags",
14128             FT_UINT8, BASE_HEX, NULL, 0x0,
14129             NULL, HFILL }
14130         },
14131         { &hf_pfcp_ue_link_specific_ip_address_flags_b0_v4,
14132         { "V4", "pfcp.ue_link_specific_ip_address.flags.v4",
14133             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14134             NULL, HFILL }
14135         },
14136         { &hf_pfcp_ue_link_specific_ip_address_flags_b1_v6,
14137         { "V6", "pfcp.ue_link_specific_ip_address.flags.v6",
14138             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14139             NULL, HFILL }
14140         },
14141         { &hf_pfcp_ue_link_specific_ip_address_flags_b2_nv4,
14142         { "NV4", "pfcp.ue_link_specific_ip_address.flags.nv4",
14143             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
14144             NULL, HFILL }
14145         },
14146         { &hf_pfcp_ue_link_specific_ip_address_flags_b3_nv6,
14147         { "NV6", "pfcp.ue_link_specific_ip_address.flags.nv6",
14148             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
14149             NULL, HFILL }
14150         },
14151         { &hf_pfcp_ue_link_specific_ip_address_3gpp_ipv4,
14152         { "UE Link-Specific IPv4 Address for 3GPP Access", "pfcp.ue_link_specific_ip_address.3gpp.ipv4",
14153             FT_IPv4, BASE_NONE, NULL, 0x0,
14154             NULL, HFILL }
14155         },
14156         { &hf_pfcp_ue_link_specific_ip_address_3gpp_ipv6,
14157         { "UE Link-Specific IPv6 Address for 3GPP Access", "pfcp.ue_link_specific_ip_address.3gpp.ipv6",
14158             FT_IPv6, BASE_NONE, NULL, 0x0,
14159             NULL, HFILL }
14160         },
14161         { &hf_pfcp_ue_link_specific_ip_address_non3gpp_ipv4,
14162         { "UE Link-Specific IPv4 Address for Non-3GPP Access", "pfcp.ue_link_specific_ip_address.non3gpp.ipv4",
14163             FT_IPv4, BASE_NONE, NULL, 0x0,
14164             NULL, HFILL }
14165         },
14166         { &hf_pfcp_ue_link_specific_ip_address_non3gpp_ipv6,
14167         { "UE Link-Specific IPv6 Address for Non-3GPP Access", "pfcp.ue_link_specific_ip_address.non3gpp.ipv6",
14168             FT_IPv6, BASE_NONE, NULL, 0x0,
14169             NULL, HFILL }
14170         },
14171 
14172         { &hf_pfcp_pmf_address_information_flags,
14173         { "Flags", "pfcp.pmf_address_information.flags",
14174             FT_UINT8, BASE_HEX, NULL, 0x0,
14175             NULL, HFILL }
14176         },
14177         { &hf_pfcp_pmf_address_information_flags_b0_v4,
14178         { "V4", "pfcp.pmf_address_information.flags.v4",
14179             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14180             NULL, HFILL }
14181         },
14182         { &hf_pfcp_pmf_address_information_flags_b1_v6,
14183         { "V6", "pfcp.pmf_address_information.flags.v6",
14184             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14185             NULL, HFILL }
14186         },
14187         { &hf_pfcp_pmf_address_information_flags_b2_mac,
14188         { "MAC", "pfcp.pmf_address_information.flags.mac",
14189             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
14190             NULL, HFILL }
14191         },
14192         { &hf_pfcp_pmf_address_ipv4,
14193         { "PMF IPv4 Address", "pfcp.pmf_address_information.ipv4",
14194             FT_IPv4, BASE_NONE, NULL, 0x0,
14195             NULL, HFILL }
14196         },
14197         { &hf_pfcp_pmf_address_ipv6,
14198         { "PMF IPv6 Address", "pfcp.pmf_address_information.ipv6",
14199             FT_IPv6, BASE_NONE, NULL, 0x0,
14200             NULL, HFILL }
14201         },
14202         { &hf_pfcp_pmf_port_3gpp,
14203         { "PMF port for 3GPP", "pfcp.pmf_address_information.port_3gpp",
14204             FT_UINT16, BASE_DEC, NULL, 0x0,
14205             NULL, HFILL }
14206         },
14207         { &hf_pfcp_pmf_port_non3gpp,
14208         { "PMF port for Non-3GPP", "pfcp.pmf_address_information.port_non3gpp",
14209             FT_UINT16, BASE_DEC, NULL, 0x0,
14210             NULL, HFILL }
14211         },
14212         { &hf_pfcp_pmf_mac_address_3gpp,
14213         { "MAC Address for 3GPP", "pfcp.pmf_address_information.mac_address_3gpp",
14214             FT_BYTES, BASE_NONE, NULL, 0x0,
14215             NULL, HFILL }
14216         },
14217         { &hf_pfcp_pmf_mac_address_non3gpp,
14218         { "MAC Address for Non-3GPP", "pfcp.pmf_address_information.mac_address_non3gpp",
14219             FT_BYTES, BASE_NONE, NULL, 0x0,
14220             NULL, HFILL }
14221         },
14222 
14223         { &hf_pfcp_atsss_ll_information_flags,
14224         { "Flags", "pfcp.atsss_ll_information.flags",
14225             FT_UINT8, BASE_HEX, NULL, 0x0,
14226             NULL, HFILL }
14227         },
14228         { &hf_pfcp_atsss_ll_information_flags_b0_lli,
14229         { "LLI: ATSSS-LL steering functionality have been allocated", "pfcp.atsss_ll_information.flags.lli",
14230             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14231             NULL, HFILL }
14232         },
14233 
14234         { &hf_pfcp_data_network_access_identifier,
14235         { "Data Network Access Identifier", "pfcp.data_network_access_identifier",
14236             FT_BYTES, BASE_NONE, NULL, 0x0,
14237             NULL, HFILL }
14238         },
14239 
14240         { &hf_pfcp_packet_delay_milliseconds,
14241         { "Delay Value in milliseconds", "pfcp.average_packet_delay.milliseconds",
14242             FT_UINT32, BASE_DEC, NULL, 0x0,
14243             NULL, HFILL }
14244         },
14245 
14246         { &hf_pfcp_qos_report_trigger_flags,
14247         { "Flags", "pfcp.qos_report_trigger.flags",
14248             FT_UINT8, BASE_HEX, NULL, 0x0,
14249             NULL, HFILL }
14250         },
14251         { &hf_pfcp_qos_report_trigger_flags_b0_per,
14252         { "PER (Periodic Reporting)", "pfcp.qos_report_trigger.flags.v4",
14253             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14254             NULL, HFILL }
14255         },
14256         { &hf_pfcp_qos_report_trigger_flags_b1_thr,
14257         { "THR (Event triggered based on Threshold)", "pfcp.qos_report_trigger.flags.thr",
14258             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14259             NULL, HFILL }
14260         },
14261         { &hf_pfcp_qos_report_trigger_flags_b2_ire,
14262         { "IRE (Immediate Report)", "pfcp.qos_report_trigger.flags.ire",
14263             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
14264             NULL, HFILL }
14265         },
14266 
14267 
14268         { &hf_pfcp_gtp_u_path_interface_type_flags,
14269         { "Flags", "pfcp.gtp_u_path_interface_type.flags",
14270             FT_UINT8, BASE_HEX, NULL, 0x0,
14271             NULL, HFILL }
14272         },
14273         { &hf_pfcp_gtp_u_path_interface_type_flags_b0_n9,
14274         { "N9", "pfcp.qos_report_trigtp_u_path_interface_typegger.flags.n9",
14275             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14276             NULL, HFILL }
14277         },
14278         { &hf_pfcp_gtp_u_path_interface_type_flags_b1_n3,
14279         { "N3", "pfcp.gtp_u_path_interface_type.flags.n3",
14280             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14281             NULL, HFILL }
14282         },
14283 
14284         { &hf_pfcp_requested_qos_monitoring_flags,
14285         { "Flags", "pfcp.requested_qos_monitoring.flags",
14286             FT_UINT8, BASE_HEX, NULL, 0x0,
14287             NULL, HFILL }
14288         },
14289         { &hf_pfcp_requested_qos_monitoring_flags_b0_dl,
14290         { "DL (Downlink)", "pfcp.requested_qos_monitoring.flags.dl",
14291             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14292             NULL, HFILL }
14293         },
14294         { &hf_pfcp_requested_qos_monitoring_flags_b1_ul,
14295         { "UL (Uplink)", "pfcp.requested_qos_monitoring.flags.ul",
14296             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14297             NULL, HFILL }
14298         },
14299         { &hf_pfcp_requested_qos_monitoring_flags_b2_rp,
14300         { "RP (Round Trip)", "pfcp.requested_qos_monitoring.flags.rp",
14301             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
14302             NULL, HFILL }
14303         },
14304         { &hf_pfcp_requested_qos_monitoring_flags_b3_gtpupm,
14305         { "GTPUPM (GTP-U Path Monitoring)", "pfcp.requested_qos_monitoring.flags.gtpupm",
14306             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
14307             NULL, HFILL }
14308         },
14309 
14310         { &hf_pfcp_reporting_frequency_flags,
14311         { "Flags", "pfcp.reporting_frequency.flags",
14312             FT_UINT8, BASE_HEX, NULL, 0x0,
14313             NULL, HFILL }
14314         },
14315         { &hf_pfcp_reporting_frequency_flags_b0_evett,
14316         { "EVETT (Event Triggered QoS monitoring reporting)", "pfcp.reporting_frequency.flags.evett",
14317             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14318             NULL, HFILL }
14319         },
14320         { &hf_pfcp_reporting_frequency_flags_b1_perio,
14321         { "PERIO (Periodic QoS monitoring reporting)", "pfcp.reporting_frequency.flags.perio",
14322             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14323             NULL, HFILL }
14324         },
14325         { &hf_pfcp_reporting_frequency_flags_b2_sesrl,
14326         { "SESRL (Session Released QoS monitoring reporting)", "pfcp.reporting_frequency.flags.sesrl",
14327             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
14328             NULL, HFILL }
14329         },
14330 
14331         { &hf_pfcp_packet_delay_thresholds_flags,
14332         { "Flags", "pfcp.packet_delay_thresholds.flags",
14333             FT_UINT8, BASE_HEX, NULL, 0x0,
14334             NULL, HFILL }
14335         },
14336         { &hf_pfcp_packet_delay_thresholds_flags_b0_dl,
14337         { "DL (Downlink)", "pfcp.packet_delay_thresholds.flags.dl",
14338             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14339             NULL, HFILL }
14340         },
14341         { &hf_pfcp_packet_delay_thresholds_flags_b1_ul,
14342         { "UL (Uplink)", "pfcp.packet_delay_thresholds.flags.ul",
14343             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14344             NULL, HFILL }
14345         },
14346         { &hf_pfcp_packet_delay_thresholds_flags_b2_rp,
14347         { "RP (Round Trip)", "pfcp.packet_delay_thresholds.flags.rp",
14348             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
14349             NULL, HFILL }
14350         },
14351         { &hf_pfcp_packet_delay_thresholds_downlink,
14352         { "Downlink packet delay threshold (milliseconds)", "pfcp.packet_delay_thresholds.downlink",
14353             FT_UINT32, BASE_DEC, NULL, 0x0,
14354             NULL, HFILL }
14355         },
14356         { &hf_pfcp_packet_delay_thresholds_uplink,
14357         { "Downlink packet delay threshold (milliseconds)", "pfcp.packet_delay_thresholds.uplink",
14358             FT_UINT32, BASE_DEC, NULL, 0x0,
14359             NULL, HFILL }
14360         },
14361         { &hf_pfcp_packet_delay_thresholds_roundtrip,
14362         { "Round trip packet delay threshold (milliseconds)", "pfcp.packet_delay_thresholds.roundtrip",
14363             FT_UINT32, BASE_DEC, NULL, 0x0,
14364             NULL, HFILL }
14365         },
14366 
14367         { &hf_pfcp_minimum_wait_time_seconds,
14368         { "The Minimum Wait Time (seconds)", "pfcp.minimum_wait_time.seconds",
14369             FT_UINT32, BASE_DEC, NULL, 0x0,
14370             NULL, HFILL }
14371         },
14372 
14373 
14374         { &hf_pfcp_qos_monitoring_measurement_flags,
14375         { "Flags", "pfcp.qos_monitoring_measurement.flags",
14376             FT_UINT8, BASE_HEX, NULL, 0x0,
14377             NULL, HFILL }
14378         },
14379         { &hf_pfcp_qos_monitoring_measurement_flags_b0_dl,
14380         { "DL (Downlink)", "pfcp.qos_monitoring_measurement.flags.dl",
14381             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14382             NULL, HFILL }
14383         },
14384         { &hf_pfcp_qos_monitoring_measurement_flags_b1_ul,
14385         { "UL (Uplink)", "pfcp.qos_monitoring_measurement.flags.ul",
14386             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14387             NULL, HFILL }
14388         },
14389         { &hf_pfcp_qos_monitoring_measurement_flags_b2_rp,
14390         { "RP (Round Trip)", "pfcp.qos_monitoring_measurement.flags.rp",
14391             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
14392             NULL, HFILL }
14393         },
14394         { &hf_pfcp_qos_monitoring_measurement_flags_b3_plmf,
14395         { "PLMF (Packet Delay Measurement Failure)", "pfcp.qos_monitoring_measurement.flags.plmf",
14396             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
14397             NULL, HFILL }
14398         },
14399         { &hf_pfcp_qos_monitoring_measurement_downlink,
14400         { "Downlink packet delay (milliseconds)", "pfcp.qos_monitoring_measurement.downlink",
14401             FT_UINT32, BASE_DEC, NULL, 0x0,
14402             NULL, HFILL }
14403         },
14404         { &hf_pfcp_qos_monitoring_measurement_uplink,
14405         { "Downlink packet delay (milliseconds)", "pfcp.qos_monitoring_measurement.uplink",
14406             FT_UINT32, BASE_DEC, NULL, 0x0,
14407             NULL, HFILL }
14408         },
14409         { &hf_pfcp_qos_monitoring_measurement_roundtrip,
14410         { "Round trip packet delay (milliseconds)", "pfcp.qos_monitoring_measurement.roundtrip",
14411             FT_UINT32, BASE_DEC, NULL, 0x0,
14412             NULL, HFILL }
14413         },
14414 
14415         { &hf_pfcp_mt_edt_control_information_flags,
14416         { "Flags", "pfcp.reporting_frequency.flags",
14417             FT_UINT8, BASE_HEX, NULL, 0x0,
14418             NULL, HFILL }
14419         },
14420         { &hf_pfcp_mt_edt_control_information_flags_b0_rdsi,
14421         { "RDSI (Reporting DL data packets Size Indication)", "pfcp.mt_edt_control_information.flags.rdsi",
14422             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14423             NULL, HFILL }
14424         },
14425 
14426         { &hf_pfcp_dl_data_packets_size,
14427         { "DL Data Packets Size", "pfcp.dl_data_packets_size",
14428             FT_UINT16, BASE_DEC, NULL, 0x0,
14429             NULL, HFILL }
14430         },
14431 
14432         { &hf_pfcp_qer_control_indications_o5_b0_rcsr,
14433         { "RCSR (Rate Control Status Reporting)", "pfcp.qer_control_indications.rcsr",
14434             FT_BOOLEAN, 8, NULL, 0x01,
14435             NULL, HFILL }
14436         },
14437 
14438         { &hf_pfcp_nf_instance_id,
14439         { "NF Instance ID", "pfcp.nf_instance_id",
14440             FT_GUID, BASE_NONE, NULL, 0x0,
14441             NULL, HFILL }
14442         },
14443 
14444         { &hf_pfcp_s_nssai_sst,
14445         { "SST", "pfcp.s_nssai_sst.sst",
14446             FT_BYTES, BASE_NONE, NULL, 0x0,
14447             NULL, HFILL }
14448         },
14449         { &hf_pfcp_s_nssai_sd,
14450         { "SD", "pfcp.s_nssai_sst.sd",
14451             FT_BYTES, BASE_NONE, NULL, 0x0,
14452             NULL, HFILL }
14453         },
14454 
14455         { &hf_pfcp_ip_version_flags,
14456         { "Flags", "pfcp.ip_version.flags",
14457             FT_UINT8, BASE_HEX, NULL, 0x0,
14458             NULL, HFILL }
14459         },
14460         { &hf_pfcp_ip_version_flags_b1_v6,
14461         { "V6 (IPv6)", "pfcp.ip_version.v6",
14462             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14463             NULL, HFILL }
14464         },
14465         { &hf_pfcp_ip_version_flags_b0_v4,
14466         { "V4 (IPv4)", "pfcp.ip_version.v4",
14467             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14468             NULL, HFILL }
14469         },
14470 
14471         { &hf_pfcp_pfcpasreq_flags_flags,
14472         { "Flags", "pfcp.pfcpasreq_flags.flags",
14473             FT_UINT8, BASE_HEX, NULL, 0x0,
14474             NULL, HFILL }
14475         },
14476         { &hf_pfcp_pfcpasreq_flags_flags_b0_uupsi,
14477         { "UUPSI (UPF configured for IPUPS indication)", "pfcp.asreq_flags.flags.uupsi",
14478             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14479             NULL, HFILL }
14480         },
14481 
14482         { &hf_pfcp_data_status_flags,
14483         { "Flags", "pfcp.data_status.flags",
14484             FT_UINT8, BASE_HEX, NULL, 0x0,
14485             NULL, HFILL }
14486         },
14487         { &hf_pfcp_data_status_flags_b0_drop,
14488         { "DROP (First DL packet is discared by UP function)", "pfcp.data_status.flags.drop",
14489             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14490             NULL, HFILL }
14491         },
14492         { &hf_pfcp_data_status_flags_b1_buff,
14493         { "BUFF (First DL packet is received and buffered by UP function)", "pfcp.data_status.flags.buff",
14494             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14495             NULL, HFILL }
14496         },
14497 
14498         { &hf_pfcp_rds_configuration_information_flags,
14499         { "Flags", "pfcp.rds_configuration_information.flags",
14500             FT_UINT8, BASE_HEX, NULL, 0x0,
14501             NULL, HFILL }
14502         },
14503         { &hf_pfcp_rds_configuration_information_flags_b0_rds,
14504         { "RDS (Reliable Data Service)", "pfcp.rds_configuration_information.flags.rds",
14505             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14506             NULL, HFILL }
14507         },
14508 
14509         { &hf_pfcp_mptcp_application_indication_flags,
14510         { "Flags", "pfcp.mptcp_application_indication.flags",
14511             FT_UINT8, BASE_HEX, NULL, 0x0,
14512             NULL, HFILL }
14513         },
14514         { &hf_pfcp_mptcp_application_indication_flags_b0_mai,
14515         { "MAI (MPTCP Applicable Indication)", "pfcp.mptcp_application_indication.flags.mai",
14516             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14517             NULL, HFILL }
14518         },
14519 
14520         { &hf_pfcp_user_plane_nodemanagement_information_container,
14521         { "Predefined Rules Name", "pfcp.user_plane_nodemanagement_information_container",
14522             FT_BYTES, BASE_NONE, NULL, 0x0,
14523             NULL, HFILL }
14524         },
14525 
14526 
14527         { &hf_pfcp_number_of_ue_ip_addresses_flags,
14528         { "Flags", "pfcp.number_of_ue_ip_addresses.flags",
14529             FT_UINT8, BASE_HEX, NULL, 0x0,
14530             NULL, HFILL }
14531         },
14532         { &hf_pfcp_number_of_ue_ip_addresses_b0_ipv4,
14533         { "IPv4", "pfcp.number_of_ue_ip_addresses.v4",
14534             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14535             NULL, HFILL }
14536         },
14537         { &hf_pfcp_number_of_ue_ip_addresses_b1_ipv6,
14538         { "IPv6", "pfcp.number_of_ue_ip_addresses.v6",
14539             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14540             NULL, HFILL }
14541         },
14542         { &hf_pfcp_number_of_ue_ip_addresses_ipv4,
14543         { "Number of UE IPv4 Addresses", "pfcp.number_of_ue_ip_addresses.ipv4addresses",
14544             FT_UINT32, BASE_DEC, NULL, 0x0,
14545             NULL, HFILL }
14546         },
14547         { &hf_pfcp_number_of_ue_ip_addresses_ipv6,
14548         { "Number of UE IPv6 Addresses", "pfcp.number_of_ue_ip_addresses.ipv6addresses",
14549             FT_UINT32, BASE_DEC, NULL, 0x0,
14550             NULL, HFILL }
14551         },
14552 
14553         { &hf_pfcp_validity_timer,
14554         { "Validity Timer", "pfcp.validity_timer",
14555             FT_UINT16, BASE_DEC, NULL, 0x0,
14556             NULL, HFILL }
14557         },
14558 
14559         { &hf_pfcp_rattype,
14560         { "RAT Type", "pfcp.rattype",
14561             FT_UINT8, BASE_DEC, VALS(pfcp_rattype_vals), 0xF,
14562             NULL, HFILL }
14563         },
14564 
14565         { &hf_pfcp_l2tp_user_authentication_proxy_authen_type_value,
14566         { "Proxy Authen Type Value", "pfcp.l2tp_user_authentication.proxy_authen_type_value",
14567             FT_UINT16, BASE_DEC, NULL, 0x0,
14568             NULL, HFILL }
14569         },
14570         { &hf_pfcp_l2tp_user_authentication_flags,
14571         { "Flags", "pfcp.l2tp_user_authentication.flags",
14572             FT_UINT8, BASE_HEX, NULL, 0x0,
14573             NULL, HFILL }
14574         },
14575         { &hf_pfcp_l2tp_user_authentication_b0_pan,
14576         { "PAN (Proxy Authen Name)", "pfcp.l2tp_user_authentication.flags.pan",
14577             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14578             NULL, HFILL }
14579         },
14580         { &hf_pfcp_l2tp_user_authentication_b1_pac,
14581         { "PAC (Proxy Authen Challenge)", "pfcp.l2tp_user_authentication.flags.pac",
14582             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14583             NULL, HFILL }
14584         },
14585         { &hf_pfcp_l2tp_user_authentication_b2_par,
14586         { "PAR (Proxy Authen Response)", "pfcp.l2tp_user_authentication.flags.par",
14587             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
14588             NULL, HFILL }
14589         },
14590         { &hf_pfcp_l2tp_user_authentication_b3_pai,
14591         { "PAI (Proxy Authen UD)", "pfcp.l2tp_user_authentication.flags.pai",
14592             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
14593             NULL, HFILL }
14594         },
14595         { &hf_pfcp_l2tp_user_authentication_proxy_authen_name_len,
14596         { "Proxy Authen Name Length", "pfcp.l2tp_user_authentication.pan_len",
14597             FT_UINT8, BASE_DEC, NULL, 0x0,
14598             NULL, HFILL }
14599         },
14600         { &hf_pfcp_l2tp_user_authentication_proxy_authen_name,
14601         { "Proxy Authen Name", "pfcp.l2tp_user_authentication.pan",
14602             FT_STRING, BASE_NONE, NULL, 0,
14603             NULL, HFILL }
14604         },
14605         { &hf_pfcp_l2tp_user_authentication_proxy_authen_challenge_len,
14606         { "Proxy Authen Challenge Length", "pfcp.l2tp_user_authentication.pac_len",
14607             FT_UINT8, BASE_DEC, NULL, 0x0,
14608             NULL, HFILL }
14609         },
14610         { &hf_pfcp_l2tp_user_authentication_proxy_authen_challenge,
14611         { "Proxy Authen Challenge", "pfcp.l2tp_user_authentication.pac",
14612             FT_STRING, BASE_NONE, NULL, 0,
14613             NULL, HFILL }
14614         },
14615         { &hf_pfcp_l2tp_user_authentication_proxy_authen_response_len,
14616         { "Proxy Authen Response Length", "pfcp.l2tp_user_authentication.par_len",
14617             FT_UINT8, BASE_DEC, NULL, 0x0,
14618             NULL, HFILL }
14619         },
14620         { &hf_pfcp_l2tp_user_authentication_proxy_authen_response,
14621         { "Proxy Authen Response", "pfcp.l2tp_user_authentication.par",
14622             FT_STRING, BASE_NONE, NULL, 0,
14623             NULL, HFILL }
14624         },
14625         { &hf_pfcp_l2tp_user_authentication_proxy_authen_id,
14626         { "Proxy Authen ID", "pfcp.l2tp_user_authentication.pai",
14627             FT_UINT8, BASE_DEC, NULL, 0x0,
14628             NULL, HFILL }
14629         },
14630 
14631         { &hf_pfcp_lns_address_ipv4,
14632         { "IPv4 address", "pfcp.lns_address.ipv4",
14633             FT_IPv4, BASE_NONE, NULL, 0x0,
14634             NULL, HFILL }
14635         },
14636         { &hf_pfcp_lns_address_ipv6,
14637         { "IPv6 address", "pfcp.lns_address.ipv6",
14638             FT_IPv6, BASE_NONE, NULL, 0x0,
14639             NULL, HFILL }
14640         },
14641 
14642         { &hf_pfcp_tunnel_preference_value,
14643         { "Tunnel Preference Value", "pfcp.tunnel_preference_value",
14644             FT_UINT24, BASE_DEC, NULL, 0,
14645             NULL, HFILL }
14646         },
14647 
14648         { &hf_pfcp_calling_number_value,
14649         { "Calling Number Value", "pfcp.calling_number_value",
14650             FT_STRING, BASE_NONE, NULL, 0,
14651             NULL, HFILL }
14652         },
14653         { &hf_pfcp_called_number_value,
14654         { "Called Number Value", "pfcp.called_number_value",
14655             FT_STRING, BASE_NONE, NULL, 0,
14656             NULL, HFILL }
14657         },
14658 
14659         { &hf_pfcp_l2tp_session_indications_o5_b0_reuia,
14660         { "REUIA", "pfcp.l2tp_session_indications.reuia",
14661             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
14662             "Request UE IP Address", HFILL }
14663         },
14664         { &hf_pfcp_l2tp_session_indications_o5_b1_redsa,
14665         { "REDSA", "pfcp.l2tp_session_indications.redsa",
14666             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
14667             "Request DNS Server Address", HFILL }
14668         },
14669         { &hf_pfcp_l2tp_session_indications_o5_b2_rensa,
14670         { "RENSA", "pfcp.l2tp_session_indications.rensa",
14671             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
14672             "Request NBNS Server Address", HFILL }
14673         },
14674 
14675         { &hf_pfcp_maximum_receive_unit,
14676         { "Maximum Receive Unit", "pfcp.maximum_receive_unit",
14677             FT_UINT16, BASE_DEC, NULL, 0x0,
14678             NULL, HFILL }
14679         },
14680 
14681         { &hf_pfcp_thresholds_flags,
14682         { "Flags", "pfcp.thresholds.flags",
14683             FT_UINT8, BASE_HEX, NULL, 0x0,
14684             NULL, HFILL }
14685         },
14686         { &hf_pfcp_thresholds_flags_b0_rtt,
14687         { "RTT", "pfcp.thresholds.flags.rtt",
14688             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14689             NULL, HFILL }
14690         },
14691         { &hf_pfcp_thresholds_flags_b1_plr,
14692         { "PLR (Packet Loss Rate)", "pfcp.thresholds.flags.plr",
14693             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14694             NULL, HFILL }
14695         },
14696         { &hf_pfcp_thresholds_rtt,
14697         { "RTT (in milliseconds)", "pfcp.thresholds.rtt",
14698             FT_UINT16, BASE_DEC, NULL, 0x0,
14699             NULL, HFILL }
14700         },
14701         { &hf_pfcp_thresholds_plr,
14702         { "Packet Loss Rate (in percent)", "pfcp.thresholds.plr",
14703             FT_UINT8, BASE_DEC, NULL, 0x0,
14704             NULL, HFILL }
14705         },
14706 
14707         { &hf_pfcp_l2tp_steering_mode_indications_o5_b0_albi,
14708         { "ALBI", "pfcp.l2tp_session_indications.reuia",
14709             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
14710             "Autonomous Load Balacing Indicator", HFILL }
14711         },
14712         { &hf_pfcp_l2tp_steering_mode_indications_o5_b1_ueai,
14713         { "UEAI", "pfcp.l2tp_session_indications.redsa",
14714             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
14715             "UE Assistance Indicator", HFILL }
14716         },
14717 
14718         { &hf_pfcp_group_id,
14719         { "Group ID", "pfcp.group_id",
14720             FT_STRING, BASE_NONE, NULL, 0x0,
14721             NULL, HFILL }
14722         },
14723 
14724         { &hf_pfcp_cp_ip_address_flags,
14725         { "Flags", "pfcp.cp_ip_address.flags",
14726             FT_UINT8, BASE_HEX, NULL, 0x0,
14727             NULL, HFILL }
14728         },
14729         { &hf_pfcp_cp_ip_address_ipv4,
14730         { "IPv4 address", "pfcp.cp_ip_address.ipv4",
14731             FT_IPv4, BASE_NONE, NULL, 0x0,
14732             NULL, HFILL }
14733         },
14734         { &hf_pfcp_cp_ip_address_ipv6,
14735         { "IPv6 address", "pfcp.cp_ip_address.ipv6",
14736             FT_IPv6, BASE_NONE, NULL, 0x0,
14737             NULL, HFILL }
14738         },
14739 
14740         { &hf_pfcp_ip_address_and_port_number_replacement_flags,
14741         { "Flags", "pfcp.ip_address_and_port_number_replacement.flag",
14742             FT_UINT8, BASE_HEX, NULL, 0x0,
14743             NULL, HFILL }
14744         },
14745         { &hf_pfcp_ip_address_and_port_number_replacement_flag_b0_v4,
14746         { "DIPV4", "pfcp.ip_address_and_port_number_replacement.flag.dipv4",
14747             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14748             NULL, HFILL }
14749         },
14750         { &hf_pfcp_ip_address_and_port_number_replacement_flag_b1_v6,
14751         { "DIPV6", "pfcp.ip_address_and_port_number_replacement.flag.dipv6",
14752             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14753             NULL, HFILL }
14754         },
14755         { &hf_pfcp_ip_address_and_port_number_replacement_flag_b2_dpn,
14756         { "DPN", "pfcp.ip_address_and_port_number_replacement.flag.dpn",
14757             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
14758             NULL, HFILL }
14759         },
14760         { &hf_pfcp_ip_address_and_port_number_replacement_flag_b3_sipv4,
14761         { "SIPV4", "pfcp.ip_address_and_port_number_replacement.flag.sipv4",
14762             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
14763             NULL, HFILL }
14764         },
14765         { &hf_pfcp_ip_address_and_port_number_replacement_flag_b4_sipv6,
14766         { "SIPV6", "pfcp.ip_address_and_port_number_replacement.flag.sipv6",
14767             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10,
14768             NULL, HFILL }
14769         },
14770         { &hf_pfcp_ip_address_and_port_number_replacement_flag_b5_spn,
14771         { "SPN", "pfcp.ip_address_and_port_number_replacement.flag.spn",
14772             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20,
14773             NULL, HFILL }
14774         },
14775 
14776         { &hf_pfcp_ip_address_and_port_number_replacement_destination_ipv4,
14777         { "Destination IPv4 address", "pfcp.ip_address_and_port_number_replacement.dipv4",
14778             FT_IPv4, BASE_NONE, NULL, 0x0,
14779             NULL, HFILL }
14780         },
14781         { &hf_pfcp_ip_address_and_port_number_replacement_destination_ipv6,
14782         { "Destination IPv6 address", "pfcp.ip_address_and_port_number_replacement.dipv6",
14783             FT_IPv6, BASE_NONE, NULL, 0x0,
14784             NULL, HFILL }
14785         },
14786         { &hf_pfcp_ip_address_and_port_number_replacement_destination_port,
14787         { "Destination Port Number", "pfcp.ip_address_and_port_number_replacement.dpn",
14788             FT_UINT16, BASE_DEC, NULL, 0x0,
14789             NULL, HFILL }
14790         },
14791         { &hf_pfcp_ip_address_and_port_number_replacement_source_ipv4,
14792         { "Source IPv4 address", "pfcp.ip_address_and_port_number_replacement.sipv4",
14793             FT_IPv4, BASE_NONE, NULL, 0x0,
14794             NULL, HFILL }
14795         },
14796         { &hf_pfcp_ip_address_and_port_number_replacement_source_ipv6,
14797         { "Source IPv6 address", "pfcp.ip_address_and_port_number_replacement.sipv6",
14798             FT_IPv6, BASE_NONE, NULL, 0x0,
14799             NULL, HFILL }
14800         },
14801         { &hf_pfcp_ip_address_and_port_number_replacement_source_port,
14802         { "Source Port Number", "pfcp.ip_address_and_port_number_replacement.spn",
14803             FT_UINT16, BASE_DEC, NULL, 0x0,
14804             NULL, HFILL }
14805         },
14806 
14807         { &hf_pfcp_dns_query_filter_pattern_len,
14808         { "DNS Query Filter Pattern Length", "pfcp.dns_query_filter.pattern_len",
14809             FT_UINT16, BASE_DEC, NULL, 0x0,
14810             NULL, HFILL }
14811         },
14812         { &hf_pfcp_dns_query_filter_pattern,
14813         { "DNS Query Filter Pattern", "pfcp.dns_query_filter.pattern",
14814             FT_STRING, BASE_NONE, NULL, 0,
14815             NULL, HFILL }
14816         },
14817 
14818         { &hf_pfcp_event_notification_uri,
14819         { "Event Notification URI", "pfcp.event_notification_uri",
14820             FT_STRING, BASE_NONE, NULL, 0,
14821             NULL, HFILL }
14822         },
14823 
14824         { &hf_pfcp_notification_correlation_id,
14825         { "QER Correlation ID", "pfcp.qer_correlation_id",
14826             FT_UINT32, BASE_DEC, NULL, 0x0,
14827             NULL, HFILL }
14828         },
14829 
14830         { &hf_pfcp_reporting_flags_o5_b0_dupl,
14831         { "DUPL (Duplocation Notication)", "pfcp.reporting_flags.dupl",
14832             FT_BOOLEAN, 8, NULL, 0x01,
14833             NULL, HFILL }
14834         },
14835 
14836 
14837         { &hf_pfcp_mbs_session_identifier_flags,
14838         { "Flags", "pfcp.cp_ip_address.flags",
14839             FT_UINT8, BASE_HEX, NULL, 0x0,
14840             NULL, HFILL }
14841         },
14842         { &hf_pfcp_mbs_session_identifier_flag_b0_tmgi,
14843         { "TGMI", "pfcp.session_identifier.flag.tmgi",
14844             FT_BOOLEAN, 8, NULL, 0x01,
14845             NULL, HFILL }
14846         },{ &hf_pfcp_mbs_session_identifier_flag_b1_ssmi,
14847         { "SSMI", "pfcp.session_identifier.flag.ssmi",
14848             FT_BOOLEAN, 8, NULL, 0x02,
14849             NULL, HFILL }
14850         },
14851         { &hf_pfcp_mbs_session_identifier_tmgi,
14852           {"TMGI", "pfcp.mbs_session_identifier.tmgi",
14853            FT_BYTES, BASE_NONE, NULL, 0x0,
14854            NULL, HFILL}
14855         },
14856         { &hf_pfcp_mbs_session_identifier_ssmi,
14857           {"SSMI", "pfcp.mbs_session_identifier.ssmi",
14858            FT_BYTES, BASE_NONE, NULL, 0x0,
14859            NULL, HFILL}
14860         },
14861 
14862         { &hf_pfcp_multicast_transport_information_endpoint_identifier,
14863         { "Common Tunnel Endpoint Identifier", "pfcp.multicast_transport_information.endpoint_identifier",
14864             FT_UINT8, BASE_DEC, NULL, 0x0,
14865             NULL, HFILL }
14866         },
14867         { &hf_pfcp_multicast_transport_information_distribution_address_type,
14868         { "Distribution Address Type", "pfcp.multicast_transport_information.distribution_address.type",
14869             FT_UINT8, BASE_DEC, NULL, 0xC0,
14870             NULL, HFILL }
14871         },
14872         { &hf_pfcp_multicast_transport_information_distribution_address_length,
14873         { "Distribution  Type", "pfcp.multicast_transport_information.distribution_address.length",
14874             FT_UINT8, BASE_DEC, NULL, 0x3F,
14875             NULL, HFILL }
14876         },
14877         { &hf_pfcp_multicast_transport_information_distribution_address_ipv4,
14878         { "Distribution IPv4 address", "pfcp.multicast_transport_information.distribution_address.ipv4",
14879             FT_IPv4, BASE_NONE, NULL, 0x0,
14880             NULL, HFILL }
14881         },
14882         { &hf_pfcp_multicast_transport_information_distribution_address_ipv6,
14883         { "Distribution IPv6 address", "pfcp.multicast_transport_information.distribution_address.ipv6",
14884             FT_IPv6, BASE_NONE, NULL, 0x0,
14885             NULL, HFILL }
14886         },
14887         { &hf_pfcp_multicast_transport_information_source_address_type,
14888         { "Source Address Type", "pfcp.multicast_transport_information.distribution_address.type",
14889             FT_UINT8, BASE_DEC, NULL, 0xC0,
14890             NULL, HFILL }
14891         },
14892         { &hf_pfcp_multicast_transport_information_source_address_length,
14893         { "Source Address Type", "pfcp.multicast_transport_information.distribution_address.length",
14894             FT_UINT8, BASE_DEC, NULL, 0x3F,
14895             NULL, HFILL }
14896         },
14897         { &hf_pfcp_multicast_transport_information_source_address_ipv4,
14898         { "Source IPv4 address", "pfcp.multicast_transport_information.distribution_address.ipv4",
14899             FT_IPv4, BASE_NONE, NULL, 0x0,
14900             NULL, HFILL }
14901         },
14902         { &hf_pfcp_multicast_transport_information_source_address_ipv6,
14903         { "Source IPv6 address", "pfcp.multicast_transport_information.distribution_address.ipv6",
14904             FT_IPv6, BASE_NONE, NULL, 0x0,
14905             NULL, HFILL }
14906         },
14907 
14908         { &hf_pfcp_mbsn4mbreq_flags_o5_b0_pllssm,
14909         { "PLLSSM (Provide Lower Layer SSM)", "pfcp.reporting_flags.pllssm",
14910             FT_BOOLEAN, 8, NULL, 0x01,
14911             NULL, HFILL }
14912         },
14913         { &hf_pfcp_mbsn4mbreq_flags_o5_b1_jmbssm,
14914         { "JMBSSM (Join MBS Session SSM)", "pfcp.reporting_flags.jmbssm",
14915             FT_BOOLEAN, 8, NULL, 0x02,
14916             NULL, HFILL }
14917         },
14918 
14919 
14920         { &hf_pfcp_local_ingress_tunnel_flags,
14921         { "Flags", "pfcp.local_ingress_tunnel.flags",
14922             FT_UINT8, BASE_HEX, NULL, 0x0,
14923             NULL, HFILL }
14924         },
14925         { &hf_pfcp_local_ingress_tunnel_flags_b2_ch,
14926         { "CH (CHOOSE)", "pfcp.local_ingress_tunnel.flags.ch",
14927             FT_BOOLEAN, 8, NULL, 0x04,
14928             NULL, HFILL }
14929         },
14930         { &hf_pfcp_local_ingress_tunnel_flags_b1_v6,
14931         { "V6 (IPv6)", "pfcp.local_ingress_tunnel.flags.v6",
14932             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
14933             NULL, HFILL }
14934         },
14935         { &hf_pfcp_local_ingress_tunnel_flags_b0_v4,
14936         { "V4 (IPv4)", "pfcp.local_ingress_tunnel.flags.v4",
14937             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
14938             NULL, HFILL }
14939         },
14940         { &hf_pfcp_local_ingress_tunnel_udp_port,
14941         { "UDP Port", "pfcp.local_ingress_tunnel.udp",
14942             FT_UINT32, BASE_HEX, NULL, 0x0,
14943             NULL, HFILL }
14944         },
14945         { &hf_pfcp_local_ingress_tunnel_ipv4,
14946         { "IPv4 address", "pfcp.local_ingress_tunnel.ipv4",
14947             FT_IPv4, BASE_NONE, NULL, 0x0,
14948             NULL, HFILL }
14949         },
14950         { &hf_pfcp_local_ingress_tunnel_ipv6,
14951         { "IPv6 address", "pfcp.local_ingress_tunnel.ipv6",
14952             FT_IPv6, BASE_NONE, NULL, 0x0,
14953             NULL, HFILL }
14954         },
14955 
14956         { &hf_pfcp_mbs_unicast_parameters_id,
14957         { "MBS Unicast Parameters ID value", "pfcp.mbs_unicast_parameters_id",
14958             FT_UINT16, BASE_DEC, NULL, 0x0,
14959             NULL, HFILL }
14960         },
14961 
14962         /* Enterprise IEs */
14963         /* BBF */
14964         { &hf_pfcp_bbf_up_function_features_o7_b0_pppoe,
14965         { "PPPoE", "pfcp.bbf.up_function_features.pppoe",
14966             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
14967             "PPPoE supported in DBNG-UP function", HFILL }
14968         },
14969         { &hf_pfcp_bbf_up_function_features_o7_b1_ipoe,
14970         { "IPoE", "pfcp.bbf.up_function_features.ipoe",
14971             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
14972             "IPoE supported in DBNG-UP function", HFILL }
14973         },
14974         { &hf_pfcp_bbf_up_function_features_o7_b2_lac,
14975         { "LAC", "pfcp.bbf.up_function_features.lac",
14976             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
14977             "LAC function supported in DBNG-UP function", HFILL }
14978         },
14979         { &hf_pfcp_bbf_up_function_features_o7_b3_lns,
14980         { "LNS", "pfcp.bbf.up_function_features.lns",
14981             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
14982             "LNS function supported in DBNG-UP function", HFILL }
14983         },
14984         { &hf_pfcp_bbf_up_function_features_o7_b4_lcp_keepalive_offload,
14985         { "LCP keepalive offload", "pfcp.bbf.up_function_features.lcp_keepalive_offload",
14986             FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
14987             "PPP LCP echo supported in DBNG-UP function", HFILL }
14988         },
14989 
14990         { &hf_pfcp_bbf_logical_port_id,
14991         { "Logical Port", "pfcp.bbf.logical_port_id",
14992             FT_BYTES, BASE_NONE, NULL, 0x0,
14993             NULL, HFILL }
14994         },
14995         { &hf_pfcp_bbf_logical_port_id_str,
14996         { "Logical Port", "pfcp.bbf.logical_port_id_str",
14997             FT_STRING, BASE_NONE, NULL, 0x0,
14998             NULL, HFILL }
14999         },
15000 
15001         { &hf_pfcp_bbf_outer_hdr_desc,
15002         { "BBF Outer Header Creation Description", "pfcp.bbf.outer_hdr_desc",
15003             FT_UINT16, BASE_DEC, VALS(pfcp_bbf_outer_hdr_desc_vals), 0x0,
15004             NULL, HFILL }
15005         },
15006         { &hf_pfcp_bbf_outer_hdr_creation_tunnel_id,
15007         { "L2TP Tunnel ID", "pfcp.bbf.outer_hdr_creation.tunnel_id",
15008             FT_UINT16, BASE_HEX, NULL, 0x0,
15009             NULL, HFILL }
15010         },
15011         { &hf_pfcp_bbf_outer_hdr_creation_session_id,
15012         { "L2TP Session ID", "pfcp.bbf.outer_hdr_creation.session_id",
15013             FT_UINT16, BASE_HEX, NULL, 0x0,
15014             NULL, HFILL }
15015         },
15016 
15017         { &hf_pfcp_bbf_out_hdr_desc,
15018         { "BBF Outer Header Removal Description", "pfcp.bbf.out_hdr_desc",
15019             FT_UINT8, BASE_DEC, VALS(pfcp_bbf_out_hdr_desc_vals), 0x0,
15020             NULL, HFILL }
15021         },
15022 
15023         { &hf_pfcp_bbf_pppoe_session_id,
15024         { "PPPoE Session ID", "pfcp.bbf.pppoe_session_id",
15025             FT_UINT16, BASE_HEX, NULL, 0x0,
15026             NULL, HFILL }
15027         },
15028 
15029         { &hf_pfcp_bbf_ppp_protocol_flags,
15030         { "Flags", "pfcp.bbf.protocol_flags",
15031             FT_UINT8, BASE_HEX, NULL, 0x0,
15032             NULL, HFILL }
15033         },
15034         { &hf_pfcp_bbf_ppp_protocol_b2_control,
15035         { "control", "pfcp.bbf.protocol_flags.control",
15036             FT_BOOLEAN, 8, NULL, 0x04,
15037             NULL, HFILL }
15038         },
15039         { &hf_pfcp_bbf_ppp_protocol_b1_data,
15040         { "data", "pfcp.bbf.protocol_flags.data",
15041             FT_BOOLEAN, 8, NULL, 0x02,
15042             NULL, HFILL }
15043         },
15044         { &hf_pfcp_bbf_ppp_protocol_b0_specific,
15045         { "specific", "pfcp.bbf.protocol_flags.specific",
15046             FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
15047             NULL, HFILL }
15048         },
15049         { &hf_pfcp_bbf_ppp_protocol,
15050         { "protocol", "pfcp.bbf.protocol_flags.protocol",
15051             FT_UINT16, BASE_HEX, NULL, 0x0,
15052             NULL, HFILL }
15053         },
15054 
15055         { &hf_pfcp_bbf_verification_timer_interval,
15056         { "Interval", "pfcp.bbf.verification_timer.interval",
15057             FT_UINT16, BASE_DEC, NULL, 0x0,
15058             NULL, HFILL }
15059         },
15060         { &hf_pfcp_bbf_verification_timer_count,
15061         { "Count", "pfcp.bbf.verification_timer.count",
15062             FT_UINT8, BASE_DEC, NULL, 0x0,
15063             NULL, HFILL }
15064         },
15065 
15066         { &hf_pfcp_bbf_ppp_lcp_magic_number_tx,
15067         { "PPP LCP Magic Number Tx", "pfcp.bbf.lcp_magic_number.tx",
15068             FT_UINT32, BASE_HEX, NULL, 0x0,
15069             NULL, HFILL }
15070         },
15071         { &hf_pfcp_bbf_ppp_lcp_magic_number_rx,
15072         { "PPP LCP Magic Number Rx", "pfcp.bbf.lcp_magic_number.rx",
15073             FT_UINT32, BASE_HEX, NULL, 0x0,
15074             NULL, HFILL }
15075         },
15076 
15077         { &hf_pfcp_bbf_mtu,
15078         { "MTU", "pfcp.bbf.mtu",
15079             FT_UINT16, BASE_DEC, NULL, 0x0,
15080             NULL, HFILL }
15081         },
15082 
15083         { &hf_pfcp_bbf_l2tp_endp_flags,
15084         { "Flags", "pfcp.bbf.l2tp_endp_flags",
15085             FT_UINT8, BASE_HEX, NULL, 0x0,
15086             NULL, HFILL }
15087         },
15088         { &hf_pfcp_bbf_l2tp_endp_flags_b2_ch,
15089         { "CH (CHOOSE)", "pfcp.bbf.l2tp_endp_flags.ch",
15090             FT_BOOLEAN, 8, NULL, 0x04,
15091             NULL, HFILL }
15092         },
15093         { &hf_pfcp_bbf_l2tp_endp_flags_b1_v6,
15094         { "V6 (IPv6)", "pfcp.bbf.l2tp_endp_flags.v6",
15095             FT_BOOLEAN, 8, NULL, 0x02,
15096             NULL, HFILL }
15097         },
15098         { &hf_pfcp_bbf_l2tp_endp_flags_b0_v4,
15099         { "V4 (IPv4)", "pfcp.bbf.l2tp_endp_flags.v4",
15100             FT_BOOLEAN, 8, NULL, 0x01,
15101             NULL, HFILL }
15102         },
15103         { &hf_pfcp_bbf_l2tp_endp_id_tunnel_id,
15104         { "Tunnel ID", "pfcp.bbf.l2tp_endp.tunnel_id",
15105             FT_UINT16, BASE_HEX, NULL, 0x0,
15106             NULL, HFILL }
15107         },
15108         { &hf_pfcp_bbf_l2tp_endp_id_ipv4,
15109         { "IPv4 address", "pfcp.bbf.l2tp_endp.ipv4_addr",
15110             FT_IPv4, BASE_NONE, NULL, 0x0,
15111             NULL, HFILL }
15112         },
15113         { &hf_pfcp_bbf_l2tp_endp_id_ipv6,
15114         { "IPv6 address", "pfcp.bbf.l2tp_endp.ipv6_addr",
15115             FT_IPv6, BASE_NONE, NULL, 0x0,
15116             NULL, HFILL }
15117         },
15118 
15119         { &hf_pfcp_bbf_l2tp_session_id,
15120         { "L2TP Session ID", "pfcp.bbf.bbf_l2tp_session_id",
15121             FT_UINT16, BASE_HEX, NULL, 0x0,
15122             NULL, HFILL }
15123         },
15124 
15125         { &hf_pfcp_bbf_l2tp_type_flags,
15126         { "Flags", "pfcp.bbf.l2tp_type_flags",
15127             FT_UINT8, BASE_HEX, NULL, 0x0,
15128             NULL, HFILL }
15129         },
15130         { &hf_pfcp_bbf_l2tp_type_flags_b0_t,
15131         { "T (TYPE)", "pfcp.bbf.l2tp_type_flags.t",
15132             FT_BOOLEAN, 8, TFS(&pfcp_bbf_l2tp_type_b0_t_tfs), 0x01,
15133             NULL, HFILL }
15134         },
15135 
15136         /* Travelping */
15137         { &hf_pfcp_travelping_build_id,
15138         { "Build Identifier", "pfcp.travelping.build_id",
15139             FT_BYTES, BASE_NONE, NULL, 0x0,
15140             NULL, HFILL }
15141         },
15142         { &hf_pfcp_travelping_build_id_str,
15143         { "Build Identifier", "pfcp.travelping.build_id_str",
15144             FT_STRING, BASE_NONE, NULL, 0x0,
15145             NULL, HFILL }
15146         },
15147         { &hf_pfcp_travelping_now,
15148         { "Now", "pfcp.travelping.now",
15149             FT_ABSOLUTE_TIME, ABSOLUTE_TIME_NTP_UTC, NULL, 0x0,
15150             NULL, HFILL }
15151         },
15152         { &hf_pfcp_travelping_error_message,
15153         { "Error Message", "pfcp.travelping.error_message",
15154             FT_BYTES, BASE_NONE, NULL, 0x0,
15155             NULL, HFILL }
15156         },
15157         { &hf_pfcp_travelping_error_message_str,
15158         { "Error Message", "pfcp.travelping.error_message_str",
15159             FT_STRING, BASE_NONE, NULL, 0x0,
15160             NULL, HFILL }
15161         },
15162         { &hf_pfcp_travelping_file_name,
15163         { "File Name", "pfcp.travelping.file_name",
15164             FT_BYTES, BASE_NONE, NULL, 0x0,
15165             NULL, HFILL }
15166         },
15167         { &hf_pfcp_travelping_file_name_str,
15168         { "File Name", "pfcp.travelping.file_name_str",
15169             FT_STRING, BASE_NONE, NULL, 0x0,
15170             NULL, HFILL }
15171         },
15172         { &hf_pfcp_travelping_line_number,
15173         { "Line Number", "pfcp.travelping.line_number",
15174             FT_UINT32, BASE_DEC, NULL, 0x0,
15175             NULL, HFILL }
15176         },
15177     };
15178 
15179     /* Setup protocol subtree array */
15180 #define NUM_INDIVIDUAL_ELEMS_PFCP    93
15181     gint *ett[NUM_INDIVIDUAL_ELEMS_PFCP +
15182         (NUM_PFCP_IES - 1) +
15183         (NUM_PFCP_ENTERPRISE_BBF_IES - 1) +
15184         (NUM_PFCP_ENTERPRISE_TRAVELPING_IES - 1)];
15185 
15186     ett[0] = &ett_pfcp;
15187     ett[1] = &ett_pfcp_flags;
15188     ett[2] = &ett_pfcp_ie;
15189     ett[3] = &ett_pfcp_grouped_ie;
15190     ett[4] = &ett_pfcp_f_seid_flags;
15191     ett[5] = &ett_f_teid_flags;
15192     ett[6] = &ett_pfcp_ue_ip_address_flags;
15193     ett[7] = &ett_pfcp_sdf_filter_flags;
15194     ett[8] = &ett_pfcp_measurement_method_flags;
15195     ett[9] = &ett_pfcp_reporting_triggers;
15196     ett[10] = &ett_pfcp_volume_threshold;
15197     ett[11] = &ett_pfcp_volume_quota;
15198     ett[12] = &ett_pfcp_subseq_volume_threshold;
15199     ett[13] = &ett_pfcp_dropped_dl_traffic_threshold;
15200     ett[14] = &ett_pfcp_gate_status;
15201     ett[15] = &ett_pfcp_report_type;
15202     ett[16] = &ett_pfcp_up_function_features;
15203     ett[17] = &ett_pfcp_report_trigger;
15204     ett[18] = &ett_pfcp_volume_measurement;
15205     ett[19] = &ett_pfcp_usage_information;
15206     ett[20] = &ett_pfcp_packet_rate;
15207     ett[21] = &ett_pfcp_pfcp_dl_flow_level_marking;
15208     ett[22] = &ett_pfcp_dl_data_service_inf;
15209     ett[23] = &ett_pfcp_pfcpsmreq;
15210     ett[24] = &ett_pfcp_pfcpsrrsp;
15211     ett[25] = &ett_pfcp_measurement_info;
15212     ett[26] = &ett_pfcp_node_report_type;
15213     ett[27] = &ett_pfcp_remote_gtp_u_peer;
15214     ett[28] = &ett_pfcp_oci_flags;
15215     ett[29] = &ett_pfcp_assoc_rel_req_flags;
15216     ett[30] = &ett_pfcp_upiri_flags;
15217     ett[31] = &ett_pfcp_flow_desc;
15218     ett[32] = &ett_pfcp_tos;
15219     ett[33] = &ett_pfcp_spi;
15220     ett[34] = &ett_pfcp_flow_label;
15221     ett[35] = &ett_pfcp_subsequent_volume_quota;
15222     ett[36] = &ett_pfcp_additional_usage_reports_information;
15223     ett[37] = &ett_pfcp_mac_address;
15224     ett[38] = &ett_pfcp_c_tag;
15225     ett[39] = &ett_pfcp_s_tag;
15226     ett[40] = &ett_pfcp_proxying;
15227     ett[41] = &ett_pfcp_ethernet_filter_properties;
15228     ett[42] = &ett_pfcp_user_id;
15229     ett[43] = &ett_pfcp_ethernet_pdu_session_information;
15230     ett[44] = &ett_pfcp_sdf_filter_id;
15231     ett[45] = &ett_pfcp_adf;
15232     ett[46] = &ett_pfcp_aurl;
15233     ett[47] = &ett_pfcp_adnp;
15234     ett[48] = &ett_pfcp_pfcpsrreq;
15235     ett[49] = &ett_pfcp_pfcpaureq;
15236     ett[50] = &ett_pfcp_alternative_smf_ip_address_flags;
15237     ett[51] = &ett_pfcp_packet_replication_and_detection_carry_on_information;
15238     ett[52] = &ett_pfcp_pfcpasrsp_flags;
15239     ett[53] = &ett_pfcp_cp_pfcp_entity_ip_address_flags;
15240     ett[54] = &ett_pfcp_pfcpsereq_flags;
15241     ett[55] = &ett_pfcp_ip_multicast_address_flags;
15242     ett[56] = &ett_pfcp_source_ip_address_flags;
15243     ett[57] = &ett_pfcp_packet_rate_status;
15244     ett[58] = &ett_pfcp_create_bridge_info_for_tsc;
15245     ett[59] = &ett_pfcp_5gs_user_plane_node;
15246     ett[60] = &ett_pfcp_requested_clock_drift_control_information;
15247     ett[61] = &ett_pfcp_requested_access_availability_control_information;
15248     ett[62] = &ett_pfcp_mptcp_control_information;
15249     ett[63] = &ett_pfcp_atsss_ll_control_information;
15250     ett[64] = &ett_pfcp_pmf_control_information;
15251     ett[65] = &ett_pfcp_mptcp_entity_ip_address_information;
15252     ett[66] = &ett_pfcp_ue_link_specific_entity_ip_address;
15253     ett[67] = &ett_pfcp_pmf_address_information;
15254     ett[68] = &ett_pfcp_atsss_ll_information;
15255     ett[69] = &ett_pfcp_qos_report_trigger;
15256     ett[70] = &ett_pfcp_gtp_u_path_interface_type;
15257     ett[71] = &ett_pfcp_requested_qos_monitoring;
15258     ett[72] = &ett_pfcp_reporting_frequency;
15259     ett[73] = &ett_pfcp_packet_delay_thresholds;
15260     ett[74] = &ett_pfcp_qos_monitoring_measurement;
15261     ett[75] = &ett_pfcp_monitoring_measurement;
15262     ett[76] = &ett_pfcp_ip_version;
15263     ett[77] = &ett_pfcp_pfcpasreq_flags;
15264     ett[78] = &ett_pfcp_data_status_flags;
15265     ett[79] = &ett_pfcp_rds_configuration_information_flags;
15266     ett[80] = &ett_pfcp_number_of_ue_ip_addresses_flags;
15267     ett[81] = &ett_pfcp_l2tp_user_authentication_flags;
15268     ett[82] = &ett_pfcp_thresholds;
15269     ett[83] = &ett_pfcp_cp_ip_address_flags;
15270     ett[84] = &ett_pfcp_ip_address_and_port_number_replacement_flags;
15271     ett[85] = &ett_pfcp_mbs_session_identifier_flags;
15272     ett[86] = &ett_local_ingress_tunnel_flags;
15273     /* Enterprise */
15274     /* Travelping */
15275     ett[87] = &ett_pfcp_enterprise_travelping_error_report;
15276     /* BBF */
15277     ett[88] = &ett_pfcp_bbf_ppp_protocol_flags;
15278     ett[89] = &ett_pfcp_bbf_l2tp_endp_flags;
15279     ett[90] = &ett_pfcp_bbf_l2tp_type_flags;
15280     ett[91] = &ett_pfcp_bbf_ppp_lcp_connectivity;
15281     ett[92] = &ett_pfcp_bbf_l2tp_tunnel;
15282 
15283     static ei_register_info ei[] = {
15284         { &ei_pfcp_ie_reserved,{ "pfcp.ie_id_reserved", PI_PROTOCOL, PI_ERROR, "Reserved IE value used", EXPFILL } },
15285         { &ei_pfcp_ie_data_not_decoded,{ "pfcp.ie_data_not_decoded", PI_UNDECODED, PI_NOTE, "IE data not decoded by WS yet", EXPFILL } },
15286         { &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 } },
15287         { &ei_pfcp_ie_not_decoded_too_large,{ "pfcp.ie_not_decoded", PI_UNDECODED, PI_NOTE, "IE not decoded yet(WS:IE id too large)", EXPFILL } },
15288         { &ei_pfcp_enterprise_ie_3gpp,{ "pfcp.ie_enterprise_3gpp", PI_PROTOCOL, PI_ERROR, "IE not decoded yet(WS:No vendor dissector)", EXPFILL } },
15289         { &ei_pfcp_ie_encoding_error,{ "pfcp.ie_encoding_error", PI_PROTOCOL, PI_ERROR, "IE wrongly encoded", EXPFILL } },
15290     };
15291 
15292     module_t *module_pfcp;
15293     expert_module_t* expert_pfcp;
15294 
15295     guint last_index = NUM_INDIVIDUAL_ELEMS_PFCP, i;
15296 
15297     for (i = 0; i < (NUM_PFCP_IES-1); i++, last_index++)
15298     {
15299         ett_pfcp_elem[i] = -1;
15300         ett[last_index] = &ett_pfcp_elem[i];
15301     }
15302     for (i = 0; i < (NUM_PFCP_ENTERPRISE_TRAVELPING_IES-1); i++, last_index++)
15303     {
15304         ett_pfcp_enterprise_travelping_elem[i] = -1;
15305         ett[last_index] = &ett_pfcp_enterprise_travelping_elem[i];
15306     }
15307     for (i = 0; i < (NUM_PFCP_ENTERPRISE_BBF_IES-1); i++, last_index++)
15308     {
15309         ett_pfcp_enterprise_bbf_elem[i] = -1;
15310         ett[last_index] = &ett_pfcp_enterprise_bbf_elem[i];
15311     }
15312 
15313     proto_pfcp = proto_register_protocol("Packet Forwarding Control Protocol", "PFCP", "pfcp");
15314     pfcp_handle = register_dissector("pfcp", dissect_pfcp, proto_pfcp);
15315     module_pfcp = prefs_register_protocol(proto_pfcp, proto_reg_handoff_pfcp);
15316 
15317     proto_register_field_array(proto_pfcp, hf_pfcp, array_length(hf_pfcp));
15318     proto_register_subtree_array(ett, array_length(ett));
15319     expert_pfcp = expert_register_protocol(proto_pfcp);
15320     expert_register_field_array(expert_pfcp, ei, array_length(ei));
15321 
15322     /* Register dissector table for enterprise IE dissectors */
15323     pfcp_enterprise_ies_dissector_table = register_dissector_table("pfcp.enterprise_ies", "PFCP Enterprice IEs",
15324         proto_pfcp, FT_UINT32, BASE_DEC);
15325 
15326     pfcp_3gpp_ies_handle = register_dissector("pfcp_3gpp_ies", dissect_pfcp_3gpp_enterprise_ies, proto_pfcp);
15327     pfcp_travelping_ies_handle = register_dissector("pfcp_travelping_ies", dissect_pfcp_enterprise_travelping_ies, proto_pfcp);
15328     pfcp_bbf_ies_handle = register_dissector("pfcp_bbf_ies", dissect_pfcp_enterprise_bbf_ies, proto_pfcp);
15329 
15330     prefs_register_uint_preference(module_pfcp, "port_pfcp", "PFCP port", "PFCP port (default 8805)", 10, &g_pfcp_port);
15331     prefs_register_bool_preference(module_pfcp, "track_pfcp_session", "Track PFCP session", "Track PFCP session", &g_pfcp_session);
15332     register_init_routine(pfcp_init);
15333     register_cleanup_routine(pfcp_cleanup);
15334 
15335 }
15336 
15337 void
proto_reg_handoff_pfcp(void)15338 proto_reg_handoff_pfcp(void)
15339 {
15340     dissector_add_uint("udp.port", g_pfcp_port, pfcp_handle);
15341     /* Register 3GPP in the table to give expert info and serve as an example how to add decoding of enterprise IEs*/
15342     dissector_add_uint("pfcp.enterprise_ies", VENDOR_THE3GPP, pfcp_3gpp_ies_handle);
15343     /* Register Broadband Forum IEs */
15344     dissector_add_uint("pfcp.enterprise_ies", VENDOR_BROADBAND_FORUM, pfcp_bbf_ies_handle);
15345     /* Register Travelping IEs */
15346     dissector_add_uint("pfcp.enterprise_ies", VENDOR_TRAVELPING, pfcp_travelping_ies_handle);
15347 }
15348 
15349 /*
15350 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
15351 *
15352 * Local variables:
15353 * c-basic-offset: 4
15354 * tab-width: 8
15355 * indent-tabs-mode: nil
15356 * End:
15357 *
15358 * vi: set shiftwidth=4 tabstop=8 expandtab:
15359 * :indentSize=4:tabSize=8:noTabs=true:
15360 */
15361