From c641f334bb4114a9c79d20170aedeae5da2133b0 Mon Sep 17 00:00:00 2001
From: Wu Jing <wu.jing@cn.fujitsu.com>
Date: Mon, 12 Feb 2018 18:38:26 +0900
Subject: [PATCH] fix total usable RBs when pucch rb=6

---
 openair2/ENB_APP/enb_config.c             |  4 +-
 openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 11 +++++
 openair2/LAYER2/MAC/pre_processor.c       | 52 ++++++++++++++++++-----
 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c    |  2 +-
 4 files changed, 55 insertions(+), 14 deletions(-)

diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index 09e00a8f6b..c87421a2c0 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -876,9 +876,9 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
           AssertFatal (0,
               "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_freq_offset choice: 2(N_RB_DL %d)!\n",
               RC.config_file_name, i, prach_freq_offset,N_RB_DL);
-        if (((N_RB_DL == 50) || (N_RB_DL == 100)) && (prach_freq_offset != 3))
+        if (((N_RB_DL == 50) || (N_RB_DL == 100)) && (prach_freq_offset < 3))
           AssertFatal (0,
-              "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_freq_offset choice: 3(N_RB_DL %d)!\n",
+              "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_freq_offset choice: 3,4(N_RB_DL %d)!\n",
               RC.config_file_name, i, prach_freq_offset,N_RB_DL);
 #endif
 	      
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index db9025b258..bc15372823 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -1710,6 +1710,7 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
       hi_dci0_req = &eNB->HI_DCI0_req[CC_id][subframeP].hi_dci0_request_body;
       eNB->HI_DCI0_req[CC_id][subframeP].sfn_sf = (frameP<<4)+subframeP;
       ul_req_tmp = &eNB->UL_req_tmp[CC_id][sched_subframeP].ul_config_request_body;
+      nfapi_ul_config_request_t *ul_req  = &eNB->UL_req_tmp[CC_id][sched_subframeP];
 
     ULSCH_first_end = 0;
     cc  = &eNB->common_channels[CC_id];
@@ -1959,6 +1960,12 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
 #endif
             ul_req_tmp->number_of_pdus++;
             eNB->ul_handle++;
+            ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST;
+            ul_req_tmp->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG;
+            uint16_t ul_sched_frame = sched_frame;
+            uint16_t ul_sched_subframeP = sched_subframeP;
+            add_subframe(&ul_sched_frame, &ul_sched_subframeP, 2);
+            ul_req->sfn_sf = ul_sched_frame<<4|ul_sched_subframeP;
 
             add_ue_ulsch_info(module_idP,
                               CC_id,
@@ -2096,6 +2103,10 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
 #endif
               ul_req_tmp->number_of_pdus++;
               eNB->ul_handle++;
+            ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST;
+            ul_req_tmp->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG;
+            ul_req->sfn_sf = sched_frame<<4|sched_subframeP;
+
               LOG_D(MAC,"[eNB %d] CC_id %d Frame %d, subframeP %d: Generated ULSCH DCI for next UE_id %d, format 0(round >0)\n", module_idP,CC_id,frameP,subframeP,UE_id);
 
               // increment first rb for next UE allocation
diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c
index b16ee172fd..af34a1774b 100644
--- a/openair2/LAYER2/MAC/pre_processor.c
+++ b/openair2/LAYER2/MAC/pre_processor.c
@@ -2700,6 +2700,7 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
   int16_t            tx_power;
   int                UE_id;
   rnti_t             rnti;
+  COMMON_channels_t *cc;
   LOG_D(MAC,"In ulsch_preprocessor: ulsch ue select\n");
   //ue select
   ulsch_scheduler_pre_ue_select(module_idP,frameP,subframeP,sched_subframeP,ulsch_ue_select);
@@ -2730,22 +2731,51 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
       }
 
       rnti = UE_RNTI(CC_id,UE_id);
-      if(frame_parms->N_RB_UL == 25){
-        if ( first_rb[CC_id] >= frame_parms->N_RB_UL-1 ){
-            LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
-                   module_idP,frameP,subframeP,UE_id,rnti,CC_id);
-          break;
+      cc = &RC.mac[module_idP]->common_channels[CC_id];
+      if (cc->tdd_Config) {
+        if (frame_parms->N_RB_UL == 25) {
+         if (first_rb[CC_id] >= frame_parms->N_RB_UL-1 ) {
+           LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
+                      module_idP,frameP,subframeP,UE_id,rnti,CC_id);
+           break;
         }
+         // calculate the average rb ( remain UE)
+         total_rbs = frame_parms->N_RB_UL-1-first_rb[CC_id];
+       } else if (frame_parms->N_RB_UL == 50) {
+         if (first_rb[CC_id] >= frame_parms->N_RB_UL-2 ) {
+           LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
+                      module_idP,frameP,subframeP,UE_id,rnti,CC_id);
+           break;
+         }
         // calculate the average rb ( remain UE)
-        total_rbs = frame_parms->N_RB_UL-1-first_rb[CC_id];
-      }else{
-        if ( first_rb[CC_id] >= frame_parms->N_RB_UL-2 ){
+         total_rbs = frame_parms->N_RB_UL-2-first_rb[CC_id];
+       } else {
+         if (first_rb[CC_id] >= frame_parms->N_RB_UL-3 ) {
+           LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
+                     module_idP,frameP,subframeP,UE_id,rnti,CC_id);
+           break;
+         }
+         // calculate the average rb ( remain UE)
+         total_rbs = frame_parms->N_RB_UL-3-first_rb[CC_id];
+       }
+      } else {
+        if(frame_parms->N_RB_UL == 25){
+          if ( first_rb[CC_id] >= frame_parms->N_RB_UL-1 ){
             LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
                    module_idP,frameP,subframeP,UE_id,rnti,CC_id);
-          break;
+            break;
+          }
+          // calculate the average rb ( remain UE)
+          total_rbs = frame_parms->N_RB_UL-1-first_rb[CC_id];
+        }else{
+          if ( first_rb[CC_id] >= frame_parms->N_RB_UL-2 ){
+            LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
+                   module_idP,frameP,subframeP,UE_id,rnti,CC_id);
+            break;
+          }
+          // calculate the average rb ( remain UE)
+          total_rbs = frame_parms->N_RB_UL-2-first_rb[CC_id];
         }
-        // calculate the average rb ( remain UE)
-        total_rbs = frame_parms->N_RB_UL-2-first_rb[CC_id];
       }
       average_rbs = (int)round((double)total_rbs/(double)ue_num_temp);
       if ( average_rbs < 3 ) {
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
index 881c7b14cc..318ec64d02 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
@@ -550,7 +550,7 @@ rlc_am_mac_status_indication (
   }
 
   rlc->last_absolute_subframe_status_indication = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP);
-
+  if (tb_sizeP > 0)
   rlc->nb_bytes_requested_by_mac = tb_sizeP;
 
   status_resp.buffer_occupancy_in_bytes = rlc_am_get_buffer_occupancy_in_bytes(ctxt_pP, rlc);
-- 
2.26.2