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 **********************************************************************/