From 61bff80ccb57aa5a3fc6386160d59fdede2c1ba8 Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Sun, 14 Feb 2016 14:32:11 -0800
Subject: [PATCH] added UL failure indication to PHY/MAC/RRC eNodeB procedures.

---
 cmake_targets/CMakeLists.txt                  |   4 +-
 openair1/SCHED/phy_procedures_lte_eNb.c       |  12 ++-
 openair1/SCHED/phy_procedures_lte_ue.c        |   6 +-
 openair2/LAYER2/MAC/defs.h                    |   2 +
 openair2/LAYER2/MAC/eNB_scheduler.c           | 100 +++++++++++++++++-
 .../LAYER2/MAC/eNB_scheduler_primitives.c     |  47 +++++---
 openair2/LAYER2/MAC/eNB_scheduler_ulsch.c     |   5 +-
 openair2/LAYER2/MAC/main.c                    |   5 +-
 openair2/LAYER2/MAC/proto.h                   |   9 ++
 openair2/LAYER2/PDCP_v10.1.0/pdcp.c           |   8 +-
 openair2/PHY_INTERFACE/defs.h                 |   3 +-
 .../L2_INTERFACE/openair_rrc_L2_interface.c   |   8 +-
 openair2/RRC/LITE/L2_interface.c              |  27 +++--
 openair2/RRC/LITE/proto.h                     |  28 +++--
 openair2/RRC/LITE/rrc_UE.c                    |  84 +++++++--------
 openair2/RRC/LITE/rrc_common.c                |   2 +-
 openair2/RRC/LITE/rrc_eNB.c                   |  90 ++++++++--------
 openair2/RRC/LITE/rrc_eNB_S1AP.c              |  18 ++--
 18 files changed, 305 insertions(+), 153 deletions(-)

diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index f52a3c465f..7907d68f45 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -940,8 +940,8 @@ set (ENB_APP_SRC
 add_library(L2
   ${L2_SRC}
   ${MAC_SRC}
-  ${ENB_APP_SRC}
-  ${OPENAIR2_DIR}/RRC/L2_INTERFACE/openair_rrc_L2_interface.c)
+  ${ENB_APP_SRC})
+#  ${OPENAIR2_DIR}/RRC/L2_INTERFACE/openair_rrc_L2_interface.c)
 
 # L3 Libs
 ##########################
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index d54e6856f3..a7796a9b69 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -1342,13 +1342,21 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
     // If we've dropped the UE, go back to PRACH mode for this UE
     //#if !defined(EXMIMO_IOT)
     if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) {
-      LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, removing UE\n",
+      LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, triggering UL Failure\n",
             phy_vars_eNB->Mod_id,phy_vars_eNB->CC_id,frame,subframe, i, phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors);
+      /*
       phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
       remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
+      */
       phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0;
+      mac_xface->UL_failure_indication(phy_vars_eNB->Mod_id,
+				       phy_vars_eNB->CC_id,
+				       frame,
+				       phy_vars_eNB->eNB_UE_stats[i].crnti,
+				       subframe);
+				       
     }
-
+	
     //#endif
   }
 
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index bc84beae43..ef93068fb4 100755
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -2676,7 +2676,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
           if (ret == (1+phy_vars_ue->dlsch_ue[eNB_id][0]->max_turbo_iterations)) {
             phy_vars_ue->dlsch_errors[eNB_id]++;
 
-	    //#ifdef DEBUG_PHY_PROC
+#ifdef DEBUG_PHY_PROC
             LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n",
                   phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
                   harq_pid,frame_rx,subframe_prev,
@@ -2686,8 +2686,8 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
 
             //      if (abstraction_flag ==0 )
             dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid);
