pfcp: correction of length
[metze/wireshark/wip.git] / epan / dissectors / packet-pfcp.c
1 /* packet-pfcp.c
2 *
3 * Routines for Packet Forwarding Control Protocol (PFCP) dissection
4 *
5 * Copyright 2017, 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 V15.1.0 (2018-03-27)
14 */
15 #include "config.h"
16
17 #include <epan/packet.h>
18 #include <epan/expert.h>
19 #include <epan/sminmpec.h>
20 #include <epan/addr_resolv.h> /* Needed for BASE_ENTERPRISES */
21
22 #include "packet-ntp.h"
23
24 void proto_register_pfcp(void);
25 void proto_reg_handoff_pfcp(void);
26
27 static dissector_handle_t pfcp_handle;
28 static dissector_handle_t pfcp_3gpp_ies_handle;
29
30 #define UDP_PORT_PFCP  8805
31
32 static int proto_pfcp = -1;
33
34 static int hf_pfcp_msg_type = -1;
35 static int hf_pfcp_msg_length = -1;
36 static int hf_pfcp_hdr_flags = -1;
37 static int hf_pfcp_version = -1;
38 static int hf_pfcp_mp_flag = -1;
39 static int hf_pfcp_s_flag = -1;
40 static int hf_pfcp_seid = -1;
41 static int hf_pfcp_seqno = -1;
42 static int hf_pfcp_mp = -1;
43
44 static int hf_pfcp2_ie = -1;
45 static int hf_pfcp2_ie_len = -1;
46 static int hf_pfcp2_enterprise_ie = -1;
47 static int hf_pfcp_enterprice_id = -1;
48
49 static int hf_pfcp_spare_b2 = -1;
50 static int hf_pfcp_spare_b3 = -1;
51 static int hf_pfcp_spare_b4 = -1;
52 static int hf_pfcp_spare_b5 = -1;
53 static int hf_pfcp_spare_b6 = -1;
54 static int hf_pfcp_spare_b7 = -1;
55 static int hf_pfcp_spare_b7_b6 = -1;
56 static int hf_pfcp_spare_b7_b5 = -1;
57 static int hf_pfcp_spare_b7_b4 = -1;
58 static int hf_pfcp_spare_b7_b3 = -1;
59 static int hf_pfcp_spare_b7_b2 = -1;
60 static int hf_pfcp_spare_b7_b1 = -1;
61 static int hf_pfcp_spare_h0 = -1;
62 static int hf_pfcp_spare_h1 = -1;
63 static int hf_pfcp_spare_oct = -1;
64 static int hf_pfcp_spare = -1;
65
66 static int hf_pfcp2_cause = -1;
67 static int hf_pfcp_node_id_type = -1;
68 static int hf_pfcp_node_id_ipv4 = -1;
69 static int hf_pfcp_node_id_ipv6 = -1;
70 static int hf_pfcp_node_id_fqdn = -1;
71 static int hf_pfcp_recovery_time_stamp = -1;
72 static int hf_pfcp_f_seid_flags = -1;
73 static int hf_pfcp_b0_v6 = -1;
74 static int hf_pfcp_b1_v4 = -1;
75 static int hf_pfcp_f_seid_ipv4 = -1;
76 static int hf_pfcp_f_seid_ipv6 = -1;
77 static int hf_pfcp_pdr_id = -1;
78 static int hf_pfcp_precedence = -1;
79 static int hf_pfcp_source_interface = -1;
80 static int hf_pfcp_f_teid_flags = -1;
81 static int hf_pfcp_fteid_flg_spare = -1;
82 static int hf_pfcp_fteid_flg_b3_ch_id = -1;
83 static int hf_pfcp_fteid_flg_b2_ch = -1;
84 static int hf_pfcp_fteid_flg_b1_v6 = -1;
85 static int hf_pfcp_fteid_flg_b0_v4 = -1;
86 static int hf_pfcp_f_teid_ch_id = -1;
87 static int hf_pfcp_f_teid_teid = -1;
88 static int hf_pfcp_f_teid_ipv4 = -1;
89 static int hf_pfcp_f_teid_ipv6 = -1;
90 static int hf_pfcp_network_instance = -1;
91 static int hf_pfcp_pdn_type = -1;
92 static int hf_pfcp_failed_rule_id_type = -1;
93 static int hf_pfcp_time_qouta_mechanism_bti_type = -1;
94 static int hf_pfcp_time_qouta_mechanism_bti = -1;
95 static int hf_pfcp_multiplier_value_digits = -1;
96 static int hf_pfcp_multiplier_exponent = -1;
97 static int hf_pfcp_aggregated_urr_id_ie_urr_id = -1;
98
99 static int hf_pfcp_ue_ip_address_flags = -1;
100 static int hf_pfcp_ue_ip_address_flag_b0_v6 = -1;
101 static int hf_pfcp_ue_ip_address_flag_b1_v4 = -1;
102 static int hf_pfcp_ue_ip_address_flag_b2_sd = -1;
103 static int hf_pfcp_ue_ip_addr_ipv4 = -1;
104 static int hf_pfcp_ue_ip_add_ipv6 = -1;
105 static int hf_pfcp_application_id = -1;
106
107 static int hf_pfcp_sdf_filter_flags = -1;
108 static int hf_pfcp_sdf_filter_flags_b0_fd = -1;
109 static int hf_pfcp_sdf_filter_flags_b1_ttc = -1;
110 static int hf_pfcp_sdf_filter_flags_b2_spi = -1;
111 static int hf_pfcp_sdf_filter_flags_b3_fl = -1;
112
113 static int hf_pfcp_flow_desc_len = -1;
114 static int hf_pfcp_flow_desc = -1;
115 static int hf_pfcp_traffic_class = -1;
116 static int hf_pfcp_traffic_mask = -1;
117 static int hf_pfcp_spi = -1;
118 static int hf_pfcp_flow_label_spare_bit = -1;
119 static int hf_pfcp_flow_label = -1;
120 static int hf_pfcp_out_hdr_desc = -1;
121 static int hf_pfcp_far_id_flg = -1;
122 static int hf_pfcp_far_id = -1;
123 static int hf_pfcp_urr_id_flg = -1;
124 static int hf_pfcp_urr_id = -1;
125 static int hf_pfcp_qer_id_flg = -1;
126 static int hf_pfcp_qer_id = -1;
127 static int hf_pfcp_predef_rules_name = -1;
128
129 static int hf_pfcp_apply_action_flags = -1;
130 static int hf_pfcp_apply_action_flags_b4_dupl = -1;
131 static int hf_pfcp_apply_action_flags_b3_nocp = -1;
132 static int hf_pfcp_apply_action_flags_b2_buff = -1;
133 static int hf_pfcp_apply_action_flags_b1_forw = -1;
134 static int hf_pfcp_apply_action_flags_b0_drop = -1;
135
136 static int hf_pfcp_bar_id = -1;
137 static int hf_pfcp_fq_csid_node_id_type = -1;
138 static int hf_pfcp_num_csid = -1;
139 static int hf_pfcp_fq_csid_node_id_ipv4 = -1;
140 static int hf_pfcp_fq_csid_node_id_ipv6 = -1;
141 static int hf_pfcp_fq_csid_node_id_mcc_mnc = -1;
142 static int hf_pfcp_fq_csid_node_id_int = -1;
143 static int hf_pfcp_fq_csid = -1;
144 static int hf_pfcp_measurement_period = -1;
145 static int hf_pfcp_duration_measurement = -1;
146 static int hf_pfcp_time_of_first_packet = -1;
147 static int hf_pfcp_time_of_last_packet = -1;
148 static int hf_pfcp_dst_interface = -1;
149 static int hf_pfcp_redirect_address_type = -1;
150 static int hf_pfcp_redirect_server_addr_len = -1;
151 static int hf_pfcp_redirect_server_address = -1;
152 static int hf_pfcp_linked_urr_id = -1;
153 static int hf_pfcp_outer_hdr_desc = -1;
154 static int hf_pfcp_outer_hdr_creation_teid = -1;
155 static int hf_pfcp_outer_hdr_creation_ipv4 = -1;
156 static int hf_pfcp_outer_hdr_creation_ipv6 = -1;
157 static int hf_pfcp_outer_hdr_creation_port = -1;
158 static int hf_pfcp_time_threshold = -1;
159 static int hf_pfcp_forwarding_policy_id_len = -1;
160 static int hf_pfcp_forwarding_policy_id = -1;
161
162 static int hf_pfcp_measurement_method_flags = -1;
163 static int hf_pfcp_measurement_method_flags_b0_durat = -1;
164 static int hf_pfcp_measurement_method_flags_b1_volume = -1;
165 static int hf_pfcp_measurement_method_flags_b2_event = -1;
166
167 static int hf_pfcp_subsequent_time_threshold = -1;
168 static int hf_pfcp_inactivity_detection_time = -1;
169 static int hf_pfcp_monitoring_time = -1;
170
171 static int hf_pfcp_reporting_triggers = -1;
172 static int hf_pfcp_reporting_triggers_o5_b7_liusa = -1;
173 static int hf_pfcp_reporting_triggers_o5_b6_droth = -1;
174 static int hf_pfcp_reporting_triggers_o5_b5_stopt = -1;
175 static int hf_pfcp_reporting_triggers_o5_b4_start = -1;
176 static int hf_pfcp_reporting_triggers_o5_b3_quhti = -1;
177 static int hf_pfcp_reporting_triggers_o5_b2_timth = -1;
178 static int hf_pfcp_reporting_triggers_o5_b1_volth = -1;
179 static int hf_pfcp_reporting_triggers_o5_b0_perio = -1;
180 static int hf_pfcp_reporting_triggers_o6_b2_envcl = -1;
181 static int hf_pfcp_reporting_triggers_o6_b1_timqu = -1;
182 static int hf_pfcp_reporting_triggers_o6_b0_volqu = -1;
183
184 static int hf_pfcp_volume_threshold = -1;
185 static int hf_pfcp_volume_threshold_b2_dlvol = -1;
186 static int hf_pfcp_volume_threshold_b1_ulvol = -1;
187 static int hf_pfcp_volume_threshold_b0_tovol = -1;
188 static int hf_pfcp_volume_threshold_tovol = -1;
189 static int hf_pfcp_volume_threshold_ulvol = -1;
190 static int hf_pfcp_volume_threshold_dlvol = -1;
191
192 static int hf_pfcp_volume_quota = -1;
193 static int hf_pfcp_volume_quota_b2_dlvol = -1;
194 static int hf_pfcp_volume_quota_b1_ulvol = -1;
195 static int hf_pfcp_volume_quota_b0_tovol = -1;
196 static int hf_pfcp_volume_quota_tovol = -1;
197 static int hf_pfcp_volume_quota_ulvol = -1;
198 static int hf_pfcp_volume_quota_dlvol = -1;
199
200 static int hf_pfcp_subseq_volume_threshold = -1;
201 static int hf_pfcp_subseq_volume_threshold_b2_dlvol = -1;
202 static int hf_pfcp_subseq_volume_threshold_b1_ulvol = -1;
203 static int hf_pfcp_subseq_volume_threshold_b0_tovol = -1;
204 static int hf_pfcp_subseq_volume_threshold_tovol = -1;
205 static int hf_pfcp_subseq_volume_threshold_ulvol = -1;
206 static int hf_pfcp_subseq_volume_threshold_dlvol = -1;
207
208 static int hf_pfcp_time_quota = -1;
209 static int hf_pfcp_start_time = -1;
210 static int hf_pfcp_end_time = -1;
211 static int hf_pfcp_quota_holding_time = -1;
212 static int hf_pfcp_dropped_dl_traffic_threshold = -1;
213 static int hf_pfcp_dropped_dl_traffic_threshold_b0_dlpa = -1;
214 static int hf_pfcp_downlink_packets = -1;
215 static int hf_pfcp_qer_correlation_id = -1;
216 static int hf_pfcp_gate_status = -1;
217 static int hf_pfcp_gate_status_b0b1_dlgate = -1;
218 static int hf_pfcp_gate_status_b3b2_ulgate = -1;
219 static int hf_pfcp_ul_mbr = -1;
220 static int hf_pfcp_dl_mbr = -1;
221 static int hf_pfcp_ul_gbr = -1;
222 static int hf_pfcp_dl_gbr = -1;
223
224 static int hf_pfcp_report_type = -1;
225 static int hf_pfcp_report_type_b3_upir = -1;
226 static int hf_pfcp_report_type_b2_erir = -1;
227 static int hf_pfcp_report_type_b1_usar = -1;
228 static int hf_pfcp_report_type_b0_dldr = -1;
229
230 static int hf_pfcp_offending_ie = -1;
231
232 static int hf_pfcp_up_function_features = -1;
233 static int hf_pfcp_up_function_features_o6_b0_empu = -1;
234 static int hf_pfcp_up_function_features_o5_b7_treu = -1;
235 static int hf_pfcp_up_function_features_o5_b6_heeu = -1;
236 static int hf_pfcp_up_function_features_o5_b5_pfdm = -1;
237 static int hf_pfcp_up_function_features_o5_b4_ftup = -1;
238 static int hf_pfcp_up_function_features_o5_b3_trst = -1;
239 static int hf_pfcp_up_function_features_o5_b2_dlbd = -1;
240 static int hf_pfcp_up_function_features_o5_b1_ddnd = -1;
241 static int hf_pfcp_up_function_features_o5_b0_bucp = -1;
242
243 static int hf_pfcp_sequence_number = -1;
244 static int hf_pfcp_metric = -1;
245 static int hf_pfcp_timer_unit = -1;
246 static int hf_pfcp_timer_value = -1;
247
248 static int hf_pfcp_usage_report_trigger = -1;
249 static int hf_pfcp_usage_report_trigger_o5_b7_immer = -1;
250 static int hf_pfcp_usage_report_trigger_o5_b6_droth = -1;
251 static int hf_pfcp_usage_report_trigger_o5_b5_stopt = -1;
252 static int hf_pfcp_usage_report_trigger_o5_b4_start = -1;
253 static int hf_pfcp_usage_report_trigger_o5_b3_quhti = -1;
254 static int hf_pfcp_usage_report_trigger_o5_b2_timth = -1;
255 static int hf_pfcp_usage_report_trigger_o5_b1_volth = -1;
256 static int hf_pfcp_usage_report_trigger_o5_b0_perio = -1;
257 static int hf_pfcp_usage_report_trigger_o6_b5_envcl = -1;
258 static int hf_pfcp_usage_report_trigger_o6_b4_monit = -1;
259 static int hf_pfcp_usage_report_trigger_o6_b3_termr = -1;
260 static int hf_pfcp_usage_report_trigger_o6_b2_liusa = -1;
261 static int hf_pfcp_usage_report_trigger_o6_b1_timqu = -1;
262 static int hf_pfcp_usage_report_trigger_o6_b0_volqu = -1;
263
264 static int hf_pfcp_volume_measurement = -1;
265 static int hf_pfcp_volume_measurement_b2_dlvol = -1;
266 static int hf_pfcp_volume_measurement_b1_ulvol = -1;
267 static int hf_pfcp_volume_measurement_b0_tovol = -1;
268 static int hf_pfcp_vol_meas_tovol = -1;
269 static int hf_pfcp_vol_meas_ulvol = -1;
270 static int hf_pfcp_vol_meas_dlvol = -1;
271
272 static int hf_pfcp_cp_function_features = -1;
273 static int hf_pfcp_cp_function_features_b0_load = -1;
274 static int hf_pfcp_cp_function_features_b1_ovrl = -1;
275
276 static int hf_pfcp_usage_information = -1;
277 static int hf_pfcp_usage_information_b3_ube = -1;
278 static int hf_pfcp_usage_information_b2_uae = -1;
279 static int hf_pfcp_usage_information_b1_aft = -1;
280 static int hf_pfcp_usage_information_b0_bef = -1;
281
282 static int hf_pfcp_application_instance_id = -1;
283 static int hf_pfcp_flow_dir = -1;
284 static int hf_pfcp_packet_rate = -1;
285 static int hf_pfcp_packet_rate_b0_ulpr = -1;
286 static int hf_pfcp_packet_rate_b1_dlpr = -1;
287 static int hf_pfcp_ul_time_unit = -1;
288 static int hf_pfcp_max_ul_pr = -1;
289 static int hf_pfcp_dl_time_unit = -1;
290 static int hf_pfcp_max_dl_pr = -1;
291
292 static int hf_pfcp_dl_flow_level_marking = -1;
293 static int hf_pfcp_dl_flow_level_marking_b0_ttc = -1;
294 static int hf_pfcp_dl_flow_level_marking_b1_sci = -1;
295
296 static int hf_pfcp_sci = -1;
297 static int hf_pfcp_dl_data_notification_delay = -1;
298 static int hf_pfcp_packet_count = -1;
299 static int hf_pfcp_dl_data_service_inf_flags = -1;
300 static int hf_pfcp_dl_data_service_inf_b0_ppi = -1;
301 static int hf_pfcp_ppi = -1;
302
303 static int hf_pfcp_pfcpsmreq_flags = -1;
304 static int hf_pfcp_pfcpsmreq_flags_b0_drobu = -1;
305 static int hf_pfcp_pfcpsmreq_flags_b1_sndem = -1;
306 static int hf_pfcp_pfcpsmreq_flags_b2_qaurr = -1;
307
308 static int hf_pfcp_pfcpsrrsp_flags = -1;
309 static int hf_pfcp_pfcpsrrsp_flags_b0_drobu = -1;
310
311 static int hf_pfcp_pfd_contents_flags = -1;
312 static int hf_pfcp_pfd_contents_flags_b3_cp = -1;
313 static int hf_pfcp_pfd_contents_flags_b2_dn = -1;
314 static int hf_pfcp_pfd_contents_flags_b1_url = -1;
315 static int hf_pfcp_pfd_contents_flags_b0_fd = -1;
316
317 static int hf_pfcp_url_len = -1;
318 static int hf_pfcp_url = -1;
319 static int hf_pfcp_dn_len = -1;
320 static int hf_pfcp_dn = -1;
321 static int hf_pfcp_cp_len = -1;
322 static int hf_pfcp_cp = -1;
323 static int hf_pfcp_header_type = -1;
324 static int hf_pfcp_hf_len = -1;
325 static int hf_pfcp_hf_name = -1;
326 static int hf_pfcp_hf_val_len = -1;
327 static int hf_pfcp_hf_val = -1;
328
329 static int hf_pfcp_measurement_info = -1;
330 static int hf_pfcp_measurement_info_b0_mbqe = -1;
331 static int hf_pfcp_measurement_info_b1_inam = -1;
332 static int hf_pfcp_measurement_info_b2_radi = -1;
333
334 static int hf_pfcp_node_report_type = -1;
335 static int hf_pfcp_node_report_type_b0_upfr = -1;
336
337 static int hf_pfcp_remote_gtp_u_peer_flags = -1;
338 static int hf_pfcp_remote_gtp_u_peer_flags_b0_v6 = -1;
339 static int hf_pfcp_remote_gtp_u_peer_flags_b1_v4 = -1;
340 static int hf_pfcp_remote_gtp_u_peer_ipv4 = -1;
341 static int hf_pfcp_remote_gtp_u_peer_ipv6 = -1;
342 static int hf_pfcp_ur_seqn = -1;
343
344 static int hf_pfcp_oci_flags = -1;
345 static int hf_pfcp_oci_flags_b0_aoci = -1;
346
347 static int hf_pfcp_pfcp_assoc_rel_req_flags = -1;
348 static int hf_pfcp_pfcp_assoc_rel_req_b0_sarr = -1;
349
350 static int hf_pfcp_upiri_flags = -1;
351 static int hf_pfcp_upiri_flags_b0_v4 = -1;
352 static int hf_pfcp_upiri_flags_b1_v6 = -1;
353 static int hf_pfcp_upiri_flg_b5_assoni = -1;
354 static int hf_pfcp_upiri_teidri = -1;
355 static int hf_pfcp_upiri_teid_range = -1;
356 static int hf_pfcp_upiri_ipv4 = -1;
357 static int hf_pfcp_upiri_ipv6 = -1;
358 static int hf_pfcp_upiri_network_instance = -1;
359
360 static int hf_pfcp_user_plane_inactivity_timer = -1;
361
362 static int hf_pfcp_subsequent_volume_quota = -1;
363 static int hf_pfcp_subsequent_volume_quota_b2_dlvol = -1;
364 static int hf_pfcp_subsequent_volume_quota_b1_ulvol = -1;
365 static int hf_pfcp_subsequent_volume_quota_b0_tovol = -1;
366 static int hf_pfcp_subsequent_volume_quota_tovol = -1;
367 static int hf_pfcp_subsequent_volume_quota_ulvol = -1;
368 static int hf_pfcp_subsequent_volume_quota_dlvol = -1;
369
370 static int hf_pfcp_subsequent_time_quota = -1;
371
372 static int hf_pfcp_rqi_flag = -1;
373 static int hf_pfcp_qfi = -1;
374 static int hf_pfcp_query_urr_reference = -1;
375 static int hf_pfcp_additional_usage_reports_information = -1;
376 static int hf_pfcp_additional_usage_reports_information_b14_b0_number_value = -1;
377 static int hf_pfcp_additional_usage_reports_information_b15_auri = -1;
378
379 static int ett_pfcp = -1;
380 static int ett_pfcp_flags = -1;
381 static int ett_pfcp_ie = -1;
382 static int ett_pfcp_grouped_ie = -1;
383 static int ett_pfcp_f_seid_flags = -1;
384 static int ett_f_teid_flags = -1;
385 static int ett_pfcp_ue_ip_address_flags = -1;
386 static int ett_pfcp_sdf_filter_flags = -1;
387 static int ett_pfcp_apply_action_flags = -1;
388 static int ett_pfcp_measurement_method_flags = -1;
389 static int ett_pfcp_reporting_triggers = -1;
390 static int ett_pfcp_volume_threshold = -1;
391 static int ett_pfcp_volume_quota = -1;
392 static int ett_pfcp_subseq_volume_threshold = -1;
393 static int ett_pfcp_dropped_dl_traffic_threshold = -1;
394 static int ett_pfcp_gate_status = -1;
395 static int ett_pfcp_report_type = -1;
396 static int ett_pfcp_up_function_features = -1;
397 static int ett_pfcp_report_trigger = -1;
398 static int ett_pfcp_volume_measurement = -1;
399 static int ett_pfcp_cp_function_features = -1;
400 static int ett_pfcp_usage_information = -1;
401 static int ett_pfcp_packet_rate = -1;
402 static int ett_pfcp_pfcp_dl_flow_level_marking = -1;
403 static int ett_pfcp_dl_data_service_inf = -1;
404 static int ett_pfcp_pfcpsmreq = -1;
405 static int ett_pfcp_pfcpsrrsp = -1;
406 static int ett_pfcp_measurement_info = -1;
407 static int ett_pfcp_node_report_type = -1;
408 static int ett_pfcp_remote_gtp_u_peer = -1;
409 static int ett_pfcp_oci_flags = -1;
410 static int ett_sx_assoc_rel_req_flags = -1;
411 static int ett_pfcp_upiri_flags = -1;
412 static int ett_pfcp_flow_desc = -1;
413 static int ett_pfcp_tos = -1;
414 static int ett_pfcp_spi = -1;
415 static int ett_pfcp_flow_label = -1;
416 static int ett_pfcp_subsequent_volume_quota = -1;
417 static int ett_pfcp_additional_usage_reports_information = -1;
418
419
420 static expert_field ei_pfcp_ie_reserved = EI_INIT;
421 static expert_field ei_pfcp_ie_data_not_decoded = EI_INIT;
422 static expert_field ei_pfcp_ie_not_decoded_null = EI_INIT;
423 static expert_field ei_pfcp_ie_not_decoded_to_large = EI_INIT;
424 static expert_field ei_pfcp_enterprise_ie_3gpp = EI_INIT;
425 static expert_field ei_pfcp_ie_encoding_error = EI_INIT;
426
427
428
429 static dissector_table_t pfcp_enterprise_ies_dissector_table;
430
431 static void dissect_pfcp_ies_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, gint offset, guint8 message_type);
432 static void dissect_pfcp_create_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
433 static void dissect_pfcp_pdi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
434 static void dissect_pfcp_create_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
435 static void dissect_pfcp_forwarding_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
436 static void dissect_pfcp_duplicating_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
437 static void dissect_pfcp_create_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
438 static void dissect_pfcp_create_qer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
439 static void dissect_pfcp_created_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
440 static void dissect_pfcp_update_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
441 static void dissect_pfcp_update_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
442 static void dissect_pfcp_upd_forwarding_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
443 static void dissect_pfcp_update_bar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
444 static void dissect_pfcp_update_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
445 static void dissect_pfcp_update_qer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
446 static void dissect_pfcp_remove_pdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
447 static void dissect_pfcp_remove_far(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
448 static void dissect_pfcp_remove_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
449 static void dissect_pfcp_remove_qer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
450 static void dissect_pfcp_load_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
451 static void dissect_pfcp_overload_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
452 static void dissect_pfcp_application_ids_pfds(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
453 static void dissect_pfcp_pfd_context(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
454 static void dissect_pfcp_application_detection_inf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
455 static void dissect_pfcp_pfcp_query_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
456 static void dissect_pfcp_usage_report_smr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
457 static void dissect_pfcp_usage_report_sdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
458 static void dissect_pfcp_usage_report_srr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
459 static void dissect_pfcp_downlink_data_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
460 static void dissect_pfcp_create_bar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
461 static void dissect_pfcp_update_bar_smr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
462 static void dissect_pfcp_remove_bar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
463 static void dissect_pfcp_error_indication_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
464 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);
465 static void dissect_pfcp_update_duplicating_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
466 static void dissect_pfcp_aggregated_urrs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
467
468 static const true_false_string pfcp_id_predef_dynamic_tfs = {
469     "Predefined by UP",
470     "Dynamic by CP",
471 };
472
473 #define PFCP_MSG_RESERVED_0    0
474
475 static const value_string pfcp_message_type[] = {
476     {PFCP_MSG_RESERVED_0,             "Reserved"},
477     /* Sx Node related messages */
478
479     { 1, "Sx Heartbeat Request"},
480     { 2, "Sx Heartbeat Response"},
481     { 3, "Sx PFD Management Request"},
482     { 4, "Sx PFD Management Response"},
483     { 5, "Sx Association Setup Request"},
484     { 6, "Sx Association Setup Response"},
485     { 7, "Sx Association Update Request"},
486     { 8, "Sx Association Update Response"},
487     { 9, "Sx Association Release Request"},
488     { 10, "Sx Association Release Response"},
489     { 11, "Sx Version Not Supported Response"},
490     { 12, "Sx Node Report Request"},
491     { 13, "Sx Node Report Response"},
492     { 14, "Sx Session Set Deletion Request"},
493     { 15, "Sx Session Set Deletion Response"},
494     //16 to 49    For future use
495     //Sx Session related messages
496     { 50, "Sx Session Establishment Request"},
497     { 51, "Sx Session Establishment Response"},
498     { 52, "Sx Session Modification Request"},
499     { 53, "Sx Session Modification Response"},
500     { 54, "Sx Session Deletion Request"},
501     { 55, "Sx Session Deletion Response"},
502     { 56, "Sx Session Report Request"},
503     { 57, "Sx Session Report Response"},
504     //58 to 99    For future use
505     //Other messages
506     //100 to 255     For future use
507     {0, NULL}
508 };
509 static value_string_ext pfcp_message_type_ext = VALUE_STRING_EXT_INIT(pfcp_message_type);
510
511 /* 8.1.2    Information Element Types */
512 #define PFCP_IE_ID_CREATE_PDR                   1
513 #define PFCP_IE_ID_PDI                          2
514 #define PFCP_IE_CREATE_FAR                      3
515 #define PFCP_IE_FORWARDING_PARAMETERS           4
516 #define PFCP_IE_DUPLICATING_PARAMETERS          5
517 #define PFCP_IE_CREATE_URR                      6
518 #define PFCP_IE_CREATE_QER                      7
519 #define PFCP_IE_CREATED_PDR                     8
520 #define PFCP_IE_UPDATE_PDR                      9
521 #define PFCP_IE_UPDATE_FAR                     10
522 #define PFCP_IE_UPD_FORWARDING_PARAM   11
523 #define PFCP_IE_UPDATE_BAR                     12
524 #define PFCP_IE_UPDATE_URR                     13
525 #define PFCP_IE_UPDATE_QER                     14
526 #define PFCP_IE_REMOVE_PDR                     15
527 #define PFCP_IE_REMOVE_FAR                     16
528 #define PFCP_IE_REMOVE_URR                     17
529 #define PFCP_IE_REMOVE_QER                     18
530
531 #define PFCP_LOAD_CONTROL_INFORMATION          51
532 #define PFCP_OVERLOAD_CONTROL_INFORMATION      54
533 #define PFCP_APPLICATION_IDS_PFDS              58
534 #define PFCP_PFD_CONTEXT                       59
535 #define PFCP_APPLICATION_DETECTION_INF         68
536 #define PFCP_QUERY_URR                         77
537 #define PFCP_USAGE_REPORT_SMR                  78
538 #define PFCP_USAGE_REPORT_SDR                  79
539 #define PFCP_USAGE_REPORT_SRR                  80
540 #define PFCP_DOWNLINK_DATA_REPORT              83
541 #define PFCP_CREATE_BAR                        85
542 #define PFCP_UPDATE_BAR_SMR                    86
543 #define PFCP_REMOVE_BAR                        87
544 #define PFCP_ERROR_INDICATION_REPORT           99
545 #define PFCP_USER_PLANE_PATH_FAILURE_REPORT   102
546 #define PFCP_UPDATE_DUPLICATING_PARAMETERS    105
547 #define PFCP_AGGREGATED_URRS                  118
548
549 static const value_string pfcp_ie_type[] = {
550
551     { 0, "Reserved"},
552     { 1, "Create PDR"},                                             /* Extendable / Table 7.5.2.2-1 */
553     { 2, "PDI"},                                                    /* Extendable / Table 7.5.2.2-2 */
554     { 3, "Create FAR"},                                             /* Extendable / Table 7.5.2.3-1 */
555     { 4, "Forwarding Parameters"},                                  /* Extendable / Table 7.5.2.3-2 */
556     { 5, "Duplicating Parameters"},                                 /* Extendable / Table 7.5.2.3-3 */
557     { 6, "Create URR"},                                             /* Extendable / Table 7.5.2.4-1 */
558     { 7, "Create QER"},                                             /* Extendable / Table 7.5.2.5-1 */
559     { 8, "Created PDR"},                                            /* Extendable / Table 7.5.3.2-1 */
560     { 9, "Update PDR" },                                            /* Extendable / Table 7.5.4.2-1 */
561     { 10, "Update FAR" },                                           /* Extendable / Table 7.5.4.3-1 */
562     { 11, "Update Forwarding Parameters" },                         /* Extendable / Table 7.5.4.3-2 */
563     { 12, "Update BAR (Sx Session Report Response)" },              /* Extendable / Table 7.5.9.2-1 */
564     { 13, "Update URR" },                                           /* Extendable / Table 7.5.4.4 */
565     { 14, "Update QER" },                                           /* Extendable / Table 7.5.4.5 */
566     { 15, "Remove PDR" },                                           /* Extendable / Table 7.5.4.6 */
567     { 16, "Remove FAR" },                                           /* Extendable / Table 7.5.4.7 */
568     { 17, "Remove URR" },                                           /* Extendable / Table 7.5.4.8 */
569     { 18, "Remove QER" },                                           /* Extendable / Table 7.5.4.9 */
570     { 19, "Cause" },                                                /* Fixed / Subclause 8.2.1 */
571     { 20, "Source Interface" },                                     /* Extendable / Subclause 8.2.2 */
572     { 21, "F-TEID" },                                               /* Extendable / Subclause 8.2.3 */
573     { 22, "Network Instance" },                                     /* Variable Length / Subclause 8.2.4 */
574     { 23, "SDF Filter" },                                           /* Extendable / Subclause 8.2.5 */
575     { 24, "Application ID" },                                       /* Variable Length / Subclause 8.2.6 */
576     { 25, "Gate Status" },                                          /* Extendable / Subclause 8.2.7 */
577     { 26, "MBR" },                                                  /* Extendable / Subclause 8.2.8 */
578     { 27, "GBR" },                                                  /* Extendable / Subclause 8.2.9 */
579     { 28, "QER Correlation ID" },                                   /* Extendable / Subclause 8.2.10 */
580     { 29, "Precedence" },                                           /* Extendable / Subclause 8.2.11 */
581     { 30, "DL Transport Level Marking" },                           /* Extendable / Subclause 8.2.12 */
582     { 31, "Volume Threshold" },                                     /* Extendable /Subclause 8.2.13 */
583     { 32, "Time Threshold" },                                       /* Extendable /Subclause 8.2.14 */
584     { 33, "Monitoring Time" },                                      /* Extendable /Subclause 8.2.15 */
585     { 34, "Subsequent Volume Threshold" },                          /* Extendable /Subclause 8.2.16 */
586     { 35, "Subsequent Time Threshold" },                            /* Extendable /Subclause 8.2.17 */
587     { 36, "Inactivity Detection Time" },                            /* Extendable /Subclause 8.2.18 */
588     { 37, "Reporting Triggers" },                                   /* Extendable /Subclause 8.2.19 */
589     { 38, "Redirect Information" },                                 /* Extendable /Subclause 8.2.20 */
590     { 39, "Report Type" },                                          /* Extendable / Subclause 8.2.21 */
591     { 40, "Offending IE" },                                         /* Fixed / Subclause 8.2.22 */
592     { 41, "Forwarding Policy" },                                    /* Extendable / Subclause 8.2.23 */
593     { 42, "Destination Interface" },                                /* Extendable / Subclause 8.2.24 */
594     { 43, "UP Function Features" },                                 /* Extendable / Subclause 8.2.25 */
595     { 44, "Apply Action" },                                         /* Extendable / Subclause 8.2.26 */
596     { 45, "Downlink Data Service Information" },                    /* Extendable / Subclause 8.2.27 */
597     { 46, "Downlink Data Notification Delay" },                     /* Extendable / Subclause 8.2.28 */
598     { 47, "DL Buffering Duration" },                                /* Extendable / Subclause 8.2.29 */
599     { 48, "DL Buffering Suggested Packet Count" },                  /* Variable / Subclause 8.2.30 */
600     { 49, "PFCPSMReq-Flags" },                                      /* Extendable / Subclause 8.2.31 */
601     { 50, "PFCPSRRsp-Flags" },                                      /* Extendable / Subclause 8.2.32 */
602     { 51, "Load Control Information" },                             /* Extendable / Table 7.5.3.3-1 */
603     { 52, "Sequence Number" },                                      /* Fixed Length / Subclause 8.2.33 */
604     { 53, "Metric" },                                               /* Fixed Length / Subclause 8.2.34 */
605     { 54, "Overload Control Information" },                         /* Extendable / Table 7.5.3.4-1 */
606     { 55, "Timer" },                                                /* Extendable / Subclause 8.2 35 */
607     { 56, "Packet Detection Rule ID" },                             /* Extendable / Subclause 8.2 36 */
608     { 57, "F-SEID" },                                               /* Extendable / Subclause 8.2 37 */
609     { 58, "Application ID's PFDs" },                                /* Extendable / Table 7.4.3.1-2 */
610     { 59, "PFD context" },                                          /* Extendable / Table 7.4.3.1-3 */
611     { 60, "Node ID" },                                              /* Extendable / Subclause 8.2.38 */
612     { 61, "PFD contents" },                                         /* Extendable / Subclause 8.2.39 */
613     { 62, "Measurement Method" },                                   /* Extendable / Subclause 8.2.40 */
614     { 63, "Usage Report Trigger" },                                 /* Extendable / Subclause 8.2.41 */
615     { 64, "Measurement Period" },                                   /* Extendable / Subclause 8.2.42 */
616     { 65, "FQ-CSID" },                                              /* Extendable / Subclause 8.2.43 */
617     { 66, "Volume Measurement" },                                   /* Extendable / Subclause 8.2.44 */
618     { 67, "Duration Measurement" },                                 /* Extendable / Subclause 8.2.45 */
619     { 68, "Application Detection Information" },                    /* Extendable / Table 7.5.8.3-2 */
620     { 69, "Time of First Packet" },                                 /* Extendable / Subclause 8.2.46 */
621     { 70, "Time of Last Packet" },                                  /* Extendable / Subclause 8.2.47 */
622     { 71, "Quota Holding Time" },                                   /* Extendable / Subclause 8.2.48 */
623     { 72, "Dropped DL Traffic Threshold" },                         /* Extendable / Subclause 8.2.49 */
624     { 73, "Volume Quota" },                                         /* Extendable / Subclause 8.2.50 */
625     { 74, "Time Quota" },                                           /* Extendable / Subclause 8.2.51 */
626     { 75, "Start Time" },                                           /* Extendable / Subclause 8.2.52 */
627     { 76, "End Time" },                                             /* Extendable / Subclause 8.2.53 */
628     { 77, "Query URR" },                                            /* Extendable / Table 7.5.4.10-1 */
629     { 78, "Usage Report (in Session Modification Response)" },      /* Extendable / Table 7.5.5.2-1 */
630     { 79, "Usage Report (Session Deletion Response)" },             /* Extendable / Table 7.5.7.2-1 */
631     { 80, "Usage Report (Session Report Request)" },                /* Extendable / Table 7.5.8.3-1 */
632     { 81, "URR ID" },                                               /* Extendable / Subclause 8.2.54 */
633     { 82, "Linked URR ID" },                                        /* Extendable / Subclause 8.2.55 */
634     { 83, "Downlink Data Report" },                                 /* Extendable / Table 7.5.8.2-1 */
635     { 84, "Outer Header Creation" },                                /* Extendable / Subclause 8.2.56 */
636     { 85, "Create BAR" },                                           /* Extendable / Table 7.5.2.6-1 */
637     { 86, "Update BAR (Session Modification Request)" },            /* Extendable / Table 7.5.4.11-1 */
638     { 87, "Remove BAR" },                                           /* Extendable / Table 7.5.4.12-1 */
639     { 88, "BAR ID" },                                               /* Extendable / Subclause 8.2.57 */
640     { 89, "CP Function Features" },                                 /* Extendable / Subclause 8.2.58 */
641     { 90, "Usage Information" },                                    /* Extendable / Subclause 8.2.59 */
642     { 91, "Application Instance ID" },                              /* Variable Length / Subclause 8.2.60 */
643     { 92, "Flow Information" },                                     /* Extendable / Subclause 8.2.61 */
644     { 93, "UE IP Address" },                                        /* Extendable / Subclause 8.2.62 */
645     { 94, "Packet Rate" },                                          /* Extendable / Subclause 8.2.63 */
646     { 95, "Outer Header Removal" },                                 /* Extendable / Subclause 8.2.64 */
647     { 96, "Recovery Time Stamp" },                                  /* Extendable / Subclause 8.2.65 */
648     { 97, "DL Flow Level Marking" },                                /* Extendable / Subclause 8.2.66 */
649     { 98, "Header Enrichment" },                                    /* Extendable / Subclause 8.2.67 */
650     { 99, "Error Indication Report" },                              /* Extendable / Table 7.5.8.4-1 */
651     { 100, "Measurement Information" },                             /* Extendable / Subclause 8.2.68 */
652     { 101, "Node Report Type" },                                    /* Extendable / Subclause 8.2.69 */
653     { 102, "User Plane Path Failure Report" },                      /* Extendable / Table 7.4.5.1.2-1 */
654     { 103, "Remote GTP-U Peer" },                                   /* Extendable / Subclause 8.2.70 */
655     { 104, "UR-SEQN" },                                             /* Fixed Length / Subclause 8.2.71 */
656     { 105, "Update Duplicating Parameters" },                       /* Extendable / Table 7.5.4.3-3 */
657     { 106, "Activate Predefined Rules" },                           /* Variable Length / Subclause 8.2.72 */
658     { 107, "Deactivate Predefined Rules" },                         /* Variable Length / Subclause 8.2.73 */
659     { 108, "FAR ID" },                                              /* Extendable / Subclause 8.2.74 */
660     { 109, "QER ID" },                                              /* Extendable / Subclause 8.2.75 */
661     { 110, "OCI Flags" },                                           /* Extendable / Subclause 8.2.76 */
662     { 111, "Sx Association Release Request" },                      /* Extendable / Subclause 8.2.77 */
663     { 112, "Graceful Release Period" },                             /* Extendable / Subclause 8.2.78 */
664     { 113, "PDN Type" },                                            /* Fixed Length / Subclause 8.2.79 */
665     { 114, "Failed Rule ID" },                                      /* Extendable / Subclause 8.2.80 */
666     { 115, "Time Quota Mechanism" },                                /* Extendable / Subclause 8.2.81 */
667     { 116, "User Plane IP Resource Information" },                  /* Extendable / Subclause 8.2.82 */
668     { 117, "User Plane Inactivity Timer" },                         /* Extendable / Subclause 8.2.83 */
669     { 118, "Aggregated URRs" },                                     /* Extendable / Table 7.5.2.4-2 */
670     { 119, "Multiplier" },                                          /* Fixed Length / Subclause 8.2.84 */
671     { 120, "Aggregated URR ID IE" },                                /* Fixed Length / Subclause 8.2.85 */
672     { 121, "Subsequent Volume Quota" },                             /* Extendable / Subclause 8.2.86 */
673     { 122, "Subsequent Time Quota" },                               /* Extendable / Subclause 8.2.87 */
674     { 123, "RQI"},                                                  /* Extendable / Subclause 8.2.88 */
675     { 124, "QFI"},                                                  /* Extendable / Subclause 8.2.89 */
676     { 125, "Query URR Reference"},                                  /* Extendable / Subclause 8.2.90 */
677     { 126, "Additional Usage Reports Information"},                 /* Extendable / Subclause 8.2.91 */
678     //    { 127, "Create Traffic Endpoint"},                        /* Extendable / Table 7.5.2.7 */
679     //    { 128, "Created Traffic Endpoint"},                       /* Extendable / Table 7.5.3.5 */
680     //    { 129, "Update Traffic Endpoint"},                        /* Extendable / Table 7.5.4.13 */
681     //    { 130, "Remove Traffic Endpoint"},                        /* Extendable / Table 7.5.4.14 */
682     //    { 131, "Traffic Endpoint ID"},                            /* Extendable / Subclause 8.2.92 */
683     //    { 132, "Ethernet Packet Filter"},                         /* Extendable / Table 7.5.2.2-3 */
684     //    { 133, "MAC address"},                                    /* Extendable / Subclause 8.2.93 */
685     //    { 134, "C-TAG"},                                          /* Extendable / Subclause 8.2.94 */
686     //    { 135, "S-TAG"},                                          /* Extendable / Subclause 8.2.95 */
687     //    { 136, "Ethertype"},                                      /* Extendable / Subclause 8.2.96 */
688     //    { 137, "Proxying"},                                       /* Extendable / Subclause 8.2.97 */
689     //    { 138, "Ethernet Filter ID"},                             /* Extendable / Subclause 8.2.98 */
690     //    { 139, "Ethernet Filter Properties"},                     /* Extendable / Subclause 8.2.99 */
691     //140 to    65535 Spare. For future use.
692     {0, NULL}
693 };
694
695 static value_string_ext pfcp_ie_type_ext = VALUE_STRING_EXT_INIT(pfcp_ie_type);
696
697 static void
698 dissect_pfcp_reserved(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
699 {
700     proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_reserved, tvb, 0, length);
701 }
702
703 /*
704  * 8.2.1    Cause
705  */
706 static const value_string pfcp_cause_vals[] = {
707
708     {  0, "Reserved" },
709     {  1, "Request accepted(success)" },
710     /* 2 - 63 Spare. */
711     { 64, "Request rejected(reason not specified)" },
712     { 65, "Session context not found" },
713     { 66, "Mandatory IE missing" },
714     { 67, "Conditional IE missing" },
715     { 68, "Invalid length" },
716     { 69, "Mandatory IE incorrect" },
717     { 70, "Invalid Forwarding Policy" },
718     { 71, "Invalid F - TEID allocation option" },
719     { 72, "No established Sx Association" },
720     { 73, "Rule creation / modification Failure" },
721     { 74, "PFCP entity in congestion" },
722     { 75, "No resources available" },
723     { 76, "Service not supported" },
724     { 77, "System failure" },
725     /* 78 to 255 Spare for future use in a response message. */
726     {0, NULL}
727 };
728
729 static void
730 dissect_pfcp_cause(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
731 {
732     guint32 value;
733     /* Octet 5 Cause value */
734     proto_tree_add_item_ret_uint(tree, hf_pfcp2_cause, tvb, 0, 1, ENC_BIG_ENDIAN, &value);
735     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_cause_vals, "Unknown"));
736 }
737 /*
738  * 8.2.2    Source Interface
739  */
740 static const value_string pfcp_source_interface_vals[] = {
741
742     { 0, "Access" },
743     { 1, "Core" },
744     { 2, "SGi-LAN" },
745     { 3, "CP-function" },
746     { 0, NULL }
747 };
748 static void
749 dissect_pfcp_source_interface(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
750 {
751     int offset = 0;
752     guint32 value;
753     /* Octet 5 Spare    Interface value */
754     proto_tree_add_item(tree, hf_pfcp_spare_h1, tvb, offset, 1, ENC_BIG_ENDIAN);
755     proto_tree_add_item_ret_uint(tree, hf_pfcp_source_interface, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
756     offset += 1;
757
758     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_source_interface_vals, "Unknown"));
759
760     if (offset < length) {
761         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
762     }
763
764 }
765 /*
766  * 8.2.3    F-TEID
767  */
768 static void
769 dissect_pfcp_f_teid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
770 {
771     int offset = 0;
772     guint64 fteid_flags_val;
773
774     static const int * pfcp_fteid_flags[] = {
775         &hf_pfcp_fteid_flg_spare,
776         &hf_pfcp_fteid_flg_b3_ch_id,
777         &hf_pfcp_fteid_flg_b2_ch,
778         &hf_pfcp_fteid_flg_b1_v6,
779         &hf_pfcp_fteid_flg_b0_v4,
780         NULL
781     };
782     /* Octet 5  Spare  Spare  Spare  Spare  CHID  CH  V6  V4*/
783     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_f_teid_flags,
784         ett_f_teid_flags, pfcp_fteid_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &fteid_flags_val);
785     offset += 1;
786     /* The following flags are coded within Octet 5:
787      * 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,
788      *         otherwise the IPv4 address field shall not be present.
789      * 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,
790      *         otherwise the IPv6 address field shall not be present.
791      * Bit 3 - CH (CHOOSE): If this bit is set to "1", then the TEID, IPv4 address and IPv6 address fields shall not be
792      *         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.
793      *         This bit shall only be set by the CP function.
794      * Bit 4 - CHID (CHOOSE_ID):If this bit is set to "1", then the UP function shall assign the same F-TEID to the
795      *         PDRs requested to be created in a Sx Session Establishment Request or Sx Session Modification Request with
796      *         the same CHOOSE ID value.
797      *         This bit may only be set to "1" if the CH bit is set to "1".
798      *         This bit shall only be set by the CP function.
799      */
800
801     if ((fteid_flags_val & 0x4) == 4) {
802         if ((fteid_flags_val & 0x8) == 8) {
803             proto_tree_add_item(tree, hf_pfcp_f_teid_ch_id, tvb, offset, 1, ENC_NA);
804             offset += 1;
805         }
806     } else {
807
808         /* Octet 6 to 9    TEID */
809         proto_tree_add_item(tree, hf_pfcp_f_teid_teid, tvb, offset, 4, ENC_BIG_ENDIAN);
810         proto_item_append_text(item, "TEID: 0x%s", tvb_bytes_to_str(wmem_packet_scope(), tvb, offset, 4));
811         offset += 4;
812
813         if ((fteid_flags_val & 0x1) == 1) {
814             /* m to (m+3)    IPv4 address */
815             proto_tree_add_item(tree, hf_pfcp_f_teid_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
816             proto_item_append_text(item, ", IPv4 %s", tvb_ip_to_str(tvb, offset));
817             offset += 4;
818         }
819         if ((fteid_flags_val & 0x2) == 2) {
820             /* p to (p+15)   IPv6 address */
821             proto_tree_add_item(tree, hf_pfcp_f_teid_ipv6, tvb, offset, 16, ENC_NA);
822             proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(tvb, offset));
823             offset += 16;
824         }
825         /* If the value of CH bit is set to "0", but the value of CHID bit is "1" */
826         if ((fteid_flags_val & 0x8) == 8) {
827             proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, 0, 1);
828         }
829     }
830     if (offset < length) {
831         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
832     }
833
834 }
835 /*
836  * 8.2.4    Network Instance
837  */
838 static void
839 dissect_pfcp_network_instance(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
840 {
841     int offset = 0;
842     /* Octet 5 5 to (n+4)   Network Instance
843      * The Network instance field shall be encoded as an OctetString
844      */
845     proto_tree_add_item(tree, hf_pfcp_network_instance, tvb, offset, length, ENC_NA);
846 }
847 /*
848  * 8.2.5    SDF Filter
849  */
850 static void
851 dissect_pfcp_sdf_filter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
852 {
853     int offset = 0;
854     guint64 flags_val;
855     guint32 fd_length;
856     proto_tree *flow_desc_tree, *tos_tree, *spi_tree, *flow_label_tree;
857
858     static const int * pfcp_sdf_filter_flags[] = {
859         &hf_pfcp_spare_h1,
860         &hf_pfcp_sdf_filter_flags_b3_fl,
861         &hf_pfcp_sdf_filter_flags_b2_spi,
862         &hf_pfcp_sdf_filter_flags_b1_ttc,
863         &hf_pfcp_sdf_filter_flags_b0_fd,
864         NULL
865     };
866     /* Octet 5  Spare   FL  SPI TTC FD*/
867     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_sdf_filter_flags,
868         ett_pfcp_sdf_filter_flags, pfcp_sdf_filter_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &flags_val);
869     offset += 1;
870     /* Octet 6 Spare*/
871     proto_tree_add_item(tree, hf_pfcp_spare, tvb, offset, 1, ENC_BIG_ENDIAN);
872     offset += 1;
873
874     if ((flags_val & 0x1) == 1) {
875         /* FD (Flow Description): If this bit is set to "1",
876          * then the Length of Flow Description and the Flow Description fields shall be present
877          */
878         flow_desc_tree = proto_item_add_subtree(item, ett_pfcp_flow_desc);
879         /* m to (m+1)    Length of Flow Description */
880         proto_tree_add_item_ret_uint(flow_desc_tree, hf_pfcp_flow_desc_len, tvb, offset, 2, ENC_BIG_ENDIAN, &fd_length);
881         offset += 2;
882         /* Flow Description
883          * The Flow Description field, when present, shall be encoded as an OctetString
884          * as specified in subclause 5.4.2 of 3GPP TS 29.212
885          */
886         proto_tree_add_item(flow_desc_tree, hf_pfcp_flow_desc, tvb, offset, fd_length, ENC_ASCII|ENC_NA);
887         offset += fd_length;
888     }
889     if ((flags_val & 0x2) == 2) {
890         /* TTC (ToS Traffic Class): If this bit is set to "1", then the ToS Traffic Class field shall be present */
891         /* ToS Traffic Class field, when present, shall be encoded as an OctetString on two octets
892          * as specified in subclause 5.3.15 of 3GPP TS 29.212
893          */
894         tos_tree = proto_item_add_subtree(item, ett_pfcp_tos);
895         proto_tree_add_item(tos_tree, hf_pfcp_traffic_class, tvb, offset, 1, ENC_BIG_ENDIAN);
896         offset += 1;
897         proto_tree_add_item(tos_tree, hf_pfcp_traffic_mask, tvb, offset, 1, ENC_BIG_ENDIAN);
898         offset += 1;
899     }
900
901     if ((flags_val & 0x4) == 4) {
902         /* SPI (The Security Parameter Index) field, when present, shall be encoded as an OctetString on four octets and shall
903          * contain the IPsec security parameter index (which is a 32-bit field),
904          * as specified in subclause 5.3.51 of 3GPP TS 29.212
905          */
906         spi_tree = proto_item_add_subtree(item, ett_pfcp_spi);
907         proto_tree_add_item(spi_tree, hf_pfcp_spi, tvb, offset, 4, ENC_BIG_ENDIAN);
908         offset += 4;
909     }
910     if ((flags_val & 0x8) == 8) {
911         /* FL (Flow Label), when present, shall be encoded as an OctetString on 3 octets as specified in
912          * subclause 5.3.52 of 3GPP TS 29.212 and shall contain an IPv6 flow label (which is a 20-bit field).
913          * The bits 8 to 5 of the octet "v" shall be spare and set to zero, and the remaining 20 bits shall
914          * contain the IPv6 flow label.*/
915         flow_label_tree = proto_item_add_subtree(item, ett_pfcp_flow_label);
916         proto_tree_add_bits_item(flow_label_tree, hf_pfcp_flow_label_spare_bit, tvb, (offset<<3), 4, ENC_BIG_ENDIAN);
917         proto_tree_add_item(flow_label_tree, hf_pfcp_flow_label, tvb, offset, 3, ENC_BIG_ENDIAN);
918         offset += 3;
919     }
920
921     if (offset < length) {
922         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
923     }
924 }
925 /*
926  * 8.2.6    Application ID
927  */
928 static void
929 dissect_pfcp_application_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
930 {
931     int offset = 0;
932     /* Octet 5 to (n+4) Application Identifier
933     * The Application Identifier shall be encoded as an OctetString (see 3GPP TS 29.212)
934     */
935     proto_tree_add_item(tree, hf_pfcp_application_id, tvb, offset, length, ENC_NA);
936 }
937 /*
938  * 8.2.7    Gate Status
939  */
940 static const value_string pfcp_gate_status_vals[] = {
941     { 0, "OPEN" },
942     { 1, "CLOSED" },
943     { 0, NULL }
944 };
945
946
947 static void
948 dissect_pfcp_gate_status(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
949 {
950     int offset = 0;
951
952     static const int * pfcp_gate_status_flags[] = {
953         &hf_pfcp_gate_status_b3b2_ulgate,
954         &hf_pfcp_gate_status_b0b1_dlgate,
955         NULL
956     };
957     /* Octet 5  Spare   UL Gate DL Gate */
958     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_gate_status,
959         ett_pfcp_gate_status, pfcp_gate_status_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
960     offset += 1;
961
962     if (offset < length) {
963         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
964     }
965
966 }
967
968
969 /*
970  * 8.2.8    MBR
971  */
972 static void
973 dissect_pfcp_mbr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
974 {
975     int offset = 0;
976     int len1 = (length != 10) ? length/2 : 5;
977
978     /* In case length is not in accordance with documentation */
979     if ( length != 10) {
980         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, 0, 1);
981     }
982
983     /* 5 to 9   UL MBR
984     * The UL/DL MBR fields shall be encoded as kilobits per second (1 kbps = 1000 bps) in binary value
985     */
986     proto_tree_add_item(tree, hf_pfcp_ul_mbr, tvb, offset, len1, ENC_BIG_ENDIAN);
987     offset += len1;
988
989     /* 10 to 14 DL MBR */
990     proto_tree_add_item(tree, hf_pfcp_dl_mbr, tvb, offset, len1, ENC_BIG_ENDIAN);
991     offset += len1;
992
993     if (offset < length) {
994         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
995     }
996
997 }
998
999 /*
1000  * 8.2.9    GBR
1001  */
1002 static void
1003 dissect_pfcp_gbr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1004 {
1005     int offset = 0;
1006     int len1 = (length != 10) ? length/2 : 5;
1007
1008     /* In case length is not in accordance with documentation */
1009     if ( length != 10) {
1010         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, 0, 1);
1011     }
1012
1013     /* 5 to 9   UL GBR
1014     * The UL/DL MBR fields shall be encoded as kilobits per second (1 kbps = 1000 bps) in binary value
1015     */
1016     proto_tree_add_item(tree, hf_pfcp_ul_gbr, tvb, offset, len1, ENC_BIG_ENDIAN);
1017     offset += len1;
1018
1019     /* 10 to 14 DL GBR */
1020     proto_tree_add_item(tree, hf_pfcp_dl_gbr, tvb, offset, len1, ENC_BIG_ENDIAN);
1021     offset += len1;
1022
1023     if (offset < length) {
1024         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1025     }
1026
1027 }
1028
1029 /*
1030  * 8.2.10   QER Correlation ID
1031  */
1032 static void
1033 dissect_pfcp_qer_correlation_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
1034 {
1035     int offset = 0;
1036     guint32 value;
1037     /* 5 to 8   QER Correlation ID value */
1038     proto_tree_add_item_ret_uint(tree, hf_pfcp_qer_correlation_id, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
1039     offset += 4;
1040
1041     proto_item_append_text(item, "%u", value);
1042
1043     if (offset < length) {
1044         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1045     }
1046
1047 }
1048 /*
1049  * 8.2.11   Precedence
1050  */
1051 static void
1052 dissect_pfcp_precedence(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
1053 {
1054     int offset = 0;
1055     guint32 value;
1056     /* Octet 5 5 to 8   Precedence value */
1057     proto_tree_add_item_ret_uint(tree, hf_pfcp_precedence, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
1058     offset += 4;
1059
1060     proto_item_append_text(item, "%u", value);
1061
1062     if (offset < length) {
1063         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1064     }
1065
1066 }
1067 /*
1068  * 8.2.12   Transport Level Marking
1069  */
1070 static void
1071 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_)
1072 {
1073     int offset = 0;
1074     /* Octet 5 to 6    ToS/Traffic Class
1075     * The ToS/Traffic Class shall be encoded on two octets as an OctetString.
1076     * 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
1077     */
1078     proto_tree_add_item(tree, hf_pfcp_traffic_class, tvb, offset, 1, ENC_BIG_ENDIAN);
1079     offset += 1;
1080     proto_tree_add_item(tree, hf_pfcp_traffic_mask, tvb, offset, 1, ENC_BIG_ENDIAN);
1081     offset += 1;
1082
1083     if (offset < length) {
1084         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1085     }
1086
1087 }
1088
1089 /*
1090  * 8.2.13   Volume Threshold
1091  */
1092 static void
1093 dissect_pfcp_volume_threshold(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1094 {
1095     int offset = 0;
1096     guint64 flags_val;
1097
1098     static const int * pfcp_volume_threshold_flags[] = {
1099         &hf_pfcp_spare_b7_b3,
1100         &hf_pfcp_volume_threshold_b2_dlvol,
1101         &hf_pfcp_volume_threshold_b1_ulvol,
1102         &hf_pfcp_volume_threshold_b0_tovol,
1103         NULL
1104     };
1105     /* Octet 5  Spare   DLVOL   ULVOL   TOVOL*/
1106     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_volume_threshold,
1107         ett_pfcp_volume_threshold, pfcp_volume_threshold_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
1108     offset += 1;
1109
1110     /* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value.
1111     * They shall contain the total, uplink or downlink number of octets respectively.
1112     */
1113     if ((flags_val & 0x1) == 1) {
1114         /* m to (m+7)   Total Volume
1115         * TOVOL: If this bit is set to "1", then the Total Volume field shall be present
1116         */
1117         proto_tree_add_item(tree, hf_pfcp_volume_threshold_tovol, tvb, offset, 8, ENC_BIG_ENDIAN);
1118         offset += 8;
1119     }
1120     if ((flags_val & 0x2) == 2) {
1121         /* p to (p+7)    Uplink Volume
1122         * ULVOL: If this bit is set to "1", then the Uplink Volume field shall be present
1123         */
1124         proto_tree_add_item(tree, hf_pfcp_volume_threshold_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
1125         offset += 8;
1126     }
1127     if ((flags_val & 0x4) == 4) {
1128         /* q to (q+7)   Downlink Volume
1129         * DLVOL: If this bit is set to "1", then the Downlink Volume field shall be present
1130         */
1131         proto_tree_add_item(tree, hf_pfcp_volume_threshold_dlvol, tvb, offset, 8, ENC_BIG_ENDIAN);
1132         offset += 8;
1133     }
1134
1135     if (offset < length) {
1136         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1137     }
1138 }
1139 /*
1140  * 8.2.14   Time Threshold
1141  */
1142 static void
1143 dissect_pfcp_time_threshold(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
1144 {
1145     int offset = 0;
1146     guint value;
1147
1148     /* Octet 5 to 8    Time Threshold
1149     * The Time Threshold field shall be encoded as an Unsigned32 binary integer value.
1150     * It shall contain the duration in seconds.
1151     */
1152     proto_tree_add_item_ret_uint(tree, hf_pfcp_time_threshold, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
1153     offset += 4;
1154
1155     proto_item_append_text(item, "%u s", value);
1156
1157     if (offset < length) {
1158         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1159     }
1160
1161 }
1162
1163 /*
1164  * 8.2.15   Monitoring Time
1165  */
1166 static void
1167 dissect_pfcp_monitoring_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
1168 {
1169     const gchar *time_str;
1170     int offset = 0;
1171
1172     /* The Monitoring Time field shall indicate the monitoring time in UTC time.
1173     * Octets 5 to 8 shall be encoded in the same format as the first four octets
1174     * of the 64-bit timestamp format as defined in section 6 of IETF RFC 5905.
1175     */
1176     time_str = tvb_ntp_fmt_ts_sec(tvb, 0);
1177     proto_tree_add_string(tree, hf_pfcp_monitoring_time, tvb, offset, 4, time_str);
1178     proto_item_append_text(item, "%s", time_str);
1179     offset += 4;
1180
1181     if (offset < length) {
1182         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1183     }
1184
1185 }
1186 /*
1187  * 8.2.16   Subsequent Volume Threshold
1188  */
1189 static void
1190 dissect_pfcp_subseq_volume_threshold(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1191 {
1192     int offset = 0;
1193     guint64 flags_val;
1194
1195     static const int * pfcp_subseq_volume_threshold_flags[] = {
1196         &hf_pfcp_spare_b7_b3,
1197         &hf_pfcp_subseq_volume_threshold_b2_dlvol,
1198         &hf_pfcp_subseq_volume_threshold_b1_ulvol,
1199         &hf_pfcp_subseq_volume_threshold_b0_tovol,
1200         NULL
1201     };
1202     /* Octet 5  Spare   DLVOL   ULVOL   TOVOL*/
1203     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_subseq_volume_threshold,
1204         ett_pfcp_subseq_volume_threshold, pfcp_subseq_volume_threshold_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
1205     offset += 1;
1206
1207     /* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value.
1208     * They shall contain the total, uplink or downlink number of octets respectively.
1209     */
1210     if ((flags_val & 0x1) == 1) {
1211         /* m to (m+7)   Total Volume
1212         * TOVOL: If this bit is set to "1", then the Total Volume field shall be present
1213         */
1214         proto_tree_add_item(tree, hf_pfcp_subseq_volume_threshold_tovol, tvb, offset, 8, ENC_BIG_ENDIAN);
1215         offset += 8;
1216     }
1217     if ((flags_val & 0x2) == 2) {
1218         /* p to (p+7)    Uplink Volume
1219         * ULVOL: If this bit is set to "1", then the Uplink Volume field shall be present
1220         */
1221         proto_tree_add_item(tree, hf_pfcp_subseq_volume_threshold_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
1222         offset += 8;
1223     }
1224     if ((flags_val & 0x4) == 4) {
1225         /* q to (q+7)   Downlink Volume
1226         * DLVOL: If this bit is set to "1", then the Downlink Volume field shall be present
1227         */
1228         proto_tree_add_item(tree, hf_pfcp_subseq_volume_threshold_dlvol, tvb, offset, 8, ENC_BIG_ENDIAN);
1229         offset += 8;
1230     }
1231
1232     if (offset < length) {
1233         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1234     }
1235 }
1236
1237 /*
1238  * 8.2.17   Subsequent Time Threshold
1239  */
1240 static void
1241 dissect_pfcp_subsequent_time_threshold(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
1242 {
1243     int offset = 0;
1244     guint32 value;
1245     /* 5 to 8   Subsequent Time Threshold */
1246     proto_tree_add_item_ret_uint(tree, hf_pfcp_subsequent_time_threshold, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
1247     offset += 4;
1248
1249     proto_item_append_text(item, "%u s", value);
1250
1251     if (offset < length) {
1252         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1253     }
1254 }
1255 /*
1256  * 8.2.18   Inactivity Detection Time
1257  */
1258 static void
1259 dissect_pfcp_inactivity_detection_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
1260 {
1261     int offset = 0;
1262     guint32 value;
1263     /* 5 to 8   Inactivity Detection Time */
1264     proto_tree_add_item_ret_uint(tree, hf_pfcp_inactivity_detection_time, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
1265     offset += 4;
1266
1267     proto_item_append_text(item, "%u s", value);
1268
1269     if (offset < length) {
1270         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1271     }
1272 }
1273
1274 /*
1275  * 8.2.19   Reporting Triggers
1276  */
1277 static void
1278 dissect_pfcp_reporting_triggers(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1279 {
1280     int offset = 0;
1281
1282     static const int * pfcp_reporting_triggers_o5_flags[] = {
1283         &hf_pfcp_reporting_triggers_o5_b7_liusa,
1284         &hf_pfcp_reporting_triggers_o5_b6_droth,
1285         &hf_pfcp_reporting_triggers_o5_b5_stopt,
1286         &hf_pfcp_reporting_triggers_o5_b4_start,
1287         &hf_pfcp_reporting_triggers_o5_b3_quhti,
1288         &hf_pfcp_reporting_triggers_o5_b2_timth,
1289         &hf_pfcp_reporting_triggers_o5_b1_volth,
1290         &hf_pfcp_reporting_triggers_o5_b0_perio,
1291         NULL
1292     };
1293     static const int * pfcp_reporting_triggers_o6_flags[] = {
1294         &hf_pfcp_spare_b7_b3,
1295         &hf_pfcp_reporting_triggers_o6_b2_envcl,
1296         &hf_pfcp_reporting_triggers_o6_b1_timqu,
1297         &hf_pfcp_reporting_triggers_o6_b0_volqu,
1298         NULL
1299     };
1300     /* Octet 5 [Bits 15-08] LIUSA   DROTH   STOPT   START   QUHTI   TIMTH   VOLTH   PERIO */
1301     /* Octet 6 [Bits 07-00] SPARE   SPARE   SPARE   SPARE   SPARE   ENVCL   TIMQU   VOLQU */
1302     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_reporting_triggers,
1303         ett_pfcp_reporting_triggers, pfcp_reporting_triggers_o5_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
1304     offset++;
1305     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_reporting_triggers,
1306         ett_pfcp_reporting_triggers, pfcp_reporting_triggers_o6_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
1307     offset++;
1308
1309     if (offset < length) {
1310         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1311     }
1312
1313 }
1314
1315 /*
1316  * 8.2.20   Redirect Information
1317  */
1318 static const value_string pfcp_redirect_address_type_vals[] = {
1319
1320     { 0, "IPv4 address" },
1321     { 1, "IPv6 address" },
1322     { 2, "URL" },
1323     { 3, "SIP URI" },
1324     { 0, NULL }
1325 };
1326
1327 static void
1328 dissect_pfcp_redirect_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1329 {
1330     int offset = 0;
1331     guint32 value, addr_len;
1332
1333     /* Octet Spare  Redirect Address Type */
1334     proto_tree_add_item(tree, hf_pfcp_spare_h1, tvb, offset, 1, ENC_BIG_ENDIAN);
1335     proto_tree_add_item_ret_uint(tree, hf_pfcp_redirect_address_type, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
1336     offset++;
1337
1338     /* 6-7  Redirect Server Address Length=a */
1339     proto_tree_add_item_ret_uint(tree, hf_pfcp_redirect_server_addr_len, tvb, offset, 2, ENC_BIG_ENDIAN, &addr_len);
1340     offset+=2;
1341
1342     /* 8-(8+a)  Redirect Server Address */
1343     proto_tree_add_item(tree, hf_pfcp_redirect_server_address, tvb, offset, addr_len, ENC_UTF_8 | ENC_NA);
1344     offset += addr_len;
1345
1346     if (offset < length) {
1347         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1348     }
1349 }
1350 /*
1351  * 8.2.21   Report Type
1352  */
1353 static void
1354 dissect_pfcp_report_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1355 {
1356     int offset = 0;
1357
1358     static const int * pfcp_report_type_flags[] = {
1359         &hf_pfcp_spare_b7_b4,
1360         &hf_pfcp_report_type_b3_upir,
1361         &hf_pfcp_report_type_b2_erir,
1362         &hf_pfcp_report_type_b1_usar,
1363         &hf_pfcp_report_type_b0_dldr,
1364         NULL
1365     };
1366     /* Octet 5  Spare   UPIR   ERIR    USAR    DLDR */
1367     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_report_type,
1368         ett_pfcp_report_type, pfcp_report_type_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
1369     offset += 1;
1370
1371     if (offset < length) {
1372         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1373     }
1374
1375 }
1376 /*
1377  * 8.2.22   Offending IE
1378  */
1379 static void
1380 dissect_pfcp_offending_ie(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
1381 {
1382     guint32 value;
1383     /* Octet 5 to 6 Type of the offending IE */
1384     proto_tree_add_item_ret_uint(tree, hf_pfcp_offending_ie, tvb, 0, 2, ENC_BIG_ENDIAN, &value);
1385
1386     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_ie_type, "Unknown"));
1387
1388 }
1389 /*
1390  * 8.2.23   Forwarding Policy
1391  */
1392 static void
1393 dissect_pfcp_forwarding_policy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1394 {
1395     int offset = 0;
1396     guint32 id_len;
1397
1398     /* Octet Forwarding Policy Identifier Length */
1399     proto_tree_add_item_ret_uint(tree, hf_pfcp_forwarding_policy_id_len, tvb, offset, 1, ENC_BIG_ENDIAN, &id_len);
1400     offset += 1;
1401
1402     proto_tree_add_item(tree, hf_pfcp_forwarding_policy_id, tvb, offset, id_len, ENC_NA);
1403     offset += id_len;
1404
1405     if (offset < length) {
1406         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1407     }
1408
1409 }
1410 /*
1411  * 8.2.24   Destination Interface
1412  */
1413 static const value_string pfcp_dst_interface_vals[] = {
1414
1415     { 0, "Access" },
1416     { 1, "Core" },
1417     { 2, "SGi-LAN" },
1418     { 3, "CP- Function" },
1419     { 4, "LI Function" },
1420     { 0, NULL }
1421 };
1422
1423 static void
1424 dissect_pfcp_destination_interface(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
1425 {
1426     int offset = 0;
1427     guint32 value;
1428
1429     /* Octet 5    Spare    Interface value*/
1430     proto_tree_add_item(tree, hf_pfcp_spare_h1, tvb, offset, 1, ENC_BIG_ENDIAN);
1431     proto_tree_add_item_ret_uint(tree, hf_pfcp_dst_interface, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
1432     offset++;
1433
1434     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_dst_interface_vals, "Unknown"));
1435
1436     if (offset < length) {
1437         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1438     }
1439
1440 }
1441 /*
1442  * 8.2.25   UP Function Features
1443  */
1444 static void
1445 dissect_pfcp_up_function_features(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1446 {
1447     int offset = 0;
1448
1449     static const int * pfcp_up_function_features_o5_flags[] = {
1450         &hf_pfcp_up_function_features_o5_b7_treu,
1451         &hf_pfcp_up_function_features_o5_b6_heeu,
1452         &hf_pfcp_up_function_features_o5_b5_pfdm,
1453         &hf_pfcp_up_function_features_o5_b4_ftup,
1454         &hf_pfcp_up_function_features_o5_b3_trst,
1455         &hf_pfcp_up_function_features_o5_b2_dlbd,
1456         &hf_pfcp_up_function_features_o5_b1_ddnd,
1457         &hf_pfcp_up_function_features_o5_b0_bucp,
1458         NULL
1459     };
1460     static const int * pfcp_up_function_features_o6_flags[] = {
1461         &hf_pfcp_spare_b7_b1,
1462         &hf_pfcp_up_function_features_o6_b0_empu,
1463         NULL
1464     };
1465     /* Octet 5  TREU    HEEU    PFDM    FTUP    TRST    DLBD    DDND    BUCP */
1466     /* Octet 6  Spare   Spare   Spare   Spare   Spare   Spare   Spare   EMPU */
1467     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_up_function_features,
1468         ett_pfcp_up_function_features, pfcp_up_function_features_o5_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
1469     offset++;
1470     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_up_function_features,
1471         ett_pfcp_up_function_features, pfcp_up_function_features_o6_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
1472     offset++;
1473
1474     if (offset < length) {
1475         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1476     }
1477
1478 }
1479 /*
1480  * 8.2.26   Apply Action
1481  */
1482 static void
1483 dissect_pfcp_apply_action(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1484 {
1485     int offset = 0;
1486
1487     static const int * pfcp_apply_action_flags[] = {
1488         &hf_pfcp_spare_b7_b5,
1489         &hf_pfcp_apply_action_flags_b4_dupl,
1490         &hf_pfcp_apply_action_flags_b3_nocp,
1491         &hf_pfcp_apply_action_flags_b2_buff,
1492         &hf_pfcp_apply_action_flags_b1_forw,
1493         &hf_pfcp_apply_action_flags_b0_drop,
1494         NULL
1495     };
1496     /* Octet 5  Spare   Spare   Spare   DUPL    NOCP    BUFF    FORW    DROP */
1497     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_apply_action_flags,
1498         ett_pfcp_apply_action_flags, pfcp_apply_action_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS);
1499     offset += 1;
1500
1501     if (offset < length) {
1502         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1503     }
1504
1505 }
1506 /*
1507  * 8.2.27   Downlink Data Service Information
1508  */
1509 static void
1510 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_)
1511 {
1512     int offset = 0;
1513     guint64 flags;
1514
1515     static const int * pfcp_dl_data_service_inf_flags[] = {
1516         &hf_pfcp_spare_b7_b1,
1517         &hf_pfcp_dl_data_service_inf_b0_ppi,
1518         NULL
1519     };
1520     /* Octet 5  Spare   PPI */
1521     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_dl_data_service_inf_flags,
1522         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);
1523     offset += 1;
1524     /* The PPI flag in octet 5 indicates whether the Paging Policy Indication value in octet 'm' shall be present */
1525     if ((flags & 0x1) == 1) {
1526         /* m    Spare   Paging Policy Indication value
1527          * encoded as the DSCP in TOS (IPv4) or TC (IPv6) information received in the IP payload of the GTP-U packet
1528          * from the PGW (see IETF RFC 2474
1529          */
1530         proto_tree_add_item(tree, hf_pfcp_spare_b7_b6, tvb, offset, 1, ENC_BIG_ENDIAN);
1531         proto_tree_add_item(tree, hf_pfcp_ppi, tvb, offset, 1, ENC_BIG_ENDIAN);
1532         offset++;
1533     }
1534
1535     if (offset < length) {
1536         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1537     }
1538
1539 }
1540 /*
1541  * 8.2.28   Downlink Data Notification Delay
1542  */
1543 static void
1544 dissect_pfcp_dl_data_notification_delay(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
1545 {
1546     int offset = 0;
1547     guint32 value;
1548     /* Octet 5 Delay Value in integer multiples of 50 millisecs, or zero */
1549     proto_tree_add_item_ret_uint(tree, hf_pfcp_dl_data_notification_delay, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
1550     offset += 1;
1551
1552     proto_item_append_text(item, "%u ms", value * 50);
1553
1554     if (offset < length) {
1555         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1556     }
1557 }
1558
1559 /*
1560  * 8.2.29   DL Buffering Duration
1561  */
1562 static const value_string pfcp_timer_unit_vals[] = {
1563     { 0, "value is incremented in multiples of 2 seconds" },
1564     { 1, "value is incremented in multiples of 1 minute" },
1565     { 2, "value is incremented in multiples of 10 minutes" },
1566     { 3, "value is incremented in multiples of 1 hour" },
1567     { 4, "value is incremented in multiples of 10 hour" },
1568     { 5, "values shall be interpreted as multiples of 1 minute(version 14.0.0)" },
1569     { 6, "values shall be interpreted as multiples of 1 minute(version 14.0.0)" },
1570     { 7, "value indicates that the timer is infinite" },
1571     { 0, NULL }
1572 };
1573
1574 static void
1575 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_)
1576 {
1577     int offset = 0;
1578     guint32 unit, value;
1579
1580     /* Octet 5  Timer unit  Timer value */
1581     proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_unit, tvb, offset, 1, ENC_BIG_ENDIAN, &unit);
1582     proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
1583     offset++;
1584
1585     unit = unit >> 5;
1586     if ((unit == 0) && (value == 0)) {
1587         proto_item_append_text(item, " Stopped");
1588     } else {
1589         switch (unit) {
1590         case 0:
1591             proto_item_append_text(item, "%u s", value * 2);
1592             break;
1593         case 1:
1594             proto_item_append_text(item, "%u min", value);
1595             break;
1596         case 2:
1597             proto_item_append_text(item, "%u min", value * 10);
1598             break;
1599         case 3:
1600             proto_item_append_text(item, "%u hours", value);
1601             break;
1602         case 4:
1603             proto_item_append_text(item, "%u hours", value * 10);
1604             break;
1605         case 7:
1606             proto_item_append_text(item, "%u Infinite", value);
1607             break;
1608             /* Value 5 and 6 */
1609         default:
1610             proto_item_append_text(item, "%u min", value);
1611             break;
1612         }
1613     }
1614
1615     if (offset < length) {
1616         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1617     }
1618
1619 }
1620
1621 /*
1622  * 8.2.30   DL Buffering Suggested Packet Count
1623  */
1624 static void
1625 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_)
1626 {
1627     guint32 value;
1628     /* Octet 5 to n+4 Packet Count Value
1629     * The length shall be set to 1 or 2 octets.
1630     */
1631     proto_tree_add_item_ret_uint(tree, hf_pfcp_packet_count, tvb, 0, length, ENC_BIG_ENDIAN, &value);
1632
1633     proto_item_append_text(item, "%u", value);
1634 }
1635 /*
1636  * 8.2.31   PFCPSMReq-Flags
1637  */
1638 static void
1639 dissect_pfcp_pfcpsmreq_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1640 {
1641     int offset = 0;
1642
1643     static const int * pfcp_pfcpsmreq_flags[] = {
1644         &hf_pfcp_spare_b7_b3,
1645         &hf_pfcp_pfcpsmreq_flags_b2_qaurr,
1646         &hf_pfcp_pfcpsmreq_flags_b1_sndem,
1647         &hf_pfcp_pfcpsmreq_flags_b0_drobu,
1648         NULL
1649     };
1650     /* Octet 5  Spare   Spare   Spare   Spare   Spare   QAURR   SNDEM   DROBU */
1651     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpsmreq_flags,
1652         ett_pfcp_pfcpsmreq, pfcp_pfcpsmreq_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
1653     offset += 1;
1654
1655     if (offset < length) {
1656         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1657     }
1658
1659 }
1660 /*
1661  * 8.2.32   PFCPSRRsp-Flags
1662  */
1663 static void
1664 dissect_pfcp_pfcpsrrsp_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1665 {
1666     int offset = 0;
1667
1668     static const int * pfcp_pfcpsrrsp_flags[] = {
1669         &hf_pfcp_spare_b7_b1,
1670         &hf_pfcp_pfcpsrrsp_flags_b0_drobu,
1671         NULL
1672     };
1673     /* Octet 5  Spare   Spare   Spare   Spare   Spare   Spare   Spare   DROBU */
1674     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcpsrrsp_flags,
1675         ett_pfcp_pfcpsrrsp, pfcp_pfcpsrrsp_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
1676     offset += 1;
1677
1678     if (offset < length) {
1679         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1680     }
1681
1682 }
1683
1684 /*
1685  * 8.2.33   Sequence Number
1686  */
1687 static void
1688 dissect_pfcp_sequence_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
1689 {
1690     guint32 value;
1691     /* Octet 5 to 8    Sequence Number */
1692     proto_tree_add_item_ret_uint(tree, hf_pfcp_sequence_number, tvb, 0, 4, ENC_BIG_ENDIAN, &value);
1693
1694     proto_item_append_text(item, "%u", value);
1695
1696 }
1697
1698 /*
1699  * 8.2.34   Metric
1700  */
1701 static void
1702 dissect_pfcp_metric(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
1703 {
1704     guint32 value;
1705     /* Octet 5  Metric */
1706     proto_tree_add_item_ret_uint(tree, hf_pfcp_metric, tvb, 0, 1, ENC_BIG_ENDIAN, &value);
1707
1708     proto_item_append_text(item, "%u", value);
1709
1710 }
1711
1712 /*
1713  * 8.2.35   Timer
1714  */
1715 static void
1716 dissect_pfcp_timer(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
1717 {
1718     int offset = 0;
1719     guint32 unit, value;
1720
1721     /* Octet 5  Timer unit  Timer value */
1722     proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_unit, tvb, offset, 1, ENC_BIG_ENDIAN, &unit);
1723     proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
1724     offset++;
1725
1726     unit = unit >> 5;
1727     if ((unit == 0) && (value == 0)) {
1728         proto_item_append_text(item, " Stopped");
1729     } else {
1730         switch (unit) {
1731         case 0:
1732             proto_item_append_text(item, "%u s", value * 2);
1733             break;
1734         case 1:
1735             proto_item_append_text(item, "%u min", value);
1736             break;
1737         case 2:
1738             proto_item_append_text(item, "%u min", value * 10);
1739             break;
1740         case 3:
1741             proto_item_append_text(item, "%u hours", value);
1742             break;
1743         case 4:
1744             proto_item_append_text(item, "%u hours", value * 10);
1745             break;
1746         case 7:
1747             proto_item_append_text(item, "%u Infinite", value);
1748             break;
1749             /* Value 5 and 6 */
1750         default:
1751             proto_item_append_text(item, "%u min", value * 1);
1752             break;
1753         }
1754     }
1755
1756     if (offset < length) {
1757         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1758     }
1759
1760 }
1761
1762 /*
1763  * 8.2.36   Packet Detection Rule ID (PDR ID)
1764  */
1765 static int
1766 decode_pfcp_pdr_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, gint offset)
1767 {
1768     guint32 rule_id;
1769     /* Octet 5 to 6 Rule ID*/
1770     proto_tree_add_item_ret_uint(tree, hf_pfcp_pdr_id, tvb, offset, 2, ENC_BIG_ENDIAN, &rule_id);
1771     offset += 2;
1772
1773     proto_item_append_text(item, "%u", rule_id);
1774
1775     return offset;
1776 }
1777 static void
1778 dissect_pfcp_pdr_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
1779 {
1780     int offset = 0;
1781
1782     offset = decode_pfcp_pdr_id(tvb, pinfo, tree, item, offset);
1783
1784     if (offset < length) {
1785         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1786     }
1787 }
1788 /*
1789  * 8.2.37   F-SEID
1790  */
1791 static void
1792 dissect_pfcp_f_seid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
1793 {
1794     int offset = 0;
1795     guint64 f_seid_flags;
1796
1797     static const int * pfcp_f_seid_flags[] = {
1798         &hf_pfcp_spare_b7,
1799         &hf_pfcp_spare_b6,
1800         &hf_pfcp_spare_b5,
1801         &hf_pfcp_spare_b4,
1802         &hf_pfcp_spare_b3,
1803         &hf_pfcp_spare_b2,
1804         &hf_pfcp_b1_v4,
1805         &hf_pfcp_b0_v6,
1806         NULL
1807     };
1808     /* Octet 5  Spare   Spare   Spare   Spare   Spare   Spare   V4  V6*/
1809     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_f_seid_flags,
1810         ett_pfcp_f_seid_flags, pfcp_f_seid_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &f_seid_flags);
1811     offset += 1;
1812
1813     if ((f_seid_flags & 0x3) == 0) {
1814         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, 0, 1);
1815         return;
1816     }
1817     /* Octet 6 to 13    SEID  */
1818     proto_tree_add_item(tree, hf_pfcp_seid, tvb, offset, 8, ENC_BIG_ENDIAN);
1819     proto_item_append_text(item, "SEID: 0x%s", tvb_bytes_to_str(wmem_packet_scope(), tvb, offset, 8));
1820     offset += 8;
1821     /* IPv4 address (if present)*/
1822     if ((f_seid_flags & 0x2) == 2) {
1823         proto_tree_add_item(tree, hf_pfcp_f_seid_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
1824         proto_item_append_text(item, ", IPv4 %s", tvb_ip_to_str(tvb, offset));
1825         offset += 4;
1826     }
1827     /* IPv6 address (if present)*/
1828     if ((f_seid_flags & 0x1) == 1) {
1829         proto_tree_add_item(tree, hf_pfcp_f_seid_ipv6, tvb, offset, 16, ENC_NA);
1830         proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(tvb, offset));
1831         offset += 16;
1832     }
1833     if (offset < length) {
1834         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1835     }
1836 }
1837
1838 /*
1839  *   8.2.38   Node ID
1840  */
1841
1842 static const value_string pfcp_node_id_type_vals[] = {
1843
1844     { 0, "IPv4 address" },
1845     { 1, "IPv6 address" },
1846     { 2, "FQDN" },
1847     { 0, NULL }
1848 };
1849
1850 static void
1851 dissect_pfcp_node_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
1852 {
1853     int offset = 0, name_len, tmp;
1854     guint32 node_id_type;
1855     guint8 *fqdn = NULL;
1856
1857     /* Octet 5    Spare Node ID Type*/
1858     proto_tree_add_item(tree, hf_pfcp_spare_h1, tvb, offset, 1, ENC_BIG_ENDIAN);
1859     proto_tree_add_item_ret_uint(tree, hf_pfcp_node_id_type, tvb, offset, 1, ENC_BIG_ENDIAN, &node_id_type);
1860     proto_item_append_text(item, "%s: ", val_to_str_const(node_id_type, pfcp_node_id_type_vals, "Unknown"));
1861     offset++;
1862
1863     switch (node_id_type) {
1864         case 0:
1865             /* IPv4 address */
1866             proto_tree_add_item(tree, hf_pfcp_node_id_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
1867             proto_item_append_text(item, "%s", tvb_ip_to_str(tvb, offset));
1868             offset += 4;
1869             break;
1870         case 1:
1871             /* IPv6 address */
1872             proto_tree_add_item(tree, hf_pfcp_node_id_ipv6, tvb, offset, 16, ENC_NA);
1873             proto_item_append_text(item, "%s", tvb_ip6_to_str(tvb, offset));
1874             offset += 16;
1875             break;
1876         case 2:
1877             /* FQDN, the Node ID value encoding shall be identical to the encoding of a FQDN
1878              * within a DNS message of section 3.1 of IETF RFC 1035 [27] but excluding the trailing zero byte.
1879              */
1880             if (length > 1) {
1881                 name_len = tvb_get_guint8(tvb, offset);
1882                 /* NOTE 1: The FQDN field in the IE is not encoded as a dotted string as commonly used in DNS master zone files. */
1883                 if (name_len < 0x40) {
1884                     fqdn = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 1, length - 2, ENC_ASCII);
1885                     for (;;) {
1886                         if (name_len >= length - 2)
1887                             break;
1888                         tmp = name_len;
1889                         name_len = name_len + fqdn[tmp] + 1;
1890                         fqdn[tmp] = '.';
1891                     }
1892                 }
1893                 /* In case the FQDN field is incorrectly in dotted string form.*/
1894                 else {
1895                     fqdn = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length - 1, ENC_ASCII);
1896                     proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, offset, length - 1);
1897                 }
1898                 proto_tree_add_string(tree, hf_pfcp_node_id_fqdn, tvb, offset, length - 1, fqdn);
1899                 proto_item_append_text(item, "%s", fqdn);
1900                 offset += length - 1;
1901             }
1902             break;
1903         default:
1904             break;
1905     }
1906
1907     if (offset < length) {
1908         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1909     }
1910
1911 }
1912 /*
1913  * 8.2.39   PFD Contents
1914  */
1915 static void
1916 dissect_pfcp_pfd_contents(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1917 {
1918     int offset = 0;
1919     guint64 flags;
1920     guint32 len;
1921
1922     static const int * pfcp_pfd_contents_flags[] = {
1923         &hf_pfcp_spare_b7_b4,
1924         &hf_pfcp_pfd_contents_flags_b3_cp,
1925         &hf_pfcp_pfd_contents_flags_b2_dn,
1926         &hf_pfcp_pfd_contents_flags_b1_url,
1927         &hf_pfcp_pfd_contents_flags_b0_fd,
1928         NULL
1929     };
1930     /* Octet 5  Spare   CP  DN  URL FD */
1931     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_pfd_contents_flags,
1932         ett_pfcp_measurement_method_flags, pfcp_pfd_contents_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
1933     offset += 1;
1934
1935     /* Bit 1 - FD (Flow Description): If this bit is set to "1", then the Length of Flow Description
1936      * and the Flow Description fields shall be present
1937      */
1938     if ((flags & 0x1) == 1) {
1939         /* The Flow Description field, when present, shall be encoded as an OctetString
1940         * as specified in subclause 6.4.3.7 of 3GPP TS 29.251
1941         */
1942         /* m to (m+1)   Length of Flow Description */
1943         proto_tree_add_item_ret_uint(tree, hf_pfcp_flow_desc_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
1944         offset += 2;
1945
1946         /* (m+2) to p   Flow Description */
1947         proto_tree_add_item(tree, hf_pfcp_flow_desc, tvb, offset, len, ENC_ASCII|ENC_NA);
1948         offset += len;
1949     }
1950
1951
1952     /* Bit 2 - URL (URL): If this bit is set to "1", then the Length of URL and the URL fields shall be present */
1953     if ((flags & 0x2) == 2) {
1954         /* q to (q+1)   Length of URL */
1955         proto_tree_add_item_ret_uint(tree, hf_pfcp_url_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
1956         offset += 2;
1957         /* (q+2) to r   URL */
1958         proto_tree_add_item(tree, hf_pfcp_url, tvb, offset, len, ENC_NA);
1959         offset += len;
1960
1961     }
1962
1963     /* Bit 3 - DN (Domain Name): If this bit is set to "1", then the Length of Domain Name and
1964     * the Domain Name fields shall be present
1965     */
1966     if ((flags & 0x4) == 4) {
1967         /* s to (s+1)   Length of Domain Name */
1968         proto_tree_add_item_ret_uint(tree, hf_pfcp_dn_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
1969         offset += 2;
1970         /* (s+2) to t   Domain Name */
1971         proto_tree_add_item(tree, hf_pfcp_dn, tvb, offset, len, ENC_NA);
1972         offset += len;
1973     }
1974
1975     /* Bit 4 - CP (Custom PFD Content): If this bit is set to "1", then the Length of Custom PFD Content and
1976      * the Custom PFD Content fields shall be present
1977      */
1978     if ((flags & 0x8) == 8) {
1979         /* u to (u+1)   Length of Custom PFD Content */
1980         proto_tree_add_item_ret_uint(tree, hf_pfcp_cp_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
1981         offset += 2;
1982         /* (u+2) to v   Custom PFD Content */
1983         proto_tree_add_item(tree, hf_pfcp_cp, tvb, offset, len, ENC_NA);
1984         offset += len;
1985     }
1986
1987     if (offset < length) {
1988         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
1989     }
1990
1991 }
1992 /*
1993  * 8.2.40   Measurement Method
1994  */
1995 static void
1996 dissect_pfcp_measurement_method(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
1997 {
1998     int offset = 0;
1999
2000     static const int * pfcp_measurement_method_flags[] = {
2001         &hf_pfcp_spare_b7_b3,
2002         &hf_pfcp_measurement_method_flags_b2_event,
2003         &hf_pfcp_measurement_method_flags_b1_volume,
2004         &hf_pfcp_measurement_method_flags_b0_durat,
2005         NULL
2006     };
2007     /* Octet 5  Spare   Spare   Spare   Spare   Spare   EVENT   VOLUM   DURAT */
2008     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_measurement_method_flags,
2009         ett_pfcp_measurement_method_flags, pfcp_measurement_method_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
2010     offset += 1;
2011
2012     if (offset < length) {
2013         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2014     }
2015
2016 }
2017
2018 /*
2019  * 8.2.41   Usage Report Trigger
2020  */
2021 static void
2022 dissect_pfcp_usage_report_trigger(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2023 {
2024     int offset = 0;
2025
2026     static const int * pfcp_usage_report_trigger_o5_flags[] = {
2027         &hf_pfcp_usage_report_trigger_o5_b7_immer,
2028         &hf_pfcp_usage_report_trigger_o5_b6_droth,
2029         &hf_pfcp_usage_report_trigger_o5_b5_stopt,
2030         &hf_pfcp_usage_report_trigger_o5_b4_start,
2031         &hf_pfcp_usage_report_trigger_o5_b3_quhti,
2032         &hf_pfcp_usage_report_trigger_o5_b2_timth,
2033         &hf_pfcp_usage_report_trigger_o5_b1_volth,
2034         &hf_pfcp_usage_report_trigger_o5_b0_perio,
2035         NULL
2036     };
2037     static const int * pfcp_usage_report_trigger_o6_flags[] = {
2038         &hf_pfcp_spare_b7_b6,
2039         &hf_pfcp_usage_report_trigger_o6_b5_envcl,
2040         &hf_pfcp_usage_report_trigger_o6_b4_monit,
2041         &hf_pfcp_usage_report_trigger_o6_b3_termr,
2042         &hf_pfcp_usage_report_trigger_o6_b2_liusa,
2043         &hf_pfcp_usage_report_trigger_o6_b1_timqu,
2044         &hf_pfcp_usage_report_trigger_o6_b0_volqu,
2045         NULL
2046     };
2047     /* Octet 5  IMMER   DROTH   STOPT   START   QUHTI   TIMTH   VOLTH   PERIO*/
2048     /* Octet 6  Spare   Spare   ENVCL   MONIT   TERMR   LIUSA   TIMQU   VOLQU*/
2049     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_usage_report_trigger,
2050         ett_pfcp_report_trigger, pfcp_usage_report_trigger_o5_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
2051     offset++;
2052     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_usage_report_trigger,
2053         ett_pfcp_report_trigger, pfcp_usage_report_trigger_o6_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
2054     offset++;
2055
2056     if (offset < length) {
2057         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2058     }
2059
2060 }
2061
2062 /*
2063  * 8.2.42   Measurement Period
2064  */
2065 static void
2066 dissect_pfcp_measurement_period(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
2067 {
2068     int offset = 0;
2069     guint32 value;
2070     /* 5 to 8   Measurement Period*/
2071     proto_tree_add_item_ret_uint(tree, hf_pfcp_measurement_period, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
2072     offset += 4;
2073
2074     proto_item_append_text(item, "%u", value);
2075
2076     if (offset < length) {
2077         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2078     }
2079 }
2080
2081 /*
2082  * 8.2.43   Fully qualified PDN Connection Set Identifier (FQ-CSID)
2083  */
2084 static const value_string pfcp_fq_csid_node_id_type_vals[] = {
2085
2086     { 0, "Node-Address is a global unicast IPv4 address" },
2087     { 1, "Node-Address is a global unicast IPv6 address" },
2088     { 2, "Node-Address is a 4 octets long field" },
2089     { 0, NULL }
2090 };
2091
2092 static void
2093 dissect_pfcp_fq_csid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2094 {
2095     int offset = 0;
2096     guint32 node_id_type, num_csid;
2097
2098     /* Octet 5  FQ-CSID Node-ID Type    Number of CSIDs= m*/
2099     proto_tree_add_item_ret_uint(tree, hf_pfcp_fq_csid_node_id_type, tvb, offset, 1, ENC_BIG_ENDIAN, &node_id_type);
2100     proto_tree_add_item_ret_uint(tree, hf_pfcp_num_csid, tvb, offset, 1, ENC_BIG_ENDIAN, &num_csid);
2101     offset++;
2102
2103     /* 6 to p   Node-Address  */
2104     switch (node_id_type) {
2105     case 0:
2106         /* 0    indicates that Node-Address is a global unicast IPv4 address and p = 9 */
2107         proto_tree_add_item(tree, hf_pfcp_fq_csid_node_id_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
2108         offset += 4;
2109         break;
2110     case 1:
2111         /* 1    indicates that Node-Address is a global unicast IPv6 address and p = 21 */
2112         proto_tree_add_item(tree, hf_pfcp_fq_csid_node_id_ipv6, tvb, offset, 16, ENC_NA);
2113         offset += 16;
2114         break;
2115     case 2:
2116         /* 2    indicates that Node-Address is a 4 octets long field with a 32 bit value stored in network order, and p= 9
2117          *      Most significant 20 bits are the binary encoded value of (MCC * 1000 + MNC).
2118          *      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
2119          */
2120         proto_tree_add_item(tree, hf_pfcp_fq_csid_node_id_mcc_mnc, tvb, offset, 4, ENC_BIG_ENDIAN);
2121         proto_tree_add_item(tree, hf_pfcp_fq_csid_node_id_int, tvb, offset, 4, ENC_BIG_ENDIAN);
2122         offset += 4;
2123         break;
2124     default:
2125         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2126         break;
2127     }
2128
2129     while (num_csid > 0) {
2130         proto_tree_add_item(tree, hf_pfcp_fq_csid, tvb, offset, 2, ENC_BIG_ENDIAN);
2131         offset += 2;
2132         num_csid--;
2133     }
2134     if (offset < length) {
2135         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2136     }
2137
2138 }
2139 /*
2140  * 8.2.44   Volume Measurement
2141  */
2142 static void
2143 dissect_pfcp_volume_measurement(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2144 {
2145     int offset = 0;
2146     guint64 flags;
2147
2148     static const int * pfcp_volume_measurement_flags[] = {
2149         &hf_pfcp_spare_b7_b3,
2150         &hf_pfcp_volume_measurement_b2_dlvol,
2151         &hf_pfcp_volume_measurement_b1_ulvol,
2152         &hf_pfcp_volume_measurement_b0_tovol,
2153         NULL
2154     };
2155     /* Octet 5  Spare   DLVOL   ULVOL   TOVOL*/
2156     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_volume_measurement,
2157         ett_pfcp_volume_measurement, pfcp_volume_measurement_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
2158     offset += 1;
2159
2160     /* Bit 1 - TOVOL: If this bit is set to "1", then the Total Volume field shall be present*/
2161     if ((flags & 0x1) == 1) {
2162         /* m to (m+7)   Total Volume */
2163         proto_tree_add_item(tree, hf_pfcp_vol_meas_tovol, tvb, offset, 8, ENC_BIG_ENDIAN);
2164         offset += 8;
2165     }
2166     /* Bit 2 - ULVOL: If this bit is set to "1", then the Total Volume field shall be present*/
2167     if ((flags & 0x2) == 2) {
2168         /* p to (p+7)   Uplink Volume */
2169         proto_tree_add_item(tree, hf_pfcp_vol_meas_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
2170         offset += 8;
2171     }
2172     /* Bit 3 - DLVOL: If this bit is set to "1", then the Total Volume field shall be present*/
2173     if ((flags & 0x4) == 4) {
2174         /*q to (q+7)    Downlink Volume */
2175         proto_tree_add_item(tree, hf_pfcp_vol_meas_dlvol, tvb, offset, 8, ENC_BIG_ENDIAN);
2176         offset += 8;
2177     }
2178
2179     if (offset < length) {
2180         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2181     }
2182
2183 }
2184 /*
2185  * 8.2.45   Duration Measurement
2186  */
2187 static void
2188 dissect_pfcp_duration_measurement(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
2189 {
2190     int offset = 0;
2191     guint32 value;
2192     /* 5 to 8   Duration value*/
2193     proto_tree_add_item_ret_uint(tree, hf_pfcp_duration_measurement, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
2194     offset += 4;
2195
2196     proto_item_append_text(item, "%u s", value);
2197
2198     if (offset < length) {
2199         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2200     }
2201 }
2202 /*
2203  * 8.2.46   Time of First Packet
2204  */
2205 static void
2206 dissect_pfcp_time_of_first_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
2207 {
2208     int offset = 0;
2209     const gchar *time_str;
2210
2211     /* Octets 5 to 8 shall be encoded in the same format as the first four octets of the 64-bit timestamp
2212      * format as defined in section 6 of IETF RFC 5905
2213      */
2214
2215     time_str = tvb_ntp_fmt_ts_sec(tvb, 0);
2216     proto_tree_add_string(tree, hf_pfcp_time_of_first_packet, tvb, offset, 4, time_str);
2217     proto_item_append_text(item, "%s", time_str);
2218     offset += 4;
2219
2220     if (offset < length) {
2221         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2222     }
2223 }
2224 /*
2225  * 8.2.47   Time of Last Packet
2226  */
2227 static void
2228 dissect_pfcp_time_of_last_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
2229 {
2230     int offset = 0;
2231     const gchar *time_str;
2232
2233     /* Octets 5 to 8 shall be encoded in the same format as the first four octets of the 64-bit timestamp
2234     * format as defined in section 6 of IETF RFC 5905
2235     */
2236
2237     time_str = tvb_ntp_fmt_ts_sec(tvb, 0);
2238     proto_tree_add_string(tree, hf_pfcp_time_of_last_packet, tvb, offset, 4, time_str);
2239     proto_item_append_text(item, "%s", time_str);
2240     offset += 4;
2241
2242     if (offset < length) {
2243         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2244     }
2245 }
2246 /*
2247  * 8.2.48   Quota Holding Time
2248  */
2249 static void
2250 dissect_pfcp_quota_holding_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
2251 {
2252     int offset = 0;
2253     guint32 value;
2254     /* Octet 5 to 8    Time Quota value
2255     * TThe Time Quota value shall be encoded as an Unsigned32 binary integer value. It contains a duration in seconds
2256     */
2257     proto_tree_add_item_ret_uint(tree, hf_pfcp_quota_holding_time, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
2258     offset += 4;
2259
2260     proto_item_append_text(item, "%u s", value);
2261
2262     if (offset < length) {
2263         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2264     }
2265
2266 }
2267
2268 /*
2269  * 8.2.49   Dropped DL Traffic Threshold
2270  */
2271 static void
2272 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_)
2273 {
2274     int offset = 0;
2275     guint64 flags_val;
2276
2277     static const int * pfcp_dropped_dl_traffic_threshold_flags[] = {
2278         &hf_pfcp_dropped_dl_traffic_threshold_b0_dlpa,
2279         NULL
2280     };
2281     /* Octet 5  Spare   DLPA*/
2282     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_dropped_dl_traffic_threshold,
2283         ett_pfcp_dropped_dl_traffic_threshold, pfcp_dropped_dl_traffic_threshold_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
2284     offset += 1;
2285
2286     if ((flags_val & 0x1) == 1) {
2287         /* m to (m+7)   Downlink Packets
2288         * DLPA: If this bit is set to "1", then the Downlink Packets field shall be present
2289         */
2290         proto_tree_add_item(tree, hf_pfcp_downlink_packets, tvb, offset, 8, ENC_BIG_ENDIAN);
2291         offset += 8;
2292     }
2293     if (offset < length) {
2294         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2295     }
2296 }
2297 /*
2298  * 8.2.50   Volume Quota
2299  */
2300 static void
2301 dissect_pfcp_volume_quota(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2302 {
2303     int offset = 0;
2304     guint64 flags_val;
2305
2306     static const int * pfcp_volume_quota_flags[] = {
2307         &hf_pfcp_spare_b7_b3,
2308         &hf_pfcp_volume_quota_b2_dlvol,
2309         &hf_pfcp_volume_quota_b1_ulvol,
2310         &hf_pfcp_volume_quota_b0_tovol,
2311         NULL
2312     };
2313     /* Octet 5  Spare   DLVOL   ULVOL   TOVOL*/
2314     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_volume_quota,
2315         ett_pfcp_volume_quota, pfcp_volume_quota_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
2316     offset += 1;
2317
2318     /* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded as an Unsigned64 binary integer value.
2319     * They shall contain the total, uplink or downlink number of octets respectively.
2320     */
2321     if ((flags_val & 0x1) == 1) {
2322         /* m to (m+7)   Total Volume
2323         * TOVOL: If this bit is set to "1", then the Total Volume field shall be present
2324         */
2325         proto_tree_add_item(tree, hf_pfcp_volume_quota_tovol, tvb, offset, 8, ENC_BIG_ENDIAN);
2326         offset += 8;
2327     }
2328     if ((flags_val & 0x2) == 2) {
2329         /* p to (p+7)    Uplink Volume
2330         * ULVOL: If this bit is set to "1", then the Uplink Volume field shall be present
2331         */
2332         proto_tree_add_item(tree, hf_pfcp_volume_quota_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
2333         offset += 8;
2334     }
2335     if ((flags_val & 0x4) == 4) {
2336         /* q to (q+7)   Downlink Volume
2337         * DLVOL: If this bit is set to "1", then the Downlink Volume field shall be present
2338         */
2339         proto_tree_add_item(tree, hf_pfcp_volume_quota_dlvol, tvb, offset, 8, ENC_BIG_ENDIAN);
2340         offset += 8;
2341     }
2342
2343     if (offset < length) {
2344         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2345     }
2346 }
2347 /*
2348  * 8.2.51   Time Quota
2349  */
2350 static void
2351 dissect_pfcp_time_quota(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
2352 {
2353     int offset = 0;
2354     guint32 value;
2355     /* Octet 5 to 8    Time Quota value
2356     * TThe Time Quota value shall be encoded as an Unsigned32 binary integer value. It contains a duration in seconds
2357     */
2358     proto_tree_add_item_ret_uint(tree, hf_pfcp_time_quota, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
2359     offset += 4;
2360
2361     proto_item_append_text(item, "%u s", value);
2362
2363     if (offset < length) {
2364         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2365     }
2366
2367 }
2368 /*
2369  * 8.2.52   Start Time
2370  */
2371 static void
2372 dissect_pfcp_start_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
2373 {
2374     const gchar *time_str;
2375     int offset = 0;
2376
2377     /* The Start Time field shall contain a UTC time. Octets 5 to 8 are encoded in the same format as
2378     * the first four octets of the 64-bit timestamp format as defined in section 6 of IETF RFC 5905 [26].
2379     */
2380     time_str = tvb_ntp_fmt_ts_sec(tvb, 0);
2381     proto_tree_add_string(tree, hf_pfcp_start_time, tvb, offset, 4, time_str);
2382     proto_item_append_text(item, "%s", time_str);
2383     offset += 4;
2384
2385     if (offset < length) {
2386         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2387     }
2388
2389 }
2390 /*
2391  * 8.2.53   End Time
2392  */
2393 static void
2394 dissect_pfcp_end_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
2395 {
2396     const gchar *time_str;
2397     int offset = 0;
2398
2399     /* The End Time field shall contain a UTC time. Octets 5 to 8 are encoded in the same format as
2400     * the first four octets of the 64-bit timestamp format as defined in section 6 of IETF RFC 5905 [26].
2401     */
2402     time_str = tvb_ntp_fmt_ts_sec(tvb, 0);
2403     proto_tree_add_string(tree, hf_pfcp_end_time, tvb, offset, 4, time_str);
2404     proto_item_append_text(item, "%s", time_str);
2405     offset += 4;
2406
2407     if (offset < length) {
2408         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2409     }
2410
2411 }
2412
2413 /*
2414  * 8.2.54   URR ID
2415  */
2416 static int
2417 decode_pfcp_urr_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint offset)
2418 {
2419     guint32 urr_id;
2420     guint8 urr_id_flag;
2421     /* Octet 5 to 8 URR ID value
2422     * The bit 8 of octet 5 is used to indicate if the Rule ID is dynamically allocated by the CP function
2423     * or predefined in the UP function. If set to 0, it indicates that the Rule is dynamically provisioned
2424     * by the CP Function. If set to 1, it indicates that the Rule is predefined in the UP Function
2425     */
2426     urr_id_flag = tvb_get_guint8(tvb, offset) & 0x80;
2427
2428     proto_tree_add_item(tree, hf_pfcp_urr_id_flg, tvb, offset, 4, ENC_BIG_ENDIAN);
2429     proto_tree_add_item_ret_uint(tree, hf_pfcp_urr_id, tvb, offset, 4, ENC_BIG_ENDIAN, &urr_id);
2430     offset += 4;
2431
2432     proto_item_append_text(item, "%s %u",
2433         ((urr_id_flag)? pfcp_id_predef_dynamic_tfs.true_string : pfcp_id_predef_dynamic_tfs.false_string),
2434         (urr_id & 0x7fffffff));
2435
2436     return offset;
2437 }
2438 static void
2439 dissect_pfcp_urr_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2440 {
2441     int offset = 0;
2442
2443     offset = decode_pfcp_urr_id(tvb, pinfo, tree, item, offset);
2444
2445     if (offset < length) {
2446         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2447     }
2448
2449 }
2450 /*
2451  * 8.2.55   Linked URR ID IE
2452  */
2453 static void
2454 dissect_pfcp_linked_urr_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
2455 {
2456     int offset = 0;
2457     guint32 value;
2458     /* Octet 5 to 8 Linked URR ID value
2459     * The Linked URR ID value shall be encoded as an Unsigned32 binary integer value
2460     */
2461     proto_tree_add_item_ret_uint(tree, hf_pfcp_linked_urr_id, tvb, offset, 4, ENC_BIG_ENDIAN, &value);
2462     offset += 4;
2463
2464     proto_item_append_text(item, "%u", value);
2465
2466     if (offset < length) {
2467         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2468     }
2469
2470 }
2471 /*
2472  * 8.2.56   Outer Header Creation
2473  */
2474
2475 static const value_string pfcp_outer_hdr_desc_vals[] = {
2476
2477     { 0x0100, "GTP-U/UDP/IPv4 " },
2478     { 0x0200, "GTP-U/UDP/IPv6 " },
2479     { 0x0300, "GTP-U/UDP/IPv4/IPv6 " },
2480     { 0x0400, "UDP/IPv4 " },
2481     { 0x0800, "UDP/IPv6 " },
2482     { 0x0C00, "UDP/IPv4/IPv6 " },
2483     { 0, NULL }
2484 };
2485
2486 static void
2487 dissect_pfcp_outer_header_creation(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2488 {
2489     int offset = 0;
2490     guint32 value;
2491
2492     /* Octet 5  Outer Header Creation Description */
2493     proto_tree_add_item_ret_uint(tree, hf_pfcp_outer_hdr_desc, tvb, offset, 2, ENC_BIG_ENDIAN, &value);
2494     offset += 2;
2495
2496     /* m to (m+3)   TEID
2497      * The TEID field shall be present if the Outer Header Creation Description requests the creation of a GTP-U header.
2498      * Otherwise it shall not be present
2499      */
2500     if ((value & 0x0100) || (value & 0x0200)) {
2501         proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_teid, tvb, offset, 4, ENC_BIG_ENDIAN);
2502         offset += 4;
2503     }
2504
2505     /*
2506     * p to (p+3)   IPv4
2507     * The IPv4 Address field shall be present if the Outer Header Creation Description requests the creation of a IPv4 header
2508     */
2509     if ((value & 0x0100) || (value & 0x0400)) {
2510         proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
2511         offset += 4;
2512     }
2513
2514     /*
2515     * q to (q+15)   IPv6
2516     * The IPv6 Address field shall be present if the Outer Header Creation Description requests the creation of a IPv6 header
2517     */
2518     if ((value & 0x0200) || (value & 0x0800)) {
2519         proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_ipv6, tvb, offset, 16, ENC_NA);
2520         offset += 16;
2521     }
2522
2523     /*
2524     * r to (r+1)   Port Number
2525     * The Port Number field shall be present if the Outer Header Creation Description requests the creation of a UDP/IP header
2526     */
2527     if ((value & 0x0400) || (value & 0x0800)) {
2528         proto_tree_add_item(tree, hf_pfcp_outer_hdr_creation_port, tvb, offset, 2, ENC_BIG_ENDIAN);
2529         offset += 2;
2530     }
2531
2532     if (offset < length) {
2533         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2534     }
2535
2536 }
2537 /*
2538  * 8.2.57   BAR ID
2539  */
2540 static int
2541 decode_pfcp_bar_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 offset)
2542 {
2543     guint32 value;
2544     /* Octet 5 BAR ID value
2545     * The BAR ID value shall be encoded as a binary integer value
2546     */
2547     proto_tree_add_item_ret_uint(tree, hf_pfcp_bar_id, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
2548     proto_item_append_text(item, "%u", value);
2549     offset++;
2550
2551     return offset;
2552 }
2553 static void
2554 dissect_pfcp_bar_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2555 {
2556     int offset = 0;
2557
2558     offset = decode_pfcp_bar_id(tvb, pinfo, tree, item, offset);
2559
2560     if (offset < length) {
2561         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2562     }
2563
2564 }
2565
2566 /*
2567  * 8.2.58   CP Function Features
2568  */
2569 static void
2570 dissect_pfcp_cp_function_features(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2571 {
2572     int offset = 0;
2573
2574     static const int * pfcp_cp_function_features_flags[] = {
2575         &hf_pfcp_cp_function_features_b1_ovrl,
2576         &hf_pfcp_cp_function_features_b0_load,
2577         NULL
2578     };
2579     /* Octet 5
2580      * 5/1 LOAD
2581      * 5/2 OVRL
2582      */
2583     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_cp_function_features,
2584         ett_pfcp_cp_function_features, pfcp_cp_function_features_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
2585     offset += 1;
2586
2587     if (offset < length) {
2588         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2589     }
2590
2591 }
2592
2593 /*
2594  * 8.2.59   Usage Information
2595  */
2596 static void
2597 dissect_pfcp_usage_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2598 {
2599     int offset = 0;
2600
2601     static const int * pfcp_usage_information_flags[] = {
2602         &hf_pfcp_spare_h1,
2603         &hf_pfcp_usage_information_b3_ube,
2604         &hf_pfcp_usage_information_b2_uae,
2605         &hf_pfcp_usage_information_b1_aft,
2606         &hf_pfcp_usage_information_b0_bef,
2607         NULL
2608     };
2609     /* Octet 5  Spare   UBE UAE AFT BEF */
2610     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_usage_information,
2611         ett_pfcp_usage_information, pfcp_usage_information_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
2612     offset += 1;
2613
2614     if (offset < length) {
2615         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2616     }
2617
2618 }
2619
2620 /*
2621  * 8.2.60   Application Instance ID
2622  */
2623 static void
2624 dissect_pfcp_application_instance_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2625 {
2626     /* Octet 5 5 to (n+4)   Application Instance Identifier
2627      * The Application Instance Identifier shall be encoded as an OctetString (see 3GPP TS 29.212)
2628      */
2629     proto_tree_add_item(tree, hf_pfcp_application_instance_id, tvb, 0, length, ENC_NA);
2630 }
2631
2632 /*
2633  * 8.2.61   Flow Information
2634  */
2635 static const value_string pfcp_flow_dir_vals[] = {
2636     { 0, "Unspecified" },
2637     { 1, "Downlink (traffic to the UE)" },
2638     { 2, "Uplink (traffic from the UE)" },
2639     { 3, "Bidirectional" },
2640     { 0, NULL }
2641 };
2642
2643 static void
2644 dissect_pfcp_flow_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2645 {
2646     int offset = 0;
2647     guint32 len;
2648     /* Octet 5 Spare    Flow Direction */
2649     proto_tree_add_item(tree, hf_pfcp_spare_b7_b3, tvb, offset, 1, ENC_BIG_ENDIAN);
2650     proto_tree_add_item(tree, hf_pfcp_flow_dir, tvb, offset, 1, ENC_BIG_ENDIAN);
2651     offset++;
2652
2653     /* 6 to 7   Length of Flow Description */
2654     proto_tree_add_item_ret_uint(tree, hf_pfcp_flow_desc_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
2655     offset += 2;
2656     /* Flow Description
2657     * The Flow Description field, when present, shall be encoded as an OctetString
2658     * as specified in subclause 5.4.2 of 3GPP TS 29.212
2659     */
2660     proto_tree_add_item(tree, hf_pfcp_flow_desc, tvb, offset, len, ENC_ASCII|ENC_NA);
2661     offset += len;
2662
2663     if (offset < length) {
2664         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2665     }
2666
2667 }
2668
2669 /*
2670  * 8.2.62   UE IP Address
2671  */
2672 static const true_false_string pfcp_ue_ip_add_sd_flag_vals = {
2673     "Destination IP address",
2674     "Source IP address",
2675 };
2676
2677 static void
2678 dissect_pfcp_ue_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2679 {
2680     int offset = 0;
2681     guint64 ue_ip_address_flags;
2682
2683     static const int * pfcp_ue_ip_address_flags[] = {
2684         &hf_pfcp_spare_b7_b3,
2685         &hf_pfcp_ue_ip_address_flag_b2_sd,
2686         &hf_pfcp_ue_ip_address_flag_b1_v4,
2687         &hf_pfcp_ue_ip_address_flag_b0_v6,
2688         NULL
2689     };
2690     /* Octet 5  Spare   S/D V4  V6*/
2691     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_ue_ip_address_flags,
2692         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);
2693     offset += 1;
2694
2695     /* IPv4 address (if present)*/
2696     if ((ue_ip_address_flags & 0x2) == 2) {
2697         proto_tree_add_item(tree, hf_pfcp_ue_ip_addr_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
2698         offset += 4;
2699     }
2700     /* IPv6 address (if present)*/
2701     if ((ue_ip_address_flags & 0x1) == 1) {
2702         proto_tree_add_item(tree, hf_pfcp_ue_ip_add_ipv6, tvb, offset, 16, ENC_NA);
2703         offset += 16;
2704     }
2705
2706     if (offset < length) {
2707         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2708     }
2709
2710 }
2711 /*
2712  * 8.2.63   Packet Rate
2713  */
2714 static const value_string pfcp_pr_time_unit_vals[] = {
2715     { 0, "Minute" },
2716     { 1, "6 minutes" },
2717     { 2, "Hour" },
2718     { 3, "Day" },
2719     { 4, "Week" },
2720     { 0, NULL }
2721 };
2722
2723 static void
2724 dissect_pfcp_packet_rate(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2725 {
2726     int offset = 0;
2727     guint64 flags;
2728
2729     static const int * pfcp_packet_rate_flags[] = {
2730         &hf_pfcp_spare_b7_b2,
2731         &hf_pfcp_packet_rate_b1_dlpr,
2732         &hf_pfcp_packet_rate_b0_ulpr,
2733         NULL
2734     };
2735     /* Octet 5  Spare   DLPR    ULPR */
2736     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_packet_rate,
2737         ett_pfcp_packet_rate, pfcp_packet_rate_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
2738     offset += 1;
2739
2740     /* Bit 1 - ULPR (Uplink Packet Rate): If this bit is set to "1", then octets m to (m+2) shall be present */
2741     if ((flags & 0x1) == 1) {
2742         /* m */
2743         proto_tree_add_item(tree, hf_pfcp_spare_b7_b3, tvb, offset, 1, ENC_BIG_ENDIAN);
2744         proto_tree_add_item(tree, hf_pfcp_ul_time_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
2745         offset += 1;
2746         /* (m+1) to (m+2)   Maximum Uplink Packet Rate */
2747         proto_tree_add_item(tree, hf_pfcp_max_ul_pr, tvb, offset, 2, ENC_BIG_ENDIAN);
2748         offset += 2;
2749     }
2750     /* Bit 2 - DLPR (Downlink Packet Rate): If this bit is set to "1", then octets p to (p+2) shall be present*/
2751     if ((flags & 0x2) == 2) {
2752         proto_tree_add_item(tree, hf_pfcp_spare_b7_b3, tvb, offset, 1, ENC_BIG_ENDIAN);
2753         proto_tree_add_item(tree, hf_pfcp_dl_time_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
2754         offset += 1;
2755         /* (m+1) to (m+2)   Maximum Uplink Packet Rate */
2756         proto_tree_add_item(tree, hf_pfcp_max_dl_pr, tvb, offset, 2, ENC_BIG_ENDIAN);
2757         offset += 2;
2758     }
2759
2760     if (offset < length) {
2761         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2762     }
2763
2764 }
2765
2766 /*
2767  * 8.2.64   Outer Header Removal
2768  */
2769 static const value_string pfcp_out_hdr_desc_vals[] = {
2770     { 0, "GTP-U/UDP/IPv4" },
2771     { 1, "GTP-U/UDP/IPv6" },
2772     { 2, "UDP/IPv4" },
2773     { 3, "UDP/IPv6 " },
2774     { 0, NULL }
2775 };
2776
2777 static void
2778 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_)
2779 {
2780     int offset = 0;
2781     guint32 value;
2782     /* Octet 5 to (n+4) Application Identifier
2783     * The Application Identifier shall be encoded as an OctetString (see 3GPP TS 29.212)
2784     */
2785     proto_tree_add_item_ret_uint(tree, hf_pfcp_out_hdr_desc, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
2786     offset++;
2787
2788     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_out_hdr_desc_vals, "Unknown"));
2789
2790     if (offset < length) {
2791         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2792     }
2793 }
2794  /*
2795  * 8.2.65   Recovery Time Stamp
2796  */
2797
2798 static void
2799 dissect_pfcp_recovery_time_stamp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
2800 {
2801     const gchar *time_str;
2802     int offset = 0;
2803
2804     /* indicates the UTC time when the node started. Octets 5 to 8 are encoded in the same format as
2805     * the first four octets of the 64-bit timestamp format as defined in section 6 of IETF RFC 5905 [26].
2806     */
2807     time_str = tvb_ntp_fmt_ts_sec(tvb, 0);
2808     proto_tree_add_string(tree, hf_pfcp_recovery_time_stamp, tvb, offset, 4, time_str);
2809     proto_item_append_text(item, "%s", time_str);
2810     offset += 4;
2811
2812     if (offset < length) {
2813         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2814     }
2815
2816 }
2817 /*
2818  * 8.2.66   DL Flow Level Marking
2819  */
2820 static void
2821 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_)
2822 {
2823     int offset = 0;
2824     guint64 flags_val;
2825
2826     static const int * pfcp_dl_flow_level_marking_flags[] = {
2827         &hf_pfcp_spare_b7_b2,
2828         &hf_pfcp_dl_flow_level_marking_b1_sci,
2829         &hf_pfcp_dl_flow_level_marking_b0_ttc,
2830         NULL
2831     };
2832     /* Octet 5  Spare   SCI TTC*/
2833     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_dl_flow_level_marking,
2834         ett_pfcp_pfcp_dl_flow_level_marking, pfcp_dl_flow_level_marking_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
2835     offset += 1;
2836
2837     /* Bit 1 - TTC (ToS/Traffic Class): If this bit is set to "1",
2838      * then the ToS/Traffic Class field shall be present
2839      */
2840     if ((flags_val & 0x1) == 1) {
2841         /* m to (m+1)    ToS/Traffic Class
2842         * The ToS/Traffic Class shall be encoded on two octets as an OctetString.
2843         * The first octet shall contain the IPv4 Type-of-Service or the IPv6 Traffic-Class field and
2844         * the second octet shall contain the ToS/Traffic Class mask field
2845         */
2846         proto_tree_add_item(tree, hf_pfcp_traffic_class, tvb, offset, 1, ENC_BIG_ENDIAN);
2847         offset += 1;
2848         proto_tree_add_item(tree, hf_pfcp_traffic_mask, tvb, offset, 1, ENC_BIG_ENDIAN);
2849         offset += 1;
2850     }
2851     /* SCI (Service Class Indicator): If this bit is set to "1",
2852      * then the Service Class Indicator field shall be present
2853      */
2854     if ((flags_val & 0x2) == 2) {
2855         /* Octets p and (p+1) of the Service Class Indicator field, when present,
2856         * shall be encoded respectively as octets 2 and 3 of the Service Class Indicator Extension Header
2857         * specified in Figure 5.2.2.3-1 of 3GPP TS 29.281
2858         */
2859         proto_tree_add_item(tree, hf_pfcp_sci, tvb, offset, 2, ENC_BIG_ENDIAN);
2860         offset += 2;
2861     }
2862
2863     if (offset < length) {
2864         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2865     }
2866
2867 }
2868
2869 /*
2870  * 8.2.67   Header Enrichment
2871  */
2872 static const value_string pfcp_header_type_vals[] = {
2873     { 0, "HTTP" },
2874     { 0, NULL }
2875 };
2876
2877 static void
2878 dissect_pfcp_header_enrichment(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2879 {
2880     int offset = 0;
2881     guint32 len;
2882     /* Octet 5 Spare    Header Type
2883     */
2884     proto_tree_add_item(tree, hf_pfcp_spare_b7_b5, tvb, offset, 1, ENC_BIG_ENDIAN);
2885     proto_tree_add_item(tree, hf_pfcp_header_type, tvb, offset, 1, ENC_BIG_ENDIAN);
2886     offset++;
2887
2888     /* 6    Length of Header Field Name */
2889     proto_tree_add_item_ret_uint(tree, hf_pfcp_hf_len, tvb, offset, 1, ENC_BIG_ENDIAN, &len);
2890     offset++;
2891
2892     /* 7 to m Header Field Name
2893      * Header Field Name shall be encoded as an OctetString
2894      */
2895     proto_tree_add_item(tree, hf_pfcp_hf_name, tvb, offset, len, ENC_NA);
2896     offset+= len;
2897
2898     /* p    Length of Header Field Value*/
2899     proto_tree_add_item_ret_uint(tree, hf_pfcp_hf_val_len, tvb, offset, 1, ENC_BIG_ENDIAN, &len);
2900     offset++;
2901
2902     /* (p+1) to q   Header Field Value */
2903     proto_tree_add_item(tree, hf_pfcp_hf_val, tvb, offset, len, ENC_NA);
2904     offset += len;
2905
2906     if (offset < length) {
2907         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2908     }
2909 }
2910
2911 /*
2912  * 8.2.68   Measurement Information
2913  */
2914 static void
2915 dissect_pfcp_measurement_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2916 {
2917     int offset = 0;
2918
2919     static const int * pfcp_measurement_info_flags[] = {
2920         &hf_pfcp_spare_b7_b3,
2921         &hf_pfcp_measurement_info_b2_radi,
2922         &hf_pfcp_measurement_info_b1_inam,
2923         &hf_pfcp_measurement_info_b0_mbqe,
2924         NULL
2925     };
2926     /* Octet 5  Spare   INAM    MBQE */
2927     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_measurement_info,
2928         ett_pfcp_measurement_info, pfcp_measurement_info_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
2929     offset += 1;
2930
2931     if (offset < length) {
2932         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2933     }
2934
2935 }
2936 /*
2937  * 8.2.69   Node Report Type
2938  */
2939 static void
2940 dissect_pfcp_node_report_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
2941 {
2942     int offset = 0;
2943
2944     static const int * pfcp_node_report_type_flags[] = {
2945         &hf_pfcp_spare_b7_b1,
2946         &hf_pfcp_node_report_type_b0_upfr,
2947         NULL
2948     };
2949     /* Octet 5  Spare   INAM    MBQE */
2950     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_node_report_type,
2951         ett_pfcp_node_report_type, pfcp_node_report_type_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
2952     offset += 1;
2953
2954     if (offset < length) {
2955         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2956     }
2957
2958 }
2959 /*
2960  * 8.2.70   Remote GTP-U Peer
2961  */
2962 static void
2963 dissect_pfcp_remote_gtp_u_peer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
2964 {
2965     int offset = 0;
2966     guint64 flags;
2967
2968     static const int * pfcp_remote_gtp_u_peer_flags[] = {
2969         &hf_pfcp_spare_b7_b2,
2970         &hf_pfcp_remote_gtp_u_peer_flags_b1_v4,
2971         &hf_pfcp_remote_gtp_u_peer_flags_b0_v6,
2972         NULL
2973     };
2974     /* Octet 5  Spare   V4  V6*/
2975     proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_remote_gtp_u_peer_flags,
2976         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);
2977     offset += 1;
2978
2979     /* IPv4 address (if present)*/
2980     if ((flags & 0x2) == 2) {
2981         proto_tree_add_item(tree, hf_pfcp_remote_gtp_u_peer_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
2982         proto_item_append_text(item, "IPv4 %s ", tvb_ip_to_str(tvb, offset));
2983         offset += 4;
2984     }
2985     /* IPv6 address (if present)*/
2986     if ((flags & 0x1) == 1) {
2987         proto_tree_add_item(tree, hf_pfcp_remote_gtp_u_peer_ipv6, tvb, offset, 16, ENC_NA);
2988         proto_item_append_text(item, "IPv6 %s ", tvb_ip6_to_str(tvb, offset));
2989         offset += 16;
2990     }
2991
2992     if (offset < length) {
2993         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
2994     }
2995
2996 }
2997
2998 /*
2999  * 8.2.71   UR-SEQN
3000  */
3001 static void
3002 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_)
3003 {
3004     guint value;
3005
3006     /* 5 to 8   UR-SEQN
3007     * The UR-SEQN value shall be encoded as an Unsigned32 binary integer value
3008     */
3009     proto_tree_add_item_ret_uint(tree, hf_pfcp_ur_seqn, tvb, 0, 4, ENC_BIG_ENDIAN, &value);
3010
3011     proto_item_append_text(item, "%u", value);
3012
3013
3014 }
3015
3016 /*
3017  * 8.2.72   Activate Predefined Rules
3018  */
3019 static void
3020 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_)
3021 {
3022     int offset = 0;
3023     /* Octet 5 to (n+4) Predefined Rules Name
3024     * The Predefined Rules Name field shall be encoded as an OctetString
3025     */
3026     proto_tree_add_item(tree, hf_pfcp_predef_rules_name, tvb, offset, length, ENC_NA);
3027 }
3028 /*
3029  * 8.2.73   Deactivate Predefined Rules
3030  */
3031 static void
3032 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_)
3033 {
3034     int offset = 0;
3035     /* Octet 5 to (n+4) Predefined Rules Name
3036     * The Predefined Rules Name field shall be encoded as an OctetString
3037     */
3038     proto_tree_add_item(tree, hf_pfcp_predef_rules_name, tvb, offset, length, ENC_NA);
3039 }
3040 /*
3041  * 8.2.74   FAR ID
3042  */
3043 static int
3044 decode_pfcp_far_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, gint offset)
3045 {
3046     guint32 far_id;
3047     guint8 far_id_flag;
3048     /* Octet 5 to 8 FAR ID value
3049      * The bit 8 of octet 5 is used to indicate if the Rule ID is dynamically allocated
3050      * by the CP function or predefined in the UP function. If set to 0, it indicates that
3051      * the Rule is dynamically provisioned by the CP Function. If set to 1, it indicates that
3052      * the Rule is predefined in the UP Function.
3053      */
3054     far_id_flag = tvb_get_guint8(tvb,offset) & 0x80;
3055
3056     proto_tree_add_item(tree, hf_pfcp_far_id_flg, tvb, offset, 4, ENC_BIG_ENDIAN);
3057     proto_tree_add_item_ret_uint(tree, hf_pfcp_far_id, tvb, offset, 4, ENC_BIG_ENDIAN, &far_id);
3058     offset += 4;
3059
3060     proto_item_append_text(item, "%s %u",
3061         ((far_id_flag)? pfcp_id_predef_dynamic_tfs.true_string : pfcp_id_predef_dynamic_tfs.false_string),
3062         (far_id & 0x7fffffff));
3063
3064     return offset;
3065 }
3066 static void
3067 dissect_pfcp_far_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
3068 {
3069     int offset = 0;
3070
3071     offset = decode_pfcp_far_id(tvb, pinfo, tree, item, offset);
3072
3073     if (offset < length) {
3074         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3075     }
3076
3077 }
3078 /*
3079  * 8.2.75   QER ID
3080  */
3081 static int
3082 decode_pfcp_qer_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint offset)
3083 {
3084     guint32 qer_id;
3085     guint8 qer_id_flag;
3086     /* Octet 5 to 8 QER ID value
3087     * The bit 8 of octet 5 is used to indicate if the Rule ID is dynamically allocated by the CP function
3088     * or predefined in the UP function. If set to 0, it indicates that the Rule is dynamically provisioned
3089     * by the CP Function. If set to 1, it indicates that the Rule is predefined in the UP Function
3090     */
3091     qer_id_flag = tvb_get_guint8(tvb, offset) & 0x80;
3092
3093     proto_tree_add_item(tree, hf_pfcp_qer_id_flg, tvb, offset, 4, ENC_BIG_ENDIAN);
3094     proto_tree_add_item_ret_uint(tree, hf_pfcp_qer_id, tvb, offset, 4, ENC_BIG_ENDIAN, &qer_id);
3095     offset += 4;
3096
3097     proto_item_append_text(item, "%s %u",
3098         ((qer_id_flag)? pfcp_id_predef_dynamic_tfs.true_string : pfcp_id_predef_dynamic_tfs.false_string),
3099         (qer_id & 0x7fffffff));
3100
3101     return offset;
3102
3103 }
3104 static void
3105 dissect_pfcp_qer_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
3106 {
3107     int offset = 0;
3108
3109     offset = decode_pfcp_qer_id(tvb, pinfo, tree, item, offset);
3110
3111     if (offset < length) {
3112         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3113     }
3114
3115 }
3116 /*
3117  * 8.2.76   OCI Flags
3118  */
3119 static void
3120 dissect_pfcp_oci_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
3121 {
3122     int offset = 0;
3123
3124     static const int * pfcp_oci_flags_flags[] = {
3125         &hf_pfcp_spare_b7_b1,
3126         &hf_pfcp_oci_flags_b0_aoci,
3127         NULL
3128     };
3129     /* Octet 5  Spare   AOCI */
3130     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_oci_flags,
3131         ett_pfcp_oci_flags, pfcp_oci_flags_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
3132     offset += 1;
3133
3134     if (offset < length) {
3135         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3136     }
3137
3138 }
3139
3140 /*
3141  * 8.2.77   PFCP Association Release Request
3142  */
3143 static void
3144 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_)
3145 {
3146     int offset = 0;
3147
3148     static const int * pfcp_sx_assoc_rel_req_flags[] = {
3149         &hf_pfcp_spare_b7_b1,
3150         &hf_pfcp_pfcp_assoc_rel_req_b0_sarr,
3151         NULL
3152     };
3153     /* Octet 5  Spare    SARR */
3154     proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_pfcp_assoc_rel_req_flags,
3155         ett_sx_assoc_rel_req_flags, pfcp_sx_assoc_rel_req_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
3156     offset += 1;
3157
3158     if (offset < length) {
3159         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3160     }
3161
3162 }
3163
3164 /*
3165  * 8.2.78   Graceful Release Period
3166  */
3167 static void
3168 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_)
3169 {
3170     int offset = 0;
3171     guint32 unit, value;
3172
3173     /* Octet 5  Timer unit  Timer value */
3174     proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_unit, tvb, offset, 1, ENC_BIG_ENDIAN, &unit);
3175     proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
3176     offset++;
3177
3178     if ((unit == 0) && (value == 0)) {
3179         proto_item_append_text(item, " Stopped");
3180     } else {
3181         switch (unit) {
3182         case 0:
3183             proto_item_append_text(item, "%u s", value * 2);
3184             break;
3185         case 1:
3186             proto_item_append_text(item, "%u min", value);
3187             break;
3188         case 2:
3189             proto_item_append_text(item, "%u min", value * 10);
3190             break;
3191         case 3:
3192             proto_item_append_text(item, "%u hours", value);
3193             break;
3194         case 4:
3195             proto_item_append_text(item, "%u hours", value * 10);
3196             break;
3197         case 7:
3198             proto_item_append_text(item, "%u Infinite", value);
3199             break;
3200             /* Value 5 and 6 */
3201         default:
3202             proto_item_append_text(item, "%u min", value * 1);
3203             break;
3204         }
3205     }
3206
3207     if (offset < length) {
3208         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3209     }
3210
3211 }
3212 /*
3213  * 8.2.79    PDN Type
3214  */
3215 static const value_string pfcp_pdn_type_vals[] = {
3216     { 0, "Reserved" },
3217     { 1, "IPv4" },
3218     { 2, "IPv6" },
3219     { 3, "IPv4V6" },
3220     { 4, "Non-IP" },
3221     { 0, NULL }
3222 };
3223
3224 static void
3225 dissect_pfcp_pdn_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
3226 {
3227     int offset = 0;
3228     guint32 value;
3229     /* Octet 5  Application Identifier
3230     * The Application Identifier shall be encoded as an OctetString (see 3GPP TS 29.212)
3231     */
3232     proto_tree_add_item_ret_uint(tree, hf_pfcp_pdn_type, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
3233     offset++;
3234
3235     proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_pdn_type_vals, "Unknown"));
3236
3237     if (offset < length) {
3238         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3239     }
3240 }
3241 /*
3242  * 8.2.80    Failed Rule ID
3243  */
3244 static const value_string pfcp_failed_rule_id_type_vals[] = {
3245     { 0, "PDR" },
3246     { 1, "FAR" },
3247     { 2, "QER" },
3248     { 3, "URR" },
3249     { 4, "BAR" },
3250     { 0, NULL }
3251 };
3252
3253 static void
3254 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_)
3255 {
3256     int offset = 0;
3257     guint32 rule_type;
3258
3259     /* Octet 5  Rule ID Type */
3260     proto_tree_add_item_ret_uint(tree, hf_pfcp_failed_rule_id_type, tvb, offset, 1, ENC_BIG_ENDIAN, &rule_type);
3261     offset++;
3262
3263     proto_item_append_text(item, "%s", val_to_str_const(rule_type, pfcp_failed_rule_id_type_vals, "Unknown"));
3264
3265     /* 6 to p  Rule ID value
3266     * The length and the value of the Rule ID value field shall be set as specified for the
3267     * PDR ID, FAR ID, QER ID, URR ID and BAR ID IE types respectively.
3268     */
3269     switch (rule_type) {
3270         case 0:
3271             /* PDR ID */
3272             offset = decode_pfcp_pdr_id(tvb, pinfo, tree, item, offset);
3273             break;
3274         case 1:
3275             /* FAR ID */
3276             offset = decode_pfcp_far_id(tvb, pinfo, tree, item, offset);
3277             break;
3278         case 2:
3279             /* QER ID */
3280             offset = decode_pfcp_qer_id(tvb, pinfo, tree, item, offset);
3281             break;
3282         case 3:
3283             /* URR ID */
3284             offset = decode_pfcp_urr_id(tvb, pinfo, tree, item, offset);
3285             break;
3286         case 4:
3287             /* BAR ID */
3288             offset = decode_pfcp_bar_id(tvb, pinfo, tree, item, offset);
3289             break;
3290         default:
3291             break;
3292     }
3293
3294     if (offset < length) {
3295         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3296     }
3297 }
3298 /*
3299  * 8.2.81    Time Quota Mechanism
3300  */
3301 static const value_string pfcp_time_qouta_mechanism_bti_type_vals[] = {
3302     { 0, "CTP" },
3303     { 1, "DTP" },
3304     { 0, NULL }
3305 };
3306
3307 static void
3308 dissect_pfcp_time_qouta_mechanism(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
3309 {
3310     int offset = 0;
3311     guint32 bti_type;
3312
3313     /* Octet 5  BIT Type */
3314     proto_tree_add_item_ret_uint(tree, hf_pfcp_time_qouta_mechanism_bti_type, tvb, offset, 1, ENC_BIG_ENDIAN, &bti_type);
3315     offset++;
3316
3317     proto_item_append_text(item, "%s", val_to_str_const(bti_type, pfcp_time_qouta_mechanism_bti_type_vals, "Unknown"));
3318
3319     /* Base Time Interval
3320     * The Base Time Interval, shall be encoded as an Unsigned32
3321     * as specified in subclause 7.2.29 of 3GPP TS 32.299
3322     */
3323     proto_tree_add_item(tree, hf_pfcp_time_qouta_mechanism_bti, tvb, offset, 4, ENC_BIG_ENDIAN);
3324     offset += 4;
3325
3326     if (offset < length) {
3327         proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
3328     }
3329 }
3330 /*
3331  * 8.2.82    User Plane IP Resource Information
3332  */
3333 static void
3334 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_)
3335 {
3336     int offset = 0;
3337     guint64 upiri_flags_val;
3338     guint32 upiri_teid_range;
3339
3340     static const int * pfcp_upiri_flags[] = {
3341         &hf_pfcp_spare_b7_b6,
3342         &hf_pfcp_upiri_flg_b5_assoni,
3343         &hf_pfcp_upiri_flags_b1_v6,
3344         &hf_pfcp_upiri_flags_b0_v4,
3345         NULL
3346     };