X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=e2ap%2Fwrapper.c;h=7dad60cc56c01e708efb0123ac93c3a318236608;hb=960885a60feb1ef3f9f654c7f4caf73f7a25dc4a;hp=1e38f0f2eb1481b9f418465337184adb4fbd8d70;hpb=21b61dd76570beb43afc74289296e831914d9060;p=ric-app%2Frc.git diff --git a/e2ap/wrapper.c b/e2ap/wrapper.c index 1e38f0f..7dad60c 100644 --- a/e2ap/wrapper.c +++ b/e2ap/wrapper.c @@ -139,4 +139,76 @@ ssize_t e2ap_encode_ric_control_request_message(void *buffer, size_t buf_size, l return encode_E2AP_PDU(init, buffer, buf_size); } - +RICControlAcknowledge* e2ap_decode_ric_control_acknowledge_message(void *buffer, size_t buf_size) +{ + E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size); + if ( pdu != NULL && pdu->present == E2AP_PDU_PR_successfulOutcome) + { + SuccessfulOutcome_t* successfulOutcome = pdu->choice.successfulOutcome; + if ( successfulOutcome->procedureCode == ProcedureCode_id_RICcontrol + && successfulOutcome->value.present == SuccessfulOutcome__value_PR_RICcontrolAcknowledge) + { + RICcontrolAcknowledge_t *controlAck = &(successfulOutcome->value.choice.RICcontrolAcknowledge); + RICControlAcknowledge *msg = (RICControlAcknowledge *)calloc(1, sizeof(RICControlAcknowledge)); + int i = 0; + for (i; i < controlAck->protocolIEs.list.count; ++i ) + { + if(controlAck->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID) + { + msg->requestorID = controlAck->protocolIEs.list.array[i]->value.choice.RICrequestID.ricRequestorID; + msg->instanceID = controlAck->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID; + } + else if (controlAck->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RANfunctionID) { + msg->ranfunctionID = controlAck->protocolIEs.list.array[i]->value.choice.RANfunctionID; + } + else if(controlAck->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICcallProcessID) { + size_t callProcessIDSize = controlAck->protocolIEs.list.array[i]->value.choice.RICcallProcessID.size; + msg->callProcessID = calloc(1, callProcessIDSize); + if (!msg->callProcessID) { + fprintf(stderr, "alloc RICcallProcessID failed\n"); + e2ap_free_decoded_ric_control_ack(msg); + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu); + return NULL; + } + + memcpy(msg->callProcessID, controlAck->protocolIEs.list.array[i]->value.choice.RICcallProcessID.buf, callProcessIDSize); + msg->callProcessIDSize = callProcessIDSize; + } + else if(controlAck->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICcontrolOutcome) { + size_t ricControlOutComeSize = controlAck->protocolIEs.list.array[i]->value.choice.RICcontrolOutcome.size; + msg->ricControlOutCome = calloc(1, ricControlOutComeSize); + if (!msg->ricControlOutCome) { + fprintf(stderr, "alloc ricControlOutCome failed\n"); + e2ap_free_decoded_ric_control_ack(msg); + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu); + return NULL; + } + + memcpy(msg->ricControlOutCome, controlAck->protocolIEs.list.array[i]->value.choice.RICcontrolOutcome.buf, ricControlOutComeSize); + msg->ricControlOutComeSize = ricControlOutComeSize; + } + } + return msg; + } + } + + if(pdu != NULL) + ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu); + return NULL; +} + +void e2ap_free_decoded_ric_control_ack(RICControlAcknowledge* msg) { + if(msg == NULL) { + return; + } + if(msg->callProcessID != NULL) { + free(msg->callProcessID); + msg->callProcessID = NULL; + } + if(msg->ricControlOutCome != NULL) { + free(msg->ricControlOutCome); + msg->ricControlOutCome = NULL; + } + free(msg); + msg = NULL; +}