-            mac_xface->macphy_exit("");
-	    //#endif
+            mac_xface->macphy_exit("DLSCH in error");
+#endif
           } else {
             LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n",
                   phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h
index 7a48413b7a..493ecece78 100644
--- a/openair2/LAYER2/MAC/defs.h
+++ b/openair2/LAYER2/MAC/defs.h
@@ -740,6 +740,8 @@ typedef struct {
   int16_t       ta_update;
   int32_t       context_active_timer;
   int32_t       ul_inactivity_timer;
+  int32_t       ul_failure_timer;
+  int32_t       ra_pdcch_order_sent;
 } UE_sched_ctrl;
 /*! \brief eNB template for the Random access information */
 typedef struct {
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index d603ad4237..d5de3bbae6 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -90,7 +90,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
 #endif
 #if defined(ENABLE_ITTI)
   MessageDef   *msg_p;
-  const char   *msg_name;
+  const char         *msg_name;
   instance_t    instance;
   int           result;
 #endif
@@ -98,6 +98,9 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
   int CC_id,i,next_i;
   UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list;
   rnti_t rnti;
+  int ra_pdcch_sent=0;
+  void         *DLSCH_dci=NULL;
+  int size_bits,size_bytes;
 
   LOG_D(MAC,"[eNB %d] Frame %d, Subframe %d, entering MAC scheduler (UE_list->head %d)\n",module_idP, frameP, subframeP,UE_list->head);
 
@@ -129,6 +132,101 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
     if (mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti)==NULL) {
       mac_remove_ue(module_idP, i, frameP, subframeP);
     }
+    else {
+      // check uplink failure
+      if (UE_list->UE_sched_ctrl[i].ul_failure_timer>0) {
+	LOG_I(MAC,"UE %d rnti %x: UL Failure timer %d \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);
+	if (UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent == 0) {
+	  if (ra_pdcch_sent==0) {
+	    UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent=1;
+	    ra_pdcch_sent=1;
+	    
+	    // add a format 1A dci for this UE to request an RA procedure (only one UE per subframe)
+	    LOG_I(MAC,"UE %d rnti %x: sending PDCCH order for RAPROC  \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);	    
+	    DLSCH_dci = (void *)UE_list->UE_template[CC_id][i].DLSCH_DCI[0];
+	    *(uint32_t*)DLSCH_dci = 0;
+	    if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
+	      switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
+	      case 6:
+		((DCI1A_1_5MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
+		((DCI1A_1_5MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 31;
+		size_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
+		size_bits  = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
+		break;
+	      case 25:
+		((DCI1A_5MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
+		((DCI1A_5MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 511;
+		size_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
+		size_bits  = sizeof_DCI1A_5MHz_TDD_1_6_t;
+		break;
+	      case 50:
+		((DCI1A_10MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
+		((DCI1A_10MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 2047;
+		size_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
+		size_bits  = sizeof_DCI1A_10MHz_TDD_1_6_t;
+		break;
+	      case 100:
+		((DCI1A_20MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
+		((DCI1A_20MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 8191;
+		size_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t);
+		size_bits  = sizeof_DCI1A_20MHz_TDD_1_6_t;
+		break;
+	      }
+	    }
+	    else { // FDD
+	      switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
+	      case 6:
+		((DCI1A_1_5MHz_FDD_t*)DLSCH_dci)->type = 1;
+		((DCI1A_1_5MHz_FDD_t*)DLSCH_dci)->rballoc = 31;
+		size_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
+		size_bits  = sizeof_DCI1A_1_5MHz_FDD_t;
+		break;
+	      case 25:
+		((DCI1A_5MHz_FDD_t*)DLSCH_dci)->type = 1;
+		((DCI1A_5MHz_FDD_t*)DLSCH_dci)->rballoc = 511;
+		size_bytes = sizeof(DCI1A_5MHz_FDD_t);
+		size_bits  = sizeof_DCI1A_5MHz_FDD_t;
+		break;
+	      case 50:
+		((DCI1A_10MHz_FDD_t*)DLSCH_dci)->type = 1;
+		((DCI1A_10MHz_FDD_t*)DLSCH_dci)->rballoc = 2047;
+		size_bytes = sizeof(DCI1A_10MHz_FDD_t);
+		size_bits  = sizeof_DCI1A_10MHz_FDD_t;
+		break;
+	      case 100:
+		((DCI1A_20MHz_FDD_t*)DLSCH_dci)->type = 1;
+		((DCI1A_20MHz_FDD_t*)DLSCH_dci)->rballoc = 8191;
+		size_bytes = sizeof(DCI1A_20MHz_FDD_t);
+		size_bits  = sizeof_DCI1A_20MHz_FDD_t;
+		break;
+	      }
+	    }
+
+	    add_ue_spec_dci(DCI_pdu[CC_id],
+			    DLSCH_dci,
+			    rnti,
+			    size_bytes,
+			    process_ue_cqi (module_idP,i),//aggregation,
+			    size_bits,
+			    format1A,
+			    0);
+	  }
+	  else { // ra_pdcch_sent==1
+	    if ((UE_list->UE_sched_ctrl[i].ul_failure_timer % 40) == 0)
+	      UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent=0; // resend every 4 frames	      
+	  }
+	}
+	UE_list->UE_sched_ctrl[i].ul_failure_timer++;
+	// check threshold
+	if (UE_list->UE_sched_ctrl[i].ul_failure_timer > 200) {
+	  // inform RRC of failure and clear timer
+	  LOG_I(MAC,"UE %d rnti %x: UL Failure Triggering RRC \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);
+	  mac_eNB_rrc_ul_failure(module_idP,CC_id,frameP,subframeP,rnti);
+	  UE_list->UE_sched_ctrl[i].ul_failure_timer=0;
+	}
+      } // ul_failure_timer>0
+
+    }
     i = next_i;
   }
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
index 35ffe3b561..8c8eeff148 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
@@ -530,22 +530,9 @@ void swap_UEs(UE_list_t *listP,int nodeiP, int nodejP, int ul_flag)
   dump_ue_list(listP,ul_flag);
 }
 
-void SR_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, rnti_t rntiP, sub_frame_t subframeP)
-{
 
-  int UE_id = find_UE_id(mod_idP, rntiP);
-  UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list;
 
-  if (UE_id  != -1) {
-    LOG_D(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP);
-    UE_list->UE_template[cc_idP][UE_id].ul_SR = 1;
-    UE_list->UE_template[cc_idP][UE_id].ul_active = TRUE;
-  } else {
-    //     AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP);
-    //    AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP);
-    LOG_D(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d (unknown UEid) on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP);
-  }
-}
+
 
 
 
@@ -1108,3 +1095,35 @@ boolean_t CCE_allocation_infeasible(int module_idP,
   return(res);
 }
 
+void SR_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, rnti_t rntiP, sub_frame_t subframeP)
+{
+ 
+  int UE_id = find_UE_id(mod_idP, rntiP);
+  UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list;
+ 
+  if (UE_id  != -1) {
+    LOG_D(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP);
+    UE_list->UE_template[cc_idP][UE_id].ul_SR = 1;
+    UE_list->UE_template[cc_idP][UE_id].ul_active = TRUE;
+  } else {
+    //     AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP);
+    //    AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP);
+    LOG_D(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d (unknown UEid) on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP);
+  }
+}
+
+void UL_failure_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, rnti_t rntiP, sub_frame_t subframeP)
+{
+
+  int UE_id = find_UE_id(mod_idP, rntiP);
+  UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list;
+
+  if (UE_id  != -1) {
+    LOG_I(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling UL Failure for UE %d on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP);
+    UE_list->UE_sched_ctrl[UE_id].ul_failure_timer=1;
+  } else {
+    //     AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP);
+    //    AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP);
+    LOG_W(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling UL Failure for UE %d (unknown UEid) on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP);
+  }
+}
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index b929c71ff4..42f19cc2ae 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -106,9 +106,10 @@ void rx_sdu(
 
   LOG_D(MAC,"[eNB %d] CC_id %d Received ULSCH sdu from PHY (rnti %x, UE_id %d), parsing header\n",enb_mod_idP,CC_idP,rntiP,UE_id);
 
-  if (UE_id!=-1)
+  if (UE_id!=-1) {
     UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer=0;
-  
+    UE_list->UE_sched_ctrl[UE_id].ul_failure_timer=0;
+  }
   payload_ptr = parse_ulsch_header(sduP,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,sdu_lenP);
  
   eNB->eNB_stats[CC_idP].ulsch_bytes_rx=sdu_lenP;
diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c
index 0e8a65cf01..32cb3b1738 100644
--- a/openair2/LAYER2/MAC/main.c
+++ b/openair2/LAYER2/MAC/main.c
@@ -84,7 +84,7 @@ void dl_phy_sync_success(module_id_t   module_idP,
   } else
 #endif
   {
-    mac_in_sync_ind(module_idP,frameP,eNB_index);
+    rrc_in_sync_ind(module_idP,frameP,eNB_index);
   }
 
 }
@@ -382,7 +382,7 @@ int mac_init_global_param(void)
   //  mac_xface->macphy_data_ind=macphy_data_ind;
   mac_xface->mrbch_phy_sync_failure=mrbch_phy_sync_failure;
   mac_xface->dl_phy_sync_success=dl_phy_sync_success;
-  mac_xface->out_of_sync_ind=mac_out_of_sync_ind;
+  mac_xface->out_of_sync_ind=rrc_out_of_sync_ind;
 
   //  Mac_rlc_xface->macphy_exit=  mac_xface->macphy_exit;
   //  Mac_rlc_xface->frame = 0;
@@ -462,6 +462,7 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,ui
   mac_xface->initiate_ra_proc          = initiate_ra_proc;
   mac_xface->cancel_ra_proc            = cancel_ra_proc;
   mac_xface->SR_indication             = SR_indication;
+  mac_xface->UL_failure_indication     = UL_failure_indication;
   mac_xface->rx_sdu                    = rx_sdu;
   mac_xface->get_dlsch_sdu             = get_dlsch_sdu;
   mac_xface->get_eNB_UE_stats          = get_eNB_UE_stats;
diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h
index 9afe098d77..632d8c8360 100644
--- a/openair2/LAYER2/MAC/proto.h
+++ b/openair2/LAYER2/MAC/proto.h
@@ -269,6 +269,15 @@ void rx_sdu(const module_id_t module_idP, const int CC_id,const frame_t frameP,
 */
 void SR_indication(module_id_t module_idP,int CC_id,frame_t frameP,rnti_t rnti, sub_frame_t subframe);
 
+/* \brief Function to indicate a UL failure was detected by eNB PHY.
+@param Mod_id Instance ID of eNB
+@param CC_id Component carrier
+@param frameP Frame index
+@param rnti RNTI of UE transmitting the SR
+@param subframe Index of subframe where SR was received
+*/
+void UL_failure_indication(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,sub_frame_t subframe);
+
 uint8_t *get_dlsch_sdu(module_id_t module_idP,int CC_id,frame_t frameP,rnti_t rnti,uint8_t TBindex);
 
 /* \brief Function to retrieve MCH transport block and MCS used for MCH in this MBSFN subframe.  Returns null if no MCH is to be transmitted
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
index f25e921570..a612733e67 100755
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
@@ -636,10 +636,10 @@ pdcp_data_ind(
         PROTOCOL_PDCP_CTXT_FMT" DATA-IND len %u",
         PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p),
         sdu_buffer_sizeP - pdcp_header_len - pdcp_tailer_len);
-      pdcp_rrc_data_ind(ctxt_pP,
-                        rb_id,
-                        sdu_buffer_sizeP - pdcp_header_len - pdcp_tailer_len,
-                        (uint8_t*)&sdu_buffer_pP->data[pdcp_header_len]);
+      rrc_data_ind(ctxt_pP,
+		   rb_id,
+		   sdu_buffer_sizeP - pdcp_header_len - pdcp_tailer_len,
+		   (uint8_t*)&sdu_buffer_pP->data[pdcp_header_len]);
       free_mem_block(sdu_buffer_pP);
 
       // free_mem_block(new_sdu);
diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h
index 7b0367f537..194b085118 100755
--- a/openair2/PHY_INTERFACE/defs.h
+++ b/openair2/PHY_INTERFACE/defs.h
@@ -94,7 +94,8 @@ typedef struct {
 
   /// Indicate Scheduling Request from UE
   void (*SR_indication)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,sub_frame_t subframe);
-
+  /// Indicate UL Failure to eNodeB MAC
+  void (*UL_failure_indication)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,sub_frame_t subframe);
   /// Configure Common PHY parameters from SIB1
   void (*phy_config_sib1_eNB)(module_id_t Mod_id,int CC_id,
                               TDD_Config_t *tdd_config,
diff --git a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c
index 732d2aa54a..702433744d 100644
--- a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c
+++ b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c
@@ -155,10 +155,10 @@ rlcrrc_data_ind(
 )
 //------------------------------------------------------------------------------
 {
-  rrc_lite_data_ind(ctxt_pP,
-                    srb_idP,
-                    sdu_lenP,
-                    buffer_pP);
+  rrc_data_ind(ctxt_pP,
+	       srb_idP,
+	       sdu_lenP,
+	       buffer_pP);
 }
 
 //------------------------------------------------------------------------------
diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c
index 6a64095e92..cea9640275 100644
--- a/openair2/RRC/LITE/L2_interface.c
+++ b/openair2/RRC/LITE/L2_interface.c
@@ -67,7 +67,7 @@ mui_t mui=0;
 
 //------------------------------------------------------------------------------
 int8_t
-mac_rrc_lite_data_req(
+mac_rrc_data_req(
   const module_id_t Mod_idP,
   const int         CC_id,
   const frame_t     frameP,
@@ -98,7 +98,7 @@ mac_rrc_lite_data_req(
       // All even frames transmit SIB in SF 5
       if (eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB1 == 255) {
         LOG_E(RRC,"[eNB %d] MAC Request for SIB1 and SIB1 not initialized\n",Mod_idP);
-        mac_xface->macphy_exit("mac_rrc_lite_data_req:  MAC Request for SIB1 and SIB1 not initialized");
+        mac_xface->macphy_exit("mac_rrc_data_req:  MAC Request for SIB1 and SIB1 not initialized");
       }
 
       if ((frameP%2) == 0) {
@@ -337,7 +337,7 @@ mac_rrc_lite_data_req(
 
 //------------------------------------------------------------------------------
 int8_t
-mac_rrc_lite_data_ind(
+mac_rrc_data_ind(
   const module_id_t     module_idP,
   const int             CC_id,
   const frame_t         frameP,
@@ -505,14 +505,14 @@ mac_rrc_lite_data_ind(
 
 //-------------------------------------------------------------------------------------------//
 // this function is Not USED anymore
-void mac_lite_sync_ind(module_id_t Mod_idP,uint8_t Status)
+void mac_sync_ind(module_id_t Mod_idP,uint8_t Status)
 {
   //-------------------------------------------------------------------------------------------//
 }
 
 //------------------------------------------------------------------------------
 uint8_t
-rrc_lite_data_req(
+rrc_data_req(
   const protocol_ctxt_t*   const ctxt_pP,
   const rb_id_t                  rb_idP,
   const mui_t                    muiP,
@@ -582,7 +582,7 @@ rrc_lite_data_req(
 
 //------------------------------------------------------------------------------
 void
-rrc_lite_data_ind(
+rrc_data_ind(
   const protocol_ctxt_t* const ctxt_pP,
   const rb_id_t                Srb_id,
   const sdu_size_t             sdu_sizeP,
@@ -646,7 +646,7 @@ rrc_lite_data_ind(
 }
 
 //-------------------------------------------------------------------------------------------//
-void rrc_lite_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index)
+void rrc_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index)
 {
   //-------------------------------------------------------------------------------------------//
 #if defined(ENABLE_ITTI)
@@ -670,7 +670,7 @@ void rrc_lite_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_inde
 }
 
 //-------------------------------------------------------------------------------------------//
-void rrc_lite_out_of_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index)
+void rrc_out_of_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index)
 {
   //-------------------------------------------------------------------------------------------//
   LOG_I(RRC,"[UE %d] Frame %d: OUT OF SYNC FROM eNB %d (T310 active %d : T310 %d, N310 %d, N311 %d)\n ",
@@ -697,7 +697,7 @@ void rrc_lite_out_of_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_
 
 //------------------------------------------------------------------------------
 int
-mac_eNB_get_rrc_lite_status(
+mac_eNB_get_rrc_status(
   const module_id_t Mod_idP,
   const rnti_t      rntiP
 )
@@ -715,10 +715,17 @@ mac_eNB_get_rrc_lite_status(
   }
 }
 
+void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP, 
+			    const int CC_id, 
+			    const frame_t frameP,
+			    const sub_frame_t subframeP,
+			    const rnti_t rnti) {
 
+  return;
+}
 //------------------------------------------------------------------------------
 int
-mac_UE_get_rrc_lite_status(
+mac_UE_get_rrc_status(
   const module_id_t Mod_idP,
   const uint8_t     indexP
 )
diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h
index 5d77698c8e..cde0643ee1 100644
--- a/openair2/RRC/LITE/proto.h
+++ b/openair2/RRC/LITE/proto.h
@@ -44,15 +44,15 @@ int L3_xface_init(void);
 void openair_rrc_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active,uint8_t HO_enabled);
 #if defined(ENABLE_ITTI)
 char
-openair_rrc_lite_eNB_configuration(
+openair_rrc_eNB_configuration(
   const module_id_t enb_mod_idP,
   RrcConfigurationReq* configuration
 );
 #endif
-char openair_rrc_lite_eNB_init(
+char openair_rrc_eNB_init(
   const module_id_t module_idP);
 
-char openair_rrc_lite_ue_init(
+char openair_rrc_ue_init(
   const module_id_t module_idP,
   const uint8_t CH_IDX);
 void rrc_config_buffer(SRB_INFO *srb_info, uint8_t Lchan_type, uint8_t Role);
@@ -281,7 +281,7 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover(
 
 //L2_interface.c
 int8_t
-mac_rrc_lite_data_req(
+mac_rrc_data_req(
   const module_id_t Mod_idP,
   const int         CC_id,
   const frame_t     frameP,
@@ -294,7 +294,7 @@ mac_rrc_lite_data_req(
 );
 
 int8_t
-mac_rrc_lite_data_ind(
+mac_rrc_data_ind(
   const module_id_t     module_idP,
   const int         CC_id,
   const frame_t         frameP,
@@ -310,8 +310,14 @@ mac_rrc_lite_data_ind(
 
 void mac_sync_ind( module_id_t Mod_instP, uint8_t status);
 
+void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP, 
+			    const int CC_id, 
+			    const frame_t frameP,
+			    const sub_frame_t subframeP,
+			    const rnti_t rnti);
+
 uint8_t
-rrc_lite_data_req(
+rrc_data_req(
   const protocol_ctxt_t*   const ctxt_pP,
   const rb_id_t                  rb_idP,
   const mui_t                    muiP,
@@ -322,16 +328,16 @@ rrc_lite_data_req(
 );
 
 void
-rrc_lite_data_ind(
+rrc_data_ind(
   const protocol_ctxt_t* const ctxt_pP,
   const rb_id_t                Srb_id,
   const sdu_size_t             sdu_sizeP,
   const uint8_t*   const       buffer_pP
 );
 
-void rrc_lite_in_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t eNB_index);
+void rrc_in_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t eNB_index);
 
-void rrc_lite_out_of_sync_ind(module_id_t module_idP, frame_t frameP, unsigned short eNB_index);
+void rrc_out_of_sync_ind(module_id_t module_idP, frame_t frameP, unsigned short eNB_index);
 
 int decode_MCCH_Message( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index, const uint8_t* const Sdu, const uint8_t Sdu_len, const uint8_t mbsfn_sync_area );
 
@@ -356,13 +362,13 @@ ue_measurement_report_triggering(
 );
 
 int
-mac_eNB_get_rrc_lite_status(
+mac_eNB_get_rrc_status(
   const module_id_t Mod_idP,
   const rnti_t      rntiP
 );
 
 int
-mac_UE_get_rrc_lite_status(
+mac_UE_get_rrc_status(
   const module_id_t Mod_idP,
   const uint8_t     indexP
 );
diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c
index a919a055f2..8410c4c719 100644
--- a/openair2/RRC/LITE/rrc_UE.c
+++ b/openair2/RRC/LITE/rrc_UE.c
@@ -276,7 +276,7 @@ static void init_MCCH_UE(module_id_t ue_mod_idP, uint8_t eNB_index)
 #endif
 
 //-----------------------------------------------------------------------------
-static void openair_rrc_lite_ue_init_security( const protocol_ctxt_t* const ctxt_pP )
+static void openair_rrc_ue_init_security( const protocol_ctxt_t* const ctxt_pP )
 {
 #if defined(ENABLE_SECURITY)
   //    uint8_t *kRRCenc;
@@ -297,7 +297,7 @@ static void openair_rrc_lite_ue_init_security( const protocol_ctxt_t* const ctxt
 }
 
 //-----------------------------------------------------------------------------
-char openair_rrc_lite_ue_init( const module_id_t ue_mod_idP, const unsigned char eNB_index )
+char openair_rrc_ue_init( const module_id_t ue_mod_idP, const unsigned char eNB_index )
 {
   protocol_ctxt_t ctxt;
   PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_idP, ENB_FLAG_NO, NOT_A_RNTI, 0, 0,eNB_index);
@@ -324,7 +324,7 @@ char openair_rrc_lite_ue_init( const module_id_t ue_mod_idP, const unsigned char
   UE_rrc_inst[ctxt.module_id].integrity_algorithm = SecurityAlgorithmConfig__integrityProtAlgorithm_reserved;
 #endif
 
-  openair_rrc_lite_ue_init_security(&ctxt);
+  openair_rrc_ue_init_security(&ctxt);
   init_SI_UE(&ctxt,eNB_index);
   LOG_D(RRC,PROTOCOL_RRC_CTXT_FMT"  INIT: phy_sync_2_ch_ind\n",
         PROTOCOL_RRC_CTXT_ARGS(&ctxt));
@@ -445,14 +445,14 @@ static void rrc_ue_generate_RRCConnectionSetupComplete( const protocol_ctxt_t* c
   LOG_D(RLC,
         "[FRAME %05d][RRC_UE][MOD %02d][][--- PDCP_DATA_REQ/%d Bytes (RRCConnectionSetupComplete to eNB %d MUI %d) --->][PDCP][MOD %02d][RB %02d]\n",
         ctxt_pP->frame, ctxt_pP->module_id+NB_eNB_INST, size, eNB_index, rrc_mui, ctxt_pP->module_id+NB_eNB_INST, DCCH);
-  pdcp_rrc_data_req (
-    ctxt_pP,
-    DCCH,
-    rrc_mui++,
-    SDU_CONFIRM_NO,
-    size,
-    buffer,
-    PDCP_TRANSMISSION_MODE_CONTROL);
+  rrc_data_req (
+		ctxt_pP,
+		DCCH,
+		rrc_mui++,
+		SDU_CONFIRM_NO,
+		size,
+		buffer,
+		PDCP_TRANSMISSION_MODE_CONTROL);
 }
 
 //-----------------------------------------------------------------------------
@@ -472,14 +472,14 @@ static void rrc_ue_generate_RRCConnectionReconfigurationComplete( const protocol
         rrc_mui,
         UE_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id),
         DCCH);
-  pdcp_rrc_data_req (
-    ctxt_pP,
-    DCCH,
-    rrc_mui++,
-    SDU_CONFIRM_NO,
-    size,
-    buffer,
-    PDCP_TRANSMISSION_MODE_CONTROL);
+  rrc_data_req (
+		ctxt_pP,
+		DCCH,
+		rrc_mui++,
+		SDU_CONFIRM_NO,
+		size,
+		buffer,
+		PDCP_TRANSMISSION_MODE_CONTROL);
 }
 
 
@@ -1430,14 +1430,14 @@ rrc_ue_process_securityModeCommand(
       }
 
       LOG_T(RRC, "\n");
-      pdcp_rrc_data_req (
-        ctxt_pP,
-        DCCH,
-        rrc_mui++,
-        SDU_CONFIRM_NO,
-        (enc_rval.encoded + 7) / 8,
-        buffer,
-        PDCP_TRANSMISSION_MODE_CONTROL);
+      rrc_data_req (
+		    ctxt_pP,
+		    DCCH,
+		    rrc_mui++,
+		    SDU_CONFIRM_NO,
+		    (enc_rval.encoded + 7) / 8,
+		    buffer,
+		    PDCP_TRANSMISSION_MODE_CONTROL);
     }
   }
 }
@@ -1535,14 +1535,14 @@ rrc_ue_process_ueCapabilityEnquiry(
           }
 
           LOG_T(RRC, "\n");
-          pdcp_rrc_data_req (
-            ctxt_pP,
-            DCCH,
-            rrc_mui++,
-            SDU_CONFIRM_NO,
-            (enc_rval.encoded + 7) / 8,
-            buffer,
-            PDCP_TRANSMISSION_MODE_CONTROL);
+          rrc_data_req (
+			ctxt_pP,
+			DCCH,
+			rrc_mui++,
+			SDU_CONFIRM_NO,
+			(enc_rval.encoded + 7) / 8,
+			buffer,
+			PDCP_TRANSMISSION_MODE_CONTROL);
         }
       }
     }
@@ -4160,15 +4160,15 @@ void *rrc_ue_task( void *args_p )
 
       /* Transfer data to PDCP */
       PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, ENB_FLAG_NO, UE_rrc_inst[ue_mod_id].Info[0].rnti, 0, 0,0);
-      pdcp_rrc_data_req (&ctxt,
-                         DCCH,
-                         rrc_mui++,
-                         SDU_CONFIRM_NO,
-                         length, buffer,
-                         PDCP_TRANSMISSION_MODE_CONTROL);
+      rrc_data_req (&ctxt,
+		    DCCH,
+		    rrc_mui++,
+		    SDU_CONFIRM_NO,
+		    length, buffer,
+		    PDCP_TRANSMISSION_MODE_CONTROL);
       break;
     }
-
+      
 # endif
 
 # if ENABLE_RAL
diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c
index e2d8a6c69b..a27199bdab 100644
--- a/openair2/RRC/LITE/rrc_common.c
+++ b/openair2/RRC/LITE/rrc_common.c
@@ -132,7 +132,7 @@ rrc_init_global_param(
    return -1;
    }
    */
-  rrc_rlc_register_rrc (rlcrrc_data_ind, NULL); //register with rlc
+  rrc_rlc_register_rrc (rrc_data_ind, NULL); //register with rlc
 
   DCCH_LCHAN_DESC.transport_block_size = 4;
   DCCH_LCHAN_DESC.max_transport_blocks = 16;
diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c
index c7cb18eab0..da1b07e25b 100644
--- a/openair2/RRC/LITE/rrc_eNB.c
+++ b/openair2/RRC/LITE/rrc_eNB.c
@@ -920,14 +920,14 @@ rrc_eNB_generate_SecurityModeCommand(
     rrc_eNB_mui,
     size);
 
-  pdcp_rrc_data_req(
-    ctxt_pP,
-    DCCH,
-    rrc_eNB_mui++,
-    SDU_CONFIRM_NO,
-    size,
-    buffer,
-    PDCP_TRANSMISSION_MODE_CONTROL);
+  rrc_data_req(
+	       ctxt_pP,
+	       DCCH,
+	       rrc_eNB_mui++,
+	       SDU_CONFIRM_NO,
+	       size,
+	       buffer,
+	       PDCP_TRANSMISSION_MODE_CONTROL);
 
 }
 
@@ -971,14 +971,14 @@ rrc_eNB_generate_UECapabilityEnquiry(
     rrc_eNB_mui,
     size);
 
-  pdcp_rrc_data_req(
-    ctxt_pP,
-    DCCH,
-    rrc_eNB_mui++,
-    SDU_CONFIRM_NO,
-    size,
-    buffer,
-    PDCP_TRANSMISSION_MODE_CONTROL);
+  rrc_data_req(
+	       ctxt_pP,
+	       DCCH,
+	       rrc_eNB_mui++,
+	       SDU_CONFIRM_NO,
+	       size,
+	       buffer,
+	       PDCP_TRANSMISSION_MODE_CONTROL);
 
 }
 
@@ -1107,14 +1107,14 @@ rrc_eNB_generate_RRCConnectionRelease(
     rrc_eNB_mui,
     size);
 
-  pdcp_rrc_data_req(
-    ctxt_pP,
-    DCCH,
-    rrc_eNB_mui++,
-    SDU_CONFIRM_NO,
-    size,
-    buffer,
-    PDCP_TRANSMISSION_MODE_CONTROL);
+  rrc_data_req(
+	       ctxt_pP,
+	       DCCH,
+	       rrc_eNB_mui++,
+	       SDU_CONFIRM_NO,
+	       size,
+	       buffer,
+	       PDCP_TRANSMISSION_MODE_CONTROL);
 }
 
 //-----------------------------------------------------------------------------
@@ -1728,14 +1728,14 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(
     rrc_eNB_mui,
     size);
 
-  pdcp_rrc_data_req(
-    ctxt_pP,
-    DCCH,
-    rrc_eNB_mui++,
-    SDU_CONFIRM_NO,
-    size,
-    buffer,
-    PDCP_TRANSMISSION_MODE_CONTROL);
+  rrc_data_req(
+	       ctxt_pP,
+	       DCCH,
+	       rrc_eNB_mui++,
+	       SDU_CONFIRM_NO,
+	       size,
+	       buffer,
+	       PDCP_TRANSMISSION_MODE_CONTROL);
 }
 
 
@@ -1805,14 +1805,14 @@ rrc_eNB_generate_RRCConnectionReconfiguration_SCell(
     rrc_eNB_mui,
     size);
 
-  pdcp_rrc_data_req(
-    ctxt_pP,
-    DCCH,
-    rrc_eNB_mui++,
-    SDU_CONFIRM_NO,
-    size,
-    buffer,
-    PDCP_TRANSMISSION_MODE_CONTROL);
+  rrc_data_req(
+	       ctxt_pP,
+	       DCCH,
+	       rrc_eNB_mui++,
+	       SDU_CONFIRM_NO,
+	       size,
+	       buffer,
+	       PDCP_TRANSMISSION_MODE_CONTROL);
   return(0);
 }
 
@@ -3369,7 +3369,7 @@ rrc_eNB_generate_RRCConnectionSetup(
 #if defined(ENABLE_ITTI)
 char
 //-----------------------------------------------------------------------------
-openair_rrc_lite_eNB_init(
+openair_rrc_eNB_init(
   const module_id_t enb_mod_idP
 )
 //-----------------------------------------------------------------------------
@@ -3382,13 +3382,13 @@ openair_rrc_lite_eNB_init(
 #if defined(ENABLE_ITTI)
 //-----------------------------------------------------------------------------
 char
-openair_rrc_lite_eNB_configuration(
+openair_rrc_eNB_configuration(
   const module_id_t enb_mod_idP,
   RrcConfigurationReq* configuration
 )
 #else
 char
-openair_rrc_lite_eNB_init(
+openair_rrc_eNB_init(
   const module_id_t enb_mod_idP
 )
 #endif
@@ -3417,7 +3417,7 @@ openair_rrc_lite_eNB_init(
   //        for (j = 0; j < NUMBER_OF_UE_MAX; j++) {
   //            eNB_rrc_inst[ctxt.module_id].ciphering_algorithm[j] = SecurityAlgorithmConfig__cipheringAlgorithm_eea0;
   //            eNB_rrc_inst[ctxt.module_id].integrity_algorithm[j] = SecurityAlgorithmConfig__integrityProtAlgorithm_eia2;
-  //            rrc_lite_eNB_init_security(enb_mod_idP, j);
+  //            rrc_eNB_init_security(enb_mod_idP, j);
   //        }
   //    }
   eNB_rrc_inst[ctxt.module_id].Nb_ue = 0;
@@ -4434,7 +4434,7 @@ rrc_enb_task(
       /* Messages from eNB app */
     case RRC_CONFIGURATION_REQ:
       LOG_I(RRC, "[eNB %d] Received %s\n", instance, msg_name_p);
-      openair_rrc_lite_eNB_configuration(ENB_INSTANCE_TO_MODULE_ID(instance), &RRC_CONFIGURATION_REQ(msg_p));
+      openair_rrc_eNB_configuration(ENB_INSTANCE_TO_MODULE_ID(instance), &RRC_CONFIGURATION_REQ(msg_p));
       break;
 
 #   if ENABLE_RAL
diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c
index d93b8eea2f..6598e72273 100644
--- a/openair2/RRC/LITE/rrc_eNB_S1AP.c
+++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c
@@ -840,15 +840,15 @@ rrc_eNB_process_S1AP_DOWNLINK_NAS(
     LOG_F(RRC,"\n");
 #endif
     /* Transfer data to PDCP */
-    pdcp_rrc_data_req (
-      &ctxt,
-      DCCH,
-      *rrc_eNB_mui++,
-      SDU_CONFIRM_NO,
-      length,
-      buffer,
-      PDCP_TRANSMISSION_MODE_CONTROL);
-
+    rrc_data_req (
+		  &ctxt,
+		  DCCH,
+		  *rrc_eNB_mui++,
+		  SDU_CONFIRM_NO,
+		  length,
+		  buffer,
+		  PDCP_TRANSMISSION_MODE_CONTROL);
+    
     return (0);
   }
 }
-- 
GitLab