From 4070a3affa6c7a63f683955f0f581affb36bbdff Mon Sep 17 00:00:00 2001
From: Raymond Knopp <florian.kaltenberger@eurecom.fr>
Date: Tue, 10 May 2016 19:34:36 +0200
Subject: [PATCH] fixed CCE allocation bug.

---
 openair1/SCHED/phy_mac_stub.c                 |  7 +++---
 openair1/SCHED/phy_procedures_lte_eNb.c       | 14 +++++------
 openair2/LAYER2/MAC/defs.h                    |  2 +-
 openair2/LAYER2/MAC/eNB_scheduler.c           | 23 +++++++++++++++++--
 openair2/LAYER2/MAC/eNB_scheduler_RA.c        |  2 ++
 .../LAYER2/MAC/eNB_scheduler_primitives.c     | 14 ++++++-----
 .../CONF/enb.band7.tm1.50PRB.usrpb210.conf    |  8 +++----
 7 files changed, 47 insertions(+), 23 deletions(-)

diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c
index 286b11b4ad..3620b8bf27 100644
--- a/openair1/SCHED/phy_mac_stub.c
+++ b/openair1/SCHED/phy_mac_stub.c
@@ -571,12 +571,13 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
       break;*/
   }
 
+  /*
   DCI_pdu->nCCE = 0;
 
   for (i=0; i<DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci; i++) {
     DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
   }
-
+  */
 }
 
 void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB)
@@ -744,11 +745,11 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN
   default:
     break;
   }
