E2AP Wrapper Implementation
[ric-app/hw.git] / src / xapp-asn / e2ap / e2ap_subsdel_request.cc
1 /*
2 ==================================================================================
3         Copyright (c) 2019-2020 AT&T Intellectual Property.
4
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
8
9        http://www.apache.org/licenses/LICENSE-2.0
10
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 ==================================================================================
17 */
18 /*
19  * e2ap_subsdel_request.cc
20  *
21  * Author: SJana, Ashwin Sridharan
22  */
23
24
25 #include "e2ap_subsdel_request.hpp"
26
27 E2APSubscriptionDeleteRequest::E2APSubscriptionDeleteRequest(SubscriptionDeleteRequestIEs& ieObj){
28
29
30
31   _requestIEs = std::make_unique<SubscriptionDeleteRequestIEs>();
32   *_requestIEs = ieObj;
33
34   e2ap_pdu_obj = (E2AP_PDU_t * )calloc(1, sizeof(E2AP_PDU_t));
35   assert(e2ap_pdu_obj != 0);
36
37   initMsg = (InitiatingMessage_t * )calloc(1, sizeof(InitiatingMessage_t));
38   assert(initMsg != 0);
39
40   IE_array = (RICsubscriptionDeleteRequest_IEs_t *)calloc(RIC_SUBDEL_REQUEST_IES_COUNT, sizeof(RICsubscriptionDeleteRequest_IEs_t));
41   assert(IE_array != 0);
42
43   RICsubscriptionDeleteRequest_t * subDelrequest = &(initMsg->value.choice.RICsubscriptionDeleteRequest);
44   for(int i = 0; i < RIC_SUBDEL_REQUEST_IES_COUNT; i++){
45     ASN_SEQUENCE_ADD(&subDelrequest->protocolIEs, &(IE_array[i]));
46   }
47
48 };
49
50
51
52 // Clear assigned protocolIE list from RIC indication IE container
53 E2APSubscriptionDeleteRequest::~E2APSubscriptionDeleteRequest(void){
54
55   mdclog_write(MDCLOG_DEBUG, "Freeing subscription delete request object memory");
56   RICsubscriptionDeleteRequest_t * E2APSubscriptionDeleteRequest = &(initMsg->value.choice.RICsubscriptionDeleteRequest);
57
58  for(int i = 0; i < E2APSubscriptionDeleteRequest->protocolIEs.list.size; i++){
59     E2APSubscriptionDeleteRequest->protocolIEs.list.array[i] = 0;
60   }
61
62   if (E2APSubscriptionDeleteRequest->protocolIEs.list.size > 0){
63     free(E2APSubscriptionDeleteRequest->protocolIEs.list.array);
64     E2APSubscriptionDeleteRequest->protocolIEs.list.count = 0;
65     E2APSubscriptionDeleteRequest->protocolIEs.list.size = 0;
66     E2APSubscriptionDeleteRequest->protocolIEs.list.array = 0;
67   }
68
69   free(IE_array);
70   free(initMsg);
71   e2ap_pdu_obj->choice.initiatingMessage = 0;
72
73   ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, e2ap_pdu_obj);
74   mdclog_write(MDCLOG_DEBUG, "Freed subscription delete request object memory");
75
76
77 };
78
79
80 bool E2APSubscriptionDeleteRequest::encode(unsigned char *buf, size_t *size){
81
82   e2ap_pdu_obj->choice.initiatingMessage = initMsg;
83   e2ap_pdu_obj->present = E2AP_PDU_PR_initiatingMessage;
84   bool result = setfields( initMsg);
85   if(!result)
86           return result;
87
88   initMsg->procedureCode = ProcedureCode_id_RICsubscriptionDelete;
89   initMsg->criticality = Criticality_reject;
90   initMsg->value.present = InitiatingMessage__value_PR_RICsubscriptionDeleteRequest;
91
92   int ret_constr = asn_check_constraints(&asn_DEF_E2AP_PDU, (void *) e2ap_pdu_obj, _errbuf, &_errbuf_len);
93   if(ret_constr){
94     _error_string.assign(_errbuf, _errbuf_len);
95     _error_string = "Constraints failed for encoding subscription delete request. Reason = " + _error_string;
96     return false;
97   }
98
99   asn_enc_rval_t res = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, e2ap_pdu_obj, buf, *size);
100
101   if(res.encoded == -1){
102     _error_string.assign(strerror(errno));
103     _error_string = "Error encoding Subscription Delete Request. Reason = " + _error_string;
104     return false;
105   }
106   else {
107     if(*size < res.encoded){
108       std::stringstream ss;
109       ss  <<"Error encoding Subscription Delete Request . Reason =  encoded pdu size " << res.encoded << " exceeds buffer size " << *size << std::endl;
110       _error_string = ss.str();
111       res.encoded = -1;
112       return false;
113     }
114   }
115
116   *size = res.encoded;
117   xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2ap_pdu_obj);
118
119   return true;
120
121 }
122
123
124 bool  E2APSubscriptionDeleteRequest::setfields( InitiatingMessage_t *initMsg){
125   unsigned int ie_index;
126
127   ie_index = 0;
128   RICsubscriptionDeleteRequest_IEs_t *ies_ricreq = &IE_array[ie_index];
129   ies_ricreq->criticality = Criticality_reject;
130   ies_ricreq->id = ProtocolIE_ID_id_RICrequestID;
131   ies_ricreq->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RICrequestID;
132   RICrequestID_t *ricrequest_ie = &ies_ricreq->value.choice.RICrequestID;
133   ricrequest_ie->ricRequestorID = this->getIEs().get_ricRequestorID();
134   ricrequest_ie->ricInstanceID = this->getIEs().get_ricInstanceID();
135
136
137   ie_index = 1;
138   RICsubscriptionDeleteRequest_IEs_t *ies_ranfunc = &IE_array[ie_index];
139   ies_ranfunc->criticality = Criticality_reject;
140   ies_ranfunc->id = ProtocolIE_ID_id_RANfunctionID;
141   ies_ranfunc->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RANfunctionID;
142   RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;
143   *ranfunction_ie = this->getIEs().get_ranFunctionID();
144
145
146   return true;
147 };
148