Coverage Report

Created: 2026-09-14 07:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}