From f6e03218606982adc3f58273534ca8f2fb08ec6f Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 9 Jul 2021 16:55:23 +0200 Subject: [PATCH] hack: do not use BCH RBs for DL scheduling in subframe 0 The problem is that when using those RBs with MCS 28 we may exceed the code rate 0.93 and according to 36.213 7.1.7 the UE may skip decoding PDSCH entirely in this case. This is a hack. The real solution is to check that the code rate is below 0.93 for each scheduling decision and, I don't know, reduce the MCS if the code rate is above, so that in the end it is below. That means that we need a proper resource grid for the configuration of the eNB and this is not an easy thing (at least from my point of view) given all the possible configurations for the eNB, so I prefer not to do it rather than do something incorrect, thus this hack. The problem of this hack is that we won't use all the available RBs for scheduling, potentially reducing the maximum throughput achievable. To be fixed properly at some time, by someone who understands fully the resource grid and all the possible combinations (fdd/tdd, number of antennas, whatever else). --- openair2/LAYER2/MAC/eNB_scheduler.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index 4e063d2207..ea7b5a9a81 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -586,6 +586,23 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, memset(cc[CC_id].vrb_map_UL, 0, 100); cc[CC_id].mcch_active = 0; clear_nfapi_information(RC.mac[module_idP], CC_id, frameP, subframeP); + + /* hack: skip BCH RBs in subframe 0 for DL scheduling, + * because with high MCS we may exceed code rate 0.93 + * when using those RBs (36.213 7.1.7 says the UE may + * skip decoding if the code rate is higher than 0.93) + * TODO: remove this hack, deal with physical bits properly + * i.e. reduce MCS in the scheduler if code rate > 0.93 + */ + if (subframeP == 0) { + int i; + int bw = cc[CC_id].mib->message.dl_Bandwidth; + /* start and count defined for RBs: 6, 15, 25, 50, 75, 100 */ + int start[6] = { 0, 4, 9, 22, 34, 47 }; + int count[6] = { 6, 7, 7, 6, 7, 6 }; + for (i = 0; i < count[bw]; i++) + cc[CC_id].vrb_map[start[bw] + i] = 1; + } } /* Refresh UE list based on UEs dropped by PHY in previous subframe */