Initial commit
[o-du/l2.git] / src / 5gnrrlc / kw_cfg_dl.c
1 /*******************************************************************************
2 ################################################################################
3 #   Copyright (c) [2017-2019] [Radisys]                                        #
4 #                                                                              #
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                                    #
8 #                                                                              #
9 #       http://www.apache.org/licenses/LICENSE-2.0                             #
10 #                                                                              #
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 *******************************************************************************/
18
19 /********************************************************************20**
20
21         Name:    LTE RLC - Configuration Manager file
22
23         Type:    C source file
24
25         Desc:    It contains the following configuraiton primtives
26                  for different actions
27                     -- kwCfgValdtEntCfg
28                     -- kwCfgFillRbCb
29                     -- kwCfgRbInit
30                     -- kwCfgAddRb
31                     -- kwCfgReCfgRb
32                     -- kwCfgDelRb
33                     -- kwCfgReEstRb
34                     -- kwCfgDelUe
35
36         File:    kw_cfg_dl.c
37
38 *********************************************************************21*/
39 static const char* RLOG_MODULE_NAME="CFG";
40 static int RLOG_MODULE_ID=2048;
41 static int RLOG_FILE_ID=191;
42
43 /** @file kw_cfg_dl.c
44 @brief RLC Downlink Configuration Module
45 **/
46
47 \f
48 /* header (.h) include files */
49 #include "envopt.h"        /* environment options */
50 #include "envdep.h"        /* environment dependent */
51 #include "envind.h"        /* environment independent */
52
53 #include "gen.h"           /* general */
54 #include "ssi.h"           /* system services */
55 #include "cm5.h"           /* common timer defines */
56 #include "cm_tkns.h"       /* common tokens defines */
57 #include "cm_mblk.h"       /* common memory allocation library defines */
58 #include "cm_llist.h"      /* common link list  defines  */
59 #include "cm_hash.h"       /* common hash list  defines */
60 #include "cm_lte.h"        /* common LTE defines */
61 #include "lkw.h"           /* LKW defines */
62 #include "ckw.h"           /* CKW defines */
63 #include "kwu.h"           /* KWU defines */
64 #include "rgu.h"           /* RGU defines */
65 #include "kw_err.h"        /* RLC error options */
66 #include "kw_env.h"        /* RLC environment options */
67 #include "kw.h"            /* RLC defines */
68 #include "kw_udx.h"
69 #include "kw_dl.h"
70
71 /* extern (.x) include files */
72 #include "gen.x"           /* general */
73 #include "ssi.x"           /* system services */
74
75 #include "cm5.x"           /* common timer library */
76 #include "cm_tkns.x"       /* common tokens */
77 #include "cm_mblk.x"       /* common memory allocation */
78 #include "cm_llist.x"      /* common link list */
79 #include "cm_hash.x"       /* common hash list */
80 #include "cm_lte.x"        /* common LTE includes */
81 #include "cm_lib.x"        /* common memory allocation library */
82 #include "lkw.x"           /* LKW */
83 #include "ckw.x"           /* CKW */
84 #include "kwu.x"           /* KWU */
85 #include "rgu.x"           /* RGU */
86
87 #include "kw.x"
88 #include "kw_udx.x"
89 #include "kw_dl.x"
90
91 #define KW_MODULE KW_DBGMASK_CFG
92 /*Added for adding new Ue in onging L2 Meas*/
93 #ifdef LTE_L2_MEAS
94 /**
95  *
96  * @brief Handle modification of UE ID for L2 Meas data structs
97  *       
98  *
99  *  @param[in] ueId     ue ID
100  *
101  *  @return  S16
102  *      -# ROK 
103  *      -# RFAILED 
104  *
105 */
106 PRIVATE S16 kwHdlMeasDlUeIdChg(KwCb *gCb, U8 cellId,U8 oldUeId, U8 newUeId)
107 {
108    KwL2MeasEvtCb *measEvtCb = NULLP;
109    KwL2MeasCb    *measCb    = NULLP;
110    U16           cntr;
111    U16          ueIdx = 0;     
112
113    for(cntr = 0; cntr < LKW_MAX_L2MEAS; cntr++)
114    {
115       measEvtCb = &(gCb->u.dlCb->kwL2Cb.kwL2EvtCb[cntr]);
116       measCb = &(measEvtCb->measCb);
117
118
119       if(measCb->measType & LKW_L2MEAS_DL_IP ) 
120       {
121
122          for(ueIdx = 0; ueIdx < measCb->val.ipThMeas.numUes; ueIdx++)
123          {
124             if((measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId) == oldUeId)
125             {
126                measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId = newUeId;
127                break;
128             }
129          }
130       }
131    }
132    RETVALUE(ROK);
133 }
134
135 /**
136  *
137  * @brief Handler to delete an UE's L2 Meas ctxt
138  *       
139 *
140  *  @param[in] ueId     ue ID
141  *
142  *  @return  S16
143  *      -# ROK 
144  *      -# RFAILED 
145  *
146 */
147 PRIVATE S16 kwDelFrmDlL2Meas(KwCb *gCb, U8 cellId,U8 ueId)
148 {
149    KwL2MeasEvtCb *measEvtCb = NULLP;
150    KwL2MeasCb    *measCb    = NULLP;
151    U16           cntr;
152    U16          ueIdx = 0;     
153
154
155    for(cntr = 0; cntr < LKW_MAX_L2MEAS; cntr++)
156    {
157       measEvtCb = &gCb->u.dlCb->kwL2Cb.kwL2EvtCb[cntr];
158       measCb = &(measEvtCb->measCb);
159
160
161       if(measCb->measType & LKW_L2MEAS_DL_IP )
162       {
163
164          for(ueIdx = 0; ((ueIdx < measCb->val.ipThMeas.numUes) &&
165                        (ueIdx < gCb->genCfg.maxUe)); ueIdx++)
166          {
167             if((measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId) == ueId)
168             {
169                measCb->val.ipThMeas.ueInfoLst[ueIdx].isValid = FALSE;
170                if (measCb->val.ipThMeas.numUes-1 == ueIdx)
171                {
172                   measCb->val.ipThMeas.numUes--;
173                }
174                break;
175             }
176          }
177       }
178    }
179
180    RETVALUE(ROK);
181 }
182
183
184 PRIVATE S16 kwAddToDlL2Meas(KwCb *gCb, KwDlRbCb *kwRbCb,U8 cellId,U8 ueId)
185 {
186    KwL2MeasEvtCb *measEvtCb = NULLP;
187    KwL2MeasCb    *measCb    = NULLP;
188    U16           cntr;
189    U16           cntr1;
190    U16            ueIdx = 0;
191    U16            qciIdx = 0;
192    U16           *numQci;
193    #ifndef XEON_SPECIFIC_CHANGES 
194    U8             freeIdx = gCb->genCfg.maxUe;
195    #else
196    U16            freeIdx = LKW_MAX_UE;
197    #endif
198
199
200    for(cntr = 0; cntr < LKW_MAX_L2MEAS; cntr++)
201    {
202       measEvtCb = &gCb->u.dlCb->kwL2Cb.kwL2EvtCb[cntr];
203       measCb = &(measEvtCb->measCb);
204
205       freeIdx = gCb->genCfg.maxUe;
206
207       if(measCb->measType & 
208           (LKW_L2MEAS_ACT_UE | LKW_L2MEAS_UU_LOSS | LKW_L2MEAS_DL_DELAY))
209       {
210          for(cntr1 =0;((cntr1 < measCb->val.nonIpThMeas.numQci) &&
211                        (cntr1 < LKW_MAX_QCI));cntr1++)
212          {
213             if(measCb->val.nonIpThMeas.qci[cntr1] != kwRbCb->qci)
214             {
215                measCb->val.nonIpThMeas.qci[cntr1]  = kwRbCb->qci;
216                gCb->u.dlCb->kwL2Cb.measOn[kwRbCb->qci] |=measCb->measType;
217                break;
218             }
219          }
220       }
221
222       if(((kwRbCb->rbL2Cb.measOn & measCb->measType) == LKW_L2MEAS_NONE))
223       {
224          if (measCb->measType & LKW_L2MEAS_ACT_UE)
225          {
226             if((kwRbCb->mode == CM_LTE_MODE_UM) &&
227                   (kwRbCb->dir & KW_DIR_DL ))
228             {
229                if (kwRbCb->m.umDl.sduQ.count)
230                {
231                   if (kwRbCb->ueCb->numActRb[kwRbCb->qci] == 0)
232                   {
233                      kwRbCb->ueCb->numActRb[kwRbCb->qci]++;
234                      gCb->u.dlCb->kwL2Cb.numActUe[kwRbCb->qci]++;
235                   }
236                }
237             }
238             else if (kwRbCb->mode == CM_LTE_MODE_AM)
239             {
240                if ((kwRbCb->m.amDl.cntrlBo) ||
241                      (kwRbCb->m.amDl.retxBo)  ||
242                      (kwRbCb->m.amDl.bo))
243                {
244                   if (kwRbCb->ueCb->numActRb[kwRbCb->qci] == 0)
245                   {
246                      kwRbCb->ueCb->numActRb[kwRbCb->qci]++;
247                      gCb->u.dlCb->kwL2Cb.numActUe[kwRbCb->qci]++;
248                   }
249                }
250             }
251          }
252       }
253       if((measCb->measType & LKW_L2MEAS_DL_IP))
254       {
255
256          for(ueIdx = 0; ((ueIdx < measCb->val.ipThMeas.numUes) &&
257                          (ueIdx < gCb->genCfg.maxUe)); ueIdx++)
258          {
259             if ((freeIdx == gCb->genCfg.maxUe) && 
260                   (measCb->val.ipThMeas.ueInfoLst[ueIdx].isValid == FALSE))
261             {
262                freeIdx = ueIdx;
263                continue;
264             }
265             if((measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId) == ueId)
266             {
267                break;
268             }
269          }
270
271          if (ueIdx ==  measCb->val.ipThMeas.numUes)
272          {
273             if (gCb->genCfg.maxUe == measCb->val.ipThMeas.numUes)
274             {
275                RETVALUE(RFAILED);  
276             }
277             if (gCb->genCfg.maxUe == freeIdx)
278             {               
279                measCb->val.ipThMeas.numUes++;
280             }
281             else
282             {
283                ueIdx = freeIdx;
284             }
285             measCb->val.ipThMeas.ueInfoLst[ueIdx].isValid = TRUE;
286             cmMemset((U8 *)&measCb->val.ipThMeas.ueInfoLst[ueIdx].measData[0],0x00,(sizeof(KwL2Cntr) *LKW_MAX_QCI));
287             measCb->val.ipThMeas.ueInfoLst[ueIdx].numQci = 0;
288          }
289          measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId = ueId;
290          measCb->val.ipThMeas.ueInfoLst[ueIdx].cellId = cellId;
291          numQci = &(measCb->val.ipThMeas.ueInfoLst[ueIdx].numQci);
292
293          for (qciIdx =0; ((qciIdx <  *numQci) &&
294                            (qciIdx < LKW_MAX_QCI)) ; qciIdx++)
295          {
296             if (measCb->val.ipThMeas.ueInfoLst[ueIdx].qci[qciIdx] == kwRbCb->qci)
297             {
298                break;
299             }
300          }
301
302          /* Fix Klock Warning */
303          if ((qciIdx == *numQci) && (qciIdx < LKW_MAX_QCI))
304          {
305             measCb->val.ipThMeas.ueInfoLst[ueIdx].qci[qciIdx] = kwRbCb->qci;
306             (*numQci)++;
307          }
308
309          kwUtlPlcMeasDatInL2Sts(&measCb->val.ipThMeas.ueInfoLst[ueIdx].measData[kwRbCb->qci],
310                &kwRbCb->rbL2Cb, measCb->measType);
311       }
312       else if (measCb->measType & 
313          (LKW_L2MEAS_DL_DISC | LKW_L2MEAS_DL_DELAY | LKW_L2MEAS_UU_LOSS))
314       {
315          kwUtlPlcMeasDatInL2Sts(&measCb->val.nonIpThMeas.measData[kwRbCb->qci],
316                &kwRbCb->rbL2Cb, measCb->measType);
317          measCb->val.nonIpThMeas.qci[kwRbCb->qci] = kwRbCb->qci;
318          measCb->val.nonIpThMeas.measData[kwRbCb->qci].totDrbsPerQci++;
319       }
320       kwRbCb->rbL2Cb.measOn |= measCb->measType;      
321    }
322    RETVALUE(ROK);
323 }/*kwAddToDlL2Meas*/ 
324 #endif /*LTE_L2_MEAS*/
325 \f
326 /** 
327  * @brief
328  *     This primitive fills the RbCb 
329  *
330  * @param [in]    gCb      -  RLC Instance Control Block
331  * @param [out]   rbCb     -  RB Control Block
332  * @param [out]   ueCb     -  UE Control Block
333  * @param [in]    entCfg   -  RLC Entity configuration
334  *
335  * @return  S16
336  *    -#ROK
337  *    -#RFAILED
338  */
339 #ifdef ANSI
340 PRIVATE S16 kwCfgFillDlRbCb
341 (
342 KwCb            *gCb,
343 KwDlRbCb        *rbCb,
344 KwDlUeCb        *ueCb,
345 CkwEntCfgInfo   *entCfg
346 )
347 #else
348 PRIVATE S16 kwCfgFillDlRbCb(gCb,rbCb,entCfg)
349 KwCb            *gCb;
350 KwDlRbCb        *rbCb;
351 KwDlUeCb        *ueCb;
352 CkwEntCfgInfo   *entCfg;
353 #endif
354 {
355    TRC3(kwCfgFillDlRbCb)
356
357    RLOG_ARG3(L_DEBUG,DBG_RBID,entCfg->rbId,
358          "kwCfgFillRbCb(ueId(%d),cellId(%d) rbType(%d))",
359                 rbCb->rlcId.ueId,
360                 rbCb->rlcId.cellId, 
361                 entCfg->rbType);
362
363    /* Initialize according to entMode */
364    switch (entCfg->entMode)
365    {
366       case CM_LTE_MODE_TM:
367       {
368          rbCb->lch.lChId  = entCfg->lCh[0].lChId;
369          rbCb->lch.lChType = entCfg->lCh[0].type;
370          rbCb->dir = entCfg->dir;
371          break;
372       }
373
374       case CM_LTE_MODE_UM:
375       {
376          rbCb->lch.lChId  = entCfg->lCh[0].lChId;
377          rbCb->lch.lChType = entCfg->lCh[0].type;
378          rbCb->dir = entCfg->dir;
379          rbCb->m.umDl.snLen = entCfg->m.umInfo.dl.snLen;
380          if (entCfg->m.umInfo.dl.snLen == KW_UM_CFG_5BIT_SN_LEN)
381             rbCb->m.umDl.modBitMask = 0x1f;
382          else
383             rbCb->m.umDl.modBitMask = 0x3ff;
384
385          ueCb->lCh[rbCb->lch.lChId - 1].dlRbCb = rbCb;
386
387          break;
388       }
389       case CM_LTE_MODE_AM:
390       {
391          /* Down Link Information 
392           * indx = 0 as Down Link   */
393          rbCb->lch.lChId  = entCfg->lCh[0].lChId;
394          rbCb->lch.lChType = entCfg->lCh[0].type;
395          rbCb->dir = KW_DIR_BOTH;
396          rbCb->m.amDl.pollPdu = entCfg->m.amInfo.dl.pollPdu;
397          rbCb->m.amDl.pollByte = entCfg->m.amInfo.dl.pollByte;
398          rbCb->m.amDl.maxRetx = entCfg->m.amInfo.dl.maxRetx;
399          rbCb->m.amDl.pollRetxTmrInt = entCfg->m.amInfo.dl.pollRetxTmr;
400          rbCb->m.amDl.snLen = entCfg->m.amInfo.dl.snLen;
401          
402          if(KW_AM_CFG_12BIT_SN_LEN == rbCb->m.amDl.snLen)
403          {
404             rbCb->m.amDl.snModMask = (1 << KW_SN_LEN_12BITS) - 1; /* 5GNR */
405          }
406          else 
407          {
408             rbCb->m.amDl.snModMask = (1 << KW_SN_LEN_18BITS) - 1; /* 5GNR */
409          }
410
411          cmInitTimers(&(rbCb->m.amDl.pollRetxTmr), 1);
412       
413         
414          ueCb->lCh[rbCb->lch.lChId - 1].dlRbCb = rbCb;
415        
416 #ifndef LTE_TDD 
417              U32 hashIndex;
418               KW_ALLOC(gCb,
419                     rbCb->m.amDl.txBufLst,
420                     (KW_TX_BUF_BIN_SIZE * sizeof(CmLListCp)));
421               for(hashIndex = 0; hashIndex < KW_TX_BUF_BIN_SIZE; hashIndex++)
422               {
423                   cmLListInit(&(rbCb->m.amDl.txBufLst[hashIndex]));
424               }
425 #endif
426          break;
427       }
428       default:
429       {
430          RLOG_ARG2(L_ERROR,DBG_RBID,entCfg->rbId, 
431                   "Invalid RB Mode ueId(%d),cellId(%d)",
432                   rbCb->rlcId.ueId,
433                   rbCb->rlcId.cellId);
434          RETVALUE(RFAILED);
435       }
436    }
437    rbCb->mode = entCfg->entMode;
438    rbCb->discTmrInt = entCfg->discardTmr;
439
440    RETVALUE(ROK);
441
442
443 \f
444 /** 
445  * @brief This primitive Initializes the RB Cb
446  *
447  * @param [in]    gCb      -  RLC Instance Control Block
448  * @param [out]   rbCb     -  RB Control Block
449  * @param [in]    ptr      -  Void pointer
450  * @param [in]    entCfg   -  Entity Configuration
451  *
452  * @return  S16
453  *    -#ROK
454  *    -#RFAILED
455  */
456 #ifdef ANSI
457 PRIVATE S16 kwCfgUpdateDlRb
458 (
459 KwCb            *gCb,
460 KwDlRbCb        *rbCb,
461 void            *ptr,
462 CkwEntCfgInfo   *entCfg
463 )
464 #else
465 PRIVATE S16 kwCfgUpdateDlRb(gCb,rbCb, ptr, entCfg)
466 KwCb            *gCb;
467 KwDlRbCb        *rbCb;
468 void            *ptr;
469 CkwEntCfgInfo   *entCfg;
470 #endif
471 {
472    TRC3(kwCfgUpdateDlRb)
473    
474    if (rbCb->mode != entCfg->entMode)
475    {
476       RLOG_ARG4(L_ERROR,DBG_RBID,rbCb->rlcId.rbId,
477             "RB Mode Mismatch : exp [%d] rcv [%d] UEID:%d CELLID:%d", 
478             rbCb->mode, 
479             entCfg->entMode,
480             rbCb->rlcId.ueId,
481             rbCb->rlcId.cellId);
482       RETVALUE(CKW_CFG_REAS_RB_MODE_MIS);
483    }
484
485    switch (rbCb->mode)
486    {
487       case CM_LTE_MODE_TM:
488       {
489          KwDlCellCb *cellCb = (KwDlCellCb *)ptr;
490
491          rbCb->dir = entCfg->dir;
492          rbCb->lch.lChId = entCfg->lCh[0].lChId;
493          rbCb->lch.lChType = entCfg->lCh[0].type;
494
495          cellCb->lCh[rbCb->lch.lChId - 1].dlRbCb = rbCb;
496          break;
497       }
498
499       case CM_LTE_MODE_UM:
500       {
501          KwDlUeCb *ueCb = (KwDlUeCb *)ptr;
502
503          if (entCfg->lCh[0].type == CM_LTE_LCH_DCCH)
504          {
505             RETVALUE(CKW_CFG_REAS_LCHTYPE_MIS);
506          }
507          ueCb->lCh[rbCb->lch.lChId - 1].dlRbCb = NULLP;
508          ueCb->lCh[entCfg->lCh[0].lChId - 1].dlRbCb = rbCb;
509
510          rbCb->lch.lChId = entCfg->lCh[0].lChId;
511          rbCb->lch.lChType = entCfg->lCh[0].type;
512          rbCb->dir = entCfg->dir;
513          break;
514       }
515
516       case CM_LTE_MODE_AM:
517       {
518          KwDlUeCb *ueCb = (KwDlUeCb *)ptr;
519
520          ueCb->lCh[rbCb->lch.lChId - 1].dlRbCb = NULLP;
521          ueCb->lCh[entCfg->lCh[1].lChId - 1].dlRbCb = rbCb;
522          
523          /* Down Link */
524          rbCb->lch.lChId = entCfg->lCh[1].lChId;
525          rbCb->lch.lChType = entCfg->lCh[1].type;
526          rbCb->m.amDl.pollRetxTmrInt = entCfg->m.amInfo.dl.pollRetxTmr;
527          rbCb->m.amDl.pollPdu = entCfg->m.amInfo.dl.pollPdu;
528          rbCb->m.amDl.pollByte = entCfg->m.amInfo.dl.pollByte;
529          rbCb->m.amDl.maxRetx = entCfg->m.amInfo.dl.maxRetx;
530          
531          break;
532       }
533    }
534
535 /* AGHOSH */
536    rbCb->discTmrInt = entCfg->discardTmr;
537 /* AGHOSH */
538    RETVALUE(CKW_CFG_REAS_NONE);
539
540
541 \f
542 /** 
543  * @brief 
544  *    This primitive adds new RB in Ue/Cell Cb.
545  *
546  * @details
547  *    This function does following steps -
548  *    - If UE ID is 0 then
549  *    - Check for CELL CB is present
550  *    - If yes, Check for RB ID
551  *       - If RB ID is present Status Indication with reason
552  *       - Else, Create New RB CB in CELL CB
553  *    - If no Create New CELL CB and RB CB
554  *    - Else,
555  *       - Check for UE CB is present
556  *       - If yes Check for RB ID
557  *          - If RB ID is present Status Indication with reason
558  *          - Else, Create New RB CB in UE CB
559  *          - If no Create New UE CB and RB CB
560  *    - Fill entity confirmation
561  *
562  * @param [in]    gCb      -  RLC Instance Control Block
563  * @param [in]    ueId     -  UE Identifier
564  * @param [in]    cellId   -  CELL Identifier
565  * @param [in]    entCfg   -  Entity Configuration to be done.
566  * @param [out]   entCfm   -  Entity Confirmation.
567  *
568  * @return  S16
569  *    -# ROK
570  *    -# RFAILED
571  */
572 #ifdef ANSI
573 PUBLIC S16 kwCfgAddDlRb
574 (
575 KwCb               *gCb,
576 CmLteRnti          ueId,
577 CmLteCellId        cellId,
578 CkwEntCfgInfo      *entCfg,
579 CkwEntCfgCfmInfo   *entCfm
580 )
581 #else
582 PUBLIC S16 kwCfgAddDlRb(gCb,ueId, cellId, entCfg, entCfm)
583 KwCb               *gCb;
584 CmLteRnti          ueId;
585 CmLteCellId        cellId;
586 CkwEntCfgInfo      *entCfg;
587 CkwEntCfgCfmInfo   *entCfm;
588 #endif
589 {
590    KwDlUeCb     *ueCb = NULLP;   /* UE Control Block */
591    KwDlCellCb   *cellCb;         /* Cell Control Block */
592    KwDlRbCb     *kwRbCb;         /* KW RB Control Block */
593    U8           reason;          /* Rb Identifier */
594
595    TRC3(kwCfgAddDlRb)
596
597    RLOG_ARG3(L_DEBUG,DBG_RBID,entCfg->rbId, 
598          "kwCfgAddRb(cellId(%d),UEID:%d cfgType(%d))",
599                 cellId, 
600                 ueId,
601                 entCfg->cfgType);
602
603    if (cellId == 0)
604    {
605       /* Fill entCfm structure */
606       KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
607                           CKW_CFG_REAS_CELL_UNKWN);
608       RLOG_ARG1(L_ERROR,DBG_RBID,entCfg->rbId,
609                "Add DLRb,CellId is 0 for UEID:%d",
610                ueId);
611       RETVALUE(RFAILED);
612    }
613    if ((entCfg->rguSapId >= gCb->genCfg.maxRguSaps) || (entCfg->rguSapId < 0))
614    {
615          KWDBGP_ERROR(gCb, "kwCfgAddDlRb(ueId(%u), cellId(%u), Invalid rguSapId (%d)\n",
616                ueId, cellId, entCfg->rguSapId);
617          RETVALUE(RFAILED); 
618    }
619
620
621    /* Process Adding new RB */
622    if (ueId == 0)
623    {
624       if(entCfg->rbId >= KW_MAX_RB_PER_CELL)
625       {
626          /* Fill entCfm structure */
627          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, 
628                              CKW_CFG_CFM_NOK,
629                              CKW_CFG_REAS_RB_UNKWN);
630          RLOG_ARG3(L_ERROR,DBG_RBID,entCfg->rbId,
631                   "Invalid RbId ,Max is [%d] CELLID:%d UEID:%d",
632                   KW_MAX_RB_PER_CELL,
633                   cellId,
634                   ueId);
635          RETVALUE(RFAILED);
636       }
637
638       if (((entCfg->lCh[0].type == CM_LTE_LCH_BCCH) || 
639            (entCfg->lCh[0].type == CM_LTE_LCH_PCCH) ||
640            (entCfg->lCh[0].type == CM_LTE_LCH_CCCH)) &&
641           (entCfg->entMode == CM_LTE_MODE_TM))
642       {
643          /* Cell CB present */
644          kwDbmFetchDlCellCb(gCb, cellId, &cellCb);
645          if(cellCb)
646          {
647             /* Get rbCb from cellCb->rbCb List */
648             if (( cellCb->rbCb[entCfg->rbId] != NULLP))
649             {
650                /* Fill entCfm structure */
651                KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, 
652                                    CKW_CFG_CFM_NOK,
653                                    CKW_CFG_REAS_RB_PRSNT);
654                RLOG_ARG2(L_WARNING, DBG_CELLID,cellId, 
655                         "RbId [%d] already exists UEID:%d",
656                         entCfg->rbId,
657                         ueId);
658                RETVALUE(RFAILED);
659             }
660          }
661          else  /* Cell CB UNKNOWN */
662          {
663             /* Create CELL CB */
664             if ( ROK != kwDbmCreateDlCellCb(gCb,cellId, &cellCb))
665             {
666                /* Fill entCfm structure */
667                KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, 
668                                    CKW_CFG_CFM_NOK,
669                                    CKW_CFG_REAS_CELL_CREAT_FAIL);
670                RLOG_ARG2(L_ERROR,DBG_CELLID,cellId,
671                         "cellCb Creation failed RBID:%d UEID:%d",
672                         entCfg->rbId,
673                         ueId);
674                RETVALUE(RFAILED);
675             }
676          }
677
678          /* Validate LChId */
679          if(entCfg->lCh[0].lChId <= 0)
680          {
681             RLOG_ARG3(L_ERROR,DBG_LCID,entCfg->lCh[0].lChId ,
682                      "Invalid LcId CELLID:%d UEID:%d RBID:%d",
683                      cellId,
684                      ueId,
685                      entCfg->rbId);
686             /* Fill entCfm structure */                               
687             KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, 
688                   CKW_CFG_CFM_NOK, CKW_CFG_REAS_INVALID_LCHID);           
689             RETVALUE(RFAILED);                                        
690          }                                                            
691
692          /* Create RB CB */
693          KW_ALLOC(gCb,kwRbCb, sizeof (KwDlRbCb));
694          if (!kwRbCb)
695          {
696             RLOG_ARG2(L_FATAL,DBG_UEID,ueId,
697                      "Memory allocation failed for rbId:%d CELLID:%d",
698                      entCfg->rbId,
699                      ueId);
700             /* Fill entCfm structure */                           
701             KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType,
702                                 CKW_CFG_CFM_NOK, CKW_CFG_REAS_RB_CREAT_FAIL); 
703             RETVALUE(RFAILED); 
704          }
705          kwRbCb->rlcId.rbId = entCfg->rbId;
706          cellCb->rbCb[entCfg->rbId] = kwRbCb;
707          KW_LMM_RB_STS_INC(gCb);
708          cellCb->lCh[entCfg->lCh[0].lChId - 1].dlRbCb = kwRbCb;
709       }
710       else
711       {
712          reason= (entCfg->entMode != CM_LTE_MODE_TM)? CKW_CFG_REAS_RB_MODE_MIS:
713                                                       CKW_CFG_REAS_LCHTYPE_MIS;
714          /* Fill entCfm structure */
715          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, 
716                              CKW_CFG_CFM_NOK, reason);
717          RETVALUE(RFAILED);
718       }
719    }
720    else
721    {
722       if (!(KW_VALIDATE_UE_RBID(entCfg->rbType, entCfg->rbId)))
723       {
724          /* Fill entCfm structure */
725          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
726                CKW_CFG_REAS_RB_UNKWN);
727          RLOG_ARG2(L_ERROR,DBG_RBID, entCfg->rbId,
728                   "Invalid RbId for RbType[%d] UEID:%d", 
729                   entCfg->rbType,
730                   ueId);
731          RETVALUE(RFAILED);
732       }
733       if ((((entCfg->lCh[0].type == CM_LTE_LCH_DCCH) && 
734             (entCfg->entMode != CM_LTE_MODE_UM) && 
735             (CM_LTE_SRB == entCfg->rbType)) ||
736            ((entCfg->lCh[0].type == CM_LTE_LCH_DTCH) && 
737             (CM_LTE_DRB == entCfg->rbType))) &&
738           (entCfg->entMode != CM_LTE_MODE_TM))
739       {
740          /* UE CB present */
741          if ( kwDbmFetchDlUeCb(gCb,ueId, cellId, &ueCb) == ROK)
742          {
743             /* Get rbCb from ueCb->rbCb list */
744             KW_DBM_GET_RBCB_FROM_UECB(entCfg->rbId, entCfg->rbType, ueCb, kwRbCb);
745
746             if(( kwRbCb != NULLP))
747             {
748                /* Fill entCfm structure */
749                KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
750                      CKW_CFG_REAS_RB_PRSNT);
751                RLOG_ARG2(L_WARNING, DBG_UEID, ueId,
752                         "CellId[%u]:rbId [%d] already exists",
753                         cellId,
754                         entCfg->rbId);
755                RETVALUE(RFAILED);
756             }
757          }
758          else  /* UE CB UNKNOWN */
759          {
760             /* Create UE CB */
761             if ( kwDbmCreateDlUeCb(gCb,ueId, cellId, &ueCb) != ROK)
762             {
763                /* Fill entCfm structure */
764                KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
765                      CKW_CFG_REAS_UE_CREAT_FAIL);
766                RLOG_ARG2(L_WARNING, DBG_CELLID,cellId,
767                         "UeId [%u]:ueCb Creation Failed RBID:%d",
768                         ueId,
769                         entCfg->rbId);
770                RETVALUE(RFAILED);
771             }
772          }
773
774          /* Validate LChId for UM and AM modes */
775          if ((entCfg->lCh[0].lChId <= 0) ||
776              ((entCfg->entMode == CM_LTE_MODE_AM)&&
777                (entCfg->lCh[1].lChId <= 0)))
778          {
779             /* Fill entCfm structure */                               
780             KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, 
781                   CKW_CFG_CFM_NOK, CKW_CFG_REAS_INVALID_LCHID);           
782             RETVALUE(RFAILED);                                        
783          }                                                            
784
785          /* Create RB CB */
786          KW_ALLOC(gCb,kwRbCb, sizeof (KwDlRbCb));
787          if (kwRbCb == NULL)
788          {
789             /* Fill entCfm structure */                           
790             KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType,CKW_CFG_CFM_NOK,
791                                     CKW_CFG_REAS_RB_CREAT_FAIL); 
792             RLOG_ARG2(L_FATAL,DBG_UEID,ueId,
793                      "Memory allocation failed RBID:%d CELLID:%d",
794                      entCfg->rbId,
795                      cellId);
796             RETVALUE(RFAILED); 
797          }
798
799          /* copy the RB Cb into UECb */
800          kwRbCb->rlcId.rbId = entCfg->rbId;
801          if(entCfg->rbType == CM_LTE_SRB)
802             ueCb->srbCb[entCfg->rbId] = kwRbCb;
803          else
804             ueCb->drbCb[entCfg->rbId] = kwRbCb;
805          
806          KW_LMM_RB_STS_INC(gCb);
807
808       }
809       else
810       {
811          if (entCfg->entMode == CM_LTE_MODE_TM)
812          {
813             reason = CKW_CFG_REAS_RB_MODE_MIS;
814          }
815          else
816          {
817             reason = CKW_CFG_REAS_LCHTYPE_MIS;
818          }
819
820          /* Fill entCfm structure */
821          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK, reason);
822          RETVALUE(RFAILED);
823       }
824    }
825
826
827    kwRbCb->rlcId.cellId = cellId;
828    kwRbCb->rlcId.ueId   = ueId;
829    kwRbCb->rlcId.rbType = entCfg->rbType;
830    kwRbCb->inst         = gCb->init.inst;
831 #ifdef TENB_MULT_CELL_SUPPRT
832    kwRbCb->rguSapId     = entCfg->rguSapId;
833 #endif
834
835
836    /* Fill RB CB */
837    if (kwCfgFillDlRbCb(gCb,kwRbCb, ueCb, entCfg) != ROK)
838    {
839       /* Fill entCfm structure */
840       KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
841                CKW_CFG_REAS_RB_CREAT_FAIL);
842
843       /* Delete RB CB created */
844       KW_FREE(gCb,kwRbCb, sizeof(KwDlRbCb));
845       RLOG_ARG2(L_ERROR,DBG_RBID, entCfg->rbId,
846                "Filling of RbCb failed UEID:%d CELLID:%d",
847                ueId,
848                cellId);
849       RETVALUE(RFAILED);
850    }
851    kwRbCb->qci = entCfg->qci;
852 #ifdef LTE_L2_MEAS
853    kwRbCb->ueCb =  ueCb;
854    if (entCfg->lCh[0].type == CM_LTE_LCH_DTCH)
855    {
856       /* ccpu00129778 */
857       kwAddToDlL2Meas(gCb, kwRbCb,cellId,ueId); 
858    }
859 #endif /* LTE_L2_MEAS */
860
861    /* Fill entCfm structure */
862    KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_OK, CKW_CFG_REAS_NONE);
863
864    RETVALUE(ROK);
865
866
867 \f
868 /** 
869  * @brief
870  *    This primitive reconfigures the existing RB in Ue/Cell Cb.
871  *
872  * @details
873  *    This primitive executes following steps in reconfiguration of existing
874  *    RB -
875  *    - If UE ID is 0 then
876  *       - Check for CELL CB is present
877  *       - If yes, Check for RB ID
878  *          - If RB ID is present Reconfigure the RB CB
879  *          - Else, Status Indication with Reason
880  *       - Else, Status Indication with Reason
881  *    - Else,
882  *       - Check for UE CB is present
883  *       - If yes, Check for RB ID
884  *          - If RB ID is prenset Reconfigure the CELL CB
885  *          - Else, Status Indication with Reason
886  *       - Else, Status Indication with Reason
887  *    - Fill entity confirmation
888  *
889  * @param [in]    gCb      -  RLC Instance Control Block
890  * @param [in]    ueId     -  UE Identifier
891  * @param [in]    cellId   -  CELL Identifier
892  * @param [in]    entCfg   -  Entity Configuration to be done.
893  * @param [out]   entCfm   -  Entity Confirmation
894  *
895  * @return  S16
896  *    -#ROK
897  *    -#RFAILED
898  */
899 #ifdef ANSI
900 PUBLIC S16 kwCfgReCfgDlRb
901 (
902 KwCb               *gCb,
903 CmLteRnti          ueId,
904 CmLteCellId        cellId,
905 CkwEntCfgInfo      *entCfg,
906 CkwEntCfgCfmInfo   *entCfm
907 )
908 #else
909 PUBLIC S16 kwCfgReCfgDlRb(gCb,ueId, cellId, entCfg, entCfm)
910 KwCb               *gCb;
911 CmLteRnti          ueId;
912 CmLteCellId        cellId;
913 CkwEntCfgInfo      *entCfg;
914 CkwEntCfgCfmInfo   *entCfm;
915 #endif
916 {
917    KwDlRbCb     *rbCb;     /* RB Control Block */
918    KwDlRbCb     tRbCb;     /* KW RB Control Block */
919    KwDlCellCb   *cellCb;   /* Cell Control Block */
920    KwDlUeCb     *ueCb;     /* Ue Control Block */
921    U8           ret;
922
923    TRC3(kwCfgReCfgDlRb)
924
925    RLOG_ARG3(L_DEBUG,DBG_UEID,ueId,
926              "kwCfgReCfgRb(cellId(%d), cfgType(%d)) RBID:%d",
927             cellId, entCfg->cfgType,entCfg->rbId);
928
929
930    /* Check for UeCb or CellCb */
931    if (ueId == 0)
932    { 
933       if(entCfg->rbId >= KW_MAX_RB_PER_CELL)
934       {
935          /* Fill entCfm structure */
936          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
937                              CKW_CFG_REAS_RB_UNKWN);
938          RLOG_ARG3(L_ERROR,DBG_RBID,entCfg->rbId,
939                   "Invalid RbId , Max is [%d] UEID:%d CELLID:%d",
940                   KW_MAX_RB_PER_CELL,
941                   ueId,
942                   cellId);
943          RETVALUE(RFAILED);
944       }
945       /* Get cellCb */
946       kwDbmFetchDlCellCb(gCb,cellId, &cellCb);
947       if(!cellCb)
948       {
949          /* Fill entCfm structure */
950          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
951                              CKW_CFG_REAS_CELL_UNKWN);
952          RLOG_ARG3(L_ERROR,DBG_CELLID,cellId,
953                   "CellCb not found ueId:%d RBID:%d CELLID:%d",
954                   ueId,
955                   entCfg->rbId,
956                   cellId);
957          RETVALUE(RFAILED);
958       }
959
960       /* Get rbCb */
961       KW_DBM_GET_CELL_RBCB(entCfg->rbId, cellCb->rbCb, rbCb);
962
963       if (!rbCb)
964       {
965          /* Fill entCfm structure */
966          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
967                CKW_CFG_REAS_RB_UNKWN);
968          RLOG_ARG2(L_ERROR,DBG_UEID,ueId,
969                   "CELLID:%d RBID:%d not found",
970                   cellId,
971                   entCfg->rbId);
972          RETVALUE(RFAILED);
973       }
974
975       /* Take backup of rbCb before updating.
976        * Because in failure case restore original rbCb
977        */
978       cmMemcpy((U8 *)&tRbCb, (U8 *)rbCb, sizeof(KwDlRbCb));
979
980       /* Update rbCb */
981       ret = kwCfgUpdateDlRb(gCb,rbCb, cellCb,entCfg);
982       if (ret != ROK)
983       {
984          /* Fill entCfm structure */
985          KW_CFG_FILL_CFG_CFM(entCfm, 
986                              entCfg->rbId, 
987                              entCfg->rbType, 
988                              CKW_CFG_CFM_NOK,
989                              ret);
990
991          RLOG_ARG2(L_ERROR,DBG_UEID,ueId,
992                   "CELLID:%u RBID:%d updation failed",
993                   cellId,
994                   entCfg->rbId);
995          cmMemcpy((U8*)rbCb, (U8 *)&tRbCb, sizeof(KwDlRbCb));
996
997          RETVALUE(ret);
998       }
999    }
1000    else
1001    {
1002       if (!(KW_VALIDATE_UE_RBID(entCfg->rbType, entCfg->rbId)))
1003       {
1004          /* Fill entCfm structure */
1005          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
1006                CKW_CFG_REAS_RB_UNKWN);
1007          RLOG_ARG3(L_ERROR,DBG_UEID,ueId,
1008                   "CELLID:%d Invalid RBID:%d for RbType[%d]",
1009                   cellId,
1010                   entCfg->rbId,
1011                   entCfg->rbType);
1012          RETVALUE(RFAILED);
1013       }
1014       /* Get ueCb */
1015       ret = kwDbmFetchDlUeCb(gCb,ueId, cellId, &ueCb);
1016       if (ret != ROK)
1017       {
1018          /* Fill entCfm structure */
1019          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, 
1020                              CKW_CFG_CFM_NOK, CKW_CFG_REAS_UE_UNKWN);
1021          RLOG_ARG2(L_ERROR,DBG_CELLID, cellId,
1022                   "UEID:%d UeCb not found RBID:%d",
1023                   ueId,
1024                   entCfg->rbId);
1025          RETVALUE(ret);
1026       }
1027
1028       /* Get rbCb */
1029       KW_DBM_GET_RBCB_FROM_UECB(entCfg->rbId, entCfg->rbType, ueCb, rbCb);
1030
1031       if ( rbCb == NULLP)
1032       {
1033          /* Fill entCfm structure */
1034          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
1035                CKW_CFG_REAS_RB_UNKWN);
1036          RLOG_ARG2(L_ERROR, DBG_UEID,ueId, 
1037                   "CELLID:%d RBID:%d not found",
1038                   cellId,
1039                   entCfg->rbId);
1040          RETVALUE(ret);
1041       }
1042
1043       /* Take backup of rbCb before updating.
1044        * Because in failure case restore original rbCb
1045        */
1046       cmMemcpy((U8 *)&tRbCb, (U8 *)rbCb, sizeof(KwDlRbCb));
1047
1048       /* Update rbCb */
1049       ret = kwCfgUpdateDlRb(gCb,rbCb,ueCb, entCfg);
1050       if (ret != CKW_CFG_REAS_NONE)
1051       {
1052          /* Fill entCfm structure */
1053          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
1054                ret);
1055          RLOG_ARG2(L_ERROR,DBG_UEID,ueId,
1056                   "CELLID:%d RBID:%d updation failed",
1057                   cellId,
1058                   entCfg->rbId);
1059          cmMemcpy((U8*)rbCb, (U8 *)&tRbCb, sizeof(KwDlRbCb));
1060
1061          RETVALUE(ret);
1062       }
1063    }
1064
1065    /* Fill entCfm structure */
1066    KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_OK, CKW_CFG_REAS_NONE);
1067
1068    RETVALUE(ROK);
1069
1070
1071 \f
1072 /** 
1073  * @brief This primitive deletes the existing RB in Ue/Cell Cb.
1074  *
1075  * @details
1076  *    - If UE ID is 0 then
1077  *      - Check for CELL CB is present
1078  *       - If yes, Check for RB ID
1079  *      - If RB ID is prenset Delete the RB CB
1080  *       - If there is no RB CB exist in CELL CB then Delete CELL CB.
1081  *      - Else, Status Indication with Reason
1082  *      - Else, Status Indication with Reason
1083  *    - Else,
1084  *      - Check for UE CB is present
1085  *      - If yes, Check for RB ID
1086  *        - If RB ID is prenset Delete the RB CB
1087  *          - If there is no RB CB exist in UE CB then Delete UE CB.
1088  *        - Else, Status Indication with Reason
1089  *      - Else, Status Indication with Reason
1090  *    - Fill entity confirmation
1091  *
1092  * @param [in]    gCb      -  RLC Instance Control Block
1093  * @param [in]    ueId     -  UE Identifier
1094  * @param [in]    cellId   -  CELL Identifier
1095  * @param [in]    entCfg   -  Entity Configuration to be done.
1096  * @param [out]   entCfm   -  Entity Confirmation
1097  *
1098  * @return  S16
1099  *    -#ROK
1100  *    -#RFAILED
1101  */
1102 #ifdef ANSI
1103 PUBLIC S16 kwCfgDelDlRb
1104 (
1105 KwCb               *gCb,
1106 CmLteRnti          ueId,
1107 CmLteCellId        cellId,
1108 CkwEntCfgInfo      *entCfg,
1109 CkwEntCfgCfmInfo   *entCfm
1110 )
1111 #else
1112 PUBLIC S16 kwCfgDelRb(gCb,ueId, cellId, entCfg, entCfm)
1113 KwCb               *gCb;
1114 CmLteRnti          ueId;
1115 CmLteCellId        cellId;
1116 CkwEntCfgInfo      *entCfg;
1117 CkwEntCfgCfmInfo   *entCfm;
1118 #endif
1119 {
1120    S16          ret;       /* Return Value */
1121    KwDlUeCb     *ueCb;     /* UE Control Block */
1122    KwDlCellCb   *cellCb;   /* UE Control Block */
1123    KwDlRbCb     *kwRbCb;   /* KW RB Control Block */
1124
1125    TRC3(kwCfgDelDlRb)
1126
1127    RLOG_ARG3(L_DEBUG,DBG_UEID,ueId, 
1128             "kwCfgDelRb(RBID(%d), cellId(%d), cfgType(%d))",
1129             entCfg->rbId, 
1130             cellId, 
1131             entCfg->cfgType);
1132
1133    ret = ROK;
1134
1135    /* Get cellCb and delete rbCb from it */
1136    if (ueId == 0)
1137    {
1138       if(entCfg->rbId >= KW_MAX_RB_PER_CELL)
1139       {
1140          /* Fill entCfm structure */
1141          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, 
1142                              CKW_CFG_CFM_NOK, CKW_CFG_REAS_RB_UNKWN);
1143          RLOG_ARG3(L_ERROR,DBG_RBID,entCfg->rbId ,
1144                   "Invalid RbId, Max is [%d] UEID:%d CELLID:%d",
1145                   KW_MAX_RB_PER_CELL,
1146                   ueId,
1147                   cellId);
1148          RETVALUE(RFAILED);
1149       }
1150       /* Get cellCb */
1151       kwDbmFetchDlCellCb(gCb,cellId, &cellCb);
1152       if (!cellCb)
1153       {
1154          /* Fill entCfm structure */
1155          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, 
1156                              CKW_CFG_CFM_NOK, CKW_CFG_REAS_RB_UNKWN);
1157          RLOG_ARG2(L_ERROR,DBG_CELLID,cellId,
1158                   "CellCb not found UEID:%d RBID:%d",
1159                   ueId,
1160                   entCfg->rbId);
1161          RETVALUE(ret);
1162       }
1163
1164       /* Get rbCb */
1165       KW_DBM_GET_CELL_RBCB(entCfg->rbId, cellCb->rbCb, kwRbCb);
1166
1167       if ( kwRbCb == NULLP)
1168       {
1169          /* Fill entCfm structure */
1170          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, 
1171                              CKW_CFG_CFM_NOK, CKW_CFG_REAS_RB_UNKWN);
1172          RLOG_ARG2(L_ERROR, DBG_UEID,ueId,
1173                   "CellId[%u]:RbId[%d] not found",
1174                   cellId,
1175                   entCfg->rbId);
1176          RETVALUE(ret);
1177       }
1178
1179       /* Assign NULLP to rbCb in rbCbLst */
1180       cellCb->rbCb[entCfg->rbId] = NULLP;
1181
1182       /* Assign NULLP to dlRbCb/ulRbCb.
1183        * Delete Hashlist allocated for it if any */
1184       cellCb->lCh[kwRbCb->lch.lChId - 1].dlRbCb = NULLP;
1185       KW_FREE(gCb,kwRbCb, sizeof(KwDlRbCb));   /*Vartika: Mem leak fix */  
1186    }
1187     /* Get ueCb and delete rbCb from it */
1188    else
1189    {
1190       if (!(KW_VALIDATE_UE_RBID(entCfg->rbType, entCfg->rbId)))
1191       {
1192          /* Fill entCfm structure */
1193          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, 
1194                              CKW_CFG_CFM_NOK, CKW_CFG_REAS_RB_UNKWN);
1195          RLOG_ARG3(L_ERROR,DBG_RBID, entCfg->rbId,
1196                   "Invalid RbId for RbType[%d] UEID:%d CELLID:%d", 
1197                   entCfg->rbType,
1198                   ueId,
1199                   cellId);
1200          RETVALUE(RFAILED);
1201       }
1202
1203       /* Get ueCb */
1204       ret = kwDbmFetchDlUeCb(gCb,ueId, cellId, &ueCb);
1205       if (ret != ROK)
1206       {
1207          /* Fill entCfm structure */
1208          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, 
1209                              CKW_CFG_CFM_NOK, CKW_CFG_REAS_UE_UNKWN);
1210          RLOG_ARG2(L_ERROR,DBG_CELLID, cellId,
1211                   "UeId [%d]: UeCb not found RBID:%d",
1212                   ueId,
1213                   entCfg->rbId);
1214          RETVALUE(ret);
1215       }
1216
1217       /* Get rbCb */
1218       KW_DBM_GET_RBCB_FROM_UECB(entCfg->rbId, entCfg->rbType, ueCb, kwRbCb);
1219
1220       if ( kwRbCb == NULLP)
1221       {
1222          /* Fill entCfm structure */
1223          KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
1224                CKW_CFG_REAS_RB_UNKWN);
1225          RLOG_ARG2(L_ERROR, DBG_UEID,ueId,
1226                   "CellId[%u]:RbId[%d] not found",
1227                   cellId,
1228                   entCfg->rbId);
1229          RETVALUE(ret);
1230       }
1231
1232       ueCb->lCh[kwRbCb->lch.lChId - 1].dlRbCb = NULLP;
1233
1234 #ifdef LTE_L2_MEAS
1235       KW_UPD_L2_DECR_NONIP_PER_QCI_RB_COUNT(gCb, kwRbCb);
1236 #endif
1237       /* Free the Buffers of RbCb */
1238       if( CM_LTE_MODE_UM == kwRbCb->mode)
1239       {
1240          kwUmmFreeDlRbCb(gCb,kwRbCb);
1241          /* Delete RbCb  */
1242          KW_FREE(gCb,kwRbCb, sizeof(KwDlRbCb));     
1243       }
1244       else if( CM_LTE_MODE_AM == kwRbCb->mode)
1245       {
1246          kwAmmFreeDlRbCb(gCb,kwRbCb);
1247       }
1248
1249       /* Assign NULLP to rbCb in rbCbLst */
1250       if ( entCfg->rbType == CM_LTE_SRB )
1251       {
1252          ueCb->srbCb[entCfg->rbId] = NULLP;
1253       }
1254       else
1255       {
1256          ueCb->drbCb[entCfg->rbId] = NULLP;
1257       }
1258    }
1259
1260    KW_LMM_RB_STS_DEC(gCb);
1261
1262    /* Fill entCfm structure */
1263    KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType, CKW_CFG_CFM_OK, 
1264                        CKW_CFG_REAS_NONE);
1265
1266    RETVALUE(ret);
1267
1268
1269 \f
1270 /** 
1271  * @brief This primitive re-establish the existing RB in Ue/Cell Cb.
1272  *
1273  * @details
1274  *    - If UE ID is 0 then
1275  *      - Check for CELL CB is present
1276  *      - If yes, Check for RB ID
1277  *        - If RB ID is prenset initialize the parameters of the RB CB
1278  *        - Else, Status Indication with Reason
1279  *      - Else, Status Indication with Reason
1280  *    - Else,
1281  *      - Check for UE CB is present
1282  *      - If yes, Check for RB ID
1283  *        - If RB ID is prenset initialize the parameters of the RB CB
1284  *        - Else, Status Indication with Reason
1285  *      - Else, Status Indication with Reason
1286  *    - Fill entity confirmation
1287  *
1288  * @param [in]    gCb      -  RLC Instance Control Block
1289  * @param [in]    ueId     -  UE Identifier
1290  * @param [in]    cellId   -  CELL Identifier
1291  * @param [in]    entCfg   -  Entity Configuration to be done.
1292  * @param [out]   entCfm   -  Entity Confirmation
1293  *
1294  * @return  S16
1295  *    -# ROK
1296  *    -# RFAILED
1297  */
1298 #ifdef ANSI
1299 PUBLIC S16 kwCfgReEstDlRb
1300 (
1301 KwCb               *gCb,
1302 CmLteRnti          ueId,
1303 CmLteCellId        cellId,
1304 Bool               sndReEstInd,
1305 CkwEntCfgInfo      *entCfg,
1306 CkwEntCfgCfmInfo   *entCfm
1307 )
1308 #else
1309 PUBLIC S16 kwCfgReEstDlRb(gCb,ueId, cellId,sndReEstInd,entCfg, entCfm)
1310 KwCb               *gCb;
1311 CmLteRnti          ueId;
1312 CmLteCellId        cellId;
1313 Bool               sndReEstInd;
1314 CkwEntCfgInfo      *entCfg;
1315 CkwEntCfgCfmInfo   *entCfm;
1316 #endif
1317 {
1318    KwDlRbCb     *rbCb;   /* RB Control Block */
1319    CmLteRlcId   rlcId;   /* RLC Identifier */
1320
1321    TRC3(kwCfgReEstDlRb)
1322
1323    RLOG_ARG3(L_DEBUG,DBG_RBID,entCfg->rbId,
1324             "kwCfgReEstDlRb(ueId(%d), cellId(%d), cfgType(%d))",
1325             ueId, 
1326             cellId, 
1327             entCfg->cfgType);
1328
1329    /* Get rlcId */
1330    rlcId.ueId = ueId;
1331    rlcId.cellId = cellId;
1332    rlcId.rbId = entCfg->rbId;
1333    rlcId.rbType = entCfg->rbType;
1334
1335    kwDbmFetchDlRbCbByRbId(gCb,&rlcId, &rbCb);
1336    if (rbCb == NULLP)
1337    {
1338       /* Fill entCfm structure */
1339       KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, rlcId.rbType, CKW_CFG_CFM_NOK,
1340             CKW_CFG_REAS_RB_UNKWN);
1341       RLOG_ARG2(L_ERROR, DBG_UEID,ueId,
1342                "CellId[%u]:RbId[%d] not found",
1343                cellId,
1344                entCfg->rbId);
1345       RETVALUE(RFAILED);
1346    }
1347
1348    rbCb->rlcId.ueId = ueId;
1349
1350    switch (rbCb->mode)
1351    {
1352       case CM_LTE_MODE_TM:
1353          {
1354             kwDlTmmReEstablish(gCb,rbCb);
1355             break;
1356          }
1357
1358       case CM_LTE_MODE_UM:
1359          {
1360             kwDlUmmReEstablish(gCb,rlcId,sndReEstInd,rbCb);
1361             break;
1362          }
1363
1364       case CM_LTE_MODE_AM:
1365          {           
1366             kwAmmDlReEstablish(gCb, rlcId, rbCb);
1367             break;
1368          }
1369    }
1370
1371    /* Fill entCfm structure */
1372    KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType,
1373       CKW_CFG_CFM_OK, CKW_CFG_REAS_NONE);
1374
1375    RETVALUE(ROK);
1376
1377
1378 \f
1379 /** 
1380  * @brief This primitive deletes the RBs in Ue Cb.
1381  *
1382  * @details
1383  *    - If UE ID is 0 then
1384  *      - Status Indication with Reason
1385  *    - Else,
1386  *      - Check for UE CB is present
1387  *      - If yes, Delete all RB CB in UE CB and Delete UE CB also.
1388  *      - Else, Status Indication with Reason
1389  *    - Fill entity confirmation
1390  *
1391  * @param [in]    gCb      -  RLC Instance Control Block
1392  * @param [in]    ueId     -  UE Identifier
1393  * @param [in]    cellId   -  CELL Identifier
1394  * @param [in]    entCfg   -  Entity Configuration to be done.
1395  * @param [out]   entCfm   -  Entity Confirmation
1396  *
1397  * @return  S16
1398  *    -#ROK
1399  *    -#RFAILED
1400  */
1401 #ifdef ANSI
1402 PUBLIC S16 kwCfgDelDlUe
1403 (
1404 KwCb               *gCb,
1405 CmLteRnti          ueId,
1406 CmLteCellId        cellId,
1407 CkwEntCfgInfo      *entCfg,
1408 CkwEntCfgCfmInfo   *entCfm
1409 )
1410 #else
1411 PUBLIC S16 kwCfgDelDlUe(ueId, cellId, entCfg, entCfm)
1412 KwCb               *gCb;
1413 CmLteRnti          ueId;
1414 CmLteCellId        cellId;
1415 CkwEntCfgInfo      *entCfg;
1416 CkwEntCfgCfmInfo   *entCfm;
1417 #endif
1418 {
1419    S16        ret;     /* Return Value */
1420    KwDlUeCb   *ueCb;   /* UE Control Block */
1421
1422    TRC3(kwCfgDelUe)
1423
1424    RLOG_ARG3(L_DEBUG,DBG_RBID,entCfg->rbId,
1425              "kwCfgDelUe(ueId(%d), cellId(%d), cfgType(%d))",
1426             ueId, 
1427             cellId, 
1428             entCfg->cfgType);
1429
1430    ret = ROK;
1431
1432    /* Check for ueId is present or not */
1433    if ( ueId == 0 )
1434    {
1435       /* Fill entCfm structure */
1436       KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType,
1437           CKW_CFG_CFM_NOK, CKW_CFG_REAS_UE_UNKWN);
1438       RLOG_ARG2(L_ERROR,DBG_RBID,entCfg->rbId,
1439                "ueId(%d), cellId(%d)",
1440                ueId, 
1441                cellId);
1442       RETVALUE(RFAILED);
1443    }
1444
1445    /* Fetch Ue Cb */
1446    ret = kwDbmFetchDlUeCb(gCb,ueId, cellId, &ueCb);
1447    if (ret != ROK)
1448    {
1449       /* Fill entCfm structure */
1450       KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType,
1451          CKW_CFG_CFM_NOK, CKW_CFG_REAS_UE_UNKWN);
1452       RLOG_ARG2(L_ERROR,DBG_CELLID, cellId,
1453                "UEID:%d UeCb not found RBID:%d",
1454                ueId,
1455                entCfg->rbId);
1456       RETVALUE(RFAILED);
1457    }
1458
1459 #ifdef LTE_L2_MEAS
1460    kwDelFrmDlL2Meas(gCb,cellId,ueId);
1461    kwDbmDelAllDlL2MeasTbFrmUe(gCb,ueCb);
1462 #endif
1463    /* Delete Ue Cb */
1464    kwDbmDelDlUeCb(gCb,ueCb, FALSE);
1465
1466    /* Fill entCfm structure */
1467    KW_CFG_FILL_CFG_CFM(entCfm, entCfg->rbId, entCfg->rbType,
1468       CKW_CFG_CFM_OK, CKW_CFG_REAS_NONE);
1469
1470    RETVALUE(ROK);
1471
1472
1473
1474 /**
1475  * @brief This primitive deletes the RBs in Ue Cb.
1476  *
1477  * @details
1478  *    - If CELL ID is 0 then
1479  *      - Status Indication with Reason
1480  *    - Else,
1481  *      - Check for CELL CB is present
1482  *      - If yes, Delete all RB CB in CELL CB and Delete CELL CB also.
1483  *      - Else, Status Indication with Reason
1484  *    - Fill entity confirmation
1485  *
1486  * @param [in]    cellId   -  CELL Identifier
1487  * @param [in]    entCfg   -  Entity Configuration to be done.
1488  * @param [out]   entCfm   -  Entity Confirmation
1489  *
1490  * @return S16
1491  *    -#ROK
1492  *    -#RFAILED
1493  */
1494 #ifdef ANSI
1495 PUBLIC S16 kwCfgDelDlCell
1496 (
1497 KwCb               *gCb,
1498 CmLteCellId        cellId,
1499 CkwEntCfgInfo      *entCfg,
1500 CkwEntCfgCfmInfo   *entCfm
1501 )
1502 #else
1503 PUBLIC S16 kwCfgDelCell(gCb,cellId, entCfg, entCfm)
1504 KwCb               *gCb;
1505 CmLteCellId        cellId;
1506 CkwEntCfgInfo      *entCfg;
1507 CkwEntCfgCfmInfo   *entCfm;
1508 #endif
1509 {
1510    KwDlCellCb   *cellCb;   /* UE Control Block */
1511    U8           rbId;      /* RB Identifier */
1512
1513    TRC3(kwCfgDelCell)
1514
1515    RLOG_ARG2(L_DEBUG,DBG_RBID,entCfg->rbId,
1516          "kwCfgDelCell( cellId(%d), cfgType(%d)",
1517          cellId, 
1518          entCfg->cfgType);
1519
1520    cellCb = NULLP;
1521    rbId = entCfg->rbId;
1522
1523    /* Check for ueId is present or not */
1524    if ( cellId == 0 )
1525    {
1526       /* Fill entCfm structure */
1527       KW_CFG_FILL_CFG_CFM(entCfm, rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
1528             CKW_CFG_REAS_CELL_UNKWN);
1529       RLOG_ARG1(L_DEBUG,DBG_RBID,entCfg->rbId,
1530                "cellId is 0 (%d) ",
1531                cellId);
1532       RETVALUE(RFAILED);
1533    }
1534
1535    /* Fetch Ue Cb */
1536    kwDbmFetchDlCellCb(gCb,cellId, &cellCb);
1537    if (!cellCb)
1538    {
1539       /* Fill entCfm structure */
1540       KW_CFG_FILL_CFG_CFM(entCfm, rbId, entCfg->rbType, CKW_CFG_CFM_NOK,
1541             CKW_CFG_REAS_CELL_UNKWN);
1542       RLOG_ARG1(L_ERROR, DBG_CELLID,cellId,
1543                "CellCb not found for RBID:%d",
1544                entCfg->rbId);
1545       RETVALUE(RFAILED);
1546    }
1547
1548    /* Delete Ue Cb */
1549    kwDbmDelDlCellCb(gCb,cellCb);
1550
1551    /* Fill entCfm structure */
1552   /* kw005.201 added support for L2 Measurement */         
1553    KW_CFG_FILL_CFG_CFM(entCfm, rbId, entCfg->rbType, CKW_CFG_CFM_OK,
1554                        CKW_CFG_REAS_NONE);
1555
1556    RETVALUE(ROK);
1557
1558
1559 /**
1560  * @brief This primitive changes the ueId of Ue Cb.
1561  *
1562  * @details
1563  *    - If oldUeId and newUeId are
1564  *      - Confirm the Status with Reason
1565  *    - If UeId not present
1566  *      - Confirm the Status with Reason
1567  *    - Create New UeCb
1568  *    - Copy rbCbs from old UeCb to new UeCb
1569  *    - Delete old UeCb
1570  *    - Fill entity confirmation
1571  *
1572  * @param [in]    ueInfo      -  Old UE Information
1573  * @param [in]    newUeInfo   -  New UE Information
1574  * @param [out]   status      -  Status
1575  *
1576  * @return  S16
1577  *    -# ROK
1578  *    -# RFAILED
1579  */
1580 #ifdef ANSI
1581 PUBLIC S16 kwCfgDlUeIdChng
1582 (
1583 KwCb        *gCb,
1584 CkwUeInfo   *ueInfo,
1585 CkwUeInfo   *newUeInfo,
1586 CmStatus    *status
1587 )
1588 #else
1589 PUBLIC S16 kwCfgDlUeIdChng(gCb,ueInfo,newUeInfo,status)
1590 KwCb        *gCb;
1591 CkwUeInfo   *ueInfo;
1592 CkwUeInfo   *newUeInfo;
1593 CmStatus    *status;
1594 #endif
1595 {
1596    KwDlUeCb *ueCb;
1597 /*kw004.201 Adding of Missing Trace in LTE RLC PDCP*/
1598    TRC3(kwCfgUeIdChng)
1599
1600    if ( (ueInfo->ueId == newUeInfo->ueId) && 
1601         (ueInfo->cellId == newUeInfo->cellId))
1602    {
1603       status->reason = CKW_CFG_REAS_SAME_UEID;
1604       status->status = CKW_CFG_CFM_NOK; 
1605       RLOG_ARG2(L_ERROR,DBG_CELLID,ueInfo->cellId,
1606             "Old UeId[%d] same as new UeId[%d]",
1607             ueInfo->ueId,
1608             newUeInfo->ueId);
1609       RETVALUE(RFAILED);
1610    } 
1611    
1612    if(ROK == kwDbmFetchDlUeCb(gCb,newUeInfo->ueId, newUeInfo->cellId, &ueCb))
1613    {
1614       RLOG_ARG1(L_ERROR, DBG_CELLID, newUeInfo->cellId, 
1615             "NewUeId[%d]:ueCb already exists",
1616             newUeInfo->ueId);
1617       status->reason = CKW_CFG_REAS_UE_EXISTS;
1618       status->status = CKW_CFG_CFM_NOK;
1619       RETVALUE(RFAILED);
1620    }
1621   
1622    if(ROK != kwDbmFetchDlUeCb(gCb,ueInfo->ueId, ueInfo->cellId, &ueCb))
1623    {
1624
1625       RLOG_ARG1(L_ERROR,DBG_CELLID,ueInfo->cellId,
1626             "UeId [%d]: UeCb not found",
1627             ueInfo->ueId);
1628       status->reason = CKW_CFG_REAS_UE_UNKWN;
1629       status->status = CKW_CFG_CFM_NOK;
1630       RETVALUE(RFAILED);
1631    }
1632   
1633 #ifdef LTE_L2_MEAS
1634    kwHdlMeasDlUeIdChg(gCb, ueInfo->cellId, ueInfo->ueId, newUeInfo->ueId);
1635 #endif   
1636    if(ROK != cmHashListDelete(&(gCb->u.dlCb->ueLstCp), (PTR) ueCb))
1637    {
1638       RLOG_ARG1(L_ERROR,DBG_CELLID,ueInfo->cellId,
1639             "UeId[%u] HashList Deletion Failed",
1640             ueInfo->ueId);
1641       status->reason = CKW_CFG_REAS_UE_CREAT_FAIL;
1642       status->status = CKW_CFG_CFM_NOK;
1643       RETVALUE(RFAILED);
1644    }
1645    
1646    /* update the hash key with new values */ 
1647    ueCb->ueId = newUeInfo->ueId;
1648    ueCb->cellId = newUeInfo->cellId;
1649
1650    if(ROK != cmHashListInsert(&(gCb->u.dlCb->ueLstCp), 
1651                               (PTR)ueCb, (U8 *)&(ueCb->ueId),
1652                               (U16) sizeof(CmLteRnti)))
1653
1654    {
1655       RLOG_ARG1(L_ERROR,DBG_CELLID,newUeInfo->cellId,
1656             "UeId[%u] HashList Insertion Failed",
1657             newUeInfo->ueId);
1658       status->reason = CKW_CFG_REAS_UE_CREAT_FAIL;
1659       status->status = CKW_CFG_CFM_NOK;
1660       RETVALUE(RFAILED);
1661    }  
1662   
1663    RETVALUE(ROK);
1664
1665
1666 /********************************************************************30**
1667
1668          End of file
1669 **********************************************************************/