1 /* packet-f1ap.c
2  * Routines for E-UTRAN F1 Application Protocol (F1AP) packet dissection
3  * Copyright 2018-2021, Pascal Quantin <pascal@wireshark.org>
4  *
5  * Wireshark - Network traffic analyzer
6  * By Gerald Combs <gerald@wireshark.org>
7  * Copyright 1998 Gerald Combs
8  *
9  * SPDX-License-Identifier: GPL-2.0-or-later
10  *
11  * References: 3GPP TS 38.473 V16.7.0 (2021-10)
12  */
13 
14 #include "config.h"
15 
16 #include <epan/packet.h>
17 
18 #include <epan/asn1.h>
19 #include <epan/sctpppids.h>
20 #include <epan/proto_data.h>
21 #include <epan/stats_tree.h>
22 
23 #include "packet-per.h"
24 #include "packet-f1ap.h"
25 #include "packet-x2ap.h"
26 #include "packet-nr-rrc.h"
27 #include "packet-e212.h"
28 #include "packet-pdcp-nr.h"
29 #include "packet-lte-rrc.h"
30 #include "packet-nrppa.h"
31 
32 #define PNAME  "F1 Application Protocol"
33 #define PSNAME "F1AP"
34 #define PFNAME "f1ap"
35 
36 #define SCTP_PORT_F1AP 38472
37 
38 void proto_register_f1ap(void);
39 void proto_reg_handoff_f1ap(void);
40 
41 #include "packet-f1ap-val.h"
42 
43 /* Initialize the protocol and registered fields */
44 static int proto_f1ap = -1;
45 
46 static int hf_f1ap_transportLayerAddressIPv4 = -1;
47 static int hf_f1ap_transportLayerAddressIPv6 = -1;
48 static int hf_f1ap_IABTNLAddressIPv4 = -1;
49 static int hf_f1ap_IABTNLAddressIPv6 = -1;
50 static int hf_f1ap_IABTNLAddressIPv6Prefix = -1;
51 static int hf_f1ap_interfacesToTrace_NG_C = -1;
52 static int hf_f1ap_interfacesToTrace_Xn_C = -1;
53 static int hf_f1ap_interfacesToTrace_Uu = -1;
54 static int hf_f1ap_interfacesToTrace_F1_C = -1;
55 static int hf_f1ap_interfacesToTrace_E1 = -1;
56 static int hf_f1ap_interfacesToTrace_Reserved = -1;
57 static int hf_f1ap_MeasurementsToActivate_Reserved1 = -1;
58 static int hf_f1ap_MeasurementsToActivate_M2 = -1;
59 static int hf_f1ap_MeasurementsToActivate_Reserved2 = -1;
60 static int hf_f1ap_MeasurementsToActivate_M5 = -1;
61 static int hf_f1ap_MeasurementsToActivate_Reserved3 = -1;
62 static int hf_f1ap_MeasurementsToActivate_M6 = -1;
63 static int hf_f1ap_MeasurementsToActivate_M7 = -1;
64 static int hf_f1ap_ReportCharacteristics_PRBPeriodic = -1;
65 static int hf_f1ap_ReportCharacteristics_TNLCapacityIndPeriodic = -1;
66 static int hf_f1ap_ReportCharacteristics_CompositeAvailableCapacityPeriodic = -1;
67 static int hf_f1ap_ReportCharacteristics_HWLoadIndPeriodic = -1;
68 static int hf_f1ap_ReportCharacteristics_NumberOfActiveUEs = -1;
69 static int hf_f1ap_ReportCharacteristics_Reserved = -1;
70 #include "packet-f1ap-hf.c"
71 
72 /* Initialize the subtree pointers */
73 static gint ett_f1ap = -1;
74 static gint ett_f1ap_ResourceCoordinationTransferContainer = -1;
75 static gint ett_f1ap_PLMN_Identity = -1;
76 static gint ett_f1ap_MIB_message = -1;
77 static gint ett_f1ap_SIB1_message = -1;
78 static gint ett_f1ap_CG_ConfigInfo = -1;
79 static gint ett_f1ap_CellGroupConfig = -1;
80 static gint ett_f1ap_TransportLayerAddress = -1;
81 static gint ett_f1ap_UE_CapabilityRAT_ContainerList = -1;
82 static gint ett_f1ap_measurementTimingConfiguration = -1;
83 static gint ett_f1ap_DUtoCURRCContainer = -1;
84 static gint ett_f1ap_requestedP_MaxFR1 = -1;
85 static gint ett_f1ap_HandoverPreparationInformation = -1;
86 static gint ett_f1ap_MeasConfig = -1;
87 static gint ett_f1ap_MeasGapConfig = -1;
88 static gint ett_f1ap_MeasGapSharingConfig = -1;
89 static gint ett_f1ap_EUTRA_NR_CellResourceCoordinationReq_Container = -1;
90 static gint ett_f1ap_EUTRA_NR_CellResourceCoordinationReqAck_Container = -1;
91 static gint ett_f1ap_ProtectedEUTRAResourceIndication = -1;
92 static gint ett_f1ap_RRCContainer = -1;
93 static gint ett_f1ap_RRCContainer_RRCSetupComplete = -1;
94 static gint ett_f1ap_sIBmessage = -1;
95 static gint ett_f1ap_UplinkTxDirectCurrentListInformation = -1;
96 static gint ett_f1ap_DRX_Config = -1;
Button()97 static gint ett_f1ap_Ph_InfoSCG = -1;
98 static gint ett_f1ap_RequestedBandCombinationIndex = -1;
99 static gint ett_f1ap_RequestedFeatureSetEntryIndex = -1;
100 static gint ett_f1ap_RequestedP_MaxFR2 = -1;
101 static gint ett_f1ap_UEAssistanceInformation = -1;
102 static gint ett_f1ap_CG_Config = -1;
103 static gint ett_f1ap_Ph_InfoMCG = -1;
104 static gint ett_f1ap_BurstArrivalTime = -1;
105 static gint ett_f1ap_cSI_RS_Configuration = -1;
106 static gint ett_f1ap_sR_Configuration = -1;
107 static gint ett_f1ap_pDCCH_ConfigSIB1 = -1;
108 static gint ett_f1ap_sCS_Common = -1;
109 static gint ett_f1ap_IABTNLAddressIPv4Address = -1;
110 static gint ett_f1ap_IABTNLAddressIPv6Address = -1;
111 static gint ett_f1ap_IABTNLAddressIPv6Prefix = -1;
112 static gint ett_f1ap_InterfacesToTrace = -1;
113 static gint ett_f1ap_MeasurementsToActivate = -1;
Button(String label)114 static gint ett_f1ap_NRUERLFReportContainer = -1;
115 static gint ett_f1ap_RACH_Config_Common = -1;
116 static gint ett_f1ap_RACH_Config_Common_IAB = -1;
117 static gint ett_f1ap_RACHReportContainer = -1;
118 static gint ett_f1ap_ReferenceTime = -1;
119 static gint ett_f1ap_ReportCharacteristics = -1;
120 static gint ett_f1ap_SIB10_message = -1;
121 static gint ett_f1ap_SIB12_message = -1;
122 static gint ett_f1ap_SIB13_message = -1;
123 static gint ett_f1ap_SIB14_message = -1;
124 static gint ett_f1ap_SL_PHY_MAC_RLC_Config = -1;
125 static gint ett_f1ap_SL_ConfigDedicatedEUTRA_Info = -1;
126 static gint ett_f1ap_TDD_UL_DLConfigCommonNR = -1;
127 static gint ett_f1ap_UEAssistanceInformationEUTRA = -1;
128 static gint ett_f1ap_PosAssistance_Information = -1;
129 #include "packet-f1ap-ett.c"
130 
131 enum{
132   INITIATING_MESSAGE,
133   SUCCESSFUL_OUTCOME,
134   UNSUCCESSFUL_OUTCOME
getLabel()135 };
136 
137 /* F1AP stats - Tap interface */
138 
139 static void set_stats_message_type(packet_info *pinfo, int type);
140 
141 static const guint8 *st_str_packets        = "Total Packets";
142 static const guint8 *st_str_packet_types   = "F1AP Packet Types";
143 
144 static int st_node_packets = -1;
145 static int st_node_packet_types = -1;
146 static int f1ap_tap = -1;
147 
setLabel(String label)148 struct f1ap_tap_t {
149     gint f1ap_mtype;
150 };
151 
152 #define MTYPE_RESET                                       1
153 #define MTYPE_RESET_ACK                                   2
154 #define MTYPE_F1_SETUP_REQUEST                            3
155 #define MTYPE_F1_SETUP_RESPONSE                           4
156 #define MTYPE_F1_SETUP_FAILURE                            5
157 #define MTYPE_GNB_DU_CONFIGURATION_UPDATE                 6
158 #define MTYPE_GNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE     7
159 #define MTYPE_GNB_DU_CONFIGURATION_UPDATE_FAILURE         8
160 #define MTYPE_GNB_CU_CONFIGURATION_UPDATE                 9
161 #define MTYPE_GNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE     10
162 #define MTYPE_GNB_CU_CONFIGURATION_UPDATE_FAILURE         11
163 #define MTYPE_UE_CONTEXT_SETUP_REQUEST                    12
164 #define MTYPE_UE_CONTEXT_SETUP_RESPONSE                   13
165 #define MTYPE_UE_CONTEXT_SETUP_FAILURE                    14
getActionCommand()166 #define MTYPE_UE_CONTEXT_RELEASE_COMMAND                  15
167 #define MTYPE_UE_CONTEXT_RELEASE_COMPLETE                 16
168 #define MTYPE_UE_CONTEXT_MODIFICATION_REQUEST             17
169 #define MTYPE_UE_CONTEXT_MODIFICATION_RESPONSE            18
170 #define MTYPE_UE_CONTEXT_MODIFICATION_FAILURE             19
171 #define MTYPE_UE_CONTEXT_MODIFICATION_REQUIRED            20
172 #define MTYPE_UE_CONTEXT_MODIFICATION_CONFIRM             21
173 #define MTYPE_UE_CONTEXT_MODIFICATION_REFUSE              22
174 #define MTYPE_WRITE_REPLACE_WARNING_REQUEST               23
175 #define MTYPE_WRITE_REPLACE_WARNING_RESPONSE              24
176 #define MTYPE_PWS_CANCEL_REQUEST                          25
177 #define MTYPE_PWS_CANCEL_RESPONSE                         25
178 #define MTYPE_ERROR_INDICATION                            26
179 #define MTYPE_UE_CONTEXT_RELEASE_REQUEST                  27
180 #define MTYPE_INITIAL_UL_RRC_MESSAGE_TRANSFER             28
181 #define MTYPE_DL_RRC_MESSAGE_TRANSFER                     29
182 #define MTYPE_UL_RRC_MESSAGE_TRANSFER                     30
183 #define MTYPE_UE_INACTIVITY_NOTIFICATION                  31
184 #define MTYPE_GNB_DU_RESOURCE_COORDINATION_REQUEST        32
185 #define MTYPE_GNB_DU_RESOURCE_COORDINATION_RESPONSE       33
186 #define MTYPE_PRIVATE_MESSAGE                             34
187 #define MTYPE_SYSTEM_INFORMATION_DELIVERY_COMMAND         35
188 #define MTYPE_PAGING                                      36
189 #define MTYPE_NOTIFY                                      37
190 #define MTYPE_NETWORK_ACCESS_RATE_REDUCTION               38
191 #define MTYPE_PWS_RESTART_INDICATION                      39
192 #define MTYPE_PWS_FAILURE_INDICATION                      40
193 #define MTYPE_GNB_DU_STATUS_INDICATION                    41
194 #define MTYPE_RRC_DELIVERY_REPORT                         42
195 #define MTYPE_F1_REMOVAL_REQUEST                          43
196 #define MTYPE_F1_REMOVAL_RESPONSE                         44
197 #define MTYPE_F1_REMOVAL_FAILURE                          45
198 #define MTYPE_TRACE_START                                 46
199 #define MTYPE_DEACTIVATE_TRACE                            47
200 #define MTYPE_DU_CU_RADIO_INFORMATION_TRANSFER            48
201 #define MTYPE_CU_DU_RADIO_INFORMATION_TRANSFER            49
202 #define MTYPE_BAP_MAPPING_CONFIGURATION                   50
203 #define MTYPE_BAP_MAPPING_CONFIGURATION_ACKNOWLEDGE       51
204 #define MTYPE_BAP_MAPPING_CONFIGURATION_FAILURE           52
205 #define MTYPE_GNB_DU_RESOURCE_CONFIGURATION               53
206 #define MTYPE_GNB_DU_RESOURCE_CONFIGURATION_ACKNOWLEDGE   54
207 #define MTYPE_GNB_DU_RESOURCE_CONFIGURATION_FAILURE       55
208 #define MTYPE_IAB_TNL_ADDRESS_REQUEST                     56
209 #define MTYPE_IAB_TNL_ADDRESS_RESPONSE                    57
210 #define MTYPE_IAB_TNL_ADDRESS_FAILURE                     58
211 #define MTYPE_IAB_UP_CONFIGURATION_UPDATE_REQUEST         59
212 #define MTYPE_IAB_UP_CONFIGURATION_UPDATE_RESPONSE        60
213 #define MTYPE_IAB_UP_CONFIGURATION_UPDATE_FAILURE         61
214 #define MTYPE_RESOURCE_STATUS_REQUEST                     62
215 #define MTYPE_RESOURCE_STATUS_RESPONSE                    63
216 #define MTYPE_RESOURCE_STATUS_FAILURE                     64
217 #define MTYPE_RESOURCE_STATUS_UPDATE                      65
218 #define MTYPE_ACCESS_AND_MOBILITY_INDICATION              66
219 #define MTYPE_REFERENCE_TIME_INFORMATION_REPORTING_CONTROL 67
220 #define MTYPE_REFERENCE_TIME_INFORMATION_REPORT           68
221 #define MTYPE_ACCESS_SUCCESS                              69
222 #define MTYPE_CELL_TRAFFIC_TRACE                          70
223 #define MTYPE_POSITIONING_ASSISTANCE_INFORMATION_CONTROL  71
224 #define MTYPE_POSITIONING_ASSISTANCE_INFORMATION_FEEDBACK 72
225 #define MTYPE_POSITIONING_MEASUREMENT_REQUEST             73
226 #define MTYPE_POSITIONING_MEASUREMENT_RESPONSE            74
227 #define MTYPE_POSITIONING_MEASUREMENT_FAILURE             75
228 #define MTYPE_POSITIONING_MEASUREMENT_REPORT              76
229 #define MTYPE_POSITIONING_MEASUREMENT_ABORT               77
230 #define MTYPE_POSITIONING_MEASUREMENT_FAILURE_INDICATION  78
231 #define MTYPE_POSITIONING_MEASUREMENT_UPDATE              79
232 #define MTYPE_TRP_INFORMATION_REQUEST                     80
233 #define MTYPE_TRP_INFORMATION_RESPONSE                    81
234 #define MTYPE_TRP_INFORMATION_FAILURE                     82
235 #define MTYPE_POSITIONING_INFORMATION_REQUEST             83
236 #define MTYPE_POSITIONING_INFORMATION_RESPONSE            84
237 #define MTYPE_POSITIONING_INFORMATION_FAILURE             85
238 #define MTYPE_POSITIONING_ACTIVATION_REQUEST              86
239 #define MTYPE_POSITIONING_ACTIVATION_RESPONSE             87
240 #define MTYPE_POSITIONING_ACTIVATION_FAILURE              88
241 #define MTYPE_POSITIONING_DEACTIVATION                    89
242 #define MTYPE_E_CID_MEASUREMENT_INITIATION_REQUEST        90
243 #define MTYPE_E_CID_MEASUREMENT_INITIATION_RESPONSE       91
244 #define MTYPE_E_CID_MEASUREMENT_INITIATION_FAILURE        92
245 #define MTYPE_E_CID_MEASUREMENT_FAILURE_INDICATION        93
246 #define MTYPE_E_CID_MEASUREMENT_REPORT                    94
247 #define MTYPE_E_CID_MEASUREMENT_TERMINATION_COMMAND       95
248 #define MTYPE_POSITIONING_INFORMATION_UPDATE              96
249 
250 
251 
252 /* Value Strings. TODO: ext? */
253 static const value_string mtype_names[] = {
254     { MTYPE_RESET,     "Reset" },
255     { MTYPE_RESET_ACK, "ResetAcknowledge" },
256     { MTYPE_F1_SETUP_REQUEST,  "F1SetupRequest" },
257     { MTYPE_F1_SETUP_RESPONSE, "F1SetupResponse" },
258     { MTYPE_F1_SETUP_FAILURE,  "F1SetupFailure" },
259     { MTYPE_GNB_DU_CONFIGURATION_UPDATE,             "GNBDUConfigurationUpdate" },
260     { MTYPE_GNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE, "GNBDUConfigurationUpdateAcknowledge" },
261     { MTYPE_GNB_DU_CONFIGURATION_UPDATE_FAILURE,     "GNBDUConfigurationUpdateFailure" },
262     { MTYPE_GNB_CU_CONFIGURATION_UPDATE,             "GNBCUConfigurationUpdate" },
263     { MTYPE_GNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE, "GNBCUConfigurationUpdateAcknowledge" },
264     { MTYPE_GNB_CU_CONFIGURATION_UPDATE_FAILURE,     "GNBCUConfigurationUpdateFailure" },
265     { MTYPE_UE_CONTEXT_SETUP_REQUEST,    "UEContextSetupRequest" },
266     { MTYPE_UE_CONTEXT_SETUP_RESPONSE,   "UEContextSetupResponse" },
267     { MTYPE_UE_CONTEXT_SETUP_FAILURE,    "UEContextSetupFailure" },
268     { MTYPE_UE_CONTEXT_RELEASE_COMMAND,      "UEContextReleaseCommand"},
269     { MTYPE_UE_CONTEXT_RELEASE_COMPLETE,     "UEContextReleaseComplete"},
270     { MTYPE_UE_CONTEXT_MODIFICATION_REQUEST,   "UEContextModificationRequest" },
271     { MTYPE_UE_CONTEXT_MODIFICATION_RESPONSE,  "UEContextModificationResponse" },
272     { MTYPE_UE_CONTEXT_MODIFICATION_FAILURE,   "UEContextModificationFailure" },
273     { MTYPE_UE_CONTEXT_MODIFICATION_REQUIRED,  "UEContextModificationRequired" },
274     { MTYPE_UE_CONTEXT_MODIFICATION_CONFIRM,   "UEContextModificationConfirm" },
275     { MTYPE_UE_CONTEXT_MODIFICATION_REFUSE,   "UEContextModificationRefuse" },
276     { MTYPE_WRITE_REPLACE_WARNING_REQUEST,  "WriteReplaceWarningRequest" },
277     { MTYPE_WRITE_REPLACE_WARNING_RESPONSE, "WriteReplaceWarningResponse" },
278     { MTYPE_PWS_CANCEL_REQUEST,   "PWSCancelRequest" },
279     { MTYPE_PWS_CANCEL_RESPONSE,  "PWSCancelResponse" },
280     { MTYPE_ERROR_INDICATION, "ErrorIndication" },
281     { MTYPE_UE_CONTEXT_RELEASE_REQUEST, "UEContextReleaseRequest" },
282     { MTYPE_INITIAL_UL_RRC_MESSAGE_TRANSFER, "InitialULRRCMessageTransfer" },
283     { MTYPE_DL_RRC_MESSAGE_TRANSFER,  "DLRRCMessageTransfer" },
284     { MTYPE_UL_RRC_MESSAGE_TRANSFER,  "ULRRCMessageTransfer" },
285     { MTYPE_UE_INACTIVITY_NOTIFICATION, "UEInactivityNotification" },
286     { MTYPE_GNB_DU_RESOURCE_COORDINATION_REQUEST,  "GNBDUResourceCoordinationRequest" },
287     { MTYPE_GNB_DU_RESOURCE_COORDINATION_RESPONSE, "GNBDUResourceCoordinationResponse" },
288     { MTYPE_PRIVATE_MESSAGE, "PrivateMessage" },
289     { MTYPE_SYSTEM_INFORMATION_DELIVERY_COMMAND, "SystemInformationDeliveryCommand" },
290     { MTYPE_PAGING, "Paging" },
291     { MTYPE_NOTIFY, "Notify" },
292     { MTYPE_NETWORK_ACCESS_RATE_REDUCTION, "NetworkAccessRateReduction" },
293     { MTYPE_PWS_RESTART_INDICATION, "PWSRestartIndication" },
294     { MTYPE_PWS_FAILURE_INDICATION, "PWSFailureIndication" },
295     { MTYPE_GNB_DU_STATUS_INDICATION, "GNBDUStatusIndication" },
296     { MTYPE_RRC_DELIVERY_REPORT, "RRCDeliveryReport" },
297     { MTYPE_F1_REMOVAL_REQUEST,  "F1RemovalRequest" },
298     { MTYPE_F1_REMOVAL_RESPONSE, "F1RemovalResponse" },
299     { MTYPE_F1_REMOVAL_FAILURE,  "F1RemovalFailure" },
300     { MTYPE_TRACE_START, "TraceStart" },
301     { MTYPE_DEACTIVATE_TRACE, "DeactivateTrace" },
302     { MTYPE_DU_CU_RADIO_INFORMATION_TRANSFER, "DUCURadioInformationTransfer" },
303     { MTYPE_CU_DU_RADIO_INFORMATION_TRANSFER, "CUDURadioInformationTransfer" },
304     { MTYPE_BAP_MAPPING_CONFIGURATION,             "BAPMappingConfiguration" },
305     { MTYPE_BAP_MAPPING_CONFIGURATION_ACKNOWLEDGE, "BAPMappingConfigurationAcknowledge" },
306     { MTYPE_BAP_MAPPING_CONFIGURATION_FAILURE,     "BAPMappingConfigurationFailure" },
307     { MTYPE_GNB_DU_RESOURCE_CONFIGURATION,             "GNBDUResourceConfiguration" },
308     { MTYPE_GNB_DU_RESOURCE_CONFIGURATION_ACKNOWLEDGE, "GNBDUResourceConfigurationAcknowledge" },
309     { MTYPE_GNB_DU_RESOURCE_CONFIGURATION_FAILURE,     "GNBDUResourceConfigurationFailure" },
310     { MTYPE_IAB_TNL_ADDRESS_REQUEST,  "IABTNLAddressRequest" },
311     { MTYPE_IAB_TNL_ADDRESS_RESPONSE, "IABTNLAddressResponse" },
312     { MTYPE_IAB_TNL_ADDRESS_FAILURE,  "IABTNLAddressFailure" },
313     { MTYPE_IAB_UP_CONFIGURATION_UPDATE_REQUEST,  "IABUPConfigurationUpdateRequest" },
314     { MTYPE_IAB_UP_CONFIGURATION_UPDATE_RESPONSE, "IABUPConfigurationUpdateResponse" },
315     { MTYPE_IAB_UP_CONFIGURATION_UPDATE_FAILURE,  "IABUPConfigurationUpdateFailure" },
316     { MTYPE_RESOURCE_STATUS_REQUEST,   "ResourceStatusRequest" },
317     { MTYPE_RESOURCE_STATUS_RESPONSE,  "ResourceStatusResponse" },
318     { MTYPE_RESOURCE_STATUS_FAILURE,   "ResourceStatusFailure" },
319     { MTYPE_RESOURCE_STATUS_UPDATE,    "ResourceStatusUpdate" },
320     { MTYPE_ACCESS_AND_MOBILITY_INDICATION, "AccessAndMobilityIndication" },
321     { MTYPE_REFERENCE_TIME_INFORMATION_REPORTING_CONTROL, "ReferenceTimeInformationReportingControl" },
322     { MTYPE_REFERENCE_TIME_INFORMATION_REPORT,            "ReferenceTimeInformationReport" },
323     { MTYPE_ACCESS_SUCCESS, "AccessSuccess" },
324     { MTYPE_CELL_TRAFFIC_TRACE, "CellTrafficTrace" },
325     { MTYPE_POSITIONING_ASSISTANCE_INFORMATION_CONTROL,  "PositioningAssistanceInformationControl" },
326     { MTYPE_POSITIONING_ASSISTANCE_INFORMATION_FEEDBACK, "PositioningAssistanceInformationFeedback" },
327     { MTYPE_POSITIONING_MEASUREMENT_REQUEST,            "PositioningMeasurementRequest" },
328     { MTYPE_POSITIONING_MEASUREMENT_RESPONSE,           "PositioningMeasurementResponse" },
329     { MTYPE_POSITIONING_MEASUREMENT_FAILURE,            "PositioningMeasurementFailure" },
330     { MTYPE_POSITIONING_MEASUREMENT_REPORT,             "PositioningMeasurementReport" },
331     { MTYPE_POSITIONING_MEASUREMENT_ABORT,              "PositioningMeasurementAbort" },
332     { MTYPE_POSITIONING_MEASUREMENT_FAILURE_INDICATION, "PositioningMeasurementFailureIndication" },
333     { MTYPE_POSITIONING_MEASUREMENT_UPDATE,             "PositioningMeasurementUpdate" },
334     { MTYPE_TRP_INFORMATION_REQUEST,  "TRPInformationRequest" },
335     { MTYPE_TRP_INFORMATION_RESPONSE, "TRPInformationResponse" },
336     { MTYPE_TRP_INFORMATION_FAILURE,  "TRPInformationFailure" },
337     { MTYPE_POSITIONING_INFORMATION_REQUEST,  "PositioningInformationRequest" },
338     { MTYPE_POSITIONING_INFORMATION_RESPONSE, "PositioningInformationResponse" },
339     { MTYPE_POSITIONING_INFORMATION_FAILURE,  "PositioningInformationFailure" },
340     { MTYPE_POSITIONING_ACTIVATION_REQUEST,   "PositioningActivationRequest" },
341     { MTYPE_POSITIONING_ACTIVATION_RESPONSE,  "PositioningActivationResponse" },
342     { MTYPE_POSITIONING_ACTIVATION_FAILURE,   "PositioningActivationFailure" },
343     { MTYPE_POSITIONING_DEACTIVATION, "PositioningDeactivation" },
344     { MTYPE_E_CID_MEASUREMENT_INITIATION_REQUEST,  "E-CIDMeasurementInitiationRequest" },
345     { MTYPE_E_CID_MEASUREMENT_INITIATION_RESPONSE, "E-CIDMeasurementInitiationResponse" },
346     { MTYPE_E_CID_MEASUREMENT_INITIATION_FAILURE,  "E-CIDMeasurementInitiationFailure" },
347     { MTYPE_E_CID_MEASUREMENT_FAILURE_INDICATION,  "E-CIDMeasurementFailureIndication" },
348     { MTYPE_E_CID_MEASUREMENT_REPORT,              "E-CIDMeasurementReport" },
349     { MTYPE_E_CID_MEASUREMENT_TERMINATION_COMMAND, "E-CIDMeasurementTerminationCommand" },
350     { MTYPE_POSITIONING_INFORMATION_UPDATE, "PositioningInformationUpdate" },
351     { 0,  NULL }
352 };
353 
354 
355 
356 typedef struct {
357   guint32 message_type;
358   guint32 procedure_code;
359   guint32 protocol_ie_id;
360   guint32 protocol_extension_id;
361   const char *obj_id;
362   guint32 sib_type;
363   guint32 srb_id;
364   e212_number_type_t number_type;
365   struct f1ap_tap_t  *stats_tap;
366 } f1ap_private_data_t;
367 
368 typedef struct {
369   guint32 message_type;
370   guint32 ProcedureCode;
371   guint32 ProtocolIE_ID;
372   guint32 ProtocolExtensionID;
373 } f1ap_ctx_t;
374 
375 /* Global variables */
376 static dissector_handle_t f1ap_handle;
377 static dissector_handle_t nr_rrc_ul_ccch_handle;
378 static dissector_handle_t nr_rrc_dl_ccch_handle;
379 static dissector_handle_t nr_rrc_ul_dcch_handle;
380 static dissector_handle_t nr_pdcp_handle;
381 static dissector_handle_t lte_rrc_conn_reconf_handle;
382 
383 /* Dissector tables */
384 static dissector_table_t f1ap_ies_dissector_table;
385 static dissector_table_t f1ap_extension_dissector_table;
386 static dissector_table_t f1ap_proc_imsg_dissector_table;
387 static dissector_table_t f1ap_proc_sout_dissector_table;
388 static dissector_table_t f1ap_proc_uout_dissector_table;
389 
390 static int dissect_ProtocolIEFieldValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *);
391 static int dissect_ProtocolExtensionFieldExtensionValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *);
392 static int dissect_InitiatingMessageValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *);
393 static int dissect_SuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *);
394 static int dissect_UnsuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *);
395 
396 static const true_false_string f1ap_tfs_interfacesToTrace = {
397   "Should be traced",
398   "Should not be traced"
399 };
400 
401 
402 static proto_tree *top_tree = NULL;
403 
404 static void set_message_label(asn1_ctx_t *actx, int type)
405 {
406   const char *label = val_to_str_const(type, mtype_names, "Unknown");
407   col_append_sep_str(actx->pinfo->cinfo, COL_INFO, NULL, label);
408   /* N.B. would like to be able to use actx->subTree.top_tree, but not easy to set.. */
409   proto_item_append_text(top_tree, " (%s)", label);
410 }
411 
412 
413 
414 static void
415 f1ap_MaxPacketLossRate_fmt(gchar *s, guint32 v)
416 {
417   g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f%% (%u)", (float)v/10, v);
418 }
419 
420 static void
421 f1ap_PacketDelayBudget_fmt(gchar *s, guint32 v)
422 {
423   g_snprintf(s, ITEM_LABEL_LENGTH, "%.1fms (%u)", (float)v/2, v);
424 }
425 
426 static void
427 f1ap_ExtendedPacketDelayBudget_fmt(gchar *s, guint32 v)
428 {
429   g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fms (%u)", (float)v/100, v);
430 }
431 
432 static f1ap_private_data_t*
433 f1ap_get_private_data(packet_info *pinfo)
434 {
435   f1ap_private_data_t *f1ap_data = (f1ap_private_data_t*)p_get_proto_data(wmem_file_scope(), pinfo, proto_f1ap, 0);
436   if (!f1ap_data) {
437     f1ap_data = wmem_new0(wmem_file_scope(), f1ap_private_data_t);
438     f1ap_data->srb_id = -1;
439     p_add_proto_data(wmem_file_scope(), pinfo, proto_f1ap, 0, f1ap_data);
440   }
441   return f1ap_data;
442 }
443 
444 static void
445 add_nr_pdcp_meta_data(packet_info *pinfo, guint8 direction, guint8 srb_id)
446 {
447   pdcp_nr_info *p_pdcp_nr_info;
448 
449   /* Only need to set info once per session. */
450   if (get_pdcp_nr_proto_data(pinfo)) {
451       return;
452   }
453 
454   p_pdcp_nr_info = wmem_new0(wmem_file_scope(), pdcp_nr_info);
455   p_pdcp_nr_info->direction = direction;
456   p_pdcp_nr_info->bearerType = Bearer_DCCH;
457   p_pdcp_nr_info->bearerId = srb_id;
458   p_pdcp_nr_info->plane = NR_SIGNALING_PLANE;
459   p_pdcp_nr_info->seqnum_length = PDCP_NR_SN_LENGTH_12_BITS;
460   p_pdcp_nr_info->maci_present = TRUE;
461   set_pdcp_nr_proto_data(pinfo, p_pdcp_nr_info);
462 }
463 
464 #include "packet-f1ap-fn.c"
465 
466 static int dissect_ProtocolIEFieldValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
467 {
468   f1ap_ctx_t f1ap_ctx;
469   f1ap_private_data_t *f1ap_data = f1ap_get_private_data(pinfo);
470 
471   f1ap_ctx.message_type        = f1ap_data->message_type;
472   f1ap_ctx.ProcedureCode       = f1ap_data->procedure_code;
473   f1ap_ctx.ProtocolIE_ID       = f1ap_data->protocol_ie_id;
474   f1ap_ctx.ProtocolExtensionID = f1ap_data->protocol_extension_id;
475 
476   return (dissector_try_uint_new(f1ap_ies_dissector_table, f1ap_data->protocol_ie_id, tvb, pinfo, tree, FALSE, &f1ap_ctx)) ? tvb_captured_length(tvb) : 0;
477 }
478 
479 static int dissect_ProtocolExtensionFieldExtensionValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
480 {
481   f1ap_ctx_t f1ap_ctx;
482   f1ap_private_data_t *f1ap_data = f1ap_get_private_data(pinfo);
483 
484   f1ap_ctx.message_type        = f1ap_data->message_type;
485   f1ap_ctx.ProcedureCode       = f1ap_data->procedure_code;
486   f1ap_ctx.ProtocolIE_ID       = f1ap_data->protocol_ie_id;
487   f1ap_ctx.ProtocolExtensionID = f1ap_data->protocol_extension_id;
488 
489   return (dissector_try_uint_new(f1ap_extension_dissector_table, f1ap_data->protocol_extension_id, tvb, pinfo, tree, FALSE, &f1ap_ctx)) ? tvb_captured_length(tvb) : 0;
490 }
491 
492 static int dissect_InitiatingMessageValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
493 {
494   f1ap_private_data_t *f1ap_data = f1ap_get_private_data(pinfo);
495 
496   return (dissector_try_uint_new(f1ap_proc_imsg_dissector_table, f1ap_data->procedure_code, tvb, pinfo, tree, FALSE, data)) ? tvb_captured_length(tvb) : 0;
497 }
498 
499 static int dissect_SuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
500 {
501   f1ap_private_data_t *f1ap_data = f1ap_get_private_data(pinfo);
502 
503   return (dissector_try_uint_new(f1ap_proc_sout_dissector_table, f1ap_data->procedure_code, tvb, pinfo, tree, FALSE, data)) ? tvb_captured_length(tvb) : 0;
504 }
505 
506 static int dissect_UnsuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
507 {
508   f1ap_private_data_t *f1ap_data = f1ap_get_private_data(pinfo);
509 
510   return (dissector_try_uint_new(f1ap_proc_uout_dissector_table, f1ap_data->procedure_code, tvb, pinfo, tree, FALSE, data)) ? tvb_captured_length(tvb) : 0;
511 }
512 
513 
514 static void
515 f1ap_stats_tree_init(stats_tree *st)
516 {
517     st_node_packets = stats_tree_create_node(st, st_str_packets, 0, STAT_DT_INT, TRUE);
518     st_node_packet_types = stats_tree_create_pivot(st, st_str_packet_types, st_node_packets);
519 }
520 
521 static tap_packet_status
522 f1ap_stats_tree_packet(stats_tree* st, packet_info* pinfo _U_,
523                        epan_dissect_t* edt _U_ , const void* p)
524 {
525     const struct f1ap_tap_t *pi = (const struct f1ap_tap_t *) p;
526 
527     tick_stat_node(st, st_str_packets, 0, FALSE);
528     stats_tree_tick_pivot(st, st_node_packet_types,
529                           val_to_str(pi->f1ap_mtype, mtype_names,
530                                      "Unknown packet type (%d)"));
531     return TAP_PACKET_REDRAW;
532 }
533 
534 static void set_stats_message_type(packet_info *pinfo, int type)
535 {
536     f1ap_private_data_t* priv_data = f1ap_get_private_data(pinfo);
537     priv_data->stats_tap->f1ap_mtype = type;
538 }
539 
540 static int
541 dissect_f1ap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
542 {
543   proto_item *f1ap_item = NULL;
544   proto_tree *f1ap_tree = NULL;
545 
546   struct f1ap_tap_t *f1ap_info;
547 
548   /* make entry in the Protocol column on summary display */
549   col_set_str(pinfo->cinfo, COL_PROTOCOL, "F1AP");
550   col_clear(pinfo->cinfo, COL_INFO);
551 
552   f1ap_info = wmem_new(pinfo->pool, struct f1ap_tap_t);
553   f1ap_info->f1ap_mtype   = 0;  /* unknown/invalid */
554 
555   /* create the f1ap protocol tree */
556   f1ap_item = proto_tree_add_item(tree, proto_f1ap, tvb, 0, -1, ENC_NA);
557   f1ap_tree = proto_item_add_subtree(f1ap_item, ett_f1ap);
558 
559   /* Store top-level tree */
560   top_tree = f1ap_tree;
561 
562   /* Add stats tap to private struct */
563   f1ap_private_data_t *priv_data = f1ap_get_private_data(pinfo);
564   priv_data->stats_tap = f1ap_info;
565 
566 
567   dissect_F1AP_PDU_PDU(tvb, pinfo, f1ap_tree, NULL);
568 
569   tap_queue_packet(f1ap_tap, pinfo, f1ap_info);
570   return tvb_captured_length(tvb);
571 }
572 
573 void proto_register_f1ap(void) {
574 
575   /* List of fields */
576 
577   static hf_register_info hf[] = {
578     { &hf_f1ap_transportLayerAddressIPv4,
579       { "IPv4 transportLayerAddress", "f1ap.transportLayerAddressIPv4",
580         FT_IPv4, BASE_NONE, NULL, 0,
581         NULL, HFILL }},
582     { &hf_f1ap_transportLayerAddressIPv6,
583       { "IPv6 transportLayerAddress", "f1ap.transportLayerAddressIPv6",
584         FT_IPv6, BASE_NONE, NULL, 0,
585         NULL, HFILL }},
586     { &hf_f1ap_IABTNLAddressIPv4,
587       { "IPv4 IABTNLAddress", "f1ap.IABTNLAddressIPv4",
588         FT_IPv4, BASE_NONE, NULL, 0,
589         NULL, HFILL }},
590     { &hf_f1ap_IABTNLAddressIPv6,
591       { "IPv6 IABTNLAddress", "f1ap.IABTNLAddressIPv6",
592         FT_IPv6, BASE_NONE, NULL, 0,
593         NULL, HFILL }},
594     { &hf_f1ap_IABTNLAddressIPv6Prefix,
595       { "IPv6 Prefix IABTNLAddress", "f1ap.IABTNLAddressIPv6Prefix",
596         FT_BYTES, BASE_NONE, NULL, 0,
597         NULL, HFILL }},
598     { &hf_f1ap_interfacesToTrace_NG_C,
599       { "NG-C", "f1ap.interfacesToTrace.NG_C",
600         FT_BOOLEAN, 8, TFS(&f1ap_tfs_interfacesToTrace), 0x80,
601         NULL, HFILL }},
602     { &hf_f1ap_interfacesToTrace_Xn_C,
603       { "Xn-C", "f1ap.interfacesToTrace.Xn_C",
604         FT_BOOLEAN, 8, TFS(&f1ap_tfs_interfacesToTrace), 0x40,
605         NULL, HFILL }},
606     { &hf_f1ap_interfacesToTrace_Uu,
607       { "Uu", "f1ap.interfacesToTrace.Uu",
608         FT_BOOLEAN, 8, TFS(&f1ap_tfs_interfacesToTrace), 0x20,
609         NULL, HFILL }},
610     { &hf_f1ap_interfacesToTrace_F1_C,
611       { "F1-C", "f1ap.interfacesToTrace.F1_C",
612         FT_BOOLEAN, 8, TFS(&f1ap_tfs_interfacesToTrace), 0x10,
613         NULL, HFILL }},
614     { &hf_f1ap_interfacesToTrace_E1,
615       { "E1", "f1ap.interfacesToTrace.E1",
616         FT_BOOLEAN, 8, TFS(&f1ap_tfs_interfacesToTrace), 0x08,
617         NULL, HFILL }},
618     { &hf_f1ap_interfacesToTrace_Reserved,
619       { "Reserved", "f1ap.interfacesToTrace.Reserved",
620         FT_UINT8, BASE_HEX, NULL, 0x07,
621         NULL, HFILL }},
622     { &hf_f1ap_MeasurementsToActivate_Reserved1,
623       { "Reserved", "f1ap.MeasurementsToActivate.Reserved",
624         FT_UINT8, BASE_HEX, NULL, 0x80,
625         NULL, HFILL }},
626     { &hf_f1ap_MeasurementsToActivate_M2,
627       { "M2", "f1ap.MeasurementsToActivate.M2",
628         FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x40,
629         NULL, HFILL }},
630     { &hf_f1ap_MeasurementsToActivate_Reserved2,
631       { "Reserved", "f1ap.MeasurementsToActivate.Reserved",
632         FT_UINT8, BASE_HEX, NULL, 0x30,
633         NULL, HFILL }},
634     { &hf_f1ap_MeasurementsToActivate_M5,
635       { "M5", "f1ap.MeasurementsToActivate.M5",
636         FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x08,
637         NULL, HFILL }},
638     { &hf_f1ap_MeasurementsToActivate_Reserved3,
639       { "Reserved", "f1ap.MeasurementsToActivate.Reserved",
640         FT_UINT8, BASE_HEX, NULL, 0x04,
641         NULL, HFILL }},
642     { &hf_f1ap_MeasurementsToActivate_M6,
643       { "M6", "f1ap.MeasurementsToActivate.M6",
644         FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x02,
645         NULL, HFILL }},
646     { &hf_f1ap_MeasurementsToActivate_M7,
647       { "M7", "f1ap.MeasurementsToActivate.M7",
648         FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x01,
649         NULL, HFILL }},
650     { &hf_f1ap_ReportCharacteristics_PRBPeriodic,
651       { "PRBPeriodic", "f1ap.ReportCharacteristics.PRBPeriodic",
652         FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x80000000,
653         NULL, HFILL }},
654     { &hf_f1ap_ReportCharacteristics_TNLCapacityIndPeriodic,
655       { "TNLCapacityIndPeriodic", "f1ap.ReportCharacteristics.TNLCapacityIndPeriodic",
656         FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x40000000,
657         NULL, HFILL }},
658     { &hf_f1ap_ReportCharacteristics_CompositeAvailableCapacityPeriodic,
659       { "CompositeAvailableCapacityPeriodic", "f1ap.ReportCharacteristics.CompositeAvailableCapacityPeriodic",
660         FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x20000000,
661         NULL, HFILL }},
662     { &hf_f1ap_ReportCharacteristics_HWLoadIndPeriodic,
663       { "HWLoadIndPeriodic", "f1ap.ReportCharacteristics.HWLoadIndPeriodic",
664         FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x10000000,
665         NULL, HFILL }},
666     { &hf_f1ap_ReportCharacteristics_NumberOfActiveUEs,
667       { "NumberOfActiveUEs", "f1ap.ReportCharacteristics.NumberOfActiveUEs",
668         FT_BOOLEAN, 32, TFS(&tfs_requested_not_requested), 0x08000000,
669         NULL, HFILL }},
670     { &hf_f1ap_ReportCharacteristics_Reserved,
671       { "Reserved", "f1ap.ReportCharacteristics.Reserved",
672         FT_UINT32, BASE_HEX, NULL, 0x07ffffff,
673         NULL, HFILL }},
674 #include "packet-f1ap-hfarr.c"
675   };
676 
677   /* List of subtrees */
678   static gint *ett[] = {
679     &ett_f1ap,
680     &ett_f1ap_ResourceCoordinationTransferContainer,
681     &ett_f1ap_PLMN_Identity,
682     &ett_f1ap_MIB_message,
683     &ett_f1ap_SIB1_message,
684     &ett_f1ap_CG_ConfigInfo,
685     &ett_f1ap_CellGroupConfig,
686     &ett_f1ap_TransportLayerAddress,
687     &ett_f1ap_UE_CapabilityRAT_ContainerList,
688     &ett_f1ap_measurementTimingConfiguration,
689     &ett_f1ap_DUtoCURRCContainer,
690     &ett_f1ap_requestedP_MaxFR1,
691     &ett_f1ap_HandoverPreparationInformation,
692     &ett_f1ap_MeasConfig,
693     &ett_f1ap_MeasGapConfig,
694     &ett_f1ap_MeasGapSharingConfig,
695     &ett_f1ap_EUTRA_NR_CellResourceCoordinationReq_Container,
696     &ett_f1ap_EUTRA_NR_CellResourceCoordinationReqAck_Container,
697     &ett_f1ap_ProtectedEUTRAResourceIndication,
698     &ett_f1ap_RRCContainer,
699     &ett_f1ap_RRCContainer_RRCSetupComplete,
700     &ett_f1ap_sIBmessage,
701     &ett_f1ap_UplinkTxDirectCurrentListInformation,
702     &ett_f1ap_DRX_Config,
703     &ett_f1ap_Ph_InfoSCG,
704     &ett_f1ap_RequestedBandCombinationIndex,
705     &ett_f1ap_RequestedFeatureSetEntryIndex,
706     &ett_f1ap_RequestedP_MaxFR2,
707     &ett_f1ap_UEAssistanceInformation,
708     &ett_f1ap_CG_Config,
709     &ett_f1ap_Ph_InfoMCG,
710     &ett_f1ap_BurstArrivalTime,
711     &ett_f1ap_cSI_RS_Configuration,
712     &ett_f1ap_sR_Configuration,
713     &ett_f1ap_pDCCH_ConfigSIB1,
714     &ett_f1ap_sCS_Common,
715     &ett_f1ap_IABTNLAddressIPv4Address,
716     &ett_f1ap_IABTNLAddressIPv6Address,
717     &ett_f1ap_IABTNLAddressIPv6Prefix,
718     &ett_f1ap_InterfacesToTrace,
719     &ett_f1ap_MeasurementsToActivate,
720     &ett_f1ap_NRUERLFReportContainer,
721     &ett_f1ap_RACH_Config_Common,
722     &ett_f1ap_RACH_Config_Common_IAB,
723     &ett_f1ap_RACHReportContainer,
724     &ett_f1ap_ReferenceTime,
725     &ett_f1ap_ReportCharacteristics,
726     &ett_f1ap_SIB10_message,
727     &ett_f1ap_SIB12_message,
728     &ett_f1ap_SIB13_message,
729     &ett_f1ap_SIB14_message,
730     &ett_f1ap_SL_PHY_MAC_RLC_Config,
731     &ett_f1ap_SL_ConfigDedicatedEUTRA_Info,
732     &ett_f1ap_TDD_UL_DLConfigCommonNR,
733     &ett_f1ap_UEAssistanceInformationEUTRA,
734     &ett_f1ap_PosAssistance_Information,
735 #include "packet-f1ap-ettarr.c"
736   };
737 
738   /* Register protocol */
739   proto_f1ap = proto_register_protocol(PNAME, PSNAME, PFNAME);
740   /* Register fields and subtrees */
741   proto_register_field_array(proto_f1ap, hf, array_length(hf));
742   proto_register_subtree_array(ett, array_length(ett));
743 
744   /* Register dissector */
745   f1ap_handle = register_dissector("f1ap", dissect_f1ap, proto_f1ap);
746 
747   /* Register dissector tables */
748   f1ap_ies_dissector_table = register_dissector_table("f1ap.ies", "F1AP-PROTOCOL-IES", proto_f1ap, FT_UINT32, BASE_DEC);
749   f1ap_extension_dissector_table = register_dissector_table("f1ap.extension", "F1AP-PROTOCOL-EXTENSION", proto_f1ap, FT_UINT32, BASE_DEC);
750   f1ap_proc_imsg_dissector_table = register_dissector_table("f1ap.proc.imsg", "F1AP-ELEMENTARY-PROCEDURE InitiatingMessage", proto_f1ap, FT_UINT32, BASE_DEC);
751   f1ap_proc_sout_dissector_table = register_dissector_table("f1ap.proc.sout", "F1AP-ELEMENTARY-PROCEDURE SuccessfulOutcome", proto_f1ap, FT_UINT32, BASE_DEC);
752   f1ap_proc_uout_dissector_table = register_dissector_table("f1ap.proc.uout", "F1AP-ELEMENTARY-PROCEDURE UnsuccessfulOutcome", proto_f1ap, FT_UINT32, BASE_DEC);
753 
754   f1ap_tap = register_tap("f1ap");
755 }
756 
757 void
758 proto_reg_handoff_f1ap(void)
759 {
760   dissector_add_uint_with_preference("sctp.port", SCTP_PORT_F1AP, f1ap_handle);
761   dissector_add_uint("sctp.ppi", F1AP_PROTOCOL_ID, f1ap_handle);
762   nr_rrc_ul_ccch_handle = find_dissector_add_dependency("nr-rrc.ul.ccch", proto_f1ap);
763   nr_rrc_dl_ccch_handle = find_dissector_add_dependency("nr-rrc.dl.ccch", proto_f1ap);
764   nr_rrc_ul_dcch_handle = find_dissector_add_dependency("nr-rrc.ul.dcch", proto_f1ap);
765   nr_pdcp_handle = find_dissector_add_dependency("pdcp-nr", proto_f1ap);
766   lte_rrc_conn_reconf_handle = find_dissector_add_dependency("lte-rrc.rrc_conn_reconf", proto_f1ap);
767 
768   stats_tree_register("f1ap", "f1ap", "F1AP", 0,
769                        f1ap_stats_tree_packet, f1ap_stats_tree_init, NULL);
770 
771 #include "packet-f1ap-dis-tab.c"
772 }
773 
774 /*
775  * Editor modelines
776  *
777  * Local Variables:
778  * c-basic-offset: 2
779  * tab-width: 8
780  * indent-tabs-mode: nil
781  * End:
782  *
783  * ex: set shiftwidth=2 tabstop=8 expandtab:
784  * :indentSize=2:tabSize=8:noTabs=true:
785  */
786