/src/ocudu/lib/ran/cause/ngap_cause_converters.cpp
Line | Count | Source |
1 | | // SPDX-FileCopyrightText: Copyright (C) 2021-2026 Software Radio Systems Limited |
2 | | // SPDX-License-Identifier: BSD-3-Clause-Open-MPI |
3 | | // Portions of this file may implement 3GPP specifications, which may be subject to additional licensing requirements. |
4 | | |
5 | | #include "ocudu/ran/cause/ngap_cause_converters.h" |
6 | | #include "ocudu/support/error_handling.h" |
7 | | |
8 | | using namespace ocudu; |
9 | | |
10 | | static constexpr uint8_t ngap_to_f1ap_cause_radio_network[] = { |
11 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // unspecified |
12 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // txnrelocoverall_expiry |
13 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // successful_ho |
14 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // release_due_to_ngran_generated_reason |
15 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // release_due_to_5gc_generated_reason |
16 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // ho_cancelled |
17 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // partial_ho |
18 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // ho_fail_in_target_5_gc_ngran_node_or_target_sys |
19 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // ho_target_not_allowed |
20 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // tngrelocoverall_expiry |
21 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // tngrelocprep_expiry |
22 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // cell_not_available |
23 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // unknown_target_id |
24 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // no_radio_res_available_in_target_cell |
25 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // unknown_local_ue_ngap_id |
26 | | (uint8_t)f1ap_cause_radio_network_t::amf_initiated_abnormal_release, // inconsistent_remote_ue_ngap_id |
27 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // ho_desirable_for_radio_reason |
28 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // time_crit_ho |
29 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // res_optim_ho |
30 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // reduce_load_in_serving_cell |
31 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // user_inactivity |
32 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // radio_conn_with_ue_lost |
33 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // radio_res_not_available |
34 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // invalid_qos_combination |
35 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // fail_in_radio_interface_proc |
36 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // interaction_with_other_proc |
37 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // unknown_pdu_session_id |
38 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // unkown_qos_flow_id |
39 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // multiple_pdu_session_id_instances |
40 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // multiple_qos_flow_id_instances |
41 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // encryption_and_or_integrity_protection_algorithms_not_supported |
42 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // ng_intra_sys_ho_triggered |
43 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // ng_inter_sys_ho_triggered |
44 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // xn_ho_triggered |
45 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // not_supported_5qi_value |
46 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // ue_context_transfer |
47 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // ims_voice_eps_fallback_or_rat_fallback_triggered |
48 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // up_integrity_protection_not_possible |
49 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // up_confidentiality_protection_not_possible |
50 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // slice_not_supported |
51 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // ue_in_rrc_inactive_state_not_reachable |
52 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // redirection |
53 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // res_not_available_for_the_slice |
54 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // ue_max_integrity_protected_data_rate_reason |
55 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // release_due_to_cn_detected_mob |
56 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // n26_interface_not_available |
57 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // release_due_to_pre_emption |
58 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // multiple_location_report_ref_id_instances |
59 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // rsn_not_available_for_the_up |
60 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // npn_access_denied |
61 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // cag_only_access_denied |
62 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // insufficient_ue_cap |
63 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // redcap_ue_not_supported |
64 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // unknown_mbs_session_id |
65 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // indicated_mbs_session_area_info_not_served_by_the_gnb |
66 | | (uint8_t)f1ap_cause_radio_network_t::unspecified, // inconsistent_slice_info_for_the_session |
67 | | (uint8_t)f1ap_cause_radio_network_t::unspecified // misaligned_assoc_for_multicast_unicast |
68 | | }; |
69 | | |
70 | | static constexpr uint8_t ngap_to_f1ap_cause_transport[] = { |
71 | | (uint8_t)f1ap_cause_transport_t::transport_res_unavailable, // transport_res_unavailable |
72 | | (uint8_t)f1ap_cause_transport_t::unspecified // unspecified |
73 | | }; |
74 | | |
75 | | static constexpr uint8_t ngap_to_f1ap_cause_misc[] = { |
76 | | (uint8_t)cause_misc_t::unspecified, // ctrl_processing_overload |
77 | | (uint8_t)cause_misc_t::unspecified, // not_enough_user_plane_processing_res |
78 | | (uint8_t)cause_misc_t::unspecified, // hardware_fail |
79 | | (uint8_t)cause_misc_t::unspecified, // om_intervention |
80 | | (uint8_t)cause_misc_t::unspecified, // unknown_plmn_or_sn_pn |
81 | | (uint8_t)cause_misc_t::unspecified, // unspecified |
82 | | }; |
83 | | |
84 | | f1ap_cause_t ocudu::ngap_to_f1ap_cause(ngap_cause_t ngap_cause) |
85 | 0 | { |
86 | 0 | if (const auto* result = std::get_if<ngap_cause_radio_network_t>(&ngap_cause)) { |
87 | 0 | return f1ap_cause_radio_network_t(ngap_to_f1ap_cause_radio_network[uint8_t(*result)]); |
88 | 0 | } |
89 | 0 | if (const auto* result = std::get_if<ngap_cause_transport_t>(&ngap_cause)) { |
90 | 0 | return f1ap_cause_transport_t(ngap_to_f1ap_cause_transport[uint8_t(*result)]); |
91 | 0 | } |
92 | 0 | if (const auto* result = std::get_if<cause_nas_t>(&ngap_cause)) { |
93 | 0 | switch (*result) { |
94 | 0 | case cause_nas_t::normal_release: |
95 | 0 | return f1ap_cause_radio_network_t::normal_release; |
96 | 0 | case cause_nas_t::authentication_fail: |
97 | 0 | return f1ap_cause_radio_network_t::unspecified; |
98 | 0 | case cause_nas_t::deregister: |
99 | 0 | return f1ap_cause_radio_network_t::normal_release; |
100 | 0 | case cause_nas_t::unspecified: |
101 | 0 | return f1ap_cause_radio_network_t::unspecified; |
102 | 0 | default: |
103 | 0 | report_fatal_error("Cannot convert cause to F1AP type: {}", ngap_cause); |
104 | 0 | } |
105 | 0 | } |
106 | 0 | if (const auto* result = std::get_if<cause_protocol_t>(&ngap_cause)) { |
107 | 0 | return *result; |
108 | 0 | } |
109 | 0 | if (const auto* result = std::get_if<ngap_cause_misc_t>(&ngap_cause)) { |
110 | 0 | return cause_misc_t(ngap_to_f1ap_cause_misc[uint8_t(*result)]); |
111 | 0 | } |
112 | | |
113 | 0 | report_fatal_error("Cannot convert cause to F1AP type: {}", ngap_cause); |
114 | 0 | return {}; |
115 | 0 | } |
116 | | |
117 | | static constexpr uint8_t ngap_to_e1ap_cause_radio_network[] = { |
118 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // unspecified |
119 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // txnrelocoverall_expiry |
120 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // successful_ho |
121 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // release_due_to_ngran_generated_reason |
122 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // release_due_to_5gc_generated_reason |
123 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // ho_cancelled |
124 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // partial_ho |
125 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // ho_fail_in_target_5_gc_ngran_node_or_target_sys |
126 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // ho_target_not_allowed |
127 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // tngrelocoverall_expiry |
128 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // tngrelocprep_expiry |
129 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // cell_not_available |
130 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // unknown_target_id |
131 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // no_radio_res_available_in_target_cell |
132 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // unknown_local_ue_ngap_id |
133 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // inconsistent_remote_ue_ngap_id |
134 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // ho_desirable_for_radio_reason |
135 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // time_crit_ho |
136 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // res_optim_ho |
137 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // reduce_load_in_serving_cell |
138 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // user_inactivity |
139 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // radio_conn_with_ue_lost |
140 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // radio_res_not_available |
141 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // invalid_qos_combination |
142 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // fail_in_radio_interface_proc |
143 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // interaction_with_other_proc |
144 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // unknown_pdu_session_id |
145 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // unkown_qos_flow_id |
146 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // multiple_pdu_session_id_instances |
147 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // multiple_qos_flow_id_instances |
148 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // encryption_and_or_integrity_protection_algorithms_not_supported |
149 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // ng_intra_sys_ho_triggered |
150 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // ng_inter_sys_ho_triggered |
151 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // xn_ho_triggered |
152 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // not_supported_5qi_value |
153 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // ue_context_transfer |
154 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // ims_voice_eps_fallback_or_rat_fallback_triggered |
155 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // up_integrity_protection_not_possible |
156 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // up_confidentiality_protection_not_possible |
157 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // slice_not_supported |
158 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // ue_in_rrc_inactive_state_not_reachable |
159 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // redirection |
160 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // res_not_available_for_the_slice |
161 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // ue_max_integrity_protected_data_rate_reason |
162 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // release_due_to_cn_detected_mob |
163 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // n26_interface_not_available |
164 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // release_due_to_pre_emption |
165 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // multiple_location_report_ref_id_instances |
166 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // rsn_not_available_for_the_up |
167 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // npn_access_denied |
168 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // cag_only_access_denied |
169 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // insufficient_ue_cap |
170 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // redcap_ue_not_supported |
171 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // unknown_mbs_session_id |
172 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // indicated_mbs_session_area_info_not_served_by_the_gnb |
173 | | (uint8_t)e1ap_cause_radio_network_t::unspecified, // inconsistent_slice_info_for_the_session |
174 | | (uint8_t)e1ap_cause_radio_network_t::unspecified // misaligned_assoc_for_multicast_unicast |
175 | | }; |
176 | | |
177 | | static constexpr uint8_t ngap_to_e1ap_cause_transport[] = { |
178 | | (uint8_t)e1ap_cause_transport_t::transport_res_unavailable, // transport_res_unavailable |
179 | | (uint8_t)e1ap_cause_transport_t::unspecified // unspecified |
180 | | }; |
181 | | |
182 | | static constexpr uint8_t ngap_to_e1ap_cause_misc[] = { |
183 | | (uint8_t)cause_misc_t::unspecified, // ctrl_processing_overload |
184 | | (uint8_t)cause_misc_t::unspecified, // not_enough_user_plane_processing_res |
185 | | (uint8_t)cause_misc_t::unspecified, // hardware_fail |
186 | | (uint8_t)cause_misc_t::unspecified, // om_intervention |
187 | | (uint8_t)cause_misc_t::unspecified, // unknown_plmn_or_sn_pn |
188 | | (uint8_t)cause_misc_t::unspecified // unspecified |
189 | | }; |
190 | | |
191 | | e1ap_cause_t ocudu::ngap_to_e1ap_cause(ngap_cause_t ngap_cause) |
192 | 0 | { |
193 | 0 | if (const auto* result = std::get_if<ngap_cause_radio_network_t>(&ngap_cause)) { |
194 | 0 | return e1ap_cause_radio_network_t(ngap_to_e1ap_cause_radio_network[uint8_t(*result)]); |
195 | 0 | } |
196 | 0 | if (const auto* result = std::get_if<ngap_cause_transport_t>(&ngap_cause)) { |
197 | 0 | return e1ap_cause_transport_t(ngap_to_e1ap_cause_transport[uint8_t(*result)]); |
198 | 0 | } |
199 | 0 | if (const auto* result = std::get_if<cause_nas_t>(&ngap_cause)) { |
200 | 0 | switch (*result) { |
201 | 0 | case cause_nas_t::normal_release: |
202 | 0 | return e1ap_cause_radio_network_t::normal_release; |
203 | 0 | case cause_nas_t::authentication_fail: |
204 | 0 | return e1ap_cause_radio_network_t::unspecified; |
205 | 0 | case cause_nas_t::deregister: |
206 | 0 | return e1ap_cause_radio_network_t::normal_release; |
207 | 0 | case cause_nas_t::unspecified: |
208 | 0 | return e1ap_cause_radio_network_t::unspecified; |
209 | 0 | default: |
210 | 0 | report_fatal_error("Cannot convert cause to E1AP type: {}", ngap_cause); |
211 | 0 | } |
212 | 0 | } |
213 | 0 | if (const auto* result = std::get_if<cause_protocol_t>(&ngap_cause)) { |
214 | 0 | return *result; |
215 | 0 | } |
216 | 0 | if (const auto* result = std::get_if<ngap_cause_misc_t>(&ngap_cause)) { |
217 | 0 | return cause_misc_t(ngap_to_e1ap_cause_misc[uint8_t(*result)]); |
218 | 0 | } |
219 | | |
220 | 0 | report_fatal_error("Cannot convert cause to E1AP type: {}", ngap_cause); |
221 | 0 | return {}; |
222 | 0 | } |