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 *******************************************************************************/
23 /* header include files -- defines (.h) */
24 #include "envopt.h" /* environment options */
25 #include "envdep.h" /* environment dependent */
26 #include "envind.h" /* environment independent */
27 #include "gen.h" /* general layer */
28 #include "ssi.h" /* system service interface */
29 #include "cm_hash.h" /* common hash list */
30 #include "cm_mblk.h" /* common memory link list library */
31 #include "cm_llist.h" /* common linked list library */
32 #include "cm_err.h" /* common error */
33 #include "cm_lte.h" /* common LTE */
34 #include "lrg.h" /* Layer manager interface includes*/
35 #include "crg.h" /* CRG interface includes*/
36 #include "rgu.h" /* RGU interface includes*/
37 #include "tfu.h" /* TFU interface includes */
38 #include "rg_sch_inf.h" /* SCH interface includes */
39 #include "rg_prg.h" /* PRG (MAC-MAC) interface includes*/
40 #include "rg_env.h" /* MAC environmental includes*/
41 #include "rg.h" /* MAC includes*/
42 #include "rg_err.h" /* MAC error includes*/
45 /* header/extern include files (.x) */
46 #include "gen.x" /* general layer typedefs */
47 #include "ssi.x" /* system services typedefs */
48 #include "cm5.x" /* common timers */
49 #include "cm_hash.x" /* common hash list */
50 #include "cm_lib.x" /* common library */
51 #include "cm_llist.x" /* common linked list */
52 #include "cm_mblk.x" /* memory management */
53 #include "cm_tkns.x" /* common tokens */
54 #include "cm_lte.x" /* common tokens */
55 #include "rgu.x" /* RGU types */
56 #include "tfu.x" /* RGU types */
57 #include "lrg.x" /* layer management typedefs for MAC */
58 #include "crg.x" /* CRG interface includes */
59 #include "rg_sch_inf.x" /* SCH interface typedefs */
60 #include "rg_prg.x" /* PRG (MAC-MAC) Interface typedefs */
61 #include "du_app_mac_inf.h"
63 #include "rg.x" /* typedefs for MAC */
65 /*******************************************************************
67 * @brief pack the bits
71 * Function : packBytes
74 * pack the bits in the corresponding byte
76 * @params[in] buffer pointer, byte and bit position, value and its size
79 * ****************************************************************/
80 void packBytes(uint8_t *buf, uint8_t *bytePos, uint8_t *bitPos, uint32_t val, uint8_t valSize)
85 uint8_t bytePart1Size;
86 uint32_t bytePart2Size;
88 if(*bitPos - valSize + 1 >= 0)
90 bytePart1 = (uint8_t)val;
91 bytePart1 = (bytePart1 << (*bitPos -valSize +1));
92 buf[*bytePos] |= bytePart1;
93 if(*bitPos - valSize < 0)
104 bytePart1Size = *bitPos +1;
105 bytePart2Size = valSize - bytePart1Size;
107 bytePart1 = (val >> bytePart2Size) << (*bitPos -bytePart1Size +1);
108 bytePart2 = (~((~temp) << bytePart2Size)) & val;
110 buf[*bytePos] |= bytePart1;
113 packBytes(buf, bytePos, bitPos, bytePart2, bytePart2Size);
117 /*******************************************************************
119 * @brief fill the RAR PDU
123 * Function : fillRarPdu
126 * The RAR PDU will be MUXed and formed
128 * @params[in] RAR info
131 * ****************************************************************/
132 void fillRarPdu(RarInfo *rarInfo)
134 uint8_t *rarPdu = rarInfo->rarPdu;
135 uint16_t totalBits = 0;
136 uint8_t numBytes = 0;
140 /* RAR subheader fields */
145 /* RAR payload fields */
147 uint16_t timeAdv = 0;
148 uint32_t ulGrant = 0;
149 uint16_t tmpCrnti = 0;
150 uint8_t paddingLcid = 63;
152 /* Size(in bits) of RAR subheader files */
153 uint8_t EBitSize = 1;
154 uint8_t TBitSize = 1;
155 uint8_t rapidSize = 6;
156 uint8_t paddingLcidSize = 6;
157 uint8_t paddingSize = 8;
160 /* Size(in bits) of RAR payload fields */
161 uint8_t RBitSize = 1;
162 uint8_t timeAdvSize = 12;
163 uint8_t ulGrantSize = 27;
164 uint8_t tmpCrntiSize = 16;
166 /* Fill RAR pdu fields */
169 rapId = rarInfo->RAPID;
172 timeAdv = rarInfo->ta;
173 ulGrant = 0; /* this will be done when implementing msg3 */
174 tmpCrnti = rarInfo->tcrnti;
176 /* Calulating total number of bytes in buffer */
177 totalBits = EBitSize + TBitSize + rapidSize + RBitSize + timeAdvSize \
178 + ulGrantSize + tmpCrntiSize;
180 /* add padding size */
181 totalBits += RBitSize*2 + paddingLcidSize + paddingSize;
183 /* Calulating total number of bytes in buffer */
184 numBytes = totalBits/8;
188 rarInfo->rarPduLen = numBytes;
190 /* Initialize buffer */
191 for(bytePos = 0; bytePos < numBytes; bytePos++)
197 /* Packing fields into RAR PDU */
198 packBytes(rarPdu, &bytePos, &bitPos, EBit, EBitSize);
199 packBytes(rarPdu, &bytePos, &bitPos, TBit, TBitSize);
200 packBytes(rarPdu, &bytePos, &bitPos, rapId, rapidSize);
201 packBytes(rarPdu, &bytePos, &bitPos, RBit, RBitSize);
202 packBytes(rarPdu, &bytePos, &bitPos, timeAdv, timeAdvSize);
203 packBytes(rarPdu, &bytePos, &bitPos, ulGrant, ulGrantSize);
204 packBytes(rarPdu, &bytePos, &bitPos, tmpCrnti, tmpCrntiSize);
206 /* padding of 2 bytes */
207 packBytes(rarPdu, &bytePos, &bitPos, RBit, RBitSize*2);
208 packBytes(rarPdu, &bytePos, &bitPos, paddingLcid, paddingLcidSize);
209 packBytes(rarPdu, &bytePos, &bitPos, 0, paddingSize);
213 /*******************************************************************
215 * @brief Database required to form MAC PDU
219 * Function : createMacRaCb
222 * stores the required params for muxing
224 * @params[in] Pointer to cellId,
228 * ****************************************************************/
229 void createMacRaCb(uint16_t cellId, uint16_t crnti)
231 uint8_t idx = 0; /* supporting 1 UE */
232 macCb.macCell->macRaCb[idx].cellId = cellId;
233 macCb.macCell->macRaCb[idx].crnti = crnti;
236 /*************************************************
237 * @brief fill RLC DL Data
241 * Function : fillMsg4DlData
242 * This function is a stub which sends Dl Data
245 * @param[in] MacDlData *dlData
246 ************************************************/
248 void fillMsg4DlData(MacDlData *dlData)
252 dlData->pduInfo[idx].lcId = MAC_LCID_CCCH;
253 dlData->pduInfo[idx].pduLen = macCb.macCell->macRaCb[0].msg4PduLen;
254 memcpy(dlData->pduInfo[idx].dlPdu, macCb.macCell->macRaCb[0].msg4Pdu,\
255 macCb.macCell->macRaCb[0].msg4PduLen);
258 /*************************************************
259 * @brief fill Mac Ce Info
263 * Function : fillMacCe
264 * This function fills Mac ce identities
266 * @param[in] RlcMacData *dlData
267 ************************************************/
269 void fillMacCe(MacCeInfo *macCeInfo)
272 macCeInfo->numCes = 1;
273 for(idx = 0; idx < macCeInfo->numCes; idx++)
275 macCeInfo->macCe[idx].macCeLcid = MAC_LCID_CRI;
276 memcpy(&macCeInfo->macCe[idx].macCeValue, \
277 &macCb.macCell->macRaCb[idx].msg3Pdu, MAX_CRI_SIZE);
281 /*******************************************************************
283 * @brief Forms MAC PDU
287 * Function : buildMacPdu
290 * The MAC PDU will be MUXed and formed
292 * @params[in] MacDlData *, MacCeInfo *, tbSize
295 * ****************************************************************/
297 void macMuxPdu(MacDlData *dlData, MacCeInfo *macCeData, uint16_t tbSize)
302 uint8_t macPdu[tbSize];
303 memset(macPdu, 0, (tbSize * sizeof(uint8_t)));
305 /* subheader fields */
306 uint8_t RBit = 0; /* Reserved bit */
307 uint8_t FBit; /* Format Indicator */
308 uint8_t lcid; /* LCID */
309 uint8_t lenField = 0; /* Length field */
311 /* subheader field size (in bits) */
312 uint8_t RBitSize = 1;
313 uint8_t FBitSize = 1;
314 uint8_t lcidSize = 6;
315 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 **********************************************************************/