From 2300b9fc069a76d970857d9c3dcbe2fdbfc96ca8 Mon Sep 17 00:00:00 2001
From: Matthieu Kanj <Matthieu.kanj@b-com.com>
Date: Fri, 16 Feb 2018 08:58:15 +0100
Subject: [PATCH] bug correction for pilots

---
 openair1/PHY/INIT/lte_init.c                  |  6 +-
 openair1/PHY/LTE_REFSIG/defs_NB_IoT.h         |  2 +-
 .../PHY/LTE_REFSIG/lte_dl_cell_spec_NB_IoT.c  |  2 +-
 openair1/PHY/LTE_REFSIG/lte_gold_NB_IoT.c     |  2 +-
 openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h      | 69 +++++++++++++++++--
 .../PHY/LTE_TRANSPORT/dlsch_coding_NB_IoT.c   | 20 +++---
 .../LTE_TRANSPORT/dlsch_modulation_NB_IoT.c   |  4 +-
 .../LTE_TRANSPORT/dlsch_scrambling_NB_IoT.c   | 22 +++---
 openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h     |  4 +-
 openair1/PHY/defs.h                           |  5 ++
 openair1/PHY/defs_NB_IoT.h                    |  2 +-
 .../SCHED/phy_procedures_lte_eNb_NB_IoT.c     | 39 ++++++++++-
 12 files changed, 143 insertions(+), 34 deletions(-)

diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
index 2ed59c3b01..00b9485ab6 100644
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -1382,6 +1382,10 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
 
   if (eNB->node_function != NGFI_RRU_IF4p5) {
     lte_gold(fp,eNB->lte_gold_table,fp->Nid_cell);
+
+    // NB-IoT testing
+    lte_gold_NB_IoT(fp,eNB->lte_gold_table_NB_IoT,fp->Nid_cell);
+    //////////////////////////////////////////////////////////
     generate_pcfich_reg_mapping(fp);
     generate_phich_reg_mapping(fp);
 
@@ -1708,7 +1712,7 @@ int phy_init_lte_eNB_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB,
 
 
   if (eNB->node_function != NGFI_RRU_IF4p5_NB_IoT) {
-    lte_gold_NB_IoT(fp,eNB->lte_gold_table_NB_IoT,fp->Nid_cell);
+  //  lte_gold_NB_IoT(fp,eNB->lte_gold_table_NB_IoT,fp->Nid_cell);   ****** uncomment when this function is used - 16/02/2018
   //  generate_pcfich_reg_mapping(fp);
   //  generate_phich_reg_mapping(fp);
 
diff --git a/openair1/PHY/LTE_REFSIG/defs_NB_IoT.h b/openair1/PHY/LTE_REFSIG/defs_NB_IoT.h
index 586470bb59..64fb50a689 100644
--- a/openair1/PHY/LTE_REFSIG/defs_NB_IoT.h
+++ b/openair1/PHY/LTE_REFSIG/defs_NB_IoT.h
@@ -27,7 +27,7 @@
 @param lte_gold_table pointer to table where sequences are stored
 @param Nid_cell Cell Id for NB_IoT (to compute sequences for local and adjacent cells) */
 
-void lte_gold_NB_IoT(NB_IoT_DL_FRAME_PARMS  *frame_parms,
+void lte_gold_NB_IoT(LTE_DL_FRAME_PARMS     *frame_parms,
 					 uint32_t 				lte_gold_table_NB_IoT[20][2][14],
 					 uint16_t 				Nid_cell);
 
diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec_NB_IoT.c b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec_NB_IoT.c
index 28fc50665d..f668a13808 100644
--- a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec_NB_IoT.c
+++ b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec_NB_IoT.c
@@ -77,7 +77,7 @@ int lte_dl_cell_spec_NB_IoT(PHY_VARS_eNB          *phy_vars_eNB,
   DevAssert( l < 2 );
 
   for (m=0; m<2; m++) {
-    output[k] = qpsk[(phy_vars_eNB->lte_gold_table[Ns][l][0]) & 3]; //TODO should be defined one for NB-IoT
+    output[k] = qpsk[(phy_vars_eNB->lte_gold_table_NB_IoT[Ns][l][0]) & 3]; //TODO should be defined one for NB-IoT
     k+=6;
   }
 
diff --git a/openair1/PHY/LTE_REFSIG/lte_gold_NB_IoT.c b/openair1/PHY/LTE_REFSIG/lte_gold_NB_IoT.c
index 23edfc8098..754326a128 100644
--- a/openair1/PHY/LTE_REFSIG/lte_gold_NB_IoT.c
+++ b/openair1/PHY/LTE_REFSIG/lte_gold_NB_IoT.c
@@ -15,7 +15,7 @@
 //#include "defs.h"
 #include "PHY/LTE_REFSIG/defs_NB_IoT.h"
 
-void lte_gold_NB_IoT(NB_IoT_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table_NB_IoT[20][2][14],uint16_t Nid_cell)  //  Nid_cell = Nid_cell_NB_IoT
+void lte_gold_NB_IoT(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table_NB_IoT[20][2][14],uint16_t Nid_cell)  //  Nid_cell = Nid_cell_NB_IoT
 {
   unsigned char ns,l,Ncp=1;
   unsigned int  n,x1,x2;
diff --git a/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h b/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h
index 9e01da6459..52a7a11b41 100644
--- a/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h
+++ b/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h
@@ -147,6 +147,9 @@ typedef enum {
 
 typedef struct {
   /// NB-IoT
+  /// Allocated RNTI (0 means DLSCH_t is not currently used)
+  uint16_t              si_rnti;   ///(=0xfff4)
+
   SCH_status_NB_IoT_t   status;
   /// The scheduling the NPDCCH and the NPDSCH transmission TS 36.213 Table 16.4.1-1
   uint8_t               scheduling_delay;
@@ -194,9 +197,60 @@ typedef struct {
   //this index will be used mainly for SI message buffer
    uint8_t               pdu_buffer_index;
 
-} NB_IoT_DL_eNB_HARQ_t;
+} NB_IoT_DL_eNB_SIB1_t;
+
+typedef struct {
+  /// NB-IoT
+  SCH_status_NB_IoT_t   status;
+  /// The scheduling the NPDCCH and the NPDSCH transmission TS 36.213 Table 16.4.1-1
+  uint8_t               scheduling_delay;
+  /// The number of the subframe to transmit the NPDSCH Table TS 36.213 Table 16.4.1.3-1  (Nsf) (NB. in this case is not the index Isf)
+  uint8_t               resource_assignment;
+  /// is the index that determined the repeat number of NPDSCH through table TS 36.213 Table 16.4.1.3-2 / for SIB1-NB Table 16.4.1.3-3
+  uint8_t               repetition_number;
+  /// Determined the ACK/NACK delay and the subcarrier allocation TS 36.213 Table 16.4.2
+  uint8_t               HARQ_ACK_resource;
+  /// Determined the repetition number value 0-3 (2 biut carried by the FAPI NPDCCH)
+  uint8_t               dci_subframe_repetitions;
+  /// modulation always QPSK Qm = 2 
+  uint8_t               modulation;
+  /// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18)
+  uint8_t               e[MAX_NUM_CHANNEL_BITS_NB_IoT];
+  /// data after scrambling
+  uint8_t               s_e[MAX_NUM_CHANNEL_BITS_NB_IoT];
+  //length of the table e
+  uint16_t              length_e;                // new parameter
+  /// Tail-biting convolutional coding outputs
+  uint8_t               d[96+(3*(24+MAX_DL_SIZE_BITS_NB_IoT))];  // new parameter
+  /// Sub-block interleaver outputs
+  uint8_t               w[3*3*(MAX_DL_SIZE_BITS_NB_IoT+24)];      // new parameter
+
+  /// Status Flag indicating for this DLSCH (idle,active,disabled)
+  //SCH_status_t status;
+  /// Transport block size
+  uint32_t              TBS;
+  /// The payload + CRC size in bits, "B" from 36-212
+  uint32_t              B;
+  /// Pointer to the payload
+  uint8_t               *b;
+  ///pdu of the ndlsch message
+  uint8_t               *pdu;
+  /// Frame where current HARQ round was sent
+  uint32_t              frame;
+  /// Subframe where current HARQ round was sent
+  uint32_t              subframe;
+  /// Index of current HARQ round for this DLSCH
+  uint8_t               round;
+  /// MCS format for this NDLSCH , TS 36.213 Table 16.4.1.5
+  uint8_t               mcs;
+  // we don't have code block segmentation / crc attachment / concatenation in NB-IoT R13 36.212 6.4.2
+  // we don't have beamforming in NB-IoT
+  //this index will be used mainly for SI message buffer
+   uint8_t               pdu_buffer_index;
 
+} NB_IoT_DL_eNB_HARQ_t;
 
+/*
 typedef struct {                                        // LTE_eNB_DLSCH_t
  /// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding)
  uint32_t               *txdataF[8];
@@ -217,7 +271,9 @@ typedef struct {                                        // LTE_eNB_DLSCH_t
  /// First-round error threshold for fine-grain rate adaptation
  uint8_t                error_threshold;
  /// Pointers to 8 HARQ processes for the DLSCH
- NB_IoT_DL_eNB_HARQ_t   harq_process;
+ NB_IoT_DL_eNB_HARQ_t   harq_process2;
+
+ NB_IoT_DL_eNB_SIB1_t   harq_process;
  /// circular list of free harq PIDs (the oldest come first)
  /// (10 is arbitrary value, must be > to max number of DL HARQ processes in LTE)
  int                    harq_pid_freelist[10];
@@ -242,7 +298,8 @@ typedef struct {                                        // LTE_eNB_DLSCH_t
  /// amplitude of PDSCH (compared to RS) in symbols containing pilots
  int16_t                sqrt_rho_b;
 
-} NB_IoT_eNB_DLSCH_t;
+} NB_IoT_eNB_DLSCH_t; 
+*/
 
 
 typedef struct {
@@ -547,9 +604,11 @@ typedef struct {
   uint8_t                 subframe_tx[10];
   /// First CCE of last PDSCH scheduling per subframe.  Again used during PUCCH detection for ACK/NAK.
   uint8_t                 nCCE[10];
-  /*in NB-IoT there is only 1 HARQ process for each UE therefore no pid is required*/
+  ///in NB-IoT there is only 1 HARQ process for each UE therefore no pid is required///
   /// The only HARQ process for the DLSCH
   NB_IoT_DL_eNB_HARQ_t    *harq_process;
+
+  NB_IoT_DL_eNB_SIB1_t    harq_process_sib1;
   /// Number of soft channel bits
   uint32_t                G;
   /// Maximum number of HARQ rounds
@@ -571,7 +630,7 @@ typedef struct {
   ///indicates the starting OFDM symbol in the first slot of a subframe k for the NPDSCH transmission
   /// see FAPI/NFAPI specs Table 4-47
   uint8_t                 npdsch_start_symbol;
-  /*SIB1-NB related parameters*/
+  ///SIB1-NB related parameters//
   ///flag for indicate if the current frame is the start of a new SIB1-NB repetition within the SIB1-NB period (0 = FALSE, 1 = TRUE)
   uint8_t                 sib1_rep_start;
   ///the number of the frame within the 16 continuous frame in which sib1-NB is transmitted (1-8 = 1st, 2nd ecc..) (0 = not foresees a transmission)
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding_NB_IoT.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding_NB_IoT.c
index 4367ea5085..bb6299003d 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding_NB_IoT.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding_NB_IoT.c
@@ -85,7 +85,7 @@ void ccode_encode_npdsch_NB_IoT (int32_t   numbits,
 
 
 int dlsch_encoding_NB_IoT(unsigned char      			*a,
-						  NB_IoT_eNB_DLSCH_t 			*dlsch,
+						  NB_IoT_eNB_NDLSCH_t 			*dlsch,
 						  uint8_t 			 			Nsf,		// number of subframes required for npdsch pdu transmission calculated from Isf (3GPP spec table)
 						  unsigned int 		 			G) 		    // G (number of available RE) is implicitly multiplied by 2 (since only QPSK modulation)
 {
@@ -94,12 +94,12 @@ int dlsch_encoding_NB_IoT(unsigned char      			*a,
 	unsigned int  A;
 	uint8_t 	  RCC;
 
-	A 							 = dlsch->harq_process.TBS;  				// 680
-	dlsch->harq_process.length_e = G*Nsf;									// G*Nsf (number_of_subframes) = total number of bits to transmit G=236
+	A 							 = dlsch->harq_process_sib1.TBS;  				// 680
+	dlsch->harq_process_sib1.length_e = G*Nsf;									// G*Nsf (number_of_subframes) = total number of bits to transmit G=236
 
 	int32_t numbits = A+24;
 	
-	if (dlsch->harq_process.round == 0) { 	    // This is a new packet
+	if (dlsch->harq_process_sib1.round == 0) { 	    // This is a new packet
 
 		crc = crc24a_NB_IoT(a,A)>>8;						// CRC calculation (24 bits CRC)
 												    // CRC attachment to payload
@@ -107,16 +107,16 @@ int dlsch_encoding_NB_IoT(unsigned char      			*a,
 		a[1+(A>>3)] = ((uint8_t*)&crc)[1];
 		a[2+(A>>3)] = ((uint8_t*)&crc)[0];
 		
-		dlsch->harq_process.B = numbits;			// The length of table b in bits
+		dlsch->harq_process_sib1.B = numbits;			// The length of table b in bits
 		
-		memcpy(dlsch->harq_process.b,a,numbits/8); 
-		memset(dlsch->harq_process.d,LTE_NULL_NB_IoT,96);
+		memcpy(dlsch->harq_process_sib1.b,a,numbits/8); 
+		memset(dlsch->harq_process_sib1.d,LTE_NULL_NB_IoT,96);
 		
-		ccode_encode_npdsch_NB_IoT(numbits, dlsch->harq_process.b, dlsch->harq_process.d+96, crc);  	//   step 1 Tail-biting convolutional coding
+		ccode_encode_npdsch_NB_IoT(numbits, dlsch->harq_process_sib1.b, dlsch->harq_process_sib1.d+96, crc);  	//   step 1 Tail-biting convolutional coding
 		
-		RCC = sub_block_interleaving_cc_NB_IoT(numbits,dlsch->harq_process.d+96,dlsch->harq_process.w);		//   step 2 interleaving
+		RCC = sub_block_interleaving_cc_NB_IoT(numbits,dlsch->harq_process_sib1.d+96,dlsch->harq_process_sib1.w);		//   step 2 interleaving
 		
-		lte_rate_matching_cc_NB_IoT(RCC,dlsch->harq_process.length_e,dlsch->harq_process.w,dlsch->harq_process.e);  // step 3 Rate Matching
+		lte_rate_matching_cc_NB_IoT(RCC,dlsch->harq_process_sib1.length_e,dlsch->harq_process_sib1.w,dlsch->harq_process_sib1.e);  // step 3 Rate Matching
 				
     }
   return(0);
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation_NB_IoT.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation_NB_IoT.c
index b79d749eb0..2ce375401c 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation_NB_IoT.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation_NB_IoT.c
@@ -119,7 +119,7 @@ int dlsch_modulation_NB_IoT(int32_t 				**txdataF,
 							int16_t 				amp,
 							LTE_DL_FRAME_PARMS 	    *frame_parms,
 							uint8_t 				control_region_size,      // control region size for LTE , values between 0..3, (0 for stand-alone / 1, 2 or 3 for in-band)
-							NB_IoT_eNB_DLSCH_t 		*dlsch0,
+							NB_IoT_eNB_NDLSCH_t     *dlsch0,
 							int 					G,						  // number of bits per subframe
 							unsigned 				npdsch_data_subframe,     // subframe index of the data table of npdsch channel (G*Nsf)  , values are between 0..Nsf  			
 							unsigned short 			NB_IoT_RB_ID)
@@ -164,7 +164,7 @@ int dlsch_modulation_NB_IoT(int32_t 				**txdataF,
 								  txdataF,
 								  &jj,
 								  symbol_offset,
-								  &dlsch0->harq_process.s_e[G*npdsch_data_subframe],
+								  &dlsch0->harq_process_sib1.s_e[G*npdsch_data_subframe],
 								  pilots,
 								  amp,
 								  id_offset,
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling_NB_IoT.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling_NB_IoT.c
index f925c13712..214fbd019e 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling_NB_IoT.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling_NB_IoT.c
@@ -25,27 +25,31 @@
 
 #include "PHY/LTE_TRANSPORT/defs_NB_IoT.h"
 #include "PHY/impl_defs_lte_NB_IoT.h"
+#include "PHY/impl_defs_lte.h"
 #include "PHY/LTE_REFSIG/defs_NB_IoT.h"
 
-void dlsch_scrambling_NB_IoT(NB_IoT_DL_FRAME_PARMS  *frame_parms,
-							               NB_IoT_eNB_DLSCH_t     *dlsch,
-							               int                    G,        				// total number of bits to transmit
-							               uint8_t                Nf,   						// Nf is the frame number (0..9)
-							               uint8_t                Ns)							  // slot number (0..19)
+void dlsch_sib1_scrambling_NB_IoT(LTE_DL_FRAME_PARMS     *frame_parms,
+							                    NB_IoT_eNB_NDLSCH_t    *dlsch,
+							                    int                    tot_bits,        				// total number of bits to transmit
+							                    uint8_t                Nf,   						// Nf is the frame number (0..9)
+							                    uint8_t                Ns)							  // slot number (0..19)
 {
   int         i,j,k=0;
   uint32_t    x1,x2, s=0;
-  uint8_t     *e = dlsch->harq_process.e; 															//uint8_t *e=dlsch->harq_processes[dlsch->current_harq_pid]->e;
+  uint8_t     *e = dlsch->harq_process_sib1.e; 															//uint8_t *e=dlsch->harq_processes[dlsch->current_harq_pid]->e;
 
-  x2 = (dlsch->rnti<<14) + ((Nf%2)<<13) + ((Ns>>1)<<9) + frame_parms->Nid_cell;   //this is c_init in 36.211 Sec 10.2.3.1
+  x2 = (dlsch->harq_process_sib1.si_rnti<<15) + (frame_parms->Nid_cell + 1) * ( (Nf % 61) + 1 ) ;
+
+  // for NPDSCH not carriying SIBs
+  //x2 = (dlsch->harq_process_sib1.rnti<<14) + ((Nf%2)<<13) + ((Ns>>1)<<9) + frame_parms->Nid_cell;   //this is c_init in 36.211 Sec 10.2.3.1
   
   s = lte_gold_generic_NB_IoT(&x1, &x2, 1);
 
-  for (i=0; i<(1+(G>>5)); i++) {
+  for (i=0; i<(1+(tot_bits>>5)); i++) {
 
     for (j=0; j<32; j++,k++) {
 
-      dlsch->harq_process.s_e[k] = (e[k]&1) ^ ((s>>j)&1);
+      dlsch->harq_process_sib1.s_e[k] = (e[k]&1) ^ ((s>>j)&1);
 
     }
     s = lte_gold_generic_NB_IoT(&x1, &x2, 0);
diff --git a/openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h b/openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h
index 061981f601..0dd3a2c6da 100644
--- a/openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h
+++ b/openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h
@@ -229,13 +229,13 @@ int dlsch_modulation_NB_IoT(int32_t               **txdataF,
                             int16_t               amp,
                             LTE_DL_FRAME_PARMS      *frame_parms,
                             uint8_t               control_region_size,      // control region size for LTE , values between 0..3, (0 for stand-alone / 1, 2 or 3 for in-band)
-                            NB_IoT_eNB_DLSCH_t    *dlsch0,
+                            NB_IoT_eNB_NDLSCH_t    *dlsch0,
                             int                   G,              // number of bits per subframe
                             unsigned              npdsch_data_subframe,     // subframe index of the data table of npdsch channel (G*Nsf)  , values are between 0..Nsf        
                             unsigned short        NB_IoT_RB_ID);
 
 int32_t dlsch_encoding_NB_IoT(unsigned char              *a,
-                              NB_IoT_eNB_DLSCH_t         *dlsch,
+                              NB_IoT_eNB_NDLSCH_t         *dlsch,
                               uint8_t                    Nsf,        // number of subframes required for npdsch pdu transmission calculated from Isf (3GPP spec table)
                               unsigned int               G);         // G (number of available RE) is implicitly multiplied by 2 (since only QPSK modulation)
  
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 4a935045d7..244bbc4672 100644
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -326,6 +326,10 @@ typedef struct PHY_VARS_eNB_s {
   /// cell-specific reference symbols
   uint32_t         lte_gold_table[20][2][14];
 
+
+  /// cell-specific reference symbols
+  uint32_t         lte_gold_table_NB_IoT[20][2][14];
+
   /// UE-specific reference symbols (p=5), TM 7
   uint32_t         lte_gold_uespec_port5_table[NUMBER_OF_UE_MAX][20][38];
 
@@ -507,6 +511,7 @@ typedef struct PHY_VARS_eNB_s {
 
 NB_IoT_eNB_NPBCH_t        npbch;
 NB_IoT_eNB_NDLSCH_t       *ndlsch[NUMBER_OF_UE_MAX];
+NB_IoT_eNB_NDLSCH_t       ndlsch_SIB1;
 
 //////////////////// END /////////////////////////////////
 
diff --git a/openair1/PHY/defs_NB_IoT.h b/openair1/PHY/defs_NB_IoT.h
index 4a71314034..a9dc4f734a 100644
--- a/openair1/PHY/defs_NB_IoT.h
+++ b/openair1/PHY/defs_NB_IoT.h
@@ -530,7 +530,7 @@ typedef struct PHY_VARS_eNB_NB_IoT_s {
   void                          (*do_prach)(struct PHY_VARS_eNB_NB_IoT_s *eNB,int frame,int subframe);
   void                          (*fep)(struct PHY_VARS_eNB_NB_IoT_s *eNB,eNB_rxtx_proc_NB_IoT_t *proc);
   int                           (*td)(struct PHY_VARS_eNB_NB_IoT_s *eNB,int UE_id,int harq_pid,int llr8_flag);
-  int                           (*te)(struct PHY_VARS_eNB_NB_IoT_s *,uint8_t *,uint8_t,NB_IoT_eNB_DLSCH_t *,int,uint8_t,time_stats_t_NB_IoT *,time_stats_t_NB_IoT *,time_stats_t_NB_IoT *);
+  int                           (*te)(struct PHY_VARS_eNB_NB_IoT_s *,uint8_t *,uint8_t,NB_IoT_eNB_NDLSCH_t *,int,uint8_t,time_stats_t_NB_IoT *,time_stats_t_NB_IoT *,time_stats_t_NB_IoT *);
   void                          (*proc_uespec_rx)(struct PHY_VARS_eNB_NB_IoT_s *eNB,eNB_rxtx_proc_NB_IoT_t *proc,const relaying_type_t_NB_IoT r_type);
   void                          (*proc_tx)(struct PHY_VARS_eNB_NB_IoT_s *eNB,eNB_rxtx_proc_NB_IoT_t *proc,relaying_type_t_NB_IoT r_type,PHY_VARS_RN_NB_IoT *rn);
   void                          (*tx_fh)(struct PHY_VARS_eNB_NB_IoT_s *eNB,eNB_rxtx_proc_NB_IoT_t *proc);
diff --git a/openair1/SCHED/phy_procedures_lte_eNb_NB_IoT.c b/openair1/SCHED/phy_procedures_lte_eNb_NB_IoT.c
index 1cf55f1666..1d467b2f79 100644
--- a/openair1/SCHED/phy_procedures_lte_eNb_NB_IoT.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb_NB_IoT.c
@@ -219,6 +219,7 @@ void common_signal_procedures_NB_IoT(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
   //LTE_DL_FRAME_PARMS   *fp       =  &eNB->frame_parms_NB_IoT;
   LTE_DL_FRAME_PARMS   *fp       =  &eNB->frame_parms;
   NB_IoT_eNB_NPBCH_t   *broadcast_str = &eNB->npbch;
+  NB_IoT_eNB_NDLSCH_t  *sib1          = &eNB->ndlsch_SIB1;
   int                     **txdataF =  eNB->common_vars.txdataF[0];
   int                     subframe  =  proc->subframe_tx;
   int                     frame     =  proc->frame_tx;
@@ -226,7 +227,7 @@ void common_signal_procedures_NB_IoT(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
   int                     RB_IoT_ID=2 ;                          // XXX should be initialized (RB reserved for NB-IoT, PRB index)
   int                     With_NSSS=0;                            // With_NSSS = 1; if the frame include a sub-Frame with NSSS signal
   uint8_t      *npbch_pdu =  get_NB_IoT_MIB();
-
+  uint8_t      *sib1_pdu = get_NB_IoT_SIB1();
  //NSSS only happened in the even frame
   if(frame%2==0)
     {
@@ -278,6 +279,42 @@ void common_signal_procedures_NB_IoT(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
                      frame%64,
                      RB_IoT_ID);
     }
+
+
+    // SIB1
+    /*
+
+        if(subframe == 4)
+        {
+
+    */
+    /*
+      dlsch_encoding_NB_IoT(sib1_pdu,
+                            sib1,
+                            number_of_subframes_required, ***************
+                            G);   ***********
+
+      dlsch_sib1_scrambling_NB_IoT(fp,
+                                   sib1,
+                                   total_bits, **************************
+                                   frame,
+                                   subframe*2);
+
+      dlsch_modulation_NB_IoT(txdataF,
+                              AMP,
+                              fp,
+                              control_region_size,  *********    // control region size for LTE , values between 0..3, (0 for stand-alone / 1, 2 or 3 for in-band)
+                              sib1,
+                              G,               *********           // number of bits per subframe
+                              npdsch_data_subframe,  *******   // subframe index of the data table of npdsch channel (G*Nsf)  , values are between 0..Nsf        
+                              RB_IoT_ID)
+
+
+        }
+      if(Number_of_sib1_subframe > 1)
+
+    */
+
   
 }
 
-- 
2.26.2