2 ==================================================================================
4 Copyright (c) 2019-2020 AT&T Intellectual Property.
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
17 ==================================================================================
21 * e2ap_subsdel_failure.cc
23 * Author: Shraboni Jana
28 #include "e2ap_subsdel_failure.hpp"
30 E2APSubscriptionDeleteFailure::E2APSubscriptionDeleteFailure(SubscriptionDeleteFailureIEs& ieObj){
34 _failureIEs = std::make_unique<SubscriptionDeleteFailureIEs>();
37 _e2ap_pdu_obj = (E2AP_PDU_t * )calloc(1, sizeof(E2AP_PDU_t));
38 assert(_e2ap_pdu_obj != 0);
40 _unsuccessMsg = (UnsuccessfulOutcome_t * )calloc(1, sizeof(UnsuccessfulOutcome_t));
41 assert(_unsuccessMsg != 0);
43 IE_array = (RICsubscriptionDeleteFailure_IEs_t *)calloc(RIC_SUBDEL_FAILURE_IES_COUNT, sizeof(RICsubscriptionDeleteFailure_IEs_t));
44 assert(IE_array != 0);
46 RICsubscriptionDeleteFailure_t * subDelfail = &(_unsuccessMsg->value.choice.RICsubscriptionDeleteFailure);
47 for(int i = 0; i < RIC_SUBDEL_FAILURE_IES_COUNT; i++){
48 ASN_SEQUENCE_ADD(&subDelfail->protocolIEs, &(IE_array[i]));
55 E2APSubscriptionDeleteFailure::E2APSubscriptionDeleteFailure(unsigned char *buf, size_t *size){
60 _failureIEs = std::make_unique<SubscriptionDeleteFailureIEs>();
62 bool status = this->decode(buf, size);
64 throw "E2AP Subscription Delete Failure Decode Failed: "+this->get_error();
67 // Clear assigned protocolIE list from RIC indication IE container
68 E2APSubscriptionDeleteFailure::~E2APSubscriptionDeleteFailure(void){
70 mdclog_write(MDCLOG_DEBUG, "Freeing subscription delete request object memory");
71 RICsubscriptionDeleteFailure_t * E2APSubscriptionDeleteFailure = &(_unsuccessMsg->value.choice.RICsubscriptionDeleteFailure);
73 for(int i = 0; i < E2APSubscriptionDeleteFailure->protocolIEs.list.size; i++){
74 E2APSubscriptionDeleteFailure->protocolIEs.list.array[i] = 0;
77 if (E2APSubscriptionDeleteFailure->protocolIEs.list.size > 0){
78 free(E2APSubscriptionDeleteFailure->protocolIEs.list.array);
79 E2APSubscriptionDeleteFailure->protocolIEs.list.count = 0;
80 E2APSubscriptionDeleteFailure->protocolIEs.list.size = 0;
81 E2APSubscriptionDeleteFailure->protocolIEs.list.array = 0;
87 _e2ap_pdu_obj->choice.unsuccessfulOutcome = 0;
89 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, _e2ap_pdu_obj);
90 mdclog_write(MDCLOG_DEBUG, "Freed subscription delete request object memory");
97 bool E2APSubscriptionDeleteFailure::decode(unsigned char *buf, size_t *size)
100 asn_dec_rval_t dec_res = asn_decode(0,ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, (void**)&(_e2ap_pdu_obj), buf, *size);
101 if(dec_res.code != RC_OK){
102 mdclog_write(MDCLOG_ERR, "Failed to decode: %s","RIC Subscription Delete Failure");
105 mdclog_write(MDCLOG_INFO, "Unsuccessfully decoded: %s","RIC Subscription Delete Failure");
108 _unsuccessMsg = _e2ap_pdu_obj->choice.unsuccessfulOutcome;
109 //write the decoding code.
111 if (_unsuccessMsg == 0){
112 _error_string = "Invalid reference to success message in get fields subscription delete failure";
117 for(int edx = 0; edx < _unsuccessMsg->value.choice.RICsubscriptionDeleteFailure.protocolIEs.list.count; edx++) {
118 RICsubscriptionDeleteFailure_IEs_t *memb_ptr = _unsuccessMsg->value.choice.RICsubscriptionDeleteFailure.protocolIEs.list.array[edx];
123 case (ProtocolIE_ID_id_RICrequestID):
124 _failureIEs->set_ricRequestorID(memb_ptr->value.choice.RICrequestID.ricRequestorID);
125 _failureIEs->set_ricInstanceID(memb_ptr->value.choice.RICrequestID.ricInstanceID);
128 case (ProtocolIE_ID_id_RANfunctionID):
129 _failureIEs->set_ranFunctionID(memb_ptr->value.choice.RANfunctionID);
133 case (ProtocolIE_ID_id_Cause):
135 _failureIEs->set_ricCause(memb_ptr->value.choice.Cause.present);
136 switch(memb_ptr->value.choice.Cause.present){
137 case Cause_PR_ricService :
138 _failureIEs->set_ricSubCause(memb_ptr->value.choice.Cause.choice.ricService);
140 case Cause_PR_transport :
141 _failureIEs->set_ricSubCause(memb_ptr->value.choice.Cause.choice.transport);
143 case Cause_PR_protocol :
144 _failureIEs->set_ricSubCause(memb_ptr->value.choice.Cause.choice.protocol);
147 _failureIEs->set_ricSubCause(memb_ptr->value.choice.Cause.choice.misc);
149 case Cause_PR_ricRequest :
150 _failureIEs->set_ricSubCause(memb_ptr->value.choice.Cause.choice.ricRequest);
153 _failureIEs->set_ricSubCause(-1);
160 case (ProtocolIE_ID_id_CriticalityDiagnostics):
162 _cdWrapperIEs.set_procedureCode(*(memb_ptr->value.choice.CriticalityDiagnostics.procedureCode));
163 _cdWrapperIEs.set_procedureCriticality(*(memb_ptr->value.choice.CriticalityDiagnostics.procedureCriticality));
164 _cdWrapperIEs.set_triggeringMessage(*(memb_ptr->value.choice.CriticalityDiagnostics.triggeringMessage));
167 RICrequestID_t* ricReq = (RICrequestID_t*)memb_ptr->value.choice.CriticalityDiagnostics.ricRequestorID;
168 _cdWrapperIEs.set_ricRequestorID(ricReq->ricRequestorID);
169 _cdWrapperIEs.set_ricInstanceID(ricReq->ricInstanceID);
171 int lstcount = memb_ptr->value.choice.CriticalityDiagnostics.iEsCriticalityDiagnostics->list.count;
172 auto *lst = _failureIEs->get_critical_diagnostic()->get_list();
173 for(int i=0; i < lstcount; i++){
174 CriticalityDiagnosticsIEs tmpObj;
175 tmpObj.set_iEcriticality(memb_ptr->value.choice.CriticalityDiagnostics.iEsCriticalityDiagnostics->list.array[i]->iECriticality);
176 tmpObj.set_ieID(memb_ptr->value.choice.CriticalityDiagnostics.iEsCriticalityDiagnostics->list.array[i]->iE_ID);
177 tmpObj.set_typeOferror(memb_ptr->value.choice.CriticalityDiagnostics.iEsCriticalityDiagnostics->list.array[i]->typeOfError);
178 _cdWrapperIEs.add(tmpObj);
180 _failureIEs->set_critical_diagnostic(_cdWrapperIEs);
185 // xer_fprint(stdout, &asn_DEF_E2AP_PDU, _e2ap_pdu_obj);
190 bool E2APSubscriptionDeleteFailure::encode(unsigned char *buf, size_t *size){
192 _e2ap_pdu_obj->choice.unsuccessfulOutcome = _unsuccessMsg;
193 _e2ap_pdu_obj->present = E2AP_PDU_PR_unsuccessfulOutcome;
194 bool result = setfields( _unsuccessMsg);
198 _unsuccessMsg->procedureCode = ProcedureCode_id_RICsubscriptionDelete;
199 _unsuccessMsg->criticality = Criticality_reject;
200 _unsuccessMsg->value.present = UnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure;
202 int ret_constr = asn_check_constraints(&asn_DEF_E2AP_PDU, (void *) _e2ap_pdu_obj, _errbuf, &_errbuf_len);
204 _error_string.assign(_errbuf, _errbuf_len);
205 _error_string = "Constraints failed for encoding subscription delete request. Reason = " + _error_string;
209 asn_enc_rval_t res = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, _e2ap_pdu_obj, buf, *size);
211 if(res.encoded == -1){
212 _error_string.assign(strerror(errno));
213 _error_string = "Error encoding Subscription Delete Request. Reason = " + _error_string;
217 if(*size < res.encoded){
218 std::stringstream ss;
219 ss <<"Error encoding Subscription Delete Request . Reason = encoded pdu size " << res.encoded << " exceeds buffer size " << *size << std::endl;
220 _error_string = ss.str();
227 xer_fprint(stdout, &asn_DEF_E2AP_PDU, _e2ap_pdu_obj);
234 bool E2APSubscriptionDeleteFailure::setfields( UnsuccessfulOutcome_t *_unsuccessMsg){
235 unsigned int ie_index;
238 RICsubscriptionDeleteFailure_IEs_t *ies_ricreq = &IE_array[ie_index];
239 ies_ricreq->criticality = Criticality_reject;
240 ies_ricreq->id = ProtocolIE_ID_id_RICrequestID;
241 ies_ricreq->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RICrequestID;
242 RICrequestID_t *ricrequest_ie = &ies_ricreq->value.choice.RICrequestID;
243 ricrequest_ie->ricRequestorID = this->getIEs().get_ricRequestorID();
244 ricrequest_ie->ricInstanceID = this->getIEs().get_ricInstanceID();
248 RICsubscriptionDeleteFailure_IEs_t *ies_ranfunc = &IE_array[ie_index];
249 ies_ranfunc->criticality = Criticality_reject;
250 ies_ranfunc->id = ProtocolIE_ID_id_RANfunctionID;
251 ies_ranfunc->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RANfunctionID;
252 RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;
253 *ranfunction_ie = this->getIEs().get_ranFunctionID();
256 RICsubscriptionDeleteFailure_IEs_t *ies_ric_cause = &IE_array[ie_index];
257 ies_ric_cause->criticality = Criticality_ignore;
258 ies_ric_cause->id = ProtocolIE_ID_id_Cause;
259 ies_ric_cause->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_Cause;
260 Cause_t * ric_cause = &(ies_ric_cause->value.choice.Cause);
261 ric_cause->present = (Cause_PR)this->getIEs().get_ricCause();
262 switch(this->getIEs().get_ricCause()){
263 case Cause_PR_ricService:
264 ric_cause->choice.ricService = this->getIEs().get_ricSubCause();
266 case Cause_PR_transport:
267 ric_cause->choice.transport = this->getIEs().get_ricSubCause();
269 case Cause_PR_protocol:
270 ric_cause->choice.protocol= this->getIEs().get_ricSubCause();
273 ric_cause->choice.misc = this->getIEs().get_ricSubCause();
275 case Cause_PR_ricRequest:
276 ric_cause->choice.ricRequest = this->getIEs().get_ricSubCause();
279 _error_string = _error_string + "Error ! Illegal cause enum " + std::to_string(this->getIEs().get_ricCause());
283 if(this->getIEs().get_is_criticality_diagnostic()) {
285 RICsubscriptionDeleteFailure_IEs_t *ies_criticdiag = &IE_array[ie_index];
286 ies_criticdiag->criticality = Criticality_ignore;
287 ies_criticdiag->id = ProtocolIE_ID_id_CriticalityDiagnostics;
288 ies_criticdiag->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_CriticalityDiagnostics;
289 CriticalityDiagnostics_t *critic_diag = &ies_criticdiag->value.choice.CriticalityDiagnostics;
291 TriggeringMessage_t *tmsg = (TriggeringMessage_t*) calloc(1, sizeof(TriggeringMessage_t));
292 *tmsg = this->getIEs().get_critical_diagnostic()->get_triggeringMessage();
293 critic_diag->triggeringMessage= tmsg;
295 RICrequestID_t *ricreq = (RICrequestID_t *)calloc(1, sizeof(RICrequestID_t));
296 ricrequest_ie->ricRequestorID = this->getIEs().get_critical_diagnostic()->get_ricRequestorID();
297 ricrequest_ie->ricInstanceID = this->getIEs().get_critical_diagnostic()->get_ricInstanceID();
298 critic_diag->ricRequestorID = ricreq;
300 ProcedureCode_t *pcode = (ProcedureCode_t*)calloc(1, sizeof(ProcedureCode_t));
301 *pcode = this->getIEs().get_critical_diagnostic()->get_procedureCode();
302 critic_diag->procedureCode =pcode;
304 Criticality_t *pcritical = (Criticality_t*)calloc(1, sizeof(Criticality_t));
305 *pcritical = this->getIEs().get_critical_diagnostic()->get_procedureCriticality();
306 critic_diag->procedureCriticality = pcritical;
309 if(this->getIEs().get_critical_diagnostic()->get_is_criticalityDiagnostics_list()){
311 critic_diag->iEsCriticalityDiagnostics = (CriticalityDiagnostics_IE_List_t*)calloc(1, sizeof(CriticalityDiagnostics_IE_List_t));
312 critic_diag->iEsCriticalityDiagnostics->list.count=0;
314 int lst_count = this->getIEs().get_critical_diagnostic()->get_list_count();
315 auto *lst = this->getIEs().get_critical_diagnostic()->get_list();
316 CD_array = (CriticalityDiagnostics_IE_Item_t*)calloc(lst_count, sizeof(CriticalityDiagnostics_IE_Item_t));
319 CD_array[i].iE_ID = l.get_typeOferror();
320 CD_array[i].typeOfError = l.get_ieID();
321 CD_array[i].iECriticality = l.get_iEcriticality();
322 int result = ASN_SEQUENCE_ADD(&(critic_diag->iEsCriticalityDiagnostics->list.array), &(CD_array[i]));
324 _error_string = "Error : Unable to assign memory to add CriticalityDiagnostics_IE item to set up list";