X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fxapp-formats%2Fe2ap%2Fsubscription_request.cc;fp=src%2Fxapp-formats%2Fe2ap%2Fsubscription_request.cc;h=0000000000000000000000000000000000000000;hb=271617d99c4e3d126d0745af02678b4ffab4912e;hp=9b2f89761eba3f2f19055d7ca6bdb1846c25e4e9;hpb=28b894594573ab1e7087ed8fb50b208d7b135b07;p=ric-app%2Fhw.git diff --git a/src/xapp-formats/e2ap/subscription_request.cc b/src/xapp-formats/e2ap/subscription_request.cc deleted file mode 100644 index 9b2f897..0000000 --- a/src/xapp-formats/e2ap/subscription_request.cc +++ /dev/null @@ -1,308 +0,0 @@ - - -/* -================================================================================== - Copyright (c) 2018-2019 AT&T Intellectual Property. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -================================================================================== -*/ - - -#include "subscription_request.hpp" - - -// Set up memory allocations for each IE for encoding -// We are responsible for memory management for each IE for encoding -// Hence destructor should clear out memory -// When decoding, we rely on asn1c macro (ASN_STRUCT_FREE to be called -// for releasing memory by external calling function) -subscription_request::subscription_request(void){ - - _name = "default"; - - e2ap_pdu_obj = 0; - e2ap_pdu_obj = (E2N_E2AP_PDU_t * )calloc(1, sizeof(E2N_E2AP_PDU_t)); - assert(e2ap_pdu_obj != 0); - - initMsg = 0; - initMsg = (E2N_InitiatingMessage_t * )calloc(1, sizeof(E2N_InitiatingMessage_t)); - assert(initMsg != 0); - - IE_array = 0; - IE_array = (E2N_RICsubscriptionRequest_IEs_t *)calloc(NUM_SUBSCRIPTION_REQUEST_IES, sizeof(E2N_RICsubscriptionRequest_IEs_t)); - assert(IE_array != 0); - - action_array = 0; - action_array = (E2N_RICaction_ToBeSetup_ItemIEs_t *)calloc(INITIAL_REQUEST_LIST_SIZE, sizeof(E2N_RICaction_ToBeSetup_ItemIEs_t)); - assert(action_array != 0); - action_array_size = INITIAL_REQUEST_LIST_SIZE; - // also need to add subsequent action and time to wait .. - for (unsigned int i = 0; i < action_array_size; i++){ - action_array[i].value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction = (struct E2N_RICsubsequentAction *)calloc(1, sizeof(struct E2N_RICsubsequentAction)); - assert(action_array[i].value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction != 0); - } - - e2ap_pdu_obj->choice.initiatingMessage = initMsg; - e2ap_pdu_obj->present = E2N_E2AP_PDU_PR_initiatingMessage; - - - -}; - - - -// Clear assigned protocolIE list from RIC indication IE container -subscription_request::~subscription_request(void){ - - mdclog_write(MDCLOG_DEBUG, "Freeing subscription request memory for");; - - // Sequence of actions to be admitted causes special heart-ache. Free ric subscription element manually and reset the ie pointer - E2N_RICsubscription_t * ricsubscription_ie = &(IE_array[2].value.choice.RICsubscription); - - for(int i = 0; i < ricsubscription_ie->ricAction_ToBeSetup_List.list.size; i++){ - ricsubscription_ie->ricAction_ToBeSetup_List.list.array[i] = 0; - } - - if (ricsubscription_ie->ricAction_ToBeSetup_List.list.size > 0){ - free(ricsubscription_ie->ricAction_ToBeSetup_List.list.array); - ricsubscription_ie->ricAction_ToBeSetup_List.list.size = 0; - ricsubscription_ie->ricAction_ToBeSetup_List.list.count = 0; - ricsubscription_ie->ricAction_ToBeSetup_List.list.array = 0; - } - - // clear subsequent action array - for (unsigned int i = 0; i < action_array_size; i++){ - free(action_array[i].value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction ); - } - - free(action_array); - E2N_RICsubscriptionRequest_t * subscription_request = &(initMsg->value.choice.RICsubscriptionRequest); - - for(int i = 0; i < subscription_request->protocolIEs.list.size; i++){ - subscription_request->protocolIEs.list.array[i] = 0; - } - - if( subscription_request->protocolIEs.list.size > 0){ - free( subscription_request->protocolIEs.list.array); - subscription_request->protocolIEs.list.array = 0; - subscription_request->protocolIEs.list.size = 0; - subscription_request->protocolIEs.list.count = 0; - } - - free(IE_array); - free(initMsg); - e2ap_pdu_obj->choice.initiatingMessage = 0; - - ASN_STRUCT_FREE(asn_DEF_E2N_E2AP_PDU, e2ap_pdu_obj); - mdclog_write(MDCLOG_DEBUG, "Freed subscription request memory "); -}; - - -bool subscription_request::encode_e2ap_subscription(unsigned char *buf, size_t *size, subscription_helper &dinput){ - - bool res; - - initMsg->procedureCode = E2N_ProcedureCode_id_ricSubscription; - initMsg->criticality = E2N_Criticality_ignore; - initMsg->value.present = E2N_InitiatingMessage__value_PR_RICsubscriptionRequest; - - res = set_fields(initMsg, dinput); - if (!res){ - return false; - } - - int ret_constr = asn_check_constraints(&asn_DEF_E2N_E2AP_PDU, (void *) e2ap_pdu_obj, errbuf, &errbuf_len); - if(ret_constr){ - error_string.assign(errbuf, errbuf_len); - error_string = "Constraints failed for encoding subscription request. Reason = " + error_string; - return false; - } - - //xer_fprint(stdout, &asn_DEF_E2N_E2AP_PDU, e2ap_pdu_obj); - - asn_enc_rval_t retval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2AP_PDU, e2ap_pdu_obj, buf, *size); - - if(retval.encoded == -1){ - error_string.assign(strerror(errno)); - error_string = "Error encoding Subscription Request. Reason = " + error_string; - return false; - } - else { - if(*size < retval.encoded){ - std::stringstream ss; - ss <<"Error encoding Subscription Request . Reason = encoded pdu size " << retval.encoded << " exceeds buffer size " << *size << std::endl; - error_string = ss.str(); - retval.encoded = -1; - return false; - } - } - - *size = retval.encoded; - return true; - -} - - -bool subscription_request::set_fields( E2N_InitiatingMessage_t * init_msg, subscription_helper &helper){ - - - int ie_index; - int result = 0; - - if (init_msg == 0){ - error_string = "Error. Invalid reference when getting fields from subscription request"; - return false; - } - - E2N_RICsubscriptionRequest_t * ric_subscription = &(init_msg->value.choice.RICsubscriptionRequest); - ric_subscription->protocolIEs.list.count = 0; - - ie_index = 0; - E2N_RICsubscriptionRequest_IEs_t *ies_ricreq = &IE_array[ie_index]; - ies_ricreq->criticality = E2N_Criticality_reject; - ies_ricreq->id = E2N_ProtocolIE_ID_id_RICrequestID; - ies_ricreq->value.present = E2N_RICsubscriptionRequest_IEs__value_PR_RICrequestID; - E2N_RICrequestID_t *ricrequest_ie = &ies_ricreq->value.choice.RICrequestID; - ricrequest_ie->ricRequestorID = helper.get_request_id(); - ricrequest_ie->ricRequestSequenceNumber = helper.get_req_seq(); - result = ASN_SEQUENCE_ADD(&(ric_subscription->protocolIEs), &IE_array[ie_index]); - assert(result == 0); - - ie_index = 1; - E2N_RICsubscriptionRequest_IEs_t *ies_ranfunc = &IE_array[ie_index]; - ies_ranfunc->criticality = E2N_Criticality_reject; - ies_ranfunc->id = E2N_ProtocolIE_ID_id_RANfunctionID; - ies_ranfunc->value.present = E2N_RICsubscriptionRequest_IEs__value_PR_RANfunctionID; - E2N_RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID; - *ranfunction_ie = helper.get_function_id(); - result = ASN_SEQUENCE_ADD(&(ric_subscription->protocolIEs), &IE_array[ie_index]); - assert(result == 0); - - - ie_index = 2; - E2N_RICsubscriptionRequest_IEs_t *ies_actid = &IE_array[ie_index]; - ies_actid->criticality = E2N_Criticality_reject; - ies_actid->id = E2N_ProtocolIE_ID_id_RICsubscription; - ies_actid->value.present = E2N_RICsubscriptionRequest_IEs__value_PR_RICsubscription; - E2N_RICsubscription_t *ricsubscription_ie = &ies_actid->value.choice.RICsubscription; - - ricsubscription_ie->ricEventTriggerDefinition.buf = (uint8_t *) helper.get_event_def(); - ricsubscription_ie->ricEventTriggerDefinition.size = helper.get_event_def_size(); - - std::vector * ref_action_array = helper.get_list(); - // do we need to resize ? - // we don't care about contents, so just do a free/calloc - if(action_array_size < ref_action_array->size()){ - std::cout <<"re-allocating action array from " << action_array_size << " to " << 2 * ref_action_array->size() << std::endl; - // free subsequent allocation - for (unsigned int i = 0; i < action_array_size; i++){ - free(action_array[i].value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction ); - } - - action_array_size = 2 * ref_action_array->size(); - free(action_array); - action_array = (E2N_RICaction_ToBeSetup_ItemIEs_t *)calloc(action_array_size, sizeof(E2N_RICaction_ToBeSetup_ItemIEs_t)); - assert(action_array != 0); - - // also need to add subsequent action and time to wait .. - for (unsigned int i = 0; i < action_array_size; i++){ - action_array[i].value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction = (struct E2N_RICsubsequentAction *)calloc(1, sizeof(struct E2N_RICsubsequentAction)); - assert(action_array[i].value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction != 0); - } - - } - - // reset the list count on ricAction_ToBeSetup_List; - ricsubscription_ie->ricAction_ToBeSetup_List.list.count = 0; - - for(unsigned int i = 0; i < ref_action_array->size(); i ++){ - action_array[i].criticality = E2N_Criticality_ignore; - action_array[i].id = E2N_ProtocolIE_ID_id_RICaction_ToBeSetup_Item ; - action_array[i].value.present = E2N_RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item; - action_array[i].value.choice.RICaction_ToBeSetup_Item.ricActionID = (*ref_action_array)[i].get_id(); - action_array[i].value.choice.RICaction_ToBeSetup_Item.ricActionType = (*ref_action_array)[i].get_type(); - action_array[i].value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction->ricSubsequentActionType = (*ref_action_array)[i].get_subsequent_action(); - action_array[i].value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction->ricTimeToWait = (*ref_action_array)[i].get_wait(); - - result = ASN_SEQUENCE_ADD(&ricsubscription_ie->ricAction_ToBeSetup_List, &(action_array[i])); - if (result == -1){ - error_string = "Erorr : Unable to assign memory to add Action item to set up list"; - return false; - } - - } - - result = ASN_SEQUENCE_ADD(&(ric_subscription->protocolIEs), &IE_array[ie_index]); - assert(result == 0); - - - - return true; -}; - - - -bool subscription_request:: get_fields(E2N_InitiatingMessage_t * init_msg, subscription_helper & dout) -{ - - if (init_msg == 0){ - error_string = "Error. Invalid reference when getting fields from subscription request"; - return false; - } - - E2N_RICrequestID_t *requestid; - E2N_RANfunctionID_t * ranfunctionid; - E2N_RICsubscription_t * ricsubscription; - - for(int edx = 0; edx < init_msg->value.choice.RICsubscriptionRequest.protocolIEs.list.count; edx++) { - E2N_RICsubscriptionRequest_IEs_t *memb_ptr = init_msg->value.choice.RICsubscriptionRequest.protocolIEs.list.array[edx]; - - switch(memb_ptr->id) - { - case (E2N_ProtocolIE_ID_id_RICrequestID): - requestid = &memb_ptr->value.choice.RICrequestID; - dout.set_request(requestid->ricRequestorID, requestid->ricRequestSequenceNumber); - break; - - case (E2N_ProtocolIE_ID_id_RANfunctionID): - ranfunctionid = &memb_ptr->value.choice.RANfunctionID; - dout.set_function_id(*ranfunctionid); - break; - - case (E2N_ProtocolIE_ID_id_RICsubscription): - ricsubscription = &memb_ptr->value.choice.RICsubscription; - dout.set_event_def(ricsubscription->ricEventTriggerDefinition.buf, ricsubscription->ricEventTriggerDefinition.size); - - for(int index = 0; index < ricsubscription->ricAction_ToBeSetup_List.list.count; index ++){ - E2N_RICaction_ToBeSetup_ItemIEs_t * item = (E2N_RICaction_ToBeSetup_ItemIEs_t *)ricsubscription->ricAction_ToBeSetup_List.list.array[index]; - if (item->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction == NULL){ - dout.add_action(item->value.choice.RICaction_ToBeSetup_Item.ricActionID, item->value.choice.RICaction_ToBeSetup_Item.ricActionType); - } - else{ - std::string action_def = ""; // for now we are ignoring action definition - dout.add_action(item->value.choice.RICaction_ToBeSetup_Item.ricActionID, item->value.choice.RICaction_ToBeSetup_Item.ricActionType, action_def, item->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction->ricSubsequentActionType, item->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction->ricTimeToWait); - } - }; - - break; - } - - } - - //asn_fprint(stdout, &asn_DEF_E2N_E2AP_PDU, e2pdu); - return true; -}; - - -