RLC UeCb Changes
[o-du/l2.git] / src / 5gnrrlc / rlc_msg_hdl.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 /* header include files (.h) */
20 #include "common_def.h"
21 #include "rgu.h"           /* RGU interface includes*/
22 #include "lkw.h"           /* LKW defines */
23 #include "ckw.h"           /* CKW defines */
24 #include "kwu.h"           /* KWU defines */
25 #include "kw_env.h"        /* RLC environment options */
26 #include "kw.h"            /* RLC defines */
27
28
29 /* header/extern include files (.x) */
30 #include "rgu.x"           
31 #include "lkw.x"           /* LKW */
32 #include "ckw.x"           /* CKW */
33 #include "kwu.x"           /* KWU */
34 #include "kw_err.h"
35 #include "kw.x"
36
37 #include "du_app_rlc_inf.h"
38 #include "rlc.h"
39
40 extern U16 getTransId();
41
42 /*******************************************************************
43  *
44  * @brief Fills RLC UL UE Cfg Rsp from RlcCRsp 
45  *
46  * @details
47  *
48  *    Function : fillRlcUlUeCfgRsp
49  *
50  *    Functionality: 
51  *     Fills RLC UL UE Cfg Rsp from RlcCRsp
52  * 
53  *  @params[in]  Pointer to RlcCfgCfm
54  *               Pointer to RlcUeCfgRsp
55  *
56  *  @return void
57  * 
58  *****************************************************************/
59
60 void fillRlcUlUeCfgRsp(RlcUeCfgRsp *rlcCfgRsp, RlcCfgCfmInfo *rlcCRsp)
61 {
62    uint8_t idx;
63  
64    rlcCfgRsp->cellId = rlcCRsp->cellId;
65    rlcCfgRsp->ueIdx  = rlcCRsp->ueId;
66    for(idx = 0; idx < rlcCRsp->numEnt; idx++)
67    {
68       if(rlcCRsp->entCfgCfm[idx].status.status == CKW_CFG_CFM_OK)
69       {
70          rlcCfgRsp->result = RLC_DU_APP_RSP_OK;
71          rlcCfgRsp->reason = rlcCRsp->entCfgCfm[idx].status.reason;
72       }
73       else
74       {
75          rlcCfgRsp->result = RLC_DU_APP_RSP_NOK;
76          rlcCfgRsp->reason = rlcCRsp->entCfgCfm[idx].status.reason;
77       }
78    }
79 }
80
81 /*******************************************************************
82  *
83  * @brief Fills the entity mode and direction compiling to seed code
84  *
85  * @details
86  *
87  *    Function : fillEntModeAndDir
88  *
89  *    Functionality:
90  *      Fills the entity mode and direction compiling to seed code
91  *
92  * @params[in] Pointer to entMode
93  *             Pointer to direction
94  *             RlcMode Param 
95  * @return void
96  * ****************************************************************/
97
98 void fillEntModeAndDir(uint8_t *entMode, uint8_t *direction, RlcMode rlcMode)
99 {
100    switch(rlcMode)
101    {
102       case RLC_AM:
103          *entMode   = CM_LTE_MODE_AM;
104          *direction = RLC_CFG_DIR_BOTH;
105          break;
106       case RLC_UM_BI_DIRECTIONAL:
107          *entMode = CM_LTE_MODE_UM;
108          *direction = RLC_CFG_DIR_BOTH;
109          break;
110       case RLC_UM_UNI_DIRECTIONAL_UL:
111          *entMode = CM_LTE_MODE_UM;
112          *direction = RLC_CFG_DIR_UL;
113          break;
114       case RLC_UM_UNI_DIRECTIONAL_DL:
115          *entMode = CM_LTE_MODE_UM;
116          *direction = RLC_CFG_DIR_DL;
117          break;
118       default : 
119          DU_LOG("\nRLC: Rlc Mode invalid %d", rlcMode);
120     break;
121    }
122 }
123 /*******************************************************************
124  *
125  * @brief Handles Ue Create Request from DU APP
126  *
127  * @details
128  *
129  *    Function : RlcUlProcUeCreateReq
130  *
131  *    Functionality:
132  *      Handles Ue create Request from DU APP
133  *
134  * @params[in] Post structure pointer
135  *             RlcUeCfg pointer 
136  * @return ROK     - success
137  *         RFAILED - failure
138  *
139  * ****************************************************************/
140 uint8_t RlcUlProcUeCreateReq(Pst *pst, RlcUeCfg *ueCfg)
141 {
142    uint8_t idx;
143    uint8_t ret = ROK;
144    uint8_t lChRbIdx;
145    RlcCfgInfo *rlcUeCfg = NULLP;
146
147    RlcCb *rlcUeCb = NULLP;
148    rlcUeCb = RLC_GET_RLCCB(pst->dstInst);
149    RLC_ALLOC(rlcUeCb, rlcUeCfg, sizeof(RlcCfgInfo));
150    if(rlcUeCfg)
151    {
152       memset(rlcUeCfg, 0, sizeof(RlcCfgInfo));
153
154       rlcUeCfg->ueId    = ueCfg->ueIdx;
155       rlcUeCfg->cellId  = ueCfg->cellId;
156       rlcUeCfg->numEnt  = ueCfg->numLcs;
157       rlcUeCfg->transId = getTransId();
158  
159       for(idx = 0; idx < ueCfg->numLcs; idx++)
160       {
161          lChRbIdx = 0;
162          rlcUeCfg->entCfg[idx].rbId           = ueCfg->rlcBearerCfg[idx].rbId;
163          rlcUeCfg->entCfg[idx].rbType         = ueCfg->rlcBearerCfg[idx].rbType;   // SRB or DRB
164          rlcUeCfg->entCfg[idx].lCh[lChRbIdx].lChId   = ueCfg->rlcBearerCfg[idx].lcId;   
165          rlcUeCfg->entCfg[idx].lCh[lChRbIdx].type    = ueCfg->rlcBearerCfg[idx].lcType;
166          fillEntModeAndDir(&rlcUeCfg->entCfg[idx].entMode, &rlcUeCfg->entCfg[idx].dir,\
167             ueCfg->rlcBearerCfg[idx].rlcMode);
168          rlcUeCfg->entCfg[idx].cfgType        = CKW_CFG_ADD;
169          switch(rlcUeCfg->entCfg[idx].entMode)
170          {
171
172             case CM_LTE_MODE_AM:
173             {
174                /* DL AM INFO */
175                rlcUeCfg->entCfg[idx].m.amInfo.dl.snLen = ueCfg->rlcBearerCfg[idx].u.amCfg.dlAmCfg.snLenDl; 
176                rlcUeCfg->entCfg[idx].m.amInfo.dl.pollRetxTmr = ueCfg->rlcBearerCfg[idx].u.amCfg.dlAmCfg.pollRetxTmr;
177                rlcUeCfg->entCfg[idx].m.amInfo.dl.pollPdu = ueCfg->rlcBearerCfg[idx].u.amCfg.dlAmCfg.pollPdu; 
178                rlcUeCfg->entCfg[idx].m.amInfo.dl.pollByte = ueCfg->rlcBearerCfg[idx].u.amCfg.dlAmCfg.pollByte; 
179                rlcUeCfg->entCfg[idx].m.amInfo.dl.maxRetx = ueCfg->rlcBearerCfg[idx].u.amCfg.dlAmCfg.maxRetxTh;
180
181                /* UL AM INFO */
182                lChRbIdx++;   //lChRbIdx = 1, indicates UL AM
183                rlcUeCfg->entCfg[idx].lCh[lChRbIdx].lChId   = ueCfg->rlcBearerCfg[idx].lcId;   
184                rlcUeCfg->entCfg[idx].lCh[lChRbIdx].type    = ueCfg->rlcBearerCfg[idx].lcType;
185                rlcUeCfg->entCfg[idx].m.amInfo.ul.snLen = ueCfg->rlcBearerCfg[idx].u.amCfg.ulAmCfg.snLenUl; 
186                rlcUeCfg->entCfg[idx].m.amInfo.ul.staProhTmr = ueCfg->rlcBearerCfg[idx].u.amCfg.ulAmCfg.statProhTmr;
187                rlcUeCfg->entCfg[idx].m.amInfo.ul.reOrdTmr = ueCfg->rlcBearerCfg[idx].u.amCfg.ulAmCfg.reAssemTmr;
188                break;
189             }
190             case CM_LTE_MODE_UM:
191             {
192                /* UL UM CONFIG */
193                rlcUeCfg->entCfg[idx].m.umInfo.ul.snLen = ueCfg->rlcBearerCfg[idx].u.umBiDirCfg.ulUmCfg.snLenUlUm; 
194                rlcUeCfg->entCfg[idx].m.umInfo.ul.reOrdTmr = ueCfg->rlcBearerCfg[idx].u.umBiDirCfg.ulUmCfg.reAssemTmr;
195
196                /* DL UM CONFIG */
197                rlcUeCfg->entCfg[idx].m.umInfo.dl.snLen = ueCfg->rlcBearerCfg[idx].u.umBiDirCfg.dlUmCfg.snLenDlUm; 
198                break;
199             }
200             default:
201                break;
202          }/* End of switch(entMode) */
203       }
204       ret = RlcProcCfgReq(pst, rlcUeCfg);
205       }
206       else
207       {
208          DU_LOG("\nRLC: Failed to allocate memory ");
209          ret = RFAILED;
210       }
211       RLC_FREE_SHRABL_BUF(pst->region, pst->pool, ueCfg, sizeof(RlcUeCfg));
212       return ret;
213 }
214 /**********************************************************************
215          End of file
216 **********************************************************************/