85a10f1217b5e36a77399b5a5efc24bf4782300c
[o-du/l2.git] / src / phy_stub / l1_bdy1.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 /*This file contains stub for PHY to handle messages to/from MAC CL */
20
21 #include "common_def.h"
22 #include "lrg.h"
23 #include "lrg.x"
24 #include "du_app_mac_inf.h"
25 #include "mac_sch_interface.h"
26 #include "lwr_mac.h"
27 #include "lwr_mac_phy.h"
28 #ifdef INTEL_FAPI
29 #include "fapi.h"
30 #endif
31 #include "lphy_stub.h"
32 #include "lwr_mac_upr_inf.h"
33 #include "mac_utils.h"
34 #include "l1.h"
35
36 /*******************************************************************
37  *
38  * @brief Builds and sends param response to MAC CL
39  *
40  * @details
41  *
42  *    Function : l1BldAndSndParamRsp
43  *
44  *    Functionality:
45  *          - Builds and sends param response to MAC
46  *
47  * @params[in] Config request message pointer
48  * @return ROK     - success
49  *         RFAILED - failure
50  *
51  * ****************************************************************/
52 S16 l1BldAndSndParamRsp(void *msg)
53 {
54 #ifdef INTEL_FAPI
55    uint8_t index = 0;
56    uint32_t msgLen = 0;
57    fapi_param_resp_t *fapiParamRsp;
58
59    MAC_ALLOC(fapiParamRsp, sizeof(fapi_param_resp_t));
60    if(!fapiParamRsp)
61    {
62       DU_LOG("PHY STUB: Memory allocation failed");
63       return RFAILED;
64    }
65
66    /* Cell Params */
67    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_RELEASE_CAPABILITY_TAG,                         sizeof(uint16_t), 1, &msgLen);
68    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PHY_STATE_TAG,                                  sizeof(uint16_t), 0, &msgLen);
69    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SKIP_BLANK_DL_CONFIG_TAG,                       sizeof(uint8_t),  0, &msgLen);
70    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SKIP_BLANK_UL_CONFIG_TAG,                       sizeof(uint8_t),  0, &msgLen);
71    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_NUM_CONFIG_TLVS_TO_REPORT_TYPE_TAG,              sizeof(uint8_t),  0, &msgLen);
72
73    /* Carrier Params */
74    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_CYCLIC_PREFIX_TAG,                               sizeof(uint8_t),  1, &msgLen);
75    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SUPPORTED_SUBCARRIER_SPACING_DL_TAG,            sizeof(uint8_t),  1, &msgLen);
76    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SUPPORTED_BANDWIDTH_DL_TAG,                     sizeof(uint16_t), 1, &msgLen);
77    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SUPPORTED_SUBCARRIER_SPACING_UL_TAG,            sizeof(uint8_t),  0, &msgLen);
78    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SUPPORTED_BANDWIDTH_UL_TAG,                     sizeof(uint16_t), 0, &msgLen);
79
80    /* PDCCH Param*/
81    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_CCE_MAPPING_TYPE_TAG,                                   sizeof(uint8_t), 0, &msgLen);
82    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG,   sizeof(uint8_t), 0, &msgLen);
83    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PRECODER_GRANULARITY_CORESET_TAG,               sizeof(uint8_t), 0, &msgLen);
84    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDCCH_MU_MIMO_TAG,                              sizeof(uint8_t), 0, &msgLen);
85    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDCCH_PRECODER_CYCLING_TAG,                     sizeof(uint8_t), 0, &msgLen);
86    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_PDCCHS_PER_SLOT_TAG,                                sizeof(uint8_t), 0, &msgLen);
87
88    /* PUCCH Param */
89    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUCCH_FORMATS_TAG,                              sizeof(uint8_t), 0, &msgLen);
90    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_PUCCHS_PER_SLOT_TAG,                         sizeof(uint8_t), 0, &msgLen);
91
92    /* PDSCH Param */
93    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_MAPPING_TYPE_TAG,                         sizeof(uint8_t), 0, &msgLen);
94    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_ALLOCATION_TYPES_TAG,                      sizeof(uint8_t), 0, &msgLen);
95    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_VRB_TO_PRB_MAPPING_TAG,                   sizeof(uint8_t), 0, &msgLen);
96    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_CBG_TAG,                                  sizeof(uint8_t), 0, &msgLen);
97    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_DMRS_CONFIG_TYPES_TAG,                    sizeof(uint8_t), 0, &msgLen);
98    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_DMRS_MAX_LENGTH_TAG,                      sizeof(uint8_t), 0, &msgLen);
99    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_DMRS_ADDITIONAL_POS_TAG,                  sizeof(uint8_t), 0, &msgLen);
100    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_PDSCHS_TBS_PER_SLOT_TAG,                    sizeof(uint8_t), 0, &msgLen);
101    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG,               sizeof(uint8_t), 0, &msgLen);
102    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SUPPORTED_MAX_MODULATION_ORDER_DL_TAG,          sizeof(uint8_t), 0, &msgLen);
103    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_MU_MIMO_USERS_DL_TAG,                       sizeof(uint8_t), 0, &msgLen);
104    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG,                 sizeof(uint8_t), 0, &msgLen);
105    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PREMPTIONSUPPORT_TAG,                           sizeof(uint8_t), 0, &msgLen);
106    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_NON_SLOT_SUPPORT_TAG,                      sizeof(uint8_t), 0, &msgLen);
107
108    /* PUSCH Param */
109    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_UCI_MUX_ULSCH_IN_PUSCH_TAG,                     sizeof(uint8_t), 0, &msgLen);
110    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_UCI_ONLY_PUSCH_TAG,                             sizeof(uint8_t), 0, &msgLen);
111    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_FREQUENCY_HOPPING_TAG,                    sizeof(uint8_t), 0, &msgLen);
112    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_DMRS_CONFIG_TYPES_TAG,                    sizeof(uint8_t), 0, &msgLen);
113    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_DMRS_MAX_LEN_TAG,                         sizeof(uint8_t), 0, &msgLen);
114    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_DMRS_ADDITIONAL_POS_TAG,                  sizeof(uint8_t), 0, &msgLen);
115    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_CBG_TAG,                                  sizeof(uint8_t), 0, &msgLen);
116    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_MAPPING_TYPE_TAG,                          sizeof(uint8_t), 0, &msgLen);
117    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_ALLOCATION_TYPES_TAG,                     sizeof(uint8_t), 0, &msgLen);
118    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_VRB_TO_PRB_MAPPING_TAG,                   sizeof(uint8_t), 0, &msgLen);
119    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_MAX_PTRS_PORTS_TAG,                        sizeof(uint8_t), 0, &msgLen);
120    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_PDUSCHS_TBS_PER_SLOT_TAG,                   sizeof(uint8_t), 0, &msgLen);
121    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG,         sizeof(uint8_t), 0, &msgLen);
122    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SUPPORTED_MODULATION_ORDER_UL_TAG,               sizeof(uint8_t), 0, &msgLen);
123    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_MU_MIMO_USERS_UL_TAG,                        sizeof(uint8_t), 0, &msgLen);
124    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_DFTS_OFDM_SUPPORT_TAG,                           sizeof(uint8_t), 0, &msgLen);
125    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_AGGREGATION_FACTOR_TAG,                    sizeof(uint8_t), 0, &msgLen);
126
127    /* PRACH Params */
128    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PRACH_LONG_FORMATS_TAG,                         sizeof(uint8_t), 0, &msgLen);
129    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PRACH_SHORT_FORMATS_TAG,                         sizeof(uint8_t), 0, &msgLen);
130    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PRACH_RESTRICTED_SETS_TAG,                       sizeof(uint8_t), 0, &msgLen);
131    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG,            sizeof(uint8_t), 0, &msgLen);
132
133    /* MEASUREMENT TAG */
134    fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_RSSI_MEASUREMENT_SUPPORT_TAG,                    sizeof(uint8_t), 0, &msgLen);
135
136    fapiParamRsp->number_of_tlvs = index;
137    msgLen += sizeof(fapi_param_resp_t) - sizeof(fapi_msg_t);
138    fillMsgHeader(&fapiParamRsp->header, FAPI_PARAM_RESPONSE, msgLen);
139    fapiParamRsp->error_code = MSG_OK;
140
141    DU_LOG("\nPHY_STUB: Sending Param Request to Lower Mac");
142    procPhyMessages(fapiParamRsp->header.msg_id, sizeof(fapi_param_resp_t), (void *)fapiParamRsp);
143    MAC_FREE(fapiParamRsp, sizeof(fapi_param_resp_t));
144 #endif
145    return ROK;
146 }
147
148 /*******************************************************************
149  *
150  * @brief Builds and sends config response to lower mac
151  *
152  * @details
153  *
154  *    Function : l1BldAndSndConfigRsp
155  *
156  *    Functionality:
157  *          - Builds and sends config response to MAC
158  *
159  * @params[in] Config request message pointer
160  * @return ROK     - success
161  *         RFAILED - failure
162  *
163  * ****************************************************************/
164
165 S16 l1BldAndSndConfigRsp(void *msg)
166 {
167 #ifdef INTEL_FAPI
168    uint32_t msgLen = 0;
169    fapi_config_resp_t *fapiConfigRsp;
170
171    MAC_ALLOC(fapiConfigRsp, sizeof(fapi_config_resp_t));
172    if(!fapiConfigRsp)
173    {
174       DU_LOG("PHY STUB: Memory allocation failed");
175       return RFAILED;
176    }
177    memset(fapiConfigRsp, 0, sizeof(fapi_config_resp_t));
178    fapiConfigRsp->number_of_invalid_tlvs = NULLP;
179    fapiConfigRsp->number_of_inv_tlvs_idle_only = NULLP;
180    fapiConfigRsp->number_of_missing_tlvs = NULLP;
181    fapiConfigRsp->error_code = MSG_OK;
182    msgLen = sizeof(fapi_config_resp_t) - sizeof(fapi_msg_t);
183    fillMsgHeader(&fapiConfigRsp->header, FAPI_CONFIG_RESPONSE, msgLen);
184
185    DU_LOG("\nPHY_STUB: Sending Config Response to Lower Mac");
186    procPhyMessages(fapiConfigRsp->header.msg_id, \
187          sizeof(fapi_config_resp_t), (void *)fapiConfigRsp);
188    MAC_FREE(fapiConfigRsp, sizeof(fapi_config_resp_t));
189 #endif
190    return ROK;
191 }
192 /*******************************************************************
193  *
194  * @brief Handles param request received from MAC
195  *
196  * @details
197  *
198  *    Function : l1HdlParamReq
199  *
200  *    Functionality:
201  *          -Handles param request received from MAC
202  *
203  * @params[in]   Message length
204  *               Param request message pointer
205  *
206  * @return void
207  *
208  * ****************************************************************/
209
210 void l1HdlParamReq(uint32_t msgLen, void *msg)
211 {
212 #ifdef INTEL_FAPI
213    DU_LOG("\nPHY_STUB: Received Param Request in PHY");
214
215    /* Build and send PARAM RESPONSE */
216    if(l1BldAndSndParamRsp(msg)!= ROK)
217    {
218       DU_LOG("\nPHY_STUB: Failed Sending Param Response");
219    }
220    MAC_FREE(msg, sizeof(fapi_param_req_t));
221 #endif
222
223
224 /*******************************************************************
225  *
226  * @brief Handles config request received from MAC
227  *
228  * @details
229  *
230  *    Function : l1HdlConfigReq
231  *
232  *    Functionality:
233  *          -Handles config request received from MAC
234  *
235  * @params[in]   Message length
236  *               config request message pointer
237  *
238  * @return void
239  *
240  * ****************************************************************/
241
242 void l1HdlConfigReq(uint32_t msgLen, void *msg)
243 {
244 #ifdef INTEL_FAPI
245    fapi_config_req_t *configReq = (fapi_config_req_t *)msg;
246
247    DU_LOG("\nPHY_STUB: Received Config Request in PHY");
248
249    /* Handling CONFIG RESPONSE */
250    if(l1BldAndSndConfigRsp(msg)!= ROK)
251    {
252       printf("\nPHY_STUB: Failed Sending config Response");
253    }
254
255    MAC_FREE(configReq, msgLen);
256 #endif
257
258 }
259
260 /*******************************************************************
261  *
262  * @brief Build and Send CRC Indication
263  *
264  * @details
265  *
266  *    Function : l1BuildAndSendCrcInd
267  *
268  *    Functionality:
269  *      Build and Send CRC Indication
270  *
271  * @params[in] Slot
272  *             SFN 
273  * @return ROK     - success
274  *         RFAILED - failure
275  *
276  * ****************************************************************/
277 uint16_t l1BuildAndSendCrcInd(uint16_t slot, uint16_t sfn)
278 {
279 #ifdef INTEL_FAPI
280    uint8_t idx = 0;
281    fapi_crc_ind_t  *crcInd;
282
283    MAC_ALLOC(crcInd, sizeof(fapi_crc_ind_t));
284    if(!crcInd)
285    {
286       printf("\nPHY_STUB: Memory allocation failed for CRC Indication Message");
287       return RFAILED;
288    }
289    memset(crcInd, 0, sizeof(fapi_crc_ind_t));
290
291    /* TODO: Fill the required values. As of now only 1 CRC status PASS is filled */
292    crcInd->sfn = sfn;
293    crcInd->slot = slot;
294    crcInd->numCrcs = 1;
295
296    crcInd->crc[idx].handle = 0;
297    crcInd->crc[idx].rnti = 0;
298    crcInd->crc[idx].harqId = 0;
299    crcInd->crc[idx].tbCrcStatus = 0;
300    crcInd->crc[idx].numCb = 1;
301    crcInd->crc[idx].cbCrcStatus[0] = 0;
302    crcInd->crc[idx].ul_cqi = 0;
303    crcInd->crc[idx].timingAdvance = 0;
304    crcInd->crc[idx].rssi = 0;
305
306    fillMsgHeader(&crcInd->header, FAPI_CRC_INDICATION, \
307          sizeof(fapi_crc_ind_t) - sizeof(fapi_msg_t));
308
309    /* Sending RACH indication to MAC */
310    DU_LOG("\nPHY STUB: Sending CRC Indication to MAC");
311    procPhyMessages(crcInd->header.msg_id, sizeof(fapi_crc_ind_t), (void *)crcInd);
312    MAC_FREE(crcInd, sizeof(fapi_crc_ind_t));
313 #endif
314    return ROK;
315 } /* l1BuildAndSendCrcInd */
316
317 #ifdef INTEL_FAPI
318 /*******************************************************************
319  *
320  * @brief Build and send Rx data indication
321  *
322  * @details
323  *
324  *    Function : l1BuildAndSendRxDataInd
325  *
326  *    Functionality:
327  *       Build and send Rx data indication
328  *
329  * @params[in] SFN
330  *             Slot
331  * @return ROK     - success
332  *         RFAILED - failure
333  *
334  * ****************************************************************/
335 uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_t puschPdu)
336 {
337    uint8_t idx = 0;
338    fapi_rx_data_indication_t *rxDataInd;
339    fapi_pdu_ind_info_t       *pduInfo;
340    uint8_t  *pdu;
341    uint16_t byteIdx = 0;
342    uint32_t msgLen = 0;
343    MsgType type;
344
345    if(!msg3Sent)
346    {
347       msg3Sent = true;
348       type = MSG_TYPE_MSG3;
349    }
350    else if(!msg5ShortBsrSent)
351    {
352       msg5ShortBsrSent = true;
353       type = MSG_TYPE_SHORT_BSR;
354    }
355    else if(!msg5Sent)
356    {
357       msg5Sent = true;
358       type = MSG_TYPE_MSG5;
359    }
360
361
362    MAC_ALLOC(rxDataInd, sizeof(fapi_rx_data_indication_t));
363    if(!rxDataInd)
364    {
365       printf("\nPHY_STUB: Memory allocation failed for Rx Data Indication");
366       return RFAILED;
367    }
368    memset(rxDataInd, 0, sizeof(fapi_rx_data_indication_t));
369
370    /* TODO: Fill the required values */
371    msgLen = sizeof(fapi_rx_data_indication_t) - sizeof(fapi_msg_t);
372    rxDataInd->sfn = sfn;
373    rxDataInd->slot = slot;
374    rxDataInd->numPdus = 1;
375
376    pduInfo = &rxDataInd->pdus[idx];
377    pduInfo->handle = puschPdu.handle;
378    pduInfo->rnti = puschPdu.rnti;
379    pduInfo->harqId = puschPdu.puschData.harqProcessId;
380    pduInfo->pdu_length = puschPdu.puschData.tbSize ;
381    pduInfo->ul_cqi = 0;
382    pduInfo->timingAdvance = 0;
383    pduInfo->rssi = 0;
384
385    /* Filling pdu with random values for testing */
386    pduInfo->pduData = NULL;
387    MAC_ALLOC(pduInfo->pduData, pduInfo->pdu_length);
388    if(!pduInfo->pduData)
389    {
390       printf("\nPHY_STUB: Memory allocation failed for Rx Data Pdu");
391       return RFAILED;
392    }
393
394    /* Filling PDU */
395    pdu = (uint8_t *)pduInfo->pduData;
396
397    switch(type)
398    {
399       case MSG_TYPE_MSG3: 
400          {
401             /* For Initial RRC setup Request,
402                MAC subheader format is R/R/LCId (1byte)
403                LCId is CCCH(0)
404                From 38.321 section 6.1.1
405              */
406             pdu[byteIdx++] = 0;
407             /* Hardcoding MAC PDU */
408             pdu[byteIdx++] = 181;
409             pdu[byteIdx++] = 99;
410             pdu[byteIdx++] = 20;
411             pdu[byteIdx++] = 170;
412             pdu[byteIdx++] = 132;
413             pdu[byteIdx++] = 96;
414
415             break;
416          }
417
418       case MSG_TYPE_SHORT_BSR:
419          {
420             uint8_t lcgId = 0;
421             uint8_t bufferSizeIdx = 6;
422
423             /* For Short BSR
424                MAC subheader format is R/R/LcId (1Byte)
425                LCId is 61
426                From 38.321 section 6.1.1
427              */
428             pdu[byteIdx++] = 61;    // LCID
429             pdu[byteIdx++] = (lcgId << 5) | bufferSizeIdx;
430
431             break;
432          }
433
434       case MSG_TYPE_MSG5:
435          {
436             uint8_t  msg5PduLen = 33;
437             /* For RRC setup complete
438                MAC subheader format is R/F/LCId/L (2/3 bytes)
439                LCId is 1 for SRB1
440                L is length of PDU i.e 6bytes here 
441                From 38.321 section 6.1.1
442              */
443             uint8_t msg5[] = {1, msg5PduLen, 0, 0, 16, 0, 5, 223, 128, 16, 94, \
444                64, 3, 64, 89, 61, 138, 64, 0, 0, 0, 4, 0, 0, 4, 68, 11, 128, \
445                184, 56, 0, 0, 0, 0, 0};
446
447             msg5PduLen += 2;  /* 2bytes of header */
448             memcpy(pdu, &msg5, msg5PduLen);
449             byteIdx += msg5PduLen; /* 2 bytes of header */
450          }
451
452       default:
453          break;
454    } /* End of switch(type) */
455    /* Filling MAC SDU for Padding bytes*/
456    if(byteIdx < pduInfo->pdu_length)
457    {
458       /* For Padding
459          MAC subheader format is R/R/LCId (1byte)
460          LCId is 63 for padding
461          From 38.321 section 6.1.1
462        */
463       pdu[byteIdx++] = 63;
464
465       for(; byteIdx < pduInfo->pdu_length; byteIdx++)
466          pdu[byteIdx] = 0;
467    }
468    msgLen += pduInfo->pdu_length;
469
470    fillMsgHeader(&rxDataInd->header, FAPI_RX_DATA_INDICATION, msgLen);
471
472    /* Sending Rx data indication to MAC */
473    DU_LOG("\nPHY STUB: Sending Rx data Indication to MAC");
474    procPhyMessages(rxDataInd->header.msg_id, sizeof(fapi_rx_data_indication_t), (void *)rxDataInd);
475
476    if(pduInfo->pdu_length)
477       MAC_FREE(pduInfo->pduData, pduInfo->pdu_length);
478    MAC_FREE(rxDataInd, sizeof(fapi_rx_data_indication_t));
479    return ROK;
480 }
481 #endif
482
483 /*******************************************************************
484  *
485  * @brief Builds and Sends RACH indication to MAC 
486  *
487  * @details
488  *
489  *    Function : l1BuildAndSendRachInd 
490  *
491  *    Functionality:
492  *      Builds and Sends RACH indication to MAC
493  *
494  * @params[in] SFN value 
495  *             slot value
496  * @return ROK     - success
497  *         RFAILED - failure
498  *
499  * ****************************************************************/
500 uint16_t l1BuildAndSendRachInd(uint16_t slot, uint16_t sfn)
501 {
502 #ifdef INTEL_FAPI
503    uint8_t   rachPduIdx = 0; 
504    uint8_t   preamIdx = 0;
505    fapi_rach_pdu_t  *rachPdu;
506    fapi_rach_indication_t  *rachInd;
507
508    /* Building RACH indication */
509    MAC_ALLOC(rachInd, sizeof(fapi_rach_indication_t));
510    if(!rachInd)
511    {
512       printf("\nPHY_STUB: Memory allocation failed for Rach Indication Message");
513       return RFAILED;
514    }
515    memset(rachInd, 0, sizeof(fapi_rach_indication_t)); 
516    rachInd->sfn = sfn;
517    rachInd->slot = slot;
518    rachInd->numPdus = 1;
519
520    rachPdu = &rachInd->rachPdu[rachPduIdx];
521    rachPdu->phyCellId = NR_PCI;
522    rachPdu->symbolIndex = 0;
523    rachPdu->slotIndex = slot;
524    rachPdu->freqIndex = 0;
525    rachPdu->avgRssi = 0;
526    rachPdu->avgSnr = 0;
527    rachPdu->numPreamble = 1;
528
529    rachPdu->preambleInfo[preamIdx].preambleIndex = 3;
530    rachPdu->preambleInfo[preamIdx].timingAdvance = 0;
531    rachPdu->preambleInfo[preamIdx].preamblePwr = 0;
532
533    fillMsgHeader(&rachInd->header, FAPI_RACH_INDICATION, \
534          sizeof(fapi_rach_indication_t) - sizeof(fapi_msg_t));
535
536    /* Sending RACH indication to MAC */
537    DU_LOG("\nPHY STUB: Sending RACH Indication to MAC");
538    procPhyMessages(rachInd->header.msg_id, sizeof(fapi_rach_indication_t), (void *)rachInd);
539    MAC_FREE(rachInd, sizeof(fapi_rach_indication_t));
540 #endif
541    return ROK;
542 }
543
544 /*******************************************************************
545  *
546  * @brief Builds and Send the Slot Indication message to MAC
547  *
548  * @details
549  *
550  *    Function : l1BuildAndSendSlotIndication
551  *
552  *    Functionality:
553  *          -Send the Slot indication Message to MAC
554  *
555  * @params[in]   Message length
556  *               config request message pointer
557  *
558  * @return void
559  *
560  * ****************************************************************/
561 uint16_t l1BuildAndSendSlotIndication()
562 {
563 #ifdef INTEL_FAPI
564    fapi_slot_ind_t *slotIndMsg;
565
566    MAC_ALLOC(slotIndMsg, sizeof(fapi_slot_ind_t));
567    if(!slotIndMsg)
568    {
569       DU_LOG("\nPHY_STUB: Memory allocation failed for slot Indication Message");
570       return RFAILED;
571    }
572    else
573    {
574       memset(slotIndMsg, 0, sizeof(fapi_slot_ind_t));
575       slotIndMsg->sfn = sfnValue;
576       slotIndMsg->slot = slotValue;
577       DU_LOG("\n\nPHY_STUB: SLOT indication [%d:%d]",sfnValue,slotValue);
578
579       /* increment for the next TTI */
580       slotValue++;
581       if(sfnValue >= MAX_SFN_VALUE && slotValue > MAX_SLOT_VALUE)
582       {
583          sfnValue = 0;
584          slotValue = 0;
585       }
586       else if(slotValue > MAX_SLOT_VALUE)
587       {
588          sfnValue++;
589          slotValue = 0;
590       }
591       fillMsgHeader(&slotIndMsg->header, FAPI_SLOT_INDICATION, \
592             sizeof(fapi_slot_ind_t) - sizeof(fapi_msg_t));
593       procPhyMessages(slotIndMsg->header.msg_id, sizeof(fapi_slot_ind_t), (void*)slotIndMsg);
594       MAC_FREE(slotIndMsg, sizeof(fapi_slot_ind_t));
595    }
596 #endif
597    return ROK;
598 }
599
600 /*******************************************************************
601  *
602  * @brief Handles start request received from MAC
603  *
604  * @details
605  *
606  *    Function : l1HdlStartReq
607  *
608  *    Functionality:
609  *          -Handles start request received from MAC
610  *
611  * @params[in]   Message length
612  *               config request message pointer
613  *
614  * @return void
615  *
616  * ****************************************************************/
617
618 S16 l1HdlStartReq(uint32_t msgLen, void *msg)
619 {
620 #ifdef INTEL_FAPI
621    fapi_start_req_t *startReq = (fapi_start_req_t *)msg;
622
623    if(lwrMacCb.phyState == PHY_STATE_CONFIGURED)
624    {
625       l1HdlSlotIndicaion(FALSE);
626       MAC_FREE(startReq, sizeof(fapi_start_req_t));
627    }
628    else
629    {
630       DU_LOG("\nPHY_STUB: Received Start Req in PHY State %d", lwrMacCb.phyState);
631       return RFAILED;
632    }
633 #endif
634    return ROK;
635 }
636
637 /*******************************************************************
638  *
639  * @brief Handles Dl Tti request received from MAC
640  *
641  * @details
642  *
643  *    Function : l1HdlDlTtiReq
644  *
645  *    Functionality:
646  *          -Handles Dl Tti request received from MAC
647  *
648  * @params[in]   Message length
649  *               Dl Tti request message pointer
650  *
651  * @return void
652  *
653  * ****************************************************************/
654
655 S16 l1HdlDlTtiReq(uint16_t msgLen, void *msg)
656 {
657 #ifdef INTEL_FAPI
658    fapi_dl_tti_req_t *dlTtiReq;
659    dlTtiReq = (fapi_dl_tti_req_t *)msg;
660
661    printf("\nPHY STUB: DL TTI Request at sfn=%d slot=%d",dlTtiReq->sfn,dlTtiReq->slot);
662 #if 0
663    printf("\nPHY_STUB:  SFN     %d", dlTtiReq->sfn);
664    printf("\nPHY_STUB:  SLOT    %d", dlTtiReq->slot);
665    printf("\nPHY_STUB:  nPdus   %d", dlTtiReq->nPdus);
666    printf("\nPHY_STUB:  nGroup  %d", dlTtiReq->nGroup);
667    /* Printing SSB CONFIGURED VALUES */
668    printf("\nPHY_STUB: physCellId   %d", dlTtiReq->pdus->u.ssb_pdu.physCellId);
669    printf("\nPHY_STUB: betaPss      %d", dlTtiReq->pdus->u.ssb_pdu.betaPss);
670    printf("\nPHY_STUB: ssbBlockIndex %d",       dlTtiReq->pdus->u.ssb_pdu.ssbBlockIndex);
671    printf("\nPHY_STUB: ssbSubCarrierOffset %d", dlTtiReq->pdus->u.ssb_pdu.ssbSubCarrierOffset);
672    printf("\nPHY_STUB: ssbOffsetPointA     %d", dlTtiReq->pdus->u.ssb_pdu.ssbOffsetPointA);
673    printf("\nPHY_STUB: bchPayloadFlag      %d", dlTtiReq->pdus->u.ssb_pdu.bchPayloadFlag);
674    printf("\nPHY_STUB: bchPayload          %x", dlTtiReq->pdus->u.ssb_pdu.bchPayload);
675 #endif
676    uint8_t pduCount = 0;
677    if(dlTtiReq->nPdus == 0)
678    {
679       DU_LOG("\nPHY_STUB: No PDU in DL TTI Request");
680    }
681    for(pduCount=0; pduCount<dlTtiReq->nPdus; pduCount++)
682    {
683       if(dlTtiReq->pdus[pduCount].pduType == 3) //SSB_PDU_TYPE
684          DU_LOG("\nPHY_STUB: SSB PDU");
685       else if(dlTtiReq->pdus[pduCount].pduType == 0)
686          DU_LOG("\nPHY_STUB: PDCCH PDU");
687       else if(dlTtiReq->pdus[pduCount].pduType == 1)
688          DU_LOG("\nPHY_STUB: PDSCH PDU");
689    }
690
691    /* Free FAPI message */
692    MAC_FREE(dlTtiReq, msgLen);
693
694 #endif
695    return ROK;
696 }
697
698 /*******************************************************************
699  *
700  * @brief Handles tx_data request received from MAC
701  *
702  * @details
703  *
704  *    Function : l1HdlTxDataReq
705  *
706  *    Functionality:
707  *          -Handles tx_data request received from MAC
708  *
709  * @params[in]   Message length
710  *               tx_data request message pointer
711  *
712  * @return void
713  *
714  * ****************************************************************/
715
716 S16 l1HdlTxDataReq(uint16_t msgLen, void *msg)
717 {
718 #ifdef INTEL_FAPI
719    fapi_tx_data_req_t *txDataReq;
720    txDataReq = (fapi_tx_data_req_t *)msg;
721
722    DU_LOG("\nPHY STUB: TX DATA Request at sfn=%d slot=%d",txDataReq->sfn,txDataReq->slot);
723
724    MAC_FREE(txDataReq, msgLen);
725 #endif
726    return ROK;
727 }
728
729 #ifdef INTEL_FAPI
730 /*******************************************************************
731  *
732  * @brief Fills Uci Ind Pdu Info carried on Pucch Format 0/Format 1
733  *
734  * @details
735  *
736  *    Function : fillPucchF0F1PduInfo
737  *
738  *    Functionality:
739  *       Fills Uci Ind Pdu Info carried on Pucch Format 0/Format 1 
740  *
741  * @params[in] fapi_uci_o_pucch_f0f1_t *
742  *             pucchPdu
743  * @return ROK     - success
744  *         RFAILED - failure
745  *
746  * ****************************************************************/
747 uint8_t fillPucchF0F1PduInfo(fapi_uci_o_pucch_f0f1_t *pduInfo, fapi_ul_pucch_pdu_t pucchPdu)
748 {
749    uint8_t idx = 0;
750
751    pduInfo->handle = pucchPdu.handle;
752    pduInfo->pduBitmap = 1;  //hardcoded for SR
753    pduInfo->pucchFormat = pucchPdu.formatType;
754    pduInfo->ul_cqi = 0;
755    pduInfo->rnti = pucchPdu.rnti;
756    pduInfo->timingAdvance = 0;
757    pduInfo->rssi = 0;
758    pduInfo->uciBits[idx] = 0;   //TODO: FAPI spec ver. 222.10.01 has no info about UCI Bits
759    if(pduInfo->pduBitmap & SR_PDU_BITMASK)
760    {
761       pduInfo->srInfo.srIndication = SR_DETECTED;
762       pduInfo->srInfo.srConfidenceLevel = CONFDC_LEVEL_GOOD;
763    }
764    if(pduInfo->pduBitmap & HARQ_PDU_BITMASK)
765    {
766       pduInfo->harqInfo.numHarq++;
767       pduInfo->harqInfo.harqConfidenceLevel = CONFDC_LEVEL_GOOD;
768       for(idx = 0; idx < pduInfo->harqInfo.numHarq; idx++)
769       {
770          pduInfo->harqInfo.harqValue[idx] = HARQ_PASS;
771       }
772    }
773    return ROK;
774 }
775 /*******************************************************************
776  *
777  * @brief Fills UCI Pdu Information
778  *
779  * @details
780  *
781  *    Function : fillUciPduInfo
782  *
783  *    Functionality:
784  *       Fills UCI Pdu Information
785  *
786  * @params[in] Pointer to uciPdu
787  *             pucchPdu
788  * @return ROK     - success
789  *         RFAILED - failure
790  *
791  * ****************************************************************/
792 uint8_t fillUciPduInfo(fapi_uci_pdu_info_t *uciPdu, fapi_ul_pucch_pdu_t pucchPdu)
793 {
794    uint8_t ret = ROK;
795
796    /*TODO: The pduType is hardcoded here to support 
797      UCI Ind for PUCCH forat0/format1. This is to be
798      modified when we get SR form UE */
799    uciPdu->pduType = UCI_IND_PUCCH_F0F1;
800    switch(uciPdu->pduType)
801    {
802       case UCI_IND_PUSCH:
803          break;
804       case UCI_IND_PUCCH_F0F1:
805          {
806             fapi_uci_o_pucch_f0f1_t *pduInfo = NULLP;
807
808             pduInfo = &uciPdu->uci.uciPucchF0F1;
809             ret = fillPucchF0F1PduInfo(pduInfo, pucchPdu);
810             uciPdu->pduSize = sizeof(fapi_uci_o_pucch_f0f1_t);
811          }
812          break;
813       case UCI_IND_PUCCH_F2F3F4:
814          break;
815       default:
816          DU_LOG("\nPHY_STUB: Invalid Pdu Type %d", uciPdu->pduType);
817          break;
818    }
819    return ret;
820 }
821
822 /*******************************************************************
823  *
824  * @brief Build and send Uci indication
825  *
826  * @details
827  *
828  *    Function : l1BuildAndSendUciInd
829  *
830  *    Functionality:
831  *       Build and send Uci indication
832  *
833  * @params[in] SFN
834  *             Slot
835  * @return ROK     - success
836  *         RFAILED - failure
837  *
838  * ****************************************************************/
839 uint8_t l1BuildAndSendUciInd(uint16_t slot, uint16_t sfn, fapi_ul_pucch_pdu_t pucchPdu)
840 {
841    uint8_t uciIdx = 0;
842    uint8_t nUciPdus = 0;
843    uint8_t ret = ROK;
844    uint32_t msgLen = 0;
845    fapi_uci_indication_t *uciInd =  NULLP;
846
847    MAC_ALLOC(uciInd, sizeof(fapi_uci_indication_t));
848    if(!uciInd)
849    {
850       printf("\nPHY_STUB: Memory allocation failed for UCI Indication");
851       return RFAILED;
852    }
853    memset(uciInd, 0, sizeof(fapi_uci_indication_t));
854    uciInd->sfn = sfn;
855    uciInd->slot = slot;
856    uciInd->numUcis = 1;   //consdering the UCI Ind for SR
857    nUciPdus = uciInd->numUcis;
858    while(nUciPdus)
859    {
860       ret = fillUciPduInfo(&uciInd->uciPdu[uciIdx], pucchPdu);
861       uciIdx++;
862       nUciPdus--;
863    }
864    if(ret == ROK)
865    {
866       msgLen = sizeof(fapi_uci_indication_t)- sizeof(fapi_msg_t);
867       fillMsgHeader(&uciInd->header, FAPI_UCI_INDICATION, msgLen);
868
869       /* Sending UCI indication to MAC */
870       DU_LOG("\nPHY STUB: Sending UCI Indication to MAC");
871       procPhyMessages(uciInd->header.msg_id, sizeof(fapi_uci_indication_t), (void *)uciInd);
872    }
873    MAC_FREE(uciInd, sizeof(fapi_uci_indication_t));
874    return ret;
875 }
876 #endif
877
878 /*******************************************************************
879  *
880  * @brief Handles Ul Tti request received from MAC
881  *
882  * @details
883  *
884  *    Function : l1HdlUlTtiReq
885  *
886  *    Functionality:
887  *          -Handles Ul Tti request received from MAC
888  *
889  * @params[in]   Message length
890  *               Ul Tti request message pointer
891  *
892  * @return void
893  *
894  * ****************************************************************/
895
896 S16 l1HdlUlTtiReq(uint16_t msgLen, void *msg)
897 {
898 #ifdef INTEL_FAPI
899    fapi_ul_tti_req_t *ulTtiReq = NULLP;
900    
901    DU_LOG("\nPHY STUB: Received UL TTI Request");
902
903    ulTtiReq = (fapi_ul_tti_req_t *)msg;
904    uint8_t numPdus = ulTtiReq->nPdus;
905
906    if(numPdus == 0)
907    {
908       DU_LOG("\nPHY STUB: No PDU in UL TTI");
909    }
910    while(numPdus)
911    {
912       if(ulTtiReq->pdus[numPdus-1].pduType == 0)
913       {
914          DU_LOG("\nPHY STUB: PRACH PDU");
915       }
916       if(ulTtiReq->pdus[numPdus-1].pduType == 1)
917       {
918          DU_LOG("\nPHY STUB: PUSCH PDU");                       
919          l1BuildAndSendRxDataInd(ulTtiReq->slot, ulTtiReq->sfn, \
920                ulTtiReq->pdus[numPdus-1].pdu.pusch_pdu); 
921       }
922       if(ulTtiReq->pdus[numPdus-1].pduType == 2)
923       {
924          DU_LOG("\nPHY STUB: PUCCH PDU");
925          fapi_ul_tti_req_t ulTtiSlotInd;
926          memset(&ulTtiSlotInd, 0, sizeof(fapi_ul_tti_req_t));
927          ulTtiSlotInd.slot = ulTtiReq->slot;
928          ulTtiSlotInd.sfn  = ulTtiReq->sfn;
929          ADD_DELTA_TO_TIME(ulTtiSlotInd, ulTtiSlotInd, SLOT_DELAY);
930          l1BuildAndSendUciInd(ulTtiSlotInd.slot, ulTtiSlotInd.sfn, \
931                ulTtiReq->pdus[numPdus-1].pdu.pucch_pdu);
932       }
933       numPdus--;
934    }
935
936    if(rachIndSent == false && ulTtiReq->sfn == 2 && ulTtiReq->slot == 6)
937    {
938       rachIndSent = true;
939       l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn);
940    }
941
942    MAC_FREE(ulTtiReq, msgLen);
943 #endif
944    return ROK;
945 }
946
947 /*******************************************************************
948  *
949  * @brief Builds and Send the stop Indication message to MAC
950  *
951  * @details
952  *
953  *    Function : l1BuildAndSendStopInd
954  *
955  *    Functionality:
956  *          -Send the Stop indication Message to MAC
957  *
958  *
959  * @return void
960  *
961  * ****************************************************************/
962 uint16_t l1BuildAndSendStopInd()
963 {
964 #ifdef INTEL_FAPI
965    fapi_stop_ind_t *stopIndMsg = NULLP;
966    uint32_t msgLen = 0;
967
968    MAC_ALLOC(stopIndMsg, sizeof(fapi_stop_ind_t));
969    if(!stopIndMsg)
970    {
971       DU_LOG("\nPHY_STUB: Memory allocation failed for stop Indication Message");
972       return RFAILED;
973    }
974    else
975    {
976       fillMsgHeader(&stopIndMsg->header, FAPI_STOP_INDICATION, msgLen);
977       DU_LOG("\n\nPHY_STUB: Processing Stop indication to MAC");
978       procPhyMessages(stopIndMsg->header.msg_id,\
979             sizeof(fapi_stop_ind_t), (void*)stopIndMsg);
980       MAC_FREE(stopIndMsg, sizeof(fapi_stop_ind_t));
981    }
982 #endif
983    return ROK;
984 }
985
986 /*******************************************************************
987  *
988  * @brief Handles stop request received from MAC
989  *
990  * @details
991  *
992  *    Function : l1HdlStopReq
993  *
994  *    Functionality:
995  *          -Handles stop request received from MAC
996  *
997  * @params[in]   Message length
998  *               stop request message pointer
999  *
1000  * @return void
1001  *
1002  * ****************************************************************/
1003
1004 S16 l1HdlStopReq(uint32_t msgLen, void *msg)
1005 {
1006 #ifdef INTEL_FAPI
1007    fapi_stop_req_t *stopReq = (fapi_stop_req_t *)msg;
1008
1009    if(lwrMacCb.phyState == PHY_STATE_RUNNING)
1010    {
1011       l1HdlSlotIndicaion(TRUE);
1012       DU_LOG("\nPHY_STUB: Slot Indication is stopped successfully");
1013       l1BuildAndSendStopInd();
1014       MAC_FREE(stopReq, msgLen);
1015    }
1016    else
1017    {
1018       DU_LOG("\nPHY_STUB: Received Stop Req in PHY State %d", lwrMacCb.phyState);
1019       return RFAILED;
1020    }
1021 #endif
1022    return ROK;
1023 }
1024
1025 /*******************************************************************
1026  *
1027  * @brief Build And Send Rx Data Ind for Msg5
1028  *
1029  * @details
1030  *
1031  *    Function : l1BuildAndSendMsg5
1032  *
1033  *    Functionality: Build And Send Rx Data Ind for Msg5
1034  *
1035  * @params[in] SFN
1036  *             Slot
1037  * @return ROK     - success
1038  *         RFAILED - failure
1039  *
1040  * ****************************************************************/
1041 uint8_t l1BuildAndSendMsg5(uint16_t sfn, uint16_t slot)
1042 {   
1043 #ifdef INTEL_FAPI
1044    uint8_t idx = 0;
1045    fapi_rx_data_indication_t *rxDataInd;
1046    fapi_pdu_ind_info_t       *pduInfo;
1047    uint8_t  *pdu;
1048    uint16_t byteIdx = 0;
1049    uint32_t msgLen = 0;
1050
1051    MAC_ALLOC(rxDataInd, sizeof(fapi_rx_data_indication_t));
1052    if(!rxDataInd)
1053    {
1054       printf("\nPHY_STUB: Memory allocation failed for Rx Data Indication for msg5");
1055       return RFAILED;
1056    }
1057    memset(rxDataInd, 0, sizeof(fapi_rx_data_indication_t));
1058
1059    /* TODO: Fill the required values */
1060    msgLen = sizeof(fapi_rx_data_indication_t) - sizeof(fapi_msg_t);
1061    rxDataInd->sfn = sfn;
1062    rxDataInd->slot = slot;
1063    rxDataInd->numPdus = 1;
1064
1065    pduInfo = &rxDataInd->pdus[idx];
1066    pduInfo->handle = 100;
1067    pduInfo->rnti = 100;
1068    pduInfo->harqId = 1;
1069    pduInfo->pdu_length = 25;
1070    pduInfo->ul_cqi = 0;
1071    pduInfo->timingAdvance = 0;
1072    pduInfo->rssi = 0;
1073
1074    /* Filling pdu with random values for testing */
1075    pduInfo->pduData = NULL;
1076    MAC_ALLOC(pduInfo->pduData, pduInfo->pdu_length);
1077    if(!pduInfo->pduData)
1078    {
1079       printf("\nPHY_STUB: Memory allocation failed for Rx Data Pdu");
1080       return RFAILED;
1081    }
1082
1083    /* Filling PDU */
1084    pdu = (uint8_t *)pduInfo->pduData;
1085
1086    uint8_t  msg5PduLen = 33;
1087    /* For RRC setup complete
1088       MAC subheader format is R/F/LCId/L (2/3 bytes)
1089       LCId is 1 for SRB1
1090       L is length of PDU i.e 6bytes here
1091       From 38.321 section 6.1.1
1092     */
1093    uint8_t msg5[] = {1, msg5PduLen, 0, 0, 16, 0, 5, 223, 128, 16, 94, \
1094       64, 3, 64, 89, 61, 138, 64, 0, 0, 0, 4, 0, 0, 4, 68, 11, 128, \
1095          184, 56, 0, 0, 0, 0, 0};
1096
1097    msg5PduLen += 2;  /* 2bytes of header */
1098    memcpy(pdu, &msg5, msg5PduLen);
1099    byteIdx += msg5PduLen; /* 2 bytes of header */
1100
1101    /* Filling MAC SDU for Padding bytes*/
1102    if(byteIdx < pduInfo->pdu_length)
1103    {
1104       /* For Padding
1105          MAC subheader format is R/R/LCId (1byte)
1106          LCId is 63 for padding
1107          From 38.321 section 6.1.1
1108        */
1109       pdu[byteIdx++] = 63;
1110
1111       for(; byteIdx < pduInfo->pdu_length; byteIdx++)
1112          pdu[byteIdx] = 0;
1113    }
1114    msgLen += pduInfo->pdu_length;
1115
1116    fillMsgHeader(&rxDataInd->header, FAPI_RX_DATA_INDICATION, msgLen);
1117
1118    /* Sending Rx data indication to MAC */
1119    DU_LOG("\nPHY STUB: Sending Rx data Indication to MAC");
1120    procPhyMessages(rxDataInd->header.msg_id, sizeof(fapi_rx_data_indication_t), (void *)rxDataInd);
1121
1122    if(pduInfo->pdu_length)
1123       MAC_FREE(pduInfo->pduData, pduInfo->pdu_length);
1124    MAC_FREE(rxDataInd, sizeof(fapi_rx_data_indication_t));
1125 #endif
1126    return ROK;
1127 }
1128
1129 /*******************************************************************
1130  *
1131  * @brief Handles Ul Dci request received from MAC
1132  *
1133  * @details
1134  *
1135  *    Function : l1HdlUlDciReq
1136  *
1137  *    Functionality:
1138  *          -Handles Ul Dci request received from MAC
1139  *
1140  * @params[in]   Message length
1141  *               Ul Dci request message pointer
1142  *
1143  * @return void
1144  *
1145  * ****************************************************************/
1146
1147 S16 l1HdlUlDciReq(uint16_t msgLen, void *msg)
1148 {
1149 #ifdef INTEL_FAPI
1150    fapi_ul_dci_req_t *ulDciReq = NULLP;
1151
1152    ulDciReq = (fapi_ul_dci_req_t *)msg;
1153    uint8_t numPdus = ulDciReq->numPdus;
1154
1155    while(numPdus)
1156    {
1157       if(ulDciReq->pdus[numPdus-1].pduType == 0)
1158       {
1159          DU_LOG("\nPHY STUB: Received UL DCI Request for PDCCH PDU");
1160          //l1BuildAndSendMsg5(ulDciReq->sfn, ulDciReq->slot);
1161          //msg5Sent = true;
1162       }
1163       numPdus--;
1164    }
1165
1166    MAC_FREE(ulDciReq, msgLen);
1167 #endif
1168    return ROK;
1169 }
1170
1171 /*******************************************************************
1172  *
1173  * @brief Receives message from MAC
1174  *
1175  * @details
1176  *
1177  *    Function :  l1ProcessFapiRequest
1178  *
1179  *    Functionality:
1180  *       - Receives message from MAC and calls handler
1181  *
1182  * @params[in] Message type
1183  *             Message length
1184  *             Message pointer
1185  *
1186  * @return void
1187  *
1188  * ****************************************************************/
1189
1190 void l1ProcessFapiRequest(uint8_t msgType, uint32_t msgLen, void *msg)
1191 {
1192    switch(msgType)
1193    {
1194 #ifdef INTEL_FAPI
1195       case FAPI_PARAM_REQUEST:
1196          l1HdlParamReq(msgLen, msg);
1197          break;
1198       case FAPI_CONFIG_REQUEST:
1199          l1HdlConfigReq(msgLen, msg);
1200          break;
1201       case FAPI_START_REQUEST:
1202          l1HdlStartReq(msgLen, msg);
1203          break;
1204       case FAPI_DL_TTI_REQUEST:
1205          l1HdlDlTtiReq(msgLen, msg);
1206          break;
1207       case FAPI_TX_DATA_REQUEST:
1208          l1HdlTxDataReq(msgLen, msg);
1209          break;
1210       case FAPI_UL_TTI_REQUEST:
1211          l1HdlUlTtiReq(msgLen, msg);
1212          break;
1213       case FAPI_STOP_REQUEST:
1214          l1HdlStopReq(msgLen, msg);
1215          break;
1216       case FAPI_UL_DCI_REQUEST:
1217          l1HdlUlDciReq(msgLen, msg);
1218          break;
1219       default:
1220          DU_LOG("\nPHY_STUB: Invalid message type[%x] received at PHY", msgType);
1221          break;
1222 #endif
1223    }
1224 }
1225 /**********************************************************************
1226   End of file
1227  **********************************************************************/