4 ==================================================================================
5 Copyright (c) 2018-2019 AT&T Intellectual Property.
7 Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
11 http://www.apache.org/licenses/LICENSE-2.0
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18 ==================================================================================
22 #include "subscription_request.hpp"
24 subscription_request::subscription_request(void){
29 e2ap_pdu_obj = (E2N_E2AP_PDU_t * )calloc(1, sizeof(E2N_E2AP_PDU_t));
30 assert(e2ap_pdu_obj != 0);
33 initMsg = (E2N_InitiatingMessage_t * )calloc(1, sizeof(E2N_InitiatingMessage_t));
37 IE_array = (E2N_RICsubscriptionRequest_IEs_t *)calloc(NUM_SUBSCRIPTION_REQUEST_IES, sizeof(E2N_RICsubscriptionRequest_IEs_t));
38 assert(IE_array != 0);
41 action_array = (E2N_RICaction_ToBeSetup_ItemIEs_t *)calloc(INITIAL_REQUEST_LIST_SIZE, sizeof(E2N_RICaction_ToBeSetup_ItemIEs_t));
42 assert(action_array != 0);
43 action_array_size = INITIAL_REQUEST_LIST_SIZE;
46 e2ap_pdu_obj->choice.initiatingMessage = initMsg;
47 e2ap_pdu_obj->present = E2N_E2AP_PDU_PR_initiatingMessage;
55 // Clear assigned protocolIE list from RIC indication IE container
56 subscription_request::~subscription_request(void){
58 mdclog_write(MDCLOG_DEBUG, "Freeing subscription request memory for");;
60 // Sequence of actions to be admitted causes special heart-ache. Free ric subscription element manually and reset the ie pointer
61 E2N_RICsubscription_t * ricsubscription_ie = &(IE_array[2].value.choice.RICsubscription);
63 for(int i = 0; i < ricsubscription_ie->ricAction_ToBeSetup_List.list.size; i++){
64 ricsubscription_ie->ricAction_ToBeSetup_List.list.array[i] = 0;
67 if (ricsubscription_ie->ricAction_ToBeSetup_List.list.size > 0){
68 free(ricsubscription_ie->ricAction_ToBeSetup_List.list.array);
69 ricsubscription_ie->ricAction_ToBeSetup_List.list.size = 0;
70 ricsubscription_ie->ricAction_ToBeSetup_List.list.count = 0;
71 ricsubscription_ie->ricAction_ToBeSetup_List.list.array = 0;
75 E2N_RICsubscriptionRequest_t * subscription_request = &(initMsg->value.choice.RICsubscriptionRequest);
77 for(int i = 0; i < subscription_request->protocolIEs.list.size; i++){
78 subscription_request->protocolIEs.list.array[i] = 0;
81 if( subscription_request->protocolIEs.list.size > 0){
82 free( subscription_request->protocolIEs.list.array);
83 subscription_request->protocolIEs.list.array = 0;
84 subscription_request->protocolIEs.list.size = 0;
85 subscription_request->protocolIEs.list.count = 0;
90 e2ap_pdu_obj->choice.initiatingMessage = 0;
92 ASN_STRUCT_FREE(asn_DEF_E2N_E2AP_PDU, e2ap_pdu_obj);
93 mdclog_write(MDCLOG_DEBUG, "Freed subscription request memory ");
97 bool subscription_request::encode_e2ap_subscription(unsigned char *buf, size_t *size, subscription_helper &dinput){
101 initMsg->procedureCode = E2N_ProcedureCode_id_ricSubscription;
102 initMsg->criticality = E2N_Criticality_ignore;
103 initMsg->value.present = E2N_InitiatingMessage__value_PR_RICsubscriptionRequest;
105 res = set_fields(initMsg, dinput);
110 int ret_constr = asn_check_constraints(&asn_DEF_E2N_E2AP_PDU, (void *) e2ap_pdu_obj, errbuf, &errbuf_len);
112 error_string.assign(errbuf, errbuf_len);
113 error_string = "Constraints failed for encoding subscription request. Reason = " + error_string;
117 //xer_fprint(stdout, &asn_DEF_E2N_E2AP_PDU, e2ap_pdu_obj);
119 asn_enc_rval_t retval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2AP_PDU, e2ap_pdu_obj, buf, *size);
121 if(retval.encoded == -1){
122 error_string.assign(strerror(errno));
123 error_string = "Error encoding Subscription Request. Reason = " + error_string;
127 if(*size < retval.encoded){
128 std::stringstream ss;
129 ss <<"Error encoding Subscription Request . Reason = encoded pdu size " << retval.encoded << " exceeds buffer size " << *size << std::endl;
130 error_string = ss.str();
136 *size = retval.encoded;
142 bool subscription_request::set_fields( E2N_InitiatingMessage_t * init_msg, subscription_helper &helper){
149 error_string = "Error. Invalid reference when getting fields from subscription request";
153 E2N_RICsubscriptionRequest_t * ric_subscription = &(init_msg->value.choice.RICsubscriptionRequest);
154 ric_subscription->protocolIEs.list.count = 0;
157 E2N_RICsubscriptionRequest_IEs_t *ies_ricreq = &IE_array[ie_index];
158 ies_ricreq->criticality = E2N_Criticality_reject;
159 ies_ricreq->id = E2N_ProtocolIE_ID_id_RICrequestID;
160 ies_ricreq->value.present = E2N_RICsubscriptionRequest_IEs__value_PR_RICrequestID;
161 E2N_RICrequestID_t *ricrequest_ie = &ies_ricreq->value.choice.RICrequestID;
162 ricrequest_ie->ricRequestorID = helper.get_request_id();
163 ricrequest_ie->ricRequestSequenceNumber = helper.get_req_seq();
164 result = ASN_SEQUENCE_ADD(&(ric_subscription->protocolIEs), &IE_array[ie_index]);
168 E2N_RICsubscriptionRequest_IEs_t *ies_ranfunc = &IE_array[ie_index];
169 ies_ranfunc->criticality = E2N_Criticality_reject;
170 ies_ranfunc->id = E2N_ProtocolIE_ID_id_RANfunctionID;
171 ies_ranfunc->value.present = E2N_RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
172 E2N_RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;
173 *ranfunction_ie = helper.get_function_id();
174 result = ASN_SEQUENCE_ADD(&(ric_subscription->protocolIEs), &IE_array[ie_index]);
179 E2N_RICsubscriptionRequest_IEs_t *ies_actid = &IE_array[ie_index];
180 ies_actid->criticality = E2N_Criticality_reject;
181 ies_actid->id = E2N_ProtocolIE_ID_id_RICsubscription;
182 ies_actid->value.present = E2N_RICsubscriptionRequest_IEs__value_PR_RICsubscription;
183 E2N_RICsubscription_t *ricsubscription_ie = &ies_actid->value.choice.RICsubscription;
185 ricsubscription_ie->ricEventTriggerDefinition.buf = (uint8_t *) helper.get_event_def();
186 ricsubscription_ie->ricEventTriggerDefinition.size = helper.get_event_def_size();
188 std::vector<Action> * ref_action_array = helper.get_list();
189 // do we need to resize ?
190 // we don't care about contents, so just do a free/calloc
191 if(action_array_size < ref_action_array->size()){
192 std::cout <<"re-allocating action array from " << action_array_size << " to " << 2 * ref_action_array->size() << std::endl;
194 action_array_size = 2 * ref_action_array->size();
196 action_array = (E2N_RICaction_ToBeSetup_ItemIEs_t *)calloc(action_array_size, sizeof(E2N_RICaction_ToBeSetup_ItemIEs_t));
197 assert(action_array != 0);
200 // reset the list count on ricAction_ToBeSetup_List;
201 ricsubscription_ie->ricAction_ToBeSetup_List.list.count = 0;
203 for(int i = 0; i < ref_action_array->size(); i ++){
204 action_array[i].criticality = E2N_Criticality_ignore;
205 action_array[i].id = E2N_ProtocolIE_ID_id_RICaction_ToBeSetup_Item ;
206 action_array[i].value.present = E2N_RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
207 action_array[i].value.choice.RICaction_ToBeSetup_Item.ricActionID = (*ref_action_array)[i].get_id();
208 action_array[i].value.choice.RICaction_ToBeSetup_Item.ricActionType = (*ref_action_array)[i].get_type();
210 result = ASN_SEQUENCE_ADD(&ricsubscription_ie->ricAction_ToBeSetup_List, &(action_array[i]));
212 error_string = "Erorr : Unable to assign memory to add Action item to set up list";
218 result = ASN_SEQUENCE_ADD(&(ric_subscription->protocolIEs), &IE_array[ie_index]);
228 bool subscription_request:: get_fields(E2N_InitiatingMessage_t * init_msg, subscription_helper & dout)
232 error_string = "Error. Invalid reference when getting fields from subscription request";
236 E2N_RICrequestID_t *requestid;
237 E2N_RANfunctionID_t * ranfunctionid;
238 E2N_RICsubscription_t * ricsubscription;
240 for(int edx = 0; edx < init_msg->value.choice.RICsubscriptionRequest.protocolIEs.list.count; edx++) {
241 E2N_RICsubscriptionRequest_IEs_t *memb_ptr = init_msg->value.choice.RICsubscriptionRequest.protocolIEs.list.array[edx];
245 case (E2N_ProtocolIE_ID_id_RICrequestID):
246 requestid = &memb_ptr->value.choice.RICrequestID;
247 dout.set_request(requestid->ricRequestorID, requestid->ricRequestSequenceNumber);
250 case (E2N_ProtocolIE_ID_id_RANfunctionID):
251 ranfunctionid = &memb_ptr->value.choice.RANfunctionID;
252 dout.set_function_id(*ranfunctionid);
255 case (E2N_ProtocolIE_ID_id_RICsubscription):
256 ricsubscription = &memb_ptr->value.choice.RICsubscription;
257 dout.set_event_def(ricsubscription->ricEventTriggerDefinition.buf, ricsubscription->ricEventTriggerDefinition.size);
259 for(int index = 0; index < ricsubscription->ricAction_ToBeSetup_List.list.count; index ++){
260 E2N_RICaction_ToBeSetup_ItemIEs_t * item = (E2N_RICaction_ToBeSetup_ItemIEs_t *)ricsubscription->ricAction_ToBeSetup_List.list.array[index];
261 dout.add_action(item->value.choice.RICaction_ToBeSetup_Item.ricActionID, item->value.choice.RICaction_ToBeSetup_Item.ricActionType);
269 //asn_fprint(stdout, &asn_DEF_E2N_E2AP_PDU, e2pdu);