2 ==================================================================================
3 Copyright (c) 2018-2019 AT&T Intellectual Property.
5 Licensed under the Apache License, Version 2.0 (the "License");
6 you may not use this file except in compliance with the License.
7 You may obtain a copy of the License at
9 http://www.apache.org/licenses/LICENSE-2.0
11 Unless required by applicable law or agreed to in writing, software
12 distributed under the License is distributed on an "AS IS" BASIS,
13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 See the License for the specific language governing permissions and
15 limitations under the License.
16 ==================================================================================
21 * Created on: Aug 14, 2019
22 * Author: Ashwin Sridharan
25 #include <sgnb_addition_request.hpp>
28 sgnb_addition_request::sgnb_addition_request(void){
30 x2ap_pdu_obj = (X2AP_PDU_t * )calloc(1, sizeof(X2AP_PDU_t));
31 assert(x2ap_pdu_obj != 0);
34 initMsg = (X2InitiatingMessage_t * )calloc(1, sizeof(X2InitiatingMessage_t));
38 IE_array = (SgNBAdditionRequest_IEs_t *)calloc(NUM_SGNB_ADDITION_REQUEST_IES, sizeof(SgNBAdditionRequest_IEs_t));
39 assert(IE_array != 0);
42 erab_array = (E_RABs_ToBeAdded_SgNBAddReq_ItemIEs_t * ) calloc(INITIAL_SIZE, sizeof(E_RABs_ToBeAdded_SgNBAddReq_ItemIEs_t));
43 assert(erab_array != 0);
44 erab_array_size = INITIAL_SIZE;
46 erab_sgnb_present_array = 0;
47 erab_sgnb_present_array = (E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPpresent_t *) calloc(INITIAL_SIZE, sizeof(E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPpresent_t));
48 assert(erab_sgnb_present_array != 0);
49 erab_sgnb_present_array_size = INITIAL_SIZE;
51 erab_sgnb_notpresent_array = 0;
52 erab_sgnb_notpresent_array = (E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPnotpresent_t *) calloc(INITIAL_SIZE, sizeof(E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPnotpresent_t));
53 assert(erab_sgnb_notpresent_array != 0);
54 erab_sgnb_notpresent_array_size = INITIAL_SIZE;
56 x2ap_pdu_obj->present = X2AP_PDU_PR_initiatingMessage;
57 x2ap_pdu_obj->choice.initiatingMessage = initMsg;
59 SgNBAdditionRequest_t * ric_indication = &(initMsg->value.choice.SgNBAdditionRequest);
60 for(int i = 0; i < NUM_SGNB_ADDITION_REQUEST_IES; i++){
61 ASN_SEQUENCE_ADD(&(ric_indication->protocolIEs), &(IE_array[i]));
68 sgnb_addition_request::~sgnb_addition_request(void){
70 mdclog_write(MDCLOG_INFO, "Freeing X2AP SgNB Addition Request object memory");
72 E_RABs_ToBeAdded_SgNBAddReqList_t * erabs_toadd_list = &(IE_array[7].value.choice. E_RABs_ToBeAdded_SgNBAddReqList);
73 for(int i = 0; i < erabs_toadd_list->list.size; i++){
74 erabs_toadd_list->list.array[i] = 0;
78 if (erabs_toadd_list->list.size > 0){
79 free(erabs_toadd_list->list.array);
80 erabs_toadd_list->list.array = 0;
81 erabs_toadd_list->list.size = 0;
82 erabs_toadd_list->list.count= 0;
85 free(erab_sgnb_present_array);
87 free(erab_sgnb_notpresent_array);
91 // Free BitRate allocation if any
92 SgNBAdditionRequest_IEs_t *ies_sgnb_addition_req;
93 ies_sgnb_addition_req= &IE_array[3];
94 UEAggregateMaximumBitRate_t * ue_rates = &(ies_sgnb_addition_req->value.choice.UEAggregateMaximumBitRate);
96 // clear buffer if previously allocated
97 if (ue_rates->uEaggregateMaximumBitRateDownlink.size > 0){
98 ue_rates->uEaggregateMaximumBitRateDownlink.size = 0;
99 free(ue_rates->uEaggregateMaximumBitRateDownlink.buf);
103 if (ue_rates->uEaggregateMaximumBitRateUplink.size > 0){
104 ue_rates->uEaggregateMaximumBitRateUplink.size = 0;
105 free(ue_rates->uEaggregateMaximumBitRateUplink.buf);
108 SgNBAdditionRequest_t *sgnb_addition = &(initMsg->value.choice.SgNBAdditionRequest);
109 for(int i = 0; i < sgnb_addition->protocolIEs.list.size; i++){
110 sgnb_addition->protocolIEs.list.array[i] = 0;
114 if (sgnb_addition->protocolIEs.list.size > 0){
115 free(sgnb_addition->protocolIEs.list.array);
116 sgnb_addition->protocolIEs.list.array = 0;
117 sgnb_addition->protocolIEs.list.size = 0;
123 x2ap_pdu_obj->choice.initiatingMessage = 0;
124 ASN_STRUCT_FREE(asn_DEF_X2AP_PDU, x2ap_pdu_obj);
125 mdclog_write(MDCLOG_INFO, "Freed X2AP SgNB Addition Request object mempory");
130 bool sgnb_addition_request::encode_sgnb_addition_request(unsigned char *buf, size_t *size, sgnb_addition_helper & dinput){
132 initMsg->procedureCode = ProcedureCode_id_sgNBAdditionPreparation;
133 initMsg->criticality = Criticality_ignore;
134 initMsg->value.present = X2InitiatingMessage__value_PR_SgNBAdditionRequest;
137 res = set_fields(initMsg, dinput);
142 int ret_constr = asn_check_constraints(&asn_DEF_X2AP_PDU, x2ap_pdu_obj, errbuf, &errbuf_len);
144 error_string.assign(&errbuf[0], errbuf_len);
145 error_string = "Error encoding X2AP Sgnb Addition Request message. Reason = " + error_string;
149 //xer_fprint(stdout, &asn_DEF_X2AP_PDU, x2ap_pdu_obj);
151 asn_enc_rval_t retval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_X2AP_PDU, x2ap_pdu_obj, buf, *size);
152 if(retval.encoded == -1){
153 error_string.assign(strerror(errno));
158 if(*size < retval.encoded){
159 std::stringstream ss;
160 ss <<"Error encoding SgNB Addition Request definition. Reason = encoded pdu size " << retval.encoded << " exceeds buffer size " << *size << std::endl;
161 error_string = ss.str();
166 *size = retval.encoded;
172 bool sgnb_addition_request::set_fields(X2InitiatingMessage_t * init_msg, sgnb_addition_helper &dinput){
174 unsigned ie_index = 0;
177 error_string = "Invalid reference for X2AP Sgnb Addition Request message in set_fields";
182 SgNBAdditionRequest_IEs_t *ies_sgnb_addition_req;
185 ies_sgnb_addition_req= &IE_array[ie_index];
186 ies_sgnb_addition_req->criticality = Criticality_reject;
187 ies_sgnb_addition_req->id = ProtocolIE_ID_id_MeNB_UE_X2AP_ID;
188 ies_sgnb_addition_req->value.present = SgNBAdditionRequest_IEs__value_PR_UE_X2AP_ID;
189 ies_sgnb_addition_req->value.choice.UE_X2AP_ID = dinput.menb_ue_x2ap_id;
193 ies_sgnb_addition_req= &IE_array[ie_index];
194 ies_sgnb_addition_req->criticality = Criticality_reject;
195 ies_sgnb_addition_req->id = ProtocolIE_ID_id_NRUESecurityCapabilities;
196 ies_sgnb_addition_req->value.present = SgNBAdditionRequest_IEs__value_PR_NRUESecurityCapabilities;
197 NRUESecurityCapabilities_t * nrue_sec = &(ies_sgnb_addition_req->value.choice.NRUESecurityCapabilities);
199 nrue_sec->nRencryptionAlgorithms.buf =dinput.encryption_algs;
200 nrue_sec->nRencryptionAlgorithms.size = dinput.encryption_algs_size;
201 nrue_sec->nRencryptionAlgorithms.bits_unused = dinput.encryption_algs_unused;
203 nrue_sec->nRintegrityProtectionAlgorithms.buf = dinput.integrity_protection_algs;
204 nrue_sec->nRintegrityProtectionAlgorithms.size = dinput.integrity_protection_algs_size;
205 nrue_sec->nRintegrityProtectionAlgorithms.bits_unused = dinput.integrity_protection_algs_unused;
208 ies_sgnb_addition_req= &IE_array[ie_index];
209 ies_sgnb_addition_req->criticality = Criticality_reject;
210 ies_sgnb_addition_req->id = ProtocolIE_ID_id_SgNBSecurityKey ;
211 ies_sgnb_addition_req->value.present = SgNBAdditionRequest_IEs__value_PR_SgNBSecurityKey;
212 SgNBSecurityKey_t * sgnb_sec = &(ies_sgnb_addition_req->value.choice.SgNBSecurityKey);
214 sgnb_sec->buf = dinput.sgnb_security_key;
215 sgnb_sec->size = dinput.sgnb_security_key_size;
216 sgnb_sec->bits_unused = dinput.sgnb_security_key_unused;
219 ies_sgnb_addition_req= &IE_array[ie_index];
220 ies_sgnb_addition_req->criticality = Criticality_reject;
221 ies_sgnb_addition_req->id = ProtocolIE_ID_id_SgNBUEAggregateMaximumBitRate;
222 ies_sgnb_addition_req->value.present = SgNBAdditionRequest_IEs__value_PR_UEAggregateMaximumBitRate;
223 UEAggregateMaximumBitRate_t * ue_rates = &(ies_sgnb_addition_req->value.choice.UEAggregateMaximumBitRate);
225 // clear buffer if previously allocated
226 if (ue_rates->uEaggregateMaximumBitRateDownlink.size > 0){
227 ue_rates->uEaggregateMaximumBitRateDownlink.size = 0;
228 free(ue_rates->uEaggregateMaximumBitRateDownlink.buf);
231 if (ue_rates->uEaggregateMaximumBitRateUplink.size > 0){
232 ue_rates->uEaggregateMaximumBitRateUplink.size = 0;
233 free(ue_rates->uEaggregateMaximumBitRateUplink.buf);
236 /* To do : Fix malloc done by this operation */
237 asn_long2INTEGER(&(ue_rates->uEaggregateMaximumBitRateDownlink), dinput.bit_rate_max_dn);
238 asn_long2INTEGER(&(ue_rates->uEaggregateMaximumBitRateUplink), dinput.bit_rate_max_up);
242 ies_sgnb_addition_req= &IE_array[ie_index];
243 ies_sgnb_addition_req->criticality = Criticality_reject;
244 ies_sgnb_addition_req->id = ProtocolIE_ID_id_MeNBtoSgNBContainer ;
245 ies_sgnb_addition_req->value.present = SgNBAdditionRequest_IEs__value_PR_MeNBtoSgNBContainer;
246 MeNBtoSgNBContainer_t * metosg_container = &(ies_sgnb_addition_req->value.choice.MeNBtoSgNBContainer);
248 metosg_container->buf = dinput.menb_sgnb_container;
249 metosg_container->size = dinput.menb_sgnb_container_size;
253 ies_sgnb_addition_req= &IE_array[ie_index];
254 ies_sgnb_addition_req->criticality = Criticality_reject;
255 ies_sgnb_addition_req->id = ProtocolIE_ID_id_MeNBCell_ID ;
256 ies_sgnb_addition_req->value.present = SgNBAdditionRequest_IEs__value_PR_ECGI;
257 ECGI_t * menb_ecgi = &(ies_sgnb_addition_req->value.choice.ECGI);
259 menb_ecgi->pLMN_Identity.buf = dinput.plmn_identity;
260 menb_ecgi->pLMN_Identity.size = dinput.plmn_identity_size;
262 menb_ecgi->eUTRANcellIdentifier.buf = dinput.eutran_identifier;
263 menb_ecgi->eUTRANcellIdentifier.size = dinput.eutran_identifier_size;
264 menb_ecgi->eUTRANcellIdentifier.bits_unused = 4;
267 ies_sgnb_addition_req = &IE_array[ie_index];
268 ies_sgnb_addition_req->criticality = Criticality_reject;
269 ies_sgnb_addition_req->id = ProtocolIE_ID_id_SubscriberProfileIDforRFP;
270 ies_sgnb_addition_req->value.present = SgNBAdditionRequest_IEs__value_PR_SubscriberProfileIDforRFP;
271 ies_sgnb_addition_req->value.choice.SubscriberProfileIDforRFP = dinput.subscriber_profile_id;
273 // add erab-tobe-added list
275 ies_sgnb_addition_req= &IE_array[ie_index];
276 ies_sgnb_addition_req->criticality = Criticality_reject;
277 ies_sgnb_addition_req->id = ProtocolIE_ID_id_E_RABs_ToBeAdded_SgNBAddReqList;
278 ies_sgnb_addition_req->value.present = SgNBAdditionRequest_IEs__value_PR_E_RABs_ToBeAdded_SgNBAddReqList;
279 E_RABs_ToBeAdded_SgNBAddReqList_t * erabs_toadd_list = &(ies_sgnb_addition_req->value.choice.E_RABs_ToBeAdded_SgNBAddReqList);
281 std::vector<struct erab_item> * ref_erab_input = &(dinput.erab_list);
282 erabs_toadd_list->list.count = 0;
285 if (ref_erab_input->size() >= erab_array_size){
286 erab_array_size = 2 * ref_erab_input->size();
288 E_RABs_ToBeAdded_SgNBAddReq_ItemIEs_t * new_ref = 0;
289 new_ref = (E_RABs_ToBeAdded_SgNBAddReq_ItemIEs_t *)realloc(erab_array, erab_array_size * sizeof(E_RABs_ToBeAdded_SgNBAddReq_Item_t));
290 assert(new_ref != 0);
291 erab_array = new_ref;
293 erab_sgnb_present_array_size = 2 * ref_erab_input->size();
294 E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPpresent_t * new_present = 0;
295 new_present = (E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPpresent_t *)realloc(erab_sgnb_present_array, erab_sgnb_present_array_size * sizeof(E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPpresent_t ));
296 assert(new_present != 0);
297 erab_sgnb_present_array = new_present;
299 erab_sgnb_notpresent_array_size = 2 * ref_erab_input->size();
300 E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPnotpresent_t * new_notpresent = 0;
301 new_notpresent = (E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPnotpresent_t *)realloc(erab_sgnb_notpresent_array, erab_sgnb_notpresent_array_size * sizeof(E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPnotpresent_t ));
302 assert(new_notpresent != 0);
303 erab_sgnb_notpresent_array = new_notpresent;
308 int sgnb_present_index = 0;
309 int sgnb_notpresent_index = 0;
311 for(unsigned int i = 0; i < ref_erab_input->size(); i++){
314 erab_array[i].id = ProtocolIE_ID_id_E_RABs_ToBeAdded_SgNBAddReq_Item ;
315 erab_array[i].criticality = Criticality_reject;
316 erab_array[i].value.present = E_RABs_ToBeAdded_SgNBAddReq_ItemIEs__value_PR_E_RABs_ToBeAdded_SgNBAddReq_Item;
317 E_RABs_ToBeAdded_SgNBAddReq_Item_t * erab_item = &(erab_array[i].value.choice.E_RABs_ToBeAdded_SgNBAddReq_Item);
319 erab_item->e_RAB_ID = (*ref_erab_input)[i].erab_id;
320 erab_item->drb_ID = (*ref_erab_input)[i].drb_id;
322 erab_item->en_DC_ResourceConfiguration.pDCPatSgNB = (*ref_erab_input)[i].pdcp_at_sgnb;
323 erab_item->en_DC_ResourceConfiguration.mCGresources = (*ref_erab_input)[i].mcg_resources;
324 erab_item->en_DC_ResourceConfiguration.sCGresources = (*ref_erab_input)[i].scg_resources;
326 erab_item->resource_configuration.present = (E_RABs_ToBeAdded_SgNBAddReq_Item__resource_configuration_PR)(*ref_erab_input)[i].sgnb_pdcp_present;
329 if( erab_item->resource_configuration.present == E_RABs_ToBeAdded_SgNBAddReq_Item__resource_configuration_PR_sgNBPDCPpresent){
330 erab_sgnb_present_array[sgnb_present_index].full_E_RAB_Level_QoS_Parameters.qCI = (*ref_erab_input)[i].sgnb_item.qci;
331 erab_sgnb_present_array[sgnb_present_index].full_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.priorityLevel = (*ref_erab_input)[i].sgnb_item.priority_level;
332 erab_sgnb_present_array[sgnb_present_index].full_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.pre_emptionCapability = (*ref_erab_input)[i].sgnb_item.pre_emption_capability;
333 erab_sgnb_present_array[sgnb_present_index].full_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.pre_emptionVulnerability = (*ref_erab_input)[i].sgnb_item.pre_emption_vulnerability;
335 erab_sgnb_present_array[sgnb_present_index].s1_UL_GTPtunnelEndpoint.transportLayerAddress.buf = (*ref_erab_input)[i].sgnb_item.transport_layer_addr;
336 erab_sgnb_present_array[sgnb_present_index].s1_UL_GTPtunnelEndpoint.transportLayerAddress.size = (*ref_erab_input)[i].sgnb_item.transport_layer_addr_size;
337 erab_sgnb_present_array[sgnb_present_index].s1_UL_GTPtunnelEndpoint.transportLayerAddress.bits_unused = (*ref_erab_input)[i].sgnb_item.transport_layer_addr_unused;
339 erab_sgnb_present_array[sgnb_present_index].s1_UL_GTPtunnelEndpoint.gTP_TEID.buf = (*ref_erab_input)[i].sgnb_item.gtp_tei;
340 erab_sgnb_present_array[sgnb_present_index].s1_UL_GTPtunnelEndpoint.gTP_TEID.size = (*ref_erab_input)[i].sgnb_item.gtp_tei_size;
342 /* Force all optional parameters that are not set to NULL */
343 erab_sgnb_present_array[sgnb_present_index].max_MCG_admit_E_RAB_Level_QoS_Parameters = NULL;
344 erab_sgnb_present_array[sgnb_present_index].dL_Forwarding = NULL;
345 erab_sgnb_present_array[sgnb_present_index].meNB_DL_GTP_TEIDatMCG = NULL;
348 /* validate constraints ..*/
351 ret_constr = asn_check_constraints(&asn_DEF_AllocationAndRetentionPriority, &erab_sgnb_present_array[sgnb_present_index].full_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority, errbuf, &errbuf_len);
353 error_string.assign(&errbuf[0], errbuf_len);
354 error_string = "Error in constraints for Allocation Priority.. Reason = " + error_string;
358 ret_constr = asn_check_constraints(&asn_DEF_E_RAB_Level_QoS_Parameters, &erab_sgnb_present_array[sgnb_present_index].full_E_RAB_Level_QoS_Parameters, errbuf, &errbuf_len);
360 error_string.assign(&errbuf[0], errbuf_len);
361 error_string = "Error in constraints for ERAB QoS Parameters.. Reason = " + error_string;
366 ret_constr = asn_check_constraints(&asn_DEF_GTP_TEI, &erab_sgnb_present_array[sgnb_present_index].s1_UL_GTPtunnelEndpoint.gTP_TEID, errbuf, &errbuf_len);
368 error_string.assign(&errbuf[0], errbuf_len);
369 error_string = "Error in constraints for GTP TEID.. Reason = " + error_string;
373 ret_constr = asn_check_constraints(&asn_DEF_GTPtunnelEndpoint, &erab_sgnb_present_array[sgnb_present_index].s1_UL_GTPtunnelEndpoint, errbuf, &errbuf_len);
375 error_string.assign(&errbuf[0], errbuf_len);
376 error_string = "Error in constraints for GTP tunnel endpoint .. Reason = " + error_string;
381 ret_constr = asn_check_constraints(&asn_DEF_E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPpresent, &erab_sgnb_present_array[sgnb_present_index], errbuf, &errbuf_len);
383 error_string.assign(&errbuf[0], errbuf_len);
384 error_string = "Error in constraints for E_RABS_ToBeAdded_SgNBAddReq_SgNBPDCPpresent.. Reason = " + error_string;
389 erab_item->resource_configuration.choice.sgNBPDCPpresent = &erab_sgnb_present_array[sgnb_present_index];
391 sgnb_present_index ++;
394 else if (erab_item->resource_configuration.present == E_RABs_ToBeAdded_SgNBAddReq_Item__resource_configuration_PR_sgNBPDCPnotpresent){
397 erab_sgnb_notpresent_array[sgnb_notpresent_index].requested_SCG_E_RAB_Level_QoS_Parameters.qCI = (*ref_erab_input)[i].sgnb_item.qci;
398 erab_sgnb_notpresent_array[sgnb_notpresent_index].requested_SCG_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.priorityLevel = (*ref_erab_input)[i].sgnb_item.priority_level;
399 erab_sgnb_notpresent_array[sgnb_notpresent_index].requested_SCG_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.pre_emptionCapability = (*ref_erab_input)[i].sgnb_item.pre_emption_capability;
400 erab_sgnb_notpresent_array[sgnb_notpresent_index].requested_SCG_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.pre_emptionVulnerability = (*ref_erab_input)[i].sgnb_item.pre_emption_vulnerability;
401 erab_sgnb_notpresent_array[sgnb_notpresent_index].requested_SCG_E_RAB_Level_QoS_Parameters.gbrQosInformation = 0;
403 erab_sgnb_notpresent_array[sgnb_notpresent_index].meNB_UL_GTP_TEIDatPDCP.transportLayerAddress.buf = (*ref_erab_input)[i].sgnb_item.transport_layer_addr;
404 erab_sgnb_notpresent_array[sgnb_notpresent_index].meNB_UL_GTP_TEIDatPDCP.transportLayerAddress.size = (*ref_erab_input)[i].sgnb_item.transport_layer_addr_size;
405 erab_sgnb_notpresent_array[sgnb_notpresent_index].meNB_UL_GTP_TEIDatPDCP.transportLayerAddress.bits_unused = (*ref_erab_input)[i].sgnb_item.transport_layer_addr_unused;
407 erab_sgnb_notpresent_array[sgnb_notpresent_index].meNB_UL_GTP_TEIDatPDCP.gTP_TEID.buf = (unsigned char *)(*ref_erab_input)[i].sgnb_item.gtp_tei;
408 erab_sgnb_notpresent_array[sgnb_notpresent_index].meNB_UL_GTP_TEIDatPDCP.gTP_TEID.size = (*ref_erab_input)[i].sgnb_item.gtp_tei_size;
410 erab_sgnb_notpresent_array[sgnb_notpresent_index].rlc_Mode = (*ref_erab_input)[i].sgnb_item.rlc_mode;
412 /* validate constraints ..*/
415 ret_constr = asn_check_constraints(&asn_DEF_AllocationAndRetentionPriority, &erab_sgnb_notpresent_array[sgnb_notpresent_index].requested_SCG_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority, errbuf, &errbuf_len);
417 error_string.assign(&errbuf[0], errbuf_len);
418 error_string = "Error in constraints for Allocation Priority.. Reason = " + error_string;
422 ret_constr = asn_check_constraints(&asn_DEF_E_RAB_Level_QoS_Parameters, &erab_sgnb_notpresent_array[sgnb_notpresent_index].requested_SCG_E_RAB_Level_QoS_Parameters, errbuf, &errbuf_len);
424 error_string.assign(&errbuf[0], errbuf_len);
425 error_string = "Error in constraints for ERAB QoS Parameters.. Reason = " + error_string;
430 ret_constr = asn_check_constraints(&asn_DEF_GTP_TEI, &erab_sgnb_notpresent_array[sgnb_notpresent_index].meNB_UL_GTP_TEIDatPDCP.gTP_TEID, errbuf, &errbuf_len);
432 error_string.assign(&errbuf[0], errbuf_len);
433 error_string = "Error in constraints for GTP TEID.. Reason = " + error_string;
437 ret_constr = asn_check_constraints(&asn_DEF_GTPtunnelEndpoint, &erab_sgnb_notpresent_array[sgnb_notpresent_index].meNB_UL_GTP_TEIDatPDCP, errbuf, &errbuf_len);
439 error_string.assign(&errbuf[0], errbuf_len);
440 error_string = "Error in constraints for GTP tunnel endpoint .. Reason = " + error_string;
445 ret_constr = asn_check_constraints(&asn_DEF_E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPnotpresent, &erab_sgnb_notpresent_array[sgnb_notpresent_index], errbuf, &errbuf_len);
447 error_string.assign(&errbuf[0], errbuf_len);
448 error_string = "Error in constraints for E_RABS_ToBeAdded_SgNBAddReq_SgNBPDCPnotpresent.. Reason = " + error_string;
453 /* Force all optional parameters that are not set to NULL */
454 erab_sgnb_notpresent_array[sgnb_notpresent_index].uL_Configuration = 0;
455 erab_sgnb_notpresent_array[sgnb_notpresent_index].secondary_meNB_UL_GTP_TEIDatPDCP = 0;
458 erab_item->resource_configuration.choice.sgNBPDCPnotpresent = &erab_sgnb_notpresent_array[sgnb_notpresent_index]; ;
459 sgnb_notpresent_index ++;
466 int ret_constr = asn_check_constraints(&asn_DEF_E_RABs_ToBeAdded_SgNBAddReq_ItemIEs, &erab_array[i], errbuf, &errbuf_len);
468 error_string.assign(&errbuf[0], errbuf_len);
469 error_string = "Error in constraints for E_RABS_ToBeAdded_SgNBAddReq_ItemIEs.. Reason = " + error_string;
473 ASN_SEQUENCE_ADD(erabs_toadd_list, &erab_array[i]);
482 bool sgnb_addition_request::get_fields(X2InitiatingMessage_t * init_msg, sgnb_addition_helper & dout){
485 error_string = "Error ! Invalid reference for SgNB Addition Request get_fields";
492 struct erab_item * eitem;
493 std::vector<struct erab_item> *erab_list;
495 SgNBAdditionRequest_IEs_t *memb_ptr;
496 for(int edx = 0; edx < init_msg->value.choice.SgNBAdditionRequest.protocolIEs.list.count; edx++){
497 memb_ptr = init_msg->value.choice.SgNBAdditionRequest.protocolIEs.list.array[edx];
499 switch(memb_ptr->id){
501 case (ProtocolIE_ID_id_MeNB_UE_X2AP_ID):
502 dout.menb_ue_x2ap_id = memb_ptr->value.choice.UE_X2AP_ID;
505 case (ProtocolIE_ID_id_SelectedPLMN):
506 dout.selected_plmn = memb_ptr->value.choice.PLMN_Identity.buf;
507 dout.selected_plmn_size = memb_ptr->value.choice.PLMN_Identity.size;
510 case (ProtocolIE_ID_id_NRUESecurityCapabilities):
511 dout.encryption_algs = memb_ptr->value.choice.NRUESecurityCapabilities.nRencryptionAlgorithms.buf;
512 dout.encryption_algs_size = memb_ptr->value.choice.NRUESecurityCapabilities.nRencryptionAlgorithms.size;
513 dout.encryption_algs_unused = memb_ptr->value.choice.NRUESecurityCapabilities.nRencryptionAlgorithms.bits_unused;
515 dout.integrity_protection_algs= memb_ptr->value.choice.NRUESecurityCapabilities.nRintegrityProtectionAlgorithms.buf;
516 dout.integrity_protection_algs_size = memb_ptr->value.choice.NRUESecurityCapabilities.nRintegrityProtectionAlgorithms.size;
517 dout.integrity_protection_algs_unused = memb_ptr->value.choice.NRUESecurityCapabilities.nRintegrityProtectionAlgorithms.bits_unused;
521 case (ProtocolIE_ID_id_SgNBSecurityKey):
522 dout.sgnb_security_key = memb_ptr->value.choice.SgNBSecurityKey.buf;
523 dout.sgnb_security_key_size = memb_ptr->value.choice.SgNBSecurityKey.size;
524 dout.sgnb_security_key_unused = memb_ptr->value.choice.SgNBSecurityKey.bits_unused;
528 case (ProtocolIE_ID_id_SgNBUEAggregateMaximumBitRate):
529 res = asn_INTEGER2long(&(memb_ptr->value.choice.UEAggregateMaximumBitRate.uEaggregateMaximumBitRateDownlink), &dout.bit_rate_max_dn );
531 error_string = "Error converting uEaggregateMaximumBitRateDownlink ";
535 res = asn_INTEGER2long(&(memb_ptr->value.choice.UEAggregateMaximumBitRate.uEaggregateMaximumBitRateUplink), &dout.bit_rate_max_up );
537 error_string = "Error converting uEaggregateMaximumBitRateUplink ";
544 case (ProtocolIE_ID_id_MeNBtoSgNBContainer):
545 dout.menb_sgnb_container = memb_ptr->value.choice.MeNBtoSgNBContainer.buf;
546 dout.menb_sgnb_container_size = memb_ptr->value.choice.MeNBtoSgNBContainer.size;
549 case (ProtocolIE_ID_id_SgNB_UE_X2AP_ID):
550 dout.sgnb_ue_x2ap_id = memb_ptr->value.choice.SgNB_UE_X2AP_ID;
553 case (ProtocolIE_ID_id_SubscriberProfileIDforRFP):
554 //sgnb->subscriberprofileidforrfp = memb_ptr->value.choice.SubscriberProfileIDforRFP;
557 case (ProtocolIE_ID_id_MeNBCell_ID):
559 dout.eutran_identifier = memb_ptr->value.choice.ECGI.eUTRANcellIdentifier.buf;
560 dout.eutran_identifier_size = memb_ptr->value.choice.ECGI.eUTRANcellIdentifier.size;
561 dout.eutran_identifier_unused = memb_ptr->value.choice.ECGI.eUTRANcellIdentifier.bits_unused;
563 dout.plmn_identity = memb_ptr->value.choice.ECGI.pLMN_Identity.buf;
564 dout.plmn_identity_size = memb_ptr->value.choice.ECGI.pLMN_Identity.size;
567 case (ProtocolIE_ID_id_E_RABs_ToBeAdded_SgNBAddReqList):
569 erab_list = & dout.erab_list;
571 for(int erabs=0; erabs < memb_ptr->value.choice.E_RABs_ToBeAdded_SgNBAddReqList.list.count;erabs++){
572 E_RABs_ToBeAdded_SgNBAddReq_ItemIEs_t * erab_item_ie = (E_RABs_ToBeAdded_SgNBAddReq_ItemIEs_t *)memb_ptr->value.choice.E_RABs_ToBeAdded_SgNBAddReqList.list.array[erabs];
574 erab_list->emplace_back();
575 eitem = &(*erab_list)[erabs];
577 //erab_item *eitem = (erab_item*)calloc(1, sizeof(erab_item));
579 eitem->drb_id = erab_item_ie->value.choice.E_RABs_ToBeAdded_SgNBAddReq_Item.drb_ID;
580 eitem->erab_id = erab_item_ie->value.choice.E_RABs_ToBeAdded_SgNBAddReq_Item.e_RAB_ID;
582 eitem->mcg_resources = erab_item_ie->value.choice.E_RABs_ToBeAdded_SgNBAddReq_Item.en_DC_ResourceConfiguration.mCGresources;
583 eitem->scg_resources = erab_item_ie->value.choice.E_RABs_ToBeAdded_SgNBAddReq_Item.en_DC_ResourceConfiguration.sCGresources;
584 eitem->pdcp_at_sgnb = erab_item_ie->value.choice.E_RABs_ToBeAdded_SgNBAddReq_Item.en_DC_ResourceConfiguration.pDCPatSgNB;
585 eitem->sgnb_pdcp_present = erab_item_ie->value.choice.E_RABs_ToBeAdded_SgNBAddReq_Item.resource_configuration.present;
587 if(erab_item_ie->value.choice.E_RABs_ToBeAdded_SgNBAddReq_Item.resource_configuration.present == E_RABs_ToBeAdded_SgNBAddReq_Item__resource_configuration_PR_sgNBPDCPpresent){
589 E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPpresent_t *erab_sgnb_present_ie = erab_item_ie->value.choice.E_RABs_ToBeAdded_SgNBAddReq_Item.resource_configuration.choice.sgNBPDCPpresent;
591 eitem->sgnb_item.qci = erab_sgnb_present_ie->full_E_RAB_Level_QoS_Parameters.qCI;
592 eitem->sgnb_item.priority_level = erab_sgnb_present_ie->full_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.priorityLevel;
593 eitem->sgnb_item.pre_emption_capability = erab_sgnb_present_ie->full_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.pre_emptionCapability;
594 eitem->sgnb_item.pre_emption_vulnerability = erab_sgnb_present_ie->full_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.pre_emptionVulnerability;
597 eitem->sgnb_item.gtp_tei = erab_sgnb_present_ie->s1_UL_GTPtunnelEndpoint.gTP_TEID.buf;
598 eitem->sgnb_item.gtp_tei_size = erab_sgnb_present_ie->s1_UL_GTPtunnelEndpoint.gTP_TEID.size;
600 eitem->sgnb_item.transport_layer_addr = erab_sgnb_present_ie->s1_UL_GTPtunnelEndpoint.transportLayerAddress.buf;
601 eitem->sgnb_item.transport_layer_addr_size = erab_sgnb_present_ie->s1_UL_GTPtunnelEndpoint.transportLayerAddress.size;
602 eitem->sgnb_item.transport_layer_addr_unused = erab_sgnb_present_ie->s1_UL_GTPtunnelEndpoint.transportLayerAddress.bits_unused;
606 else if(erab_item_ie->value.choice.E_RABs_ToBeAdded_SgNBAddReq_Item.resource_configuration.present == E_RABs_ToBeAdded_SgNBAddReq_Item__resource_configuration_PR_sgNBPDCPnotpresent){
607 E_RABs_ToBeAdded_SgNBAddReq_Item_SgNBPDCPnotpresent_t *erab_sgnb_notpresent_ie = erab_item_ie->value.choice.E_RABs_ToBeAdded_SgNBAddReq_Item.resource_configuration.choice.sgNBPDCPnotpresent;
608 eitem->sgnb_item.rlc_mode = erab_sgnb_notpresent_ie->rlc_Mode;
609 eitem->sgnb_item.gtp_tei = erab_sgnb_notpresent_ie->meNB_UL_GTP_TEIDatPDCP.gTP_TEID.buf;
610 eitem->sgnb_item.gtp_tei_size = erab_sgnb_notpresent_ie->meNB_UL_GTP_TEIDatPDCP.gTP_TEID.size;
611 eitem->sgnb_item.transport_layer_addr = erab_sgnb_notpresent_ie->meNB_UL_GTP_TEIDatPDCP.transportLayerAddress.buf;
612 eitem->sgnb_item.transport_layer_addr_size = erab_sgnb_notpresent_ie->meNB_UL_GTP_TEIDatPDCP.transportLayerAddress.size;
613 eitem->sgnb_item.transport_layer_addr_unused = erab_sgnb_notpresent_ie->meNB_UL_GTP_TEIDatPDCP.transportLayerAddress.bits_unused;
615 eitem->sgnb_item.qci = erab_sgnb_notpresent_ie->requested_SCG_E_RAB_Level_QoS_Parameters.qCI;
616 eitem->sgnb_item.pre_emption_capability = erab_sgnb_notpresent_ie->requested_SCG_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.pre_emptionCapability;
617 eitem->sgnb_item.pre_emption_vulnerability = erab_sgnb_notpresent_ie->requested_SCG_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.pre_emptionVulnerability;
618 eitem->sgnb_item.priority_level = erab_sgnb_notpresent_ie->requested_SCG_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.priorityLevel;
622 mdclog_write(MDCLOG_ERR, "Error :: %s, %d :: E-RAB does not have sgNBPDCP present/not present set flag", __FILE__, __LINE__);