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_delete_response.hpp"
24 /* The xAPP need only worry about the get_fields from a response, since it does
25 not generate a response. Generating response however is included to support testing.
29 // Primarly for generation
30 subscription_delete_response::subscription_delete_response(void){
33 e2ap_pdu_obj = (E2N_E2AP_PDU_t *)calloc(1, sizeof(E2N_E2AP_PDU_t));
34 assert(e2ap_pdu_obj != 0);
37 successMsg = (E2N_SuccessfulOutcome_t *)calloc(1, sizeof(E2N_SuccessfulOutcome_t));
38 assert(successMsg != 0);
41 unsuccessMsg = (E2N_UnsuccessfulOutcome_t *)calloc(1, sizeof(E2N_UnsuccessfulOutcome_t));
42 assert(unsuccessMsg != 0);
45 IE_array = (E2N_RICsubscriptionDeleteResponse_IEs_t *)calloc(NUM_SUBSCRIPTION_DELETE_RESPONSE_IES, sizeof(E2N_RICsubscriptionDeleteResponse_IEs_t));
46 assert(IE_array != 0);
49 IE_Failure_array = (E2N_RICsubscriptionDeleteFailure_IEs_t *)calloc(NUM_SUBSCRIPTION_DELETE_FAILURE_IES, sizeof(E2N_RICsubscriptionDeleteFailure_IEs_t));
50 assert(IE_Failure_array != 0);
58 // Clear assigned protocolIE list from E2N_RIC indication IE container
59 subscription_delete_response::~subscription_delete_response(void){
61 mdclog_write(MDCLOG_DEBUG, "Freeing subscription delete response memory");
62 E2N_RICsubscriptionDeleteResponse_t * ric_subscription_delete_response = &(successMsg->value.choice.RICsubscriptionDeleteResponse);
64 for(unsigned int i = 0; i < ric_subscription_delete_response->protocolIEs.list.size ; i++){
65 ric_subscription_delete_response->protocolIEs.list.array[i] = 0;
69 E2N_RICsubscriptionDeleteFailure_t * ric_subscription_failure = &(unsuccessMsg->value.choice.RICsubscriptionDeleteFailure);
70 for(unsigned int i = 0; i < ric_subscription_failure->protocolIEs.list.size; i++){
71 ric_subscription_failure->protocolIEs.list.array[i] = 0;
75 free(IE_Failure_array);
77 ASN_STRUCT_FREE(asn_DEF_E2N_SuccessfulOutcome, successMsg);
79 ASN_STRUCT_FREE(asn_DEF_E2N_UnsuccessfulOutcome, unsuccessMsg);
81 e2ap_pdu_obj->choice.successfulOutcome = NULL;
82 e2ap_pdu_obj->choice.unsuccessfulOutcome = NULL;
84 ASN_STRUCT_FREE(asn_DEF_E2N_E2AP_PDU, e2ap_pdu_obj);
85 mdclog_write(MDCLOG_DEBUG, "Freed subscription delete response memory");
90 bool subscription_delete_response::encode_e2ap_subscription_delete_response(unsigned char *buf, size_t *size, subscription_response_helper &dinput, bool is_success){
95 res = set_fields(successMsg, dinput);
99 e2ap_pdu_obj->present = E2N_E2AP_PDU_PR_successfulOutcome;
100 e2ap_pdu_obj->choice.successfulOutcome = successMsg;
103 res = set_fields(unsuccessMsg, dinput);
107 e2ap_pdu_obj->present = E2N_E2AP_PDU_PR_unsuccessfulOutcome;
108 e2ap_pdu_obj->choice.unsuccessfulOutcome = unsuccessMsg;
112 int ret_constr = asn_check_constraints(&asn_DEF_E2N_E2AP_PDU, (void *) e2ap_pdu_obj, errbuf, &errbuf_len);
114 error_string.assign(errbuf, errbuf_len);
118 //xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2ap_pdu_obj);
120 asn_enc_rval_t retval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2AP_PDU, e2ap_pdu_obj, buf, *size);
122 if(retval.encoded == -1){
123 error_string.assign(strerror(errno));
124 error_string = "Error encoding subcription delete response. Reason = " + error_string;
128 if(*size < retval.encoded){
129 std::stringstream ss;
130 ss <<"Error encoding Subscription Delete Response . Reason = encoded pdu size " << retval.encoded << " exceeds buffer size " << *size << std::endl;
131 error_string = ss.str();
137 *size = retval.encoded;
142 bool subscription_delete_response::set_fields(E2N_SuccessfulOutcome_t *success, subscription_response_helper &helper){
145 error_string = "Invalid reference to success message in set fields subscription delete response";
149 unsigned int ie_index;
151 success->procedureCode = E2N_ProcedureCode_id_ricSubscriptionDelete;
152 success->criticality = E2N_Criticality_reject;
153 success->value.present = E2N_SuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse;
155 E2N_RICsubscriptionDeleteResponse_t * subscription_delete_response = &(success->value.choice.RICsubscriptionDeleteResponse);
156 subscription_delete_response->protocolIEs.list.count = 0;
159 E2N_RICsubscriptionDeleteResponse_IEs_t *ies_ricreq = &IE_array[ie_index];
161 ies_ricreq->criticality = E2N_Criticality_reject;
162 ies_ricreq->id = E2N_ProtocolIE_ID_id_RICrequestID;
163 ies_ricreq->value.present = E2N_RICsubscriptionDeleteResponse_IEs__value_PR_RICrequestID;
164 E2N_RICrequestID_t *ricrequest_ie = &ies_ricreq->value.choice.RICrequestID;
165 ricrequest_ie->ricRequestorID = helper.get_request_id();
166 ricrequest_ie->ricRequestSequenceNumber = helper.get_req_seq();
167 ASN_SEQUENCE_ADD(&subscription_delete_response->protocolIEs, ies_ricreq);
171 E2N_RICsubscriptionDeleteResponse_IEs_t *ies_ranfunc = &IE_array[ie_index];
172 ies_ranfunc->criticality = E2N_Criticality_reject;
173 ies_ranfunc->id = E2N_ProtocolIE_ID_id_RANfunctionID;
174 ies_ranfunc->value.present = E2N_RICsubscriptionDeleteResponse_IEs__value_PR_RANfunctionID;
175 E2N_RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;
176 *ranfunction_ie = helper.get_function_id();
177 ASN_SEQUENCE_ADD(&subscription_delete_response->protocolIEs, ies_ranfunc);
184 bool subscription_delete_response:: get_fields(E2N_SuccessfulOutcome_t * success_msg, subscription_response_helper & dout)
187 if (success_msg == 0){
188 error_string = "Invalid reference to success message inn get fields subscription delete response";
192 E2N_RICrequestID_t *requestid;
193 E2N_RANfunctionID_t * ranfunctionid;
195 for(int edx = 0; edx < success_msg->value.choice.RICsubscriptionDeleteResponse.protocolIEs.list.count; edx++) {
196 E2N_RICsubscriptionDeleteResponse_IEs_t *memb_ptr = success_msg->value.choice.RICsubscriptionDeleteResponse.protocolIEs.list.array[edx];
200 case (E2N_ProtocolIE_ID_id_RICrequestID):
201 requestid = &memb_ptr->value.choice.RICrequestID;
202 dout.set_request(requestid->ricRequestorID, requestid->ricRequestSequenceNumber);
205 case (E2N_ProtocolIE_ID_id_RANfunctionID):
206 ranfunctionid = &memb_ptr->value.choice.RANfunctionID;
207 dout.set_function_id(*ranfunctionid);
214 //asn_fprint(stdout, &asn_DEF_E2AP_PDU, e2pdu);
218 bool subscription_delete_response::set_fields(E2N_UnsuccessfulOutcome_t *unsuccess, subscription_response_helper &helper){
221 error_string = "Invalid reference to unsuccess message in set fields subscription delete response";
225 unsigned int ie_index;
227 unsuccess->procedureCode = E2N_ProcedureCode_id_ricSubscriptionDelete;
228 unsuccess->criticality = E2N_Criticality_reject;
229 unsuccess->value.present = E2N_UnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure;
231 E2N_RICsubscriptionDeleteFailure_t * ric_subscription_failure = &(unsuccess->value.choice.RICsubscriptionDeleteFailure);
232 ric_subscription_failure->protocolIEs.list.count = 0;
235 E2N_RICsubscriptionDeleteFailure_IEs_t *ies_ricreq = &IE_Failure_array[ie_index];
237 ies_ricreq->criticality = E2N_Criticality_reject;
238 ies_ricreq->id = E2N_ProtocolIE_ID_id_RICrequestID;
239 ies_ricreq->value.present = E2N_RICsubscriptionDeleteFailure_IEs__value_PR_RICrequestID;
240 E2N_RICrequestID_t *ricrequest_ie = &ies_ricreq->value.choice.RICrequestID;
241 ricrequest_ie->ricRequestorID = helper.get_request_id();
242 ricrequest_ie->ricRequestSequenceNumber = helper.get_req_seq();
243 ASN_SEQUENCE_ADD(&ric_subscription_failure->protocolIEs, ies_ricreq);
246 E2N_RICsubscriptionDeleteFailure_IEs_t *ies_ranfunc = &IE_Failure_array[ie_index];
247 ies_ranfunc->criticality = E2N_Criticality_reject;
248 ies_ranfunc->id = E2N_ProtocolIE_ID_id_RANfunctionID;
249 ies_ranfunc->value.present = E2N_RICsubscriptionDeleteFailure_IEs__value_PR_RANfunctionID;
250 E2N_RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;
251 *ranfunction_ie = helper.get_function_id();
252 ASN_SEQUENCE_ADD(&ric_subscription_failure->protocolIEs, ies_ranfunc);
259 bool subscription_delete_response:: get_fields(E2N_UnsuccessfulOutcome_t * unsuccess_msg, subscription_response_helper & dout)
262 if (unsuccess_msg == 0){
263 error_string = "Invalid reference to unsuccess message in get fields subscription delete response";
267 E2N_RICrequestID_t *requestid;
268 E2N_RANfunctionID_t * ranfunctionid;
270 for(int edx = 0; edx < unsuccess_msg->value.choice.RICsubscriptionDeleteFailure.protocolIEs.list.count; edx++) {
271 E2N_RICsubscriptionDeleteFailure_IEs_t *memb_ptr = unsuccess_msg->value.choice.RICsubscriptionDeleteFailure.protocolIEs.list.array[edx];
275 case (E2N_ProtocolIE_ID_id_RICrequestID):
276 requestid = &memb_ptr->value.choice.RICrequestID;
277 dout.set_request(requestid->ricRequestorID, requestid->ricRequestSequenceNumber);
280 case (E2N_ProtocolIE_ID_id_RANfunctionID):
281 ranfunctionid = &memb_ptr->value.choice.RANfunctionID;
282 dout.set_function_id(*ranfunctionid);
290 //asn_fprint(stdout, &asn_DEF_E2AP_PDU, e2pdu);