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