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 = (E2AP_PDU_t * )calloc(1, sizeof(E2AP_PDU_t));
30 assert(e2ap_pdu_obj != 0);
33 initMsg = (InitiatingMessage_t * )calloc(1, sizeof(InitiatingMessage_t));
37 IE_array = (RICsubscriptionRequest_IEs_t *)calloc(NUM_SUBSCRIPTION_REQUEST_IES, sizeof(RICsubscriptionRequest_IEs_t));
38 assert(IE_array != 0);
41 action_array = (RICaction_ToBeSetup_ItemIEs_t *)calloc(INITIAL_LIST_SIZE, sizeof(RICaction_ToBeSetup_ItemIEs_t));
42 assert(action_array != 0);
43 action_array_size = INITIAL_LIST_SIZE;
49 // Clear assigned protocolIE list from RIC indication IE container
50 subscription_request::~subscription_request(void){
52 mdclog_write(MDCLOG_INFO, "Freeing subscription request memory for");;
54 // Sequence of actions to be admitted causes special heart-ache. Free ric subscription element manually and reset the ie pointer
55 RICsubscription_t * ricsubscription_ie = &(IE_array[2].value.choice.RICsubscription);
57 for(int i = 0; i < ricsubscription_ie->ricAction_ToBeSetup_List.list.size; i++){
58 ricsubscription_ie->ricAction_ToBeSetup_List.list.array[i] = 0;
61 if (ricsubscription_ie->ricAction_ToBeSetup_List.list.size > 0){
62 free(ricsubscription_ie->ricAction_ToBeSetup_List.list.array);
63 ricsubscription_ie->ricAction_ToBeSetup_List.list.size = 0;
64 ricsubscription_ie->ricAction_ToBeSetup_List.list.count = 0;
65 ricsubscription_ie->ricAction_ToBeSetup_List.list.array = 0;
69 RICsubscriptionRequest_t * subscription_request = &(initMsg->value.choice.RICsubscriptionRequest);
71 for(int i = 0; i < subscription_request->protocolIEs.list.size; i++){
72 subscription_request->protocolIEs.list.array[i] = 0;
75 if( subscription_request->protocolIEs.list.size > 0){
76 free( subscription_request->protocolIEs.list.array);
77 subscription_request->protocolIEs.list.array = 0;
78 subscription_request->protocolIEs.list.size = 0;
79 subscription_request->protocolIEs.list.count = 0;
84 e2ap_pdu_obj->choice.initiatingMessage = 0;
86 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, e2ap_pdu_obj);
87 mdclog_write(MDCLOG_INFO, "Freed subscription request memory ");
91 bool subscription_request::encode_e2ap_subscription(unsigned char *buf, size_t *size, E2AP_PDU_t *e2ap_pdu, subscription_helper &dinput){
95 e2ap_pdu_obj->choice.initiatingMessage = initMsg;
96 e2ap_pdu_obj->present = E2AP_PDU_PR_initiatingMessage;
98 res = set_fields(e2ap_pdu_obj->choice.initiatingMessage, dinput);
103 //xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2ap_pdu_obj);
104 int ret_constr = asn_check_constraints(&asn_DEF_E2AP_PDU, (void *) e2ap_pdu_obj, errbuf, &errbuf_len);
106 error_string.assign(errbuf, errbuf_len);
107 error_string = "Constraints failed for encoding subscription request. Reason = " + error_string;
111 asn_enc_rval_t retval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, e2ap_pdu_obj, buf, *size);
113 if(retval.encoded == -1){
114 error_string.assign(strerror(errno));
115 error_string = "Error encoding Subscription Delete Request. Reason = " + error_string;
119 if(*size < retval.encoded){
120 std::stringstream ss;
121 ss <<"Error encoding Subscription Delete Request . Reason = encoded pdu size " << retval.encoded << " exceeds buffer size " << *size << std::endl;
122 error_string = ss.str();
128 *size = retval.encoded;
134 bool subscription_request::set_fields(InitiatingMessage_t *ref_initMsg, subscription_helper &helper){
136 if (ref_initMsg == 0){
137 error_string = "Error : Invalid reference when setting fields for subscription request";
144 ref_initMsg->procedureCode = ProcedureCode_id_ricSubscription;
145 ref_initMsg->criticality = Criticality_reject;
146 ref_initMsg->value.present = InitiatingMessage__value_PR_RICsubscriptionRequest;
148 RICsubscriptionRequest_t * subscription_request = &(ref_initMsg->value.choice.RICsubscriptionRequest);
150 // Reset field count for protocolIEs
151 subscription_request->protocolIEs.list.count = 0;
154 RICsubscriptionRequest_IEs_t *ies_ricreq = &IE_array[ie_index];
155 ies_ricreq->criticality = Criticality_reject;
156 ies_ricreq->id = ProtocolIE_ID_id_RICrequestID;
157 ies_ricreq->value.present = RICsubscriptionRequest_IEs__value_PR_RICrequestID;
158 RICrequestID_t *ricrequest_ie = &ies_ricreq->value.choice.RICrequestID;
159 ricrequest_ie->ricRequestorID = helper.get_request_id();
160 ricrequest_ie->ricRequestSequenceNumber = helper.get_req_seq();
161 result = ASN_SEQUENCE_ADD(&subscription_request->protocolIEs, ies_ricreq);
163 error_string = "Erorr : Unable to assign memory to add RIC request id to subscription request";
168 RICsubscriptionRequest_IEs_t *ies_ranfunc = &IE_array[ie_index];
169 ies_ranfunc->criticality = Criticality_reject;
170 ies_ranfunc->id = ProtocolIE_ID_id_RANfunctionID;
171 ies_ranfunc->value.present = RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
172 RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;
173 *ranfunction_ie = helper.get_function_id();
174 ASN_SEQUENCE_ADD(&subscription_request->protocolIEs, ies_ranfunc);
176 error_string = "Erorr : Unable to assign memory to add RAN function id to subscription request";
182 RICsubscriptionRequest_IEs_t *ies_actid = &IE_array[ie_index];
183 ies_actid->criticality = Criticality_reject;
184 ies_actid->id = ProtocolIE_ID_id_RICsubscription;
185 ies_actid->value.present = RICsubscriptionRequest_IEs__value_PR_RICsubscription;
186 RICsubscription_t *ricsubscription_ie = &ies_actid->value.choice.RICsubscription;
188 ricsubscription_ie->ricEventTriggerDefinition.buf = (uint8_t *) helper.get_event_def();
189 ricsubscription_ie->ricEventTriggerDefinition.size = helper.get_event_def_size();
191 std::vector<Action> * ref_action_array = helper.get_list();
193 // do we need to reallocate ?
194 if(action_array_size < ref_action_array->size()){
195 action_array_size = 2 * ref_action_array->size();
196 RICaction_ToBeSetup_ItemIEs_t * new_ref = 0;
197 new_ref = (RICaction_ToBeSetup_ItemIEs_t * )realloc(action_array, action_array_size);
198 assert(new_ref != 0);
199 action_array = new_ref;
202 // reset the list count on ricAction_ToBeSetup_List;
203 ricsubscription_ie->ricAction_ToBeSetup_List.list.count = 0;
205 for(int i = 0; i < ref_action_array->size(); i ++){
206 action_array[i].criticality = Criticality_ignore;
207 action_array[i].id = ProtocolIE_ID_id_RICaction_ToBeSetup_Item ;
208 action_array[i].value.present = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
209 action_array[i].value.choice.RICaction_ToBeSetup_Item.ricActionID = (*ref_action_array)[i].get_id();
210 action_array[i].value.choice.RICaction_ToBeSetup_Item.ricActionType = (*ref_action_array)[i].get_type();
212 result = ASN_SEQUENCE_ADD(&ricsubscription_ie->ricAction_ToBeSetup_List, &(action_array[i]));
214 error_string = "Erorr : Unable to assign memory to add Action item to set up list";
221 result = ASN_SEQUENCE_ADD(&subscription_request->protocolIEs, ies_actid);
223 error_string = "Erorr : Unable to assign memory to action item to be setup list subscription request";
232 bool subscription_request:: get_fields(InitiatingMessage_t * init_msg, subscription_helper & dout)
236 error_string = "Error. Invalid reference when getting fields from subscription request";
240 RICrequestID_t *requestid;
241 RANfunctionID_t * ranfunctionid;
242 RICsubscription_t * ricsubscription;
244 for(int edx = 0; edx < init_msg->value.choice.RICsubscriptionRequest.protocolIEs.list.count; edx++) {
245 RICsubscriptionRequest_IEs_t *memb_ptr = init_msg->value.choice.RICsubscriptionRequest.protocolIEs.list.array[edx];
249 case (ProtocolIE_ID_id_RICrequestID):
250 requestid = &memb_ptr->value.choice.RICrequestID;
251 dout.set_request(requestid->ricRequestorID, requestid->ricRequestSequenceNumber);
254 case (ProtocolIE_ID_id_RANfunctionID):
255 ranfunctionid = &memb_ptr->value.choice.RANfunctionID;
256 dout.set_function_id(*ranfunctionid);
259 case (ProtocolIE_ID_id_RICsubscription):
260 ricsubscription = &memb_ptr->value.choice.RICsubscription;
261 dout.set_event_def(ricsubscription->ricEventTriggerDefinition.buf, ricsubscription->ricEventTriggerDefinition.size);
263 for(int index = 0; index < ricsubscription->ricAction_ToBeSetup_List.list.count; index ++){
264 RICaction_ToBeSetup_ItemIEs_t * item = (RICaction_ToBeSetup_ItemIEs_t *)ricsubscription->ricAction_ToBeSetup_List.list.array[index];
265 dout.add_action(item->value.choice.RICaction_ToBeSetup_Item.ricActionID, item->value.choice.RICaction_ToBeSetup_Item.ricActionType);
273 //asn_fprint(stdout, &asn_DEF_E2AP_PDU, e2pdu);