Merge branch 'episys/mel/fixing_harq_ack_nack' into 'episys/master'
Sending ACK or NACK for uci_harq_ind fix See merge request aburger/openairinterface5g!23
This commit is contained in:
@@ -54,6 +54,12 @@
|
||||
#include "T.h"
|
||||
#include <common/utils/utils.h>
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#include <assert.h>
|
||||
#ifdef NDEBUG
|
||||
#warning assert is disabled
|
||||
#endif
|
||||
#define NUM_ELEMENTS(ARRAY) (sizeof(ARRAY) / sizeof(ARRAY[0]))
|
||||
#define CHECK_INDEX(ARRAY, INDEX) assert((INDEX) < NUM_ELEMENTS(ARRAY))
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
||||
@@ -98,7 +98,7 @@ void handle_sr(UL_IND_t *UL_info) {
|
||||
oai_nfapi_sr_indication(&UL_info->sr_ind);
|
||||
}
|
||||
} else if(NFAPI_MODE == NFAPI_MODE_VNF) {
|
||||
for(uint8_t j = 0; j < NUM_NFPAI_SUBFRAME; j++) {
|
||||
for(uint8_t j = 0; j < NUM_NFAPI_SUBFRAME; j++) {
|
||||
if(UL_RCC_INFO.sr_ind[j].sr_indication_body.number_of_srs > 0) {
|
||||
for (i=0; i<UL_RCC_INFO.sr_ind[j].sr_indication_body.number_of_srs; i++) {
|
||||
SR_indication(UL_info->module_id,
|
||||
@@ -139,7 +139,7 @@ void handle_cqi(UL_IND_t *UL_info) {
|
||||
UL_info->cqi_ind.cqi_indication_body.number_of_cqis=0;
|
||||
}
|
||||
} else if (NFAPI_MODE == NFAPI_MODE_VNF) {
|
||||
for(uint8_t j = 0; j < NUM_NFPAI_SUBFRAME; j++) {
|
||||
for(uint8_t j = 0; j < NUM_NFAPI_SUBFRAME; j++) {
|
||||
if(UL_RCC_INFO.cqi_ind[j].cqi_indication_body.number_of_cqis > 0) {
|
||||
for (i=0; i<UL_RCC_INFO.cqi_ind[j].cqi_indication_body.number_of_cqis; i++) {
|
||||
cqi_indication(UL_info->module_id,
|
||||
@@ -184,7 +184,7 @@ void handle_harq(UL_IND_t *UL_info) {
|
||||
|
||||
UL_info->harq_ind.harq_indication_body.number_of_harqs = 0;
|
||||
} else if(NFAPI_MODE == NFAPI_MODE_VNF) {
|
||||
for(uint8_t j = 0; j < NUM_NFPAI_SUBFRAME; j++) {
|
||||
for(uint8_t j = 0; j < NUM_NFAPI_SUBFRAME; j++) {
|
||||
if(UL_RCC_INFO.harq_ind[j].harq_indication_body.number_of_harqs > 0) {
|
||||
for (int i=0; i<UL_RCC_INFO.harq_ind[j].harq_indication_body.number_of_harqs; i++) {
|
||||
harq_indication(UL_info->module_id,
|
||||
@@ -227,7 +227,7 @@ void handle_ulsch(UL_IND_t *UL_info) {
|
||||
UL_info->rx_ind.rx_indication_body.number_of_pdus = 0;
|
||||
}
|
||||
} else if(NFAPI_MODE == NFAPI_MODE_VNF) {
|
||||
for(uint8_t k = 0; k < NUM_NFPAI_SUBFRAME; k++) {
|
||||
for(uint8_t k = 0; k < NUM_NFAPI_SUBFRAME; k++) {
|
||||
if((UL_RCC_INFO.rx_ind[k].rx_indication_body.number_of_pdus>0) && (UL_RCC_INFO.crc_ind[k].crc_indication_body.number_of_crcs>0)) {
|
||||
for (i=0; i<UL_RCC_INFO.rx_ind[k].rx_indication_body.number_of_pdus; i++) {
|
||||
for (j=0; j<UL_RCC_INFO.crc_ind[k].crc_indication_body.number_of_crcs; j++) {
|
||||
|
||||
@@ -88,25 +88,25 @@ typedef struct {
|
||||
} UL_IND_t;
|
||||
|
||||
// Downlink subframe P7
|
||||
#define NUM_NFPAI_SUBFRAME 10
|
||||
#define NUM_NFAPI_SUBFRAME 10
|
||||
typedef struct {
|
||||
/// harq indication list
|
||||
nfapi_harq_indication_t harq_ind[NUM_NFPAI_SUBFRAME];
|
||||
nfapi_harq_indication_t harq_ind[NUM_NFAPI_SUBFRAME];
|
||||
|
||||
/// crc indication list
|
||||
nfapi_crc_indication_t crc_ind[NUM_NFPAI_SUBFRAME];
|
||||
nfapi_crc_indication_t crc_ind[NUM_NFAPI_SUBFRAME];
|
||||
|
||||
/// SR indication list
|
||||
nfapi_sr_indication_t sr_ind[NUM_NFPAI_SUBFRAME];
|
||||
nfapi_sr_indication_t sr_ind[NUM_NFAPI_SUBFRAME];
|
||||
|
||||
/// CQI indication list
|
||||
nfapi_cqi_indication_t cqi_ind[NUM_NFPAI_SUBFRAME];
|
||||
nfapi_cqi_indication_t cqi_ind[NUM_NFAPI_SUBFRAME];
|
||||
|
||||
/// RACH indication list
|
||||
nfapi_rach_indication_t rach_ind[NUM_NFPAI_SUBFRAME];
|
||||
nfapi_rach_indication_t rach_ind[NUM_NFAPI_SUBFRAME];
|
||||
|
||||
/// RX indication
|
||||
nfapi_rx_indication_t rx_ind[NUM_NFPAI_SUBFRAME];
|
||||
nfapi_rx_indication_t rx_ind[NUM_NFAPI_SUBFRAME];
|
||||
|
||||
} UL_RCC_IND_t;
|
||||
|
||||
|
||||
@@ -50,12 +50,12 @@ queue_t hi_dci0_req_queue;
|
||||
int current_sfn_sf;
|
||||
sem_t sfn_semaphore;
|
||||
|
||||
static sf_rnti_mcs_s sf_rnti_mcs[10];
|
||||
static sf_rnti_mcs_s sf_rnti_mcs[NUM_NFAPI_SUBFRAME];
|
||||
|
||||
static int ue_tx_sock_descriptor = -1;
|
||||
static int ue_rx_sock_descriptor = -1;
|
||||
|
||||
extern nfapi_tx_request_pdu_t* tx_request_pdu[1023][10][10];
|
||||
extern nfapi_tx_request_pdu_t* tx_request_pdu[1023][NUM_NFAPI_SUBFRAME][10]; //TODO: NFAPI_TX_MAX_PDU for last dim? Check nfapi_pnf.c ln. 81
|
||||
//extern int timer_subframe;
|
||||
//extern int timer_frame;
|
||||
|
||||
@@ -403,8 +403,7 @@ void fill_uci_harq_indication_UE_MAC(int Mod_id,
|
||||
// 2.) if receiving ul_config_req for uci ack/nack or ulsch ack/nak in subframe n
|
||||
// go look to see if dl_config_req (with c-rnti) was received in subframe (n - 4)
|
||||
// 3.) if the answer to #2 is yes then send ACK IF NOT send DTX
|
||||
|
||||
if (drop_tb((subframe+6) % 10, rnti)) // TODO: Handle DTX. Also discuss handling PDCCH
|
||||
if (check_drop_tb(((subframe+6) % 10), rnti)) // TODO: Handle DTX. Also discuss handling PDCCH
|
||||
{
|
||||
pdu->harq_indication_fdd_rel13.harq_tb_n[0] = 2;
|
||||
LOG_I(PHY, "Setting HARQ No ACK - Channel Model\n");
|
||||
@@ -799,7 +798,6 @@ void dl_config_req_UE_MAC_dci(int sfn,
|
||||
sfn, sf, dci->pdu_size,
|
||||
dlsch->dlsch_pdu.dlsch_pdu_rel8.pdu_index,
|
||||
tx_req_pdu_list->num_pdus);
|
||||
|
||||
if (!drop_tb(sf, dci->dci_dl_pdu.dci_dl_pdu_rel8.rnti))
|
||||
{
|
||||
ue_send_sdu(ue_id, 0, sfn, sf,
|
||||
@@ -819,7 +817,6 @@ void dl_config_req_UE_MAC_dci(int sfn,
|
||||
for (int ue_id = 0; ue_id < num_ue; ue_id++) {
|
||||
if (UE_mac_inst[ue_id].UE_mode[0] == NOT_SYNCHED)
|
||||
continue;
|
||||
|
||||
if (!drop_tb(sf, dci->dci_dl_pdu.dci_dl_pdu_rel8.rnti))
|
||||
{
|
||||
ue_decode_si(ue_id, 0, sfn, 0,
|
||||
@@ -836,7 +833,6 @@ void dl_config_req_UE_MAC_dci(int sfn,
|
||||
LOG_I(MAC, "%s() Received paging message: sfn/sf:%d.%d\n",
|
||||
__func__, sfn, sf);
|
||||
|
||||
|
||||
if (!drop_tb(sf, dci->dci_dl_pdu.dci_dl_pdu_rel8.rnti))
|
||||
{
|
||||
ue_decode_p(ue_id, 0, sfn, 0,
|
||||
@@ -867,7 +863,6 @@ void dl_config_req_UE_MAC_dci(int sfn,
|
||||
"%s(): Received RAR, PreambleIndex: %d\n",
|
||||
__func__, UE_mac_inst[ue_id].RA_prach_resources.ra_PreambleIndex);
|
||||
|
||||
|
||||
if (!drop_tb(sf, dci->dci_dl_pdu.dci_dl_pdu_rel8.rnti))
|
||||
{
|
||||
ue_process_rar(ue_id, 0, sfn,
|
||||
@@ -1368,6 +1363,7 @@ void *ue_standalone_pnf_task(void *context)
|
||||
dl_config_req.sfn_sf & 15);
|
||||
|
||||
dl_config_req_valid = true;
|
||||
read_channel_param(&dl_config_req, (dl_config_req.sfn_sf & 15));
|
||||
if (tx_req_valid)
|
||||
{
|
||||
if (dl_config_req.sfn_sf != tx_req.sfn_sf)
|
||||
@@ -1378,7 +1374,6 @@ void *ue_standalone_pnf_task(void *context)
|
||||
tx_req_valid = false;
|
||||
break;
|
||||
}
|
||||
read_channel_param(&dl_config_req, (dl_config_req.sfn_sf & 15));
|
||||
enqueue_dl_config_req_tx_req(&dl_config_req, &tx_req);
|
||||
dl_config_req_valid = false;
|
||||
tx_req_valid = false;
|
||||
@@ -1936,6 +1931,7 @@ char *nfapi_ul_config_req_to_string(nfapi_ul_config_request_t *req)
|
||||
}
|
||||
|
||||
// Store all rnti and mcs for all pdus
|
||||
LOG_I(MAC, "Adding MCS and RNTI for sf_rnti_mcs[%d]\n", sf);
|
||||
sf_rnti_mcs[sf].pdu_size = dl_config->dl_config_request_body.number_pdu;
|
||||
for (int n = 0; n < sf_rnti_mcs[sf].pdu_size; n++)
|
||||
{
|
||||
@@ -1944,32 +1940,63 @@ char *nfapi_ul_config_req_to_string(nfapi_ul_config_request_t *req)
|
||||
}
|
||||
}
|
||||
|
||||
int drop_tb(int sf, uint16_t rnti)
|
||||
bool check_drop_tb(int sf, uint16_t rnti)
|
||||
{
|
||||
int sinr_index = 0;
|
||||
bool lin_interp = false;
|
||||
bool skip_search = false;
|
||||
int pdu_size = sf_rnti_mcs[sf].pdu_size;
|
||||
if (pdu_size <= 0)
|
||||
{
|
||||
LOG_E(MAC, "%s: sf_rnti_mcs[%d].pdu_size = 0\n", __FUNCTION__, sf);
|
||||
abort();
|
||||
}
|
||||
|
||||
CHECK_INDEX(sf_rnti_mcs[sf].rnti, pdu_size);
|
||||
CHECK_INDEX(sf_rnti_mcs[sf].drop_flag, pdu_size);
|
||||
for (int n = 0; n < pdu_size; n++)
|
||||
{
|
||||
if (sf_rnti_mcs[sf].rnti[n] == rnti)
|
||||
{
|
||||
return sf_rnti_mcs[sf].drop_flag[n];
|
||||
}
|
||||
}
|
||||
LOG_I(MAC, "No matching rnti in sf_rnti_mcs.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
bool drop_tb(int sf, uint16_t rnti)
|
||||
{
|
||||
int pdu_size = sf_rnti_mcs[sf].pdu_size;
|
||||
assert(sf < 10 && sf >= 0);
|
||||
|
||||
if (pdu_size <= 0)
|
||||
{
|
||||
LOG_E(MAC, "%s: sf_rnti_mcs[%d].pdu_size = 0\n", __FUNCTION__, sf);
|
||||
}
|
||||
|
||||
uint8_t mcs = 99;
|
||||
for (int n = 0; n < sf_rnti_mcs[sf].pdu_size; n++)
|
||||
int n = 0;
|
||||
CHECK_INDEX(sf_rnti_mcs[sf].rnti, pdu_size);
|
||||
CHECK_INDEX(sf_rnti_mcs[sf].mcs, pdu_size);
|
||||
CHECK_INDEX(sf_rnti_mcs[sf].drop_flag, pdu_size);
|
||||
for (n = 0; n < pdu_size; n++)
|
||||
{
|
||||
if (sf_rnti_mcs[sf].rnti[n] == rnti)
|
||||
{
|
||||
mcs = sf_rnti_mcs[sf].mcs[n];
|
||||
sf_rnti_mcs[sf].drop_flag[n] = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (mcs == 99)
|
||||
{
|
||||
LOG_E(MAC, "NO MCS Found\n");
|
||||
LOG_E(MAC, "NO MCS Found. %d = sf_rnti_mcs[%d].mcs[%d] \n", mcs, sf, n);
|
||||
abort();
|
||||
}
|
||||
|
||||
// Loop through bler table to find sinr_index - What if EMANE SINR doesn't match any of the table SINR values??
|
||||
//float epsilon = 0.0001;
|
||||
// Loop through bler table to find sinr_index
|
||||
int sinr_index = 0;
|
||||
bool lin_interp = false;
|
||||
bool skip_search = false;
|
||||
int temp_bler = 0;
|
||||
int temp_sinr = ((int)(sf_rnti_mcs[sf].sinr * 10));
|
||||
int i;
|
||||
@@ -2003,9 +2030,9 @@ char *nfapi_ul_config_req_to_string(nfapi_ul_config_request_t *req)
|
||||
{
|
||||
sinr_index = i;
|
||||
lin_interp = true;
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
if (i >= (bler_data[mcs].length - 1))
|
||||
{
|
||||
@@ -2025,13 +2052,12 @@ char *nfapi_ul_config_req_to_string(nfapi_ul_config_request_t *req)
|
||||
|
||||
double drop_cutoff = ((double) rand() / (RAND_MAX));
|
||||
assert(drop_cutoff < 1);
|
||||
bler_val = 0.4;
|
||||
|
||||
if (bler_val <= drop_cutoff)
|
||||
if (bler_val >= drop_cutoff)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
sf_rnti_mcs[sf].drop_flag[n] = true;
|
||||
LOG_D(MAC, "We are dropping this packet. Bler_val = %f, MCS = %"PRIu8", sf = %d\n", bler_val, sf_rnti_mcs[sf].mcs[n], sf);
|
||||
}
|
||||
return sf_rnti_mcs[sf].drop_flag[n];
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@ typedef struct
|
||||
uint8_t mcs[256];
|
||||
float sinr;
|
||||
uint16_t pdu_size;
|
||||
bool drop_flag[256];
|
||||
|
||||
} sf_rnti_mcs_s;
|
||||
|
||||
@@ -200,7 +201,8 @@ const char *dl_pdu_type_to_string(uint8_t pdu_type);
|
||||
const char *ul_pdu_type_to_string(uint8_t pdu_type);
|
||||
|
||||
void read_channel_param(nfapi_dl_config_request_t * dl_config, int sf);
|
||||
int drop_tb(int sf, uint16_t rnti);
|
||||
bool drop_tb(int sf, uint16_t rnti);
|
||||
bool check_drop_tb(int sf, uint16_t rnti);
|
||||
|
||||
extern queue_t dl_config_req_tx_req_queue;
|
||||
extern queue_t ul_config_req_queue;
|
||||
|
||||
@@ -756,6 +756,7 @@ int main ( int argc, char **argv )
|
||||
LOG_I(ENB_APP,"oai_exit=%d\n",oai_exit);
|
||||
// stop threads
|
||||
|
||||
#if 0 //Disable clean up because this tends to crash (and unnecessary)
|
||||
if (RC.nb_inst == 0 || !NODE_IS_CU(node_type)) {
|
||||
if(IS_SOFTMODEM_DOFORMS)
|
||||
end_forms();
|
||||
@@ -797,6 +798,7 @@ int main ( int argc, char **argv )
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
terminate_opt();
|
||||
logClean();
|
||||
|
||||
Reference in New Issue
Block a user