Commit 26ce3333 authored by nikaeinn's avatar nikaeinn

* fix issues foe multi UE scenarios in MAC

* add target MCS for DL and UL for LTE softmodem
* make RLC message print for ITTI an option



git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5762 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent 69025978
...@@ -506,11 +506,11 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, ...@@ -506,11 +506,11 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
#ifdef USER_MODE // need to be adapted for the emulation in the kernel space #ifdef USER_MODE // need to be adapted for the emulation in the kernel space
if (uniformrandom() < bler) { if (uniformrandom() < bler) {
LOG_I(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); LOG_I(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f, TM %d)\n",mcs,sinr_eff,bler, TM);
return(0); return(1);
} }
else { else {
LOG_I(OCM,"abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); LOG_I(OCM,"abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f, TM %d)\n",mcs,sinr_eff,bler, TM);
return(1); return(1);
} }
#endif #endif
......
...@@ -418,21 +418,19 @@ void schedule_ue_spec(module_id_t module_idP, ...@@ -418,21 +418,19 @@ void schedule_ue_spec(module_id_t module_idP,
sdu_length_total=0; sdu_length_total=0;
num_sdus=0; num_sdus=0;
if (openair_daq_vars.target_ue_dl_mcs <= 0) { /*
/*
DevCheck(((eNB_UE_stats->DL_cqi[0] < MIN_CQI_VALUE) || (eNB_UE_stats->DL_cqi[0] > MAX_CQI_VALUE)), DevCheck(((eNB_UE_stats->DL_cqi[0] < MIN_CQI_VALUE) || (eNB_UE_stats->DL_cqi[0] > MAX_CQI_VALUE)),
eNB_UE_stats->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE); eNB_UE_stats->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE);
*/ */
eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]]; eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]];
LOG_T(MAC,"CQI %d\n",eNB_UE_stats->DL_cqi[0]); eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs);
}
else
eNB_UE_stats->dlsch_mcs1 = openair_daq_vars.target_ue_dl_mcs;
#ifdef EXMIMO #ifdef EXMIMO
if (mac_xface->get_transmission_mode(module_idP,CC_id, rnti)==5) if (mac_xface->get_transmission_mode(module_idP,CC_id, rnti)==5)
eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,16); eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,16);
#endif #endif
// store stats // store stats
UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi= eNB_UE_stats->DL_cqi[0]; UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi= eNB_UE_stats->DL_cqi[0];
// initializing the rb allocation indicator for each UE // initializing the rb allocation indicator for each UE
...@@ -637,79 +635,84 @@ void schedule_ue_spec(module_id_t module_idP, ...@@ -637,79 +635,84 @@ void schedule_ue_spec(module_id_t module_idP,
header_len_dcch = 2; // 2 bytes DCCH SDU subheader header_len_dcch = 2; // 2 bytes DCCH SDU subheader
if ( TBS-ta_len-header_len_dcch > 0 )
rlc_status = mac_rlc_status_ind( {
module_idP, rlc_status = mac_rlc_status_ind(
UE_id, module_idP,
frameP, UE_id,
ENB_FLAG_YES, frameP,
MBMS_FLAG_NO, ENB_FLAG_YES,
DCCH, MBMS_FLAG_NO,
(TBS-ta_len-header_len_dcch)); // transport block set size DCCH,
(TBS-ta_len-header_len_dcch)); // transport block set size
sdu_lengths[0]=0;
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",module_idP,frameP,TBS-header_len_dcch);
sdu_lengths[0] += mac_rlc_data_req(
module_idP,
UE_id,
frameP,
ENB_FLAG_YES,
MBMS_FLAG_NO,
DCCH,
(char *)&dlsch_buffer[sdu_lengths[0]]);
LOG_D(MAC,"[eNB %d][DCCH] Got %d bytes from RLC\n",module_idP,sdu_lengths[0]); sdu_lengths[0]=0;
sdu_length_total = sdu_lengths[0]; if (rlc_status.bytes_in_buffer > 0) { // There is DCCH to transmit
sdu_lcids[0] = DCCH; LOG_D(MAC,"[eNB %d] Frame %d, DL-DCCH->DLSCH, Requesting %d bytes from RLC (RRC message)\n",module_idP,frameP,TBS-header_len_dcch);
UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH]+=1; sdu_lengths[0] += mac_rlc_data_req(
UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH]+=sdu_lengths[0]; module_idP,
num_sdus = 1; UE_id,
frameP,
ENB_FLAG_YES,
MBMS_FLAG_NO,
DCCH,
(char *)&dlsch_buffer[sdu_lengths[0]]);
LOG_D(MAC,"[eNB %d][DCCH] Got %d bytes from RLC\n",module_idP,sdu_lengths[0]);
sdu_length_total = sdu_lengths[0];
sdu_lcids[0] = DCCH;
UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH]+=1;
UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH]+=sdu_lengths[0];
num_sdus = 1;
#ifdef DEBUG_eNB_SCHEDULER #ifdef DEBUG_eNB_SCHEDULER
LOG_T(MAC,"[eNB %d][DCCH] Got %d bytes :",module_idP,sdu_lengths[0]); LOG_T(MAC,"[eNB %d][DCCH] Got %d bytes :",module_idP,sdu_lengths[0]);
for (j=0;j<sdu_lengths[0];j++) for (j=0;j<sdu_lengths[0];j++)
LOG_T(MAC,"%x ",dlsch_buffer[j]); LOG_T(MAC,"%x ",dlsch_buffer[j]);
LOG_T(MAC,"\n"); LOG_T(MAC,"\n");
#endif #endif
}
else {
header_len_dcch = 0;
sdu_length_total = 0;
}
} }
else {
header_len_dcch = 0;
sdu_length_total = 0;
}
// check for DCCH1 and update header information (assume 2 byte sub-header) // check for DCCH1 and update header information (assume 2 byte sub-header)
rlc_status = mac_rlc_status_ind( if (TBS-ta_len-header_len_dcch-sdu_length_total > 0 )
module_idP, {
UE_id, rlc_status = mac_rlc_status_ind(
frameP, module_idP,
ENB_FLAG_YES, UE_id,
MBMS_FLAG_NO, frameP,
DCCH+1, ENB_FLAG_YES,
(TBS-ta_len-header_len_dcch-sdu_length_total)); // transport block set size less allocations for timing advance and MBMS_FLAG_NO,
// DCCH SDU DCCH+1,
(TBS-ta_len-header_len_dcch-sdu_length_total)); // transport block set size less allocations for timing advance and
if (rlc_status.bytes_in_buffer > 0) { // DCCH SDU
LOG_D(MAC,"[eNB %d], Frame %d, DCCH1->DLSCH, Requesting %d bytes from RLC (RRC message)\n",
module_idP,frameP,TBS-header_len_dcch-sdu_length_total); if (rlc_status.bytes_in_buffer > 0)
sdu_lengths[num_sdus] += mac_rlc_data_req( {
module_idP, LOG_D(MAC,"[eNB %d], Frame %d, DCCH1->DLSCH, Requesting %d bytes from RLC (RRC message)\n",
UE_id, module_idP,frameP,TBS-header_len_dcch-sdu_length_total);
frameP, sdu_lengths[num_sdus] += mac_rlc_data_req(
ENB_FLAG_YES, module_idP,
MBMS_FLAG_NO, UE_id,
DCCH+1, frameP,
(char *)&dlsch_buffer[sdu_lengths[0]]); ENB_FLAG_YES,
MBMS_FLAG_NO,
DCCH+1,
(char *)&dlsch_buffer[sdu_lengths[0]]);
sdu_lcids[num_sdus] = DCCH1; sdu_lcids[num_sdus] = DCCH1;
sdu_length_total += sdu_lengths[num_sdus]; sdu_length_total += sdu_lengths[num_sdus];
header_len_dcch += 2; header_len_dcch += 2;
UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH1]+=1; UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH1]+=1;
UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH1]+=sdu_lengths[num_sdus]; UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH1]+=sdu_lengths[num_sdus];
num_sdus++; num_sdus++;
LOG_D(MAC,"[eNB %d] Got %d bytes for DCCH from RLC\n",module_idP,sdu_lengths[0]); LOG_D(MAC,"[eNB %d] Got %d bytes for DCCH from RLC\n",module_idP,sdu_lengths[0]);
}
} }
// check for DTCH and update header information // check for DTCH and update header information
// here we should loop over all possible DTCH // here we should loop over all possible DTCH
header_len_dtch = 3; // 3 bytes DTCH SDU subheader header_len_dtch = 3; // 3 bytes DTCH SDU subheader
...@@ -717,40 +720,43 @@ void schedule_ue_spec(module_id_t module_idP, ...@@ -717,40 +720,43 @@ void schedule_ue_spec(module_id_t module_idP,
module_idP,frameP,DTCH,TBS, module_idP,frameP,DTCH,TBS,
TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch);
rlc_status = mac_rlc_status_ind( if (TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch > 0 )
module_idP, {
UE_id, rlc_status = mac_rlc_status_ind(
frameP, module_idP,
ENB_FLAG_YES, UE_id,
MBMS_FLAG_NO, frameP,
DTCH, ENB_FLAG_YES,
TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); MBMS_FLAG_NO,
DTCH,
if (rlc_status.bytes_in_buffer > 0) { TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch);
LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB], Frame %d, DTCH->DLSCH, Requesting %d bytes from RLC (hdr len dtch %d)\n",
module_idP,frameP,TBS-header_len_dcch-sdu_length_total-header_len_dtch,header_len_dtch);
sdu_lengths[num_sdus] = mac_rlc_data_req(
module_idP,
UE_id,
frameP,
ENB_FLAG_YES,
MBMS_FLAG_NO,
DTCH,
(char*)&dlsch_buffer[sdu_length_total]);
LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n",module_idP,sdu_lengths[num_sdus],DTCH); if (rlc_status.bytes_in_buffer > 0) {
sdu_lcids[num_sdus] = DTCH;
sdu_length_total += sdu_lengths[num_sdus]; LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB], Frame %d, DTCH->DLSCH, Requesting %d bytes from RLC (hdr len dtch %d)\n",
UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DTCH]+=1; module_idP,frameP,TBS-header_len_dcch-sdu_length_total-header_len_dtch,header_len_dtch);
UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DTCH]+=sdu_lengths[num_sdus]; sdu_lengths[num_sdus] = mac_rlc_data_req(
if (sdu_lengths[num_sdus] < 128) { module_idP,
header_len_dtch=2; UE_id,
frameP,
ENB_FLAG_YES,
MBMS_FLAG_NO,
DTCH,
(char*)&dlsch_buffer[sdu_length_total]);
LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n",module_idP,sdu_lengths[num_sdus],DTCH);
sdu_lcids[num_sdus] = DTCH;
sdu_length_total += sdu_lengths[num_sdus];
UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DTCH]+=1;
UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DTCH]+=sdu_lengths[num_sdus];
if (sdu_lengths[num_sdus] < 128) {
header_len_dtch=2;
}
num_sdus++;
}
else {
header_len_dtch = 0;
} }
num_sdus++;
}
else {
header_len_dtch = 0;
} }
// there is a payload // there is a payload
......
...@@ -168,6 +168,8 @@ void assign_rbs_required (module_id_t Mod_id, ...@@ -168,6 +168,8 @@ void assign_rbs_required (module_id_t Mod_id,
eNB_UE_stats[CC_id]->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE); eNB_UE_stats[CC_id]->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE);
*/ */
eNB_UE_stats[CC_id]->dlsch_mcs1=cqi_to_mcs[eNB_UE_stats[CC_id]->DL_cqi[0]]; eNB_UE_stats[CC_id]->dlsch_mcs1=cqi_to_mcs[eNB_UE_stats[CC_id]->DL_cqi[0]];
eNB_UE_stats[CC_id]->dlsch_mcs1 = cmin(eNB_UE_stats[CC_id]->dlsch_mcs1,openair_daq_vars.target_ue_dl_mcs);
} }
// provide the list of CCs sorted according to MCS // provide the list of CCs sorted according to MCS
for (i=0;i<UE_list->numactiveCCs[UE_id];i++) { for (i=0;i<UE_list->numactiveCCs[UE_id];i++) {
...@@ -194,13 +196,16 @@ void assign_rbs_required (module_id_t Mod_id, ...@@ -194,13 +196,16 @@ void assign_rbs_required (module_id_t Mod_id,
LOG_D(MAC,"[preprocessor] assign RB for UE %d\n",UE_id); LOG_D(MAC,"[preprocessor] assign RB for UE %d\n",UE_id);
for (i=0;i<UE_list->numactiveCCs[UE_id];i++) { for (i=0;i<UE_list->numactiveCCs[UE_id];i++) {
CC_id = UE_list->ordered_CCids[i][UE_id]; CC_id = UE_list->ordered_CCids[i][UE_id];
LOG_D(MAC,"[preprocessor] assign RB for UE %d\n",UE_id);
if (eNB_UE_stats[CC_id]->dlsch_mcs1==0) nb_rbs_required[CC_id][UE_id] = 4; // don't let the TBS get too small if (eNB_UE_stats[CC_id]->dlsch_mcs1==0) nb_rbs_required[CC_id][UE_id] = 4; // don't let the TBS get too small
else nb_rbs_required[CC_id][UE_id] = min_rb_unit[CC_id]; else nb_rbs_required[CC_id][UE_id] = min_rb_unit[CC_id];
TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,nb_rbs_required[CC_id][UE_id]); TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,nb_rbs_required[CC_id][UE_id]);
LOG_D(MAC,"[preprocessor] start RB assignement for UE %d CC_id %d dl buffer %d (RB unit %d, MCS %d, TBS %d) \n",
UE_id, CC_id, UE_list->UE_template[pCCid][UE_id].dl_buffer_total,
nb_rbs_required[CC_id][UE_id],eNB_UE_stats[CC_id]->dlsch_mcs1,TBS);
/* calculating required number of RBs for each UE */ /* calculating required number of RBs for each UE */
while (TBS < UE_list->UE_template[UE_id]->dl_buffer_total) { while (TBS < UE_list->UE_template[pCCid][UE_id].dl_buffer_total) {
nb_rbs_required[CC_id][UE_id] += min_rb_unit[CC_id]; nb_rbs_required[CC_id][UE_id] += min_rb_unit[CC_id];
if (nb_rbs_required[CC_id][UE_id] > frame_parms[CC_id]->N_RB_DL) { if (nb_rbs_required[CC_id][UE_id] > frame_parms[CC_id]->N_RB_DL) {
TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,frame_parms[CC_id]->N_RB_DL); TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,frame_parms[CC_id]->N_RB_DL);
...@@ -209,8 +214,8 @@ void assign_rbs_required (module_id_t Mod_id, ...@@ -209,8 +214,8 @@ void assign_rbs_required (module_id_t Mod_id,
} }
TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,nb_rbs_required[CC_id][UE_id]); TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,nb_rbs_required[CC_id][UE_id]);
} // end of while } // end of while
LOG_D(MAC,"[eNB %d] Frame %d: UE %d on CC %d nb_required RB %d (TBS %d, mcs %d)\n", LOG_D(MAC,"[eNB %d] Frame %d: UE %d on CC %d: RB unit %d, nb_required RB %d (TBS %d, mcs %d)\n",
Mod_id, frameP,UE_id, CC_id, nb_rbs_required[CC_id][UE_id], TBS, eNB_UE_stats[CC_id]->dlsch_mcs1); Mod_id, frameP,UE_id, CC_id, min_rb_unit[CC_id], nb_rbs_required[CC_id][UE_id], TBS, eNB_UE_stats[CC_id]->dlsch_mcs1);
} }
} }
} }
......
...@@ -48,7 +48,8 @@ ...@@ -48,7 +48,8 @@
#include "rlc_um_very_simple_test.h" #include "rlc_um_very_simple_test.h"
#define DEBUG_RLC_UM_TX_STATUS 1 #define DEBUG_RLC_UM_TX_STATUS 1
#define TRACE_RLC_UM_PDU 1 // NN --> LG: this could become a perf bottleneck, I added this to the makefile.
//#define TRACE_RLC_UM_PDU 1
#ifdef TRACE_RLC_UM_PDU #ifdef TRACE_RLC_UM_PDU
char message_string[10000]; char message_string[10000];
...@@ -663,7 +664,7 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP) ...@@ -663,7 +664,7 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP)
rlc_p->stat_tx_pdcp_sdu += 1; rlc_p->stat_tx_pdcp_sdu += 1;
rlc_p->stat_tx_pdcp_bytes += ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_size; rlc_p->stat_tx_pdcp_bytes += ((struct rlc_um_tx_sdu_management *) (sdu_pP->data))->sdu_size;
# if defined(ENABLE_ITTI) # if defined(TRACE_RLC_UM_PDU)
data_offset = sizeof (struct rlc_um_data_req_alloc); data_offset = sizeof (struct rlc_um_data_req_alloc);
data_size = ((struct rlc_um_tx_sdu_management *)(sdu_pP->data))->sdu_size; data_size = ((struct rlc_um_tx_sdu_management *)(sdu_pP->data))->sdu_size;
message_string_size += sprintf(&message_string[message_string_size], "Bearer : %u\n", rlc_p->rb_id); message_string_size += sprintf(&message_string[message_string_size], "Bearer : %u\n", rlc_p->rb_id);
...@@ -696,6 +697,7 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP) ...@@ -696,6 +697,7 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP)
} }
message_string_size += sprintf(&message_string[message_string_size], " |\n"); message_string_size += sprintf(&message_string[message_string_size], " |\n");
# if defined(ENABLE_ITTI)
msg_p = itti_alloc_new_message_sized (rlc_p->is_enb > 0 ? TASK_RLC_ENB:TASK_RLC_UE , RLC_UM_SDU_REQ, message_string_size + sizeof (IttiMsgText)); msg_p = itti_alloc_new_message_sized (rlc_p->is_enb > 0 ? TASK_RLC_ENB:TASK_RLC_UE , RLC_UM_SDU_REQ, message_string_size + sizeof (IttiMsgText));
msg_p->ittiMsg.rlc_um_sdu_req.size = message_string_size; msg_p->ittiMsg.rlc_um_sdu_req.size = message_string_size;
memcpy(&msg_p->ittiMsg.rlc_um_sdu_req.text, message_string, message_string_size); memcpy(&msg_p->ittiMsg.rlc_um_sdu_req.text, message_string, message_string_size);
...@@ -705,6 +707,9 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP) ...@@ -705,6 +707,9 @@ rlc_um_data_req (void *rlc_pP, frame_t frameP, mem_block_t *sdu_pP)
} else { } else {
itti_send_msg_to_task(TASK_UNKNOWN, rlc_p->ue_module_id + NB_eNB_INST, msg_p); itti_send_msg_to_task(TASK_UNKNOWN, rlc_p->ue_module_id + NB_eNB_INST, msg_p);
} }
#else
LOG_T(RLC, "%s", message_string);
#endif
# endif # endif
} else { } else {
......
...@@ -262,8 +262,12 @@ rlc_um_init (rlc_um_entity_t * const rlc_pP) ...@@ -262,8 +262,12 @@ rlc_um_init (rlc_um_entity_t * const rlc_pP)
rlc_pP->tx_header_min_length_in_bytes = 2; rlc_pP->tx_header_min_length_in_bytes = 2;
// SPARE : not 3GPP // SPARE : not 3GPP
#ifdef JUMBO_FRAME
rlc_pP->size_input_sdus_buffer =1024;
#else
rlc_pP->size_input_sdus_buffer =128; rlc_pP->size_input_sdus_buffer =128;
#endif
if ((rlc_pP->input_sdus == NULL) && (rlc_pP->size_input_sdus_buffer > 0)) { if ((rlc_pP->input_sdus == NULL) && (rlc_pP->size_input_sdus_buffer > 0)) {
rlc_pP->input_sdus = calloc(1 , rlc_pP->size_input_sdus_buffer * sizeof (void *)); rlc_pP->input_sdus = calloc(1 , rlc_pP->size_input_sdus_buffer * sizeof (void *));
} }
......
...@@ -15,8 +15,8 @@ ...@@ -15,8 +15,8 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not, included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>. see <http://www.gnu.org/licenses/>.
Contact Information Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr OpenAirInterface Admin: openair_admin@eurecom.fr
...@@ -510,7 +510,7 @@ rlc_op_status_t rlc_data_req (const module_id_t enb_module_idP, ...@@ -510,7 +510,7 @@ rlc_op_status_t rlc_data_req (const module_id_t enb_module_idP,
((struct rlc_um_data_req *) (new_sdu_p->data))->data_offset = sizeof (struct rlc_um_data_req_alloc); ((struct rlc_um_data_req *) (new_sdu_p->data))->data_offset = sizeof (struct rlc_um_data_req_alloc);
free_mem_block(sdu_pP); free_mem_block(sdu_pP);
LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED); //LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
LOG_D(RLC, "[FRAME %5u][%s][%s][INST %u/%u][%s %u][--- RLC_UM_DATA_REQ/%d Bytes --->][RLC_UM][INST %u/%u][%s %u]\n", LOG_D(RLC, "[FRAME %5u][%s][%s][INST %u/%u][%s %u][--- RLC_UM_DATA_REQ/%d Bytes --->][RLC_UM][INST %u/%u][%s %u]\n",
frameP, frameP,
(enb_flagP) ? "eNB" : "UE", (enb_flagP) ? "eNB" : "UE",
...@@ -524,7 +524,7 @@ rlc_op_status_t rlc_data_req (const module_id_t enb_module_idP, ...@@ -524,7 +524,7 @@ rlc_op_status_t rlc_data_req (const module_id_t enb_module_idP,
ue_module_idP, ue_module_idP,
(srb_flagP) ? "SRB" : "DRB", (srb_flagP) ? "SRB" : "DRB",
rb_idP); rb_idP);
LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT); //LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
rlc_um_data_req(&rlc_union_p->rlc.um, frameP, new_sdu_p); rlc_um_data_req(&rlc_union_p->rlc.um, frameP, new_sdu_p);
//free_mem_block(new_sdu); //free_mem_block(new_sdu);
......
...@@ -103,17 +103,17 @@ private_mem_block(void check_free_mem_block (mem_block_t * leP);) ...@@ -103,17 +103,17 @@ private_mem_block(void check_free_mem_block (mem_block_t * leP);)
# define MEM_MNGT_MB4_BLOCK_SIZE MEM_MNGT_MB0_BLOCK_SIZE*16 # define MEM_MNGT_MB4_BLOCK_SIZE MEM_MNGT_MB0_BLOCK_SIZE*16
// 1024 // 1024
# define MEM_MNGT_MB4_NB_BLOCKS 512 * MEM_SCALE # define MEM_MNGT_MB4_NB_BLOCKS 1024 * MEM_SCALE
# define MEM_MNGT_POOL_ID4 4 # define MEM_MNGT_POOL_ID4 4
# define MEM_MNGT_MB5_BLOCK_SIZE MEM_MNGT_MB0_BLOCK_SIZE*32 # define MEM_MNGT_MB5_BLOCK_SIZE MEM_MNGT_MB0_BLOCK_SIZE*32
// 2048 // 2048
# define MEM_MNGT_MB5_NB_BLOCKS 512 * MEM_SCALE // LG WAS 1024 # define MEM_MNGT_MB5_NB_BLOCKS 1024 * MEM_SCALE // LG WAS 1024
# define MEM_MNGT_POOL_ID5 5 # define MEM_MNGT_POOL_ID5 5
# define MEM_MNGT_MB6_BLOCK_SIZE MEM_MNGT_MB0_BLOCK_SIZE*64 # define MEM_MNGT_MB6_BLOCK_SIZE MEM_MNGT_MB0_BLOCK_SIZE*64
// 4096 // 4096
# define MEM_MNGT_MB6_NB_BLOCKS 128 * MEM_SCALE // LG WAS 256 # define MEM_MNGT_MB6_NB_BLOCKS 1024 * MEM_SCALE // LG WAS 256
# define MEM_MNGT_POOL_ID6 6 # define MEM_MNGT_POOL_ID6 6
# define MEM_MNGT_MB7_BLOCK_SIZE MEM_MNGT_MB0_BLOCK_SIZE*128 # define MEM_MNGT_MB7_BLOCK_SIZE MEM_MNGT_MB0_BLOCK_SIZE*128
......
...@@ -697,7 +697,7 @@ if ((g_otg->background_stats==1)&&(otg_info->tx_num_bytes_background[i][j]>0)){ ...@@ -697,7 +697,7 @@ if ((g_otg->background_stats==1)&&(otg_info->tx_num_bytes_background[i][j]>0)){
LOG_I(OTG,"[BACKGROUND] Total bytes(RX)= %d \n", rx_total_bytes_dl_background); LOG_I(OTG,"[BACKGROUND] Total bytes(RX)= %d \n", rx_total_bytes_dl_background);
LOG_I(OTG,"[BACKGROUND] TX throughput = %.7f(Kbit/s) \n", ((double)tx_total_bytes_dl_background*1000*8)/(otg_info->ctime*1024)); LOG_I(OTG,"[BACKGROUND] TX throughput = %.7f(Kbit/s) \n", ((double)tx_total_bytes_dl_background*1000*8)/(otg_info->ctime*1024));
LOG_I(OTG,"[BACKGROUND] RX throughput = %.7f(Kbit/s) \n", ((double)rx_total_bytes_dl_background*1000*8)/(otg_info->ctime*1024)); LOG_I(OTG,"[BACKGROUND] RX throughput = %.7f(Kbit/s) \n", ((double)rx_total_bytes_dl_background*1000*8)/(otg_info->ctime*1024));
} }
if (tx_total_pkts_dl_multicast>0){ if (tx_total_pkts_dl_multicast>0){
LOG_I(OTG,"[MULTICAST] Total packets(TX)= %d \n", tx_total_pkts_dl_multicast); LOG_I(OTG,"[MULTICAST] Total packets(TX)= %d \n", tx_total_pkts_dl_multicast);
LOG_I(OTG,"[MULTICAST] Total bytes(TX)= %d \n", tx_total_bytes_dl_multicast); LOG_I(OTG,"[MULTICAST] Total bytes(TX)= %d \n", tx_total_bytes_dl_multicast);
...@@ -706,7 +706,7 @@ if ((g_otg->background_stats==1)&&(otg_info->tx_num_bytes_background[i][j]>0)){ ...@@ -706,7 +706,7 @@ if ((g_otg->background_stats==1)&&(otg_info->tx_num_bytes_background[i][j]>0)){
LOG_I(OTG,"[MULTICAST] otg_multicast_info->ctime = %d \n", otg_multicast_info->ctime); LOG_I(OTG,"[MULTICAST] otg_multicast_info->ctime = %d \n", otg_multicast_info->ctime);
LOG_I(OTG,"[MULTICAST] TX throughput = %.7f(Kbit/s) \n", ((double)tx_total_bytes_dl_multicast*1000*8)/(otg_info->ctime*1024)); LOG_I(OTG,"[MULTICAST] TX throughput = %.7f(Kbit/s) \n", ((double)tx_total_bytes_dl_multicast*1000*8)/(otg_info->ctime*1024));
LOG_I(OTG,"[MULTICAST] RX throughput = %.7f(Kbit/s) \n", ((double)rx_total_bytes_dl_multicast*1000*8)/(otg_info->ctime*1024)); LOG_I(OTG,"[MULTICAST] RX throughput = %.7f(Kbit/s) \n", ((double)rx_total_bytes_dl_multicast*1000*8)/(otg_info->ctime*1024));
} }
LOG_F(OTG,"**************** TOTAL DL RESULTS ******************\n"); LOG_F(OTG,"**************** TOTAL DL RESULTS ******************\n");
......
...@@ -262,7 +262,7 @@ Send Packets when: ...@@ -262,7 +262,7 @@ Send Packets when:
otg_info->size_background[src][dst]=g_otg->aggregation_level[src][dst][application]*otg_info->size_background[src][dst]; otg_info->size_background[src][dst]=g_otg->aggregation_level[src][dst][application]*otg_info->size_background[src][dst];
else{ else{
//otg_info->size_background[src][dst]=PAYLOAD_MAX; //otg_info->size_background[src][dst]=PAYLOAD_MAX;
LOG_E(OTG,"[BACKGROUND] Aggregated packet larger than PAYLOAD_MAX, payload is limited to PAYLOAD_MAX %d\n"); LOG_E(OTG,"[BACKGROUND] Aggregated packet larger than PAYLOAD_MAX, payload is limited to %d\n", PAYLOAD_MAX);
} }
header =random_string(header_size_gen_background(src,dst), g_otg->packet_gen_type, HEADER_ALPHABET); header =random_string(header_size_gen_background(src,dst), g_otg->packet_gen_type, HEADER_ALPHABET);
payload = random_string(otg_info->size_background[src][dst], RANDOM_STRING, PAYLOAD_ALPHABET); payload = random_string(otg_info->size_background[src][dst], RANDOM_STRING, PAYLOAD_ALPHABET);
...@@ -466,7 +466,7 @@ int check_data_transmit(int src,int dst, int app, int ctime){ ...@@ -466,7 +466,7 @@ int check_data_transmit(int src,int dst, int app, int ctime){
/* if the aggregated size is less than PAYLOAD_MAX the traffic is aggregated, otherwise size=PAYLOAD_MAX */ /* if the aggregated size is less than PAYLOAD_MAX the traffic is aggregated, otherwise size=PAYLOAD_MAX */
if (size>=(PAYLOAD_MAX-(sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t) + otg_info->header_size[src][dst]))) { if (size>=(PAYLOAD_MAX-(sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t) + otg_info->header_size[src][dst]))) {
//size=PAYLOAD_MAX- (sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t) + otg_info->header_size[src][dst]); //size=PAYLOAD_MAX- (sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t) + otg_info->header_size[src][dst]);
LOG_E(OTG,"Aggregated packet larger than PAYLOAD_MAX, payload is limited to PAYLOAD_MAX \n"); LOG_E(OTG,"Aggregated packet larger than PAYLOAD_MAX, payload is limited to %d \n", PAYLOAD_MAX );
} }
} //check if there is background traffic to generate } //check if there is background traffic to generate
......
...@@ -301,6 +301,10 @@ static int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,7 ...@@ -301,6 +301,10 @@ static int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,7
static LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; static LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs];
int multi_thread=1; int multi_thread=1;
// this allows
uint32_t target_dl_mcs = 28;
uint32_t target_ul_mcs = 8;
int16_t glog_level=LOG_DEBUG; int16_t glog_level=LOG_DEBUG;
int16_t glog_verbosity=LOG_MED; int16_t glog_verbosity=LOG_MED;
...@@ -1735,7 +1739,7 @@ static void get_options (int argc, char **argv) { ...@@ -1735,7 +1739,7 @@ static void get_options (int argc, char **argv) {
{"no-L2-connect", no_argument, NULL, LONG_OPTION_NO_L2_CONNECT}, {"no-L2-connect", no_argument, NULL, LONG_OPTION_NO_L2_CONNECT},
{NULL, 0, NULL, 0}}; {NULL, 0, NULL, 0}};
while ((c = getopt_long (argc, argv, "C:dK:g:G:qO:SUVRMr:s:",long_options,NULL)) != -1) { while ((c = getopt_long (argc, argv, "C:dK:g:G:qO:m:SUVRMr:s:t:",long_options,NULL)) != -1) {
switch (c) { switch (c) {
case LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS: case LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS:
ULSCH_max_consecutive_errors = atoi(optarg); ULSCH_max_consecutive_errors = atoi(optarg);
...@@ -1805,6 +1809,13 @@ static void get_options (int argc, char **argv) { ...@@ -1805,6 +1809,13 @@ static void get_options (int argc, char **argv) {
case 'U': case 'U':
UE_flag = 1; UE_flag = 1;
break; break;
case 'm':
target_dl_mcs = atoi (optarg);
break;
case 't':
target_ul_mcs = atoi (optarg);
break;
case 'V': case 'V':
ouput_vcd = 1; ouput_vcd = 1;
...@@ -2240,9 +2251,9 @@ int main(int argc, char **argv) { ...@@ -2240,9 +2251,9 @@ int main(int argc, char **argv) {
NB_INST=1; NB_INST=1;
openair_daq_vars.ue_dl_rb_alloc=0x1fff; openair_daq_vars.ue_dl_rb_alloc=0x1fff;
openair_daq_vars.target_ue_dl_mcs=20; openair_daq_vars.target_ue_dl_mcs=target_dl_mcs;
openair_daq_vars.ue_ul_nb_rb=6; openair_daq_vars.ue_ul_nb_rb=6;
openair_daq_vars.target_ue_ul_mcs=6; openair_daq_vars.target_ue_ul_mcs=target_ul_mcs;
} }
......
...@@ -11,8 +11,8 @@ ...@@ -11,8 +11,8 @@
<TOPOLOGY_CONFIG> <TOPOLOGY_CONFIG>
<AREA> <AREA>
<X_m>500</X_m> <X_m>1000</X_m>
<Y_m>500</Y_m> <Y_m>1000</Y_m>
</AREA> </AREA>
<MOBILITY> <MOBILITY>
<UE_MOBILITY> <UE_MOBILITY>
...@@ -77,8 +77,8 @@ ...@@ -77,8 +77,8 @@
<OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd --> <OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd -->
</PERFORMANCE_METRICS> </PERFORMANCE_METRICS>
<LOG> <!-- set the global log level --> <LOG> <!-- set the global log level -->
<LEVEL>info</LEVEL> <LEVEL>debug</LEVEL>
<VERBOSITY>low</VERBOSITY> <VERBOSITY>medium</VERBOSITY>
<INTERVAL>1</INTERVAL> <INTERVAL>1</INTERVAL>
</LOG> </LOG>
<SEED_VALUE>0</SEED_VALUE> <!-- value 0 means randomly generated by OAI --> <SEED_VALUE>0</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
......
<OAI_EMULATION>
<ENVIRONMENT_SYSTEM_CONFIG>
<FADING>
<FREE_SPACE_MODEL_PARAMETERS>
<PATHLOSS_EXPONENT>2.0</PATHLOSS_EXPONENT>
</FREE_SPACE_MODEL_PARAMETERS>
<SMALL_SCALE>AWGN</SMALL_SCALE>
</FADING>
<SYSTEM_FREQUENCY_GHz>1.9</SYSTEM_FREQUENCY_GHz>
</ENVIRONMENT_SYSTEM_CONFIG>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>1000</X_m>
<Y_m>1000</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE> <!-- STATIC -->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!-- Basic configuration of a customized traffic : one state-->
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv4</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>1</DESTINATION_ID>
<FLOW_START_ms>1000</FLOW_START_ms> <!-- indicates the start time of the app or the actual duration of the traffic-->
<FLOW_DURATION_ms>10000</FLOW_DURATION_ms> <!-- indicates the start time of the app or the actual duration of the traffic-->
<BACKGROUND_TRAFFIC>disable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction-->
<IDT_DIST>fixed</IDT_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<IDT_MIN_ms>1</IDT_MIN_ms> <!--Minimum IDT values in milliseconds-->
<IDT_MAX_ms>1</IDT_MAX_ms> <!--Minimum IDT values in milliseconds-->
<SIZE_DIST>fixed</SIZE_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<SIZE_MIN_byte>1000</SIZE_MIN_byte> <!--Minimum PAYLOAD size values in bytes-->
<SIZE_MAX_byte>2000</SIZE_MAX_byte> <!--MAximum PAYLOAD size values in bytes-->
</CUSTOMIZED_TRAFFIC>
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>1</SOURCE_ID>
<TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv6</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->