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 ==================================================================================
19 * sgnb_addition_response.cc
21 * Created on: Aug 22, 2019
25 #include <sgnb_addition_response.hpp>
27 sgnb_addition_response::sgnb_addition_response(void ) {
31 x2ap_pdu_obj = (X2N_X2AP_PDU_t * )calloc(1, sizeof(X2N_X2AP_PDU_t));
32 assert(x2ap_pdu_obj != 0);
35 successMsg = (X2N_SuccessfulOutcome_t * )calloc(1, sizeof(X2N_SuccessfulOutcome_t));
36 assert(successMsg != 0);
39 unsuccessMsg = (X2N_UnsuccessfulOutcome_t * )calloc(1, sizeof(X2N_UnsuccessfulOutcome_t));
40 assert(unsuccessMsg != 0);
43 IE_array = (X2N_SgNBAdditionRequestAcknowledge_IEs_t *)calloc(NUM_SGNB_ADDITION_RESPONSE_ACKNOWLEDGE_IES, sizeof(X2N_SgNBAdditionRequestAcknowledge_IEs_t));
44 assert(IE_array != 0);
47 IE_reject_array = (X2N_SgNBAdditionRequestReject_IEs_t *)calloc(NUM_SGNB_ADDITION_RESPONSE_FAILURE_IES, sizeof(X2N_SgNBAdditionRequestReject_IEs_t));
48 assert(IE_reject_array != 0);
52 erab_admit_array = (X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_ItemIEs_t * ) calloc(INITIAL_SIZE, sizeof(X2N_E_RABs_ToBeAdded_SgNBAddReq_ItemIEs_t));
53 assert(erab_admit_array != 0);
54 erab_admit_array_size = INITIAL_SIZE;
57 erab_sgnb_present_array = 0;
58 erab_sgnb_present_array = (X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item_SgNBPDCPpresent_t *) calloc(INITIAL_SIZE, sizeof(X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item_SgNBPDCPpresent_t));
59 assert(erab_sgnb_present_array != 0);
60 erab_sgnb_present_array_size = INITIAL_SIZE;
62 erab_sgnb_notpresent_array = 0;
63 erab_sgnb_notpresent_array = (X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item_SgNBPDCPnotpresent_t *) calloc(INITIAL_SIZE, sizeof(X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item_SgNBPDCPnotpresent_t));
64 assert(erab_sgnb_notpresent_array != 0);
65 erab_sgnb_notpresent_array_size = INITIAL_SIZE;
70 sgnb_addition_response::~sgnb_addition_response(void){
72 mdclog_write(MDCLOG_DEBUG, "Freeing X2AP SgNB Addition Response object memory");
74 X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAckList_t * erabs_toadd_list = &(IE_array[3].value.choice.E_RABs_Admitted_ToBeAdded_SgNBAddReqAckList);
75 for(int i = 0; i < erabs_toadd_list->list.size; i++){
76 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);
86 free(erab_sgnb_notpresent_array);
87 free(erab_admit_array);
89 X2N_SgNBAdditionRequestAcknowledge_t *sgnb_ack = &(successMsg->value.choice.SgNBAdditionRequestAcknowledge);
90 for(int i = 0; i < sgnb_ack->protocolIEs.list.size; i++){
91 sgnb_ack->protocolIEs.list.array[i] = 0;
94 if (sgnb_ack->protocolIEs.list.size > 0){
95 free(sgnb_ack->protocolIEs.list.array);
96 sgnb_ack->protocolIEs.list.array = 0;
97 sgnb_ack->protocolIEs.list.size = 0;
100 X2N_SgNBAdditionRequestReject_t *sgnb_reject = &(unsuccessMsg->value.choice.SgNBAdditionRequestReject);
101 for(int i = 0; i < sgnb_reject->protocolIEs.list.size; i++){
102 sgnb_reject->protocolIEs.list.array[i] = 0;
105 if (sgnb_reject->protocolIEs.list.size > 0){
106 free(sgnb_reject->protocolIEs.list.array);
107 sgnb_reject->protocolIEs.list.array = 0;
108 sgnb_reject->protocolIEs.list.size = 0;
113 free(IE_reject_array);
117 x2ap_pdu_obj->choice.initiatingMessage = NULL;
118 x2ap_pdu_obj->present = X2N_X2AP_PDU_PR_NOTHING;
120 ASN_STRUCT_FREE(asn_DEF_X2N_X2AP_PDU, x2ap_pdu_obj);
122 mdclog_write(MDCLOG_DEBUG, "Freed X2AP X2_SgNB Addition Response object memory");
125 bool sgnb_addition_response::set_fields(X2N_UnsuccessfulOutcome_t * unsuccessMsg, sgnb_addition_helper &sgnb_data){
127 unsigned ie_index = 0;
129 if (unsuccessMsg == 0){
130 error_string = "Invalid reference for X2AP Sgnb Addition Reject message in set_fields";
134 X2N_SgNBAdditionRequestReject_t * sgnb_reject = &(unsuccessMsg->value.choice.SgNBAdditionRequestReject);
135 X2N_SgNBAdditionRequestReject_IEs_t *ies_sgnb_add_reject;
136 sgnb_reject->protocolIEs.list.count = 0;
139 ies_sgnb_add_reject= &IE_reject_array[ie_index];
140 ies_sgnb_add_reject->criticality = X2N_Criticality_reject;
141 ies_sgnb_add_reject->id = X2N_ProtocolIE_ID_id_MeNB_UE_X2AP_ID;
142 ies_sgnb_add_reject->value.present = X2N_SgNBAdditionRequestReject_IEs__value_PR_UE_X2AP_ID;
143 ies_sgnb_add_reject->value.choice.UE_X2AP_ID = sgnb_data.menb_ue_x2ap_id;
144 ASN_SEQUENCE_ADD(&(sgnb_reject->protocolIEs), &(IE_reject_array[ie_index]));
148 ies_sgnb_add_reject= &IE_reject_array[ie_index];
149 ies_sgnb_add_reject->criticality = X2N_Criticality_reject;
150 ies_sgnb_add_reject->id = X2N_ProtocolIE_ID_id_SgNB_UE_X2AP_ID;
151 ies_sgnb_add_reject->value.present = X2N_SgNBAdditionRequestReject_IEs__value_PR_SgNB_UE_X2AP_ID;
152 ies_sgnb_add_reject->value.choice.SgNB_UE_X2AP_ID = sgnb_data.sgnb_ue_x2ap_id;
153 ASN_SEQUENCE_ADD(&(sgnb_reject->protocolIEs), &(IE_reject_array[ie_index]));
157 ies_sgnb_add_reject= &IE_reject_array[ie_index];
158 ies_sgnb_add_reject->criticality = X2N_Criticality_reject;
159 ies_sgnb_add_reject->id = X2N_ProtocolIE_ID_id_Cause;
160 ies_sgnb_add_reject->value.present = X2N_SgNBAdditionRequestReject_IEs__value_PR_Cause;
161 X2N_Cause_t *caus = &ies_sgnb_add_reject->value.choice.Cause;
163 switch(sgnb_data.cause)
165 case X2N_Cause_PR_misc: //Misc
166 caus->present = X2N_Cause_PR_misc;
167 caus->choice.misc = sgnb_data.cause_desc;
169 case X2N_Cause_PR_radioNetwork: //radio network
170 caus->present = X2N_Cause_PR_radioNetwork;
171 caus->choice.radioNetwork = sgnb_data.cause_desc;
173 case X2N_Cause_PR_protocol : //protocol
174 caus->present = X2N_Cause_PR_protocol;
175 caus->choice.protocol = sgnb_data.cause_desc;
177 case X2N_Cause_PR_transport: //transport
178 caus->present = X2N_Cause_PR_transport;
179 caus->choice.transport = sgnb_data.cause_desc;
183 caus->present = X2N_Cause_PR_NOTHING;
187 ASN_SEQUENCE_ADD(&(sgnb_reject->protocolIEs), &(IE_reject_array[ie_index]));
194 bool sgnb_addition_response::set_fields(X2N_SuccessfulOutcome_t * successMsg, sgnb_addition_helper &sgnb_data){
196 unsigned ie_index = 0;
198 if (successMsg == 0){
199 error_string = "Invalid reference for X2AP Sgnb Addition Acknowledge message in set_fields";
203 X2N_SgNBAdditionRequestAcknowledge_t * sgnb_ack = &(successMsg->value.choice.SgNBAdditionRequestAcknowledge);
204 sgnb_ack->protocolIEs.list.count = 0;
206 X2N_SgNBAdditionRequestAcknowledge_IEs_t *ies_sgnb_add_ack;
209 ies_sgnb_add_ack= &IE_array[ie_index];
210 ies_sgnb_add_ack->criticality = X2N_Criticality_reject;
211 ies_sgnb_add_ack->id = X2N_ProtocolIE_ID_id_MeNB_UE_X2AP_ID;
212 ies_sgnb_add_ack->value.present = X2N_SgNBAdditionRequestAcknowledge_IEs__value_PR_UE_X2AP_ID;
213 ies_sgnb_add_ack->value.choice.UE_X2AP_ID = sgnb_data.menb_ue_x2ap_id;
214 ASN_SEQUENCE_ADD(&(sgnb_ack->protocolIEs), &(IE_array[ie_index]));
218 ies_sgnb_add_ack= &IE_array[ie_index];
219 ies_sgnb_add_ack->criticality = X2N_Criticality_reject;
220 ies_sgnb_add_ack->id = X2N_ProtocolIE_ID_id_SgNB_UE_X2AP_ID;
221 ies_sgnb_add_ack->value.present = X2N_SgNBAdditionRequestAcknowledge_IEs__value_PR_SgNB_UE_X2AP_ID;
222 ies_sgnb_add_ack->value.choice.SgNB_UE_X2AP_ID = sgnb_data.sgnb_ue_x2ap_id;
223 ASN_SEQUENCE_ADD(&(sgnb_ack->protocolIEs), &(IE_array[ie_index]));
226 ies_sgnb_add_ack= &IE_array[ie_index];
227 ies_sgnb_add_ack->criticality = X2N_Criticality_reject;
228 ies_sgnb_add_ack->id = X2N_ProtocolIE_ID_id_SgNBtoMeNBContainer;
229 ies_sgnb_add_ack->value.present = X2N_SgNBAdditionRequestAcknowledge_IEs__value_PR_SgNBtoMeNBContainer;
230 X2N_SgNBtoMeNBContainer_t *container = &ies_sgnb_add_ack->value.choice.SgNBtoMeNBContainer;
231 container->buf = sgnb_data.menb_sgnb_container;
232 container->size = sgnb_data.menb_sgnb_container_size;
233 ASN_SEQUENCE_ADD(&(sgnb_ack->protocolIEs), &(IE_array[ie_index]));
236 ies_sgnb_add_ack = &IE_array[ie_index];
237 ies_sgnb_add_ack->criticality = X2N_Criticality_reject;
238 ies_sgnb_add_ack->id = X2N_ProtocolIE_ID_id_E_RABs_Admitted_ToBeAdded_SgNBAddReqAckList;
240 int lcount = sgnb_data.erab_list.size();
242 ies_sgnb_add_ack->value.present = X2N_SgNBAdditionRequestAcknowledge_IEs__value_PR_E_RABs_Admitted_ToBeAdded_SgNBAddReqAckList;
243 X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAckList_t * erabs_toadd_list = &(ies_sgnb_add_ack->value.choice.E_RABs_Admitted_ToBeAdded_SgNBAddReqAckList);
246 //std::cout <<"Adding " << lcount << " erabs in response" << std::endl;
248 //resize empty array in constructor
249 if (lcount >= erab_admit_array_size){
250 erab_admit_array_size = 2*lcount;
251 free(erab_admit_array);
252 erab_admit_array = (X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_ItemIEs_t * ) calloc(erab_admit_array_size, sizeof(X2N_E_RABs_ToBeAdded_SgNBAddReq_ItemIEs_t));
253 assert(erab_admit_array != 0);
255 erab_sgnb_present_array_size = 2 * lcount;
256 free(erab_sgnb_present_array);
257 erab_sgnb_present_array = (X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item_SgNBPDCPpresent_t *) calloc(erab_sgnb_present_array_size, sizeof(X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item_SgNBPDCPpresent_t));
258 assert(erab_sgnb_present_array != 0);
260 erab_sgnb_notpresent_array_size = 2 * lcount;
261 free(erab_sgnb_notpresent_array);
262 erab_sgnb_notpresent_array = (X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item_SgNBPDCPnotpresent_t *) calloc(erab_sgnb_notpresent_array_size, sizeof(X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item_SgNBPDCPnotpresent_t));
263 assert(erab_sgnb_notpresent_array != 0);
266 std::vector<struct erab_item> * ref_erab_input = &(sgnb_data.erab_list);
267 erabs_toadd_list->list.count = 0;
269 int sgnb_present_index = 0;
270 int sgnb_notpresent_index = 0;
272 for(unsigned int i = 0; i < lcount; i++){
274 erab_admit_array[i].id = X2N_ProtocolIE_ID_id_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item ;
275 erab_admit_array[i].criticality = X2N_Criticality_ignore;
276 erab_admit_array[i].value.present = X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_ItemIEs__value_PR_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item;
278 X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item_t * erab_item = &(erab_admit_array[i].value.choice.E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item);
280 erab_item->e_RAB_ID = (*ref_erab_input)[i].erab_id;
281 erab_item->en_DC_ResourceConfiguration.pDCPatSgNB = (*ref_erab_input)[i].pdcp_at_sgnb;
282 erab_item->en_DC_ResourceConfiguration.mCGresources = (*ref_erab_input)[i].mcg_resources;
283 erab_item->en_DC_ResourceConfiguration.sCGresources = (*ref_erab_input)[i].scg_resources;
286 erab_item->resource_configuration.present = (X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item__resource_configuration_PR)(*ref_erab_input)[i].sgnb_pdcp_present;
287 if( erab_item->resource_configuration.present == X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item__resource_configuration_PR_sgNBPDCPpresent){
289 erab_sgnb_present_array[sgnb_present_index].s1_DL_GTPtunnelEndpoint.transportLayerAddress.buf = (*ref_erab_input)[i].sgnb_item.transport_layer_addr;
290 erab_sgnb_present_array[sgnb_present_index].s1_DL_GTPtunnelEndpoint.transportLayerAddress.size = (*ref_erab_input)[i].sgnb_item.transport_layer_addr_size;
291 erab_sgnb_present_array[sgnb_present_index].s1_DL_GTPtunnelEndpoint.transportLayerAddress.bits_unused = (*ref_erab_input)[i].sgnb_item.transport_layer_addr_unused;
293 erab_sgnb_present_array[sgnb_present_index].s1_DL_GTPtunnelEndpoint.gTP_TEID.buf = (*ref_erab_input)[i].sgnb_item.gtp_tei;
294 erab_sgnb_present_array[sgnb_present_index].s1_DL_GTPtunnelEndpoint.gTP_TEID.size = (*ref_erab_input)[i].sgnb_item.gtp_tei_size;
296 /* Force all optional parameters that are not set to NULL */
297 erab_sgnb_present_array[sgnb_present_index].sgNB_UL_GTP_TEIDatPDCP = NULL;
299 /* validate constraints ..*/
301 ret_constr = asn_check_constraints(&asn_DEF_X2N_GTP_TEI, &erab_sgnb_present_array[sgnb_present_index].s1_DL_GTPtunnelEndpoint.gTP_TEID, errbuf, &errbuf_len);
303 error_string.assign(&errbuf[0], errbuf_len);
304 error_string = "Error in constraints for GTP TEID.. Reason = " + error_string;
308 ret_constr = asn_check_constraints(&asn_DEF_X2N_GTPtunnelEndpoint, &erab_sgnb_present_array[sgnb_present_index].s1_DL_GTPtunnelEndpoint, errbuf, &errbuf_len);
310 error_string.assign(&errbuf[0], errbuf_len);
311 error_string = "Error in constraints for GTP tunnel endpoint .. Reason = " + error_string;
315 ret_constr = asn_check_constraints(&asn_DEF_X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item_SgNBPDCPpresent, &erab_sgnb_present_array[sgnb_present_index], errbuf, &errbuf_len);
317 error_string.assign(&errbuf[0], errbuf_len);
318 error_string = "Error in constraints for E_RABS_ToBeAdded_SgNBAddReq_SgNBPDCPpresent.. Reason = " + error_string;
322 erab_item->resource_configuration.choice.sgNBPDCPpresent = &erab_sgnb_present_array[sgnb_present_index];
323 sgnb_present_index ++;
326 else if (erab_item->resource_configuration.present == X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item__resource_configuration_PR_sgNBPDCPnotpresent){
328 erab_sgnb_notpresent_array[sgnb_notpresent_index].sgNB_DL_GTP_TEIDatSCG.transportLayerAddress.buf = (*ref_erab_input)[i].sgnb_item.transport_layer_addr;
329 erab_sgnb_notpresent_array[sgnb_notpresent_index].sgNB_DL_GTP_TEIDatSCG.transportLayerAddress.size = (*ref_erab_input)[i].sgnb_item.transport_layer_addr_size;
330 erab_sgnb_notpresent_array[sgnb_notpresent_index].sgNB_DL_GTP_TEIDatSCG.transportLayerAddress.bits_unused = (*ref_erab_input)[i].sgnb_item.transport_layer_addr_unused;
332 erab_sgnb_notpresent_array[sgnb_notpresent_index].sgNB_DL_GTP_TEIDatSCG.gTP_TEID.buf = (unsigned char *)(*ref_erab_input)[i].sgnb_item.gtp_tei;
333 erab_sgnb_notpresent_array[sgnb_notpresent_index].sgNB_DL_GTP_TEIDatSCG.gTP_TEID.size = (*ref_erab_input)[i].sgnb_item.gtp_tei_size;
335 erab_sgnb_notpresent_array[sgnb_notpresent_index].secondary_sgNB_DL_GTP_TEIDatSCG = NULL;
337 /* validate constraints ..*/
339 ret_constr = asn_check_constraints(&asn_DEF_X2N_GTPtunnelEndpoint, &erab_sgnb_notpresent_array[sgnb_notpresent_index].sgNB_DL_GTP_TEIDatSCG, errbuf, &errbuf_len);
341 error_string.assign(&errbuf[0], errbuf_len);
342 error_string = "Error in constraints for GTP tunnel endpoint .. Reason = " + error_string;
347 ret_constr = asn_check_constraints(&asn_DEF_X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_Item_SgNBPDCPnotpresent, &erab_sgnb_notpresent_array[sgnb_notpresent_index], errbuf, &errbuf_len);
349 error_string.assign(&errbuf[0], errbuf_len);
350 error_string = "Error in constraints for E_RABS_ToBeAdded_SgNBAddReq_SgNBPDCPnotpresent.. Reason = " + error_string;
354 erab_item->resource_configuration.choice.sgNBPDCPnotpresent = &erab_sgnb_notpresent_array[sgnb_notpresent_index]; ;
355 sgnb_notpresent_index ++;
358 std::cerr <<"Could not find a pdcp present or not present flag. not adding erab item .." << std::endl;
363 int ret_constr = asn_check_constraints(&asn_DEF_X2N_E_RABs_Admitted_ToBeAdded_SgNBAddReqAck_ItemIEs, &erab_admit_array[i], errbuf, &errbuf_len);
365 error_string.assign(&errbuf[0], errbuf_len);
366 error_string = "Error in constraints for E_RABS_Admitted_ToBeAdded_SgNBAddReqAck_ItemIEs.. Reason = " + error_string;
370 ASN_SEQUENCE_ADD(erabs_toadd_list, &erab_admit_array[i]);
374 ies_sgnb_add_ack->value.present = X2N_SgNBAdditionRequestAcknowledge_IEs__value_PR_NOTHING;
377 ASN_SEQUENCE_ADD(&(sgnb_ack->protocolIEs), &(IE_array[ie_index]));
381 bool sgnb_addition_response::encode_sgnb_addition_response(unsigned char* data_buf, size_t *data_size, sgnb_addition_helper &sgnb_data, bool sgnb_response)
385 if(sgnb_response == true){
387 x2ap_pdu_obj->present = X2N_X2AP_PDU_PR_successfulOutcome;
388 x2ap_pdu_obj->choice.successfulOutcome = successMsg;
390 successMsg->procedureCode = X2N_ProcedureCode_id_sgNBAdditionPreparation;
391 successMsg->criticality = X2N_Criticality_ignore;
392 successMsg->value.present = X2N_SuccessfulOutcome__value_PR_SgNBAdditionRequestAcknowledge;
394 res = set_fields(successMsg, sgnb_data);
398 x2ap_pdu_obj->present = X2N_X2AP_PDU_PR_unsuccessfulOutcome;
399 x2ap_pdu_obj->choice.unsuccessfulOutcome = unsuccessMsg;
402 unsuccessMsg->procedureCode = X2N_ProcedureCode_id_sgNBAdditionPreparation;
403 unsuccessMsg->criticality = X2N_Criticality_ignore;
404 unsuccessMsg->value.present = X2N_UnsuccessfulOutcome__value_PR_SgNBAdditionRequestReject;
406 res = set_fields(unsuccessMsg, sgnb_data);
413 int ret_constr = asn_check_constraints(&asn_DEF_X2N_X2AP_PDU, x2ap_pdu_obj, errbuf, &errbuf_len);
415 error_string.assign(&errbuf[0], errbuf_len);
416 error_string = "Error : constraints failed for X2AP Sgnb Addition Response message. Reason = " + error_string;
420 //xer_fprint(stdout, &asn_DEF_X2N_X2AP_PDU, x2ap_pdu_obj);
422 asn_enc_rval_t retval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_X2N_X2AP_PDU, x2ap_pdu_obj, data_buf, *data_size);
423 if(retval.encoded == -1){
424 error_string.assign(strerror(errno));
429 if(*data_size < retval.encoded){
430 std::stringstream ss;
431 ss <<"Error encoding SgNB Addition Request Response. Reason = encoded pdu size " << retval.encoded << " exceeds buffer size " << *data_size << std::endl;
432 error_string = ss.str();
437 *data_size = retval.encoded;