-
+  /*
   DCI_pdu->nCCE = 0;
 
   for (i=0; i<DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci; i++) {
     DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
   }
-
+  */
 }
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 6a785ebf33..161e2e5c58 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -1,3 +1,4 @@
+
 /*******************************************************************************
     OpenAirInterface
     Copyright(c) 1999 - 2014 Eurecom
@@ -965,7 +966,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
   num_pdcch_symbols = DCI_pdu->num_pdcch_symbols;
 
-  LOG_D(PHY,"num_pdcch_symbols %"PRIu8", nCCE %u (dci commond %"PRIu8", dci uespec %"PRIu8"\n",num_pdcch_symbols,DCI_pdu->nCCE,
+  LOG_D(PHY,"num_pdcch_symbols %"PRIu8",(dci common %"PRIu8", dci uespec %"PRIu8"\n",num_pdcch_symbols,
         DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
 
 #if defined(SMBV) && !defined(EXMIMO)
@@ -1008,7 +1009,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
       phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE;
 
       LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI)  => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
-	    phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe],DCI_pdu->nCCE);
+	    phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe],DCI_pdu->dci_alloc[i].firstCCE);
       
 #if defined(SMBV) && !defined(EXMIMO)
 
@@ -1039,8 +1040,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
       phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE;
 
-      LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA)  => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
-	    phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe],DCI_pdu->nCCE);
+      LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA)  => %"PRIu8"/%u (num_pdcch_symbols %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
+	    phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe],get_nCCE_mac(phy_vars_eNB->Mod_id,phy_vars_eNB->CC_id,num_pdcch_symbols,subframe),num_pdcch_symbols);
 #if defined(SMBV) && !defined(EXMIMO)
 
       // configure RA DCI
@@ -1094,7 +1095,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
         phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE;
 
 	LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16")  => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
-	      DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe],DCI_pdu->nCCE);
+	      DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe],DCI_pdu->dci_alloc[i].firstCCE);
 
 #if defined(SMBV) && !defined(EXMIMO)
 	
@@ -1177,7 +1178,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
       LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d/%u\n",
 	    phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->dci_alloc[i].rnti,
-	    DCI_pdu->dci_alloc[i].firstCCE,DCI_pdu->nCCE);
+	    DCI_pdu->dci_alloc[i].firstCCE,DCI_pdu->dci_alloc[i].firstCCE);
       
 #if defined(SMBV) && !defined(EXMIMO)
 
@@ -1218,7 +1219,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
       LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,
             DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
 
-
     num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci,
                                          DCI_pdu->Num_common_dci,
                                          DCI_pdu->dci_alloc,
diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h
index 48d958f54d..bf166f6d64 100644
--- a/openair2/LAYER2/MAC/defs.h
+++ b/openair2/LAYER2/MAC/defs.h
@@ -251,7 +251,7 @@ typedef struct {
 typedef struct {
   uint8_t Num_ue_spec_dci ;
   uint8_t Num_common_dci  ;
-  uint32_t nCCE;
+  //  uint32_t nCCE;
   uint32_t num_pdcch_symbols;
   DCI_ALLOC_t dci_alloc[NUM_DCI_MAX] ;
 } DCI_PDU;
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index 30272346f5..a6c4eaeb16 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -108,8 +108,6 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
 
   for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
     DCI_pdu[CC_id] = &eNB_mac_inst[module_idP].common_channels[CC_id].DCI_pdu;
-    DCI_pdu[CC_id]->nCCE=0;
-    DCI_pdu[CC_id]->num_pdcch_symbols=1;
     mbsfn_status[CC_id]=0;
     // clear vrb_map
     memset(eNB_mac_inst[module_idP].common_channels[CC_id].vrb_map,0,100);
@@ -661,7 +659,28 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
   for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++)
     allocate_CCEs(module_idP,CC_id,subframeP,0);
 
+  /*
+  int dummy=0;
+  for (i=0;
+       i<DCI_pdu[CC_id]->Num_common_dci+DCI_pdu[CC_id]->Num_ue_spec_dci;
+       i++)
+    if (DCI_pdu[CC_id]->dci_alloc[i].rnti==2)
+      dummy=1;
+	
+  if (dummy==1)
+    for (i=0;
+	 i<DCI_pdu[CC_id]->Num_common_dci+DCI_pdu[CC_id]->Num_ue_spec_dci;
+	 i++)
+      LOG_I(MAC,"Frame %d, subframe %d: DCI %d/%d, format %d, rnti %x, NCCE %d(num_pdcch_symb %d)\n",
+	    frameP,subframeP,i,DCI_pdu[CC_id]->Num_common_dci+DCI_pdu[CC_id]->Num_ue_spec_dci,
+	    DCI_pdu[CC_id]->dci_alloc[i].format,
+	    DCI_pdu[CC_id]->dci_alloc[i].rnti,
+	    DCI_pdu[CC_id]->dci_alloc[i].firstCCE,
+	    DCI_pdu[CC_id]->num_pdcch_symbols);
+
+
   LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP);
+  */
 
   stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT);
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
index 96ec0fd5e1..3f9872a590 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
@@ -251,6 +251,8 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
           }
 
 	  if (!CCE_allocation_infeasible(module_idP,CC_id,1,subframeP,2,RA_template->RA_rnti)) {
+	    LOG_D(MAC,"Frame %d: Subframe %d : Adding common DCI for RA_RNTI %x\n",
+                  frameP,subframeP,RA_template->RA_rnti);
 	    add_common_dci(DCI_pdu,
 			   (void*)&RA_template->RA_alloc_pdu1[0],
 			   RA_template->RA_rnti,
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
index a76763cbb1..ece06a5e09 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
@@ -993,17 +993,19 @@ int allocate_CCEs(int module_idP,
 
   int *CCE_table = eNB_mac_inst[module_idP].CCE_table[CC_idP];
   DCI_PDU *DCI_pdu = &eNB_mac_inst[module_idP].common_channels[CC_idP].DCI_pdu;
-  int nCCE_max = mac_xface->get_nCCE_max(module_idP,CC_idP,DCI_pdu->num_pdcch_symbols,subframeP);
+  int nCCE_max = mac_xface->get_nCCE_max(module_idP,CC_idP,1,subframeP);
   int fCCE;
   int i,j;
   int allocation_is_feasible = 1;
   DCI_ALLOC_t *dci_alloc;
+  int nCCE=0;
 
   LOG_D(MAC,"Allocate CCEs subframe %d, test %d : (common %d,uspec %d)\n",subframeP,test_onlyP,DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
+  DCI_pdu->num_pdcch_symbols=1;
 
   while (allocation_is_feasible == 1) {
     init_CCE_table(module_idP,CC_idP);
-    DCI_pdu->nCCE=0;
+    nCCE=0;
 
     for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci;i++) {
       dci_alloc = &DCI_pdu->dci_alloc[i];
@@ -1011,9 +1013,9 @@ int allocate_CCEs(int module_idP,
 	    i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci,
 	    DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci,
 	    dci_alloc->rnti,1<<dci_alloc->L,
-	    DCI_pdu->nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols);
+	    nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols);
 
-      if (DCI_pdu->nCCE + (1<<dci_alloc->L) > nCCE_max) {
+      if (nCCE + (1<<dci_alloc->L) > nCCE_max) {
 	if (DCI_pdu->num_pdcch_symbols == 3)
 	  allocation_is_feasible = 0;
 	else {
@@ -1032,7 +1034,7 @@ int allocate_CCEs(int module_idP,
 
 	  LOG_D(MAC,"Allocating at nCCE %d\n",fCCE);
 	  if (test_onlyP == 0) {
-	    DCI_pdu->nCCE += (1<<dci_alloc->L);
+	    nCCE += (1<<dci_alloc->L);
 	    dci_alloc->firstCCE=fCCE;
 	    LOG_D(MAC,"Allocate CCEs subframe %d, test %d\n",subframeP,test_onlyP);
 	  }
@@ -1049,7 +1051,7 @@ int allocate_CCEs(int module_idP,
 		    DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci,
 		    DCI_pdu->dci_alloc[j].rnti,DCI_pdu->dci_alloc[j].format,
 		    1<<DCI_pdu->dci_alloc[j].L,
-		    DCI_pdu->nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols);
+		    nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols);
 	    }
 	  }
 	  else {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf
index d5d1f0d78a..1ae8c45083 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf
@@ -130,7 +130,7 @@ eNBs =
     };
 
     ////////// MME parameters:
-    mme_ip_address      = ( { ipv4       = "192.168.12.11";
+    mme_ip_address      = ( { ipv4       = "127.0.0.3";
                               ipv6       = "192:168:30::17";
                               active     = "yes";
                               preference = "ipv4";
@@ -139,11 +139,11 @@ eNBs =
 
     NETWORK_INTERFACES :
     {
-        ENB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.12.213/24";
+        ENB_INTERFACE_NAME_FOR_S1_MME            = "lo";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "127.0.0.2/24";
 
         ENB_INTERFACE_NAME_FOR_S1U               = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.12.213/24";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "127.0.0.4/24";
         ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
     };
 
-- 
GitLab