2 * Routines for dissecting Evolved Universal Terrestrial Radio Access Network (EUTRAN);
3 * X2 Application Protocol (X2AP);
4 * 3GPP TS 36.423 packet dissection
5 * Copyright 2007-2014, Anders Broman <anders.broman@ericsson.com>
6 * Copyright 2016-2024, Pascal Quantin <pascal@wireshark.org>
8 * Wireshark - Network traffic analyzer
9 * By Gerald Combs <gerald@wireshark.org>
10 * Copyright 1998 Gerald Combs
12 * SPDX-License-Identifier: GPL-2.0-or-later
15 * 3GPP TS 36.423 V18.2.0 (2024-06)
20 #include <epan/packet.h>
22 #include <epan/asn1.h>
23 #include <epan/prefs.h>
24 #include <epan/sctpppids.h>
25 #include <epan/proto_data.h>
27 #include <epan/unit_strings.h>
28 #include <wsutil/array.h>
30 #include "packet-x2ap.h"
31 #include "packet-per.h"
32 #include "packet-e212.h"
33 #include "packet-lte-rrc.h"
34 #include "packet-nr-rrc.h"
35 #include "packet-ngap.h"
36 #include "packet-ranap.h"
37 #include "packet-ntp.h"
38 #include "packet-s1ap.h"
39 #include "packet-f1ap.h"
40 #include "packet-xnap.h"
43 /* disable: "warning C4146: unary minus operator applied to unsigned type, result still unsigned" */
44 #pragma warning(disable:4146)
47 #define PNAME "EUTRAN X2 Application Protocol (X2AP)"
51 void proto_register_x2ap(void);
53 /* Dissector will use SCTP PPID 27 or SCTP port. IANA assigned port = 36422 */
54 #define SCTP_PORT_X2AP 36422
56 #include "packet-x2ap-val.h"
58 /* Initialize the protocol and registered fields */
59 static int proto_x2ap
;
60 static int hf_x2ap_transportLayerAddressIPv4
;
61 static int hf_x2ap_transportLayerAddressIPv6
;
62 static int hf_x2ap_ReportCharacteristics_PRBPeriodic
;
63 static int hf_x2ap_ReportCharacteristics_TNLLoadIndPeriodic
;
64 static int hf_x2ap_ReportCharacteristics_HWLoadIndPeriodic
;
65 static int hf_x2ap_ReportCharacteristics_CompositeAvailableCapacityPeriodic
;
66 static int hf_x2ap_ReportCharacteristics_ABSStatusPeriodic
;
67 static int hf_x2ap_ReportCharacteristics_RSRPMeasurementReportPeriodic
;
68 static int hf_x2ap_ReportCharacteristics_CSIReportPeriodic
;
69 static int hf_x2ap_ReportCharacteristics_Reserved
;
70 static int hf_x2ap_measurementFailedReportCharacteristics_PRBPeriodic
;
71 static int hf_x2ap_measurementFailedReportCharacteristics_TNLLoadIndPeriodic
;
72 static int hf_x2ap_measurementFailedReportCharacteristics_HWLoadIndPeriodic
;
73 static int hf_x2ap_measurementFailedReportCharacteristics_CompositeAvailableCapacityPeriodic
;
74 static int hf_x2ap_measurementFailedReportCharacteristics_ABSStatusPeriodic
;
75 static int hf_x2ap_measurementFailedReportCharacteristics_RSRPMeasurementReportPeriodic
;
76 static int hf_x2ap_measurementFailedReportCharacteristics_CSIReportPeriodic
;
77 static int hf_x2ap_measurementFailedReportCharacteristics_Reserved
;
78 static int hf_x2ap_eUTRANTraceID_TraceID
;
79 static int hf_x2ap_eUTRANTraceID_TraceRecordingSessionReference
;
80 static int hf_x2ap_interfacesToTrace_S1_MME
;
81 static int hf_x2ap_interfacesToTrace_X2
;
82 static int hf_x2ap_interfacesToTrace_Uu
;
83 static int hf_x2ap_interfacesToTrace_F1_C
;
84 static int hf_x2ap_interfacesToTrace_E1
;
85 static int hf_x2ap_interfacesToTrace_Reserved
;
86 static int hf_x2ap_traceCollectionEntityIPAddress_IPv4
;
87 static int hf_x2ap_traceCollectionEntityIPAddress_IPv6
;
88 static int hf_x2ap_encryptionAlgorithms_EEA1
;
89 static int hf_x2ap_encryptionAlgorithms_EEA2
;
90 static int hf_x2ap_encryptionAlgorithms_EEA3
;
91 static int hf_x2ap_encryptionAlgorithms_Reserved
;
92 static int hf_x2ap_integrityProtectionAlgorithms_EIA1
;
93 static int hf_x2ap_integrityProtectionAlgorithms_EIA2
;
94 static int hf_x2ap_integrityProtectionAlgorithms_EIA3
;
95 static int hf_x2ap_integrityProtectionAlgorithms_EIA7
;
96 static int hf_x2ap_integrityProtectionAlgorithms_Reserved
;
97 static int hf_x2ap_measurementsToActivate_M1
;
98 static int hf_x2ap_measurementsToActivate_M2
;
99 static int hf_x2ap_measurementsToActivate_M3
;
100 static int hf_x2ap_measurementsToActivate_M4
;
101 static int hf_x2ap_measurementsToActivate_M5
;
102 static int hf_x2ap_measurementsToActivate_LoggingM1FromEventTriggered
;
103 static int hf_x2ap_measurementsToActivate_M6
;
104 static int hf_x2ap_measurementsToActivate_M7
;
105 static int hf_x2ap_MDT_Location_Info_GNSS
;
106 static int hf_x2ap_MDT_Location_Info_E_CID
;
107 static int hf_x2ap_MDT_Location_Info_Reserved
;
108 static int hf_x2ap_MDT_transmissionModes_tm1
;
109 static int hf_x2ap_MDT_transmissionModes_tm2
;
110 static int hf_x2ap_MDT_transmissionModes_tm3
;
111 static int hf_x2ap_MDT_transmissionModes_tm4
;
112 static int hf_x2ap_MDT_transmissionModes_tm6
;
113 static int hf_x2ap_MDT_transmissionModes_tm8
;
114 static int hf_x2ap_MDT_transmissionModes_tm9
;
115 static int hf_x2ap_MDT_transmissionModes_tm10
;
116 static int hf_x2ap_NRencryptionAlgorithms_NEA1
;
117 static int hf_x2ap_NRencryptionAlgorithms_NEA2
;
118 static int hf_x2ap_NRencryptionAlgorithms_NEA3
;
119 static int hf_x2ap_NRencryptionAlgorithms_Reserved
;
120 static int hf_x2ap_NRintegrityProtectionAlgorithms_NIA1
;
121 static int hf_x2ap_NRintegrityProtectionAlgorithms_NIA2
;
122 static int hf_x2ap_NRintegrityProtectionAlgorithms_NIA3
;
123 static int hf_x2ap_NRintegrityProtectionAlgorithms_Reserved
;
124 static int hf_x2ap_ReportCharacteristics_ENDC_PRBPeriodic
;
125 static int hf_x2ap_ReportCharacteristics_ENDC_TNLCapacityIndPeriodic
;
126 static int hf_x2ap_ReportCharacteristics_ENDC_CompositeAvailableCapacityPeriodic
;
127 static int hf_x2ap_ReportCharacteristics_ENDC_NumberOfActiveUEs
;
128 static int hf_x2ap_ReportCharacteristics_ENDC_Reserved
;
129 static int hf_x2ap_Registration_Request_ENDC_PDU
;
130 static int hf_x2ap_ReportingPeriodicity_ENDC_PDU
;
131 static int hf_x2ap_ReportCharacteristics_ENDC_PDU
;
132 static int hf_x2ap_rAT_RestrictionInformation_LEO
;
133 static int hf_x2ap_rAT_RestrictionInformation_MEO
;
134 static int hf_x2ap_rAT_RestrictionInformation_GEO
;
135 static int hf_x2ap_rAT_RestrictionInformation_OTHERSAT
;
136 static int hf_x2ap_rAT_RestrictionInformation_NR_LEO
;
137 static int hf_x2ap_rAT_RestrictionInformation_NR_MEO
;
138 static int hf_x2ap_rAT_RestrictionInformation_NR_GEO
;
139 static int hf_x2ap_rAT_RestrictionInformation_NR_OTHERSAT
;
140 #include "packet-x2ap-hf.c"
142 /* Initialize the subtree pointers */
144 static int ett_x2ap_TransportLayerAddress
;
145 static int ett_x2ap_PLMN_Identity
;
146 static int ett_x2ap_TargeteNBtoSource_eNBTransparentContainer
;
147 static int ett_x2ap_RRC_Context
;
148 static int ett_x2ap_UE_HistoryInformationFromTheUE
;
149 static int ett_x2ap_ReportCharacteristics
;
150 static int ett_x2ap_measurementFailedReportCharacteristics
;
151 static int ett_x2ap_UE_RLF_Report_Container
;
152 static int ett_x2ap_UE_RLF_Report_Container_for_extended_bands
;
153 static int ett_x2ap_MeNBtoSeNBContainer
;
154 static int ett_x2ap_SeNBtoMeNBContainer
;
155 static int ett_x2ap_EUTRANTraceID
;
156 static int ett_x2ap_InterfacesToTrace
;
157 static int ett_x2ap_TraceCollectionEntityIPAddress
;
158 static int ett_x2ap_EncryptionAlgorithms
;
159 static int ett_x2ap_IntegrityProtectionAlgorithms
;
160 static int ett_x2ap_MeasurementsToActivate
;
161 static int ett_x2ap_MDT_Location_Info
;
162 static int ett_x2ap_transmissionModes
;
163 static int ett_x2ap_X2AP_Message
;
164 static int ett_x2ap_MeNBtoSgNBContainer
;
165 static int ett_x2ap_SgNBtoMeNBContainer
;
166 static int ett_x2ap_RRCContainer
;
167 static int ett_x2ap_NRencryptionAlgorithms
;
168 static int ett_x2ap_NRintegrityProtectionAlgorithms
;
169 static int ett_x2ap_measurementTimingConfiguration
;
170 static int ett_x2ap_LastVisitedNGRANCellInformation
;
171 static int ett_x2ap_LastVisitedUTRANCellInformation
;
172 static int ett_x2ap_EndcSONConfigurationTransfer
;
173 static int ett_x2ap_EPCHandoverRestrictionListContainer
;
174 static int ett_x2ap_NBIoT_RLF_Report_Container
;
175 static int ett_x2ap_anchorCarrier_NPRACHConfig
;
176 static int ett_x2ap_anchorCarrier_EDT_NPRACHConfig
;
177 static int ett_x2ap_anchorCarrier_Format2_NPRACHConfig
;
178 static int ett_x2ap_anchorCarrier_Format2_EDT_NPRACHConfig
;
179 static int ett_x2ap_non_anchorCarrier_NPRACHConfig
;
180 static int ett_x2ap_non_anchorCarrier_Format2_NPRACHConfig
;
181 static int ett_x2ap_anchorCarrier_NPRACHConfigTDD
;
182 static int ett_x2ap_non_anchorCarrier_NPRACHConfigTDD
;
183 static int ett_x2ap_Non_anchorCarrierFrequency
;
184 static int ett_x2ap_ReportCharacteristics_ENDC
;
185 static int ett_x2ap_TargetCellInNGRAN
;
186 static int ett_x2ap_TDDULDLConfigurationCommonNR
;
187 static int ett_x2ap_MDT_ConfigurationNR
;
188 static int ett_x2ap_NRCellPRACHConfig
;
189 static int ett_x2ap_IntendedTDD_DL_ULConfiguration_NR
;
190 static int ett_x2ap_UERadioCapability
;
191 static int ett_x2ap_LastVisitedPSCell_Item
;
192 static int ett_x2ap_NRRAReportContainer
;
193 static int ett_x2ap_rAT_RestrictionInformation
;
194 static int ett_x2ap_PSCellListContainer
;
195 #include "packet-x2ap-ett.c"
197 /* Forward declarations */
198 static int dissect_x2ap_Registration_Request_ENDC(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
);
199 static int dissect_x2ap_ReportCharacteristics_ENDC(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
);
200 static int dissect_x2ap_ReportingPeriodicity_ENDC(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
);
203 RRC_CONTAINER_TYPE_UNKNOWN
,
204 RRC_CONTAINER_TYPE_PDCP_C_PDU
,
205 RRC_CONTAINER_TYPE_NR_UE_MEAS_REPORT
,
206 RRC_CONTAINER_TYPE_FAST_MCG_RECOVERY_SgNB_TO_MeNB
,
207 RRC_CONTAINER_TYPE_FAST_MCG_RECOVERY_MeNB_TO_SgNB
208 } rrc_container_type_e
;
216 struct x2ap_private_data
{
217 uint32_t procedure_code
;
218 uint32_t protocol_ie_id
;
219 uint32_t message_type
;
220 rrc_container_type_e rrc_container_type
;
221 e212_number_type_t number_type
;
225 X2AP_RRC_CONTEXT_LTE
,
226 X2AP_RRC_CONTEXT_NBIOT
229 static const enum_val_t x2ap_rrc_context_vals
[] = {
230 {"lte", "LTE", X2AP_RRC_CONTEXT_LTE
},
231 {"nb-iot","NB-IoT", X2AP_RRC_CONTEXT_NBIOT
},
235 /* Global variables */
236 static int g_x2ap_dissect_rrc_context_as
= X2AP_RRC_CONTEXT_LTE
;
238 /* Dissector tables */
239 static dissector_table_t x2ap_ies_dissector_table
;
240 static dissector_table_t x2ap_extension_dissector_table
;
241 static dissector_table_t x2ap_proc_imsg_dissector_table
;
242 static dissector_table_t x2ap_proc_sout_dissector_table
;
243 static dissector_table_t x2ap_proc_uout_dissector_table
;
245 static int dissect_ProtocolIEFieldValue(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *);
246 static int dissect_ProtocolExtensionFieldExtensionValue(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *);
247 static int dissect_InitiatingMessageValue(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *);
248 static int dissect_SuccessfulOutcomeValue(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *);
249 static int dissect_UnsuccessfulOutcomeValue(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *);
250 static int dissect_X2AP_PDU_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
);
251 void proto_reg_handoff_x2ap(void);
253 static dissector_handle_t x2ap_handle
;
255 static const true_false_string x2ap_tfs_failed_succeeded
= {
261 x2ap_Time_UE_StayedInCell_EnhancedGranularity_fmt(char *s
, uint32_t v
)
263 snprintf(s
, ITEM_LABEL_LENGTH
, "%.1fs", ((float)v
)/10);
267 x2ap_handoverTriggerChange_fmt(char *s
, uint32_t v
)
269 snprintf(s
, ITEM_LABEL_LENGTH
, "%.1fdB (%d)", ((float)v
)/2, (int32_t)v
);
273 x2ap_Threshold_RSRP_fmt(char *s
, uint32_t v
)
275 snprintf(s
, ITEM_LABEL_LENGTH
, "%ddBm (%u)", (int32_t)v
-140, v
);
279 x2ap_Threshold_RSRQ_fmt(char *s
, uint32_t v
)
281 snprintf(s
, ITEM_LABEL_LENGTH
, "%.1fdB (%u)", ((float)v
/2)-20, v
);
285 x2ap_Packet_LossRate_fmt(char *s
, uint32_t v
)
287 snprintf(s
, ITEM_LABEL_LENGTH
, "%.1f %% (%u)", (float)v
/10, v
);
291 x2ap_cho_handover_window_duration_fmt(char *s
, uint32_t v
)
293 snprintf(s
, ITEM_LABEL_LENGTH
, "%dms (%u)", v
*100, v
);
296 static struct x2ap_private_data
*
297 x2ap_get_private_data(packet_info
*pinfo
)
299 struct x2ap_private_data
*x2ap_data
= (struct x2ap_private_data
*)p_get_proto_data(pinfo
->pool
, pinfo
, proto_x2ap
, 0);
301 x2ap_data
= wmem_new0(pinfo
->pool
, struct x2ap_private_data
);
302 p_add_proto_data(pinfo
->pool
, pinfo
, proto_x2ap
, 0, x2ap_data
);
307 #include "packet-x2ap-fn.c"
309 static int dissect_ProtocolIEFieldValue(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *data _U_
)
311 struct x2ap_private_data
*x2ap_data
= x2ap_get_private_data(pinfo
);
313 return (dissector_try_uint_with_data(x2ap_ies_dissector_table
, x2ap_data
->protocol_ie_id
, tvb
, pinfo
, tree
, false, NULL
)) ? tvb_captured_length(tvb
) : 0;
316 static int dissect_ProtocolExtensionFieldExtensionValue(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *data _U_
)
318 struct x2ap_private_data
*x2ap_data
= x2ap_get_private_data(pinfo
);
320 return (dissector_try_uint_with_data(x2ap_extension_dissector_table
, x2ap_data
->protocol_ie_id
, tvb
, pinfo
, tree
, false, NULL
)) ? tvb_captured_length(tvb
) : 0;
323 static int dissect_InitiatingMessageValue(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *data _U_
)
325 struct x2ap_private_data
*x2ap_data
= x2ap_get_private_data(pinfo
);
327 x2ap_data
->message_type
= INITIATING_MESSAGE
;
328 return (dissector_try_uint_with_data(x2ap_proc_imsg_dissector_table
, x2ap_data
->procedure_code
, tvb
, pinfo
, tree
, false, NULL
)) ? tvb_captured_length(tvb
) : 0;
331 static int dissect_SuccessfulOutcomeValue(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *data _U_
)
333 struct x2ap_private_data
*x2ap_data
= x2ap_get_private_data(pinfo
);
335 x2ap_data
->message_type
= SUCCESSFUL_OUTCOME
;
336 return (dissector_try_uint_with_data(x2ap_proc_sout_dissector_table
, x2ap_data
->procedure_code
, tvb
, pinfo
, tree
, false, NULL
)) ? tvb_captured_length(tvb
) : 0;
339 static int dissect_UnsuccessfulOutcomeValue(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *data _U_
)
341 struct x2ap_private_data
*x2ap_data
= x2ap_get_private_data(pinfo
);
343 x2ap_data
->message_type
= UNSUCCESSFUL_OUTCOME
;
344 return (dissector_try_uint_with_data(x2ap_proc_uout_dissector_table
, x2ap_data
->procedure_code
, tvb
, pinfo
, tree
, false, NULL
)) ? tvb_captured_length(tvb
) : 0;
348 dissect_x2ap(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *data
)
350 proto_item
*x2ap_item
;
351 proto_tree
*x2ap_tree
;
353 /* make entry in the Protocol column on summary display */
354 col_set_str(pinfo
->cinfo
, COL_PROTOCOL
, "X2AP");
355 col_clear_fence(pinfo
->cinfo
, COL_INFO
);
356 col_clear(pinfo
->cinfo
, COL_INFO
);
358 /* create the x2ap protocol tree */
359 x2ap_item
= proto_tree_add_item(tree
, proto_x2ap
, tvb
, 0, -1, ENC_NA
);
360 x2ap_tree
= proto_item_add_subtree(x2ap_item
, ett_x2ap
);
362 return dissect_X2AP_PDU_PDU(tvb
, pinfo
, x2ap_tree
, data
);
365 /*--- proto_register_x2ap -------------------------------------------*/
366 void proto_register_x2ap(void) {
370 static hf_register_info hf
[] = {
371 { &hf_x2ap_transportLayerAddressIPv4
,
372 { "transportLayerAddress(IPv4)", "x2ap.transportLayerAddressIPv4",
373 FT_IPv4
, BASE_NONE
, NULL
, 0,
375 { &hf_x2ap_transportLayerAddressIPv6
,
376 { "transportLayerAddress(IPv6)", "x2ap.transportLayerAddressIPv6",
377 FT_IPv6
, BASE_NONE
, NULL
, 0,
379 { &hf_x2ap_ReportCharacteristics_PRBPeriodic
,
380 { "PRBPeriodic", "x2ap.ReportCharacteristics.PRBPeriodic",
381 FT_BOOLEAN
, 32, TFS(&tfs_requested_not_requested
), 0x80000000,
383 { &hf_x2ap_ReportCharacteristics_TNLLoadIndPeriodic
,
384 { "TNLLoadIndPeriodic", "x2ap.ReportCharacteristics.TNLLoadIndPeriodic",
385 FT_BOOLEAN
, 32, TFS(&tfs_requested_not_requested
), 0x40000000,
387 { &hf_x2ap_ReportCharacteristics_HWLoadIndPeriodic
,
388 { "HWLoadIndPeriodic", "x2ap.ReportCharacteristics.HWLoadIndPeriodic",
389 FT_BOOLEAN
, 32, TFS(&tfs_requested_not_requested
), 0x20000000,
391 { &hf_x2ap_ReportCharacteristics_CompositeAvailableCapacityPeriodic
,
392 { "CompositeAvailableCapacityPeriodic", "x2ap.ReportCharacteristics.CompositeAvailableCapacityPeriodic",
393 FT_BOOLEAN
, 32, TFS(&tfs_requested_not_requested
), 0x10000000,
395 { &hf_x2ap_ReportCharacteristics_ABSStatusPeriodic
,
396 { "ABSStatusPeriodic", "x2ap.ReportCharacteristics.ABSStatusPeriodic",
397 FT_BOOLEAN
, 32, TFS(&tfs_requested_not_requested
), 0x08000000,
399 { &hf_x2ap_ReportCharacteristics_RSRPMeasurementReportPeriodic
,
400 { "RSRPMeasurementReportPeriodic", "x2ap.ReportCharacteristics.RSRPMeasurementReportPeriodic",
401 FT_BOOLEAN
, 32, TFS(&tfs_requested_not_requested
), 0x04000000,
403 { &hf_x2ap_ReportCharacteristics_CSIReportPeriodic
,
404 { "CSIReportPeriodic", "x2ap.ReportCharacteristics.CSIReportPeriodic",
405 FT_BOOLEAN
, 32, TFS(&tfs_requested_not_requested
), 0x02000000,
407 { &hf_x2ap_ReportCharacteristics_Reserved
,
408 { "Reserved", "x2ap.ReportCharacteristics.Reserved",
409 FT_UINT32
, BASE_HEX
, NULL
, 0x01ffffff,
411 { &hf_x2ap_measurementFailedReportCharacteristics_PRBPeriodic
,
412 { "PRBPeriodic", "x2ap.measurementFailedReportCharacteristics.PRBPeriodic",
413 FT_BOOLEAN
, 32, TFS(&x2ap_tfs_failed_succeeded
), 0x80000000,
415 { &hf_x2ap_measurementFailedReportCharacteristics_TNLLoadIndPeriodic
,
416 { "TNLLoadIndPeriodic", "x2ap.measurementFailedReportCharacteristics.TNLLoadIndPeriodic",
417 FT_BOOLEAN
, 32, TFS(&x2ap_tfs_failed_succeeded
), 0x40000000,
419 { &hf_x2ap_measurementFailedReportCharacteristics_HWLoadIndPeriodic
,
420 { "HWLoadIndPeriodic", "x2ap.measurementFailedReportCharacteristics.HWLoadIndPeriodic",
421 FT_BOOLEAN
, 32, TFS(&x2ap_tfs_failed_succeeded
), 0x20000000,
423 { &hf_x2ap_measurementFailedReportCharacteristics_CompositeAvailableCapacityPeriodic
,
424 { "CompositeAvailableCapacityPeriodic", "x2ap.measurementFailedReportCharacteristics.CompositeAvailableCapacityPeriodic",
425 FT_BOOLEAN
, 32, TFS(&x2ap_tfs_failed_succeeded
), 0x10000000,
427 { &hf_x2ap_measurementFailedReportCharacteristics_ABSStatusPeriodic
,
428 { "ABSStatusPeriodic", "x2ap.measurementFailedReportCharacteristics.ABSStatusPeriodic",
429 FT_BOOLEAN
, 32, TFS(&x2ap_tfs_failed_succeeded
), 0x08000000,
431 { &hf_x2ap_measurementFailedReportCharacteristics_RSRPMeasurementReportPeriodic
,
432 { "RSRPMeasurementReportPeriodic", "x2ap.measurementFailedReportCharacteristics.RSRPMeasurementReportPeriodic",
433 FT_BOOLEAN
, 32, TFS(&x2ap_tfs_failed_succeeded
), 0x04000000,
435 { &hf_x2ap_measurementFailedReportCharacteristics_CSIReportPeriodic
,
436 { "CSIReportPeriodic", "x2ap.measurementFailedReportCharacteristics.CSIReportPeriodic",
437 FT_BOOLEAN
, 32, TFS(&x2ap_tfs_failed_succeeded
), 0x02000000,
439 { &hf_x2ap_measurementFailedReportCharacteristics_Reserved
,
440 { "Reserved", "x2ap.measurementFailedReportCharacteristics.Reserved",
441 FT_UINT32
, BASE_HEX
, NULL
, 0x01ffffff,
443 { &hf_x2ap_eUTRANTraceID_TraceID
,
444 { "TraceID", "x2ap.eUTRANTraceID.TraceID",
445 FT_UINT24
, BASE_HEX
, NULL
, 0,
447 { &hf_x2ap_eUTRANTraceID_TraceRecordingSessionReference
,
448 { "TraceRecordingSessionReference", "x2ap.eUTRANTraceID.TraceRecordingSessionReference",
449 FT_UINT16
, BASE_HEX
, NULL
, 0,
451 { &hf_x2ap_interfacesToTrace_S1_MME
,
452 { "S1-MME", "x2ap.interfacesToTrace.S1_MME",
453 FT_BOOLEAN
, 8, TFS(&tfs_should_be_traced_should_not_be_traced
), 0x80,
455 { &hf_x2ap_interfacesToTrace_X2
,
456 { "X2", "x2ap.interfacesToTrace.X2",
457 FT_BOOLEAN
, 8, TFS(&tfs_should_be_traced_should_not_be_traced
), 0x40,
459 { &hf_x2ap_interfacesToTrace_Uu
,
460 { "Uu", "x2ap.interfacesToTrace.Uu",
461 FT_BOOLEAN
, 8, TFS(&tfs_should_be_traced_should_not_be_traced
), 0x20,
463 { &hf_x2ap_interfacesToTrace_F1_C
,
464 { "F1-C", "x2ap.interfacesToTrace.F1_C",
465 FT_BOOLEAN
, 8, TFS(&tfs_should_be_traced_should_not_be_traced
), 0x10,
467 { &hf_x2ap_interfacesToTrace_E1
,
468 { "E1", "x2ap.interfacesToTrace.E1",
469 FT_BOOLEAN
, 8, TFS(&tfs_should_be_traced_should_not_be_traced
), 0x08,
471 { &hf_x2ap_interfacesToTrace_Reserved
,
472 { "Reserved", "x2ap.interfacesToTrace.Reserved",
473 FT_UINT8
, BASE_HEX
, NULL
, 0x07,
475 { &hf_x2ap_traceCollectionEntityIPAddress_IPv4
,
476 { "IPv4", "x2ap.traceCollectionEntityIPAddress.IPv4",
477 FT_IPv4
, BASE_NONE
, NULL
, 0,
479 { &hf_x2ap_traceCollectionEntityIPAddress_IPv6
,
480 { "IPv6", "x2ap.traceCollectionEntityIPAddress.IPv6",
481 FT_IPv6
, BASE_NONE
, NULL
, 0,
483 { &hf_x2ap_encryptionAlgorithms_EEA1
,
484 { "128-EEA1", "x2ap.encryptionAlgorithms.EEA1",
485 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x8000,
487 { &hf_x2ap_encryptionAlgorithms_EEA2
,
488 { "128-EEA2", "x2ap.encryptionAlgorithms.EEA2",
489 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x4000,
491 { &hf_x2ap_encryptionAlgorithms_EEA3
,
492 { "128-EEA3", "x2ap.encryptionAlgorithms.EEA3",
493 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x2000,
495 { &hf_x2ap_encryptionAlgorithms_Reserved
,
496 { "Reserved", "x2ap.encryptionAlgorithms.Reserved",
497 FT_UINT16
, BASE_HEX
, NULL
, 0x1fff,
499 { &hf_x2ap_integrityProtectionAlgorithms_EIA1
,
500 { "128-EIA1", "x2ap.integrityProtectionAlgorithms.EIA1",
501 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x8000,
503 { &hf_x2ap_integrityProtectionAlgorithms_EIA2
,
504 { "128-EIA2", "x2ap.integrityProtectionAlgorithms.EIA2",
505 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x4000,
507 { &hf_x2ap_integrityProtectionAlgorithms_EIA3
,
508 { "128-EIA3", "x2ap.integrityProtectionAlgorithms.EIA3",
509 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x2000,
511 { &hf_x2ap_integrityProtectionAlgorithms_EIA7
,
512 { "EIA7", "x2ap.integrityProtectionAlgorithms.EIA7",
513 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x0200,
515 { &hf_x2ap_integrityProtectionAlgorithms_Reserved
,
516 { "Reserved", "x2ap.integrityProtectionAlgorithms.Reserved",
517 FT_UINT16
, BASE_HEX
, NULL
, 0x1dff,
519 { &hf_x2ap_measurementsToActivate_M1
,
520 { "M1", "x2ap.measurementsToActivate.M1",
521 FT_BOOLEAN
, 8, TFS(&tfs_activate_do_not_activate
), 0x80,
523 { &hf_x2ap_measurementsToActivate_M2
,
524 { "M2", "x2ap.measurementsToActivate.M2",
525 FT_BOOLEAN
, 8, TFS(&tfs_activate_do_not_activate
), 0x40,
527 { &hf_x2ap_measurementsToActivate_M3
,
528 { "M3", "x2ap.measurementsToActivate.M3",
529 FT_BOOLEAN
, 8, TFS(&tfs_activate_do_not_activate
), 0x20,
531 { &hf_x2ap_measurementsToActivate_M4
,
532 { "M4", "x2ap.measurementsToActivate.M4",
533 FT_BOOLEAN
, 8, TFS(&tfs_activate_do_not_activate
), 0x10,
535 { &hf_x2ap_measurementsToActivate_M5
,
536 { "M5", "x2ap.measurementsToActivate.M5",
537 FT_BOOLEAN
, 8, TFS(&tfs_activate_do_not_activate
), 0x08,
539 { &hf_x2ap_measurementsToActivate_LoggingM1FromEventTriggered
,
540 { "LoggingM1FromEventTriggeredMeasurementReports", "x2ap.measurementsToActivate.LoggingM1FromEventTriggered",
541 FT_BOOLEAN
, 8, TFS(&tfs_activate_do_not_activate
), 0x04,
543 { &hf_x2ap_measurementsToActivate_M6
,
544 { "M6", "x2ap.measurementsToActivate.M6",
545 FT_BOOLEAN
, 8, TFS(&tfs_activate_do_not_activate
), 0x02,
547 { &hf_x2ap_measurementsToActivate_M7
,
548 { "M7", "x2ap.measurementsToActivate.M7",
549 FT_BOOLEAN
, 8, TFS(&tfs_activate_do_not_activate
), 0x01,
551 { &hf_x2ap_MDT_Location_Info_GNSS
,
552 { "GNSS", "x2ap.MDT_Location_Info.GNSS",
553 FT_BOOLEAN
, 8, TFS(&tfs_activate_do_not_activate
), 0x80,
555 { &hf_x2ap_MDT_Location_Info_E_CID
,
556 { "E-CID", "x2ap.MDT_Location_Info.E_CID",
557 FT_BOOLEAN
, 8, TFS(&tfs_activate_do_not_activate
), 0x40,
559 { &hf_x2ap_MDT_Location_Info_Reserved
,
560 { "Reserved", "x2ap.MDT_Location_Info.Reserved",
561 FT_UINT8
, BASE_HEX
, NULL
, 0x3f,
563 { &hf_x2ap_MDT_transmissionModes_tm1
,
564 { "TM1", "x2ap.MDT_Location_Info.transmissionModes.tm1",
565 FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
567 { &hf_x2ap_MDT_transmissionModes_tm2
,
568 { "TM2", "x2ap.MDT_Location_Info.transmissionModes.tm2",
569 FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x40,
571 { &hf_x2ap_MDT_transmissionModes_tm3
,
572 { "TM3", "x2ap.MDT_Location_Info.transmissionModes.tm3",
573 FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x20,
575 { &hf_x2ap_MDT_transmissionModes_tm4
,
576 { "TM4", "x2ap.MDT_Location_Info.transmissionModes.tm4",
577 FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x10,
579 { &hf_x2ap_MDT_transmissionModes_tm6
,
580 { "TM6", "x2ap.MDT_Location_Info.transmissionModes.tm6",
581 FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x08,
583 { &hf_x2ap_MDT_transmissionModes_tm8
,
584 { "TM8", "x2ap.MDT_Location_Info.transmissionModes.tm8",
585 FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x04,
587 { &hf_x2ap_MDT_transmissionModes_tm9
,
588 { "TM9", "x2ap.MDT_Location_Info.transmissionModes.tm9",
589 FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x02,
591 { &hf_x2ap_MDT_transmissionModes_tm10
,
592 { "TM10", "x2ap.MDT_Location_Info.transmissionModes.tm10",
593 FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x01,
595 { &hf_x2ap_NRencryptionAlgorithms_NEA1
,
596 { "128-NEA1", "x2ap.NRencryptionAlgorithms.NEA1",
597 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x8000,
599 { &hf_x2ap_NRencryptionAlgorithms_NEA2
,
600 { "128-NEA2", "x2ap.NRencryptionAlgorithms.NEA2",
601 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x4000,
603 { &hf_x2ap_NRencryptionAlgorithms_NEA3
,
604 { "128-NEA3", "x2ap.NRencryptionAlgorithms.NEA3",
605 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x2000,
607 { &hf_x2ap_NRencryptionAlgorithms_Reserved
,
608 { "Reserved", "x2ap.NRencryptionAlgorithms.Reserved",
609 FT_UINT16
, BASE_HEX
, NULL
, 0x1fff,
611 { &hf_x2ap_NRintegrityProtectionAlgorithms_NIA1
,
612 { "128-NIA1", "x2ap.NRintegrityProtectionAlgorithms.NIA1",
613 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x8000,
615 { &hf_x2ap_NRintegrityProtectionAlgorithms_NIA2
,
616 { "128-NIA2", "x2ap.NRintegrityProtectionAlgorithms.NIA2",
617 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x4000,
619 { &hf_x2ap_NRintegrityProtectionAlgorithms_NIA3
,
620 { "128-NIA3", "x2ap.NRintegrityProtectionAlgorithms.NIA3",
621 FT_BOOLEAN
, 16, TFS(&tfs_supported_not_supported
), 0x2000,
623 { &hf_x2ap_NRintegrityProtectionAlgorithms_Reserved
,
624 { "Reserved", "x2ap.NRintegrityProtectionAlgorithms.Reserved",
625 FT_UINT16
, BASE_HEX
, NULL
, 0x1fff,
627 { &hf_x2ap_ReportCharacteristics_ENDC_PRBPeriodic
,
628 { "PRBPeriodic", "x2ap.ReportCharacteristics_ENDC.PRBPeriodic",
629 FT_BOOLEAN
, 32, TFS(&tfs_requested_not_requested
), 0x80000000,
631 { &hf_x2ap_ReportCharacteristics_ENDC_TNLCapacityIndPeriodic
,
632 { "TNLCapacityIndPeriodic", "x2ap.ReportCharacteristics_ENDC.TNLCapacityIndPeriodic",
633 FT_BOOLEAN
, 32, TFS(&tfs_requested_not_requested
), 0x40000000,
635 { &hf_x2ap_ReportCharacteristics_ENDC_CompositeAvailableCapacityPeriodic
,
636 { "CompositeAvailableCapacityPeriodic", "x2ap.ReportCharacteristics_ENDC.CompositeAvailableCapacityPeriodic",
637 FT_BOOLEAN
, 32, TFS(&tfs_requested_not_requested
), 0x20000000,
639 { &hf_x2ap_ReportCharacteristics_ENDC_NumberOfActiveUEs
,
640 { "NumberOfActiveUEs", "x2ap.ReportCharacteristics_ENDC.NumberOfActiveUEs",
641 FT_BOOLEAN
, 32, TFS(&tfs_requested_not_requested
), 0x10000000,
643 { &hf_x2ap_ReportCharacteristics_ENDC_Reserved
,
644 { "Reserved", "x2ap.ReportCharacteristics_ENDC.Reserved",
645 FT_UINT32
, BASE_HEX
, NULL
, 0x0fffffff,
647 { &hf_x2ap_Registration_Request_ENDC_PDU
,
648 { "Registration-Request-ENDC", "x2ap.Registration_Request_ENDC",
649 FT_UINT32
, BASE_DEC
, VALS(x2ap_Registration_Request_ENDC_vals
), 0,
651 { &hf_x2ap_ReportingPeriodicity_ENDC_PDU
,
652 { "ReportingPeriodicity-ENDC", "x2ap.ReportingPeriodicity_ENDC",
653 FT_UINT32
, BASE_DEC
, VALS(x2ap_ReportingPeriodicity_ENDC_vals
), 0,
655 { &hf_x2ap_ReportCharacteristics_ENDC_PDU
,
656 { "ReportCharacteristics-ENDC", "x2ap.ReportCharacteristics_ENDC",
657 FT_BYTES
, BASE_NONE
, NULL
, 0,
659 { &hf_x2ap_rAT_RestrictionInformation_LEO
,
660 { "LEO", "x2ap.rAT_RestrictionInformation.LEO",
661 FT_BOOLEAN
, 8, TFS(&tfs_restricted_not_restricted
), 0x80,
663 { &hf_x2ap_rAT_RestrictionInformation_MEO
,
664 { "MEO", "x2ap.rAT_RestrictionInformation.MEO",
665 FT_BOOLEAN
, 8, TFS(&tfs_restricted_not_restricted
), 0x40,
667 { &hf_x2ap_rAT_RestrictionInformation_GEO
,
668 { "GEO", "x2ap.rAT_RestrictionInformation.GEO",
669 FT_BOOLEAN
, 8, TFS(&tfs_restricted_not_restricted
), 0x20,
671 { &hf_x2ap_rAT_RestrictionInformation_OTHERSAT
,
672 { "OTHERSAT", "x2ap.rAT_RestrictionInformation.OTHERSAT",
673 FT_BOOLEAN
, 8, TFS(&tfs_restricted_not_restricted
), 0x10,
675 { &hf_x2ap_rAT_RestrictionInformation_NR_LEO
,
676 { "NR-LEO", "x2ap.rAT_RestrictionInformation.NR_LEO",
677 FT_BOOLEAN
, 8, TFS(&tfs_restricted_not_restricted
), 0x08,
679 { &hf_x2ap_rAT_RestrictionInformation_NR_MEO
,
680 { "NR-MEO", "x2ap.rAT_RestrictionInformation.NR_MEO",
681 FT_BOOLEAN
, 8, TFS(&tfs_restricted_not_restricted
), 0x04,
683 { &hf_x2ap_rAT_RestrictionInformation_NR_GEO
,
684 { "NR-GEO", "x2ap.rAT_RestrictionInformation.NR_GEO",
685 FT_BOOLEAN
, 8, TFS(&tfs_restricted_not_restricted
), 0x02,
687 { &hf_x2ap_rAT_RestrictionInformation_NR_OTHERSAT
,
688 { "NR-OTHERSAT", "x2ap.rAT_RestrictionInformation.NR_OTHERSAT",
689 FT_BOOLEAN
, 8, TFS(&tfs_restricted_not_restricted
), 0x01,
691 #include "packet-x2ap-hfarr.c"
694 /* List of subtrees */
695 static int *ett
[] = {
697 &ett_x2ap_TransportLayerAddress
,
698 &ett_x2ap_PLMN_Identity
,
699 &ett_x2ap_TargeteNBtoSource_eNBTransparentContainer
,
700 &ett_x2ap_RRC_Context
,
701 &ett_x2ap_UE_HistoryInformationFromTheUE
,
702 &ett_x2ap_ReportCharacteristics
,
703 &ett_x2ap_measurementFailedReportCharacteristics
,
704 &ett_x2ap_UE_RLF_Report_Container
,
705 &ett_x2ap_UE_RLF_Report_Container_for_extended_bands
,
706 &ett_x2ap_MeNBtoSeNBContainer
,
707 &ett_x2ap_SeNBtoMeNBContainer
,
708 &ett_x2ap_EUTRANTraceID
,
709 &ett_x2ap_InterfacesToTrace
,
710 &ett_x2ap_TraceCollectionEntityIPAddress
,
711 &ett_x2ap_EncryptionAlgorithms
,
712 &ett_x2ap_IntegrityProtectionAlgorithms
,
713 &ett_x2ap_MeasurementsToActivate
,
714 &ett_x2ap_MDT_Location_Info
,
715 &ett_x2ap_transmissionModes
,
716 &ett_x2ap_X2AP_Message
,
717 &ett_x2ap_MeNBtoSgNBContainer
,
718 &ett_x2ap_SgNBtoMeNBContainer
,
719 &ett_x2ap_RRCContainer
,
720 &ett_x2ap_NRencryptionAlgorithms
,
721 &ett_x2ap_NRintegrityProtectionAlgorithms
,
722 &ett_x2ap_measurementTimingConfiguration
,
723 &ett_x2ap_LastVisitedNGRANCellInformation
,
724 &ett_x2ap_LastVisitedUTRANCellInformation
,
725 &ett_x2ap_EndcSONConfigurationTransfer
,
726 &ett_x2ap_EPCHandoverRestrictionListContainer
,
727 &ett_x2ap_NBIoT_RLF_Report_Container
,
728 &ett_x2ap_anchorCarrier_NPRACHConfig
,
729 &ett_x2ap_anchorCarrier_EDT_NPRACHConfig
,
730 &ett_x2ap_anchorCarrier_Format2_NPRACHConfig
,
731 &ett_x2ap_anchorCarrier_Format2_EDT_NPRACHConfig
,
732 &ett_x2ap_non_anchorCarrier_NPRACHConfig
,
733 &ett_x2ap_non_anchorCarrier_Format2_NPRACHConfig
,
734 &ett_x2ap_anchorCarrier_NPRACHConfigTDD
,
735 &ett_x2ap_non_anchorCarrier_NPRACHConfigTDD
,
736 &ett_x2ap_Non_anchorCarrierFrequency
,
737 &ett_x2ap_ReportCharacteristics_ENDC
,
738 &ett_x2ap_TargetCellInNGRAN
,
739 &ett_x2ap_TDDULDLConfigurationCommonNR
,
740 &ett_x2ap_MDT_ConfigurationNR
,
741 &ett_x2ap_NRCellPRACHConfig
,
742 &ett_x2ap_IntendedTDD_DL_ULConfiguration_NR
,
743 &ett_x2ap_UERadioCapability
,
744 &ett_x2ap_LastVisitedPSCell_Item
,
745 &ett_x2ap_NRRAReportContainer
,
746 &ett_x2ap_rAT_RestrictionInformation
,
747 &ett_x2ap_PSCellListContainer
,
748 #include "packet-x2ap-ettarr.c"
751 module_t
*x2ap_module
;
753 /* Register protocol */
754 proto_x2ap
= proto_register_protocol(PNAME
, PSNAME
, PFNAME
);
755 /* Register fields and subtrees */
756 proto_register_field_array(proto_x2ap
, hf
, array_length(hf
));
757 proto_register_subtree_array(ett
, array_length(ett
));
759 /* Register dissector */
760 x2ap_handle
= register_dissector("x2ap", dissect_x2ap
, proto_x2ap
);
762 /* Register dissector tables */
763 x2ap_ies_dissector_table
= register_dissector_table("x2ap.ies", "X2AP-PROTOCOL-IES", proto_x2ap
, FT_UINT32
, BASE_DEC
);
764 x2ap_extension_dissector_table
= register_dissector_table("x2ap.extension", "X2AP-PROTOCOL-EXTENSION", proto_x2ap
, FT_UINT32
, BASE_DEC
);
765 x2ap_proc_imsg_dissector_table
= register_dissector_table("x2ap.proc.imsg", "X2AP-ELEMENTARY-PROCEDURE InitiatingMessage", proto_x2ap
, FT_UINT32
, BASE_DEC
);
766 x2ap_proc_sout_dissector_table
= register_dissector_table("x2ap.proc.sout", "X2AP-ELEMENTARY-PROCEDURE SuccessfulOutcome", proto_x2ap
, FT_UINT32
, BASE_DEC
);
767 x2ap_proc_uout_dissector_table
= register_dissector_table("x2ap.proc.uout", "X2AP-ELEMENTARY-PROCEDURE UnsuccessfulOutcome", proto_x2ap
, FT_UINT32
, BASE_DEC
);
769 /* Register configuration options */
770 x2ap_module
= prefs_register_protocol(proto_x2ap
, NULL
);
772 prefs_register_enum_preference(x2ap_module
, "dissect_rrc_context_as", "Dissect RRC Context as",
773 "Select whether RRC Context should be dissected as legacy LTE or NB-IOT",
774 &g_x2ap_dissect_rrc_context_as
, x2ap_rrc_context_vals
, false);
778 /*--- proto_reg_handoff_x2ap ---------------------------------------*/
780 proto_reg_handoff_x2ap(void)
782 dissector_add_uint_with_preference("sctp.port", SCTP_PORT_X2AP
, x2ap_handle
);
783 dissector_add_uint("sctp.ppi", X2AP_PAYLOAD_PROTOCOL_ID
, x2ap_handle
);
784 #include "packet-x2ap-dis-tab.c"