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 *******************************************************************************/
22 /* header include files -- defines (.h) */
23 #include "envopt.h" /* environment options */
24 #include "envdep.h" /* environment dependent */
25 #include "envind.h" /* environment independent */
26 #include "gen.h" /* general layer */
27 #include "ssi.h" /* system service interface */
28 #include "cm_hash.h" /* common hash list */
29 #include "cm_mblk.h" /* common memory link list library */
30 #include "cm_llist.h" /* common linked list library */
31 #include "cm_err.h" /* common error */
32 #include "cm_lte.h" /* common LTE */
33 #include "lrg.h" /* Layer manager interface includes*/
34 #include "crg.h" /* CRG interface includes*/
35 #include "rgu.h" /* RGU interface includes*/
36 #include "tfu.h" /* TFU interface includes */
37 #include "rg_sch_inf.h" /* SCH interface includes */
38 #include "rg_prg.h" /* PRG (MAC-MAC) interface includes*/
39 #include "rg_env.h" /* MAC environmental includes*/
40 #include "rg.h" /* MAC includes*/
41 #include "rg_err.h" /* MAC error includes*/
44 /* header/extern include files (.x) */
45 #include "gen.x" /* general layer typedefs */
46 #include "ssi.x" /* system services typedefs */
47 #include "cm5.x" /* common timers */
48 #include "cm_hash.x" /* common hash list */
49 #include "cm_lib.x" /* common library */
50 #include "cm_llist.x" /* common linked list */
51 #include "cm_mblk.x" /* memory management */
52 #include "cm_tkns.x" /* common tokens */
53 #include "cm_lte.x" /* common tokens */
54 #include "rgu.x" /* RGU types */
55 #include "tfu.x" /* RGU types */
56 #include "lrg.x" /* layer management typedefs for MAC */
57 #include "crg.x" /* CRG interface includes */
58 #include "rg_sch_inf.x" /* SCH interface typedefs */
59 #include "rg_prg.x" /* PRG (MAC-MAC) Interface typedefs */
60 #include "du_app_mac_inf.h"
62 #include "rg.x" /* typedefs for MAC */
64 /*******************************************************************
66 * @brief pack the bits
70 * Function : packBytes
73 * pack the bits in the corresponding byte
75 * @params[in] buffer pointer, byte and bit position, value and its size
78 * ****************************************************************/
79 void packBytes(uint8_t *buf, uint8_t *bytePos, uint8_t *bitPos, uint32_t val, uint8_t valSize)
84 uint8_t bytePart1Size;
85 uint32_t bytePart2Size;
87 if(*bitPos - valSize + 1 >= 0)
89 bytePart1 = (uint8_t)val;
90 bytePart1 = (bytePart1 << (*bitPos -valSize +1));
91 buf[*bytePos] |= bytePart1;
92 if(*bitPos - valSize < 0)
103 bytePart1Size = *bitPos +1;
104 bytePart2Size = valSize - bytePart1Size;
106 bytePart1 = (val >> bytePart2Size) << (*bitPos -bytePart1Size +1);
107 bytePart2 = (~((~temp) << bytePart2Size)) & val;
109 buf[*bytePos] |= bytePart1;
112 packBytes(buf, bytePos, bitPos, bytePart2, bytePart2Size);
116 /*******************************************************************
118 * @brief fill the RAR PDU
122 * Function : fillRarPdu
125 * The RAR PDU will be MUXed and formed
127 * @params[in] RAR info
130 * ****************************************************************/
131 void fillRarPdu(RarInfo *rarInfo)
133 uint8_t *rarPdu = rarInfo->rarPdu;
134 uint16_t totalBits = 0;
135 uint8_t numBytes = 0;
139 /* RAR subheader fields */
144 /* RAR payload fields */
146 uint16_t timeAdv = 0;
147 uint32_t ulGrant = 0;
148 uint16_t tmpCrnti = 0;
149 uint8_t paddingLcid = 63;
151 /* Size(in bits) of RAR subheader files */
152 uint8_t EBitSize = 1;
153 uint8_t TBitSize = 1;
154 uint8_t rapidSize = 6;
155 uint8_t paddingLcidSize = 6;
156 uint8_t paddingSize = 8;
159 /* Size(in bits) of RAR payload fields */
160 uint8_t RBitSize = 1;
161 uint8_t timeAdvSize = 12;
162 uint8_t ulGrantSize = 27;
163 uint8_t tmpCrntiSize = 16;
165 /* Fill RAR pdu fields */
168 rapId = rarInfo->RAPID;
171 timeAdv = rarInfo->ta;
172 ulGrant = 0; /* this will be done when implementing msg3 */
173 tmpCrnti = rarInfo->tcrnti;
175 /* Calulating total number of bytes in buffer */
176 totalBits = EBitSize + TBitSize + rapidSize + RBitSize + timeAdvSize \
177 + ulGrantSize + tmpCrntiSize;
179 /* add padding size */
180 totalBits += RBitSize*2 + paddingLcidSize + paddingSize;
182 /* Calulating total number of bytes in buffer */
183 numBytes = totalBits/8;
187 rarInfo->rarPduLen = numBytes;
189 /* Initialize buffer */
190 for(bytePos = 0; bytePos < numBytes; bytePos++)
196 /* Packing fields into RAR PDU */
197 packBytes(rarPdu, &bytePos, &bitPos, EBit, EBitSize);
198 packBytes(rarPdu, &bytePos, &bitPos, TBit, TBitSize);
199 packBytes(rarPdu, &bytePos, &bitPos, rapId, rapidSize);
200 packBytes(rarPdu, &bytePos, &bitPos, RBit, RBitSize);
201 packBytes(rarPdu, &bytePos, &bitPos, timeAdv, timeAdvSize);
202 packBytes(rarPdu, &bytePos, &bitPos, ulGrant, ulGrantSize);
203 packBytes(rarPdu, &bytePos, &bitPos, tmpCrnti, tmpCrntiSize);
205 /* padding of 2 bytes */
206 packBytes(rarPdu, &bytePos, &bitPos, RBit, RBitSize*2);
207 packBytes(rarPdu, &bytePos, &bitPos, paddingLcid, paddingLcidSize);
208 packBytes(rarPdu, &bytePos, &bitPos, 0, paddingSize);
212 /*******************************************************************
214 * @brief Database required to form MAC PDU
218 * Function : createMacRaCb
221 * stores the required params for muxing
223 * @params[in] Pointer to cellId,
227 * ****************************************************************/
228 void createMacRaCb(uint16_t cellId, uint16_t crnti)
230 uint8_t idx = 0; /* supporting 1 UE */
231 macCb.macCell->macRaCb[idx].cellId = cellId;
232 macCb.macCell->macRaCb[idx].crnti = crnti;
235 /*************************************************
236 * @brief fill RLC DL Data
240 * Function : fillMsg4DlData
241 * This function is a stub which sends Dl Data
244 * @param[in] MacDlData *dlData
245 ************************************************/
247 void fillMsg4DlData(MacDlData *dlData)
251 dlData->pduInfo[idx].lcId = MAC_LCID_CCCH;
252 dlData->pduInfo[idx].pduLen = macCb.macCell->macRaCb[0].msg4PduLen;
253 memcpy(dlData->pduInfo[idx].dlPdu, macCb.macCell->macRaCb[0].msg4Pdu,\
254 macCb.macCell->macRaCb[0].msg4PduLen);
257 /*************************************************
258 * @brief fill Mac Ce Info
262 * Function : fillMacCe
263 * This function fills Mac ce identities
265 * @param[in] RlcMacData *dlData
266 ************************************************/
268 void fillMacCe(MacCeInfo *macCeInfo)
271 macCeInfo->numCes = 1;
272 for(idx = 0; idx < macCeInfo->numCes; idx++)
274 macCeInfo->macCe[idx].macCeLcid = MAC_LCID_CRI;
275 memcpy(&macCeInfo->macCe[idx].macCeValue, \
276 &macCb.macCell->macRaCb[idx].msg3Pdu, MAX_CRI_SIZE);
280 /*******************************************************************
282 * @brief Forms MAC PDU
286 * Function : buildMacPdu
289 * The MAC PDU will be MUXed and formed
291 * @params[in] MacDlData *, MacCeInfo *, tbSize
294 * ****************************************************************/
296 void macMuxPdu(MacDlData *dlData, MacCeInfo *macCeData, uint16_t tbSize)
301 uint8_t macPdu[tbSize];
302 memset(macPdu, 0, (tbSize * sizeof(uint8_t)));
304 /* subheader fields */
305 uint8_t RBit = 0; /* Reserved bit */
306 uint8_t FBit; /* Format Indicator */
307 uint8_t lcid; /* LCID */
308 uint8_t lenField = 0; /* Length field */
310 /* subheader field size (in bits) */
311 uint8_t RBitSize = 1;
312 uint8_t FBitSize = 1;
313 uint8_t lcidSize = 6;
314 uint8_t lenFieldSize = 0; /* 8-bit or 16-bit L field */
317 /* PACK ALL MAC CE */
318 for(idx = 0; idx < macCeData->numCes; idx++)
320 lcid = macCeData->macCe[idx].macCeLcid;
325 /* Packing fields into MAC PDU R/R/LCID */
326 packBytes(macPdu, &bytePos, &bitPos, RBit, RBitSize);
327 packBytes(macPdu, &bytePos, &bitPos, RBit, RBitSize);
328 packBytes(macPdu, &bytePos, &bitPos, lcid, lcidSize);
329 memcpy(&macPdu[bytePos], macCeData->macCe[idx].macCeValue,\
334 DU_LOG("\n MAC: Invalid LCID %d in mac pdu",lcid);
339 /* PACK ALL MAC SDUs */
340 for(idx = 0; idx < dlData->numPdu; idx++)
342 lcid = dlData->pduInfo[idx].lcId;
343 lenField = dlData->pduInfo[idx].pduLen;
348 if(dlData->pduInfo[idx].pduLen > 255)
359 /* Packing fields into MAC PDU R/F/LCID/L */
360 packBytes(macPdu, &bytePos, &bitPos, RBit, RBitSize);
361 packBytes(macPdu, &bytePos, &bitPos, FBit, FBitSize);
362 packBytes(macPdu, &bytePos, &bitPos, lcid, lcidSize);
363 packBytes(macPdu, &bytePos, &bitPos, lenField, lenFieldSize);
364 memcpy(&macPdu[bytePos], dlData->pduInfo[idx].dlPdu, lenField);
369 DU_LOG("\n MAC: Invalid LCID %d in mac pdu",lcid);
374 if(bytePos < tbSize && (tbSize-bytePos >= 1))
376 /* padding remaining bytes */
378 lcid = MAC_LCID_PADDING;
379 packBytes(macPdu, &bytePos, &bitPos, RBit, RBitSize);
380 packBytes(macPdu, &bytePos, &bitPos, lcid, lcidSize);
383 MAC_ALLOC(macCb.macCell->macRaCb[0].msg4TxPdu, macCb.macCell->macRaCb[0].msg4TbSize);
384 if(macCb.macCell->macRaCb[0].msg4TxPdu != NULLP)
386 memcpy(macCb.macCell->macRaCb[0].msg4TxPdu, macPdu,\
387 macCb.macCell->macRaCb[0].msg4TbSize);
391 /**********************************************************************
393 **********************************************************************/