Commit 760c19b7 authored by florian kaltenberger's avatar florian kaltenberger

Rebasing all the work from feature-247-tm89 onto current develop. This does...

Rebasing all the work from feature-247-tm89 onto current develop. This does not include any changes that were made to phy_procedures_lte_eNB and to the MAC, which will be done in a second step. At the moment this commit only contains the PHY and RRC functionality.
parent 3fd24705
......@@ -20,11 +20,11 @@ ID = ENB_PHY_DLSCH_UE_DCI
ID = ENB_PHY_DLSCH_UE_ACK
DESC = eNodeB downlink UE ACK as seen by the PHY layer in process_HARQ_feedback
GROUP = ALL:PHY:GRAPHIC:ENB
FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid : int,tb
ID = ENB_PHY_DLSCH_UE_NACK
DESC = eNodeB downlink UE NACK as seen by the PHY layer in process_HARQ_feedback
GROUP = ALL:PHY:GRAPHIC:ENB
FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid : int,tb
ID = ENB_PHY_ULSCH_UE_DCI
DESC = eNodeB uplink UE specific DCI as sent by the PHY layer
GROUP = ALL:PHY:GRAPHIC:ENB
......
......@@ -78,8 +78,8 @@ typedef struct {
logger *pucch1_energy_ue_energy_logger;
logger *pucch_iq_ue_logger;
logger *dl_dci_logger[8];
logger *dl_ack_logger[8];
logger *dl_nack_logger[8];
logger *dl_ack_logger[2][8];
logger *dl_nack_logger[2][8];
logger *ul_dci_logger[8];
logger *ul_dci_retransmission_logger[8];
logger *ul_ack_logger[8];
......@@ -133,7 +133,7 @@ static void *gui_thread(void *_g)
static filter *ticktime_filter(void *database, char *event, int i, int ue)
{
/* filter is "harq_pid == i && UE_id == 0 && eNB_id == 0" */
/* filter is harq_pid == i && UE_id == ue && eNB_id == 0" */
/* we get the UE_id from the rnti */
return
filter_and(
......@@ -146,9 +146,25 @@ static filter *ticktime_filter(void *database, char *event, int i, int ue)
filter_eq(filter_evarg(database, event, "eNB_ID"), filter_int(0))));
}
static filter *ticktime_filter_tb(void *database, char *event, int i, int ue, int tb)
{
/* filter is "tb == tb && harq_pid == i && UE_id == ue && eNB_id == 0" */
return
filter_and(
filter_eq(filter_evarg(database, event, "harq_pid"), filter_int(i)),
filter_and(
filter_eq(
filter_evfun(database, ue_id_from_rnti, NULL,
filter_evarg(database, event, "rnti")),
filter_int(ue)),
filter_and(
filter_eq(filter_evarg(database, event, "eNB_ID"), filter_int(0)),
filter_eq(filter_evarg(database, event, "tb"),filter_int(tb)))));
}
static void set_current_ue(gui *g, enb_data *e, int ue)
{
int i;
int i,tb;
char s[256];
sprintf(s, "[UE %d] ", ue);
......@@ -195,20 +211,22 @@ static void set_current_ue(gui *g, enb_data *e, int ue)
filter_int(ue)));
for (i = 0; i < 8; i++) {
logger_set_filter(e->e->dl_dci_logger[i],
ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_DCI", i, ue));
logger_set_filter(e->e->dl_ack_logger[i],
ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_ACK", i, ue));
logger_set_filter(e->e->dl_nack_logger[i],
ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_NACK", i, ue));
ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_DCI", i, ue));
for (tb=0; tb<2; tb++)
{
logger_set_filter(e->e->dl_ack_logger[tb][i],
ticktime_filter_tb(e->database, "ENB_PHY_DLSCH_UE_ACK", i, ue,tb));
logger_set_filter(e->e->dl_nack_logger[tb][i],
ticktime_filter_tb(e->database, "ENB_PHY_DLSCH_UE_NACK", i, ue,tb));
}
logger_set_filter(e->e->ul_dci_logger[i],
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_DCI", i, ue));
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_DCI", i, ue));
logger_set_filter(e->e->ul_dci_retransmission_logger[i],
ticktime_filter(e->database,
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i, ue));
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i, ue));
logger_set_filter(e->e->ul_ack_logger[i],
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_ACK", i, ue));
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_ACK", i, ue));
logger_set_filter(e->e->ul_nack_logger[i],
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_NACK", i, ue));
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_NACK", i, ue));
}
logger_set_filter(e->e->dl_mcs_logger,
filter_eq(
......@@ -266,6 +284,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
widget *w, *w2;
view *v;
logger *l;
int tb;
main_window = new_toplevel_window(g, 1200, 900, "eNB tracer");
top_container = new_container(g, VERTICAL);
......@@ -468,12 +487,13 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
widget_add_child(g, top_container, e->dl_ul_harq_ue_label, -1);
line = new_container(g, HORIZONTAL);
widget_add_child(g, top_container, line, -1);
timeline_plot = new_timeline(g, 512, 2*8+2, 3);
timeline_plot = new_timeline(g, 512, 2*8+2+8, 3);
widget_add_child(g, line, timeline_plot, -1);
container_set_child_growable(g, line, timeline_plot, 1);
for (i = 0; i < 2*8+2; i++)
for (i = 0; i < 2*8+2+8; i++)
timeline_set_subline_background_color(g, timeline_plot, i,
new_color(g, i==0 || i==9 ? "#ddd" : (i%9)&1 ? "#e6e6e6" : "#eee"));
new_color(g, i >= 9 && i <= 16 ? (i%8)&1 ? "#e6e6bb" : "#eeb" :
i==0 || i==9+8 ? "#ddd" : (i%9)&1 ? "#e6e6e6" : "#eee"));
timeview = new_view_ticktime(10, g, timeline_plot);
ticktime_set_tick(timeview,
new_ticklog(h, database, "ENB_MASTER_TICK", "frame", "subframe"));
......@@ -483,48 +503,50 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
subview = new_subview_ticktime(timeview, 0, new_color(g,"#bbb"), 3600*1000);
logger_add_view(timelog, subview);
/* tick on UL view */
subview = new_subview_ticktime(timeview, 9, new_color(g,"#bbb"), 3600*1000);
subview = new_subview_ticktime(timeview,9+8,new_color(g,"#bbb"), 3600*1000);
logger_add_view(timelog, subview);
/* DL DCI */
for (i = 0; i < 8; i++) {
timelog = new_ticklog(h, database, "ENB_PHY_DLSCH_UE_DCI",
"frame", "subframe");
subview = new_subview_ticktime(timeview, i+1,
subview = new_subview_ticktime(timeview, i+1+0*8,
new_color(g,"#55f"), 3600*1000);
logger_add_view(timelog, subview);
e->dl_dci_logger[i] = timelog;
}
/* DL ACK */
for (tb = 0; tb < 2; tb++)
for (i = 0; i < 8; i++) {
timelog = new_ticklog(h, database, "ENB_PHY_DLSCH_UE_ACK",
"frame", "subframe");
subview = new_subview_ticktime(timeview, i+1,
subview = new_subview_ticktime(timeview, i+1+tb*8,
new_color(g,"#282"), 3600*1000);
logger_add_view(timelog, subview);
e->dl_ack_logger[i] = timelog;
e->dl_ack_logger[tb][i] = timelog;
}
/* DL NACK */
for (tb = 0; tb < 2; tb++)
for (i = 0; i < 8; i++) {
timelog = new_ticklog(h, database, "ENB_PHY_DLSCH_UE_NACK",
"frame", "subframe");
subview = new_subview_ticktime(timeview, i+1,
subview = new_subview_ticktime(timeview, i+1+tb*8,
new_color(g,"#f22"), 3600*1000);
logger_add_view(timelog, subview);
e->dl_nack_logger[i] = timelog;
e->dl_nack_logger[tb][i] = timelog;
}
/* UL DCI/retransmission without DCI */
for (i = 0; i < 8; i++) {
/* first transmission */
timelog = new_ticklog(h, database, "ENB_PHY_ULSCH_UE_DCI",
"frame", "subframe");
subview = new_subview_ticktime(timeview, i+9+1,
subview = new_subview_ticktime(timeview, i+9+1+8,
new_color(g,"#55f"), 3600*1000);
logger_add_view(timelog, subview);
e->ul_dci_logger[i] = timelog;
/* retransmission */
timelog = new_ticklog(h, database,
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", "frame", "subframe");
subview = new_subview_ticktime(timeview, i+9+1,
subview = new_subview_ticktime(timeview, i+9+1+8,
new_color(g,"#99f"), 3600*1000);
logger_add_view(timelog, subview);
e->ul_dci_retransmission_logger[i] = timelog;
......@@ -533,7 +555,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
for (i = 0; i < 8; i++) {
timelog = new_ticklog(h, database, "ENB_PHY_ULSCH_UE_ACK",
"frame", "subframe");
subview = new_subview_ticktime(timeview, i+9+1,
subview = new_subview_ticktime(timeview, i+9+1+8,
new_color(g,"#282"), 3600*1000);
logger_add_view(timelog, subview);
e->ul_ack_logger[i] = timelog;
......@@ -542,7 +564,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
for (i = 0; i < 8; i++) {
timelog = new_ticklog(h, database, "ENB_PHY_ULSCH_UE_NACK",
"frame", "subframe");
subview = new_subview_ticktime(timeview, i+9+1,
subview = new_subview_ticktime(timeview, i+9+1+8,
new_color(g,"#f22"), 3600*1000);
logger_add_view(timelog, subview);
e->ul_nack_logger[i] = timelog;
......
......@@ -652,10 +652,14 @@ void phy_config_dedicated_eNB(uint8_t Mod_id,
break;
case AntennaInfoDedicated__transmissionMode_tm7:
lte_gold_ue_spec_port5(eNB->lte_gold_uespec_port5_table[0],eNB->frame_parms.Nid_cell,rnti);
for (i=0;i<eNB->num_RU;i++) eNB->RU_list[i]->do_precoding=1;
eNB->transmission_mode[UE_id] = 7;
break;
eNB->transmission_mode[UE_id] = 7;
break;
case AntennaInfoDedicated__transmissionMode_tm8_v920:
lte_gold_ue_spec(eNB->lte_gold_uespec_table,eNB->frame_parms.Nid_cell,NULL);
for (i=0;i<eNB->num_RU;i++) eNB->RU_list[i]->do_precoding=1;
eNB->transmission_mode[UE_id] = 8;
break;
default:
LOG_E(PHY,"Unknown transmission mode!\n");
break;
......@@ -887,6 +891,8 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
eNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration
/*init the ue spec reference sequence for TM8/9*/
lte_gold_ue_spec(eNB->lte_gold_uespec_table,eNB->frame_parms.Nid_cell, NULL);
return (0);
......
......@@ -114,15 +114,15 @@ int phy_init_RU(RU_t *ru) {
for (i=0; i<RC.nb_L1_inst; i++) {
for (p=0;p<15;p++) {
LOG_D(PHY,"[INIT] %s() nb_antenna_ports_eNB:%d \n", __FUNCTION__, ru->eNB_list[i]->frame_parms.nb_antenna_ports_eNB);
if (p<ru->eNB_list[i]->frame_parms.nb_antenna_ports_eNB || p==5) {
if (p<ru->eNB_list[i]->frame_parms.nb_antenna_ports_eNB || p==5 || i==7 || i==8) {
LOG_D(PHY,"[INIT] %s() DO BEAM WEIGHTS nb_antenna_ports_eNB:%d nb_tx:%d\n", __FUNCTION__, ru->eNB_list[i]->frame_parms.nb_antenna_ports_eNB, ru->nb_tx);
ru->beam_weights[i][p] = (int32_t **)malloc16_clear(ru->nb_tx*sizeof(int32_t*));
for (j=0; j<ru->nb_tx; j++) {
ru->beam_weights[i][p][j] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t));
// antenna ports 0-3 are mapped on antennas 0-3
// antenna port 4 is mapped on antenna 0
// antenna ports 5-14 are mapped on all antennas
if (((p<4) && (p==j)) || ((p==4) && (j==0))) {
// antenna port 4,5,7 is mapped on antenna 0
// antenna ports 8 are mapped on antenna 1
if (((p<4) && (p==j)) || ((p==4) && (j==0)) || ((p==5) && (j==0)) || ((p==7) && (j==0)) || ((p==8) && (j==1)) ) {
for (re=0; re<fp->ofdm_symbol_size; re++)
{
ru->beam_weights[i][p][j][re] = 0x00007fff;
......@@ -130,13 +130,15 @@ int phy_init_RU(RU_t *ru) {
//LOG_D(PHY,"[INIT] lte_common_vars->beam_weights[%d][%d][%d][%d] = %d\n", i,p,j,re,ru->beam_weights[i][p][j][re]);
}
}
/*
else if (p>4) {
for (re=0; re<fp->ofdm_symbol_size; re++)
{
ru->beam_weights[i][p][j][re] = 0x00007fff/ru->nb_tx;
//LOG_D(PHY,"[INIT] lte_common_vars->beam_weights[%d][%d][%d][%d] = %d\n", i,p,j,re,ru->beam_weights[i][p][j][re]);
}
}
}
*/
//LOG_D(PHY,"[INIT] lte_common_vars->beam_weights[%d][%d] = %p (%lu bytes)\n", i,j,ru->beam_weights[i][p][j], fp->ofdm_symbol_size*sizeof(int32_t));
} // for (j=0
} // if (p<ru
......
......@@ -147,15 +147,21 @@ void lte_param_init(PHY_VARS_eNB **eNBp,
// DL power control init
//if (transmission_mode == 1) {
UE->pdsch_config_dedicated->p_a = pa;
if (transmission_mode == 1 || transmission_mode ==7) {
if (N_tx_port_eNB == 1) {
eNB->pdsch_config_dedicated->p_a = dB0;
((eNB->frame_parms).pdsch_config_common).p_b = 0;
UE->pdsch_config_dedicated->p_a = dB0;
((UE->frame_parms).pdsch_config_common).p_b = 0;
} else { // rho_a = rhob
} else if (N_tx_port_eNB == 2) { // rho_a = rhob
eNB->pdsch_config_dedicated->p_a = dBm3;
((eNB->frame_parms).pdsch_config_common).p_b = 1;
UE->pdsch_config_dedicated->p_a = dBm3;
((UE->frame_parms).pdsch_config_common).p_b = 1;
}
else {
LOG_E(PHY,"only 1 or 2 cell specific antenna ports supported!\n");
exit(-1);
}
UE->perfect_ce = perfect_ce;
......
......@@ -81,57 +81,52 @@ void lte_gold(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table[20][2][14]
}
}
void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_cell, uint16_t *n_idDMRS)
void lte_gold_ue_spec(uint32_t lte_gold_uespec_table[2][20][2][100],uint16_t Nid_cell, uint16_t *n_idDMRS)
{
unsigned char ns,l;
unsigned int n,x1,x2;//,x1tmp,x2tmp;
unsigned int n,x1,x2;
int nscid;
int nid;
for (nscid=0; nscid<2; nscid++) {
if (n_idDMRS)
if (n_idDMRS){
nid = n_idDMRS[nscid];
else
} else {
nid = Nid_cell;
}
for (ns=0; ns<20; ns++) {
for (ns=0; ns<20; ns++) { //do only slot=14,15, subframe=7
for (l=0; l<2; l++) {
x2 = ((((ns>>1)+1)*((nid<<1)+1))<<16) + nscid;
//x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit
//n = 0
// printf("cinit (ns %d, l %d) => %d\n",ns,l,x2);
x1 = 1+ (1<<31);
x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
x2 = ((((ns>>1)+1)*((nid<<1)+1))<<16) + nscid; //cinit at the start of each subframe
//x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit
x1 = 1 + (1<<31);
x2 = x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
// skip first 50 double words (1600 bits)
//printf("n=0 : x1 %x, x2 %x\n",x1,x2);
for (n=1; n<50; n++) {
for (n=1; n<50; n++) {
x1 = (x1>>1) ^ (x1>>4);
x1 = x1 ^ (x1<<31) ^ (x1<<28);
x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
// printf("x1 : %x, x2 : %x\n",x1,x2);
}
}
for (n=0; n<14; n++) {
for (n=0; n<100; n++) {
x1 = (x1>>1) ^ (x1>>4);
x1 = x1 ^ (x1<<31) ^ (x1<<28);
x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
lte_gold_uespec_table[nscid][ns][l][n] = x1^x2;
// printf("n=%d : c %x\n",n,x1^x2);
}
}
}
}
}
}
}
}
void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_t Nid_cell, uint16_t n_rnti)
void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][75],uint16_t Nid_cell, uint16_t n_rnti)
{
unsigned char ns;
......@@ -157,7 +152,7 @@ void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_
//printf("x1 : %x, x2 : %x\n",x1,x2);
}
for (n=0; n<38; n++) {
for (n=0; n<75; n++) {
x1 = (x1>>1) ^ (x1>>4);
x1 = x1 ^ (x1<<31) ^ (x1<<28);
x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
......@@ -208,7 +203,7 @@ unsigned int lte_gold_generic(unsigned int *x1, unsigned int *x2, unsigned char
main()
{
lte_gold(423,0);
lte_gold(0,0);
}
#endif
......
......@@ -43,19 +43,19 @@ unsigned int lte_gold_generic(unsigned int *x1, unsigned int *x2, unsigned char
@param frame_parms LTE DL Frame parameters
@param lte_gold_table pointer to table where sequences are stored
@param Nid_cell Cell Id (to compute sequences for local and adjacent cells) */
void lte_gold(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table[20][2][14],uint16_t Nid_cell);
void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_cell, uint16_t *n_idDMRS);
/*! \brief This function generates the LTE Gold sequence for DL UE-specific pilots for antenna ports 7,...,14 (transmission modes 8/9) */
void lte_gold_ue_spec(uint32_t lte_gold_uespec_table[2][20][2][100],uint16_t Nid_cell, uint16_t *n_idDMRS);
void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_t Nid_cell, uint16_t n_rnti);
/*! \brief This function generates the LTE Gold sequence for DL UE-specific pilots for antenna port 5 (transmission mode 7) */
void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][75],uint16_t Nid_cell, uint16_t n_rnti);
/*!\brief This function generates the LTE Gold sequence (36-211, Sec 7.2), specifically for DL UE-specific reference signals for antenna ports 7..14.
@param frame_parms LTE DL Frame parameters
@param lte_gold_uespec_table pointer to table where sequences are stored
@param Nid_cell Cell Id (to compute sequences for local and adjacent cells)
@param n_idDMRS Scrambling identity for TM10*/
void lte_gold_mbsfn(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_mbsfn_table[10][3][42],uint16_t Nid_MBSFN);
......
This diff is collapsed.
......@@ -121,10 +121,12 @@ typedef struct {
uint8_t Nl;
/// Number of layers for this PDSCH transmission (TM8-10)
uint8_t Nlayers;
/// First layer for this PSCH transmission
/// First layer for this PDSCH transmission
uint8_t first_layer;
/// codeword this transport block is mapped to
uint8_t codeword;
/// nscid
uint8_t nscid;
} LTE_DL_eNB_HARQ_t;
......
......@@ -203,6 +203,7 @@ int32_t allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB,
int32_t **txdataF,
uint32_t *jj,
uint32_t *jj2,
uint16_t rb,
uint16_t re_offset,
uint32_t symbol_offset,
LTE_DL_eNB_HARQ_t *dlsch0_harq,
......@@ -219,7 +220,8 @@ int32_t allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB,
uint8_t mprime,
uint8_t Ns,
int *P1_SHIFT,
int *P2_SHIFT);
int *P2_SHIFT,
uint8_t nscid);
/** \fn int32_t dlsch_modulation(int32_t **txdataF,
......@@ -590,7 +592,7 @@ void init_unscrambling_lut(void);
uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2ndpilots);
uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode);
uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode, uint8_t Ns);
......
......@@ -1530,6 +1530,8 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
ulsch_harq->o_RI[0] = ((ulsch_harq->q_RI[0] + ulsch_harq->q_RI[Q_m/2]) > 0) ? 0 : 1;
}
LOG_D(PHY,"ulsch_decoding: o_RI=%d\n",ulsch_harq->o_RI[0]);
// CQI
// printf("before cqi c[%d] = %p\n",0,ulsch_harq->c[0]);
......
......@@ -1643,7 +1643,7 @@ int is_pmch_subframe(frame_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parm
uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2ndpilots);
uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode);
uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode, uint8_t Ns);
uint32_t dlsch_decoding_abstraction(double *dlsch_MIPB,
LTE_DL_FRAME_PARMS *lte_frame_parms,
......
......@@ -57,7 +57,7 @@ int beam_precoding(int32_t **txdataF,
memset(txdataF_BF[aa],0,sizeof(int32_t)*(frame_parms->ofdm_symbol_size));
for (p=0; p<NB_ANTENNA_PORTS_ENB; p++) {
if (p<frame_parms->nb_antenna_ports_eNB || p==5) {
if (p<frame_parms->nb_antenna_ports_eNB || p==5 || p==7 || p==8) {
multadd_cpx_vector((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size],
(int16_t*)beam_weights[p][aa],
(int16_t*)&txdataF_BF[aa][symbol*frame_parms->ofdm_symbol_size],
......
......@@ -658,7 +658,7 @@ typedef struct {
uint32_t lte_gold_table[7][20][2][14];
/// UE-specific reference symbols (p=5), TM 7
uint32_t lte_gold_uespec_port5_table[20][38];
uint32_t lte_gold_uespec_port5_table[20][75];
/// ue-specific reference symbols
uint32_t lte_gold_uespec_table[2][20][2][21];
......
......@@ -929,10 +929,10 @@ typedef struct PHY_VARS_eNB_s {
uint32_t lte_gold_table[20][2][14];
/// UE-specific reference symbols (p=5), TM 7
uint32_t lte_gold_uespec_port5_table[NUMBER_OF_UE_MAX][20][38];
uint32_t lte_gold_uespec_port5_table[NUMBER_OF_UE_MAX][20][75];
/// UE-specific reference symbols (p=7...14), TM 8/9/10
uint32_t lte_gold_uespec_table[2][20][2][21];
uint32_t lte_gold_uespec_table[2][20][2][100];
/// mbsfn reference symbols
uint32_t lte_gold_mbsfn_table[10][3][42];
......
......@@ -174,7 +174,7 @@
#define DMA_BLKS_PER_SLOT (SLOT_LENGTH_BYTES/2048) // Number of DMA blocks per slot
#define SLOT_TIME_NS (SLOT_LENGTH_SAMPLES*(1e3)/7.68) // slot time in ns
#define NB_ANTENNA_PORTS_ENB 6 // total number of eNB antenna ports
#define NB_ANTENNA_PORTS_ENB 9 // total number of eNB antenna ports
#ifdef EXMIMO
#define TARGET_RX_POWER 55 // Target digital power for the AGC
......
......@@ -103,7 +103,7 @@ double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812, 2.4012
{ -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
};
//int cqi_to_mcs[16]={0, 0, 1, 3, 5, 7, 9, 13, 15, 16, 20, 23, 25, 27, 27, 27};
//int cqi_to_mcs[16]={-1, 0, 1, 3, 5, 7, 9, 13, 15, 16, 20, 23, 25, 27, 27, 27};
int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 28};
//for SNR to MI conversion 7 th order Polynomial coeff
......
......@@ -330,6 +330,17 @@ int16_t get_hundred_times_delta_IF_mac(module_id_t module_idP, uint8_t CC_id, rn
int16_t get_target_pusch_rx_power(module_id_t module_idP, uint8_t CC_id);
int16_t get_target_pucch_rx_power(module_id_t module_idP, uint8_t CC_id);
/*! \brief This function is typically called from the MAC and asks the PHY for a harq_pid for rnti to use in frame.subframe. The function will also return the current round (round is a vector of size 2 for the 2 TBs for DL) correspoing to this harq_pid. If the round (rounds) is (are) 0 then the harq_pid is free.
@param Mod_id
@param CC_id
@param rnti
@param frame
@param subframe
@param harq_pid
@param round
@param ul_flag
@returns 0 on succes, -1 for error
*/
int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,int frame, uint8_t subframe,uint8_t *harq_pid,uint8_t *round,uint8_t ul_flag);
void dump_dlsch(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid);
......
......@@ -1573,6 +1573,9 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
case 7:
RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm7;
break;
case 8:
RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm8_v920;
break;
default:
AssertFatal (0,
"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TransmissionMode choice: 1,2,3,4,5,6,7",
......
......@@ -582,7 +582,7 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
int32_t normalized_rx_power, target_rx_power;
int tpc = 1;
UE_sched_ctrl *ue_sched_ctl;
int mcs;
int mcs1;
int i;
int min_rb_unit[MAX_NUM_CCs];
int N_RB_DL[MAX_NUM_CCs];
......@@ -794,27 +794,24 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
eNB_UE_stats->dl_cqi, MIN_CQI_VALUE, MAX_CQI_VALUE);
*/
if (nfapi_mode) {
eNB_UE_stats->dlsch_mcs1 = 10;//cqi_to_mcs[ue_sched_ctl->dl_cqi[CC_id]];
eNB_UE_stats->dlsch_mcs1 = 10;//cqi_to_mcs[ue_sched_ctl->dl_cqi[CC_id]];
}
else { // this operation is also done in the preprocessor
eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1, slice_maxmcs[slice_idP]); //cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs);
eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1, slice_maxmcs[slice_idP]); //cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs);
}
// store stats
//UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi= eNB_UE_stats->dl_cqi;
UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi[0] = eNB_UE_stats->dl_cqi[0];
UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi[1] = eNB_UE_stats->dl_cqi[1];
// initializing the rb allocation indicator for each UE
for (j = 0; j < N_RBG[CC_id]; j++) {
UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = 0;
}
LOG_D(MAC,
"[eNB %d] Frame %d: Scheduling UE %d on CC_id %d (rnti %x, harq_pid %d, round %d, rb %d, cqi %d, mcs %d, rrc %d)\n",
module_idP, frameP, UE_id, CC_id, rnti, harq_pid, round,
nb_available_rb, ue_sched_ctl->dl_cqi[CC_id],
eNB_UE_stats->dlsch_mcs1,
LOG_D(MAC,"[eNB %d] Frame %d: Scheduling UE %d on CC_id %d (rnti %x, harq_pid %d, round %d, rb %d, cqi %d, mcs %d, rrc %d)\n",
module_idP, frameP, UE_id,CC_id,rnti,harq_pid, round, nb_available_rb,
eNB_UE_stats->dl_cqi[0], eNB_UE_stats->dlsch_mcs1,
UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status);
......@@ -899,7 +896,7 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = harq_pid;
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = 1; // dont adjust power when retransmitting
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid];
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = UE_list->UE_template[CC_id][UE_id].oldNDI1[harq_pid];
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = UE_list->UE_template[CC_id][UE_id].oldmcs1[harq_pid];
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = round & 3;
......@@ -1199,15 +1196,15 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
// Now compute number of required RBs for total sdu length
// Assume RAH format 2
mcs = eNB_UE_stats->dlsch_mcs1;
mcs1 = eNB_UE_stats->dlsch_mcs1;
if (mcs == 0) {
if (mcs1 == 0) {
nb_rb = 4; // don't let the TBS get too small
} else {
nb_rb = min_rb_unit[CC_id];
}
TBS = get_TBS_DL(mcs, nb_rb);
TBS = get_TBS_DL(mcs1, nb_rb);
while (TBS < sdu_length_total + header_length_total + ta_len) {
nb_rb += min_rb_unit[CC_id]; //
......@@ -1248,29 +1245,29 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
}
// decrease mcs until TBS falls below required length
while ((TBS > sdu_length_total + header_length_total + ta_len) && (mcs > 0)) {
mcs--;
TBS = get_TBS_DL(mcs, nb_rb);
while ((TBS > sdu_length_total + header_length_total + ta_len) && (mcs1 > 0)) {
mcs1--;
TBS = get_TBS_DL(mcs1, nb_rb);
}
// if we have decreased too much or we don't have enough RBs, increase MCS
while ((TBS < sdu_length_total + header_length_total + ta_len)
&& (((ue_sched_ctl->dl_pow_off[CC_id] > 0)
&& (mcs < 28))
&& (mcs1 < 28))
|| ((ue_sched_ctl->dl_pow_off[CC_id] == 0)
&& (mcs <= 15)))) {
mcs++;
TBS = get_TBS_DL(mcs, nb_rb);
&& (mcs1 <= 15)))) {
mcs1++;
TBS = get_TBS_DL(mcs1, nb_rb);
}
LOG_D(MAC,
"dlsch_mcs before and after the rate matching = (%d, %d)\n",
eNB_UE_stats->dlsch_mcs1, mcs);
eNB_UE_stats->dlsch_mcs1, mcs1);
#ifdef DEBUG_eNB_SCHEDULER
LOG_D(MAC,
"[eNB %d] CC_id %d Generated DLSCH header (mcs %d, TBS %d, nb_rb %d)\n",
module_idP, CC_id, mcs, TBS, nb_rb);
module_idP, CC_id, mcs1, 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
......@@ -1297,7 +1294,7 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
module_idP, frameP, UE_id, CC_id,
sdu_length_total, num_sdus, sdu_lengths[0],
sdu_lcids[0], offset, ta_update, padding,
post_padding, mcs, TBS, nb_rb,
post_padding, mcs1, TBS, nb_rb,
header_length_total);
}
//#endif
......@@ -1357,7 +1354,7 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
UE_list->eNB_UE_stats[CC_id][UE_id].num_mac_sdu_tx = num_sdus;
UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used += nb_rb;
UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1 = eNB_UE_stats->dlsch_mcs1;
UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2 = mcs;
UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2 = eNB_UE_stats->dlsch_mcs2;
UE_list->eNB_UE_stats[CC_id][UE_id].TBS = TBS;
UE_list->eNB_UE_stats[CC_id][UE_id].overhead_bytes = TBS - sdu_length_total;
......@@ -1428,8 +1425,8 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = harq_pid;
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = tpc; // dont adjust power when retransmitting
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = 1 - UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid];
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = mcs;
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = 1 - UE_list->UE_template[CC_id][UE_id].oldNDI1[harq_pid];
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = mcs1;
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = 0;
//deactivate second codeword
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_2 = 0;
......@@ -1440,11 +1437,11 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
"[eNB %d] Initial transmission CC_id %d : harq_pid %d, dai %d, mcs %d\n",
module_idP, CC_id, harq_pid,
(UE_list->UE_template[CC_id][UE_id].DAI - 1),
mcs);
mcs1);
} else {
LOG_D(MAC,
"[eNB %d] Initial transmission CC_id %d : harq_pid %d, mcs %d\n",
module_idP, CC_id, harq_pid, mcs);
module_idP, CC_id, harq_pid, mcs1);
}
......@@ -1468,10 +1465,10 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
CC_id, frameP, subframeP, UE_id, rnti,
harq_pid,
UE_list->
UE_template[CC_id][UE_id].oldNDI[harq_pid]);
UE_template[CC_id][UE_id].oldNDI1[harq_pid]);
UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid] = 1 - UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid];
UE_list->UE_template[CC_id][UE_id].oldmcs1[harq_pid] = mcs;
UE_list->UE_template[CC_id][UE_id].oldNDI1[harq_pid] = 1 - UE_list->UE_template[CC_id][UE_id].oldNDI1[harq_pid];
UE_list->UE_template[CC_id][UE_id].oldmcs1[harq_pid] = mcs1;
UE_list->UE_template[CC_id][UE_id].oldmcs2[harq_pid] = 0;
AssertFatal(UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated != NULL,
"physicalConfigDedicated is NULL\n");
......@@ -1481,7 +1478,7 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
fill_nfapi_dlsch_config(eNB, dl_req, TBS, eNB->pdu_index[CC_id], rnti, 0, // type 0 allocation from 7.1.6 in 36.213
0, // virtual_resource_block_assignment_flag, unused here
0, // resource_block_coding, to be filled in later
getQm(mcs), 0, // redundancy version
getQm(mcs1), 0, // redundancy version
1, // transport blocks
0, // transport block to codeword swap flag
cc[CC_id].p_eNB == 1 ? 0 : 1, // transmission_scheme
......@@ -1613,7 +1610,6 @@ fill_DLSCH_dci(module_id_t module_idP,
}
}
}
}
stop_meas(&eNB->fill_DLSCH_dci);
......@@ -1646,10 +1642,8 @@ unsigned char *get_dlsch_sdu(module_id_t module_idP,
UE_id = find_UE_id(module_idP,rntiP);
if (UE_id != -1) {
LOG_D(MAC,
"[eNB %d] Frame %d: CC_id %d Get DLSCH sdu for rnti %x => UE_id %d\n",
module_idP, frameP, CC_id, rntiP, UE_id);
return ((unsigned char *) &eNB->UE_list.DLSCH_pdu[CC_id][TBindex][UE_id].payload[0]);
LOG_D(MAC,"[eNB %d] Frame %d: CC_id %d Get DLSCH sdu for rnti %x => UE_id %d\n",module_idP,frameP,CC_id,rntiP,UE_id);
return((unsigned char *)&eNB->UE_list.DLSCH_pdu[CC_id][TBindex][UE_id].payload[0][0]);
} else {
LOG_E(MAC,
"[eNB %d] Frame %d: CC_id %d UE with RNTI %x does not exist\n",
......
......@@ -1876,8 +1876,8 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP, int harq_pidP
UE_list->UE_sched_ctrl[UE_id].ta_update = 31;
for (j = 0; j < 8; j++) {
UE_list->UE_template[cc_idP][UE_id].oldNDI[j] = (j == 0) ? 1 : 0; // 1 because first transmission is with format1A (Msg4) for harq_pid 0
UE_list->UE_template[cc_idP][UE_id].oldNDI_UL[j] = (j == harq_pidP) ? 0 : 1; // 1st transmission is with Msg3;
UE_list->UE_template[cc_idP][UE_id].oldNDI1[j] = (j==0)?1:0; // 1 because first transmission is with format1A (Msg4) for harq_pid 0
UE_list->UE_template[cc_idP][UE_id].oldNDI2[j] = 0;
UE_list->UE_sched_ctrl[UE_id].round[cc_idP][j] = 8;
UE_list->UE_sched_ctrl[UE_id].round_UL[cc_idP][j] = 0;
}
......
......@@ -663,6 +663,9 @@ typedef struct {
// total rb used for retransmission
uint32_t total_rbs_used_retx;
/// DL Wideband CQI index (2 TBs)
uint8_t dl_cqi[2];
/// TX
/// Num pkt
uint32_t num_pdu_tx[NB_RB_MAX];
......@@ -778,7 +781,9 @@ typedef struct {
/// C-RNTI of UE
rnti_t rnti;
/// NDI from last scheduling
uint8_t oldNDI[8];
uint8_t oldNDI1[8];
/// NDI from last scheduling
uint8_t oldNDI2[8];
/// mcs1 from last scheduling
uint8_t oldmcs1[8];
/// mcs2 from last scheduling
......@@ -795,7 +800,7 @@ typedef struct {
boolean_t configured;
/// MCS from last scheduling
uint8_t mcs[8];
uint8_t mcs[2][8];
/// TPC from last scheduling
uint8_t oldTPC[8];
......@@ -884,6 +889,9 @@ typedef struct {
/// UE tx power
int32_t ue_tx_power;
// active TBs
uint8_t TB_active[2][8];
/// stores the frame where the last TPC was transmitted
uint32_t pusch_tpc_tx_frame;
uint32_t pusch_tpc_tx_subframe;
......
......@@ -220,7 +220,12 @@ assign_rbs_required(module_id_t Mod_id,
eNB_UE_stats->dlsch_mcs1 =cmin(cqi_to_mcs[UE_list->UE_sched_ctrl[UE_id].dl_cqi[CC_id]],
slice_maxmcs[slice_id]);
if (get_tmode(Mod_id,CC_id,UE_id)==3)
eNB_UE_stats->dlsch_mcs2 = cmin(cqi_to_mcs[UE_list->UE_sched_ctrl[UE_id].dl_cqi[CC_id]],slice_maxmcs[slice_id]); //in TM3 there is only one CQI value
else if (get_tmode(Mod_id,CC_id,UE_id)==4)
eNB_UE_stats->dlsch_mcs2 = cqi_to_mcs[eNB_UE_stats->dl_cqi[1]];
else
eNB_UE_stats->dlsch_mcs2 = 0;
}
// provide the list of CCs sorted according to MCS
......
......@@ -91,7 +91,7 @@
#define msg printf
#endif
//#define XER_PRINT
#define XER_PRINT
typedef struct xer_sprint_string_s {
char *string;
......@@ -3357,7 +3357,7 @@ OAI_UECapability_t *fill_ue_capability(char *UE_EUTRA_Capability_xer_fname)
int i;
UE_EUTRA_Capability_t *UE_EUTRA_Capability;
char UE_EUTRA_Capability_xer[8192];
char UE_EUTRA_Capability_xer[102400];
size_t size;
LOG_I(RRC,"Allocating %zu bytes for UE_EUTRA_Capability\n",sizeof(*UE_EUTRA_Capability));
......@@ -3474,7 +3474,10 @@ OAI_UECapability_t *fill_ue_capability(char *UE_EUTRA_Capability_xer_fname)
return(NULL);
}
dec_rval = xer_decode(0, &asn_DEF_UE_EUTRA_Capability, (void*)UE_EUTRA_Capability, UE_EUTRA_Capability_xer, size);
// use this line if UE capabilites was stored in a xml file (does not seem to work)
// dec_rval = xer_decode(0, &asn_DEF_UE_EUTRA_Capability, (void*)UE_EUTRA_Capability, UE_EUTRA_Capability_xer, size);
// use this line if UE capabilites was stored as a raw file
dec_rval = uper_decode(NULL, &asn_DEF_UE_EUTRA_Capability, (void**)&UE_EUTRA_Capability, UE_EUTRA_Capability_xer, size, 0, 0);
assert(dec_rval.code == RC_OK);
}
......
......@@ -1963,7 +1963,7 @@ rrc_ue_process_securityModeCommand(
enc_rval = uper_encode_to_buffer(&asn_DEF_UL_DCCH_Message,
(void*)&ul_dcch_msg,
buffer,
100);
256);
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
enc_rval.failed_type->name, enc_rval.encoded);
......@@ -2029,7 +2029,7 @@ rrc_ue_process_ueCapabilityEnquiry(
UE_CapabilityRAT_Container_t ue_CapabilityRAT_Container;
uint8_t buffer[200];
uint8_t buffer[256];
int i;
LOG_I(RRC,"[UE %d] Frame %d: Receiving from SRB1 (DL-DCCH), Processing UECapabilityEnquiry (eNB %d)\n",
......
......@@ -3728,7 +3728,7 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
if (*physicalConfigDedicated) {
if ((*physicalConfigDedicated)->antennaInfo) {
(*physicalConfigDedicated)->antennaInfo->choice.explicitValue.transmissionMode = rrc_inst->configuration.ue_TransmissionMode[0];
LOG_D(RRC,"Setting transmission mode to %ld+1\n",rrc_inst->configuration.ue_TransmissionMode[0]);
LOG_I(RRC,"Setting transmission mode to %ld+1\n",rrc_inst->configuration.ue_TransmissionMode[0]);
if (rrc_inst->configuration.ue_TransmissionMode[0]==AntennaInfoDedicated__transmissionMode_tm3) {
(*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction=
CALLOC(1,sizeof(AntennaInfoDedicated__codebookSubsetRestriction_PR));
......@@ -3770,6 +3770,53 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
(*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm6.size=1;
(*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm6.bits_unused=4;
}
else if (rrc_inst->configuration.ue_TransmissionMode[0]==AntennaInfoDedicated__transmissionMode_tm8_v920) {
// delete previously allocated release 8 configs
free((*physicalConfigDedicated)->antennaInfo);
(*physicalConfigDedicated)->antennaInfo=NULL;
free((*physicalConfigDedicated)->cqi_ReportConfig);
(*physicalConfigDedicated)->cqi_ReportConfig=NULL;
// Rel 9 config (does not seem to work)
/*
(*physicalConfigDedicated)->ext1 = CALLOC(1,sizeof((*physicalConfigDedicated)->ext1));
(*physicalConfigDedicated)->ext1->antennaInfo_v920 = CALLOC(1, sizeof((*physicalConfigDedicated)->ext1->antennaInfo_v920));
(*physicalConfigDedicated)->ext1->antennaInfo_v920->codebookSubsetRestriction_v920 = NULL;
*/
/*
//optional: use codebook subset restriction
(*physicalConfigDedicated)->ext1->antennaInfo_v920->codebookSubsetRestriction_v920 = CALLOC(1, sizeof((*physicalConfigDedicated)->ext1->antennaInfo_v920->codebookSubsetRestriction_v920));
(*physicalConfigDedicated)->ext1->antennaInfo_v920->codebookSubsetRestriction_v920->present = AntennaInfoDedicated_v920__codebookSubsetRestriction_v920_PR_n2TxAntenna_tm8_r9;
(*physicalConfigDedicated)->ext1->antennaInfo_v920->codebookSubsetRestriction_v920->choice.n2TxAntenna_tm8_r9.buf= MALLOC(1);
(*physicalConfigDedicated)->ext1->antennaInfo_v920->codebookSubsetRestriction_v920->choice.n2TxAntenna_tm8_r9.buf[0] = 0xfc;
(*physicalConfigDedicated)->ext1->antennaInfo_v920->codebookSubsetRestriction_v920->choice.n2TxAntenna_tm8_r9.size=1;
(*physicalConfigDedicated)->ext1->antennaInfo_v920->codebookSubsetRestriction_v920->choice.n2TxAntenna_tm8_r9.bits_unused=2;
*/
// Rel 10 config
(*physicalConfigDedicated)->ext2 = CALLOC(1,sizeof(struct PhysicalConfigDedicated__ext2));
(*physicalConfigDedicated)->ext2->antennaInfo_r10 = CALLOC(1,sizeof(struct PhysicalConfigDedicated__ext2__antennaInfo_r10));
(*physicalConfigDedicated)->ext2->antennaInfo_r10->present = PhysicalConfigDedicated__ext2__antennaInfo_r10_PR_explicitValue_r10;
(*physicalConfigDedicated)->ext2->antennaInfo_r10->choice.explicitValue_r10.transmissionMode_r10 = AntennaInfoDedicated_r10__transmissionMode_r10_tm8_v920;
(*physicalConfigDedicated)->ext2->antennaInfo_r10->choice.explicitValue_r10.ue_TransmitAntennaSelection.present=AntennaInfoDedicated_r10__ue_TransmitAntennaSelection_PR_release;
// TM8 requires at least this minimal CQI config to be present
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10 = CALLOC(1,sizeof(struct CQI_ReportConfig_r10));
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->nomPDSCH_RS_EPRE_Offset = 0;
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->cqi_ReportPeriodic_r10 = NULL;
/*
// this is the CQI config that amarisoft uses. the corresponding procedures are not yet supported in OAI
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->cqi_ReportPeriodic_r10 = CALLOC(1,sizeof(struct CQI_ReportPeriodic_r10));
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->cqi_ReportPeriodic_r10->present = CQI_ReportPeriodic_r10_PR_setup;
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->cqi_ReportPeriodic_r10->choice.setup.cqi_PUCCH_ResourceIndex_r10 = 0;
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->cqi_ReportPeriodic_r10->choice.setup.cqi_pmi_ConfigIndex = 39;
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->cqi_ReportPeriodic_r10->choice.setup.simultaneousAckNackAndCQI = true;
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->cqi_ReportPeriodic_r10->choice.setup.cqi_FormatIndicatorPeriodic_r10.present=CQI_ReportPeriodic_r10__setup__cqi_FormatIndicatorPeriodic_r10_PR_widebandCQI_r10;
*/
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->cqi_ReportAperiodic_r10 = CALLOC(1,sizeof(struct CQI_ReportAperiodic_r10));
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->cqi_ReportAperiodic_r10->present = CQI_ReportAperiodic_r10_PR_setup;
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->cqi_ReportAperiodic_r10->choice.setup.cqi_ReportModeAperiodic_r10 = CQI_ReportModeAperiodic_rm30;
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->csi_SubframePatternConfig_r10 = NULL;
(*physicalConfigDedicated)->ext2->cqi_ReportConfig_r10->pmi_RI_Report_r9 = NULL;
}
}
else {
LOG_E(RRC,"antenna_info not present in physical_config_dedicated. Not reconfiguring!\n");
......@@ -7018,6 +7065,19 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) {
ue_context_p->ue_context.UE_Capability, 0);
ue_context_p->ue_context.UE_Capability = 0;
}
/*
//write the UE capabilities raw to a binary file
FILE *uecap_fd = fopen("uecap.raw","wb");
assert(uecap_fd);
fwrite(ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.
choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.
array[0]->ueCapabilityRAT_Container.buf,
ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.
choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.
array[0]->ueCapabilityRAT_Container.size,
1,uecap_fd);
fclose(uecap_fd);
*/
#if defined(ENABLE_USE_MME)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment