|
25 | 25 | namespace srsran { |
26 | 26 | namespace srs_cu_cp { |
27 | 27 |
|
28 | | -/// \brief Convert the UE Context Setup Request from common type to ASN.1. |
29 | | -/// \param[out] asn1_request The ASN.1 struct to store the result. |
30 | | -/// \param[in] request The common type UE Context Setup Request. |
31 | | -inline void fill_asn1_ue_context_setup_request(asn1::f1ap::ue_context_setup_request_s& asn1_request, |
32 | | - const f1ap_ue_context_setup_request& request) |
33 | | -{ |
34 | | - // sp cell id |
35 | | - asn1_request->sp_cell_id = nr_cgi_to_f1ap_asn1(request.sp_cell_id); |
36 | | - |
37 | | - // serv cell idx |
38 | | - asn1_request->serv_cell_idx = request.serv_cell_idx; |
39 | | - |
40 | | - // sp cell ul cfg |
41 | | - if (request.sp_cell_ul_cfg.has_value()) { |
42 | | - asn1_request->sp_cell_ul_cfg = cell_ul_cfg_to_asn1(request.sp_cell_ul_cfg.value()); |
43 | | - } |
44 | | - |
45 | | - // cu to du rrc info |
46 | | - cu_to_du_rrc_info_to_asn1(asn1_request->cu_to_du_rrc_info, request.cu_to_du_rrc_info); |
47 | | - |
48 | | - // candidate sp cell list |
49 | | - if (!request.candidate_sp_cell_list.empty()) { |
50 | | - asn1_request->candidate_sp_cell_list_present = true; |
51 | | - for (const auto& candidate_cell_item : request.candidate_sp_cell_list) { |
52 | | - asn1::protocol_ie_single_container_s<asn1::f1ap::candidate_sp_cell_item_ies_o> asn1_candidate_cell_item_container; |
53 | | - asn1_candidate_cell_item_container.load_info_obj(ASN1_F1AP_ID_CANDIDATE_SP_CELL_ITEM); |
54 | | - |
55 | | - auto& asn1_candidate_cell_item = asn1_candidate_cell_item_container.value().candidate_sp_cell_item(); |
56 | | - asn1_candidate_cell_item.candidate_sp_cell_id = nr_cgi_to_f1ap_asn1(candidate_cell_item.candidate_sp_cell_id); |
57 | | - |
58 | | - asn1_request->candidate_sp_cell_list.push_back(asn1_candidate_cell_item_container); |
59 | | - } |
60 | | - } |
61 | | - |
62 | | - // drx cycle |
63 | | - if (request.drx_cycle.has_value()) { |
64 | | - asn1_request->drx_cycle_present = true; |
65 | | - // long drx cycle len |
66 | | - asn1::number_to_enum(asn1_request->drx_cycle.long_drx_cycle_len, request.drx_cycle.value().long_drx_cycle_len); |
67 | | - |
68 | | - // short drx cycle len |
69 | | - if (request.drx_cycle.value().short_drx_cycle_len.has_value()) { |
70 | | - asn1_request->drx_cycle.short_drx_cycle_len_present = true; |
71 | | - asn1::number_to_enum(asn1_request->drx_cycle.short_drx_cycle_len, |
72 | | - request.drx_cycle.value().short_drx_cycle_len.value()); |
73 | | - } |
74 | | - |
75 | | - // short drx cycle timer |
76 | | - if (request.drx_cycle.value().short_drx_cycle_timer.has_value()) { |
77 | | - asn1_request->drx_cycle.short_drx_cycle_timer_present = true; |
78 | | - asn1_request->drx_cycle.short_drx_cycle_timer = request.drx_cycle.value().short_drx_cycle_timer.value(); |
79 | | - } |
80 | | - } |
81 | | - |
82 | | - // res coordination transfer container |
83 | | - if (!request.res_coordination_transfer_container.empty()) { |
84 | | - asn1_request->res_coordination_transfer_container_present = true; |
85 | | - asn1_request->res_coordination_transfer_container = request.res_coordination_transfer_container.copy(); |
86 | | - } |
87 | | - |
88 | | - // scell to be setup list |
89 | | - if (!request.scell_to_be_setup_list.empty()) { |
90 | | - asn1_request->scell_to_be_setup_list_present = true; |
91 | | - |
92 | | - for (const auto& scell_to_be_setup_item : request.scell_to_be_setup_list) { |
93 | | - asn1::protocol_ie_single_container_s<asn1::f1ap::scell_to_be_setup_item_ies_o> |
94 | | - asn1_scell_to_be_setup_item_container; |
95 | | - asn1_scell_to_be_setup_item_container.load_info_obj(ASN1_F1AP_ID_SCELL_TO_BE_SETUP_ITEM); |
96 | | - |
97 | | - auto& asn1_scell_to_be_setup_item = asn1_scell_to_be_setup_item_container.value().scell_to_be_setup_item(); |
98 | | - |
99 | | - f1ap_scell_to_be_setup_mod_item_to_asn1(asn1_scell_to_be_setup_item, scell_to_be_setup_item); |
100 | | - asn1_request->scell_to_be_setup_list.push_back(asn1_scell_to_be_setup_item_container); |
101 | | - } |
102 | | - } |
103 | | - |
104 | | - // srbs to be setup list |
105 | | - if (!request.srbs_to_be_setup_list.empty()) { |
106 | | - asn1_request->srbs_to_be_setup_list_present = true; |
107 | | - |
108 | | - for (const auto& srbs_to_be_setup_item : request.srbs_to_be_setup_list) { |
109 | | - asn1::protocol_ie_single_container_s<asn1::f1ap::srbs_to_be_setup_item_ies_o> |
110 | | - asn1_srbs_to_be_setup_item_container; |
111 | | - asn1_srbs_to_be_setup_item_container.set_item(ASN1_F1AP_ID_SRBS_TO_BE_SETUP_ITEM); |
112 | | - auto& asn1_srbs_to_be_setup_item = asn1_srbs_to_be_setup_item_container.value().srbs_to_be_setup_item(); |
113 | | - |
114 | | - f1ap_srbs_to_be_setup_mod_item_to_asn1(asn1_srbs_to_be_setup_item, srbs_to_be_setup_item); |
115 | | - |
116 | | - asn1_request->srbs_to_be_setup_list.push_back(asn1_srbs_to_be_setup_item_container); |
117 | | - } |
118 | | - } |
119 | | - |
120 | | - // drbs to be setup list |
121 | | - if (!request.drbs_to_be_setup_list.empty()) { |
122 | | - asn1_request->drbs_to_be_setup_list_present = true; |
123 | | - |
124 | | - for (const auto& drb_to_be_setup_item : request.drbs_to_be_setup_list) { |
125 | | - asn1::protocol_ie_single_container_s<asn1::f1ap::drbs_to_be_setup_item_ies_o> asn1_drb_to_be_setup_item_container; |
126 | | - asn1_drb_to_be_setup_item_container.load_info_obj(ASN1_F1AP_ID_DRBS_TO_BE_SETUP_ITEM); |
127 | | - |
128 | | - f1ap_drbs_to_be_setup_mod_item_to_asn1(asn1_drb_to_be_setup_item_container.value().drbs_to_be_setup_item(), |
129 | | - drb_to_be_setup_item); |
130 | | - |
131 | | - asn1_request->drbs_to_be_setup_list.push_back(asn1_drb_to_be_setup_item_container); |
132 | | - } |
133 | | - } |
134 | | - |
135 | | - // inactivity monitoring request |
136 | | - if (request.inactivity_monitoring_request.has_value()) { |
137 | | - asn1_request->inactivity_monitoring_request_present = true; |
138 | | - asn1::bool_to_enum(asn1_request->inactivity_monitoring_request, request.inactivity_monitoring_request.value()); |
139 | | - } |
140 | | - |
141 | | - // rat freq prio info |
142 | | - if (request.rat_freq_prio_info.has_value()) { |
143 | | - asn1_request->rat_freq_prio_info_present = true; |
144 | | - asn1_request->rat_freq_prio_info = f1ap_rat_freq_prio_info_to_asn1(request.rat_freq_prio_info.value()); |
145 | | - } |
146 | | - |
147 | | - // rrc container |
148 | | - if (!request.rrc_container.empty()) { |
149 | | - asn1_request->rrc_container_present = true; |
150 | | - asn1_request->rrc_container = request.rrc_container.copy(); |
151 | | - } |
152 | | - |
153 | | - // masked imeisv |
154 | | - if (request.masked_imeisv.has_value()) { |
155 | | - asn1_request->masked_imeisv_present = true; |
156 | | - asn1_request->masked_imeisv.from_number(request.masked_imeisv.value()); |
157 | | - } |
158 | | - |
159 | | - // serving plmn |
160 | | - if (request.serving_plmn.has_value()) { |
161 | | - asn1_request->serving_plmn_present = true; |
162 | | - asn1_request->serving_plmn.from_string(request.serving_plmn.value()); |
163 | | - } |
164 | | - |
165 | | - // gnb du ue ambr ul |
166 | | - if (request.gnb_du_ue_ambr_ul.has_value()) { |
167 | | - asn1_request->gnb_du_ue_ambr_ul_present = true; |
168 | | - asn1_request->gnb_du_ue_ambr_ul = request.gnb_du_ue_ambr_ul.value(); |
169 | | - } |
170 | | - |
171 | | - // rrc delivery status request |
172 | | - if (request.rrc_delivery_status_request.has_value()) { |
173 | | - asn1_request->rrc_delivery_status_request_present = true; |
174 | | - asn1::bool_to_enum(asn1_request->rrc_delivery_status_request, request.rrc_delivery_status_request.value()); |
175 | | - } |
176 | | - |
177 | | - // res coordination transfer info |
178 | | - if (request.res_coordination_transfer_info.has_value()) { |
179 | | - asn1_request->res_coordination_transfer_info_present = true; |
180 | | - asn1_request->res_coordination_transfer_info.res_coordination_eutra_cell_info_present = false; |
181 | | - asn1_request->res_coordination_transfer_info.m_enb_cell_id.from_number( |
182 | | - request.res_coordination_transfer_info.value().m_enb_cell_id); |
183 | | - } |
184 | | - |
185 | | - // serving cell mo |
186 | | - if (request.serving_cell_mo.has_value()) { |
187 | | - asn1_request->serving_cell_mo_present = true; |
188 | | - asn1_request->serving_cell_mo = request.serving_cell_mo.value(); |
189 | | - } |
190 | | - |
191 | | - // new gnb cu ue f1ap id |
192 | | - if (request.new_gnb_cu_ue_f1ap_id.has_value()) { |
193 | | - asn1_request->new_gnb_cu_ue_f1ap_id_present = true; |
194 | | - asn1_request->new_gnb_cu_ue_f1ap_id = gnb_cu_ue_f1ap_id_to_uint(request.new_gnb_cu_ue_f1ap_id.value()); |
195 | | - } |
196 | | - |
197 | | - // ran ue id |
198 | | - if (request.ran_ue_id.has_value()) { |
199 | | - asn1_request->ran_ue_id_present = true; |
200 | | - asn1_request->ran_ue_id.from_number(ran_ue_id_to_uint(request.ran_ue_id.value())); |
201 | | - } |
202 | | -} |
203 | | - |
204 | | -/// \brief Convert the UE Context Setup Response from ASN.1 to common type. |
205 | | -/// \param[out] response The common type struct to store the result. |
206 | | -/// \param[in] asn1_response The ASN.1 UE Context Setup Response. |
207 | | - |
208 | | -inline void fill_f1ap_ue_context_setup_response(f1ap_ue_context_setup_response& response, |
209 | | - ue_index_t ue_index, |
210 | | - const asn1::f1ap::ue_context_setup_resp_s& asn1_response) |
211 | | -{ |
212 | | - response.success = true; |
213 | | - response.ue_index = ue_index; |
214 | | - |
215 | | - // du to cu rrc info |
216 | | - response.du_to_cu_rrc_info.cell_group_cfg = asn1_response->du_to_cu_rrc_info.cell_group_cfg.copy(); |
217 | | - response.du_to_cu_rrc_info.meas_gap_cfg = asn1_response->du_to_cu_rrc_info.meas_gap_cfg.copy(); |
218 | | - response.du_to_cu_rrc_info.requested_p_max_fr1 = asn1_response->du_to_cu_rrc_info.requested_p_max_fr1.copy(); |
219 | | - |
220 | | - // c rnti |
221 | | - if (asn1_response->c_rnti_present) { |
222 | | - response.c_rnti = to_rnti(asn1_response->c_rnti); |
223 | | - } |
224 | | - |
225 | | - // res coordination transfer container |
226 | | - if (asn1_response->res_coordination_transfer_container_present) { |
227 | | - response.res_coordination_transfer_container = asn1_response->res_coordination_transfer_container.copy(); |
228 | | - } |
229 | | - |
230 | | - // full cfg |
231 | | - if (asn1_response->full_cfg_present) { |
232 | | - response.full_cfg = asn1::enum_to_bool(asn1_response->full_cfg); |
233 | | - } |
234 | | - |
235 | | - // drbs setup list |
236 | | - if (asn1_response->drbs_setup_list_present) { |
237 | | - for (auto asn1_drbs_setup_list_item : asn1_response->drbs_setup_list) { |
238 | | - auto& asn1_drb_mod_item = asn1_drbs_setup_list_item.value().drbs_setup_item(); |
239 | | - |
240 | | - f1ap_drbs_setup_mod_item drb_setup_item = asn1_to_f1ap_drbs_setup_mod_item(asn1_drb_mod_item); |
241 | | - |
242 | | - response.drbs_setup_list.emplace(drb_setup_item.drb_id, drb_setup_item); |
243 | | - } |
244 | | - } |
245 | | - |
246 | | - // srbs failed to be setup list |
247 | | - if (asn1_response->srbs_failed_to_be_setup_list_present) { |
248 | | - for (auto asn1_srbs_failed_setup_list_item : asn1_response->srbs_failed_to_be_setup_list) { |
249 | | - auto& asn1_srb_failed_item = asn1_srbs_failed_setup_list_item.value().srbs_failed_to_be_setup_item(); |
250 | | - |
251 | | - f1ap_srbs_failed_to_be_setup_mod_item srb_failed_item = |
252 | | - asn1_to_f1ap_srbs_failed_to_be_setup_mod_item(asn1_srb_failed_item); |
253 | | - |
254 | | - response.srbs_failed_to_be_setup_list.emplace(srb_failed_item.srb_id, srb_failed_item); |
255 | | - } |
256 | | - } |
257 | | - |
258 | | - // drbs failed to be setup list |
259 | | - if (asn1_response->drbs_failed_to_be_setup_list_present) { |
260 | | - for (auto asn1_drbs_failed_setup_list_item : asn1_response->drbs_failed_to_be_setup_list) { |
261 | | - auto& asn1_drb_failed_item = asn1_drbs_failed_setup_list_item.value().drbs_failed_to_be_setup_item(); |
262 | | - |
263 | | - f1ap_drbs_failed_to_be_setup_mod_item drb_failed_item = |
264 | | - asn1_to_f1ap_drbs_failed_to_be_setup_mod_item(asn1_drb_failed_item); |
265 | | - |
266 | | - response.drbs_failed_to_be_setup_list.emplace(drb_failed_item.drb_id, drb_failed_item); |
267 | | - } |
268 | | - } |
269 | | - |
270 | | - // scell failed to setup list |
271 | | - if (asn1_response->scell_failedto_setup_list_present) { |
272 | | - for (const auto& asn1_scell_failed_to_setup_item : asn1_response->scell_failedto_setup_list) { |
273 | | - f1ap_scell_failed_to_setup_mod_item scell_failed_to_setup_item; |
274 | | - |
275 | | - // scell id |
276 | | - scell_failed_to_setup_item.scell_id = |
277 | | - f1ap_asn1_to_nr_cgi(asn1_scell_failed_to_setup_item->scell_failedto_setup_item().scell_id); |
278 | | - |
279 | | - // cause |
280 | | - if (asn1_scell_failed_to_setup_item->scell_failedto_setup_item().cause_present) { |
281 | | - scell_failed_to_setup_item.cause = |
282 | | - f1ap_asn1_to_cause(asn1_scell_failed_to_setup_item->scell_failedto_setup_item().cause); |
283 | | - } |
284 | | - |
285 | | - response.scell_failed_to_setup_list.push_back(scell_failed_to_setup_item); |
286 | | - } |
287 | | - } |
288 | | - |
289 | | - // Add inactivity monitoring response |
290 | | - if (asn1_response->inactivity_monitoring_resp_present) { |
291 | | - bool inactivity_monitoring_resp = asn1::enum_to_bool(asn1_response->inactivity_monitoring_resp); |
292 | | - response.inactivity_monitoring_resp = inactivity_monitoring_resp; |
293 | | - } |
294 | | - |
295 | | - // srbs setup list |
296 | | - if (asn1_response->srbs_setup_list_present) { |
297 | | - for (auto asn1_srbs_setup_list_item : asn1_response->srbs_setup_list) { |
298 | | - auto& asn1_srbs_setup_item = asn1_srbs_setup_list_item.value().srbs_setup_item(); |
299 | | - |
300 | | - f1ap_srbs_setup_mod_item srbs_setup_item = asn1_to_f1ap_srbs_setup_mod_item(asn1_srbs_setup_item); |
301 | | - |
302 | | - response.srbs_setup_list.emplace(srbs_setup_item.srb_id, srbs_setup_item); |
303 | | - } |
304 | | - } |
305 | | -} |
306 | | - |
307 | | -/// \brief Convert the UE Context Setup Response from ASN.1 to common type. |
308 | | -/// \param[out] response The common type struct to store the result. |
309 | | -/// \param[in] asn1_failure The ASN.1 UE Context Setup Failure. |
310 | | - |
311 | | -inline void fill_f1ap_ue_context_setup_response(f1ap_ue_context_setup_response& response, |
312 | | - const asn1::f1ap::ue_context_setup_fail_s& asn1_failure) |
313 | | -{ |
314 | | - response.success = false; |
315 | | - |
316 | | - // cause |
317 | | - response.cause = f1ap_asn1_to_cause(asn1_failure->cause); |
318 | | - |
319 | | - // potential sp cell list |
320 | | - if (asn1_failure->potential_sp_cell_list_present) { |
321 | | - f1ap_potential_sp_cell_item potential_sp_cell_item; |
322 | | - |
323 | | - for (const auto& asn1_potential_sp_cell_item : asn1_failure->potential_sp_cell_list) { |
324 | | - potential_sp_cell_item.potential_sp_cell_id = |
325 | | - f1ap_asn1_to_nr_cgi(asn1_potential_sp_cell_item->potential_sp_cell_item().potential_sp_cell_id); |
326 | | - |
327 | | - response.potential_sp_cell_list.push_back(potential_sp_cell_item); |
328 | | - } |
329 | | - } |
330 | | - |
331 | | - // crit diagnostics |
332 | | - if (asn1_failure->crit_diagnostics_present) { |
333 | | - // TODO: Add crit diagnostics |
334 | | - } |
335 | | -} |
336 | | - |
337 | 28 | /// \brief Convert the UE Context Modification Request from common type to ASN.1. |
338 | 29 | /// \param[out] asn1_request The ASN.1 struct to store the result. |
339 | 30 | /// \param[in] request The common type UE Context Modification Request. |
|
0 commit comments