2 ==================================================================================
3 Copyright (c) 2019-2020 AT&T Intellectual Property.
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
9 http://www.apache.org/licenses/LICENSE-2.0
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 ==================================================================================
20 #include "subscription_delete_response.hpp"
22 /* The xAPP need only worry about the get_fields from a response, since it does
23 not generate a response. Generating response however is included to support testing.
27 // Primarly for generation
28 subscription_delete_response::subscription_delete_response(void){
31 e2ap_pdu_obj = (E2AP_PDU_t *)calloc(1, sizeof(E2AP_PDU_t));
32 assert(e2ap_pdu_obj != 0);
35 successMsg = (SuccessfulOutcome_t *)calloc(1, sizeof(SuccessfulOutcome_t));
36 assert(successMsg != 0);
39 unsuccessMsg = (UnsuccessfulOutcome_t *)calloc(1, sizeof(UnsuccessfulOutcome_t));
40 assert(unsuccessMsg != 0);
43 IE_array = (RICsubscriptionDeleteResponse_IEs_t *)calloc(NUM_SUBSCRIPTION_DELETE_RESPONSE_IES, sizeof(RICsubscriptionDeleteResponse_IEs_t));
44 assert(IE_array != 0);
47 IE_Failure_array = (RICsubscriptionDeleteFailure_IEs_t *)calloc(NUM_SUBSCRIPTION_DELETE_FAILURE_IES, sizeof(RICsubscriptionDeleteFailure_IEs_t));
48 assert(IE_Failure_array != 0);
56 // Clear assigned protocolIE list from RIC indication IE container
57 subscription_delete_response::~subscription_delete_response(void){
59 mdclog_write(MDCLOG_DEBUG, "Freeing subscription delete response memory");
60 RICsubscriptionDeleteResponse_t * ric_subscription_delete_response = &(successMsg->value.choice.RICsubscriptionDeleteResponse);
62 for(unsigned int i = 0; i < ric_subscription_delete_response->protocolIEs.list.size ; i++){
63 ric_subscription_delete_response->protocolIEs.list.array[i] = 0;
67 RICsubscriptionDeleteFailure_t * ric_subscription_failure = &(unsuccessMsg->value.choice.RICsubscriptionDeleteFailure);
68 for(unsigned int i = 0; i < ric_subscription_failure->protocolIEs.list.size; i++){
69 ric_subscription_failure->protocolIEs.list.array[i] = 0;
73 free(IE_Failure_array);
75 ASN_STRUCT_FREE(asn_DEF_SuccessfulOutcome, successMsg);
77 ASN_STRUCT_FREE(asn_DEF_UnsuccessfulOutcome, unsuccessMsg);
79 e2ap_pdu_obj->choice.successfulOutcome = NULL;
80 e2ap_pdu_obj->choice.unsuccessfulOutcome = NULL;
82 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, e2ap_pdu_obj);
83 mdclog_write(MDCLOG_DEBUG, "Freed subscription delete response memory");
88 bool subscription_delete_response::encode_e2ap_subscription_delete_response(unsigned char *buf, size_t *size, subscription_response_helper &dinput, bool is_success){
93 res = set_fields(successMsg, dinput);
97 e2ap_pdu_obj->present = E2AP_PDU_PR_successfulOutcome;
98 e2ap_pdu_obj->choice.successfulOutcome = successMsg;
101 res = set_fields(unsuccessMsg, dinput);
105 e2ap_pdu_obj->present = E2AP_PDU_PR_unsuccessfulOutcome;
106 e2ap_pdu_obj->choice.unsuccessfulOutcome = unsuccessMsg;
110 int ret_constr = asn_check_constraints(&asn_DEF_E2AP_PDU, (void *) e2ap_pdu_obj, errbuf, &errbuf_len);
112 error_string.assign(errbuf, errbuf_len);
116 //xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2ap_pdu_obj);
118 asn_enc_rval_t retval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, e2ap_pdu_obj, buf, *size);
120 if(retval.encoded == -1){
121 error_string.assign(strerror(errno));
122 error_string = "Error encoding subcription delete response. Reason = " + error_string;
126 if(*size < retval.encoded){
127 std::stringstream ss;
128 ss <<"Error encoding Subscription Delete Response . Reason = encoded pdu size " << retval.encoded << " exceeds buffer size " << *size << std::endl;
129 error_string = ss.str();
135 *size = retval.encoded;
140 bool subscription_delete_response::set_fields(SuccessfulOutcome_t *success, subscription_response_helper &helper){
143 error_string = "Invalid reference to success message in set fields subscription delete response";
147 unsigned int ie_index;
149 success->procedureCode = ProcedureCode_id_RICsubscriptionDelete;
150 success->criticality = Criticality_reject;
151 success->value.present = SuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse;
153 RICsubscriptionDeleteResponse_t * subscription_delete_response = &(success->value.choice.RICsubscriptionDeleteResponse);
154 subscription_delete_response->protocolIEs.list.count = 0;
157 RICsubscriptionDeleteResponse_IEs_t *ies_ricreq = &IE_array[ie_index];
159 ies_ricreq->criticality = Criticality_reject;
160 ies_ricreq->id = ProtocolIE_ID_id_RICrequestID;
161 ies_ricreq->value.present = RICsubscriptionDeleteResponse_IEs__value_PR_RICrequestID;
162 RICrequestID_t *ricrequest_ie = &ies_ricreq->value.choice.RICrequestID;
163 ricrequest_ie->ricRequestorID = helper.get_request_id();
164 //ricrequest_ie->ricRequestSequenceNumber = helper.get_req_seq();
165 ASN_SEQUENCE_ADD(&subscription_delete_response->protocolIEs, ies_ricreq);
169 RICsubscriptionDeleteResponse_IEs_t *ies_ranfunc = &IE_array[ie_index];
170 ies_ranfunc->criticality = Criticality_reject;
171 ies_ranfunc->id = ProtocolIE_ID_id_RANfunctionID;
172 ies_ranfunc->value.present = RICsubscriptionDeleteResponse_IEs__value_PR_RANfunctionID;
173 RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;
174 *ranfunction_ie = helper.get_function_id();
175 ASN_SEQUENCE_ADD(&subscription_delete_response->protocolIEs, ies_ranfunc);
182 bool subscription_delete_response:: get_fields(SuccessfulOutcome_t * success_msg, subscription_response_helper & dout)
185 if (success_msg == 0){
186 error_string = "Invalid reference to success message inn get fields subscription delete response";
190 RICrequestID_t *requestid;
191 RANfunctionID_t * ranfunctionid;
193 for(int edx = 0; edx < success_msg->value.choice.RICsubscriptionDeleteResponse.protocolIEs.list.count; edx++) {
194 RICsubscriptionDeleteResponse_IEs_t *memb_ptr = success_msg->value.choice.RICsubscriptionDeleteResponse.protocolIEs.list.array[edx];
198 case (ProtocolIE_ID_id_RICrequestID):
199 requestid = &memb_ptr->value.choice.RICrequestID;
200 //dout.set_request(requestid->ricRequestorID, requestid->ricRequestSequenceNumber);
203 case (ProtocolIE_ID_id_RANfunctionID):
204 ranfunctionid = &memb_ptr->value.choice.RANfunctionID;
205 dout.set_function_id(*ranfunctionid);
212 //asn_fprint(stdout, &asn_DEF_E2AP_PDU, e2pdu);
216 bool subscription_delete_response::set_fields(UnsuccessfulOutcome_t *unsuccess, subscription_response_helper &helper){
219 error_string = "Invalid reference to unsuccess message in set fields subscription delete response";
223 unsigned int ie_index;
225 unsuccess->procedureCode = ProcedureCode_id_RICsubscriptionDelete;
226 unsuccess->criticality = Criticality_reject;
227 unsuccess->value.present = UnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure;
229 RICsubscriptionDeleteFailure_t * ric_subscription_failure = &(unsuccess->value.choice.RICsubscriptionDeleteFailure);
230 ric_subscription_failure->protocolIEs.list.count = 0;
233 RICsubscriptionDeleteFailure_IEs_t *ies_ricreq = &IE_Failure_array[ie_index];
235 ies_ricreq->criticality = Criticality_reject;
236 ies_ricreq->id = ProtocolIE_ID_id_RICrequestID;
237 ies_ricreq->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RICrequestID;
238 RICrequestID_t *ricrequest_ie = &ies_ricreq->value.choice.RICrequestID;
239 ricrequest_ie->ricRequestorID = helper.get_request_id();
240 //ricrequest_ie->ricRequestSequenceNumber = helper.get_req_seq();
241 ASN_SEQUENCE_ADD(&ric_subscription_failure->protocolIEs, ies_ricreq);
244 RICsubscriptionDeleteFailure_IEs_t *ies_ranfunc = &IE_Failure_array[ie_index];
245 ies_ranfunc->criticality = Criticality_reject;
246 ies_ranfunc->id = ProtocolIE_ID_id_RANfunctionID;
247 ies_ranfunc->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RANfunctionID;
248 RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;
249 *ranfunction_ie = helper.get_function_id();
250 ASN_SEQUENCE_ADD(&ric_subscription_failure->protocolIEs, ies_ranfunc);
257 bool subscription_delete_response:: get_fields(UnsuccessfulOutcome_t * unsuccess_msg, subscription_response_helper & dout)
260 if (unsuccess_msg == 0){
261 error_string = "Invalid reference to unsuccess message in get fields subscription delete response";
265 RICrequestID_t *requestid;
266 RANfunctionID_t * ranfunctionid;
268 for(int edx = 0; edx < unsuccess_msg->value.choice.RICsubscriptionDeleteFailure.protocolIEs.list.count; edx++) {
269 RICsubscriptionDeleteFailure_IEs_t *memb_ptr = unsuccess_msg->value.choice.RICsubscriptionDeleteFailure.protocolIEs.list.array[edx];
273 case (ProtocolIE_ID_id_RICrequestID):
274 requestid = &memb_ptr->value.choice.RICrequestID;
275 //dout.set_request(requestid->ricRequestorID, requestid->ricRequestSequenceNumber);
278 case (ProtocolIE_ID_id_RANfunctionID):
279 ranfunctionid = &memb_ptr->value.choice.RANfunctionID;
280 dout.set_function_id(*ranfunctionid);
288 //asn_fprint(stdout, &asn_DEF_E2AP_PDU, e2pdu);