From 9fac807d2c9e7f862cca9743cada2223fc724233 Mon Sep 17 00:00:00 2001 From: Raymond Knopp <raymond.knopp@eurecom.fr> Date: Sun, 14 Jul 2013 20:13:30 +0000 Subject: [PATCH] added support for 1.5/10/20 MHz. 1.5MHz primary synch is still broken (128-bit alignment issue with 128-point DFTs). 1/2 UEs connection seems to work ok for 10/20 MHz. git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4023 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair2/LAYER2/MAC/defs.h | 24 +- openair2/LAYER2/MAC/eNB_scheduler.c | 2179 ++++++++++++++-------- openair2/LAYER2/MAC/lte_transport_init.c | 3 +- openair2/LAYER2/MAC/main.c | 85 +- openair2/LAYER2/MAC/pre_processor.c | 164 +- openair2/LAYER2/MAC/ue_procedures.c | 2 +- openair2/NAS/DRIVER/MESH/Makefile | 2 +- 7 files changed, 1613 insertions(+), 846 deletions(-) diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index 22ba64a9ff7..bdf5f6ed296 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -125,6 +125,8 @@ // The power headroom reporting range is from -23 ...+40 dB and beyond, with step 1 #define PHR_MAPPING_OFFSET 23 // if ( x>= -23 ) val = floor (x + 23) +#define N_RBGS_MAX 25 + #define LCGID0 0 #define LCGID1 1 #define LCGID2 2 @@ -579,6 +581,8 @@ typedef struct{ DCI_PDU DCI_pdu; /// Outgoing BCCH pdu for PHY BCCH_PDU BCCH_pdu; + /// Outgoing BCCH DCI allocation + uint32_t BCCH_alloc_pdu; /// Outgoing CCCH pdu for PHY CCCH_PDU CCCH_pdu; /// Outgoing DLSCH pdu for PHY @@ -962,6 +966,25 @@ void mac_UE_out_of_sync_ind(u8 Mod_id,u32 frame, u16 CH_index); // eNB functions +/* \brief This function assigns pre-available RBS to each UE in specified sub-bands before scheduling is done +@param Mod_id Instance ID of eNB +@param frame Index of frame +@param subframe Index of current subframe +@param dl_pow_off Pointer to store resulting power offset for DCI +@param pre_nb_available_rbs Pointer to store number of remaining rbs after scheduling +@param N_RBS Number of resource block groups +@param rb_alloc_sub Table of resource block groups allocated to each UE + */ + + +void dlsch_scheduler_pre_processor (unsigned char Mod_id, + u32 frame, + unsigned char subframe, + u8 *dl_pow_off, + u16 *pre_nb_available_rbs, + int N_RBGS, + unsigned char rballoc_sub_UE[NUMBER_OF_UE_MAX][N_RBGS_MAX]); + /* \brief Function to trigger the eNB scheduling procedure. It is called by PHY at the beginning of each subframe, \f$n$\f and generates all DLSCH allocations for subframe \f$n\f$ and ULSCH allocations for subframe \f$n+k$\f. The resultant DCI_PDU is ready after returning from this call. @@ -988,7 +1011,6 @@ DCI_PDU *get_dci_sdu(u8 Mod_id,u32 frame,u8 subframe); */ void initiate_ra_proc(u8 Mod_id,u32 frame, u16 preamble_index,s16 timing_offset,u8 sect_id,u8 subframe,u8 f_id); - /* \brief Function in eNB to fill RAR pdu when requested by PHY. This provides a single RAR SDU for the moment and returns the t-CRNTI. @param Mod_id Instance ID of eNB @param dlsch_buffer Pointer to DLSCH input buffer diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index b76be423f8d..12c61509d90 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -27,13 +27,13 @@ *******************************************************************************/ /*! \file eNB_scheduler.c -* \brief procedures related to UE -* \author Raymond Knopp, Navid Nikaein -* \date 2011 -* \version 0.5 -* @ingroup _mac + * \brief procedures related to UE + * \author Raymond Knopp, Navid Nikaein + * \date 2011 + * \version 0.5 + * @ingroup _mac -*/ + */ #include "PHY/defs.h" #include "PHY/extern.h" @@ -69,8 +69,6 @@ double snr_tm6=0; //#define DEBUG_HEADER_PARSING 1 //#define DEBUG_PACKET_TRACE 1 -//#define ICIC 0 - /* #ifndef USER_MODE #define msg debug_msg @@ -251,13 +249,13 @@ void terminate_ra_proc(u8 Mod_id,u32 frame,u16 rnti,unsigned char *msg3, u16 msg for (i=0;i<NB_RA_PROC_MAX;i++) { LOG_D(MAC,"[RAPROC] Checking proc %d : rnti (%x, %x), active %d\n",i, eNB_mac_inst[Mod_id].RA_template[i].rnti, rnti, - eNB_mac_inst[Mod_id].RA_template[i].RA_active); + eNB_mac_inst[Mod_id].RA_template[i].RA_active); if ((eNB_mac_inst[Mod_id].RA_template[i].rnti==rnti) && (eNB_mac_inst[Mod_id].RA_template[i].RA_active==1)) { payload_ptr = parse_ulsch_header(msg3,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,msg3_len); - LOG_D(MAC,"[eNB %d][RAPROC] Frame %d Received CCCH: length %d, offset %d\n", - Mod_id,frame,rx_lengths[0],payload_ptr-msg3); + LOG_D(MAC,"[eNB %d][RAPROC] Frame %d Received CCCH: length %d, offset %d\n", + Mod_id,frame,rx_lengths[0],payload_ptr-msg3); if ((num_ce == 0) && (num_sdu==1) && (rx_lcids[0] == CCCH)) { // This is an RRCConnectionRequest/Restablishment memcpy(&eNB_mac_inst[Mod_id].RA_template[i].cont_res_id[0],payload_ptr,6); LOG_D(MAC,"[eNB %d][RAPROC] Frame %d Received CCCH: length %d, offset %d\n", @@ -273,8 +271,8 @@ void terminate_ra_proc(u8 Mod_id,u32 frame,u16 rnti,unsigned char *msg3, u16 msg if (Is_rrc_registered == 1) mac_rrc_data_ind(Mod_id,frame,CCCH,(char *)payload_ptr,rx_lengths[0],1,Mod_id); - // add_user. This is needed to have the rnti for configuring UE (PHY). The UE is removed if RRC - // doesn't provide a CCCH SDU + // add_user. This is needed to have the rnti for configuring UE (PHY). The UE is removed if RRC + // doesn't provide a CCCH SDU } else if (num_ce >0) { // handle msg3 which is not RRCConnectionRequest @@ -560,12 +558,12 @@ void rx_sdu(u8 Mod_id,u32 frame,u16 rnti,u8 *sdu, u16 sdu_len) { case LONG_BSR: eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0] = ((payload_ptr[0] & 0xFC) >> 2); eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1] = - ((payload_ptr[0] & 0x03) << 4) | ((payload_ptr[1] & 0xF0) >> 4); + ((payload_ptr[0] & 0x03) << 4) | ((payload_ptr[1] & 0xF0) >> 4); eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2] = - ((payload_ptr[1] & 0x0F) << 2) | ((payload_ptr[2] & 0xC0) >> 6); + ((payload_ptr[1] & 0x0F) << 2) | ((payload_ptr[2] & 0xC0) >> 6); eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3] = (payload_ptr[2] & 0x3F); LOG_D(MAC, "[eNB] MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = " - "%u LCGID2 = %u LCGID3 = %u\n", + "%u LCGID2 = %u LCGID3 = %u\n", rx_ces[i], eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0], eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1], @@ -717,10 +715,10 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, if (first_element>0) { mac_header_ptr->E = 1; /* - printf("[eNB][MAC] last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); + printf("[eNB][MAC] last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); */ mac_header_ptr++; } @@ -734,12 +732,12 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, last_size=1; LOG_T(MAC,"[eNB ][RAPROC] Generate contention resolution msg: %x.%x.%x.%x.%x.%x\n", - ue_cont_res_id[0], - ue_cont_res_id[1], - ue_cont_res_id[2], - ue_cont_res_id[3], - ue_cont_res_id[4], - ue_cont_res_id[5]); + ue_cont_res_id[0], + ue_cont_res_id[1], + ue_cont_res_id[2], + ue_cont_res_id[3], + ue_cont_res_id[4], + ue_cont_res_id[5]); memcpy(ce_ptr,ue_cont_res_id,6); ce_ptr+=6; @@ -754,9 +752,9 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, if (first_element>0) { mac_header_ptr->E = 1; /*msg("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); */ mac_header_ptr+=last_size; //msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); @@ -791,7 +789,7 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, } /* - printf("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); + printf("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, @@ -820,28 +818,28 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, mac_header_ptr++; } -//msg("After subheaders %d\n",(u8*)mac_header_ptr - mac_header); + //msg("After subheaders %d\n",(u8*)mac_header_ptr - mac_header); if ((ce_ptr-mac_header_control_elements) > 0) { // printf("Copying %d bytes for control elements\n",ce_ptr-mac_header_control_elements); memcpy((void*)mac_header_ptr,mac_header_control_elements,ce_ptr-mac_header_control_elements); mac_header_ptr+=(unsigned char)(ce_ptr-mac_header_control_elements); } -//msg("After CEs %d\n",(u8*)mac_header_ptr - mac_header); + //msg("After CEs %d\n",(u8*)mac_header_ptr - mac_header); return((unsigned char*)mac_header_ptr - mac_header); } /* -#ifdef Rel10 -unsigned char generate_mch_header( unsigned char *mac_header, - unsigned char num_sdus, - unsigned short *sdu_lengths, - unsigned char *sdu_lcids, - unsigned char msi, - unsigned char short_padding, - unsigned short post_padding) { + #ifdef Rel10 + unsigned char generate_mch_header( unsigned char *mac_header, + unsigned char num_sdus, + unsigned short *sdu_lengths, + unsigned char *sdu_lcids, + unsigned char msi, + unsigned char short_padding, + unsigned short post_padding) { SCH_SUBHEADER_FIXED *mac_header_ptr = (SCH_SUBHEADER_FIXED *)mac_header; u8 first_element=0,last_size=0,i; @@ -850,100 +848,100 @@ unsigned char generate_mch_header( unsigned char *mac_header, ce_ptr = &mac_header_control_elements[0]; if ((short_padding == 1) || (short_padding == 2)) { - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - first_element=1; - last_size=1; + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + first_element=1; + last_size=1; } if (short_padding == 2) { - mac_header_ptr->E = 1; - mac_header_ptr++; - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - last_size=1; + mac_header_ptr->E = 1; + mac_header_ptr++; + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + last_size=1; } // SUBHEADER for MSI CE if (msi != 0) {// there is MSI MAC Control Element - if (first_element>0) { - mac_header_ptr->E = 1; - mac_header_ptr+=last_size; - } - else { - first_element = 1; - } - if (num_sdus*2 < 128) { - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID = MCH_SCHDL_INFO; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L = num_sdus*2; - last_size=2; - } - else { - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->R = 0; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->E = 0; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->F = 1; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->LCID = MCH_SCHDL_INFO; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L = (num_sdus*2)&0x7fff; - last_size=3; - } - // Create the MSI MAC Control Element here + if (first_element>0) { + mac_header_ptr->E = 1; + mac_header_ptr+=last_size; + } + else { + first_element = 1; + } + if (num_sdus*2 < 128) { + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R = 0; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E = 0; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F = 0; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID = MCH_SCHDL_INFO; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L = num_sdus*2; + last_size=2; + } + else { + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->R = 0; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->E = 0; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->F = 1; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->LCID = MCH_SCHDL_INFO; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L = (num_sdus*2)&0x7fff; + last_size=3; + } + // Create the MSI MAC Control Element here } // SUBHEADER for MAC SDU (MCCH+MTCHs) for (i=0;i<num_sdus;i++) { - if (first_element>0) { - mac_header_ptr->E = 1; - mac_header_ptr+=last_size; - } - else { - first_element = 1; - } - if (sdu_lengths[i] < 128) { - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID = sdu_lcids[i]; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L = (unsigned char)sdu_lengths[i]; - last_size=2; - } - else { - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->R = 0; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->E = 0; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->F = 1; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->LCID = sdu_lcids[i]; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L = (unsigned short) sdu_lengths[i]&0x7fff; - last_size=3; - } + if (first_element>0) { + mac_header_ptr->E = 1; + mac_header_ptr+=last_size; + } + else { + first_element = 1; + } + if (sdu_lengths[i] < 128) { + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R = 0; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E = 0; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F = 0; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID = sdu_lcids[i]; + ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L = (unsigned char)sdu_lengths[i]; + last_size=2; + } + else { + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->R = 0; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->E = 0; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->F = 1; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->LCID = sdu_lcids[i]; + ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L = (unsigned short) sdu_lengths[i]&0x7fff; + last_size=3; + } } if (post_padding>0) {// we have lots of padding at the end of the packet - mac_header_ptr->E = 1; - mac_header_ptr+=last_size; - // add a padding element - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - mac_header_ptr++; + mac_header_ptr->E = 1; + mac_header_ptr+=last_size; + // add a padding element + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + mac_header_ptr++; } else { // no end of packet padding - // last SDU subhead is of fixed type (sdu length implicitly to be computed at UE) - mac_header_ptr++; + // last SDU subhead is of fixed type (sdu length implicitly to be computed at UE) + mac_header_ptr++; } // Copy MSI Control Element to the end of the MAC Header if it presents if ((ce_ptr-mac_header_control_elements) > 0) { - // printf("Copying %d bytes for control elements\n",ce_ptr-mac_header_control_elements); - memcpy((void*)mac_header_ptr,mac_header_control_elements,ce_ptr-mac_header_control_elements); - mac_header_ptr+=(unsigned char)(ce_ptr-mac_header_control_elements); + // printf("Copying %d bytes for control elements\n",ce_ptr-mac_header_control_elements); + memcpy((void*)mac_header_ptr,mac_header_control_elements,ce_ptr-mac_header_control_elements); + mac_header_ptr+=(unsigned char)(ce_ptr-mac_header_control_elements); } return((unsigned char*)mac_header_ptr - mac_header); -} -#endif + } + #endif */ void add_common_dci(DCI_PDU *DCI_pdu, void *pdu, @@ -980,6 +978,8 @@ void add_ue_spec_dci(DCI_PDU *DCI_pdu,void *pdu,u16 rnti,unsigned char dci_size_ void schedule_SI(unsigned char Mod_id,u32 frame, unsigned char *nprb,unsigned int *nCCE) { unsigned char bcch_sdu_length; + int mcs; + void *BCCH_alloc_pdu=(void*)&eNB_mac_inst[Mod_id].BCCH_alloc_pdu; bcch_sdu_length = mac_rrc_data_req(Mod_id, frame, @@ -990,45 +990,59 @@ void schedule_SI(unsigned char Mod_id,u32 frame, unsigned char *nprb,unsigned in if (bcch_sdu_length > 0) { LOG_D(MAC,"[eNB %d] Frame %d : BCCH->DLSCH, Received %d bytes \n",Mod_id,frame,bcch_sdu_length); + + if (bcch_sdu_length <= (mac_xface->get_TBS_DL(0,3))) + mcs=0; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(1,3))) + mcs=1; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(2,3))) + mcs=2; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(3,3))) + mcs=3; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(4,3))) + mcs=4; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(5,3))) + mcs=5; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(6,3))) + mcs=6; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(7,3))) + mcs=7; + else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(8,3))) + mcs=8; + if (mac_xface->lte_frame_parms->frame_type == TDD) { - if (bcch_sdu_length <= (mac_xface->get_TBS_DL(0,3))) - BCCH_alloc_pdu.mcs=0; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(1,3))) - BCCH_alloc_pdu.mcs=1; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(2,3))) - BCCH_alloc_pdu.mcs=2; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(3,3))) - BCCH_alloc_pdu.mcs=3; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(4,3))) - BCCH_alloc_pdu.mcs=4; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(5,3))) - BCCH_alloc_pdu.mcs=5; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(6,3))) - BCCH_alloc_pdu.mcs=6; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(7,3))) - BCCH_alloc_pdu.mcs=7; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(8,3))) - BCCH_alloc_pdu.mcs=8; + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + case 25: + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + case 50: + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + case 100: + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + + } } else { - if (bcch_sdu_length <= (mac_xface->get_TBS_DL(0,3))) - BCCH_alloc_pdu_fdd.mcs=0; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(1,3))) - BCCH_alloc_pdu_fdd.mcs=1; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(2,3))) - BCCH_alloc_pdu_fdd.mcs=2; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(3,3))) - BCCH_alloc_pdu_fdd.mcs=3; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(4,3))) - BCCH_alloc_pdu_fdd.mcs=4; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(5,3))) - BCCH_alloc_pdu_fdd.mcs=5; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(6,3))) - BCCH_alloc_pdu_fdd.mcs=6; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(7,3))) - BCCH_alloc_pdu_fdd.mcs=7; - else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(8,3))) - BCCH_alloc_pdu_fdd.mcs=8; + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + case 25: + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + case 50: + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + case 100: + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; + break; + + } } #if defined(USER_MODE) && defined(OAI_EMU) @@ -1043,15 +1057,15 @@ void schedule_SI(unsigned char Mod_id,u32 frame, unsigned char *nprb,unsigned in LOG_D(MAC,"[eNB] Frame %d : Scheduling BCCH->DLSCH (TDD) for SI %d bytes (mcs %d, rb 3, TBS %d)\n", frame, bcch_sdu_length, - BCCH_alloc_pdu.mcs, - mac_xface->get_TBS_DL(BCCH_alloc_pdu.mcs,3)); + mcs, + mac_xface->get_TBS_DL(mcs,3)); } else { LOG_D(MAC,"[eNB] Frame %d : Scheduling BCCH->DLSCH (FDD) for SI %d bytes (mcs %d, rb 3, TBS %d)\n", frame, bcch_sdu_length, - BCCH_alloc_pdu_fdd.mcs, - mac_xface->get_TBS_DL(BCCH_alloc_pdu_fdd.mcs,3)); + mcs, + mac_xface->get_TBS_DL(mcs,3)); } eNB_mac_inst[Mod_id].bcch_active=1; *nprb=3; @@ -1092,7 +1106,7 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { break; } - // 1st: Check the MBSFN subframes + // 1st: Check the MBSFN subframes if (frame % mbsfn_period == eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[0]->radioframeAllocationOffset){ // MBSFN frame if (eNB_mac_inst[Mod_id].mbsfn_SubframeConfig[0]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame){// one-frame format @@ -1261,9 +1275,9 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { u16 sdu_lengths[11], sdu_length_total=0; unsigned char mch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; // check the max value, this is for dlsch only - // there is MSI (MCH Scheduling Info) + // there is MSI (MCH Scheduling Info) if (msi_flag == 1) { - // Create MSI here + // Create MSI here u16 msi_control_element[29], *msi_ptr; msi_ptr = &msi_control_element[0]; @@ -1296,15 +1310,15 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { // LOG_D(MAC,"Scheduler: MSI length is %d bytes\n",msi_length); // Store MSI data to mch_buffer[0] memcpy((char *)&mch_buffer[sdu_length_total], - msi_control_element, - msi_length); + msi_control_element, + msi_length); sdu_lcids[num_sdus] = MCH_SCHDL_INFO; sdu_lengths[num_sdus] = msi_length; sdu_length_total += sdu_lengths[num_sdus]; LOG_I(MAC,"[eNB %d] Create %d bytes for MSI\n",Mod_id,sdu_lengths[num_sdus]); num_sdus++; - } + } // there is MCCH if (mcch_flag == 1) { @@ -1319,7 +1333,7 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { if (mcch_sdu_length > 0) { LOG_D(MAC,"[eNB %d] Frame %d : MCCH->MCH, Received %d bytes from RRC \n",Mod_id,frame,mcch_sdu_length); - header_len_mcch = 2; + header_len_mcch = 2; if (mac_xface->lte_frame_parms->frame_type == TDD) { LOG_D(MAC,"[eNB %d] Frame %d : Scheduling MCCH->MCH (TDD) for MCCH message %d bytes (mcs %d )\n", Mod_id, @@ -1337,8 +1351,8 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { eNB_mac_inst[Mod_id].mcch_active=1; memcpy((char *)&mch_buffer[sdu_length_total], - &eNB_mac_inst[Mod_id].MCCH_pdu.payload[0], - mcch_sdu_length); + &eNB_mac_inst[Mod_id].MCCH_pdu.payload[0], + mcch_sdu_length); sdu_lcids[num_sdus] = MCCH_LCHANID; sdu_lengths[num_sdus] = mcch_sdu_length; if (sdu_lengths[num_sdus]>128) @@ -1348,7 +1362,7 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { num_sdus++; } eNB_mac_inst[Mod_id].mcch_active=0; - } + } // there is MTCHs, loop if there are more than 1 if (mtch_flag == 1) { @@ -1360,37 +1374,37 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { LOG_D(MAC,"[eNB %d] Frame %d : MTCH data is transmitted on this subframe\n",Mod_id,frame); /* header_len_mtch = 3; - LOG_D(MAC,"[eNB %d], Frame %d, MTCH->MCH, Checking RLC status (rab %d, tbs %d, len %d)\n", + LOG_D(MAC,"[eNB %d], Frame %d, MTCH->MCH, Checking RLC status (rab %d, tbs %d, len %d)\n", Mod_id,frame,MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)),TBS, TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); - rlc_status = mac_rlc_status_ind(Mod_id,frame,1,MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)), - TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); + rlc_status = mac_rlc_status_ind(Mod_id,frame,1,MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)), + TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); - if (rlc_status.bytes_in_buffer >0) { - // LOG_I(MAC,"[eNB %d][MBMS USER-PLANE], Frame %d, MTCH->MCH, Requesting %d bytes from RLC (header len mtch %d)\n", - // Mod_id,frame,TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch,header_len_mtch); + if (rlc_status.bytes_in_buffer >0) { + // LOG_I(MAC,"[eNB %d][MBMS USER-PLANE], Frame %d, MTCH->MCH, Requesting %d bytes from RLC (header len mtch %d)\n", + // Mod_id,frame,TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch,header_len_mtch); - sdu_lengths[num_sdus] = mac_rlc_data_req(Mod_id,frame, RLC_MBMS_NO - MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)), - (char*)&mch_buffer[sdu_length_total]); - LOG_I(MAC,"[eNB %d][MBMS USER-PLANE] Got %d bytes for MTCH %d\n",Mod_id,sdu_lengths[num_sdus],MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1))); - sdu_lcids[num_sdus] = MTCH; - sdu_length_total += sdu_lengths[num_sdus]; - if (sdu_lengths[num_sdus] < 128) - header_len_mtch = 2; - num_sdus++; - } - else { - header_len_mtch = 0; - } + sdu_lengths[num_sdus] = mac_rlc_data_req(Mod_id,frame, RLC_MBMS_NO + MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)), + (char*)&mch_buffer[sdu_length_total]); + LOG_I(MAC,"[eNB %d][MBMS USER-PLANE] Got %d bytes for MTCH %d\n",Mod_id,sdu_lengths[num_sdus],MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1))); + sdu_lcids[num_sdus] = MTCH; + sdu_length_total += sdu_lengths[num_sdus]; + if (sdu_lengths[num_sdus] < 128) + header_len_mtch = 2; + num_sdus++; + } + else { + header_len_mtch = 0; + } */ } - // FINAL STEP: Prepare and multiplexe MSI, MCCH and MTCHs + // FINAL STEP: Prepare and multiplexe MSI, MCCH and MTCHs if ((sdu_length_total + header_len_msi + header_len_mcch + header_len_mtch) >0) { - // Adjust the last subheader + // Adjust the last subheader header_len_mtch_temp = header_len_mtch; header_len_mcch_temp = header_len_mcch; header_len_msi_temp = header_len_msi; @@ -1399,7 +1413,7 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { else if (header_len_mcch>0) header_len_mcch=1; else header_len_msi=1; - // Calculate the padding + // Calculate the padding if ((TBS - header_len_mtch - header_len_mcch - header_len_msi - sdu_length_total) <= 2) { padding = (TBS - header_len_mtch - header_len_mcch - header_len_msi - sdu_length_total); post_padding = 0; @@ -1435,18 +1449,18 @@ int schedule_MBMS(unsigned char Mod_id,u32 frame, u8 subframe) { for (j=0;j<(TBS-sdu_length_total-offset);j++) eNB_mac_inst[Mod_id].MCH_pdu.payload[offset+sdu_length_total+j] = (char)(taus()&0xff); - return 1; + return 1; } - else - return 0; + else + return 0; //this is for testing /* if (mtch_flag == 1) { - // LOG_D(MAC,"DUY: mch_buffer length so far is : %ld\n", &mch_buffer[sdu_length_total]-&mch_buffer[0]); - return 1; + // LOG_D(MAC,"DUY: mch_buffer length so far is : %ld\n", &mch_buffer[sdu_length_total]-&mch_buffer[0]); + return 1; } else - return 0; + return 0; */ } @@ -1520,59 +1534,238 @@ void schedule_RA(unsigned char Mod_id,u32 frame, unsigned char subframe,unsigned msg4_header = 1+6+1; // CR header, CR CE, SDU header if (mac_xface->lte_frame_parms->frame_type == TDD) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } - else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } - else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } - else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } - else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } - else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + case 25: + + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + case 50: + + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + case 100: + + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; } } else { // FDD DCI - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } - else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } - else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } - else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } - else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } - else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + case 25: + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + case 50: + ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; + case 100: + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1; + + if ((rrc_sdu_length+msg4_header) <= 22) { + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4; + TBsize = 22; + } + else if ((rrc_sdu_length+msg4_header) <= 28) { + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5; + TBsize = 28; + } + else if ((rrc_sdu_length+msg4_header) <= 32) { + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6; + TBsize = 32; + } + else if ((rrc_sdu_length+msg4_header) <= 41) { + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7; + TBsize = 41; + } + else if ((rrc_sdu_length+msg4_header) <= 49) { + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8; + TBsize = 49; + } + else if ((rrc_sdu_length+msg4_header) <= 57) { + ((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9; + TBsize = 57; + } + break; } } RA_template[i].generate_Msg4=0; @@ -1620,16 +1813,16 @@ void schedule_RA(unsigned char Mod_id,u32 frame, unsigned char subframe,unsigned //try here } /* - else if (eNB_mac_inst[Mod_id].RA_template[i].wait_ack_Msg4==1) { + else if (eNB_mac_inst[Mod_id].RA_template[i].wait_ack_Msg4==1) { // check HARQ status and retransmit if necessary LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframe %d: Checking if Msg4 was acknowledged :\n",Mod_id,frame,subframe); // Get candidate harq_pid from PHY mac_xface->get_ue_active_harq_pid(Mod_id,eNB_mac_inst[Mod_id].RA_template[i].rnti,subframe,&harq_pid,&round,0); if (round>0) { - *nprb= (*nprb) + 3; - *nCCE = (*nCCE) + 4; + *nprb= (*nprb) + 3; + *nCCE = (*nCCE) + 4; + } } - } */ } } @@ -1673,20 +1866,22 @@ void schedule_ulsch(unsigned char Mod_id,u32 frame,unsigned char cooperation_fla unsigned char granted_UEs; unsigned int nCCE_available; + + u16 first_rb=1,i; granted_UEs = find_ulgranted_UEs(Mod_id); nCCE_available = mac_xface->get_nCCE_max(Mod_id) - *nCCE; -// UE data info; -// check which UE has data to transmit -// function to decide the scheduling -// e.g. scheduling_rslt = Greedy(granted_UEs, nb_RB) + // UE data info; + // check which UE has data to transmit + // function to decide the scheduling + // e.g. scheduling_rslt = Greedy(granted_UEs, nb_RB) -// default function for default scheduling -// + // default function for default scheduling + // -// output of scheduling, the UE numbers in RBs, where it is in the code??? + // output of scheduling, the UE numbers in RBs, where it is in the code??? // check if RA (Msg3) is active in this subframe, if so skip the PRBs used for Msg3 // Msg3 is using 1 PRB so we need to increase first_rb accordingly // not sure about the break (can there be more than 1 active RA procedure?) @@ -1745,11 +1940,11 @@ void schedule_ulsch_cba_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 fram while (rb_table[rb_table_index] < required_rbs[cba_group]) rb_table_index++; - while (rb_table[rb_table_index] > remaining_rbs ) + while (rb_table[rb_table_index] > remaining_rbs ) rb_table_index--; - remaining_rbs-=rb_table[rb_table_index]; - required_rbs[cba_group]=rb_table[rb_table_index]; + remaining_rbs-=rb_table[rb_table_index]; + required_rbs[cba_group]=rb_table[rb_table_index]; */ // to be refined if (weight[cba_group] < required_rbs[cba_group]) @@ -1812,13 +2007,13 @@ void schedule_ulsch_cba_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 fram //add_ue_spec_dci add_common_dci(DCI_pdu, - ULSCH_dci_tdd16, - eNB_mac_inst[Mod_id].cba_rnti[cba_group], - sizeof(DCI0_5MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_5MHz_TDD_1_6_t, - format0, - 0); + ULSCH_dci_tdd16, + eNB_mac_inst[Mod_id].cba_rnti[cba_group], + sizeof(DCI0_5MHz_TDD_1_6_t), + aggregation, + sizeof_DCI0_5MHz_TDD_1_6_t, + format0, + 0); } else { ULSCH_dci_fdd = (DCI0_5MHz_FDD_t *)eNB_mac_inst[Mod_id].UE_template[cba_group].ULSCH_DCI[0]; @@ -1833,14 +2028,14 @@ void schedule_ulsch_cba_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 fram ULSCH_dci_fdd->cqi_req = 1; //add_ue_spec_dci - add_common_dci(DCI_pdu, - ULSCH_dci_fdd, - eNB_mac_inst[Mod_id].cba_rnti[cba_group], - sizeof(DCI0_5MHz_FDD_t), - aggregation, - sizeof_DCI0_5MHz_FDD_t, - format0, - 0); + add_common_dci(DCI_pdu, + ULSCH_dci_fdd, + eNB_mac_inst[Mod_id].cba_rnti[cba_group], + sizeof(DCI0_5MHz_FDD_t), + aggregation, + sizeof_DCI0_5MHz_FDD_t, + format0, + 0); } *nCCE = (*nCCE) + (1<<aggregation) * num_cba_resources[cba_group]; *nCCE_available = mac_xface->get_nCCE_max(Mod_id) - *nCCE; @@ -1856,8 +2051,7 @@ void schedule_ulsch_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 frame, u u16 rnti; u8 round = 0; u8 harq_pid = 0; - DCI0_5MHz_TDD_1_6_t *ULSCH_dci_tdd16; - DCI0_5MHz_FDD_t *ULSCH_dci_fdd; + void *ULSCH_dci; LTE_eNB_UE_stats* eNB_UE_stats; DCI_PDU *DCI_pdu= &eNB_mac_inst[Mod_id].DCI_pdu; @@ -1896,8 +2090,6 @@ void schedule_ulsch_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 frame, u if ((((UE_is_to_be_scheduled(Mod_id,UE_id)>0)) || (round>0) || ((frame%10)==0)) && (ret == 0)) { // if there is information on bsr of DCCH, DTCH or if there is UL_SR, or if there is a packet to retransmit, or we want to schedule a periodic feedback every 10 frames - //if (((UE_id%2)==(sched_subframe%2))) - //this condition will make UEs with odd IDs go into odd subframes and UEs with even IDs in even subframes. LOG_D(MAC,"[eNB %d][PUSCH %x] Frame %d subframe %d Scheduling UE %d (SR %d)\n", Mod_id,rnti,frame,subframe,UE_id, @@ -1965,8 +2157,8 @@ void schedule_ulsch_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 frame, u rb_table[rb_table_index]<(mac_xface->lte_frame_parms->N_RB_UL-1-*first_rb)){ // continue until we've exhauster the UEs request or the total number of available PRBs /* LOG_I(MAC,"[eNB %d][PUSCH %x] Frame %d subframe %d Scheduled UE (rb_table_index %d => TBS %d)\n", - Mod_id,rnti,frame,subframe, - rb_table_index,TBS); + Mod_id,rnti,frame,subframe, + rb_table_index,TBS); */ rb_table_index++; TBS = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); @@ -2024,10 +2216,10 @@ void schedule_ulsch_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 frame, u } } else { // we have flushed all buffers so clear bsr - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0] = 0; - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1] = 0; - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2] = 0; - eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3] = 0; + eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0] = 0; + eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID1] = 0; + eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID2] = 0; + eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID3] = 0; } @@ -2056,49 +2248,189 @@ void schedule_ulsch_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 frame, u cshift = 0;// values from 0 to 7 can be used for mapping the cyclic shift (36.211 , Table 5.5.2.1.1-1) if (mac_xface->lte_frame_parms->frame_type == TDD) { - ULSCH_dci_tdd16 = (DCI0_5MHz_TDD_1_6_t *)eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; - - ULSCH_dci_tdd16->type = 0; - ULSCH_dci_tdd16->hopping = 0; - ULSCH_dci_tdd16->rballoc = rballoc; - ULSCH_dci_tdd16->mcs = mcs; - ULSCH_dci_tdd16->ndi = ndi; - ULSCH_dci_tdd16->TPC = 1; - ULSCH_dci_tdd16->cshift = cshift; - ULSCH_dci_tdd16->dai = eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[sched_subframe]; - ULSCH_dci_tdd16->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci_tdd16, - rnti, - sizeof(DCI0_5MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_5MHz_TDD_1_6_t, - format0, - 0); + switch (mac_xface->lte_frame_parms->N_RB_UL) { + case 6: + ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[sched_subframe]; + ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_1_5MHz_TDD_1_6_t), + aggregation, + sizeof_DCI0_1_5MHz_TDD_1_6_t, + format0, + 0); + break; + default: + case 25: + ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[sched_subframe]; + ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_5MHz_TDD_1_6_t), + aggregation, + sizeof_DCI0_5MHz_TDD_1_6_t, + format0, + 0); + break; + case 50: + ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->dai = eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[sched_subframe]; + ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_10MHz_TDD_1_6_t), + aggregation, + sizeof_DCI0_10MHz_TDD_1_6_t, + format0, + 0); + break; + case 100: + ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->dai = eNB_mac_inst[Mod_id].UE_template[next_ue].DAI_ul[sched_subframe]; + ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_20MHz_TDD_1_6_t), + aggregation, + sizeof_DCI0_20MHz_TDD_1_6_t, + format0, + 0); + break; + } } - else { - ULSCH_dci_fdd = (DCI0_5MHz_FDD_t *)eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; - - ULSCH_dci_fdd->type = 0; - ULSCH_dci_fdd->hopping = 0; - ULSCH_dci_fdd->rballoc = rballoc; - ULSCH_dci_fdd->mcs = mcs; - ULSCH_dci_fdd->ndi = ndi; - ULSCH_dci_fdd->TPC = 1; - ULSCH_dci_fdd->cshift = cshift; - ULSCH_dci_fdd->cqi_req = cqi_req; + else { //FDD + switch (mac_xface->lte_frame_parms->N_RB_UL) { + case 25: + default: + + ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->type = 0; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->hopping = 0; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->TPC = 1; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_5MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_5MHz_FDD_t), + aggregation, + sizeof_DCI0_5MHz_FDD_t, + format0, + 0); + break; + case 6: + ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->type = 0; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->hopping = 0; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->TPC = 1; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_1_5MHz_FDD_t), + aggregation, + sizeof_DCI0_1_5MHz_FDD_t, + format0, + 0); + break; + case 50: + ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->type = 0; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->hopping = 0; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->TPC = 1; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_10MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_10MHz_FDD_t), + aggregation, + sizeof_DCI0_10MHz_FDD_t, + format0, + 0); + break; + case 100: + ULSCH_dci = eNB_mac_inst[Mod_id].UE_template[next_ue].ULSCH_DCI[harq_pid]; + + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->type = 0; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->hopping = 0; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->mcs = mcs; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->ndi = ndi; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->TPC = 1; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->cshift = cshift; + ((DCI0_20MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; + + add_ue_spec_dci(DCI_pdu, + ULSCH_dci, + rnti, + sizeof(DCI0_20MHz_FDD_t), + aggregation, + sizeof_DCI0_20MHz_FDD_t, + format0, + 0); + break; - add_ue_spec_dci(DCI_pdu, - ULSCH_dci_fdd, - rnti, - sizeof(DCI0_5MHz_FDD_t), - aggregation, - sizeof_DCI0_5MHz_FDD_t, - format0, - 0); - } - + } + } //#ifdef DEBUG_eNB_SCHEDULER // dump_dci(mac_xface->lte_frame_parms, // &DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci-1]); @@ -2148,19 +2480,37 @@ u32 allocate_prbs(unsigned char UE_id,unsigned char nb_rb, u32 *rballoc) { u32 allocate_prbs_sub(int nb_rb, u8 *rballoc) { - u8 check=0;//check1=0,check2=0; - u16 rballoc_dci=0; + int check=0;//check1=0,check2=0; + uint32_t rballoc_dci=0; //u8 number_of_subbands=13; - LOG_D(MAC,"*****Check1RBALLOC****: %d%d%d%d\n",rballoc[3],rballoc[2],rballoc[1],rballoc[0]); + LOG_D(MAC,"*****Check1RBALLOC****: %d%d%d%d (nb_rb %d,N_RBGS %d)\n", + rballoc[3],rballoc[2],rballoc[1],rballoc[0],nb_rb,mac_xface->lte_frame_parms->N_RBGS); while((nb_rb >0) && (check < mac_xface->lte_frame_parms->N_RBGS)){ + printf("rballoc[%d] %d\n",check,rballoc[check]); if(rballoc[check] == 1){ rballoc_dci |= (1<<((mac_xface->lte_frame_parms->N_RBGS-1)-check)); - if((check == mac_xface->lte_frame_parms->N_RBGS-1) && (mac_xface->lte_frame_parms->N_RB_DL%2 == 1)) - nb_rb = nb_rb -1; - else - nb_rb = nb_rb -2; + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + nb_rb--; + case 25: + if ((check == mac_xface->lte_frame_parms->N_RBGS-1)) + nb_rb--; + else + nb_rb-=2; + break; + case 50: + if ((check == mac_xface->lte_frame_parms->N_RBGS-1)) + nb_rb-=2; + else + nb_rb-=3; + break; + case 100: + nb_rb-=4; + break; + } } + printf("rb_alloc %x\n",rballoc_dci); check = check+1; // check1 = check1+2; } @@ -2188,18 +2538,9 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R DCI_PDU *DCI_pdu= &eNB_mac_inst[Mod_id].DCI_pdu; int i; // u8 status=0; -#ifdef ICIC - FILE *DCIi; - DCIi = fopen("dci.txt","a"); - int b; - buff=rballoc; - fprintf(DCIi,"eNB: %d active user: %d |rballoc init:\t\t\t",Mod_id,find_active_UEs(Mod_id)); - for (b=31;b>=0;b--) - fprintf(DCIi,"%d",(buff>>b)&1); - fprintf(DCIi,"\n"); - -#endif + void *BCCH_alloc_pdu=(void*)&eNB_mac_inst[Mod_id].BCCH_alloc_pdu; + int size_bits,size_bytes; if (mbsfn_flag>0) return; @@ -2215,11 +2556,10 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R // randomize frequency allocation for SI first_rb = (unsigned char)(taus()%(mac_xface->lte_frame_parms->N_RB_DL-4)); if (mac_xface->lte_frame_parms->frame_type == TDD) { - BCCH_alloc_pdu.rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); - rballoc |= mac_xface->get_rballoc(BCCH_alloc_pdu.vrb_type,BCCH_alloc_pdu.rballoc); + } else { - BCCH_alloc_pdu_fdd.rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); + BCCH_alloc_pdu_fdd.rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); rballoc |= mac_xface->get_rballoc(BCCH_alloc_pdu_fdd.vrb_type,BCCH_alloc_pdu_fdd.rballoc); } @@ -2229,22 +2569,152 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R vrb_map[first_rb+3] = 1; if (mac_xface->lte_frame_parms->frame_type == TDD) { - add_common_dci(DCI_pdu, - &BCCH_alloc_pdu, - SI_RNTI, - sizeof(DCI1A_5MHz_TDD_1_6_t), - 2, - sizeof_DCI1A_5MHz_TDD_1_6_t, - format1A,0); + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; + rballoc |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_1_5MHz_TDD_1_6_t), + 2, + sizeof_DCI1A_1_5MHz_TDD_1_6_t, + format1A,0); + break; + case 25: + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; + rballoc |= mac_xface->get_rballoc(0,((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_5MHz_TDD_1_6_t), + 2, + sizeof_DCI1A_5MHz_TDD_1_6_t, + format1A,0); + break; + case 50: + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; + rballoc |= mac_xface->get_rballoc(0,((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_10MHz_TDD_1_6_t), + 2, + sizeof_DCI1A_10MHz_TDD_1_6_t, + format1A,0); + break; + case 100: + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; + rballoc |= mac_xface->get_rballoc(0,((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_20MHz_TDD_1_6_t), + 2, + sizeof_DCI1A_20MHz_TDD_1_6_t, + format1A,0); + break; + } } else { - add_common_dci(DCI_pdu, - &BCCH_alloc_pdu_fdd, - SI_RNTI, - sizeof(DCI1A_5MHz_FDD_t), - 2, - sizeof_DCI1A_5MHz_FDD_t, - format1A,0); + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; + + rballoc |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_1_5MHz_FDD_t), + 2, + sizeof_DCI1A_1_5MHz_FDD_t, + format1A,0); + break; + case 25: + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; + + rballoc |= mac_xface->get_rballoc(0,((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_5MHz_FDD_t), + 2, + sizeof_DCI1A_5MHz_FDD_t, + format1A,0); + break; + case 50: + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; + + rballoc |= mac_xface->get_rballoc(0,((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_10MHz_FDD_t), + 2, + sizeof_DCI1A_10MHz_FDD_t, + format1A,0); + break; + case 100: + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; + + rballoc |= mac_xface->get_rballoc(0,((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); + add_common_dci(DCI_pdu, + BCCH_alloc_pdu, + SI_RNTI, + sizeof(DCI1A_20MHz_FDD_t), + 2, + sizeof_DCI1A_20MHz_FDD_t, + format1A,0); + break; + } } } if (RA_scheduled == 1) { @@ -2257,7 +2727,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R LOG_D(MAC,"[eNB %d] Frame %d, subframe %d: Generating RAR DCI (proc %d), RA_active %d format 1A (%d,%d))\n", Mod_id,frame, subframe,i, - eNB_mac_inst[Mod_id].RA_template[i].RA_active, + eNB_mac_inst[Mod_id].RA_template[i].RA_active, eNB_mac_inst[Mod_id].RA_template[i].RA_dci_fmt1, eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bits1); // randomize frequency allocation for RA @@ -2272,35 +2742,138 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R vrb_map[first_rb+3] = 1; if (mac_xface->lte_frame_parms->frame_type == TDD) { - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); - - - add_common_dci(DCI_pdu, - (void*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0], - eNB_mac_inst[Mod_id].RA_template[i].RA_rnti, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bytes1, - 2, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bits1, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_fmt1, - 1); - } + switch(mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + case 25: + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + case 50: + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + case 100: + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + default: + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + } + } else { - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); - - - add_common_dci(DCI_pdu, - (void*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0], - eNB_mac_inst[Mod_id].RA_template[i].RA_rnti, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bytes1, - 2, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bits1, - eNB_mac_inst[Mod_id].RA_template[i].RA_dci_fmt1, - 1); + switch(mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + case 25: + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + case 50: + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + case 100: + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->type=1; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->ndi=1; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rv=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); + break; + default: + break; + } } + add_common_dci(DCI_pdu, + (void*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0], + eNB_mac_inst[Mod_id].RA_template[i].RA_rnti, + eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bytes1, + 2, + eNB_mac_inst[Mod_id].RA_template[i].RA_dci_size_bits1, + eNB_mac_inst[Mod_id].RA_template[i].RA_dci_fmt1, + 1); + + + LOG_D(MAC,"[eNB %d] Frame %d: Adding common dci for RA%d (RAR) RA_active %d\n",Mod_id,frame,i, eNB_mac_inst[Mod_id].RA_template[i].RA_active); } @@ -2318,15 +2891,113 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R vrb_map[first_rb+3] = 1; if (mac_xface->lte_frame_parms->frame_type == TDD) { - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + case 25: + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + case 50: + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + case 100: + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + default: + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + } } else { - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); - rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); - + switch (mac_xface->lte_frame_parms->N_RB_DL) { + + case 6: + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + case 25: + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + case 50: + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + case 100: + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + default: + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->type=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rv=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->harq_pid=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->TPC=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); + rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->vrb_type, + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->rballoc); + break; + } } add_ue_spec_dci(DCI_pdu, @@ -2425,47 +3096,85 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R case 2: LOG_D(MAC,"[USER-PLANE DEFAULT DRB] Adding UE spec DCI for %d PRBS (%x) => ",nb_rb,rballoc); if (mac_xface->lte_frame_parms->frame_type == TDD) { - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; - LOG_D(MAC,"[USER-PLANE DEFAULT DRB] %x\n",((DCI1_5MHz_TDD_t*)DLSCH_dci)->rballoc); - add_ue_spec_dci(DCI_pdu, - DLSCH_dci, - rnti, - sizeof(DCI1_5MHz_TDD_t), - process_ue_cqi (Mod_id,UE_id),//aggregation, - sizeof_DCI1_5MHz_TDD_t, - format1, - 0); + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; + size_bytes = sizeof(DCI1_1_5MHz_TDD_t); + size_bits = sizeof_DCI1_1_5MHz_TDD_t; + break; + case 25: + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; + size_bytes = sizeof(DCI1_5MHz_TDD_t); + size_bits = sizeof_DCI1_5MHz_TDD_t; + break; + case 50: + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rah = 0; + size_bytes = sizeof(DCI1_10MHz_TDD_t); + size_bits = sizeof_DCI1_10MHz_TDD_t; + break; + case 100: + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rah = 0; + size_bytes = sizeof(DCI1_20MHz_TDD_t); + size_bits = sizeof_DCI1_20MHz_TDD_t; + break; + default: + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; + size_bytes = sizeof(DCI1_5MHz_TDD_t); + size_bits = sizeof_DCI1_5MHz_TDD_t; + break; + } + + } else { - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; - // printf("%x\n",((DCI1_5MHz_TDD_t*)DLSCH_dci)->rballoc); - add_ue_spec_dci(DCI_pdu, - DLSCH_dci, - rnti, - sizeof(DCI1_5MHz_FDD_t), - process_ue_cqi (Mod_id,UE_id),//aggregation, - sizeof_DCI1_5MHz_FDD_t, - format1, - 0); + switch(mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; + size_bytes=sizeof(DCI1_1_5MHz_FDD_t); + size_bits=sizeof_DCI1_1_5MHz_FDD_t; + break; + case 25: + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; + size_bytes=sizeof(DCI1_5MHz_FDD_t); + size_bits=sizeof_DCI1_5MHz_FDD_t; + break; + case 50: + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rah = 0; + size_bytes=sizeof(DCI1_10MHz_FDD_t); + size_bits=sizeof_DCI1_10MHz_FDD_t; + break; + case 100: + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rah = 0; + size_bytes=sizeof(DCI1_20MHz_FDD_t); + size_bits=sizeof_DCI1_20MHz_FDD_t; + break; + default: + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; + size_bytes=sizeof(DCI1_5MHz_FDD_t); + size_bits=sizeof_DCI1_5MHz_FDD_t; + break; + } } -#ifdef ICIC - buff=rballoc; - fprintf(DCIi,"eNB: %d|rballoc DLSCH:\t\t\t\t\t",Mod_id); - for (b=31;b>=0;b--) - fprintf(DCIi,"%d",(buff>>b)&1); - fprintf(DCIi,"\n"); - - buff=test; - fprintf(DCIi,"eNB: %d|rballoc DLSCH DCI:\t\t\t\t",Mod_id); - for (b=31;b>=0;b--) - fprintf(DCIi,"%d",(buff>>b)&1); - fprintf(DCIi,"\n"); -#endif - - + add_ue_spec_dci(DCI_pdu, + DLSCH_dci, + rnti, + size_bytes, + process_ue_cqi (Mod_id,UE_id),//aggregation, + size_bits, + format1, + 0); + break; case 4: @@ -2526,10 +3235,6 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R } -#ifdef ICIC - fclose(DCIi); -#endif - } @@ -2550,7 +3255,12 @@ void update_ul_dci(u8 Mod_id,u16 rnti,u8 dai) { // printf("Update UL DCI: DAI %d\n",dai); } -void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 nb_rb_used0,unsigned int *nCCE_used,int mbsfn_flag) { +void schedule_ue_spec(unsigned char Mod_id, + u32 frame, + unsigned char subframe, + u16 nb_rb_used0, + unsigned int *nCCE_used, + int mbsfn_flag) { unsigned char UE_id; unsigned char next_ue; @@ -2570,22 +3280,46 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 // unsigned char loop_count; unsigned char DAI; u16 i=0,ii=0,tpmi0=1; - u8 dl_pow_off[256]; - unsigned char rballoc_sub_UE[256][mac_xface->lte_frame_parms->N_RBGS]; - unsigned char rballoc_sub[mac_xface->lte_frame_parms->N_RBGS]; - u16 pre_nb_available_rbs[256]; + u8 dl_pow_off[NUMBER_OF_UE_MAX]; + unsigned char rballoc_sub_UE[NUMBER_OF_UE_MAX][N_RBGS_MAX]; + unsigned char rballoc_sub[N_RBGS_MAX]; + u16 pre_nb_available_rbs[NUMBER_OF_UE_MAX]; int mcs; //u8 number_of_subbands=13; + u16 min_rb_unit; + + + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + min_rb_unit=1; + break; + case 25: + min_rb_unit=2; + break; + case 50: + min_rb_unit=3; + break; + case 100: + min_rb_unit=4; + break; + default: + min_rb_unit=2; + break; + } + if (mbsfn_flag>0) return; //int **rballoc_sub = (int **)malloc(1792*sizeof(int *)); granted_UEs = find_dlgranted_UEs(Mod_id); + + //weight = get_ue_weight(Mod_id,UE_id); aggregation = 1; // set to the maximum aggregation level + /// Initialization for pre-processor - for(i=0;i<256;i++){ + for(i=0;i<NUMBER_OF_UE_MAX;i++){ pre_nb_available_rbs[i] = 0; dl_pow_off[i] = 2; for(j=0;j<mac_xface->lte_frame_parms->N_RBGS;j++){ @@ -2594,6 +3328,7 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 } } + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[i].pre_nb_available_rbs = 0; for (j = 0; j < mac_xface->lte_frame_parms->N_RBGS; j++) { @@ -2601,9 +3336,11 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 } } + // set current available nb_rb and nCCE to maximum nb_available_rb = mac_xface->lte_frame_parms->N_RB_DL - nb_rb_used0; nCCE = mac_xface->get_nCCE_max(Mod_id) - *nCCE_used; + // store the goloabl enb stats eNB_mac_inst[Mod_id].eNB_stats.num_dlactive_UEs = granted_UEs; eNB_mac_inst[Mod_id].eNB_stats.available_prbs = nb_available_rb; @@ -2611,23 +3348,27 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 eNB_mac_inst[Mod_id].eNB_stats.available_ncces = nCCE; eNB_mac_inst[Mod_id].eNB_stats.dlsch_bytes_tx=0; eNB_mac_inst[Mod_id].eNB_stats.dlsch_pdus_tx=0; - /// CALLING Pre_Processor for tm5 - //if (mac_xface->get_transmission_mode(Mod_id,rnti)==5) { - //tm5_pre_processor(Mod_id,subframe,nb_rb_used0,*nCCE_used,dl_pow_off,pre_nb_available_rbs,rballoc_sub); /// CALLING Pre_Processor for downlink scheduling (Returns estimation of RBs required by each UE and the allocation on sub-band) - dlsch_scheduler_pre_processor(Mod_id,frame,subframe,dl_pow_off,pre_nb_available_rbs,rballoc_sub_UE); + dlsch_scheduler_pre_processor(Mod_id, + frame, + subframe, + dl_pow_off, + pre_nb_available_rbs, + mac_xface->lte_frame_parms->N_RBGS, + &rballoc_sub_UE[0][0]); + - for (UE_id=0;UE_id<granted_UEs;UE_id++) { rnti = find_UE_RNTI(Mod_id,UE_id); + eNB_mac_inst[Mod_id].eNB_UE_stats[UE_id].crnti= rnti; eNB_mac_inst[Mod_id].eNB_UE_stats[UE_id].rrc_status=mac_get_rrc_status(Mod_id,1,UE_id); - if (rnti==0) { - //LOG_E(MAC,"Cannot find rnti for UE_id %d (granted UEs %d)\n",UE_id,granted_UEs); - continue; + if (rnti==0) { + LOG_E(MAC,"Cannot find rnti for UE_id %d (granted UEs %d)\n",UE_id,granted_UEs); + mac_xface->macphy_exit("");//continue; } eNB_UE_stats = mac_xface->get_eNB_UE_stats(Mod_id,rnti); @@ -2638,14 +3379,14 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 mac_xface->get_ue_active_harq_pid(Mod_id,rnti,subframe,&harq_pid,&round,0); // printf("Got harq_pid %d, round %d\n",harq_pid,round); - + nb_available_rb = pre_nb_available_rbs[UE_id]; if ((nb_available_rb == 0) || (nCCE < (1<<aggregation))) { LOG_D(MAC,"UE %d: nb_availiable_rb exhausted (nb_rb_used %d, nb_available_rb %d, nCCE %d, aggregation %d)\n", UE_id, nb_rb_used0, nb_available_rb, nCCE, aggregation); //if(mac_xface->get_transmission_mode(Mod_id,rnti)==5) - continue; //to next user (there might be rbs availiable for other UEs in TM5 + continue; //to next user (there might be rbs availiable for other UEs in TM5 // else // break; } @@ -2704,10 +3445,9 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 //eNB_UE_stats->dlsch_mcs1 = openair_daq_vars.target_ue_dl_mcs; // int flag_LA=0; //printf("CQI %d\n",eNB_UE_stats->DL_cqi[0]); - if(flag_LA==0){ + if (flag_LA==0){ - switch(eNB_UE_stats->DL_cqi[0]) - { + switch(eNB_UE_stats->DL_cqi[0]) { case 0: eNB_UE_stats->dlsch_mcs1 = 0; break; @@ -2761,33 +3501,33 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 exit(-1); } } - else - { + else { // begin CQI to MCS mapping - if(mac_xface->get_transmission_mode(Mod_id,rnti)==1) - eNB_UE_stats->dlsch_mcs1 = cqi_mcs[0][eNB_UE_stats->DL_cqi[0]]; + if(mac_xface->get_transmission_mode(Mod_id,rnti)==1) + eNB_UE_stats->dlsch_mcs1 = cqi_mcs[0][eNB_UE_stats->DL_cqi[0]]; + else + if(mac_xface->get_transmission_mode(Mod_id,rnti)==2) + eNB_UE_stats->dlsch_mcs1 = cqi_mcs[1][eNB_UE_stats->DL_cqi[0]]; else - if(mac_xface->get_transmission_mode(Mod_id,rnti)==2) - eNB_UE_stats->dlsch_mcs1 = cqi_mcs[1][eNB_UE_stats->DL_cqi[0]]; + if(mac_xface->get_transmission_mode(Mod_id,rnti)==6 || mac_xface->get_transmission_mode(Mod_id,rnti)==5) + eNB_UE_stats->dlsch_mcs1 = cqi_mcs[2][eNB_UE_stats->DL_cqi[0]]; + // end CQI Mapping + // if MUMIMO is enabled with two UEs then adjust the CQI and MCS mapping + if(mac_xface->get_transmission_mode(Mod_id,rnti)==5 && dl_pow_off[UE_id]==0){ + snr_tm6 = cqi_snr[eNB_UE_stats->DL_cqi[0]]; + if (snr_tm6<snr_mcs[0]) + eNB_UE_stats->dlsch_mcs1 = 0; + else + if(snr_tm6>snr_mcs[27]) + eNB_UE_stats->dlsch_mcs1 = 27; else - if(mac_xface->get_transmission_mode(Mod_id,rnti)==6 || mac_xface->get_transmission_mode(Mod_id,rnti)==5) - eNB_UE_stats->dlsch_mcs1 = cqi_mcs[2][eNB_UE_stats->DL_cqi[0]]; - // end CQI Mapping - // if MUMIMO is enabled with two UEs then adjust the CQI and MCS mapping - if(mac_xface->get_transmission_mode(Mod_id,rnti)==5 && dl_pow_off[UE_id]==0){ - snr_tm6 = cqi_snr[eNB_UE_stats->DL_cqi[0]]; - if (snr_tm6<snr_mcs[0]) - eNB_UE_stats->dlsch_mcs1 = 0; - else - if(snr_tm6>snr_mcs[27]) - eNB_UE_stats->dlsch_mcs1 = 27; - else - for (i=0;i<27;i++){ - if(snr_tm6 > snr_mcs[i] && snr_tm6 < snr_mcs[i+1]) - eNB_UE_stats->dlsch_mcs1 = i; - } - } + for (i=0;i<27;i++){ + if(snr_tm6 > snr_mcs[i] && snr_tm6 < snr_mcs[i+1]) + eNB_UE_stats->dlsch_mcs1 = i; + } } + } + if(eNB_UE_stats->dlsch_mcs1>22) eNB_UE_stats->dlsch_mcs1=22; @@ -2795,22 +3535,6 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 // for TM5, limit the MCS to 16QAM - //if((mac_xface->get_transmission_mode(Mod_id,rnti)==5) || (mac_xface->get_transmission_mode(Mod_id,rnti)==6)) - //eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,15); - /* - if (mac_xface->get_transmission_mode(Mod_id,rnti)==5) { - - if (dl_pow_off[next_ue]==0) { - if (next_ue==0) - eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,16); - else - eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,9); - } - else - eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,16); - - */ - // for EXMIMO, limit the MCS to 16QAM as well #ifdef EXMIMO eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,16); @@ -2818,7 +3542,7 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 // Get candidate harq_pid from PHY mac_xface->get_ue_active_harq_pid(Mod_id,rnti,subframe,&harq_pid,&round,0); - // printf("Got harq_pid %d, round %d\n",harq_pid,round); + eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].harq_pid = harq_pid; eNB_mac_inst[Mod_id].eNB_UE_stats[next_ue].harq_round = round; // Note this code is for a specific DCI format @@ -2852,10 +3576,12 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 while((nb_rb_temp > 0) && (j<mac_xface->lte_frame_parms->N_RBGS)){ if(rballoc_sub_UE[next_ue][j] == 1){ eNB_mac_inst[Mod_id].UE_template[next_ue].rballoc_subband[harq_pid][j] = rballoc_sub_UE[next_ue][j]; - if((j == mac_xface->lte_frame_parms->N_RBGS-1) && (mac_xface->lte_frame_parms->N_RB_DL%2 == 1)) - nb_rb_temp = nb_rb_temp - 1; + if((j == mac_xface->lte_frame_parms->N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))) + nb_rb_temp = nb_rb_temp - min_rb_unit+1; else - nb_rb_temp = nb_rb_temp - 2; + nb_rb_temp = nb_rb_temp - min_rb_unit; } j = j+1; } @@ -2877,19 +3603,71 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 case 1: case 2: default: - if (mac_xface->lte_frame_parms->frame_type == TDD) { - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; - LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs); - } - else { - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = round&3; - LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs); - + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + if (mac_xface->lte_frame_parms->frame_type == TDD) { + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rv = round&3; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->mcs); + } + else { + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rv = round&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->mcs); + + } + break; + case 25: + if (mac_xface->lte_frame_parms->frame_type == TDD) { + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = round&3; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs); + } + else { + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = round&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs); + + } + break; + case 50: + if (mac_xface->lte_frame_parms->frame_type == TDD) { + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rv = round&3; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_10MHz_TDD_t*)DLSCH_dci)->mcs); + } + else { + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rv = round&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_10MHz_FDD_t*)DLSCH_dci)->mcs); + + } + break; + case 100: + if (mac_xface->lte_frame_parms->frame_type == TDD) { + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rv = round&3; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_20MHz_TDD_t*)DLSCH_dci)->mcs); + } + else { + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->ndi = 0; + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rv = round&3; + LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_20MHz_FDD_t*)DLSCH_dci)->mcs); + + } + break; } break; case 4: @@ -2966,8 +3744,8 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 if (rlc_status.bytes_in_buffer > 0) { // There is DCCH to transmit LOG_D(MAC,"[eNB %d] Frame %d, DL-DCCH->DLSCH, Requesting %d bytes from RLC (RRC message)\n",Mod_id,frame,TBS-header_len_dcch); sdu_lengths[0] += mac_rlc_data_req(Mod_id,frame,RLC_MBMS_NO, - DCCH+(NB_RB_MAX*next_ue), - (char *)&dlsch_buffer[sdu_lengths[0]]); + DCCH+(NB_RB_MAX*next_ue), + (char *)&dlsch_buffer[sdu_lengths[0]]); LOG_D(MAC,"[eNB %d][DCCH] Got %d bytes from RLC\n",Mod_id,sdu_lengths[0]); sdu_length_total = sdu_lengths[0]; @@ -2990,7 +3768,7 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 // check for DCCH1 and update header information (assume 2 byte sub-header) rlc_status = mac_rlc_status_ind(Mod_id,frame,1,RLC_MBMS_NO, DCCH+1+(NB_RB_MAX*next_ue), (TBS-ta_len-header_len_dcch-sdu_length_total)); // transport block set size less allocations for timing advance and - // DCCH SDU + // DCCH SDU if (rlc_status.bytes_in_buffer > 0) { LOG_D(MAC,"[eNB %d], Frame %d, DCCH1->DLSCH, Requesting %d bytes from RLC (RRC message)\n", @@ -3057,12 +3835,12 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 mcs = eNB_UE_stats->dlsch_mcs1; if (mcs==0) nb_rb = 4; // don't let the TBS get too small - else nb_rb=2; + else nb_rb=min_rb_unit; - TBS = mac_xface->get_TBS_DL(mcs,nb_rb); + TBS = mac_xface->get_TBS_DL(mcs,nb_rb); while (TBS < (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) { - nb_rb += 2; // + nb_rb += min_rb_unit; // if (nb_rb>nb_available_rb) { // if we've gone beyond the maximum number of RBs // (can happen if N_RB_DL is odd) TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_available_rb); @@ -3082,10 +3860,12 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 while((nb_rb_temp > 0) && (j<mac_xface->lte_frame_parms->N_RBGS)){ if(rballoc_sub_UE[next_ue][j] == 1){ eNB_mac_inst[Mod_id].UE_template[next_ue].rballoc_subband[harq_pid][j] = rballoc_sub_UE[next_ue][j]; - if((j == mac_xface->lte_frame_parms->N_RBGS-1) && (mac_xface->lte_frame_parms->N_RB_DL%2 == 1)) - nb_rb_temp = nb_rb_temp - 1; + if ((j == mac_xface->lte_frame_parms->N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))) + nb_rb_temp = nb_rb_temp - min_rb_unit+1; else - nb_rb_temp = nb_rb_temp - 2; + nb_rb_temp = nb_rb_temp - min_rb_unit; } j = j+1; } @@ -3101,20 +3881,20 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 // decrease mcs until TBS falls below required length while ((TBS > (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) && (mcs>0)) { mcs--; - TBS = mac_xface->get_TBS_DL(mcs,nb_rb); + TBS = mac_xface->get_TBS_DL(mcs,nb_rb); } // if we have decreased too much or we don't have enough RBs, increase MCS while ((TBS < (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) && ((( dl_pow_off[next_ue]>0) && (mcs<28)) || ( (dl_pow_off[next_ue]==0) && (mcs<=15)))) { mcs++; - TBS = mac_xface->get_TBS_DL(mcs,nb_rb); + TBS = mac_xface->get_TBS_DL(mcs,nb_rb); } LOG_D(MAC,"dlsch_mcs before and after the rate matching = (%d, %d)\n",eNB_UE_stats->dlsch_mcs1, mcs); #ifdef DEBUG_eNB_SCHEDULER LOG_D(MAC,"[eNB %d] Generated DLSCH header (mcs %d, TBS %d, nb_rb %d)\n", - Mod_id,mcs,TBS,nb_rb); + Mod_id,mcs,TBS,nb_rb); // msg("[MAC][eNB ] Reminder of DLSCH with random data %d %d %d %d \n", // TBS, sdu_length_total, offset, TBS-sdu_length_total-offset); #endif @@ -3125,7 +3905,7 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 } else { padding = 0; - // adjust the header len + // adjust the header len if (header_len_dtch==0) header_len_dcch = header_len_dcch_tmp; else //if (( header_len_dcch==0)&&((header_len_dtch==1)||(header_len_dtch==2))) @@ -3136,7 +3916,7 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[Mod_id].DLSCH_pdu[(unsigned char)next_ue][0].payload[0], - // offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0], + // offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0], num_sdus, //num_sdus sdu_lengths, // sdu_lcids, @@ -3147,8 +3927,8 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 post_padding); //#ifdef DEBUG_eNB_SCHEDULER LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Generate header : sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,timing advance value : %d, next_ue %d,padding %d,post_padding %d,(mcs %d, TBS %d, nb_rb %d),header_dcch %d, header_dtch %d\n", - Mod_id,sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset, - ta_len,next_ue,padding,post_padding,mcs,TBS,nb_rb,header_len_dcch,header_len_dtch); + Mod_id,sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset, + ta_len,next_ue,padding,post_padding,mcs,TBS,nb_rb,header_len_dcch,header_len_dtch); //#endif LOG_T(MAC,"[eNB %d] First 16 bytes of DLSCH : \n"); @@ -3212,21 +3992,77 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 case 2: default: if (mac_xface->lte_frame_parms->frame_type == TDD) { - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; - //if(((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs > 9) - //((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs = 9; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; + break; + case 25: + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; + break; + case 50: + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rv = 0; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; + break; + case 100: + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rv = 0; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; + break; + default: + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; + break; + } } else { - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; - //if(((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs > 9) - //((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs = 9; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; + break; + case 25: + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; + break; + case 50: + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rv = 0; + break; + case 100: + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rv = 0; + break; + default: + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; + break; + } } break; case 4: @@ -3332,178 +4168,6 @@ void schedule_ue_spec(unsigned char Mod_id,u32 frame, unsigned char subframe,u16 } } -#ifdef ICIC -//added for ALU icic - -u32 Get_Cell_SBMap(unsigned char Mod_id){ - -#define ALFA_CG 0.25 - - - - u8 SB_id,UE_id; - s32 data_rate; - s32 sb_cost[NUMBER_OF_SUBBANDS]; - u8 sb_size = 4;//eNB_mac_inst[Mod_id].sbmap_conf.sb_size; - u8 nb_of_cell_users = find_active_UEs(Mod_id); - u8 NB_OF_SB_TOT=NUMBER_OF_SUBBANDS; //#define somewhere - u16 rnti; - u32 rballoc=0xffffffff; - - if(!nb_of_cell_users){ - - for(SB_id=0;SB_id<NB_OF_SB_TOT;SB_id++) - if(eNB_mac_inst[Mod_id].sbmap_conf.sbmap[SB_id]==0) - switch(SB_id){ - case 0: - rballoc &= 0xfffffff0; - break; - case 1: - rballoc &= 0xffffff0f; - break; - case 2: - rballoc &= 0xfffff0ff; - break; - case 3: - rballoc &= 0xffff0fff; - break; - case 4: - rballoc &= 0xfff0ffff; - break; - case 5: - rballoc &= 0xff0fffff; - break; - case 6: - rballoc &= 0xf0ffffff; - break; - } - - return rballoc; - } - - else{ - - - /********************************************************************************************************************* - * step1: compute cost function * - *********************************************************************************************************************/ - - for(SB_id=0;SB_id<NB_OF_SB_TOT;SB_id++){ - data_rate=0; - for(UE_id=0;UE_id<NB_UE_INST;UE_id++) - if (PHY_vars_eNB_g[Mod_id]->dlsch_eNB[(u8)UE_id][0]->rnti>0) - data_rate+=180*sb_size*log2(1+ALFA_CG*pow(10,PHY_vars_UE_g[UE_id]->PHY_measurements.subband_cqi_tot_dB[Mod_id][SB_id]/10)); - - sb_cost[SB_id]=data_rate/nb_of_cell_users; - } - - /********************************************************************************************************************* - * step2: rank subbands * * - *********************************************************************************************************************/ - - u8 buff=0; - u8 ranked_sb[NB_OF_SB_TOT]; - u8 t=NB_OF_SB_TOT,tt=0; - - for(SB_id=0;SB_id<NB_OF_SB_TOT;SB_id++) - ranked_sb[SB_id]=SB_id; - - while(t>0){ - tt=0; - for(SB_id=0;SB_id<t-1;SB_id++){ - if(sb_cost[SB_id]<sb_cost[SB_id+1]){ - buff=ranked_sb[SB_id]; - ranked_sb[SB_id]=ranked_sb[SB_id+1]; - ranked_sb[SB_id+1]=buff; - tt=SB_id+1; - } - } - t=tt; - } - - /********************************************************************************************************************* - * step3: choose and set "Zl" best subbands * * - *********************************************************************************************************************/ - - u8 nb_of_sb_1 = eNB_mac_inst[Mod_id].sbmap_conf.nb_active_sb; - - for(SB_id=0;SB_id<NB_OF_SB_TOT;SB_id++) - eNB_mac_inst[Mod_id].sbmap_conf.sbmap[SB_id]=1; - - for(SB_id=0;SB_id<NB_OF_SB_TOT;SB_id++){ - if(nb_of_sb_1){ - eNB_mac_inst[Mod_id].sbmap_conf.sbmap[ranked_sb[SB_id]]=0; - nb_of_sb_1--; - } - } - for(SB_id=0;SB_id<NB_OF_SB_TOT;SB_id++) - if(eNB_mac_inst[Mod_id].sbmap_conf.sbmap[SB_id]==0) - switch(SB_id){ - case 0: - rballoc &= 0xfffffff0; - break; - case 1: - rballoc &= 0xffffff0f; - break; - case 2: - rballoc &= 0xfffff0ff; - break; - case 3: - rballoc &= 0xffff0fff; - break; - case 4: - rballoc &= 0xfff0ffff; - break; - case 5: - rballoc &= 0xff0fffff; - break; - case 6: - rballoc &= 0xf0ffffff; - break; - } - - return rballoc; - - } -} - -void UpdateSBnumber(unsigned char Mod_id){ - -#define TH_SINR 10 - - /********************************************************************************************************************* - * step 4: Update Zl * * - *********************************************************************************************************************/ - - u8 SB_id,UE_id; - u32 sinr=0; - int sinrDb=20; - u8 nb_of_sb_1 = eNB_mac_inst[Mod_id].sbmap_conf.nb_active_sb; - u8 nb_of_cell_users = find_active_UEs(Mod_id); - - if(nb_of_cell_users){ - - for(UE_id=0;UE_id<NB_UE_INST;UE_id++) - if (PHY_vars_eNB_g[Mod_id]->dlsch_eNB[(u8)UE_id][0]->rnti>0) - for(SB_id=0;SB_id<NUMBER_OF_SUBBANDS;SB_id++) - if(eNB_mac_inst[Mod_id].sbmap_conf.sbmap[SB_id]==0) - sinr+=pow(10,PHY_vars_UE_g[UE_id]->PHY_measurements.subband_cqi_tot_dB[Mod_id][SB_id]/10); - - sinr= sinr/(nb_of_sb_1*nb_of_cell_users); - if(sinr) - sinrDb=10*log10(sinr); - - if((sinrDb>TH_SINR) && (nb_of_sb_1<NUMBER_OF_SUBBANDS)) - eNB_mac_inst[Mod_id].sbmap_conf.nb_active_sb++; - else - if(nb_of_sb_1>1) - eNB_mac_inst[Mod_id].sbmap_conf.nb_active_sb--; - - } -} -#endif -//end ALU's algo -// phy_proc_lte_enb calls this function void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subframe) {//, int calibration_flag) { unsigned char nprb=0; @@ -3536,13 +4200,6 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf rrc_rx_tx(Mod_id, frame, 0, 0); #endif -#ifdef ICIC - // navid: the following 2 functions does not work properly when there is user-plane traffic - UpdateSBnumber(Mod_id); - RBalloc=Get_Cell_SBMap(Mod_id); -#endif - // see table 8-2 "k for TDD configuration 0-6" in 36.213 - #ifdef Rel10 if (eNB_mac_inst[Mod_id].MBMS_flag ==1) { @@ -3576,26 +4233,26 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf // TDD, schedule UL for subframe 7 (TDD config 0,1) / subframe 8 (TDD Config 6) // FDD, schedule normal UL/DLSCH if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { - case 0: - case 1: - schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,7,&nCCE); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - case 6: - schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,8,&nCCE); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - default: - break; - } - } - else { //FDD - //schedule_ulsch(Mod_id,cooperation_flag,subframe,&nCCE); - // schedule_ue_spec(Mod_id,subframe,nprb,&nCCE,mbsfn_status); - // fill_DLSCH_dci(Mod_id,subframe,RBalloc,0,mbsfn_status); + switch (mac_xface->lte_frame_parms->tdd_config) { + case 0: + case 1: + schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,7,&nCCE); + fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); + break; + case 6: + schedule_ulsch(Mod_id,frame,cooperation_flag,subframe,8,&nCCE); + fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); + break; + default: + break; } - break; + } + else { //FDD + //schedule_ulsch(Mod_id,cooperation_flag,subframe,&nCCE); + // schedule_ue_spec(Mod_id,subframe,nprb,&nCCE,mbsfn_status); + // fill_DLSCH_dci(Mod_id,subframe,RBalloc,0,mbsfn_status); + } + break; case 2: // TDD, nothing @@ -3621,14 +4278,14 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf break; default: break; - } - } - else { //FDD - // schedule_ulsch(Mod_id,cooperation_flag,subframe,&nCCE,calibration_flag); - // schedule_ue_spec(Mod_id,subframe,0,0,mbsfn_status); - // fill_DLSCH_dci(Mod_id,subframe,RBalloc,0,mbsfn_status); } - break; + } + else { //FDD + // schedule_ulsch(Mod_id,cooperation_flag,subframe,&nCCE,calibration_flag); + // schedule_ue_spec(Mod_id,subframe,0,0,mbsfn_status); + // fill_DLSCH_dci(Mod_id,subframe,RBalloc,0,mbsfn_status); + } + break; case 4: // TDD Config 1, ULSCH for subframe 8 @@ -3712,7 +4369,7 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf break; default: - break; + break; } } else { //FDD @@ -3722,27 +4379,27 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf } break; - case 7: - // TDD Config 3,4,5 Normal DLSCH - // FDD Normal UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { - case 3: - case 4: - // schedule_RA(Mod_id,frame,subframe,3,&nprb,&nCCE); // 3 = Msg3 subframe, not - schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); //1,mbsfn_status); - break; - case 5: - schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); - break; - default: - break; - } + case 7: + // TDD Config 3,4,5 Normal DLSCH + // FDD Normal UL/DLSCH + if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD + switch (mac_xface->lte_frame_parms->tdd_config) { + case 3: + case 4: + // schedule_RA(Mod_id,frame,subframe,3,&nprb,&nCCE); // 3 = Msg3 subframe, not + schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); //1,mbsfn_status); + break; + case 5: + schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); + fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); + break; + default: + break; } + } else { //FDD - // schedule_ulsch(Mod_id,cooperation_flag,subframe,&nCCE,calibration_flag); + // schedule_ulsch(Mod_id,cooperation_flag,subframe,&nCCE,calibration_flag); schedule_ue_spec(Mod_id,frame,subframe,nprb,&nCCE,mbsfn_status); fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); } @@ -3814,7 +4471,7 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf } break; - } + } DCI_pdu->nCCE = nCCE; LOG_D(MAC,"frame %d, subframe %d nCCE %d\n",frame,subframe,nCCE); diff --git a/openair2/LAYER2/MAC/lte_transport_init.c b/openair2/LAYER2/MAC/lte_transport_init.c index 368428f8617..ff36ff175c4 100755 --- a/openair2/LAYER2/MAC/lte_transport_init.c +++ b/openair2/LAYER2/MAC/lte_transport_init.c @@ -17,7 +17,7 @@ void init_transport_channels(unsigned char transmission_mode) { UL_alloc_pdu.TPC = 0; UL_alloc_pdu.cqi_req = 1; - + /* BCCH_alloc_pdu.type = 1; BCCH_alloc_pdu.vrb_type = 0; BCCH_alloc_pdu.rballoc = BCCH_RB_ALLOC; @@ -36,6 +36,7 @@ void init_transport_channels(unsigned char transmission_mode) { BCCH_alloc_pdu_fdd.mcs = 1; BCCH_alloc_pdu_fdd.harq_pid = 0; BCCH_alloc_pdu_fdd.TPC = 1; // set to 3 PRB + */ DLSCH_alloc_pdu1A.type = 1; DLSCH_alloc_pdu1A.vrb_type = 0; diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index beb95257f19..60c64067951 100644 --- a/openair2/LAYER2/MAC/main.c +++ b/openair2/LAYER2/MAC/main.c @@ -139,6 +139,7 @@ int mac_top_init(int eMBMS_active, u8 cba_group_active){ unsigned char Mod_id,i,j; RA_TEMPLATE *RA_template; UE_TEMPLATE *UE_template; + int size_bytes1,size_bytes2,size_bits1,size_bits2; LOG_I(MAC,"[MAIN] Init function start:Nb_UE_INST=%d\n",NB_UE_INST); if (NB_UE_INST>0) { @@ -209,21 +210,81 @@ int mac_top_init(int eMBMS_active, u8 cba_group_active){ RA_template = (RA_TEMPLATE *)&eNB_mac_inst[i].RA_template[0]; for (j=0;j<NB_RA_PROC_MAX;j++) { if (mac_xface->lte_frame_parms->frame_type == TDD) { - memcpy((void *)&RA_template[j].RA_alloc_pdu1[0],(void *)&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); - memcpy((void *)&RA_template[j].RA_alloc_pdu2[0],(void *)&DLSCH_alloc_pdu1A,sizeof(DCI1A_5MHz_TDD_1_6_t)); - RA_template[j].RA_dci_size_bytes1 = sizeof(DCI1A_5MHz_TDD_1_6_t); - RA_template[j].RA_dci_size_bytes2 = sizeof(DCI1A_5MHz_TDD_1_6_t); - RA_template[j].RA_dci_size_bits1 = sizeof_DCI1A_5MHz_TDD_1_6_t; - RA_template[j].RA_dci_size_bits2 = sizeof_DCI1A_5MHz_TDD_1_6_t; + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + size_bytes1 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + size_bytes2 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + size_bits1 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + size_bits2 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + break; + case 25: + size_bytes1 = sizeof(DCI1A_5MHz_TDD_1_6_t); + size_bytes2 = sizeof(DCI1A_5MHz_TDD_1_6_t); + size_bits1 = sizeof_DCI1A_5MHz_TDD_1_6_t; + size_bits2 = sizeof_DCI1A_5MHz_TDD_1_6_t; + break; + case 50: + size_bytes1 = sizeof(DCI1A_10MHz_TDD_1_6_t); + size_bytes2 = sizeof(DCI1A_10MHz_TDD_1_6_t); + size_bits1 = sizeof_DCI1A_10MHz_TDD_1_6_t; + size_bits2 = sizeof_DCI1A_10MHz_TDD_1_6_t; + break; + case 100: + size_bytes1 = sizeof(DCI1A_20MHz_TDD_1_6_t); + size_bytes2 = sizeof(DCI1A_20MHz_TDD_1_6_t); + size_bits1 = sizeof_DCI1A_20MHz_TDD_1_6_t; + size_bits2 = sizeof_DCI1A_20MHz_TDD_1_6_t; + break; + default: + size_bytes1 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + size_bytes2 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + size_bits1 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + size_bits2 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + break; + } + } else { - memcpy((void *)&RA_template[j].RA_alloc_pdu1[0],(void *)&RA_alloc_pdu_fdd,sizeof(DCI1A_5MHz_FDD_t)); - memcpy((void *)&RA_template[j].RA_alloc_pdu2[0],(void *)&DLSCH_alloc_pdu1A_fdd,sizeof(DCI1A_5MHz_FDD_t)); - RA_template[j].RA_dci_size_bytes1 = sizeof(DCI1A_5MHz_FDD_t); - RA_template[j].RA_dci_size_bytes2 = sizeof(DCI1A_5MHz_FDD_t); - RA_template[j].RA_dci_size_bits1 = sizeof_DCI1A_5MHz_FDD_t; - RA_template[j].RA_dci_size_bits2 = sizeof_DCI1A_5MHz_FDD_t; + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + size_bytes1 = sizeof(DCI1A_1_5MHz_FDD_t); + size_bytes2 = sizeof(DCI1A_1_5MHz_FDD_t); + size_bits1 = sizeof_DCI1A_1_5MHz_FDD_t; + size_bits2 = sizeof_DCI1A_1_5MHz_FDD_t; + break; + case 25: + size_bytes1 = sizeof(DCI1A_5MHz_FDD_t); + size_bytes2 = sizeof(DCI1A_5MHz_FDD_t); + size_bits1 = sizeof_DCI1A_5MHz_FDD_t; + size_bits2 = sizeof_DCI1A_5MHz_FDD_t; + break; + case 50: + size_bytes1 = sizeof(DCI1A_10MHz_FDD_t); + size_bytes2 = sizeof(DCI1A_10MHz_FDD_t); + size_bits1 = sizeof_DCI1A_10MHz_FDD_t; + size_bits2 = sizeof_DCI1A_10MHz_FDD_t; + break; + case 100: + size_bytes1 = sizeof(DCI1A_20MHz_FDD_t); + size_bytes2 = sizeof(DCI1A_20MHz_FDD_t); + size_bits1 = sizeof_DCI1A_20MHz_FDD_t; + size_bits2 = sizeof_DCI1A_20MHz_FDD_t; + break; + default: + size_bytes1 = sizeof(DCI1A_1_5MHz_FDD_t); + size_bytes2 = sizeof(DCI1A_1_5MHz_FDD_t); + size_bits1 = sizeof_DCI1A_1_5MHz_FDD_t; + size_bits2 = sizeof_DCI1A_1_5MHz_FDD_t; + break; + } } + memcpy((void *)&RA_template[j].RA_alloc_pdu1[0],(void *)&RA_alloc_pdu,size_bytes1); + memcpy((void *)&RA_template[j].RA_alloc_pdu2[0],(void *)&DLSCH_alloc_pdu1A,size_bytes2); + RA_template[j].RA_dci_size_bytes1 = size_bytes1; + RA_template[j].RA_dci_size_bytes2 = size_bytes2; + RA_template[j].RA_dci_size_bits1 = size_bits1; + RA_template[j].RA_dci_size_bits2 = size_bits2; + RA_template[j].RA_dci_fmt1 = format1A; RA_template[j].RA_dci_fmt2 = format1A; } diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index ba89ca6bd31..bef4ad56dee 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -313,26 +313,46 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, unsigned char subframe, u8 *dl_pow_off, u16 *pre_nb_available_rbs, - unsigned char rballoc_sub_UE[256][mac_xface->lte_frame_parms->N_RBGS]){ + int N_RBGS, + unsigned char rballoc_sub_UE[NUMBER_OF_UE_MAX][N_RBGS_MAX]){ unsigned char next_ue,next_ue1,next_ue2,rballoc_sub[mac_xface->lte_frame_parms->N_RBGS],harq_pid=0,harq_pid1=0,harq_pid2=0,round=0,round1=0,round2=0,total_ue_count=0; unsigned char MIMO_mode_indicator[mac_xface->lte_frame_parms->N_RBGS]; - u16 UE_id,UE_id_sorted[256],granted_UEs,i,ii,j,nb_rbs_required[256],nb_rbs_required_remaining[256],nb_rbs_required_remaining_1[256],i1,i2,i3,r1=0,average_rbs_per_user=0; + u16 UE_id,UE_id_sorted[NUMBER_OF_UE_MAX],granted_UEs,i,ii,j,nb_rbs_required[NUMBER_OF_UE_MAX],nb_rbs_required_remaining[NUMBER_OF_UE_MAX],nb_rbs_required_remaining_1[NUMBER_OF_UE_MAX],i1,i2,i3,r1=0,average_rbs_per_user=0; u16 rnti,rnti1,rnti2; LTE_eNB_UE_stats* eNB_UE_stats1; LTE_eNB_UE_stats* eNB_UE_stats2; - u16 min_rb_unit=2; + u16 min_rb_unit; + + + switch (mac_xface->lte_frame_parms->N_RB_DL) { + case 6: + min_rb_unit=1; + break; + case 25: + min_rb_unit=2; + break; + case 50: + min_rb_unit=3; + break; + case 100: + min_rb_unit=4; + break; + default: + min_rb_unit=2; + break; + } granted_UEs = find_dlgranted_UEs(Mod_id); - for(i=0;i<256;i++){ + for(i=0;i<NUMBER_OF_UE_MAX;i++){ nb_rbs_required[i] = 0; UE_id_sorted[i] = i; dl_pow_off[i] =2; pre_nb_available_rbs[i] = 0; nb_rbs_required_remaining[i] = 0; - for(j=0;j<mac_xface->lte_frame_parms->N_RBGS;j++) + for(j=0;j<N_RBGS;j++) { MIMO_mode_indicator[j] = 2; rballoc_sub[j] = 0; @@ -404,7 +424,7 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, - for(j=0;j<mac_xface->lte_frame_parms->N_RBGS;j++){ + for(j=0;j<N_RBGS;j++){ if((rballoc_sub[j] == 0) && (rballoc_sub_UE[next_ue][j] == 0) && (nb_rbs_required_remaining[next_ue]>0)){ @@ -416,15 +436,16 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, if(mac_xface->get_transmission_mode(Mod_id,rnti)==5) dl_pow_off[next_ue] = 1; // if the total rb is odd - if((j == mac_xface->lte_frame_parms->N_RBGS-1) && (mac_xface->lte_frame_parms->N_RB_DL%2 == 1)){ - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - 1; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + 1; + if ((j == N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))) { + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit+1; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit - 1; + } + else { + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; } - else - { - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; - } } } } @@ -445,7 +466,7 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, - for(j=0;j<mac_xface->lte_frame_parms->N_RBGS;j++){ + for(j=0;j<N_RBGS;j++){ if((rballoc_sub[j] == 0) && (rballoc_sub_UE[next_ue][j] == 0) && (nb_rbs_required_remaining[next_ue]>0)){ @@ -457,14 +478,15 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, if(mac_xface->get_transmission_mode(Mod_id,rnti)==5) dl_pow_off[next_ue] = 1; - if((j == mac_xface->lte_frame_parms->N_RBGS-1) && (mac_xface->lte_frame_parms->N_RB_DL%2 == 1)){ - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - 1; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + 1; + if((j == N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))){ + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit + 1; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit - 1; } - else - { - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - 2; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + 2; + else { + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; } } } @@ -486,7 +508,7 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, - for(j=0;j<mac_xface->lte_frame_parms->N_RBGS;j++){ + for(j=0;j<N_RBGS;j++){ if((rballoc_sub[j] == 0) && (rballoc_sub_UE[next_ue][j] == 0) && (nb_rbs_required_remaining[next_ue]>0)){ @@ -498,15 +520,16 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, if(mac_xface->get_transmission_mode(Mod_id,rnti)==5) dl_pow_off[next_ue] = 1; - if((j == mac_xface->lte_frame_parms->N_RBGS-1) && (mac_xface->lte_frame_parms->N_RB_DL%2 == 1)){ - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - 1; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + 1; + if((j == N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))){ + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit + 1; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit - 1; + } + else { + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; } - else - { - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - 2; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + 2; - } } } } @@ -530,9 +553,9 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, if ((mac_get_rrc_status(Mod_id,1,next_ue1) >= RRC_RECONFIGURED) && (round1==0) && (mac_xface->get_transmission_mode(Mod_id,rnti1)==5) && (dl_pow_off[next_ue1] != 1)) { - for(j=0;j<mac_xface->lte_frame_parms->N_RBGS;j+=2){ + for(j=0;j<N_RBGS;j+=2){ - if((((j == (mac_xface->lte_frame_parms->N_RBGS-1))&& (rballoc_sub[j] == 0) && (rballoc_sub_UE[next_ue1][j] == 0)) || ((j < (mac_xface->lte_frame_parms->N_RBGS-1)) && (rballoc_sub[j+1] == 0) && (rballoc_sub_UE[next_ue1][j+1] == 0))) && (nb_rbs_required_remaining[next_ue1]>0)){ + if((((j == (N_RBGS-1))&& (rballoc_sub[j] == 0) && (rballoc_sub_UE[next_ue1][j] == 0)) || ((j < (N_RBGS-1)) && (rballoc_sub[j+1] == 0) && (rballoc_sub_UE[next_ue1][j+1] == 0))) && (nb_rbs_required_remaining[next_ue1]>0)){ for (ii = i+1;ii < granted_UEs;ii++) { @@ -546,7 +569,7 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, if ((mac_get_rrc_status(Mod_id,1,next_ue2) >= RRC_RECONFIGURED) && (round2==0) && (mac_xface->get_transmission_mode(Mod_id,rnti2)==5) && (dl_pow_off[next_ue2] != 1)) { - if((((j == (mac_xface->lte_frame_parms->N_RBGS-1)) && (rballoc_sub_UE[next_ue2][j] == 0)) || ((j < (mac_xface->lte_frame_parms->N_RBGS-1)) && (rballoc_sub_UE[next_ue2][j+1] == 0))) && (nb_rbs_required_remaining[next_ue2]>0)){ + if((((j == (N_RBGS-1)) && (rballoc_sub_UE[next_ue2][j] == 0)) || ((j < (N_RBGS-1)) && (rballoc_sub_UE[next_ue2][j+1] == 0))) && (nb_rbs_required_remaining[next_ue2]>0)){ if((((eNB_UE_stats2->DL_pmi_single^eNB_UE_stats1->DL_pmi_single)<<(14-j))&0xc000)== 0x4000){ //MU-MIMO only for 25 RBs configuration @@ -555,7 +578,7 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, rballoc_sub_UE[next_ue2][j] = 1; MIMO_mode_indicator[j] = 0; - if (j< mac_xface->lte_frame_parms->N_RBGS-1) { + if (j< N_RBGS-1) { rballoc_sub[j+1] = 1; rballoc_sub_UE[next_ue1][j+1] = 1; rballoc_sub_UE[next_ue2][j+1] = 1; @@ -568,19 +591,20 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, - if((j == mac_xface->lte_frame_parms->N_RBGS-1) && (mac_xface->lte_frame_parms->N_RB_DL%2 == 1)){ - nb_rbs_required_remaining[next_ue1] = nb_rbs_required_remaining[next_ue1] - 1; - pre_nb_available_rbs[next_ue1] = pre_nb_available_rbs[next_ue1] + 1; - nb_rbs_required_remaining[next_ue2] = nb_rbs_required_remaining[next_ue2] - 1; - pre_nb_available_rbs[next_ue2] = pre_nb_available_rbs[next_ue2] + 1; + if ((j == N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25) || + (mac_xface->lte_frame_parms->N_RB_DL == 50))){ + nb_rbs_required_remaining[next_ue1] = nb_rbs_required_remaining[next_ue1] - min_rb_unit+1; + pre_nb_available_rbs[next_ue1] = pre_nb_available_rbs[next_ue1] + min_rb_unit-1; + nb_rbs_required_remaining[next_ue2] = nb_rbs_required_remaining[next_ue2] - min_rb_unit+1; + pre_nb_available_rbs[next_ue2] = pre_nb_available_rbs[next_ue2] + min_rb_unit-1; + } + else { + nb_rbs_required_remaining[next_ue1] = nb_rbs_required_remaining[next_ue1] - 4; + pre_nb_available_rbs[next_ue1] = pre_nb_available_rbs[next_ue1] + 4; + nb_rbs_required_remaining[next_ue2] = nb_rbs_required_remaining[next_ue2] - 4; + pre_nb_available_rbs[next_ue2] = pre_nb_available_rbs[next_ue2] + 4; } - else - { - nb_rbs_required_remaining[next_ue1] = nb_rbs_required_remaining[next_ue1] - 4; - pre_nb_available_rbs[next_ue1] = pre_nb_available_rbs[next_ue1] + 4; - nb_rbs_required_remaining[next_ue2] = nb_rbs_required_remaining[next_ue2] - 4; - pre_nb_available_rbs[next_ue2] = pre_nb_available_rbs[next_ue2] + 4; - } break; } } @@ -603,7 +627,7 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, if ((mac_get_rrc_status(Mod_id,1,next_ue) >= RRC_RECONFIGURED) && (round==0)) { - for(j=0;j<mac_xface->lte_frame_parms->N_RBGS;j++){ + for(j=0;j<N_RBGS;j++){ if((rballoc_sub[j] == 0) && (rballoc_sub_UE[next_ue][j] == 0) && (nb_rbs_required_remaining[next_ue]>0)){ @@ -618,15 +642,16 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, MIMO_mode_indicator[j] = 1; - if((j == mac_xface->lte_frame_parms->N_RBGS-1) && (mac_xface->lte_frame_parms->N_RB_DL%2 == 1)){ - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - 1; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + 1; + if((j == N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))){ + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit+1; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] +min_rb_unit-1; + } + else { + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; } - else - { - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - 2; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + 2; - } break; case 5: @@ -639,15 +664,16 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, MIMO_mode_indicator[j] = 1; - if((j == mac_xface->lte_frame_parms->N_RBGS-1) && (mac_xface->lte_frame_parms->N_RB_DL%2 == 1)){ - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - 1; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + 1; + if((j == N_RBGS-1) && + ((mac_xface->lte_frame_parms->N_RB_DL == 25)|| + (mac_xface->lte_frame_parms->N_RB_DL == 50))){ + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit+1; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit-1; + } + else { + nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - min_rb_unit; + pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + min_rb_unit; } - else - { - nb_rbs_required_remaining[next_ue] = nb_rbs_required_remaining[next_ue] - 2; - pre_nb_available_rbs[next_ue] = pre_nb_available_rbs[next_ue] + 2; - } } break; default: @@ -662,7 +688,7 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, i1=0; i2=0; i3=0; - for (j=0;j<mac_xface->lte_frame_parms->N_RBGS;j++){ + for (j=0;j<N_RBGS;j++){ if(MIMO_mode_indicator[j] == 2) i1 = i1+1; else if(MIMO_mode_indicator[j] == 1) @@ -672,13 +698,13 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, } - if((i1 < mac_xface->lte_frame_parms->N_RBGS) && (i2>0) && (i3==0)) + if((i1 < N_RBGS) && (i2>0) && (i3==0)) PHY_vars_eNB_g[Mod_id]->check_for_SUMIMO_transmissions = PHY_vars_eNB_g[Mod_id]->check_for_SUMIMO_transmissions + 1; - if(i3 == mac_xface->lte_frame_parms->N_RBGS && i1==0 && i2==0) + if(i3 == N_RBGS && i1==0 && i2==0) PHY_vars_eNB_g[Mod_id]->FULL_MUMIMO_transmissions = PHY_vars_eNB_g[Mod_id]->FULL_MUMIMO_transmissions + 1; - if((i1 < mac_xface->lte_frame_parms->N_RBGS) && (i3 > 0)) + if((i1 < N_RBGS) && (i3 > 0)) PHY_vars_eNB_g[Mod_id]->check_for_MUMIMO_transmissions = PHY_vars_eNB_g[Mod_id]->check_for_MUMIMO_transmissions + 1; PHY_vars_eNB_g[Mod_id]->check_for_total_transmissions = PHY_vars_eNB_g[Mod_id]->check_for_total_transmissions + 1; @@ -691,7 +717,7 @@ void dlsch_scheduler_pre_processor (unsigned char Mod_id, LOG_D(PHY,"******************Scheduling Information for UE%d ************************\n",UE_id); LOG_D(PHY,"dl power offset UE%d = %d \n",UE_id,dl_pow_off[UE_id]); LOG_D(PHY,"***********RB Alloc for every subband for UE%d ***********\n",UE_id); - for(j=0;j<mac_xface->lte_frame_parms->N_RBGS;j++){ + for(j=0;j<N_RBGS;j++){ //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].rballoc_sub[i] = rballoc_sub_UE[UE_id][i]; LOG_D(PHY,"RB Alloc for UE%d and Subband%d = %d\n",UE_id,j,rballoc_sub_UE[UE_id][j]); } diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index dd85ee5fd3a..edab9abe700 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -401,7 +401,7 @@ void ue_decode_si(u8 Mod_id,u32 frame, u8 eNB_index, void *pdu,u16 len) { int i; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_SI, VCD_FUNCTION_IN); - // LOG_D(MAC,"[UE %d] Frame %d Sending SI to RRC (LCID Id %d)\n",Mod_id,frame,BCCH); + LOG_D(MAC,"[UE %d] Frame %d Sending SI to RRC (LCID Id %d,len %d)\n",Mod_id,frame,BCCH,len); mac_rrc_data_ind(Mod_id, frame, diff --git a/openair2/NAS/DRIVER/MESH/Makefile b/openair2/NAS/DRIVER/MESH/Makefile index 12727146c7d..31d8f1f8217 100755 --- a/openair2/NAS/DRIVER/MESH/Makefile +++ b/openair2/NAS/DRIVER/MESH/Makefile @@ -28,7 +28,6 @@ IS_KERNEL_SUBVERSION_GREATER_THAN_22=$(shell if [ $(SUBVERSION) -ge 22 ] ; then IS_KERNEL_SUBVERSION_GREATER_THAN_29=$(shell if [ $(SUBVERSION) -ge 29 ] ; then echo true ; fi) IS_KERNEL_SUBVERSION_GREATER_THAN_30=$(shell if [ $(SUBVERSION) -ge 30 ] ; then echo true ; fi) IS_KERNEL_SUBVERSION_GREATER_THAN_32=$(shell if [ $(SUBVERSION) -ge 32 ] ; then echo true ; fi) - # Add global rule for V3 kernels IS_KERNEL_SUBVERSION_GREATER_THAN_301= "false" @@ -38,6 +37,7 @@ ifeq ($(KERNEL_MAIN_VERSION),3) IS_KERNEL_SUBVERSION_GREATER_THAN_30 = "true" IS_KERNEL_SUBVERSION_GREATER_THAN_32 = "true" IS_KERNEL_SUBVERSION_GREATER_THAN_301=$(shell if [ $(SUBVERSION) -ge 1 ] ; then echo true ; fi) + IS_KERNEL_SUBVERSION_GREATER_THAN_307=$(shell if [ $(SUBVERSION) -ge 7 ] ; then echo true ; fi) endif GT2622 = $(if $(IS_KERNEL_SUBVERSION_GREATER_THAN_22),-DKERNEL_VERSION_GREATER_THAN_2622=1) -- GitLab