From: barveankit Date: Wed, 19 Jan 2022 13:27:08 +0000 (+0530) Subject: [Epic-ID: ODUHIGH-404][Task-ID: ODUHIGH-413] Modification of E2setup request and... X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?p=o-du%2Fl2.git;a=commitdiff_plain;h=c548e17125cafaa528acd0f040f93c188b00a488 [Epic-ID: ODUHIGH-404][Task-ID: ODUHIGH-413] Modification of E2setup request and response Signed-off-by: barveankit Change-Id: I0a56b1de20b1e7495153383bd217feafda10365d Signed-off-by: barveankit --- diff --git a/src/du_app/du_cfg.h b/src/du_app/du_cfg.h index 80cd078b8..a8a6f2ac4 100644 --- a/src/du_app/du_cfg.h +++ b/src/du_app/du_cfg.h @@ -64,6 +64,7 @@ #define NR_BANDWIDTH BANDWIDTH_20MHZ #endif +#define TRANS_ID 1 #define DU_TAC 1 #define PLMN_MCC0 3 #define PLMN_MCC1 1 @@ -1262,6 +1263,14 @@ typedef struct duCfgParams CopyOfRecvdSliceCfg tempSliceCfg; }DuCfgParams; +typedef struct f1SetupMsg +{ + uint8_t f1MsgReqBufSize; + char *f1MsgReqBuf; + uint8_t f1MsgRspBufSize; + char *f1MsgRspBuf; +}F1SetupMsg; + DuCfgParams duCfgParam; /*function declarations */ diff --git a/src/du_app/du_e2ap_msg_hdl.c b/src/du_app/du_e2ap_msg_hdl.c index 57a89f900..edcaf1537 100644 --- a/src/du_app/du_e2ap_msg_hdl.c +++ b/src/du_app/du_e2ap_msg_hdl.c @@ -34,9 +34,9 @@ #include "E2AP-PDU.h" #include "du_e2ap_msg_hdl.h" #include "odu_common_codec.h" +#include "E2nodeComponentInterfaceF1.h" +#include "E2setupRequest.h" -/* Global variable */ -DuCfgParams duCfgParam; /******************************************************************* * * @brief Builds Global gNodeB Params @@ -93,6 +93,109 @@ uint8_t BuildGlobalgNBId(GlobalE2node_gNB_ID_t *gNbId) return ret; } +/******************************************************************* + * + * @brief Builds E2 node config addition list + * + * @details + * + * Function : BuildE2NodeConfigAddList + * + * Functionality: Building E2 node config addition list + * + * @params[in] E2nodeComponentConfigAddition_List_t *e2NodeAddList + * @return ROK - success + * RFAILED - failure + * + ******************************************************************/ + +uint8_t BuildE2NodeConfigAddList(E2nodeComponentConfigAddition_List_t *e2NodeAddList) +{ + uint8_t arrIdx = 0; + E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItemIe; + E2nodeComponentConfigAddition_Item_t *e2NodeAddItem; + + e2NodeAddList->list.count = 1; + e2NodeAddList->list.size = e2NodeAddList->list.count * sizeof(E2nodeComponentConfigAddition_ItemIEs_t *); + DU_ALLOC(e2NodeAddList->list.array, e2NodeAddList->list.size); + if(e2NodeAddList->list.array == NULLP) + { + DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigAddList %d",__LINE__); + return RFAILED; + } + + for(arrIdx = 0; arrIdx< e2NodeAddList->list.count; arrIdx++) + { + DU_ALLOC(e2NodeAddList->list.array[arrIdx], sizeof(E2nodeComponentConfigAddition_ItemIEs_t)); + if(e2NodeAddList->list.array[arrIdx] == NULLP) + { + DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigAddList %d",__LINE__); + return RFAILED; + } + } + + arrIdx = 0; + e2NodeAddItemIe = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[arrIdx]; + e2NodeAddItemIe->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAddition_Item; + e2NodeAddItemIe->criticality = CriticalityE2_reject; + e2NodeAddItemIe->value.present = E2nodeComponentConfigAddition_ItemIEs__value_PR_E2nodeComponentConfigAddition_Item; + e2NodeAddItem = &e2NodeAddItemIe->value.choice.E2nodeComponentConfigAddition_Item; + + /* E2nodeComponentInterfaceType */ + e2NodeAddItem->e2nodeComponentInterfaceType = E2nodeComponentInterfaceType_f1; + + /* E2 Node Component Request Part */ + e2NodeAddItem->e2nodeComponentConfiguration.e2nodeComponentRequestPart.size = duCb.f1SetupReqAndRspMsg.f1MsgReqBufSize; + DU_ALLOC(e2NodeAddItem->e2nodeComponentConfiguration.e2nodeComponentRequestPart.buf,\ + e2NodeAddItem->e2nodeComponentConfiguration.e2nodeComponentRequestPart.size); + if(e2NodeAddItem->e2nodeComponentConfiguration.e2nodeComponentRequestPart.buf == NULLP) + { + DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigAddList %d",__LINE__); + return RFAILED; + } + + memcpy(e2NodeAddItem->e2nodeComponentConfiguration.e2nodeComponentRequestPart.buf,\ + duCb.f1SetupReqAndRspMsg.f1MsgReqBuf, e2NodeAddItem->e2nodeComponentConfiguration.\ + e2nodeComponentRequestPart.size); + DU_FREE(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf,duCb.f1SetupReqAndRspMsg.f1MsgReqBufSize); + + /* E2 Node Component Response Part */ + e2NodeAddItem->e2nodeComponentConfiguration.e2nodeComponentResponsePart.size = duCb.f1SetupReqAndRspMsg.f1MsgRspBufSize; + DU_ALLOC(e2NodeAddItem->e2nodeComponentConfiguration.e2nodeComponentResponsePart.buf, \ + e2NodeAddItem->e2nodeComponentConfiguration.e2nodeComponentResponsePart.size); + if(e2NodeAddItem->e2nodeComponentConfiguration.e2nodeComponentResponsePart.buf == NULLP) + { + DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigAddList %d",__LINE__); + return RFAILED; + } + memcpy(e2NodeAddItem->e2nodeComponentConfiguration.e2nodeComponentResponsePart.buf, \ + duCb.f1SetupReqAndRspMsg.f1MsgRspBuf, e2NodeAddItem->e2nodeComponentConfiguration.\ + e2nodeComponentResponsePart.size); + DU_FREE(duCb.f1SetupReqAndRspMsg.f1MsgRspBuf, duCb.f1SetupReqAndRspMsg.f1MsgRspBufSize); + + /* E2 Node Component ID */ + e2NodeAddItem->e2nodeComponentID.present = E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1; + DU_ALLOC(e2NodeAddItem->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1,\ + sizeof(E2nodeComponentInterfaceF1_t)); + if(e2NodeAddItem->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1 == NULLP) + { + DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigAddList %d",__LINE__); + return RFAILED; + } + e2NodeAddItem->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size = sizeof(uint8_t); + DU_ALLOC(e2NodeAddItem->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf,\ + e2NodeAddItem->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size); + + if(e2NodeAddItem->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf == NULLP) + { + DU_LOG("\nERROR -->list. E2AP: Memory allocation failed for BuildE2NodeConfigAddList %d",__LINE__); + return RFAILED; + } + e2NodeAddItem->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[arrIdx] = duCfgParam.duId; + return ROK; + +} + /******************************************************************* * * @brief Fills the initiating IE for E2 Setup Request @@ -114,75 +217,196 @@ uint8_t BuildGlobalgNBId(GlobalE2node_gNB_ID_t *gNbId) uint8_t fillE2SetupReq(E2setupRequest_t **e2SetupReq, uint8_t *idx) { uint8_t elementCnt = 0; - uint8_t idx2 = 0; + uint8_t arrIdx = 0; uint8_t ret = ROK; if(*e2SetupReq != NULLP) { - elementCnt = 1; + elementCnt = 3; (*e2SetupReq)->protocolIEs.list.count = elementCnt; - (*e2SetupReq)->protocolIEs.list.size = \ - elementCnt * sizeof(E2setupRequestIEs_t); + (*e2SetupReq)->protocolIEs.list.size = elementCnt * sizeof(E2setupRequestIEs_t*); /* Initialize the E2Setup members */ DU_ALLOC((*e2SetupReq)->protocolIEs.list.array, \ - (*e2SetupReq)->protocolIEs.list.size); + (*e2SetupReq)->protocolIEs.list.size); if((*e2SetupReq)->protocolIEs.list.array == NULLP) { - DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements"); - ret = RFAILED; + DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements"); + return RFAILED; + } + for(*idx = 0; *idx < elementCnt; (*idx)++) + { + DU_ALLOC((*e2SetupReq)->protocolIEs.list.array[*idx],\ + sizeof(E2setupRequestIEs_t)); + if((*e2SetupReq)->protocolIEs.list.array[*idx] == NULLP) + { + DU_LOG("\nERROR --> E2AP : Memory allocation failed for arrayidx [%d]", *idx); + return RFAILED; + } + } + arrIdx = 0; + + /* TransactionID */ + (*e2SetupReq)->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID; + (*e2SetupReq)->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject; + (*e2SetupReq)->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_TransactionID; + (*e2SetupReq)->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = TRANS_ID; + + arrIdx++; + /* GlobalE2node_gNB_ID */ + (*e2SetupReq)->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_GlobalE2node_ID; + (*e2SetupReq)->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject; + (*e2SetupReq)->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_GlobalE2node_ID; + (*e2SetupReq)->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.present = GlobalE2node_ID_PR_gNB; + + DU_ALLOC((*e2SetupReq)->protocolIEs.list.array[arrIdx]->value.choice.\ + GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t)); + if((*e2SetupReq)->protocolIEs.list.array[arrIdx]->value.choice.\ + GlobalE2node_ID.choice.gNB == NULLP) + { + DU_LOG("\nERROR --> E2AP : Memory allocation failed for gNbId"); + return RFAILED; } else { - for(*idx = 0; *idx < elementCnt; (*idx)++) - { - DU_ALLOC((*e2SetupReq)->protocolIEs.list.array[*idx],\ - sizeof(E2setupRequestIEs_t)); - if((*e2SetupReq)->protocolIEs.list.array[*idx] == NULLP) - { - DU_LOG("\nERROR --> E2AP : Memory allocation failed for arrayidx [%d]", *idx); - ret = RFAILED; - } - else - { - /* GlobalE2node_gNB_ID */ - (*e2SetupReq)->protocolIEs.list.array[idx2]->id = \ - ProtocolIE_IDE2_id_GlobalE2node_ID; - (*e2SetupReq)->protocolIEs.list.array[idx2]->criticality = \ - CriticalityE2_reject; - (*e2SetupReq)->protocolIEs.list.array[idx2]->value.present =\ - E2setupRequestIEs__value_PR_GlobalE2node_ID; - (*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\ - GlobalE2node_ID.present = GlobalE2node_ID_PR_gNB; - - DU_ALLOC((*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\ - GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t)); - if((*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\ - GlobalE2node_ID.choice.gNB == NULLP) - { - DU_LOG("\nERROR --> E2AP : Memory allocation failed for gNbId"); - ret = RFAILED; - } - else - { - ret = BuildGlobalgNBId((*e2SetupReq)->protocolIEs.list.array[idx2]->value.\ - choice.GlobalE2node_ID.choice.gNB); - if(ret != ROK) - { - ret = RFAILED; - } - } - - } - } + ret = BuildGlobalgNBId((*e2SetupReq)->protocolIEs.list.array[arrIdx]->value.\ + choice.GlobalE2node_ID.choice.gNB); + if(ret != ROK) + { + DU_LOG("\nERROR --> E2AP : Failed to build Global Gnb Id"); + return RFAILED; + } + } + + arrIdx++; + /* E2 Node Component Configuration Addition List */ + (*e2SetupReq)->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAddition; + (*e2SetupReq)->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject; + (*e2SetupReq)->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_E2nodeComponentConfigAddition_List; + if(BuildE2NodeConfigAddList(&((*e2SetupReq)->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List))!=ROK) + { + DU_LOG("\nERROR --> E2AP : Failed to E2 Node config addition list"); + return RFAILED; } + } else { - ret = RFAILED; DU_LOG("\nERROR --> E2AP : received e2SetupReq is NULL"); + return RFAILED; + } + return ROK; +} + + +/******************************************************************* + * + * @brief De Allocate E2 Setup Request Message + * + * @details + * + * Function : FreeE2SetupReq + * + * Functionality: De-Allocating E2 Setup request Message + * + * @params[in] E2AP_PDU_t *e2apMsg + + * @return void + * + * ****************************************************************/ + +void FreeE2SetupReq(E2AP_PDU_t *e2apMsg) +{ + uint8_t arrIdx = 0; + uint8_t e2NodeAddListIdx =0; + E2setupRequest_t *e2SetupReq; + E2nodeComponentConfigAddition_List_t *e2NodeAddList; + E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItem; + + /* De-allocating Memory */ + if(e2apMsg != NULLP) + { + if(e2apMsg->choice.initiatingMessage != NULLP) + { + e2SetupReq = &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest; + if(e2SetupReq->protocolIEs.list.array != NULLP) + { + for(arrIdx = 0; arrIdx < e2SetupReq->protocolIEs.list.count; arrIdx++) + { + if(e2SetupReq->protocolIEs.list.array[arrIdx] != NULLP) + { + switch(e2SetupReq->protocolIEs.list.array[arrIdx]->id) + { + case ProtocolIE_IDE2_id_TransactionID: + break; + case ProtocolIE_IDE2_id_GlobalE2node_ID: + { + if(e2SetupReq->protocolIEs.list.array[arrIdx]->\ + value.choice.GlobalE2node_ID.choice.gNB != NULLP) + { + GlobalE2node_gNB_ID_t *gNbId = NULLP; + gNbId = e2SetupReq->protocolIEs.list.array[arrIdx]->\ + value.choice.GlobalE2node_ID.choice.gNB; + if(gNbId->global_gNB_ID.plmn_id.buf != NULLP) + { + DU_FREE(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf,\ + gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size); + DU_FREE(gNbId->global_gNB_ID.plmn_id.buf,\ + gNbId->global_gNB_ID.plmn_id.size); + } + DU_FREE(e2SetupReq->protocolIEs.list.array[arrIdx]->value.\ + choice.GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t)); + } + break; + } + case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition: + { + e2NodeAddList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List; + if(e2NodeAddList->list.array) + { + for(e2NodeAddListIdx = 0; e2NodeAddListIdx< e2NodeAddList->list.count; e2NodeAddListIdx++) + { + e2NodeAddItem = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[e2NodeAddListIdx]; + + /* Free E2 Node Component Request Part */ + DU_FREE(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration.e2nodeComponentRequestPart.buf,\ + e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration.e2nodeComponentRequestPart.size); + + /* Free E2 Node Component Response Part */ + DU_FREE(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration.\ + e2nodeComponentResponsePart.buf, \ + e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration.e2nodeComponentResponsePart.size); + + /* Free E2 Node Component ID */ + if(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1) + { + DU_FREE(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.\ + e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf,\ + e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.\ + e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size); + DU_FREE(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1,\ + sizeof(E2nodeComponentInterfaceF1_t)); + } + DU_FREE(e2NodeAddList->list.array[e2NodeAddListIdx], sizeof(E2nodeComponentConfigAddition_ItemIEs_t)); + } + DU_FREE(e2NodeAddList->list.array, e2NodeAddList->list.size); + } + break; + } + default: + DU_LOG("\nERROR --> E2AP: Invalid event at e2SetupRequet %ld ",\ + (e2SetupReq->protocolIEs.list.array[arrIdx]->id)); + break; + } + DU_FREE(e2SetupReq->protocolIEs.list.array[arrIdx], sizeof(E2setupRequestIEs_t)); + } + } + DU_FREE(e2SetupReq->protocolIEs.list.array, e2SetupReq->protocolIEs.list.size); + } + DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t)); + } + DU_FREE(e2apMsg, sizeof(E2AP_PDU_t)); } - return ret; } /******************************************************************* @@ -214,16 +438,16 @@ uint8_t BuildAndSendE2SetupReq() DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t)); if(e2apMsg == NULLP) { - DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed"); - break; + DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed"); + break; } e2apMsg->present = E2AP_PDU_PR_initiatingMessage; DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t)); if(e2apMsg->choice.initiatingMessage == NULLP) { - DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed"); - DU_FREE(e2apMsg, sizeof(E2AP_PDU_t)); - return RFAILED; + DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed"); + DU_FREE(e2apMsg, sizeof(E2AP_PDU_t)); + return RFAILED; } e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject; e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2setup; @@ -233,8 +457,8 @@ uint8_t BuildAndSendE2SetupReq() ret = fillE2SetupReq(&e2SetupReq, &idx); if(ret != ROK) { - DU_LOG("\nERROR --> E2AP : fillE2SetupReq() failed"); - break; + DU_LOG("\nERROR --> E2AP : fillE2SetupReq() failed"); + break; } /* Prints the Msg formed */ xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg); @@ -242,108 +466,33 @@ uint8_t BuildAndSendE2SetupReq() memset(encBuf, 0, ENC_BUF_MAX_LEN); encBufSize = 0; encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\ - encBuf); + encBuf); if(encRetVal.encoded == ENCODE_FAIL) { - DU_LOG("\nERROR --> E2AP : Could not encode E2SetupRequest structure (at %s)\n",\ - encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); - break; + DU_LOG("\nERROR --> E2AP : Could not encode E2SetupRequest structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + break; } else { - DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupRequest\n"); - for(int i=0; i< encBufSize; i++) - { - printf("%x",encBuf[i]); - } + DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupRequest\n"); + for(int i=0; i< encBufSize; i++) + { + printf("%x",encBuf[i]); + } } if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK) { - DU_LOG("\nERROR --> E2AP : Sending E2 Setup request failed"); + DU_LOG("\nERROR --> E2AP : Sending E2 Setup request failed"); } break; }while(true); - deAllocateE2SetupReqMsg(e2apMsg, e2SetupReq, idx); + FreeE2SetupReq(e2apMsg); return ret; }/* End of BuildAndSendE2SetupReq */ -/******************************************************************* - * - * @brief De Allocate E2 Setup Request Message - * - * @details - * - * Function : deAllocateE2SetupReqMsg - * - * Functionality: De-Allocating E2 Setup request Message - * - * @params[in] E2AP_PDU_t *e2apMsg - * E2setupRequest_t *e2SetupReq - * @return ROK - success - * RFAILED - failure - * - * ****************************************************************/ - -uint8_t deAllocateE2SetupReqMsg(E2AP_PDU_t *e2apMsg, \ - E2setupRequest_t *e2SetupReq, uint8_t idx) -{ - uint8_t idx2; - uint8_t ret = ROK; - /* De-allocating Memory */ - if(e2apMsg != NULLP) - { - if(e2apMsg->choice.initiatingMessage != NULLP) - { - if(e2SetupReq->protocolIEs.list.array != NULLP) - { - for(idx2 = 0; idx2 < idx; idx2++) - { - if(e2SetupReq->protocolIEs.list.array[idx2] != NULLP) - { - switch(e2SetupReq->protocolIEs.list.array[idx2]->id) - { - case ProtocolIE_IDE2_id_GlobalE2node_ID: - { - if(e2SetupReq->protocolIEs.list.array[idx2]->\ - value.choice.GlobalE2node_ID.choice.gNB != NULLP) - { - GlobalE2node_gNB_ID_t *gNbId = NULLP; - gNbId = e2SetupReq->protocolIEs.list.array[idx2]->\ - value.choice.GlobalE2node_ID.choice.gNB; - if(gNbId->global_gNB_ID.plmn_id.buf != NULLP) - { - if(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf != NULLP) - { - DU_FREE(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf,\ - gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size); - } - DU_FREE(gNbId->global_gNB_ID.plmn_id.buf,\ - gNbId->global_gNB_ID.plmn_id.size); - } - DU_FREE(e2SetupReq->protocolIEs.list.array[idx2]->value.\ - choice.GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t)); - } - DU_FREE(e2SetupReq->protocolIEs.list.array[idx2],\ - sizeof(E2setupRequestIEs_t)); - break; - } - default: - DU_LOG("\nERROR --> E2AP: Invalid event at e2SetupRequet %ld ",\ - (e2SetupReq->protocolIEs.list.array[idx2]->id)); - break; - } - } - } - DU_FREE(e2SetupReq->protocolIEs.list.array, e2SetupReq->protocolIEs.list.size); - } - DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t)); - } - DU_FREE(e2apMsg, sizeof(E2AP_PDU_t)); - } - return ret; -} /******************************************************************* * * @brief Builds Ric Request Id @@ -712,6 +861,77 @@ uint8_t BuildAndSendRicSubscriptionRsp() return ret; } + +/****************************************************************** + * + * @brief Deallocation of memory allocated bu aper decoder for e2 setup response + * + * @details + * + * Function : freeAperDecodingOfE2SetupRsp + * + * Functionality: Deallocation of memory allocated bu aper decoder for e2 + * setup response + * + * @params[in] E2setupResponse_t *e2SetRspMsg; + * @return void + * + * ****************************************************************/ +void freeAperDecodingOfE2SetupRsp(E2setupResponse_t *e2SetRspMsg) +{ + uint8_t arrIdx, e2NodeConfigAddAckListIdx; + E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItem; + E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAddAckList; + + if(e2SetRspMsg) + { + if(e2SetRspMsg->protocolIEs.list.array) + { + for(arrIdx=0; arrIdxprotocolIEs.list.count; arrIdx++) + { + if(e2SetRspMsg->protocolIEs.list.array[arrIdx]) + { + switch(e2SetRspMsg->protocolIEs.list.array[arrIdx]->id) + { + case ProtocolIE_IDE2_id_TransactionID: + break; + + case ProtocolIE_IDE2_id_GlobalRIC_ID: + { + free(e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.GlobalRIC_ID.pLMN_Identity.buf); + free(e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.GlobalRIC_ID.ric_ID.buf); + break; + } + + case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck: + { + e2NodeConfigAddAckList = &e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List; + if(e2NodeConfigAddAckList->list.array ) + { + for(e2NodeConfigAddAckListIdx = 0; e2NodeConfigAddAckListIdx< e2NodeConfigAddAckList->list.count; e2NodeConfigAddAckListIdx++) + { + if(e2NodeConfigAddAckList->list.array[e2NodeConfigAddAckListIdx]) + { + e2NodeAddAckItem = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAddAckList->list.array[e2NodeConfigAddAckListIdx]; + free(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.\ + e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf); + free(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.\ + e2nodeComponentInterfaceTypeF1); + free(e2NodeConfigAddAckList->list.array[e2NodeConfigAddAckListIdx]); + } + } + free(e2NodeConfigAddAckList->list.array); + } + break; + } + } + free(e2SetRspMsg->protocolIEs.list.array[arrIdx]); + } + } + free(e2SetRspMsg->protocolIEs.list.array); + } + } +} /****************************************************************** * * @brief Processes E2 Setup Response sent by RIC @@ -729,7 +949,7 @@ uint8_t BuildAndSendRicSubscriptionRsp() * ****************************************************************/ uint8_t procE2SetupRsp(E2AP_PDU_t *e2apMsg) { - uint8_t idx; + uint8_t arrIdx =0; uint32_t recvBufLen; E2setupResponse_t *e2SetRspMsg; @@ -737,38 +957,40 @@ uint8_t procE2SetupRsp(E2AP_PDU_t *e2apMsg) duCb.e2Status = TRUE; //Set E2 status as true e2SetRspMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse; - for(idx=0; idxprotocolIEs.list.count; idx++) + for(arrIdx=0; arrIdxprotocolIEs.list.count; arrIdx++) { - switch(e2SetRspMsg->protocolIEs.list.array[idx]->id) + switch(e2SetRspMsg->protocolIEs.list.array[arrIdx]->id) { - case ProtocolIE_IDE2_id_GlobalRIC_ID: - { - /* To store the Ric Id Params */ - recvBufLen = sizeof(e2SetRspMsg->protocolIEs.list.array[idx]->value\ - .choice.GlobalRIC_ID.pLMN_Identity.size); - e2apMsgDb.plmn = NULLP; - DU_ALLOC(e2apMsgDb.plmn, recvBufLen); - if(e2apMsgDb.plmn) - { - memcpy(e2apMsgDb.plmn, e2SetRspMsg->protocolIEs.list.array[idx]\ - ->value.choice.GlobalRIC_ID.pLMN_Identity.buf, recvBufLen); - free(e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.\ - GlobalRIC_ID.pLMN_Identity.buf); - } - bitStringToInt(&e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.ric_ID, &e2apMsgDb.ricId); - free(e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.\ - GlobalRIC_ID.ric_ID.buf); - /*TODO : e2apMsgDb.plmn memory to be deallocated after the usage */ - break; - } - default: - DU_LOG("\nERROR --> E2AP : Invalid IE received in E2SetupRsp:%ld", - e2SetRspMsg->protocolIEs.list.array[idx]->id); - break; + case ProtocolIE_IDE2_id_TransactionID: + break; + + case ProtocolIE_IDE2_id_GlobalRIC_ID: + { + /* To store the Ric Id Params */ + recvBufLen = sizeof(e2SetRspMsg->protocolIEs.list.array[arrIdx]->value\ + .choice.GlobalRIC_ID.pLMN_Identity.size); + e2apMsgDb.plmn = NULLP; + DU_ALLOC(e2apMsgDb.plmn, recvBufLen); + if(e2apMsgDb.plmn) + { + memcpy(e2apMsgDb.plmn, e2SetRspMsg->protocolIEs.list.array[arrIdx]\ + ->value.choice.GlobalRIC_ID.pLMN_Identity.buf, recvBufLen); + } + bitStringToInt(&e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.GlobalRIC_ID.ric_ID, &e2apMsgDb.ricId); + /*TODO : e2apMsgDb.plmn memory to be deallocated after the usage */ + break; + } + + case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck: + break; + + default: + DU_LOG("\nERROR --> E2AP : Invalid IE received in E2SetupRsp:%ld", + e2SetRspMsg->protocolIEs.list.array[arrIdx]->id); + break; } - free(e2SetRspMsg->protocolIEs.list.array[idx]); } - free(e2SetRspMsg->protocolIEs.list.array); + freeAperDecodingOfE2SetupRsp(e2SetRspMsg); return ROK; } diff --git a/src/du_app/du_e2ap_msg_hdl.h b/src/du_app/du_e2ap_msg_hdl.h index 8c86edd50..b1539db95 100644 --- a/src/du_app/du_e2ap_msg_hdl.h +++ b/src/du_app/du_e2ap_msg_hdl.h @@ -18,7 +18,6 @@ /* This file contains all E2AP message handler related functionality */ -#include "E2setupRequest.h" #define ENCODE_FAIL -1 uint8_t sctpSend(Buffer *mBuf, uint8_t itfType); @@ -39,7 +38,6 @@ E2apMsgDb e2apMsgDb; uint8_t BuildAndSendE2SetupReq(); uint8_t SendE2APMsg(Region , Pool ); void E2APMsgHdlr(Buffer *mBuf); -uint8_t deAllocateE2SetupReqMsg(E2AP_PDU_t *e2apMsg, E2setupRequest_t *e2SetupReq, uint8_t idx); /********************************************************************** End of file **********************************************************************/ diff --git a/src/du_app/du_f1ap_msg_hdl.c b/src/du_app/du_f1ap_msg_hdl.c index 1b52c60c1..1b524957d 100644 --- a/src/du_app/du_f1ap_msg_hdl.c +++ b/src/du_app/du_f1ap_msg_hdl.c @@ -103,6 +103,7 @@ #include "GTPTunnel.h" #include "SupportedSULFreqBandItem.h" #include "du_sys_info_hdl.h" +#include "du_e2ap_msg_hdl.h" #ifdef O1_ENABLE #include "CmInterface.h" @@ -1997,24 +1998,33 @@ uint8_t BuildAndSendF1SetupReq() /* Encode results */ if(encRetVal.encoded == ENCODE_FAIL) { - DU_LOG("\nERROR --> F1AP : Could not encode F1SetupRequest structure (at %s)\n",\ - encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); - break; + DU_LOG("\nERROR --> F1AP : Could not encode F1SetupRequest structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + break; } else { - DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupRequest\n"); - for(ieIdx=0; ieIdx< encBufSize; ieIdx++) - { - printf("%x",encBuf[ieIdx]); - } + DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupRequest\n"); + for(ieIdx=0; ieIdx< encBufSize; ieIdx++) + { + printf("%x",encBuf[ieIdx]); + } + + duCb.f1SetupReqAndRspMsg.f1MsgReqBufSize = encBufSize; + DU_ALLOC(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf, encBufSize); + if(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed to store the encoding of f1setup req"); + return RFAILED; + } + memcpy(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf, &encBuf, duCb.f1SetupReqAndRspMsg.f1MsgReqBufSize); } /* Sending msg */ if(sendF1APMsg() != ROK) { - DU_LOG("\nERROR --> F1AP : Sending F1 Setup request failed"); - break; + DU_LOG("\nERROR --> F1AP : Sending F1 Setup request failed"); + break; } ret=ROK; @@ -12476,7 +12486,7 @@ void freeAperDecodeF1SetupRsp(F1SetupResponse_t *f1SetRspMsg) * RFAILED - failure * * ****************************************************************/ -uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg) +uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg, MsgLen recvBufLen, char *recvBuf) { uint8_t ret = ROK; uint16_t idx =0; @@ -12528,6 +12538,21 @@ uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg) } freeAperDecodeF1SetupRsp(f1SetRspMsg); + + duCb.f1SetupReqAndRspMsg.f1MsgRspBufSize = recvBufLen; + DU_ALLOC(duCb.f1SetupReqAndRspMsg.f1MsgRspBuf, duCb.f1SetupReqAndRspMsg.f1MsgRspBufSize); + if(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed to store the buf of F1setup response"); + return RFAILED; + } + memcpy(duCb.f1SetupReqAndRspMsg.f1MsgRspBuf, recvBuf, recvBufLen); + + if(BuildAndSendE2SetupReq() != ROK) + { + DU_LOG("\nERROR --> F1AP : Failed to build and send E2 setup request "); + return RFAILED; + } return ret; } /******************************************************************* @@ -14128,7 +14153,6 @@ void F1APMsgHdlr(Buffer *mBuf) memset(f1apMsg, 0, sizeof(F1AP_PDU_t)); rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0); - DU_FREE(recvBuf, (Size)recvBufLen); if(rval.code == RC_FAIL || rval.code == RC_WMORE) { @@ -14152,7 +14176,7 @@ void F1APMsgHdlr(Buffer *mBuf) case SuccessfulOutcome__value_PR_F1SetupResponse: { #ifndef ODU_TEST_STUB - procF1SetupRsp(f1apMsg); + procF1SetupRsp(f1apMsg, recvBufLen, recvBuf); #endif break; } @@ -14221,7 +14245,8 @@ void F1APMsgHdlr(Buffer *mBuf) free(f1apMsg); }/* End of switch(f1apMsg->present) */ - + + DU_FREE(recvBuf, (Size)recvBufLen); } /* End of F1APMsgHdlr */ /********************************************************************** diff --git a/src/du_app/du_f1ap_msg_hdl.h b/src/du_app/du_f1ap_msg_hdl.h index 856cb1e21..af307debc 100644 --- a/src/du_app/du_f1ap_msg_hdl.h +++ b/src/du_app/du_f1ap_msg_hdl.h @@ -18,7 +18,6 @@ /* This file contains all F1AP message handler related functionality */ -#define TRANS_ID 1 #define RRC_SIZE 1 #define SUL_BAND_COUNT 0 #define UL_SRBID 1 diff --git a/src/du_app/du_mgr.h b/src/du_app/du_mgr.h index 49f9a1f9a..04e0b8a90 100644 --- a/src/du_app/du_mgr.h +++ b/src/du_app/du_mgr.h @@ -225,6 +225,7 @@ typedef struct duCb UpTnlCfg* upTnlCfg[MAX_TEID]; /* tunnel info for every Drb */ CmLListCp reservedF1apPduList; /*storing F1AP pdu infomation and transId */ SliceCfgState sliceState; + F1SetupMsg f1SetupReqAndRspMsg; }DuCb; diff --git a/src/du_app/du_msg_hdl.c b/src/du_app/du_msg_hdl.c index 8a10eaf22..dda60e2ae 100644 --- a/src/du_app/du_msg_hdl.c +++ b/src/du_app/du_msg_hdl.c @@ -981,15 +981,12 @@ uint8_t duSctpNtfyHdl(Buffer *mBuf, CmInetSctpNotification *ntfy) { if(BuildAndSendF1SetupReq() != ROK) { - return RFAILED; + return RFAILED; } } else if(ricParams.assocId == ntfy->u.assocChange.assocId) { - if(BuildAndSendE2SetupReq() != ROK) - { - return RFAILED; - } + return ROK; } else { diff --git a/src/ric_stub/ric_e2ap_msg_hdl.c b/src/ric_stub/ric_e2ap_msg_hdl.c index 72a992a47..6f3cc2046 100644 --- a/src/ric_stub/ric_e2ap_msg_hdl.c +++ b/src/ric_stub/ric_e2ap_msg_hdl.c @@ -30,8 +30,8 @@ #include "SuccessfulOutcomeE2.h" #include "E2AP-PDU.h" #include "du_log.h" +#include "E2nodeComponentInterfaceF1.h" -Bool ricSubsStatus; /******************************************************************* * @@ -50,7 +50,7 @@ Bool ricSubsStatus; * * ****************************************************************/ -S16 SendE2APMsg(Region region, Pool pool) +uint8_t SendE2APMsg(Region region, Pool pool) { Buffer *mBuf; @@ -100,7 +100,7 @@ S16 SendE2APMsg(Region region, Pool pool) * * ****************************************************************/ -S16 BuildGlobalRicId(GlobalRIC_ID_t *ricId) +uint8_t BuildGlobalRicId(GlobalRIC_ID_t *ricId) { uint8_t unused = 4; uint8_t byteSize = 3; @@ -118,6 +118,115 @@ S16 BuildGlobalRicId(GlobalRIC_ID_t *ricId) return ROK; } +/******************************************************************* + * + * @brief deallocate the memory allocated in E2SetupResponse + * + * @details + * + * Function : FreeE2SetupRsp + * + * Functionality: deallocate the memory allocated in E2SetupResponse + * + * @params[in] E2AP_PDU_t *e2apMsg + * + * @return void + * ****************************************************************/ +void FreeE2SetupRsp(E2AP_PDU_t *e2apMsg) +{ + uint8_t arrIdx = 0; + E2setupResponse_t *e2SetupRsp; + + if(e2apMsg) + { + if(e2apMsg->choice.successfulOutcome) + { + e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse; + if(e2SetupRsp->protocolIEs.list.array) + { + for(arrIdx=0; arrIdxprotocolIEs.list.count; arrIdx++) + { + RIC_FREE(e2SetupRsp->protocolIEs.list.array[arrIdx], sizeof(E2setupResponseIEs_t)); + } + RIC_FREE(e2SetupRsp->protocolIEs.list.array, e2SetupRsp->protocolIEs.list.size); + } + RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t)); + } + RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t)); + } +} + +/******************************************************************* + * + * @brief Build E2node Component config addition ack list + * + * @details + * + * Function : BuildE2nodeComponentConfigAdditionAck + * + * Functionality: deallocate the memory allocated in E2SetupResponse + * + * @params[in] E2nodeComponentConfigAdditionAck_List_t + * *e2NodeConfigAdditionAckList + * + * @return ROK - success + * RFAILED - failure + * ****************************************************************/ +uint8_t BuildE2nodeComponentConfigAdditionAck(E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAdditionAckList, uint8_t duId) +{ + uint8_t arrIdx = 0; + E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItem; + + e2NodeConfigAdditionAckList->list.count = 1; + e2NodeConfigAdditionAckList->list.size = e2NodeConfigAdditionAckList->list.count * sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t*); + RIC_ALLOC(e2NodeConfigAdditionAckList->list.array, e2NodeConfigAdditionAckList->list.size); + if(e2NodeConfigAdditionAckList->list.array == NULLP) + { + DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__); + return RFAILED; + } + + for(arrIdx = 0; arrIdx< e2NodeConfigAdditionAckList->list.count; arrIdx++) + { + RIC_ALLOC(e2NodeConfigAdditionAckList->list.array[arrIdx], sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t)); + if(e2NodeConfigAdditionAckList->list.array[arrIdx] == NULLP) + { + DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__); + return RFAILED; + } + } + e2NodeAddAckItem = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAdditionAckList->list.array[0]; + e2NodeAddAckItem->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck_Item; + e2NodeAddAckItem->criticality = CriticalityE2_reject; + e2NodeAddAckItem->value.present = E2nodeComponentConfigAdditionAck_ItemIEs__value_PR_E2nodeComponentConfigAdditionAck_Item; + e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentInterfaceType = E2nodeComponentInterfaceType_f1; + + /* >E2 Node Component ID */ + e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.present = E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1; + RIC_ALLOC(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1,\ + sizeof(E2nodeComponentInterfaceF1_t)); + if(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1 == NULLP) + { + DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__); + return RFAILED; + } + e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size = sizeof(uint8_t); + RIC_ALLOC(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf,\ + e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size); + + if(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf == NULLP) + { + DU_LOG("\nERROR -->list. E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__); + return RFAILED; + } + e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0] = duId; + + /* >E2 Node Component Configuration Acknowledge*/ + e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentConfigurationAck.updateOutcome = \ + E2nodeComponentConfigurationAck__updateOutcome_success; + + return ROK; +} /******************************************************************* * * @brief Builds and sends the E2SetupResponse @@ -136,103 +245,127 @@ S16 BuildGlobalRicId(GlobalRIC_ID_t *ricId) * RFAILED - failure * * ****************************************************************/ -S16 BuildAndSendE2SetupRsp() +uint8_t BuildAndSendE2SetupRsp(uint8_t duId) { E2AP_PDU_t *e2apMsg = NULL; E2setupResponse_t *e2SetupRsp; asn_enc_rval_t encRetVal; uint8_t idx; uint8_t elementCnt; - + bool memAllocFailed = false; DU_LOG("\nINFO --> E2AP : Building E2 Setup Response\n"); - - RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t)); - if(e2apMsg == NULLP) - { - DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed"); - return RFAILED; - } - e2apMsg->present = E2AP_PDU_PR_successfulOutcome; - RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t)); - if(e2apMsg->choice.successfulOutcome == NULLP) + while(true) { - DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed"); - RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t)); - return RFAILED; - } - - e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_E2setup; - e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject; - e2apMsg->choice.successfulOutcome->value.present = \ - SuccessfulOutcomeE2__value_PR_E2setupResponse; - e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse; - - elementCnt = 1; - e2SetupRsp->protocolIEs.list.count = elementCnt; - e2SetupRsp->protocolIEs.list.size = elementCnt * sizeof(E2setupResponseIEs_t); + RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t)); + if(e2apMsg == NULLP) + { + DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed"); + break; + } + e2apMsg->present = E2AP_PDU_PR_successfulOutcome; + RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t)); + if(e2apMsg->choice.successfulOutcome == NULLP) + { + DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed"); + break; + } - RIC_ALLOC(e2SetupRsp->protocolIEs.list.array, \ - e2SetupRsp->protocolIEs.list.size); - if(e2SetupRsp->protocolIEs.list.array == NULLP) - { - DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed"); - RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t)); - RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t)); - return RFAILED; - } + e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_E2setup; + e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject; + e2apMsg->choice.successfulOutcome->value.present = \ + SuccessfulOutcomeE2__value_PR_E2setupResponse; + e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse; - for(idx=0; idxprotocolIEs.list.array[idx], \ - sizeof(E2setupResponseIEs_t)); - if(e2SetupRsp->protocolIEs.list.array[idx] == NULLP) - { - RIC_FREE(e2SetupRsp->protocolIEs.list.array,\ - e2SetupRsp->protocolIEs.list.size); - RIC_FREE(e2apMsg->choice.successfulOutcome, \ - sizeof(SuccessfulOutcomeE2_t)); - RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t)); - return RFAILED; - } - } - /* Global RIC ID */ - idx = 0; - e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_GlobalRIC_ID; - e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject; - e2SetupRsp->protocolIEs.list.array[idx]->value.present = \ - E2setupResponseIEs__value_PR_GlobalRIC_ID; + elementCnt = 3; + e2SetupRsp->protocolIEs.list.count = elementCnt; + e2SetupRsp->protocolIEs.list.size = elementCnt * sizeof(E2setupResponseIEs_t); - BuildGlobalRicId(&(e2SetupRsp->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID)); + RIC_ALLOC(e2SetupRsp->protocolIEs.list.array, e2SetupRsp->protocolIEs.list.size); + if(e2SetupRsp->protocolIEs.list.array == NULLP) + { + DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed"); + break; + } - xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg); - memset(encBuf, 0, ENC_BUF_MAX_LEN); - encBufSize = 0; - encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf); + for(idx=0; idxprotocolIEs.list.array[idx], sizeof(E2setupResponseIEs_t)); + if(e2SetupRsp->protocolIEs.list.array[idx] == NULLP) + { + DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed"); + memAllocFailed = true; + break; + } + } + + if(memAllocFailed == true) + { + DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed"); + break; + } + /* Trans Id */ + idx = 0; + e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_TransactionID; + e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject; + e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_TransactionID; + e2SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID; + + /* Global RIC ID */ + idx++; + e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_GlobalRIC_ID; + e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject; + e2SetupRsp->protocolIEs.list.array[idx]->value.present = \ + E2setupResponseIEs__value_PR_GlobalRIC_ID; + + if(BuildGlobalRicId(&(e2SetupRsp->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID))!=ROK) + { + DU_LOG("\nERROR --> E2AP : Failed to build Global Ric Id"); + break; + } + + /* E2 Node Component Configuration Addition Acknowledge List*/ + idx++; + e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck; + e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject; + e2SetupRsp->protocolIEs.list.array[idx]->value.present = \ + E2setupResponseIEs__value_PR_E2nodeComponentConfigAdditionAck_List; + if(BuildE2nodeComponentConfigAdditionAck(&e2SetupRsp->protocolIEs.list.array[idx]->value.choice.E2nodeComponentConfigAdditionAck_List, duId)!=ROK) + { + DU_LOG("\nERROR --> E2AP : Failed to build E2Node Component config addition ack list"); + break; + } - /* Check encode results */ - if(encRetVal.encoded == ENCODE_FAIL) - { - DU_LOG("\nERROR --> E2AP : Could not encode E2SetupResponse structure (at %s)\n",\ - encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); - return RFAILED; - } - else - { - DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupResponse\n"); - for(int i=0; i< encBufSize; i++) - { - DU_LOG("%x",encBuf[i]); - } - } + xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg); + memset(encBuf, 0, ENC_BUF_MAX_LEN); + encBufSize = 0; + encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf); + /* Check encode results */ + if(encRetVal.encoded == ENCODE_FAIL) + { + DU_LOG("\nERROR --> E2AP : Could not encode E2SetupResponse structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + break; + } + else + { + DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupResponse\n"); + for(int i=0; i< encBufSize; i++) + { + DU_LOG("%x",encBuf[i]); + } + } - if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL) != ROK) - { - DU_LOG("\nERROR --> E2AP : Sending E2 Setup Response failed"); - return RFAILED; + if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL) != ROK) + { + DU_LOG("\nERROR --> E2AP : Sending E2 Setup Response failed"); + break; + } + break; } + FreeE2SetupRsp(e2apMsg); return ROK; } @@ -252,7 +385,7 @@ S16 BuildAndSendE2SetupRsp() * * ****************************************************************/ -S16 BuildRicRequestId(RICrequestID_t *ricReqId) +uint8_t BuildRicRequestId(RICrequestID_t *ricReqId) { if(ricReqId != NULLP) @@ -305,7 +438,7 @@ RICaction_ToBeSetup_Item_t* fillSetupItems(RICaction_ToBeSetup_Item_t *setupItem * * ****************************************************************/ -S16 fillSubsDetails(RICaction_ToBeSetup_ItemIEs_t *items) +uint8_t fillSubsDetails(RICaction_ToBeSetup_ItemIEs_t *items) { if(items != NULLP) { @@ -333,7 +466,7 @@ S16 fillSubsDetails(RICaction_ToBeSetup_ItemIEs_t *items) * * ****************************************************************/ -S16 BuildRicSubsDetails(RICsubscriptionDetails_t *subsDetails) +uint8_t BuildRicSubsDetails(RICsubscriptionDetails_t *subsDetails) { uint8_t elementCnt; @@ -379,7 +512,7 @@ S16 BuildRicSubsDetails(RICsubscriptionDetails_t *subsDetails) * ******************************************************************/ -S16 BuildAndSendRicSubscriptionReq() +uint8_t BuildAndSendRicSubscriptionReq() { E2AP_PDU_t *e2apRicMsg = NULL; @@ -387,9 +520,9 @@ S16 BuildAndSendRicSubscriptionReq() uint8_t elementCnt; uint8_t idx; uint8_t ieId; - S16 ret; + uint8_t ret; asn_enc_rval_t encRetVal; /* Encoder return value */ - ricSubsStatus = TRUE; + ricCfgParams.ricSubsStatus = TRUE; DU_LOG("\nINFO --> E2AP : Building RIC Subscription Request\n"); @@ -512,7 +645,74 @@ S16 BuildAndSendRicSubscriptionReq() return ROK; } - +/******************************************************************* + * + * @brief process the e2setup request + * + * @details + * + * Function : ProcE2SetupReq + * + * Functionality: process the e2setup request + * + * @return ROK - success + * RFAILED - failure + * + ******************************************************************/ + +uint8_t ProcE2SetupReq(E2setupRequest_t *e2SetupReq) +{ + uint8_t arrIdx = 0, e2NodeAddListIdx =0;; + E2nodeComponentConfigAddition_List_t *e2NodeAddList; + E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItem; + + if(e2SetupReq) + { + if(e2SetupReq->protocolIEs.list.array) + { + for(arrIdx=0; arrIdxprotocolIEs.list.count; arrIdx++) + { + if(e2SetupReq->protocolIEs.list.array[arrIdx]) + { + switch(e2SetupReq->protocolIEs.list.array[arrIdx]->id) + { + case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition: + { + e2NodeAddList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List; + if(e2NodeAddList->list.array) + { + for(e2NodeAddListIdx = 0; e2NodeAddListIdx< e2NodeAddList->list.count; e2NodeAddListIdx++) + { + if(e2NodeAddList->list.array[e2NodeAddListIdx]) + { + e2NodeAddItem = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[e2NodeAddListIdx]; + if(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1) + { + if(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->\ + gNB_DU_ID.buf) + { + if(BuildAndSendE2SetupRsp(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.\ + e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0]) !=ROK) + { + DU_LOG("\nERROR --> E2AP : Failed to build and send E2 setup response"); + return RFAILED; + } + } + } + } + } + } + break; + } + default: + break; + } + } + } + } + } + return ROK; +} /******************************************************************* * * @brief Handles received E2AP message and sends back response @@ -588,8 +788,8 @@ void E2APMsgHdlr(Buffer *mBuf) case InitiatingMessageE2__value_PR_E2setupRequest: { DU_LOG("\nINFO --> E2AP : E2 setup request received"); - BuildAndSendE2SetupRsp(); - break; + ProcE2SetupReq(&e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest); + break; } case InitiatingMessageE2__value_PR_RICindication: { @@ -630,7 +830,7 @@ void E2APMsgHdlr(Buffer *mBuf) }/* End of switch(e2apMsg->present) */ - if(!ricSubsStatus) + if(!ricCfgParams.ricSubsStatus) BuildAndSendRicSubscriptionReq(); } /* End of E2APMsgHdlr */ diff --git a/src/ric_stub/ric_e2ap_msg_hdl.h b/src/ric_stub/ric_e2ap_msg_hdl.h index 47ebf52d0..6f54f0d5c 100644 --- a/src/ric_stub/ric_e2ap_msg_hdl.h +++ b/src/ric_stub/ric_e2ap_msg_hdl.h @@ -50,9 +50,10 @@ + void E2APMsgHdlr(Buffer *mBuf); -S16 BuildAndSendE2SetupReq(); -S16 SendE2APMsg(Region , Pool ); +uint8_t BuildAndSendE2SetupRsp(uint8_t duId); +uint8_t SendE2APMsg(Region , Pool ); /********************************************************************** End of file diff --git a/src/ric_stub/ric_stub.h b/src/ric_stub/ric_stub.h index bb7f095cf..b41e9c6da 100644 --- a/src/ric_stub/ric_stub.h +++ b/src/ric_stub/ric_stub.h @@ -66,10 +66,11 @@ typedef struct ricCfgParams { - uint32_t ricId; + uint32_t ricId; char ricName[RIC_DU_NAME_LEN_MAX]; RicSctpParams sctpParams; Plmn plmn; + Bool ricSubsStatus; }RicCfgParams; RicCfgParams ricCfgParams; //global variable to hold all configs