[Epic-ID: ODUHIGH-][Task-ID: ODUHIGH-]WG8 alignment | Cell conf
[o-du/l2.git] / src / 5gnrsch / sch_crc.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 #include "common_def.h"
19 #include "tfu.h"
20 #include "lrg.h"
21 #include "tfu.x"
22 #include "lrg.x"
23 #include "du_log.h"
24 #include "du_app_mac_inf.h"
25 #include "mac_sch_interface.h"
26 #include "sch.h"
27 #include "sch_utils.h"
28
29 /**
30  * @brief Process CRC indication
31  *
32  * @details
33  *
34  *     Function : SchProcCrcInd
35  *      
36  *      This function process CRC indication
37  *           
38  *  @param[in]  CrcIndInfo *crcInd, recvd crc indication
39  *  @param[in]  Inst schInst, scheduler inst
40  *  @return  
41  *      -# ROK
42  *      -# RFAILED
43  **/
44 uint8_t SchProcCrcInd(Pst *pst, CrcIndInfo *crcInd)
45 {
46    uint16_t count=0;
47    uint8_t  ueId=0;
48    SchUlHqProcCb *hqP = NULLP;
49    Inst  schInst = pst->dstInst - SCH_INST_START;
50    SchCellCb *cell = schCb[schInst].cells[schInst];
51    
52    while(count  <crcInd->numCrcInd)
53    {
54       GET_UE_ID(crcInd->crnti, ueId);
55       if (cell->raCb[ueId-1].raState == SCH_RA_STATE_MSG3_PENDING)
56       {
57          if (crcInd->crcInd[count])
58          {
59             /* failure case*/
60             if (cell->raCb[ueId-1].msg3HqProc.tbInfo.txCntr < cell->maxMsg3Tx)
61             {
62                cell->api->SchCrcInd(cell, ueId);
63                cell->raCb[ueId - 1].retxMsg3HqProc = &cell->raCb[ueId - 1].msg3HqProc;
64             }
65             else
66             {
67                /*Release all contexts of the UE RA*/
68             }
69          }
70          else
71          {
72             /* pass case*/
73             /*Dedicated preamble case need to be added*/
74             cell->raCb[ueId-1].raState = SCH_RA_STATE_MSG4_PENDING;
75             /*HARQ init part is in ADD UE CONFIG now, could be moved here*/
76          }         
77       }
78       else
79       {
80          if (cell->ueCb[ueId-1].hqUlmap[crcInd->timingInfo.slot]->hqList.count == 0)
81          {
82             DU_LOG("\n ERROR no harq stored in ul hq map at slot %d ue id %d\n",crcInd->timingInfo.slot, ueId);
83             continue;
84          }
85          if (cell->ueCb[ueId-1].hqUlmap[crcInd->timingInfo.slot]->hqList.first == 0)
86          {
87             DU_LOG("\n ERROR NULL harq stored in ul hq map at slot %d ue id %d\n",crcInd->timingInfo.slot, ueId);
88             continue;
89          }
90          hqP = (SchUlHqProcCb*) cell->ueCb[ueId-1].hqUlmap[crcInd->timingInfo.slot]->hqList.first->node;
91          if(hqP == NULLP)
92          {
93             continue;
94          }
95          else
96          {
97             if (crcInd->crcInd[count])
98             {             
99                /* failure case*/
100                schUlHqProcessNack(hqP);
101             }
102             else
103             {
104                /* pass case*/
105                schUlHqProcessAck(hqP);
106             }
107          }
108          cmLListDelFrm(&(cell->ueCb[ueId-1].hqUlmap[crcInd->timingInfo.slot]->hqList), &hqP->ulSlotLnk);
109       }
110       count++;
111    }
112    return ROK;
113 }
114 /**********************************************************************
115   End of file
116  **********************************************************************/