MacBsrTmrCfg bsrTmrCfg; /* BSR Timer Info */
UeUlCb ulInfo; /* UE specific UL info */
UeDlCb dlInfo; /* UE specific DL info */
+ DataTransmissionAction transmissionAction;
}MacUeCb;
struct macCellCb
* ****************************************************************/
uint8_t fapiMacRxDataInd(Pst *pst, RxDataInd *rxDataInd)
{
- uint16_t pduIdx;
+ uint8_t ueId = 0;
+ uint16_t pduIdx, cellIdx = 0;
DU_LOG("\nDEBUG --> MAC : Received Rx Data indication");
/* TODO : compare the handle received in RxDataInd with handle send in PUSCH
* PDU, which is stored in raCb */
for(pduIdx = 0; pduIdx < rxDataInd->numPdus; pduIdx++)
{
- unpackRxData(rxDataInd->cellId, rxDataInd->timingInfo, &rxDataInd->pdus[pduIdx]);
+
+ GET_CELL_IDX(rxDataInd->cellId, cellIdx);
+ GET_UE_ID(rxDataInd->pdus[pduIdx].rnti, ueId);
+
+ if(macCb.macCell[cellIdx] && macCb.macCell[cellIdx]->ueCb[ueId -1].transmissionAction == STOP_TRANSMISSION)
+ {
+ DU_LOG("\nINFO --> MAC : UL data transmission not allowed for UE %d", macCb.macCell[cellIdx]->ueCb[ueId -1].duUeF1apId);
+ }
+ else
+ {
+ unpackRxData(rxDataInd->cellId, rxDataInd->timingInfo, &rxDataInd->pdus[pduIdx]);
+ }
MAC_FREE_SHRABL_BUF(pst->region, pst->pool, rxDataInd->pdus[pduIdx].pduData,\
rxDataInd->pdus[pduIdx].pduLength);
}
* ****************************************************************/
uint8_t FapiMacUciInd(Pst *pst, UciInd *macUciInd)
{
- uint8_t pduIdx = 0;
- uint8_t ret = ROK;
- uint16_t nPdus;
- uint16_t crnti;
+ uint8_t pduIdx = 0, ret = ROK;
+ uint16_t nPdus = 0, crnti = 0;
if(macUciInd)
{
if(macUciInd->pdus[pduIdx].uci.uciPucchF0F1.srInfo.srIndPres)
{
DU_LOG("\nDEBUG --> MAC : Received SR UCI indication");
- crnti = macUciInd->pdus[pduIdx].uci.uciPucchF0F1.crnti;
- ret = buildAndSendSrInd(macUciInd, crnti);
+ crnti = macUciInd->pdus[pduIdx].uci.uciPucchF0F1.crnti;
+ ret = buildAndSendSrInd(macUciInd, crnti);
}
break;
case UCI_IND_PUCCH_F2F3F4:
schUeCfg->cellId = ueCfg->cellId;
schUeCfg->duUeF1apId = ueCfg->duUeF1apId;
schUeCfg->crnti = ueCfg->crnti;
-
+ schUeCfg->dataTransmissionInfo = ueCfg->transmissionAction;
/* Copy MAC cell group config */
if(ueCfg->macCellGrpCfgPres == true)
{
{
DU_LOG("\nERROR --> MAC: Failed while filing MAC LC List at fillMacUeCb()");
}
+ ueCb->transmissionAction = ueCfg->transmissionAction;
return ret;
}
rlcCfgRsp->cellId = rlcCRsp->cellId;
rlcCfgRsp->ueId = rlcCRsp->ueId;
+ rlcCfgRsp->result = RLC_DU_APP_RSP_OK;
for(idx = 0; idx < rlcCRsp->numEnt; idx++)
{
if(rlcCRsp->entCfgCfm[idx].status.status == CKW_CFG_CFM_OK)
rlcUeCfg->cellId = ueCfg->cellId;
rlcUeCfg->numEnt = ueCfg->numLcs;
rlcUeCfg->transId = getTransId();
-
+
for(lcIdx = 0; lcIdx < rlcUeCfg->numEnt; lcIdx++)
{
if(fillLcCfg(gCb, &rlcUeCfg->entCfg[lcIdx], &ueCfg->rlcLcCfg[lcIdx]) != ROK)
GET_UE_ID(dlBoInfo->crnti, ueId);
ueCb = &cell->ueCb[ueId-1];
+ if(ueCb->ueCfg.dataTransmissionAction == STOP_DATA_TRANSMISSION)
+ {
+ DU_LOG("INFO --> SCH : DL Data transmission not allowed for UE %d", ueCb->ueCfg.duUeF1apId);
+ return ROK;
+ }
+
lcId = dlBoInfo->lcId;
CHECK_LCID(lcId, isLcIdValid);
if(isLcIdValid == FALSE)
}
else
{
- /* TODO : These part of changes will be corrected during DL scheduling as
- * per K0 - K1 -K2 */
SET_ONE_BIT(ueId, cell->boIndBitMap);
if(ueCb->dlInfo.dlLcCtxt[lcId].lcId == lcId)
{
return RFAILED;
}
+ if(ueCb->ueCfg.dataTransmissionAction == STOP_DATA_TRANSMISSION)
+ {
+ DU_LOG("\nINFO --> SCH: UL Data transmission not allowed for UE %d", ueCb->ueCfg.duUeF1apId);
+ return ROK;
+ }
+
ueCb->bsrRcvd = true;
/* store dataVolume per lcg in uecb */
for(lcgIdx = 0; lcgIdx < bsrInd->numLcg; lcgIdx++)
DU_LOG("\nERROR --> SCH : Crnti %d is inactive", uciInd->crnti);
return ROK;
}
-
+ if(ueCb->ueCfg.dataTransmissionAction == STOP_DATA_TRANSMISSION)
+ {
+ DU_LOG("\nINFO --> SCH: UL Data transmission not allowed for UE %d", ueCb->ueCfg.duUeF1apId);
+ return ROK;
+ }
if(uciInd->numSrBits)
{
ueCb->srRcvd = true;
SchAmbrCfg *ambrCfg;
SchModulationInfo dlModInfo;
SchModulationInfo ulModInfo;
+ SchDataTransmission dataTransmissionAction;
}SchUeCfgCb;
/*Following structures to keep record and estimations of PRB allocated for each
ueCb->ueCfg.cellId = ueCfg->cellId;
ueCb->ueCfg.duUeF1apId = ueCfg->duUeF1apId;
ueCb->ueCfg.crnti = ueCfg->crnti;
+ ueCb->ueCfg.dataTransmissionAction = ueCfg->dataTransmissionInfo;
if(ueCfg->macCellGrpCfgPres == true)
{
memcpy(&ueCb->ueCfg.macCellGrpCfg , &ueCfg->macCellGrpCfg, sizeof(SchMacCellGrpCfg));
RSRC_RRC_CONNECTED_USERS
}ResourceType;
+typedef enum
+{
+ TRANSMISSION_ALLOWED,
+ STOP_TRANSMISSION,
+ RESTART_TRANSMISSION
+}DataTransmissionAction;
+
typedef struct failureCause
{
CauseGrp type;
uint8_t numLcs;
LcCfg lcCfgList[MAX_NUM_LC];
UeCfgState macUeCfgState; /* InActive / Completed */
+ DataTransmissionAction transmissionAction;
}MacUeCfg;
typedef struct nrcgi
BOTH
}DlPduType;
+typedef enum
+{
+ DATA_TRANSMISSION_ALLOWED,
+ STOP_DATA_TRANSMISSION,
+ RESTART_DATA_TRANSMISSION
+}SchDataTransmission;
+
/*structures*/
typedef struct timeDomainAlloc
{
SchModulationInfo ulModInfo;
uint8_t numLcs;
SchLcCfg schLcCfg[MAX_NUM_LC];
+ SchDataTransmission dataTransmissionInfo;
}SchUeCfg;
typedef struct schUeCfgRsp
}
}
+/*******************************************************************
+ *
+ * @brief Fills QOS flow configuration
+ *
+ * @details
+ *
+ * Function : fillQosFlowsToAdd
+ *
+ * Functionality: Fills QOS flow configuration
+ *
+ * @params[in] struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
{
uint8_t idx, ied, elementCnt;
}
}
+ if(!elementCnt)
+ {
+ DU_LOG("INFO --> F1AP : No RLC Bearer available to add or modify");
+ return ROK;
+ }
+ CU_ALLOC(rlcBearerList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
+ if(!rlcBearerList)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
+ return RFAILED;
+ }
rlcBearerList->list.count = elementCnt;
rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
for(drbIdx=0; drbIdx < ueCb->numDrb; drbIdx++)
{
- if(!updateAllRbCfg && ueCb->srbList[srbIdx].cfgSentToUe)
+ if(!updateAllRbCfg && ueCb->drbList[drbIdx].cfgSentToUe)
continue;
rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->drbList[drbIdx].lcId;
cellGrpCfg.cellGroupId = CELL_GRP_ID;
cellGrpCfg.rlc_BearerToAddModList = NULLP;
- CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
- if(!cellGrpCfg.rlc_BearerToAddModList)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
- break;
- }
+
if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList, updateAllRbCfg) != ROK)
{
DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
* ****************************************************************/
uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool updateAllRbCfg)
{
- uint8_t srbIdx, srbDbIdx;
+ uint8_t srbIdx, srbDbIdx, elementCnt = 0;
if(updateAllRbCfg)
- srbToAddList->list.count = ueCb->numSrb;
+ elementCnt = ueCb->numSrb;
else
{
- srbToAddList->list.count = 0;
for(srbDbIdx=0; srbDbIdx < ueCb->numSrb; srbDbIdx++)
{
if(ueCb->srbList[srbDbIdx].cfgSentToUe == false)
- srbToAddList->list.count++;
+ elementCnt++;
}
}
+
+ if(!elementCnt)
+ {
+ DU_LOG("INFO --> F1AP : No SRB available to add or modify");
+ return ROK;
+ }
+
+ CU_ALLOC(srbToAddList, sizeof(SRB_ToAddModList_t));
+ if(!srbToAddList)
+ {
+ DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
+ return RFAILED;
+ }
+ srbToAddList->list.count = elementCnt;
srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *);
CU_ALLOC(srbToAddList->list.array, srbToAddList->list.size);
* ****************************************************************/
uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool updateAllRbCfg)
{
- uint8_t drbIdx, drbDbIdx;
+ uint8_t drbIdx, drbDbIdx, elementCnt = 0;
if(updateAllRbCfg)
- drbToAddList->list.count = ueCb->numDrb;
+ elementCnt = ueCb->numDrb;
else
{
- drbToAddList->list.count = 0;
for(drbDbIdx=0; drbDbIdx < ueCb->numDrb; drbDbIdx++)
{
if(ueCb->drbList[drbDbIdx].cfgSentToUe == false)
- drbToAddList->list.count++;
+ elementCnt++;
}
}
+
+ if(!elementCnt)
+ {
+ DU_LOG("INFO --> F1AP : No DRB available to add or modify");
+ return ROK;
+ }
+
+ /* DRB To Add/Mod List */
+ CU_ALLOC(drbToAddList, sizeof(DRB_ToAddModList_t));
+ if(!drbToAddList)
+ {
+ DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
+ return RFAILED;
+ }
+
+ drbToAddList->list.count = elementCnt;
drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *);
CU_ALLOC(drbToAddList->list.array, drbToAddList->list.size);
uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg)
{
/* SRB To Add/Mod List */
- CU_ALLOC(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
- if(!radioBearerConfig->srb_ToAddModList)
- {
- DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig");
- return RFAILED;
- }
if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK)
{
return RFAILED;
}
- /* DRB To Add/Mod List */
- CU_ALLOC(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
- if(!radioBearerConfig->drb_ToAddModList)
- {
- DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig");
- return RFAILED;
- }
if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK)
{
return RFAILED;
return RFAILED;
}
ret = fillRrcReconfigBuf(ueCb, &hoPrepInfoIe->sourceConfig->rrcReconfiguration, true);
+
+ if(ret != ROK)
+ {
+ DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
+ return RFAILED;
+ }
hoPrepInfoIe->rrm_Config = NULLP;
hoPrepInfoIe->as_Context = NULLP;
void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
{
uint8_t arrIdx =0 , ieId=0;
- UEContextModificationRequest_t *UeContextModifyReq = NULLP;
+ UEContextModificationRequest_t *ueContextModifyReq = NULLP;
if(f1apMsg)
{
if(f1apMsg->choice.initiatingMessage)
{
- UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
- if(UeContextModifyReq->protocolIEs.list.array)
+ ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
+ if(ueContextModifyReq->protocolIEs.list.array)
{
- for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
+ for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
{
- if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
+ if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
{
- ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
+ ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
switch(ieId)
{
case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
break;
case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
{
- FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
+ FreeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
choice.DRBs_ToBeSetupMod_List);
break;
}
case ProtocolIE_ID_id_DRBs_ToBeModified_List:
{
- FreeDrbToBeModifiedList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
- choice.DRBs_ToBeSetupMod_List);
+ FreeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
+ choice.DRBs_ToBeModified_List);
break;
}
+ case ProtocolIE_ID_id_TransmissionActionIndicator:
+ break;
+ case ProtocolIE_ID_id_RRCContainer:
+ {
+ CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf,\
+ ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.size);
+ }
}
- CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
+ CU_FREE(ueContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
}
}
- CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
+ CU_FREE(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
}
CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
}
CuUeCb *ueCb = (CuUeCb *)cuUeCb;
F1AP_PDU_t *f1apMsg = NULLP;
UEContextModificationRequest_t *ueContextModifyReq = NULLP;
-
+ action =RESTART_DATA_TX;
asn_enc_rval_t encRetVal;
DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
-
while(1)
{
CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
elementCnt = 3;
else if(action == RRC_RECONFIG_COMPLETE_IND)
elementCnt = 3;
+ else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
+ elementCnt = 5;
+
ueContextModifyReq->protocolIEs.list.count = elementCnt;
ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
if(ret != ROK)
{
+ DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
break;
}
+
+ /* TODO: fill the RRC reconfiguration information in RRC Contaiiner ie in case of MODIFY_UE */
}
else if(action == QUERY_CONFIG)
{
ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator = \
RRCReconfigurationCompleteIndicator_true;
}
+ else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX))
+ {
+ ieIdx++;
+ if(action == STOP_DATA_TX)
+ {
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
+ UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
+ TransmissionActionIndicator_stop;
+ }
+ else if (action == RESTART_DATA_TX)
+ {
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransmissionActionIndicator;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
+ UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
+ TransmissionActionIndicator_restart;
+ }
+ ieIdx++;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
+ UEContextModificationRequestIEs__value_PR_RRCContainer;
+ if(fillRrcReconfigBuf(ueCb, &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer, true) != ROK)
+ {
+ DU_LOG( "\nERROR --> F1AP : Failed to fill Rrc reconfiguration buffer");
+ return RFAILED;
+ }
+
+ /* RRC delivery status request */
+ ieIdx++;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
+ }
xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
MODIFY_UE, /* Modify UE configuration at DU */
RRC_RECONFIG_COMPLETE_IND, /* Indicate to DU that RRC Reconfiguration is complete */
QUERY_CONFIG, /* Query DU for its configurations */
- STOP_DATA_TX /* Stop data transmission from DU to a particular UE */
+ STOP_DATA_TX, /* Stop data transmission from DU to a particular UE */
+ RESTART_DATA_TX /* Restart data transmission from DU to a particular UE */
}UeCtxtModAction;
typedef struct f1apDb
struct DRBs_SetupMod_ItemIEs *drbItemIe;
drbCnt = ueCfg->numDrbSetupMod;
+
+ if(!drbCnt)
+ {
+ DU_LOG("\nINFO --> F1AP : BuildDrbToBeSetupModList(): No DRB information to avaialble to add");
+ return ROK;
+ }
+
drbSet->list.count = drbCnt;
drbSet->list.size = drbCnt * sizeof(DRBs_SetupMod_ItemIEs_t *);
DU_ALLOC(drbSet->list.array, drbSet->list.size);
ueContextModifyRes =&f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
- elementCnt = 3;
+ {
+ if(ueCb->f1UeDb->duUeCfg.numDrbSetupMod)
+ elementCnt =3;
+ else
+ elementCnt =2;
+ }
if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY)
elementCnt = 5;
if(ueCb->f1UeDb->actionType == UE_CTXT_RRC_RECFG_COMPLETE)
}
if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || (ueCb->f1UeDb->actionType == UE_CTXT_MOD))
- {
- ieIdx++;
- ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_SetupMod_List;
- ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
- ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\
- UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List;
- if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY)
- {
- for(tnlIdx = 0; tnlIdx < duCb.numTeId; tnlIdx++)
+ {
+ if(ueCb->f1UeDb->duUeCfg.numDrbSetupMod)
+ {
+ ieIdx++;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_SetupMod_List;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\
+ UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List;
+ if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY)
{
- if(duCb.upTnlCfg[tnlIdx]->ueId == ueCb->gnbDuUeF1apId)
+ for(tnlIdx = 0; tnlIdx < duCb.numTeId; tnlIdx++)
{
- memcpy(&ueCb->f1UeDb->duUeCfg.upTnlInfo[ueCb->f1UeDb->duUeCfg.numDrbSetupMod++], duCb.upTnlCfg[tnlIdx], sizeof(UpTnlCfg));
+ if(duCb.upTnlCfg[tnlIdx]->ueId == ueCb->gnbDuUeF1apId)
+ {
+ memcpy(&ueCb->f1UeDb->duUeCfg.upTnlInfo[ueCb->f1UeDb->duUeCfg.numDrbSetupMod++], duCb.upTnlCfg[tnlIdx], sizeof(UpTnlCfg));
+ }
}
}
- }
- ret = BuildDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\
- value.choice.DRBs_SetupMod_List) , &ueCb->f1UeDb->duUeCfg);
- if(ret != ROK)
- {
- DU_LOG( "\nERROR --> F1AP : Failed to build DRB setupmod List ");
- break;
+ ret = BuildDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\
+ value.choice.DRBs_SetupMod_List) , &ueCb->f1UeDb->duUeCfg);
+ if(ret != ROK)
+ {
+ DU_LOG( "\nERROR --> F1AP : Failed to build DRB setupmod List ");
+ break;
+ }
}
}
* @return void
*
* ****************************************************************/
-void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *UeContextModifyReq )
+void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *ueContextModifyReq )
{
uint8_t arrIdx, ieId;
- if(UeContextModifyReq->protocolIEs.list.array)
+ if(ueContextModifyReq->protocolIEs.list.array)
{
- for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
+ for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
{
- if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
+ if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
{
- ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
+ ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
switch(ieId)
{
case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
break;
case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
{
- freeAperDecodeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->\
+ freeAperDecodeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->\
value.choice.DRBs_ToBeSetupMod_List);
break;
}
+ case ProtocolIE_ID_id_TransmissionActionIndicator:
+ break;
+ case ProtocolIE_ID_id_RRCContainer:
+ {
+ free(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf);
+ }
}
- free(UeContextModifyReq->protocolIEs.list.array[arrIdx]);
+ free(ueContextModifyReq->protocolIEs.list.array[arrIdx]);
}
}
- free(UeContextModifyReq->protocolIEs.list.array);
+ free(ueContextModifyReq->protocolIEs.list.array);
}
}
/*******************************************************************
{
DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
duUeCb->f1UeDb->cellIdx = cellIdx;
+ duUeCb->f1UeDb->actionType = UE_CTXT_MOD;
}
break;
}
}
break;
}
+
+ case ProtocolIE_ID_id_RRCContainer:
+ {
+ /* Filling Dl RRC Msg Info */
+ DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
+ if(!duUeCb->f1UeDb->dlRrcMsg)
+ {
+ DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \
+ Memory allocation failed ");
+ ret = RFAILED;
+ }
+ else
+ {
+ duUeCb->f1UeDb->dlRrcMsgPres = true;
+ memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
+ ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
+ &ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
+ value.choice.RRCContainer);
+ }
+
+ break;
+ }
+
case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
case ProtocolIE_ID_id_DRBs_ToBeModified_List:
{
if(duUeCb->f1UeDb)
{
- duUeCb->f1UeDb->actionType = UE_CTXT_MOD;
if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present ==\
UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List)
{
}
break;
}
+ case ProtocolIE_ID_id_TransmissionActionIndicator:
+ {
+ if(duUeCb->f1UeDb)
+ {
+ if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator == TransmissionActionIndicator_stop)
+ {
+ duUeCb->f1UeDb->duUeCfg.dataTransmissionAction = STOP_TRANSMISSION;
+ }
+ else
+ {
+ duUeCb->f1UeDb->duUeCfg.dataTransmissionAction = RESTART_TRANSMISSION;
+ }
+ }
+ break;
+ }
+
+ case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
+ {
+ if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
+ {
+ duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true;
+ }
+ break;
+ }
+
}
}
UpTnlCfg upTnlInfo[MAX_NUM_DRB]; /* User plane TNL Info*/
uint8_t numDrbSetupMod; /*No. of DRB Added during Modification*/
MacUeCfg copyOfmacUeCfg;
+ DataTransmissionAction dataTransmissionAction;
}DuUeCfg;
typedef struct f1UeContextSetup
}
else
{
+ if(ueCfgDb->dataTransmissionAction == STOP_TRANSMISSION)
+ {
+ macUeCfg->transmissionAction = ueCfgDb->dataTransmissionAction;
+ return ROK;
+ }
+
/* Fetching MacDb from DuUeCb.
* In case of UE hand-in, UE context is created before RRC setup. Hence
* crnti is not known yet. Thus, passing crnti=0 to this function.
* In such a case actvCellLst doesnt yet have any entry for this UE. So
* duMacDb will be NULL.
*/
+
if(crnti != 0)
{
GET_CELL_IDX(cellId, cellIdx);
}
duMacDb->macUeCfgState = UE_CFG_INPROGRESS;
}
-
+
if(ueCfgDb->cellGrpCfg)
{
ret = procUeReCfgCellInfo(macUeCfg, duMacDb, ueCfgDb->cellGrpCfg);
/*Filling RlcUeCfg */
rlcUeCfg->cellId = cellId;
rlcUeCfg->ueId = ueId;
+
for(dbIdx = 0; (dbIdx < ueCfgDb->numRlcLcs && ret == ROK); dbIdx++)
{
ret = fillDefaultRlcModeCfg(ueCfgDb->rlcLcCfg[dbIdx].rlcMode, &ueCfgDb->rlcLcCfg[dbIdx]);