1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
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 ################################################################################
17 *******************************************************************************/
19 /**********************************************************************
25 Desc: Defines required by LTE MAC
27 File: rlc_dl_ul_inf_ul.c
29 **********************************************************************/
31 /** @file rlc_dl_ul_inf_ul.c
32 @brief UDX Uplink Module
35 /* header include files (.h) */
36 #include "common_def.h"
37 #include "lkw.h" /* LKW defines */
38 #include "ckw.h" /* CKW defines */
39 #include "kwu.h" /* KWU defines */
40 #include "rgu.h" /* RGU defines */
41 #include "rlc_err.h" /* Err defines */
42 #include "rlc_env.h" /* RLC environment options */
44 /* extern (.x) include files */
45 #include "lkw.x" /* LKW */
46 #include "ckw.x" /* CKW */
47 #include "kwu.x" /* KWU */
48 #include "rgu.x" /* RGU */
50 #include "rlc_utils.h" /* RLC defines */
51 #include "rlc_dl_ul_inf.h"
54 #include "du_app_rlc_inf.h"
57 #define RLC_MODULE RLC_DBGMASK_UDX
62 /* forward references */
64 /* public variable declarations */
65 S16 rlcHdlCrlcUlCfgReq ARGS((RlcCb *gCb,RlcUlCfgTmpData *cfgTmpData,
66 RlcCfgCfmInfo *cfmInfo, RlcCfgCfmInfo *cfgCfm));
74 * Handler for bind confirmation from DL.
77 * This function handles the bind confirmation received
80 * @param[in] pst Post structure
81 * @param[in] suId Service User ID
82 * @param[in] status Status of confirmation
98 RlcUdxUlSapCb *udxSap; /* RGU SAP Control Block */
101 #if (ERRCLASS & ERRCLS_INT_PAR)
102 if (pst->dstInst >= MAX_RLC_INSTANCES)
107 tRlcCb = RLC_GET_RLCCB(pst->dstInst);
109 RLCDBGP_BRIEF(tRlcCb, "rlcUlUdxBndCfm(post, suId(%d), status(%d)\n",
112 #if (ERRCLASS & ERRCLS_INT_PAR)
113 if (tRlcCb->init.cfgDone != TRUE)
115 DU_LOG("\nERROR --> RLC_UL : General configuration not done");
116 RLC_SEND_SAPID_ALARM(tRlcCb,suId,
117 LKW_EVENT_LI_BND_CFM, LCM_CAUSE_INV_STATE);
124 DU_LOG("\nERROR --> RLC_UL : Invalid suId");
125 RLC_SEND_SAPID_ALARM(tRlcCb,suId,
126 LKW_EVENT_LI_BND_CFM, LCM_CAUSE_INV_SUID);
130 #endif /* ERRCLASS & ERRCLS_INT_PAR */
132 udxSap = tRlcCb->u.ulCb->udxUlSap + suId;
134 RLCDBGP_DETAIL(tRlcCb, "RlcLiRguBndCfm: For RGU SAP state=%d\n",
137 /* Check rguSap state */
138 switch (udxSap->state)
140 case RLC_SAP_BINDING:
142 if(TRUE == rlcChkTmr(tRlcCb,(PTR)udxSap,EVENT_RLC_WAIT_BNDCFM))
144 rlcStopTmr (tRlcCb,(PTR)udxSap, EVENT_RLC_WAIT_BNDCFM);
146 udxSap->retryCnt = 0;
148 if (status == CM_BND_OK)
150 udxSap->state = RLC_SAP_BND;
151 event = LCM_EVENT_BND_OK;
152 cause = LKW_CAUSE_SAP_BNDENB;
156 udxSap->state = RLC_SAP_CFG;
157 event = LCM_EVENT_BND_FAIL;
158 cause = LKW_CAUSE_UNKNOWN;
164 event = LKW_EVENT_RGU_BND_CFM;
165 cause = LCM_CAUSE_INV_STATE;
168 /* Send an alarm with proper event and cause */
169 RLC_SEND_SAPID_ALARM(tRlcCb,suId, event, cause);
176 * Handles UDX Configuration Confirm
179 * This function handles the UDX configuration Confirm from DL Instance
181 * @param[in] pst Post structure
182 * @param[in] suId Service User ID
183 * @param[in] cfmInfo Confirm Information
193 RlcCfgCfmInfo *cfmInfo
198 RlcCfgCfmInfo *cfgCfm;
199 RlcUlCfgTmpData *cfgTmpData;
201 memset(&rspPst, 0, sizeof(Pst));
203 #if (ERRCLASS & ERRCLS_INT_PAR)
204 if (pst->dstInst >= MAX_RLC_INSTANCES)
206 RLC_FREE_SHRABL_BUF(pst->region,
209 sizeof(RlcCfgCfmInfo));
213 tRlcCb = RLC_GET_RLCCB(pst->dstInst);
214 RLCDBGP_BRIEF(tRlcCb, " suId(%d)\n", suId);
216 #if (ERRCLASS & ERRCLS_INT_PAR)
219 DU_LOG("\nERROR --> RLC_UL : Invalid suId");
220 RLC_SEND_SAPID_ALARM(tRlcCb,suId,
221 LKW_EVENT_LI_BND_CFM, LCM_CAUSE_INV_SUID);
222 RLC_FREE_SHRABL_BUF(pst->region,
225 sizeof(RlcCfgCfmInfo));
228 #endif /* ERRCLASS & ERRCLS_INT_PAR */
230 if(ROK != rlcDbmFindUlTransaction(tRlcCb,cfmInfo->transId, &cfgTmpData))
232 DU_LOG("\nERROR --> RLC_UL : Invalid transId");
233 RLC_FREE_SHRABL_BUF(pst->region,
236 sizeof(RlcCfgCfmInfo));
240 if(ROK != rlcDbmDelUlTransaction(tRlcCb, cfgTmpData))
242 RLC_FREE_SHRABL_BUF(pst->region,
245 sizeof(RlcCfgCfmInfo));
248 /* Allocate memory and memset to 0 for cfmInfo */
249 RLC_ALLOC(tRlcCb,cfgCfm, sizeof(RlcCfgCfmInfo));
250 #if (ERRCLASS & ERRCLS_ADD_RES)
253 DU_LOG("\nERROR --> RLC_UL : Memory Allocation failed.");
254 RLC_FREE_SHRABL_BUF(pst->region,
257 sizeof(RlcCfgCfmInfo));
260 #endif /* ERRCLASS & ERRCLS_ADD_RES */
261 rlcHdlCrlcUlCfgReq(tRlcCb,cfgTmpData, cfmInfo, cfgCfm);
262 if(tRlcCb->u.ulCb->rlcUlUdxEventType == EVENT_RLC_UE_CREATE_REQ)
264 FILL_PST_RLC_TO_DUAPP(rspPst, RLC_UL_INST, EVENT_RLC_UE_CREATE_RSP);
265 SendRlcUeCreateRspToDu(&rspPst, cfgCfm);
267 else if(tRlcCb->u.ulCb->rlcUlUdxEventType == EVENT_RLC_UE_RECONFIG_REQ)
269 FILL_PST_RLC_TO_DUAPP(rspPst, RLC_UL_INST, EVENT_RLC_UE_RECONFIG_RSP);
270 SendRlcUeReconfigRspToDu(&rspPst, cfgCfm);
272 else if (tRlcCb->u.ulCb->rlcUlUdxEventType == EVENT_RLC_UE_DELETE_REQ)
274 FILL_PST_RLC_TO_DUAPP(rspPst, RLC_UL_INST, EVENT_RLC_UE_DELETE_RSP);
275 if(sendRlcUeDeleteRspToDu(cfgCfm->cellId, cfgCfm->ueId, SUCCESSFUL) != ROK)
277 DU_LOG("ERROR --> RLC_UL: rlcUlUdxCfgCfm(): Failed to send UE delete response ");
278 RLC_FREE(tRlcCb, cfgCfm, sizeof(RlcCfgCfmInfo));
281 RLC_FREE(tRlcCb, cfgCfm, sizeof(RlcCfgCfmInfo));
283 else if (tRlcCb->u.ulCb->rlcUlUdxEventType == EVENT_RLC_UE_REESTABLISH_REQ)
285 if(sendRlcUeReestablishRspToDu(cfgCfm->cellId, cfgCfm->ueId, SUCCESSFUL) != ROK)
287 DU_LOG("ERROR --> RLC_UL: rlcUlUdxCfgCfm(): Failed to send UE Reestablishment response to DU ");
288 RLC_FREE(tRlcCb, cfgCfm, sizeof(RlcCfgCfmInfo));
291 RLC_FREE(tRlcCb, cfgCfm, sizeof(RlcCfgCfmInfo));
294 /* free the memory from DL */
295 RLC_FREE_SHRABL_BUF(pst->region, pst->pool, cfmInfo, sizeof(RlcCfgCfmInfo));
297 /* free the cfgInfo that came from LM */
298 for(cfgIdx=0; cfgIdx<cfgTmpData->cfgInfo->numEnt; cfgIdx++)
300 RLC_FREE(tRlcCb, cfgTmpData->cfgInfo->entCfg[cfgIdx].snssai, sizeof(Snssai));
302 RLC_FREE(tRlcCb, cfgTmpData->cfgInfo, sizeof(RlcCfgInfo));
303 RLC_FREE(tRlcCb,cfgTmpData,sizeof(RlcUlCfgTmpData));
310 * Handler for UeId change confirm
313 * This function handles the UeId Change Confirm from DL Instance
315 * @param[in] pst Post structure
316 * @param[in] suId Service User ID
317 * @param[in] transId Transaction Id
318 * @param[in] status Status of confirmation
324 S16 rlcUlUdxUeIdChgCfm
333 RlcUlCfgTmpData *cfgTmpData;
335 #if (ERRCLASS & ERRCLS_INT_PAR)
336 if (pst->dstInst >= MAX_RLC_INSTANCES)
341 tRlcCb = RLC_GET_RLCCB(pst->dstInst);
343 RLCDBGP_BRIEF(tRlcCb, " suId(%d) \n", suId);
345 #if (ERRCLASS & ERRCLS_INT_PAR)
348 DU_LOG("\nERROR --> RLC_UL : Invalid suId");
351 #endif /* ERRCLASS & ERRCLS_INT_PAR */
353 if(ROK != rlcDbmFindUlTransaction(tRlcCb, transId, &cfgTmpData))
355 DU_LOG("\nERROR --> RLC_UL : Invalid transId");
359 if(ROK != rlcDbmDelUlTransaction(tRlcCb, cfgTmpData))
364 if(status.status == CKW_CFG_CFM_OK)
366 if(cfgTmpData->ueCb != NULLP)
368 rlcCfgApplyUlUeIdChng(tRlcCb, cfgTmpData->ueInfo, cfgTmpData->newUeInfo, cfgTmpData);
371 RlcUiCkwUeIdChgCfm(&(tRlcCb->u.ulCb->ckwSap.pst),
372 tRlcCb->u.ulCb->ckwSap.suId,
373 transId,cfgTmpData->ueInfo,status);
374 /* only newUeInfo needs to be freed here, ueInfo would be freed at the
375 interface or by he receipient in case of tight coupling */
376 RLC_PST_FREE(pst->region, pst->pool, cfgTmpData->newUeInfo, sizeof(CkwUeInfo));
377 RLC_FREE(tRlcCb, cfgTmpData, sizeof (RlcUlCfgTmpData));
383 * Udx Status Prohibit Timer Start
385 * @param[in] pst Post structure
386 * @param[in] suId Service User ID
387 * @param[in] rlcId rlc Id
392 S16 rlcUlUdxStaProhTmrStart
399 RlcCb *tRlcCb= NULLP;
402 #if (ERRCLASS & ERRCLS_INT_PAR)
403 if (pst->dstInst >= MAX_RLC_INSTANCES)
408 tRlcCb = RLC_GET_RLCCB(pst->dstInst);
410 rlcDbmFetchUlRbCbByRbId(tRlcCb, rlcId, &rbCb);
413 DU_LOG("\nERROR --> RLC_UL : CellId [%u]:RbId[%d] not found",
414 rlcId->cellId,rlcId->rbId);
418 /* Start staProhTmr */
419 rlcStartTmr(tRlcCb,(PTR)rbCb, EVENT_RLC_AMUL_STA_PROH_TMR);
426 * Handler for configuration confirm from DL.
428 * @param[in] gCb - RLC Instance Control Block
429 * @param[in] cfgTmpData - Configuration Temporary Data
430 * @param[in] cfmInfo - DL Configuration Confirm Info
431 * @param[out] cfgCfm - Configuration Confirm to be sent to RRC
437 S16 rlcHdlCrlcUlCfgReq
440 RlcUlCfgTmpData *cfgTmpData,
441 RlcCfgCfmInfo *cfmInfo,
442 RlcCfgCfmInfo *cfgCfm
449 cfg = cfgTmpData->cfgInfo;
450 maxEnt = (cfg->numEnt < CKW_MAX_ENT_CFG)? cfg->numEnt:CKW_MAX_ENT_CFG;
452 for (idx = 0; idx < maxEnt; idx++)
454 RlcEntCfgCfmInfo *entCfgCfm;
455 RlcEntCfgCfmInfo *entDlCfgCfm;
456 RlcEntCfgInfo *entCfg;
458 entCfg = &(cfg->entCfg[idx]);
459 entCfgCfm = &(cfgCfm->entCfgCfm[idx]);
460 entDlCfgCfm = &(cfmInfo->entCfgCfm[idx]);
461 switch (entCfg->cfgType)
467 if (entCfg->dir == RLC_DIR_UL)
469 RLC_MEM_CPY(entCfgCfm,
470 &cfgTmpData->cfgEntData[idx].entUlCfgCfm,
471 sizeof(RlcEntCfgCfmInfo));
473 else if (entCfg->dir == RLC_DIR_DL)
475 RLC_MEM_CPY(entCfgCfm, entDlCfgCfm, sizeof(RlcEntCfgCfmInfo));
477 else if(entCfg->dir == RLC_DIR_BOTH)
479 if (entDlCfgCfm->status.status != CKW_CFG_CFM_OK)
481 rlcCfgRollBackUlRb(gCb,
484 &cfgTmpData->cfgEntData[idx]);
490 &cfgTmpData->cfgEntData[idx],
493 RLC_MEM_CPY(entCfgCfm, entDlCfgCfm, sizeof(RlcEntCfgCfmInfo));
497 RLC_CFG_FILL_CFG_CFM(entCfgCfm, entCfg->rbId, entCfg->rbType,
498 CKW_CFG_CFM_NOK, CKW_CFG_REAS_INVALID_DIR);
499 DU_LOG("\nDEBUG --> RLC_UL : RBID[%d] direction[%d] is invalid",
500 entCfg->rbId,entCfg->dir);
505 case CKW_CFG_REESTABLISH:
507 if (entCfg->dir == RLC_DIR_UL)
509 RLC_MEM_CPY(entCfgCfm,
510 &cfgTmpData->cfgEntData[idx].entUlCfgCfm,
511 sizeof(RlcEntCfgCfmInfo));
513 else if (entCfg->dir == RLC_DIR_DL)
515 RLC_MEM_CPY(entCfgCfm, entDlCfgCfm, sizeof(RlcEntCfgCfmInfo));
519 if (entCfg->dir & RLC_DIR_UL)
521 /* Reestablish indication is sent from UL Instance only*/
522 if (entDlCfgCfm->status.status == CKW_CFG_CFM_OK)
524 rlcCfgApplyReEstUlRb (gCb, cfg->ueId,
526 &cfgTmpData->cfgEntData[idx]);
528 RLC_MEM_CPY(entCfgCfm, entDlCfgCfm, sizeof(RlcEntCfgCfmInfo));
533 case CKW_CFG_DELETE_UE:
535 if (cfgTmpData->cfgEntData[idx].entUlCfgCfm.status.status == CKW_CFG_CFM_OK)
537 rlcCfgApplyDelUlUe(gCb, cfgTmpData);
538 RLC_MEM_CPY(entCfgCfm,
539 &cfgTmpData->cfgEntData[idx].entUlCfgCfm,
540 sizeof(RlcEntCfgCfmInfo));
544 RLC_MEM_CPY(entCfgCfm, entDlCfgCfm,
545 sizeof(RlcEntCfgCfmInfo));
549 case CKW_CFG_DELETE_CELL:
551 if (cfgTmpData->cfgEntData[idx].entUlCfgCfm.status.status == CKW_CFG_CFM_OK)
553 rlcCfgApplyDelUlCell(gCb, cfgTmpData);
554 RLC_MEM_CPY(entCfgCfm,
555 &cfgTmpData->cfgEntData[idx].entUlCfgCfm,
556 sizeof(RlcEntCfgCfmInfo));
560 RLC_MEM_CPY(entCfgCfm, entDlCfgCfm,
561 sizeof(RlcEntCfgCfmInfo));
567 RLC_CFG_FILL_CFG_CFM(entCfgCfm, entCfg->rbId, entCfg->rbType,
568 CKW_CFG_CFM_NOK, CKW_CFG_REAS_INVALID_CFG);
570 DU_LOG("\nERROR --> RLC_UL : Invalid configuration type");
575 /* Assign number of entity configurations and suId */
576 cfgCfm->transId = cfgTmpData->uprLyrTransId;
577 cfgCfm->ueId = cfg->ueId;
578 cfgCfm->cellId = cfg->cellId;
579 cfgCfm->numEnt = cfg->numEnt;
585 #endif /* __cplusplus */
588 /**********************************************************************
590 **********************************************************************/