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