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