[Epic-ID: ODUHIGH-516][Task-ID: ODUHIGH-523] Statistics Indication between DU APP...
[o-du/l2.git] / src / 5gnrmac / mac_msg_router.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 /************************************************************************
20  
21      Name:     LTE-MAC layer
22   
23      Type:     C source file
24   
25      Desc:     C source code SSI Interface Implementation
26   
27      File:     mac_msg_router.c
28   
29 **********************************************************************/
30
31 /** @file mac_msg_router.c
32 @brief This file contains the implementation of callback functions 
33 registered with SSI during the LTE MAC Task initialization.
34 */
35 /* header include files -- defines (.h) */
36 #include "common_def.h"
37 #include "rgu.h"           /* RGU defines */
38 #include "tfu.h"           /* RGU defines */
39 #include "lrg.h"           /* layer management defines for LTE-MAC */
40 #include "rgr.h"           /* layer management defines for LTE-MAC */
41 #include "crg.h"           /* CRG interface includes */
42 #include "rg_sch_inf.h"    /* SCH interface includes */
43 #include "rg_prg.h"        /* PRG interface includes */
44 #include "rg_env.h"        /* customisable defines and macros for LTE-MAC */
45 #include "rg.h"            /* defines and macros for MAC */
46 #include "rgr.h"            /* defines and macros for SCH */
47
48
49 /* header/extern include files (.x) */
50 #include "rgu.x"           /* RGU types */
51 #include "tfu.x"           /* RGU types */
52 #include "lrg.x"           /* layer management typedefs for MAC */
53 #include "rgr.x"           /* layer management typedefs for MAC */
54 #include "crg.x"           /* CRG interface typedes */
55 #include "rg_sch_inf.x"    /* SCH interface typedefs */
56 #include "rg_prg.x"        /*PRG interface includes*/
57 #include "du_app_mac_inf.h"
58 #include "rg.x"            /* typedefs for MAC */
59 #include "rlc_mac_inf.h"
60 #include "lwr_mac_upr_inf.h"
61 #include "mac_sch_interface.h"
62 #include "mac.h"
63 #include "mac_ue_mgr.h"
64 #include "mac_harq_dl.h"
65
66 /**
67  * @brief Task Activation callback function Entity DU APP. 
68  *
69  * @details
70  *
71  *     Function : MacHdlDuappEvents
72  *     
73  *     Process Messages received from Entity DU APP
74  *     
75  *  @param[in]  Pst     *pst, Post structure of the primitive.     
76  *  @param[in]  Buffer *mBuf, Packed primitive parameters in the buffer.
77  *  @param[in]  Reason reason.
78  *  @return  void
79  **/
80 void MacHdlDuappEvents(Pst *pst, Buffer *mBuf)
81 {
82    switch(pst->event)
83    {
84 #ifdef LCRGMILRG
85       case EVTLRGCFGREQ:
86          /* Process a config. request */
87          cmUnpkLrgCfgReq(RgMiLrgCfgReq, pst, mBuf);
88          break;
89       case EVTMACSCHGENCFGREQ:
90          /* Process a config. request */
91          cmUnpkLrgSchCfgReq(MacSchGenCfgReq, pst, mBuf);
92          break;
93       case EVTLRGSTSREQ:
94          /* Process a statistics request */
95          cmUnpkLrgStsReq(RgMiLrgStsReq, pst, mBuf);
96          break;
97 #endif /* LCRGMILRG */
98       case EVENT_MAC_CELL_CONFIG_REQ:
99          {
100             /* Process MAC cell config */
101             unpackDuMacCellCfg(MacProcCellCfgReq, pst, mBuf);
102             break;
103          }
104       case EVENT_MAC_CELL_START:
105          {
106             /* Process MAC cell start request */
107             unpackMacCellStart(MacProcCellStart, pst, mBuf);
108             break;
109          }
110       case EVENT_MAC_CELL_STOP:
111          {
112             /* Process MAC cell stop request */
113             unpackMacCellStop(MacProcCellStop, pst, mBuf);
114             break;
115          }
116       case EVENT_MAC_DL_CCCH_IND:
117          {
118             /* Process DL CCCH Ind */
119             unpackMacDlCcchInd(MacProcDlCcchInd, pst, mBuf);
120             break;
121          }
122       case EVENT_MAC_UE_CREATE_REQ:
123          {
124             /* Process Ue Create Request */
125             unpackMacUeCreateReq(MacProcUeCreateReq, pst, mBuf);
126             break;
127          }
128       case EVENT_MAC_UE_RECONFIG_REQ:
129          {
130             /* Process Ue Reconfig Request */
131             unpackMacUeReconfigReq(MacProcUeReconfigReq, pst, mBuf);
132             break;
133          }
134       case EVENT_MAC_UE_DELETE_REQ:
135          {
136             /* Process UE Delete Request */  
137             unpackMacUeDeleteReq(MacProcUeDeleteReq, pst, mBuf);
138             break;
139          }
140       case EVENT_MAC_CELL_DELETE_REQ:
141          {
142             /* Process Cell Delete Request */
143             unpackMacCellDeleteReq(MacProcCellDeleteReq, pst, mBuf);
144             break;
145          }
146       case EVENT_MAC_SLICE_CFG_REQ:
147          {
148             /* Process Slice Configuration Request */
149             unpackMacSliceCfgReq(MacProcSliceCfgReq, pst, mBuf);
150             break;
151          }
152       case EVENT_MAC_SLICE_RECFG_REQ:
153          {
154             /* Process Slice Reconfiguration Request */
155             unpackMacSliceRecfgReq(MacProcSliceRecfgReq, pst, mBuf);
156             break;
157          }
158       case EVENT_MAC_RACH_RESOURCE_REQ:
159          {
160             /* Process Rach Resource Request */
161             unpackMacRachRsrcReq(MacProcRachRsrcReq, pst, mBuf);
162             break;
163          }
164       case EVENT_MAC_RACH_RESOURCE_REL:
165          {
166             /* Process Rach Resource Release */
167             unpackMacRachRsrcRel(MacProcRachRsrcRel, pst, mBuf);
168             break;
169          }
170       case EVENT_MAC_DL_PCCH_IND:
171          {
172             /* Process Pcch indication */
173             unpackMacDlPcchInd(MacProcDlPcchInd, pst, mBuf);
174             break;
175          }
176       case EVENT_MAC_DL_BROADCAST_REQ:
177          {
178             /* Process Dl Broadcast Request */  
179             unpackMacDlBroadcastReq(MacProcDlBroadcastReq, pst, mBuf);
180             break;
181          }
182
183       case EVENT_MAC_UE_RESET_REQ:
184          {
185             /* Process UE Reset Request */  
186             unpackMacUeResetReq(MacProcUeResetReq, pst, mBuf);
187             break;
188          }
189
190       case EVENT_MAC_STATISTICS_REQ:
191          {
192             /* Process Statistics Request */
193             unpackMacStatsReq(MacProcStatsReq, pst, mBuf);
194          }
195
196       default:
197          RG_FREE_MSG(mBuf);
198          break;
199    }
200 }
201
202 /**
203  * @brief Task Activation callback function Entity RLC. 
204  *
205  * @details
206  *
207  *     Function : MacHdlRlcEvents
208  *     
209  *     Process Messages received from Entity RLC
210  *     
211  *  @param[in]  Pst     *pst, Post structure of the primitive.     
212  *  @param[in]  Buffer *mBuf, Packed primitive parameters in the buffer.
213  *  @param[in]  Reason reason.
214  *  @return  void
215  **/
216 void MacHdlRlcEvents(Pst *pst, Buffer *mBuf)
217 {
218    switch(pst->event)
219    {
220       case EVTRGUBNDREQ:
221          cmUnpkRguBndReq(RgUiRguBndReq, pst, mBuf);
222          break;
223       case EVTRGUUBNDREQ:
224          cmUnpkRguUbndReq(RgUiRguUbndReq, pst, mBuf);
225          break;
226       case EVENT_DL_DATA_TO_MAC:
227          unpackRlcDlData(MacProcRlcDlData, pst, mBuf);
228          break;
229       case EVENT_BO_STATUS_TO_MAC:
230          unpackRlcBoStatus(MacProcRlcBoStatus, pst, mBuf);
231          break;
232       default:
233          RG_FREE_MSG(mBuf);
234          break;
235    }
236 }
237
238 /**
239  * @brief Task Activation callback function Entity Lower MAC 
240  *
241  * @details
242  *
243  *     Function : MacHdlLwrMacEvents
244  *     
245  *     Process Messages received from Entity Lower MAC
246  *     
247  *  @param[in]  Pst     *pst, Post structure of the primitive.     
248  *  @param[in]  Buffer *mBuf, Packed primitive parameters in the buffer.
249  *  @param[in]  Reason reason.
250  *  @return  void
251  **/
252 void MacHdlLwrMacEvents(Pst *pst, Buffer *mBuf)
253 {
254    switch(pst->event)
255    {
256       case EVENT_SLOT_IND_TO_MAC:
257          unpackSlotInd(fapiMacSlotInd, pst, mBuf);
258          break;
259       case EVENT_STOP_IND_TO_MAC:
260          unpackStopInd(fapiMacStopInd, pst, mBuf);
261          break;
262       case EVENT_RACH_IND_TO_MAC:
263          unpackRachInd(fapiMacRachInd, pst, mBuf);
264          break;
265       case EVENT_CRC_IND_TO_MAC:
266          unpackCrcInd(fapiMacCrcInd, pst, mBuf);
267          break;
268       case EVENT_RX_DATA_IND_TO_MAC:
269          unpackRxDataInd(fapiMacRxDataInd, pst, mBuf);
270          break;
271       case EVENT_UCI_IND_TO_MAC:
272          unpackUciInd(FapiMacUciInd, pst, mBuf);
273          break;
274       default:
275          RG_FREE_MSG(mBuf);
276          break;
277    }
278 }
279
280 #ifdef CALL_FLOW_DEBUG_LOG
281 /**
282 * @brief Function prints src, dest, msg infor about all the msgs that received.
283 *
284 * @details
285 *
286 *     Function : callFlowMacActvTsk 
287 *
288 *     Function prints src, dest, msg infor about all the msgs that received
289 *
290 *  @param[in]  Pst     *pst, Post structure of the primitive.
291 *
292 *  @return  void
293 **/
294
295 void callFlowMacActvTsk(Pst *pst)
296 {
297    char sourceTask[50];
298    char destTask[50]="ENTMAC";
299    char message[100];
300
301    switch(pst->srcEnt)
302    {
303       case ENTDUAPP:
304          {
305             strcpy(sourceTask,"ENTDUAPP");
306             switch(pst->event)
307             {
308 #ifdef LCRGMILRG
309                case EVTLRGCFGREQ:
310                   strcpy(message,"EVTLRGCFGREQ");
311                   break;
312                case EVTMACSCHGENCFGREQ:
313                   strcpy(message,"EVTMACSCHGENCFGREQ");
314                   break;
315 #endif /* LCRGMILRG */
316                case EVENT_MAC_CELL_CONFIG_REQ:
317                   strcpy(message,"EVENT_MAC_CELL_CONFIG_REQ");
318                   break;
319                case EVENT_MAC_CELL_START:
320                   strcpy(message,"EVENT_MAC_CELL_START");
321                   break;
322                case EVENT_MAC_CELL_STOP:
323                   strcpy(message,"EVENT_MAC_CELL_STOP");
324                   break;
325                case EVENT_MAC_DL_CCCH_IND:
326                   strcpy(message,"EVENT_MAC_DL_CCCH_IND");
327                   break;
328                case EVENT_MAC_UE_CREATE_REQ:
329                   strcpy(message,"EVENT_MAC_UE_CREATE_REQ");
330                   break;
331                case EVENT_MAC_UE_RECONFIG_REQ:
332                   strcpy(message,"EVENT_MAC_UE_RECONFIG_REQ");
333                   break;
334                case EVENT_MAC_UE_DELETE_REQ:
335                   strcpy(message,"EVENT_MAC_UE_DELETE_REQ");
336                   break;
337                case EVENT_MAC_CELL_DELETE_REQ:
338                   strcpy(message,"EVENT_MAC_CELL_DELETE_REQ");
339                   break;
340                case EVENT_MAC_SLICE_CFG_REQ:
341                   strcpy(message,"EVENT_MAC_SLICE_CFG_REQ");
342                   break;
343                case EVENT_MAC_SLICE_RECFG_REQ:
344                   strcpy(message,"EVENT_MAC_SLICE_RECFG_REQ");
345                   break;
346                case EVENT_MAC_STATISTICS_REQ:
347                   strcpy(message,"EVENT_MAC_STATISTICS_REQ");
348                   break;
349                default:
350                   strcpy(message,"Invalid Event");
351                   break;
352             }
353             break;
354          }
355       case ENTRLC:
356          { 
357             strcpy(sourceTask,"ENTRLC");
358             switch(pst->event)
359             {
360 #ifdef LCRGUIRGU
361                case EVTRGUBNDREQ:
362                   strcpy(message,"EVTRGUBNDREQ");
363                   break;
364                case EVTRGUUBNDREQ:
365                   strcpy(message,"EVTRGUUBNDREQ");
366                   break;
367                case EVENT_DL_DATA_TO_MAC:
368                   strcpy(message,"EVENT_DL_DATA_TO_MAC");
369                   break;
370                case EVENT_BO_STATUS_TO_MAC:
371                   strcpy(message,"EVENT_BO_STATUS_TO_MAC");
372                   break;
373 #endif
374                default:
375                   strcpy(message,"Invalid Event");
376                   break;
377             }
378
379             break;
380          }
381       case ENTLWRMAC:
382          {
383             strcpy(sourceTask,"ENTLWRMAC");
384             switch(pst->event)
385             {
386                case EVENT_SLOT_IND_TO_MAC:
387                   strcpy(message,"EVENT_SLOT_IND_TO_MAC");
388                   break;
389                case EVENT_STOP_IND_TO_MAC:
390                   strcpy(message,"EVENT_STOP_IND_TO_MAC");
391                   break;
392                case EVENT_RACH_IND_TO_MAC:
393                   strcpy(message,"EVENT_RACH_IND_TO_MAC");
394                   break;
395                case EVENT_CRC_IND_TO_MAC:
396                   strcpy(message,"EVENT_CRC_IND_TO_MAC");
397                   break;
398                case EVENT_RX_DATA_IND_TO_MAC:
399                   strcpy(message,"EVENT_RX_DATA_IND_TO_MAC");
400                   break;
401                case EVENT_UCI_IND_TO_MAC:
402                   strcpy(message,"EVENT_UCI_IND_TO_MAC");
403                   break;
404                default:
405                   strcpy(message,"Invalid Event");
406                   break;
407             }
408
409             break;
410          }
411       case ENTMAC:
412          {
413             if(pst->srcInst == 1)
414             {
415                strcpy(sourceTask,"ENTSCH");
416                switch(pst->event)
417                {
418                   case EVENT_SLICE_CFG_RSP_TO_MAC:
419                      {
420                         strcpy(message,"EVENT_SLICE_CFG_RSP_TO_MAC");
421                         break;
422                      }
423                   case EVENT_SLICE_RECFG_RSP_TO_MAC:
424                      {
425                         strcpy(message,"EVENT_SLICE_RECFG_RSP_TO_MAC");
426                         break;
427                      }
428                   case EVENT_SCH_CELL_CFG_CFM:
429                      {
430                         strcpy(message,"EVENT_SCH_CELL_CFG_CFM");
431                         break;
432                      }
433                   case EVENT_UE_CONFIG_RSP_TO_MAC:
434                      {
435                         strcpy(message,"EVENT_UE_CONFIG_RSP_TO_MAC");
436                         break;
437                      }
438                   case EVENT_UE_RECONFIG_RSP_TO_MAC:
439                      {
440                         strcpy(message,"EVENT_UE_RECONFIG_RSP_TO_MAC");
441                         break;
442                      }
443                   case EVENT_DL_SCH_INFO:
444                      {
445                         strcpy(message,"EVENT_DL_SCH_INFO");
446                         break;
447                      }
448                   case EVENT_UL_SCH_INFO:
449                      {
450                         strcpy(message,"EVENT_UL_SCH_INFO");
451                         break;
452                      }
453                   case EVENT_RACH_RESOURCE_RESPONSE_TO_MAC:
454                      {
455                         strcpy(message,"EVENT_RACH_RESOURCE_RESPONSE_TO_MAC");
456                         break;
457                      }
458                   case EVENT_DL_PAGING_ALLOC:
459                      {
460                         strcpy(message,"EVENT_DL_PAGING_ALLOC");
461                         break;
462                      }
463                   case EVENT_UE_DELETE_RSP_TO_MAC:
464                      {
465                         strcpy(message,"EVENT_UE_DELETE_RSP_TO_MAC");
466                         break;
467                      }
468                   case EVENT_CELL_DELETE_RSP_TO_MAC:
469                      {
470                         strcpy(message,"EVENT_CELL_DELETE_RSP_TO_MAC");
471                         break;
472                      }
473                   case EVENT_DL_REL_HQ_PROC:
474                      {
475                         strcpy(message,"EVENT_DL_REL_HQ_PROC");
476                         break;
477                      }
478                   case EVENT_STATISTICS_RSP_TO_MAC:
479                      {
480                         strcpy(message,"EVENT_STATISTICS_RSP_TO_MAC");
481                         break;
482                      }
483                   case EVENT_STATISTICS_IND_TO_MAC:
484                      {
485                         strcpy(message,"EVENT_STATISTICS_IND_TO_MAC");
486                         break;
487                      }
488                   default:
489                      strcpy(message,"Invalid Event");
490                      break;
491                }
492             }
493             break;
494          }
495       default:
496          {
497             strcpy(sourceTask,"Invalid Source Entity Id");
498             break;
499          }
500    }
501    DU_LOG("\nCall Flow: %s -> %s : %s\n", sourceTask, destTask, message);
502 }
503 #endif
504
505 \f
506 /**
507  * @brief Task Activation callback function. 
508  *
509  * @details
510  *
511  *     Function : macActvTsk
512  *     
513  *     Primitives invoked by MAC's users/providers through
514  *     a loosely coupled interface arrive here by means of 
515  *     SSI's message handling. This API is registered with
516  *     SSI during the Task Registration of MAC.
517  *     
518  *  @param[in]  Pst     *pst, Post structure of the primitive.     
519  *  @param[in]  Buffer *mBuf, Packed primitive parameters in the buffer.
520  *  @param[in]  Reason reason.
521  *  @return  uint8_t
522  *      -# ROK
523  **/
524 uint8_t macActvTsk(Pst *pst, Buffer *mBuf)
525 {
526
527 #ifdef CALL_FLOW_DEBUG_LOG
528    callFlowMacActvTsk(pst);
529 #endif
530
531    switch(pst->srcEnt)
532    {
533       case ENTDUAPP:
534          MacHdlDuappEvents(pst, mBuf);
535          break;
536       case ENTRLC:
537          MacHdlRlcEvents(pst, mBuf);
538          break;
539       case ENTLWRMAC:
540          MacHdlLwrMacEvents(pst, mBuf);
541          break;
542       default:
543          RG_FREE_MSG(mBuf);
544          break;
545    }
546    ODU_EXIT_TASK();
547    return ROK;
548 }/* end of MacActvTsk */
549
550 /**
551  * @brief Callback function for events from entity SCH
552  *
553  * @details
554  *
555  *     Function :MacMessageRouter
556  *     
557  *     Process Messages received from Entity SCH
558  *     
559  *  @param[in]  Pst     *pst, Post structure of the primitive.     
560  *  @param[in]  Buffer *mBuf, Packed primitive parameters in the buffer.
561  *  @param[in]  Reason reason.
562  *  @return  void
563  **/
564 uint8_t MacMessageRouter(Pst *pst, void *msg)
565 {
566 #ifdef CALL_FLOW_DEBUG_LOG
567    callFlowMacActvTsk(pst);
568 #endif
569
570    switch(pst->event)
571    {
572       case EVENT_SLICE_CFG_RSP_TO_MAC:
573          {
574             MacProcSchSliceCfgRsp(pst, (SchSliceCfgRsp *)msg);
575             break;
576          }
577       case EVENT_SLICE_RECFG_RSP_TO_MAC:
578          {
579             MacProcSchSliceRecfgRsp(pst, (SchSliceRecfgRsp *)msg);
580             break;
581          }
582       case EVENT_SCH_CELL_CFG_CFM:
583          {
584             MacProcSchCellCfgCfm(pst, (SchCellCfgCfm *)msg);
585             break;
586          }
587       case EVENT_UE_CONFIG_RSP_TO_MAC:
588          {
589             MacProcSchUeCfgRsp(pst, (SchUeCfgRsp *)msg);
590             break;
591          }
592       case EVENT_UE_RECONFIG_RSP_TO_MAC:
593          {
594             MacProcSchUeRecfgRsp(pst, (SchUeRecfgRsp *)msg);
595             break;
596          }
597       case EVENT_DL_SCH_INFO:
598          {
599             MacProcDlAlloc(pst, (DlSchedInfo *)msg);
600             break;
601          }
602       case EVENT_UL_SCH_INFO:
603          {
604             MacProcUlSchInfo(pst, (UlSchedInfo *)msg);
605             break;
606          }
607       case EVENT_RACH_RESOURCE_RESPONSE_TO_MAC:
608          {
609             MacProcSchRachRsrcRsp(pst, (SchRachRsrcRsp *)msg);
610             break;
611          }
612       case EVENT_DL_PAGING_ALLOC:
613          {
614             MacProcDlPageAlloc(pst, (DlPageAlloc *)msg);
615             break;
616          }
617       case EVENT_UE_DELETE_RSP_TO_MAC:
618          {
619             MacProcSchUeDeleteRsp(pst, (SchUeDeleteRsp *)msg);
620             break;
621          }
622       case EVENT_CELL_DELETE_RSP_TO_MAC:
623          {
624             MacProcSchCellDeleteRsp(pst, (SchCellDeleteRsp *)msg);
625             break;
626          }
627       case EVENT_DL_REL_HQ_PROC: 
628          {
629             MacSchReleaseDlHarqProc(pst, (SchRlsHqInfo *)msg);
630             break;
631          }
632       case EVENT_STATISTICS_RSP_TO_MAC:
633          {
634             MacProcSchStatsRsp(pst, (SchStatsRsp *)msg);
635             break;
636          }
637       case EVENT_STATISTICS_IND_TO_MAC:
638          {
639             MacProcSchStatsInd(pst, (SchStatsInd *)msg);
640             break;
641          }
642       default:
643          {
644             return RFAILED;
645          }
646    }
647    return ROK;
648 }
649
650 \f
651 /**********************************************************************
652  
653          End of file
654 **********************************************************************/