mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-20 16:10:29 +00:00
Works up to message 3 reception at VNF
This commit is contained in:
@@ -37,8 +37,15 @@ extern int nfapi_sync_var;
|
||||
extern int sync_var;
|
||||
|
||||
extern void init_eNB_afterRU(void);
|
||||
extern void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu);
|
||||
extern void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu);
|
||||
extern void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, nfapi_ul_config_request_pdu_t *ul_config_pdu, uint16_t frame,uint8_t subframe,uint8_t srs_present);
|
||||
extern void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu, uint8_t codeword_index, uint8_t *sdu);
|
||||
extern void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
|
||||
extern void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
|
||||
|
||||
extern uint8_t nfapi_pnf;
|
||||
|
||||
nfapi_tx_request_pdu_t* tx_request_pdu[1023][10][10]; // [frame][subframe][max_num_pdus]
|
||||
|
||||
|
||||
uint16_t phy_antenna_capability_values[] = { 1, 2, 4, 8, 16 };
|
||||
@@ -226,6 +233,9 @@ typedef struct
|
||||
nfapi_pnf_p7_config_t* p7_config;
|
||||
}pnf_phy_user_data_t;
|
||||
|
||||
static pnf_info pnf;
|
||||
static pthread_t pnf_start_pthread;
|
||||
|
||||
|
||||
extern void nfapi_log(char *file, char *func, int line, int comp, int level, const char* format, va_list args);
|
||||
|
||||
@@ -688,12 +698,13 @@ int config_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfap
|
||||
if(req->nfapi_config.timing_window.tl.tag == NFAPI_NFAPI_TIMING_WINDOW_TAG)
|
||||
{
|
||||
phy_info->timing_window = req->nfapi_config.timing_window.value;
|
||||
printf("Phy_info:Timing window:%u NFAPI_CONFIG:timing_window:%u\n", phy_info->timing_window, req->nfapi_config.timing_window.value);
|
||||
num_tlv++;
|
||||
}
|
||||
|
||||
if(req->nfapi_config.timing_info_mode.tl.tag == NFAPI_NFAPI_TIMING_INFO_MODE_TAG)
|
||||
{
|
||||
printf("timing info mode provided\n");
|
||||
printf("timing info mode:%d\n", req->nfapi_config.timing_info_mode.value);
|
||||
phy_info->timing_info_mode = req->nfapi_config.timing_info_mode.value;
|
||||
num_tlv++;
|
||||
}
|
||||
@@ -705,7 +716,7 @@ int config_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfap
|
||||
|
||||
if(req->nfapi_config.timing_info_period.tl.tag == NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG)
|
||||
{
|
||||
printf("timing info period provided\n");
|
||||
printf("timing info period provided value:%d\n", req->nfapi_config.timing_info_period.value);
|
||||
phy_info->timing_info_period = req->nfapi_config.timing_info_period.value;
|
||||
num_tlv++;
|
||||
}
|
||||
@@ -910,107 +921,50 @@ void pnf_phy_deallocate_p7_vendor_ext(nfapi_p7_message_header_t* header)
|
||||
free(header);
|
||||
}
|
||||
|
||||
int pnf_phy_ul_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_ul_config_request_t* req)
|
||||
{
|
||||
//printf("[PNF] ul config request\n");
|
||||
//phy_info* phy = (phy_info*)(pnf_p7->user_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pnf_phy_hi_dci0_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_hi_dci0_request_t* req)
|
||||
{
|
||||
//printf("[PNF] hi dci0 request\n");
|
||||
//phy_info* phy = (phy_info*)(pnf_p7->user_data);
|
||||
|
||||
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
||||
eNB_rxtx_proc_t *proc = &eNB->proc.proc_rxtx[0];
|
||||
|
||||
LOG_D(PHY,"[PNF] HI_DCI0_REQ sfn_sf:%d sfnsf:%u DCIs:%d HIs:%d\n",
|
||||
NFAPI_SFNSF2DEC(req->sfn_sf),
|
||||
req->hi_dci0_request_body.sfnsf,
|
||||
req->hi_dci0_request_body.number_of_dci,
|
||||
req->hi_dci0_request_body.number_of_hi
|
||||
);
|
||||
|
||||
for (int i=0; i<req->hi_dci0_request_body.number_of_dci + req->hi_dci0_request_body.number_of_hi; i++)
|
||||
{
|
||||
LOG_D(PHY,"[PNF] HI_DCI0_REQ sfn_sf:%d PDU[%d]\n", NFAPI_SFNSF2DEC(req->sfn_sf), i);
|
||||
|
||||
if (req->hi_dci0_request_body.hi_dci0_pdu_list[i].pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE)
|
||||
{
|
||||
LOG_D(PHY,"[PNF] HI_DCI0_REQ sfn_sf:%d PDU[%d] - NFAPI_HI_DCI0_DCI_PDU_TYPE\n", NFAPI_SFNSF2DEC(req->sfn_sf), i);
|
||||
|
||||
nfapi_hi_dci0_request_pdu_t *hi_dci0_req_pdu = &req->hi_dci0_request_body.hi_dci0_pdu_list[i];
|
||||
|
||||
handle_nfapi_hi_dci0_dci_pdu(eNB,proc,hi_dci0_req_pdu);
|
||||
|
||||
eNB->pdcch_vars[NFAPI_SFNSF2SF(req->sfn_sf)&1].num_dci++;
|
||||
}
|
||||
else if (req->hi_dci0_request_body.hi_dci0_pdu_list[i].pdu_type == NFAPI_HI_DCI0_HI_PDU_TYPE)
|
||||
{
|
||||
LOG_D(PHY,"[PNF] HI_DCI0_REQ sfn_sf:%d PDU[%d] - NFAPI_HI_DCI0_HI_PDU_TYPE\n", NFAPI_SFNSF2DEC(req->sfn_sf), i);
|
||||
|
||||
nfapi_hi_dci0_request_pdu_t *hi_dci0_req_pdu = &req->hi_dci0_request_body.hi_dci0_pdu_list[i];
|
||||
|
||||
handle_nfapi_hi_dci0_hi_pdu(eNB, proc, hi_dci0_req_pdu);
|
||||
|
||||
eNB->pdcch_vars[NFAPI_SFNSF2SF(req->sfn_sf)&1].num_dci++;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
nfapi_tx_request_pdu_t* tx_request_pdu[1023][10][10]; // [frame][subframe][max_num_pdus]
|
||||
|
||||
void common_signal_procedures (PHY_VARS_eNB *eNB,int frame, int subframe);
|
||||
void pdsch_procedures(PHY_VARS_eNB *eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
int harq_pid,
|
||||
LTE_eNB_DLSCH_t *dlsch,
|
||||
LTE_eNB_DLSCH_t *dlsch1,
|
||||
LTE_eNB_UE_stats *ue_stats,
|
||||
int ra_flag);
|
||||
void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
||||
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
||||
uint8_t codeword_index,
|
||||
uint8_t *sdu);
|
||||
|
||||
void nfapi_procedures(PHY_VARS_eNB *eNB, int sfn, int sf)
|
||||
{
|
||||
//LTE_DL_FRAME_PARMS *ruFp = &RC.ru[0]->frame_parms;
|
||||
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
||||
LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[sf&1];
|
||||
|
||||
common_signal_procedures(eNB, sfn, sf);
|
||||
|
||||
if (pdcch_vars->num_dci > 0)
|
||||
{
|
||||
LOG_D(PHY,"SFN/SF:%d/%d pdcch_vars[num_dci:%d num_pdcch_symbols:%d dci_alloc:dci_length:%d]\n", sfn, sf, pdcch_vars->num_dci, pdcch_vars->num_pdcch_symbols, pdcch_vars->dci_alloc[0].dci_length);
|
||||
}
|
||||
|
||||
{
|
||||
static int first_time=1;
|
||||
if (pdcch_vars->num_pdcch_symbols==0)
|
||||
{
|
||||
pdcch_vars->num_pdcch_symbols=1;
|
||||
if (first_time)
|
||||
{
|
||||
LOG_E(PHY,"%s() DJP - Forcing num_pdcch_symbols=1 was 0\n", __FUNCTION__);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
generate_dci_top(
|
||||
pdcch_vars->num_pdcch_symbols,
|
||||
pdcch_vars->num_dci,
|
||||
pdcch_vars->dci_alloc,
|
||||
0,
|
||||
AMP,
|
||||
fp,
|
||||
eNB->common_vars.txdataF,
|
||||
sf);
|
||||
|
||||
// Now scan UE specific DLSCH
|
||||
for (int UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++)
|
||||
{
|
||||
LTE_eNB_DLSCH_t *dlsch0 = eNB->dlsch[(uint8_t)UE_id][0];
|
||||
LTE_eNB_DLSCH_t *dlsch1 = eNB->dlsch[(uint8_t)UE_id][1];
|
||||
|
||||
if ((dlsch0)&&
|
||||
(dlsch0->rnti>0) &&
|
||||
(dlsch0->active == 1)) {
|
||||
|
||||
// get harq_pid
|
||||
uint8_t harq_pid = dlsch0->harq_ids[sf];
|
||||
AssertFatal(harq_pid>=0,"harq_pid is negative\n");
|
||||
// generate pdsch
|
||||
LOG_D(PHY,"PDSCH active %d/%d\n", sfn,sf);
|
||||
pdsch_procedures(eNB,
|
||||
&eNB->proc.proc_rxtx[0],
|
||||
harq_pid,
|
||||
dlsch0,
|
||||
dlsch1,
|
||||
&eNB->UE_stats[(uint32_t)UE_id],
|
||||
0);
|
||||
}
|
||||
|
||||
else if ((dlsch0)&&
|
||||
(dlsch0->rnti>0)&&
|
||||
(dlsch0->active == 0)) {
|
||||
|
||||
// clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later)
|
||||
dlsch0->subframe_tx[sf]=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int pnf_phy_dl_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_dl_config_request_t* req)
|
||||
{
|
||||
#if 1
|
||||
@@ -1057,29 +1011,10 @@ if (0)//NFAPI_SFNSF2SF(req->sfn_sf)==5)
|
||||
nfapi_dl_config_request_pdu_t* dl_config_pdu_list = req->dl_config_request_body.dl_config_pdu_list;
|
||||
LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[sf&1];
|
||||
|
||||
LTE_DL_FRAME_PARMS *fp = &RC.ru[0]->frame_parms;
|
||||
int ONE_SUBFRAME_OF_SAMPLES = fp->ofdm_symbol_size*fp->symbols_per_tti;
|
||||
int offset = sf * ONE_SUBFRAME_OF_SAMPLES;
|
||||
|
||||
pdcch_vars->num_pdcch_symbols = req->dl_config_request_body.number_pdcch_ofdm_symbols;
|
||||
pdcch_vars->num_dci = 0;
|
||||
|
||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sfn_sf:%d DCI:%d PDU:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), req->dl_config_request_body.number_dci, req->dl_config_request_body.number_pdu);
|
||||
|
||||
// clear the transmit data array for the current subframe
|
||||
for (int aa=0; aa<fp->nb_antenna_ports_eNB; aa++) {
|
||||
memset(&eNB->common_vars.txdataF[aa][offset], 0, ONE_SUBFRAME_OF_SAMPLES * sizeof(int32_t));
|
||||
}
|
||||
|
||||
// clear previous allocation information for all UEs
|
||||
for (int i=0; i<NUMBER_OF_UE_MAX; i++) {
|
||||
if (eNB->dlsch[i][0])
|
||||
eNB->dlsch[i][0]->subframe_tx[sf] = 0;
|
||||
}
|
||||
|
||||
// DJP - force proc to look like current frame!
|
||||
proc->frame_tx = NFAPI_SFNSF2SFN(req->sfn_sf);
|
||||
proc->subframe_tx = NFAPI_SFNSF2SF(req->sfn_sf);
|
||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX:%d/%d RX:%d/%d sfn_sf:%d DCI:%d PDU:%d\n", __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->frame_rx, proc->subframe_rx, NFAPI_SFNSF2DEC(req->sfn_sf), req->dl_config_request_body.number_dci, req->dl_config_request_body.number_pdu);
|
||||
|
||||
for (int i=0;i<req->dl_config_request_body.number_pdu;i++)
|
||||
{
|
||||
@@ -1087,28 +1022,27 @@ if (0)//NFAPI_SFNSF2SF(req->sfn_sf)==5)
|
||||
|
||||
if (dl_config_pdu_list[i].pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE)
|
||||
{
|
||||
//nfapi_dl_config_dci_dl_pdu *dci_pdu = &dl_config_pdu_list[i].dci_dl_pdu;
|
||||
//nfapi_dl_config_dci_dl_pdu_rel8_t *rel8_pdu = &dci_pdu->dci_dl_pdu_rel8;
|
||||
|
||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DCI:transmission_power:%u\n", __FUNCTION__, rel8_pdu->transmission_power);
|
||||
|
||||
handle_nfapi_dci_dl_pdu(eNB,proc,&dl_config_pdu_list[i]);
|
||||
|
||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() dci_alloc[%d].dci_length:%d\n", __FUNCTION__, pdcch_vars->num_dci, pdcch_vars->dci_alloc[pdcch_vars->num_dci].dci_length);
|
||||
|
||||
pdcch_vars->num_dci++; // Is actually number of DCI PDUs
|
||||
|
||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() pdcch_vars->num_dci:%d\n", __FUNCTION__, pdcch_vars->num_dci);
|
||||
}
|
||||
else if (dl_config_pdu_list[i].pdu_type == NFAPI_DL_CONFIG_BCH_PDU_TYPE)
|
||||
{
|
||||
nfapi_dl_config_bch_pdu *bch_pdu = &dl_config_pdu_list[i].bch_pdu;
|
||||
uint16_t pdu_index = bch_pdu->bch_pdu_rel8.pdu_index;
|
||||
uint8_t *sdu = tx_request_pdu[sfn][sf][pdu_index]->segments[0].segment_data;
|
||||
|
||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH: pdu_index:%u\n", __FUNCTION__, bch_pdu->bch_pdu_rel8.pdu_index);
|
||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH: pdu_index:%u pdu_length:%d sdu_length:%d BCH_SDU:%x,%x,%x\n", __FUNCTION__, pdu_index, bch_pdu->bch_pdu_rel8.length, tx_request_pdu[sfn][sf][pdu_index]->segments[0].segment_length, sdu[0], sdu[1], sdu[2]);
|
||||
|
||||
uint8_t *bch_sdu = tx_request_pdu[sfn][sf][bch_pdu->bch_pdu_rel8.pdu_index]->segments[0].segment_data;
|
||||
|
||||
eNB->pbch_pdu[2] = bch_sdu[0];
|
||||
eNB->pbch_pdu[1] = bch_sdu[1];
|
||||
eNB->pbch_pdu[0] = bch_sdu[2];
|
||||
#if 0
|
||||
handle_nfapi_bch_pdu(eNB, proc, dl_config_pdu_list[i], sdu);
|
||||
#else
|
||||
eNB->pbch_pdu[0] = sdu[2];
|
||||
eNB->pbch_pdu[1] = sdu[1];
|
||||
eNB->pbch_pdu[2] = sdu[0];
|
||||
#endif
|
||||
|
||||
eNB->pbch_configured=1;
|
||||
|
||||
@@ -1118,25 +1052,38 @@ if (0)//NFAPI_SFNSF2SF(req->sfn_sf)==5)
|
||||
bch_pdu->bch_pdu_rel8.length,
|
||||
bch_pdu->bch_pdu_rel8.pdu_index,
|
||||
tx_request_pdu[sfn][sf][bch_pdu->bch_pdu_rel8.pdu_index]->segments[0].segment_length,
|
||||
eNB->pbch_pdu[0],
|
||||
eNB->pbch_pdu[1],
|
||||
eNB->pbch_pdu[2]);
|
||||
sdu[0],
|
||||
sdu[1],
|
||||
sdu[2]);
|
||||
}
|
||||
else if (dl_config_pdu_list[i].pdu_type == NFAPI_DL_CONFIG_DLSCH_PDU_TYPE)
|
||||
{
|
||||
nfapi_dl_config_dlsch_pdu *dlsch_pdu = &dl_config_pdu_list[i].dlsch_pdu;
|
||||
nfapi_dl_config_dlsch_pdu_rel8_t *rel8_pdu = &dlsch_pdu->dlsch_pdu_rel8;
|
||||
uint8_t *dlsch_sdu = tx_request_pdu[sfn][sf][rel8_pdu->pdu_index]->segments[0].segment_data;
|
||||
uint8_t *dlsch_sdu = malloc(tx_request_pdu[sfn][sf][rel8_pdu->pdu_index]->segments[0].segment_length);
|
||||
|
||||
#if 0
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DLSCH:pdu_index:%d handle_nfapi_dlsch_pdu(eNB, proc_rxtx, dlsch_pdu, transport_blocks:%d sdu:%p) eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols:%d\n",
|
||||
__FUNCTION__,
|
||||
rel8_pdu->pdu_index,
|
||||
rel8_pdu->transport_blocks,
|
||||
dlsch_sdu,
|
||||
eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols
|
||||
);
|
||||
#endif
|
||||
// **********************************************************************
|
||||
// THIS IS CREATING AN INTENTIONAL LEAK - I think...
|
||||
//
|
||||
// nFAPI won't be managing dlsch_sdu
|
||||
//
|
||||
// not sure about the stack, but it does seem to allow it to stay up!!!
|
||||
//
|
||||
// I THINK I NEED TO FIX THIS - unless it IS getting freed by the stack
|
||||
//
|
||||
// **********************************************************************
|
||||
memcpy(dlsch_sdu, tx_request_pdu[sfn][sf][rel8_pdu->pdu_index]->segments[0].segment_data, tx_request_pdu[sfn][sf][rel8_pdu->pdu_index]->segments[0].segment_length);
|
||||
|
||||
if (0)
|
||||
{
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DLSCH:pdu_index:%d handle_nfapi_dlsch_pdu(eNB, proc_rxtx, dlsch_pdu, transport_blocks:%d sdu:%p) eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols:%d\n",
|
||||
__FUNCTION__,
|
||||
rel8_pdu->pdu_index,
|
||||
rel8_pdu->transport_blocks,
|
||||
dlsch_sdu,
|
||||
eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols
|
||||
);
|
||||
}
|
||||
|
||||
handle_nfapi_dlsch_pdu(
|
||||
eNB,
|
||||
@@ -1151,8 +1098,6 @@ if (0)//NFAPI_SFNSF2SF(req->sfn_sf)==5)
|
||||
}
|
||||
}
|
||||
|
||||
nfapi_procedures(eNB, sfn, sf);
|
||||
|
||||
if(req->vendor_extension)
|
||||
free(req->vendor_extension);
|
||||
|
||||
@@ -1186,6 +1131,77 @@ int pnf_phy_tx_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_tx_request_t* req)
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern void subtract_subframe(int *frameP, int *subframeP, int offset);
|
||||
|
||||
int pnf_phy_ul_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_ul_config_request_t* req)
|
||||
{
|
||||
LOG_D(PHY,"[PNF] UL_CONFIG_REQ %s() sfn_sf:%d pdu:%d rach_prach_frequency_resources:%d srs_present:%u\n",
|
||||
__FUNCTION__,
|
||||
NFAPI_SFNSF2DEC(req->sfn_sf),
|
||||
req->ul_config_request_body.number_of_pdus,
|
||||
req->ul_config_request_body.rach_prach_frequency_resources,
|
||||
req->ul_config_request_body.srs_present
|
||||
);
|
||||
|
||||
if (RC.ru == 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (RC.eNB == 0)
|
||||
{
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (RC.eNB[0][0] == 0)
|
||||
{
|
||||
return -3;
|
||||
}
|
||||
|
||||
if (sync_var != 0)
|
||||
{
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Main system not up - is this a dummy subframe?\n", __FUNCTION__);
|
||||
return -4;
|
||||
}
|
||||
|
||||
int sfn = NFAPI_SFNSF2SFN(req->sfn_sf);
|
||||
int sf = NFAPI_SFNSF2SF(req->sfn_sf);
|
||||
|
||||
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
||||
eNB_rxtx_proc_t *proc = &eNB->proc.proc_rxtx[0];
|
||||
nfapi_ul_config_request_pdu_t* ul_config_pdu_list = req->ul_config_request_body.ul_config_pdu_list;
|
||||
|
||||
// subframe works off TX SFN/SF which is 4 ahead, need to put it back to RX SFN/SF
|
||||
// probably could just use proc->frame_rx
|
||||
subtract_subframe(&sfn, &sf, 4);
|
||||
|
||||
for (int i=0;i<req->ul_config_request_body.number_of_pdus;i++)
|
||||
{
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sfn/sf:%d PDU[%d] size:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), i, ul_config_pdu_list[i].pdu_size);
|
||||
|
||||
if (
|
||||
ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE ||
|
||||
ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE ||
|
||||
ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE ||
|
||||
ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE ||
|
||||
ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE ||
|
||||
ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE ||
|
||||
ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE
|
||||
)
|
||||
{
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() handle_nfapi_ul_pdu() for PDU:%d\n", __FUNCTION__, i);
|
||||
|
||||
handle_nfapi_ul_pdu(eNB,proc,&ul_config_pdu_list[i],sfn,sf,req->ul_config_request_body.srs_present);
|
||||
}
|
||||
else
|
||||
{
|
||||
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() PDU:%i UNKNOWN type :%d\n", __FUNCTION__, i, ul_config_pdu_list[i].pdu_type);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pnf_phy_lbt_dl_config_req(nfapi_pnf_p7_config_t* config, nfapi_lbt_dl_config_request_t* req)
|
||||
{
|
||||
//printf("[PNF] lbt dl config request\n");
|
||||
@@ -1295,6 +1311,8 @@ int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi
|
||||
{
|
||||
printf("[PNF] Received NFAPI_START_REQ phy_id:%d\n", req->header.phy_id);
|
||||
|
||||
nfapi_set_trace_level(NFAPI_TRACE_INFO);
|
||||
|
||||
pnf_info* pnf = (pnf_info*)(config->user_data);
|
||||
|
||||
#if 0
|
||||
@@ -1332,6 +1350,7 @@ int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi
|
||||
phy->user_data = p7_config;
|
||||
|
||||
p7_config->subframe_buffer_size = phy_info->timing_window;
|
||||
printf("subframe_buffer_size configured using phy_info->timing_window:%d\n", phy_info->timing_window);
|
||||
if(phy_info->timing_info_mode & 0x1)
|
||||
{
|
||||
p7_config->timing_info_mode_periodic = 1;
|
||||
@@ -1719,8 +1738,6 @@ int pnf_sim_unpack_p4_p5_vendor_extension(nfapi_p4_p5_message_header_t* header,
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
static pnf_info pnf;
|
||||
static pthread_t pnf_start_pthread;
|
||||
|
||||
void* pnf_start_thread(void* ptr)
|
||||
{
|
||||
@@ -1735,7 +1752,6 @@ void* pnf_start_thread(void* ptr)
|
||||
|
||||
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port)
|
||||
{
|
||||
extern uint8_t nfapi_pnf;
|
||||
nfapi_pnf = 1; // PNF!
|
||||
|
||||
nfapi_pnf_config_t* config = nfapi_pnf_config_create();
|
||||
@@ -1793,32 +1809,40 @@ void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr,
|
||||
pthread_create(&pnf_start_pthread, NULL, &pnf_start_thread, config);
|
||||
}
|
||||
|
||||
void oai_subframe_ind(uint16_t frame, uint16_t subframe)
|
||||
void oai_subframe_ind(eNB_rxtx_proc_t *proc)
|
||||
{
|
||||
//LOG_D(PHY,"%s(frame:%d, subframe:%d)\n", __FUNCTION__, frame, subframe);
|
||||
//LOG_D(PHY,"%s(frame:%d, subframe:%d)\n", __FUNCTION__, proc->frame_tx, proc->subframe_tx);
|
||||
|
||||
//TODO FIXME - HACK - DJP - using a global to bodge it in
|
||||
|
||||
if (p7_config_g != NULL && sync_var==0)
|
||||
{
|
||||
uint16_t sfn = frame;//subframe>=9?frame+1:frame;
|
||||
uint16_t sf = subframe;//subframe>=9?0:subframe+1;
|
||||
uint16_t sfn_sf = sfn<<4 | sf;
|
||||
//PHY_VARS_eNB *eNB = RC.eNB[0][0];
|
||||
//int even_frame_thread = eNB->proc.proc_rxtx[0] == proc ? 0 : 1;
|
||||
|
||||
if ((frame % 100 == 0) && subframe==0)
|
||||
int pnf = nfapi_pnf==1 ? 1 : 0;
|
||||
uint16_t sfn = pnf ? proc->frame_tx : proc->frame_rx;
|
||||
uint16_t sf = pnf ? proc->subframe_tx : proc->frame_rx;
|
||||
uint16_t sfn_sf_tx = sfn<<4 | sf;
|
||||
|
||||
if ((sfn % 100 == 0) && sf==0)
|
||||
{
|
||||
struct timespec ts;
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] %s %d.%d (frame:%u subframe:%u) sfn_sf:%u sfn_sf(DEC):%u\n", __FUNCTION__, ts.tv_sec, ts.tv_nsec, frame, subframe, sfn_sf, NFAPI_SFNSF2DEC(sfn_sf));
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] %s %d.%d (frame:%u subframe:%u) SFN/SF(TX):%u\n", __FUNCTION__, ts.tv_sec, ts.tv_nsec, sfn, sf, NFAPI_SFNSF2DEC(sfn_sf_tx));
|
||||
}
|
||||
|
||||
int subframe_ret = nfapi_pnf_p7_subframe_ind(p7_config_g, p7_config_g->phy_id, sfn_sf);
|
||||
int subframe_ret = nfapi_pnf_p7_subframe_ind(p7_config_g, p7_config_g->phy_id, sfn_sf_tx);
|
||||
|
||||
if (subframe_ret)
|
||||
{
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] %s(frame:%u subframe:%u) sfn_sf:%u sfn_sf(DEC):%u - PROBLEM with pnf_p7_subframe_ind()\n", __FUNCTION__, frame, subframe, sfn_sf, NFAPI_SFNSF2DEC(sfn_sf));
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] %s(frame:%u subframe:%u) SFN/SF(TX):%u - PROBLEM with pnf_p7_subframe_ind()\n", __FUNCTION__, sfn, sf, sfn_sf_tx, NFAPI_SFNSF2DEC(sfn_sf_tx));
|
||||
}
|
||||
else
|
||||
{
|
||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "***NFAPI subframe handler finished *** \n");
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1834,3 +1858,91 @@ int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind)
|
||||
|
||||
return nfapi_pnf_p7_rach_ind(p7_config_g, rach_ind);
|
||||
}
|
||||
|
||||
int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind)
|
||||
{
|
||||
harq_ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||
harq_ind->header.message_id = NFAPI_HARQ_INDICATION;
|
||||
|
||||
LOG_E(PHY, "%s() sfn_sf:%d number_of_harqs:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(harq_ind->sfn_sf), harq_ind->harq_indication_body.number_of_harqs);
|
||||
|
||||
return nfapi_pnf_p7_harq_ind(p7_config_g, harq_ind);
|
||||
}
|
||||
|
||||
|
||||
int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind)
|
||||
{
|
||||
crc_ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||
crc_ind->header.message_id = NFAPI_CRC_INDICATION;
|
||||
|
||||
LOG_E(PHY, "%s() sfn_sf:%d number_of_crcs:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(crc_ind->sfn_sf), crc_ind->crc_indication_body.number_of_crcs);
|
||||
|
||||
return nfapi_pnf_p7_crc_ind(p7_config_g, crc_ind);
|
||||
}
|
||||
|
||||
int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *ind)
|
||||
{
|
||||
ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||
ind->header.message_id = NFAPI_RX_CQI_INDICATION;
|
||||
|
||||
LOG_E(PHY, "%s() sfn_sf:%d number_of_cqis:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->cqi_indication_body.number_of_cqis);
|
||||
|
||||
return nfapi_pnf_p7_cqi_ind(p7_config_g, ind);
|
||||
}
|
||||
|
||||
int oai_nfapi_rx_ind(nfapi_rx_indication_t *ind)
|
||||
{
|
||||
ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||
ind->header.message_id = NFAPI_RX_ULSCH_INDICATION;
|
||||
|
||||
#if 0
|
||||
//ind.rx_indication_body.rx_pdu_list = malloc(sizeof(nfapi_rx_indication_pdu_t)*body->number_of_pdus);
|
||||
|
||||
nfapi_rx_indication_pdu_t pdu[ind->rx_indication_body.number_of_pdus];
|
||||
|
||||
memset(pdu, 0, sizeof(pdu));
|
||||
|
||||
ind->rx_indication_body.rx_pdu_list = pdu;
|
||||
|
||||
LOG_E(PHY, "%s() sfn_sf:%d number_of_pdus:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind.sfn_sf), ind.rx_indication_body.number_of_pdus);
|
||||
|
||||
for(int i=0; i<ind.rx_indication_body.number_of_pdus; i++)
|
||||
{
|
||||
//nfapi_rx_indication_pdu_t *pdu = &ind.rx_indication_body.rx_pdu_list[i];
|
||||
|
||||
pdu[i].rx_ue_information.tl.tag = body->rx_pdu_list[i].rx_ue_information.tl.tag;
|
||||
pdu[i].rx_ue_information.handle = body->rx_pdu_list[i].rx_ue_information.handle;
|
||||
pdu[i].rx_ue_information.rnti = body->rx_pdu_list[i].rx_ue_information.rnti;
|
||||
|
||||
pdu[i].rx_indication_rel8.tl.tag = body->rx_pdu_list[i].rx_indication_rel8.tl.tag;
|
||||
pdu[i].rx_indication_rel8.length = body->rx_pdu_list[i].rx_indication_rel8.length;
|
||||
pdu[i].rx_indication_rel8.offset = body->rx_pdu_list[i].rx_indication_rel8.offset;
|
||||
pdu[i].rx_indication_rel8.ul_cqi = body->rx_pdu_list[i].rx_indication_rel8.ul_cqi;
|
||||
pdu[i].rx_indication_rel8.timing_advance = body->rx_pdu_list[i].rx_indication_rel8.timing_advance;
|
||||
|
||||
pdu[i].rx_indication_rel9.tl.tag = 0; // Clear it
|
||||
|
||||
pdu[i].data = body->rx_pdu_list[i].data;
|
||||
|
||||
LOG_E(PHY, "%s() handle:%d rnti:%04x length:%d offset:%d ul_cqi:%d ta:%d data:%p body->rx_pdu_list[0].data:%p\n",
|
||||
__FUNCTION__,
|
||||
pdu->rx_ue_information.handle,
|
||||
pdu->rx_ue_information.rnti,
|
||||
pdu->rx_indication_rel8.length,
|
||||
pdu->rx_indication_rel8.offset,
|
||||
pdu->rx_indication_rel8.ul_cqi,
|
||||
pdu->rx_indication_rel8.timing_advance,
|
||||
pdu->data,
|
||||
body->rx_pdu_list[0].data
|
||||
);
|
||||
}
|
||||
|
||||
#endif
|
||||
int retval = nfapi_pnf_p7_rx_ind(p7_config_g, ind);
|
||||
|
||||
LOG_E(PHY,"%s() retval:%d\n", __FUNCTION__, retval);
|
||||
|
||||
//free(ind.rx_indication_body.rx_pdu_list);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -294,24 +294,10 @@ extern void init_eNB_afterRU(void);
|
||||
|
||||
void oai_create_enb(void)
|
||||
{
|
||||
static int bodge_counter = 0;
|
||||
PHY_VARS_eNB *eNB;
|
||||
int bodge_counter=0;
|
||||
PHY_VARS_eNB *eNB = RC.eNB[0][0];
|
||||
|
||||
if (RC.eNB && RC.eNB[0] && RC.eNB[0][0])
|
||||
{
|
||||
eNB = RC.eNB[0][0];
|
||||
printf("[VNF] RC.eNB[0][0]. Mod_id:%d CC_id:%d\n", eNB->Mod_id, eNB->CC_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("[VNF] DJP ***** RC.eNB[] and RC.eNB[%d][%d] RC.nb_CC[%d]=1 MALLOCING structure and zeroing *******\n", bodge_counter, bodge_counter, bodge_counter);
|
||||
|
||||
RC.eNB[bodge_counter] = (PHY_VARS_eNB **)malloc((1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB**));
|
||||
RC.eNB[bodge_counter][bodge_counter] = (PHY_VARS_eNB *)malloc(sizeof(PHY_VARS_eNB));
|
||||
memset((void*)RC.eNB[bodge_counter][bodge_counter],0,sizeof(PHY_VARS_eNB));
|
||||
|
||||
eNB = RC.eNB[bodge_counter][bodge_counter];
|
||||
}
|
||||
printf("[VNF] RC.eNB[0][0]. Mod_id:%d CC_id:%d nb_CC[0]:%d abstraction_flag:%d single_thread_flag:%d td:%p te:%p if_inst:%p\n", eNB->Mod_id, eNB->CC_id, RC.nb_CC[0], eNB->abstraction_flag, eNB->single_thread_flag, eNB->td, eNB->te, eNB->if_inst);
|
||||
|
||||
eNB->Mod_id = bodge_counter;
|
||||
eNB->CC_id = bodge_counter;
|
||||
@@ -326,8 +312,6 @@ void oai_create_enb(void)
|
||||
eNB->if_inst = IF_Module_init(bodge_counter);
|
||||
}
|
||||
|
||||
//init_eNB_proc(bodge_counter);
|
||||
|
||||
// This will cause phy_config_request to be installed. That will result in RRC configuring the PHY
|
||||
// that will result in eNB->configured being set to TRUE.
|
||||
// See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values
|
||||
@@ -343,7 +327,6 @@ void oai_create_enb(void)
|
||||
} while(eNB->configured != 1);
|
||||
}
|
||||
|
||||
|
||||
void oai_enb_init(void)
|
||||
{
|
||||
init_eNB_afterRU();
|
||||
@@ -598,9 +581,6 @@ int phy_sync_indication(struct nfapi_vnf_p7_config* config, uint8_t sync)
|
||||
}
|
||||
}
|
||||
|
||||
//if (RC.eNB && RC.eNB[0][0]->configured)
|
||||
//wake_eNB_rxtx(RC.eNB[0][0], 0, 0);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -679,22 +659,101 @@ int phy_rach_indication(struct nfapi_vnf_p7_config* config, nfapi_rach_indicatio
|
||||
|
||||
int phy_harq_indication(struct nfapi_vnf_p7_config* config, nfapi_harq_indication_t* ind)
|
||||
{
|
||||
// vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
|
||||
//mac_harq_ind(p7_vnf->mac, ind);
|
||||
return 1;
|
||||
LOG_E(MAC, "%s() NFAPI SFN/SF:%d number_of_preambles:%u\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->harq_indication_body.number_of_harqs);
|
||||
|
||||
for (int i=0; i<ind->harq_indication_body.number_of_harqs; i++)
|
||||
{
|
||||
harq_indication(
|
||||
0, // DJP - fixme
|
||||
0, // DJP - fixme
|
||||
NFAPI_SFNSF2SFN(ind->sfn_sf),
|
||||
NFAPI_SFNSF2SF(ind->sfn_sf),
|
||||
&ind->harq_indication_body.harq_pdu_list[i]
|
||||
);
|
||||
}
|
||||
|
||||
// vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
|
||||
//mac_harq_ind(p7_vnf->mac, ind);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int phy_crc_indication(struct nfapi_vnf_p7_config* config, nfapi_crc_indication_t* ind)
|
||||
{
|
||||
// vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
|
||||
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
||||
|
||||
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
||||
|
||||
eNB->UL_INFO.crc_ind = *ind;
|
||||
|
||||
nfapi_crc_indication_t *dest_ind = &eNB->UL_INFO.crc_ind;
|
||||
nfapi_crc_indication_pdu_t *dest_pdu_list = eNB->crc_pdu_list;
|
||||
|
||||
*dest_ind = *ind;
|
||||
dest_ind->crc_indication_body.crc_pdu_list = dest_pdu_list;
|
||||
|
||||
LOG_E(MAC, "%s() NFAPI SFN/SF:%d IND:number_of_crcs:%u UL_INFO:crcs:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->crc_indication_body.number_of_crcs, eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs);
|
||||
|
||||
for (int i=0; i<ind->crc_indication_body.number_of_crcs; i++)
|
||||
{
|
||||
LOG_D(MAC, "%s() PDU[%d] rnti:%04x UL_INFO:rnti:%04x\n",
|
||||
__FUNCTION__,
|
||||
i,
|
||||
ind->crc_indication_body.crc_pdu_list[i].rx_ue_information.rnti,
|
||||
eNB->UL_INFO.crc_ind.crc_indication_body.crc_pdu_list[i].rx_ue_information.rnti);
|
||||
|
||||
memcpy(&dest_ind->crc_indication_body.crc_pdu_list[i], &ind->crc_indication_body.crc_pdu_list[i], sizeof(ind->crc_indication_body.crc_pdu_list[0]));
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||
|
||||
// vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
|
||||
//mac_crc_ind(p7_vnf->mac, ind);
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int phy_rx_indication(struct nfapi_vnf_p7_config* config, nfapi_rx_indication_t* ind)
|
||||
{
|
||||
// vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
|
||||
//mac_rx_ind(p7_vnf->mac, ind);
|
||||
return 1;
|
||||
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
||||
|
||||
LOG_E(MAC, "%s() NFAPI SFN/SF:%d number_of_pdus:%u\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->rx_indication_body.number_of_pdus);
|
||||
|
||||
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
||||
|
||||
nfapi_rx_indication_t *dest_ind = &eNB->UL_INFO.rx_ind;
|
||||
nfapi_rx_indication_pdu_t *dest_pdu_list = eNB->rx_pdu_list;
|
||||
|
||||
*dest_ind = *ind;
|
||||
dest_ind->rx_indication_body.rx_pdu_list = dest_pdu_list;
|
||||
|
||||
for(int i=0; i<ind->rx_indication_body.number_of_pdus; i++)
|
||||
{
|
||||
nfapi_rx_indication_pdu_t *dest_pdu = &dest_ind->rx_indication_body.rx_pdu_list[i];
|
||||
nfapi_rx_indication_pdu_t *src_pdu = &ind->rx_indication_body.rx_pdu_list[i];
|
||||
|
||||
memcpy(dest_pdu, src_pdu, sizeof(*src_pdu));
|
||||
|
||||
// DJP - TODO FIXME - intentional memory leak
|
||||
dest_pdu->data = malloc(dest_pdu->rx_indication_rel8.length);
|
||||
|
||||
memcpy(dest_pdu->data, src_pdu->data, dest_pdu->rx_indication_rel8.length);
|
||||
|
||||
LOG_E(PHY, "%s() handle:%d rnti:%04x length:%d offset:%d ul_cqi:%d ta:%d data:%p\n",
|
||||
__FUNCTION__,
|
||||
dest_pdu->rx_ue_information.handle,
|
||||
dest_pdu->rx_ue_information.rnti,
|
||||
dest_pdu->rx_indication_rel8.length,
|
||||
dest_pdu->rx_indication_rel8.offset,
|
||||
dest_pdu->rx_indication_rel8.ul_cqi,
|
||||
dest_pdu->rx_indication_rel8.timing_advance,
|
||||
dest_pdu->data
|
||||
);
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||
|
||||
// vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
|
||||
//mac_rx_ind(p7_vnf->mac, ind);
|
||||
return 1;
|
||||
}
|
||||
int phy_srs_indication(struct nfapi_vnf_p7_config* config, nfapi_srs_indication_t* ind)
|
||||
{
|
||||
@@ -710,10 +769,21 @@ int phy_sr_indication(struct nfapi_vnf_p7_config* config, nfapi_sr_indication_t*
|
||||
}
|
||||
int phy_cqi_indication(struct nfapi_vnf_p7_config* config, nfapi_cqi_indication_t* ind)
|
||||
{
|
||||
// vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
|
||||
//mac_cqi_ind(p7_vnf->mac, ind);
|
||||
return 1;
|
||||
// vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
|
||||
//mac_cqi_ind(p7_vnf->mac, ind);
|
||||
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
||||
|
||||
LOG_E(MAC, "%s() NFAPI SFN/SF:%d number_of_cqis:%u\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->cqi_indication_body.number_of_cqis);
|
||||
|
||||
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
||||
|
||||
eNB->UL_INFO.cqi_ind = ind->cqi_indication_body;
|
||||
|
||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int phy_lbt_dl_indication(struct nfapi_vnf_p7_config* config, nfapi_lbt_dl_indication_t* ind)
|
||||
{
|
||||
// vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
|
||||
@@ -1024,6 +1094,7 @@ printf("[VNF] DJP local_addr:%s\n", p7_vnf->local_addr);
|
||||
|
||||
req->nfapi_config.timing_window.tl.tag = NFAPI_NFAPI_TIMING_WINDOW_TAG;
|
||||
req->nfapi_config.timing_window.value = p7_vnf->timing_window;
|
||||
printf("[VNF] Timing window:%d\n", p7_vnf->timing_window);
|
||||
req->num_tlv++;
|
||||
|
||||
if(p7_vnf->periodic_timing_enabled || p7_vnf->aperiodic_timing_enabled)
|
||||
@@ -1300,3 +1371,49 @@ int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req)
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req)
|
||||
{
|
||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||
|
||||
hi_dci0_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %s() HI_DCI0_REQ p7_config:%p phy_id:%d message_id:%d sfn_sf:%d number_of_dci:%d number_of_hi:%d\n", __FUNCTION__, p7_config, hi_dci0_req->header.phy_id, hi_dci0_req->header.message_id, NFAPI_SFNSF2DEC(hi_dci0_req->sfn_sf), hi_dci0_req->hi_dci0_request_body.number_of_dci, hi_dci0_req->hi_dci0_request_body.number_of_hi);
|
||||
|
||||
int retval = nfapi_vnf_p7_hi_dci0_req(p7_config, hi_dci0_req);
|
||||
|
||||
if (retval!=0)
|
||||
{
|
||||
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() Problem sending retval:%d\n", __FUNCTION__, retval);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req)
|
||||
{
|
||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||
|
||||
ul_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||
|
||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %s() header message_id:%d\n", __FUNCTION__, ul_config_req->header.message_id);
|
||||
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %s() UL_CONFIG p7_config:%p phy_id:%d message_id:%d sfn_sf:%d PDUs:%d rach_prach_frequency_resources:%d srs_present:%d\n",
|
||||
__FUNCTION__, p7_config, ul_config_req->header.phy_id, ul_config_req->header.message_id, NFAPI_SFNSF2DEC(ul_config_req->sfn_sf),
|
||||
ul_config_req->ul_config_request_body.number_of_pdus,
|
||||
ul_config_req->ul_config_request_body.rach_prach_frequency_resources,
|
||||
ul_config_req->ul_config_request_body.srs_present);
|
||||
|
||||
int retval = nfapi_vnf_p7_ul_config_req(p7_config, ul_config_req);
|
||||
|
||||
if (retval!=0)
|
||||
{
|
||||
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() Problem sending retval:%d\n", __FUNCTION__, retval);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Reset number of PDUs so that it is not resent
|
||||
ul_config_req->ul_config_request_body.number_of_pdus=0;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
@@ -181,7 +181,7 @@ index a3b0141..76be11a 100644
|
||||
else
|
||||
{
|
||||
diff --git a/pnf/public_inc/nfapi_pnf_interface.h b/pnf/public_inc/nfapi_pnf_interface.h
|
||||
index f93624d..e48b932 100644
|
||||
index f93624d..b25caf2 100644
|
||||
--- a/pnf/public_inc/nfapi_pnf_interface.h
|
||||
+++ b/pnf/public_inc/nfapi_pnf_interface.h
|
||||
@@ -319,10 +319,10 @@ typedef struct nfapi_pnf_config
|
||||
@@ -197,15 +197,6 @@ index f93624d..e48b932 100644
|
||||
|
||||
/*! Delete a pnf configuration
|
||||
* \param config A pointer to a pnf configuraiton
|
||||
@@ -338,7 +338,7 @@ int nfapi_pnf_config_destroy(nfapi_pnf_config_t* config);
|
||||
*
|
||||
* \code
|
||||
* // Create the pnf config
|
||||
- * nfapi_pnf_config_t* config = nfapi_pnf_config_create();
|
||||
+ * nfapi_pnf_config_t* config = nfapi_pnf_config_create(void);
|
||||
*
|
||||
* // Assumed that the vnf_address and vnf_port are provided over the P9 interface
|
||||
* config->vnf_ip_addr = vnf_address;
|
||||
@@ -681,7 +681,7 @@ typedef struct nfapi_pnf_p7_config
|
||||
/*! Create and initialise a nfapi_pnf_p7_config structure
|
||||
* \return A pointer to a PNF P7 config structure
|
||||
@@ -254,19 +245,75 @@ index 74f29a0..7310fc0 100644
|
||||
}
|
||||
|
||||
diff --git a/pnf/src/pnf_p7.c b/pnf/src/pnf_p7.c
|
||||
index 0fd7828..94b4fba 100644
|
||||
index 0fd7828..263f93c 100644
|
||||
--- a/pnf/src/pnf_p7.c
|
||||
+++ b/pnf/src/pnf_p7.c
|
||||
@@ -30,7 +30,7 @@
|
||||
@@ -25,12 +25,13 @@
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
+#include <stdio.h>
|
||||
|
||||
#include "pnf_p7.h"
|
||||
|
||||
#define FAPI2_IP_DSCP 0
|
||||
|
||||
-uint32_t get_current_time_hr()
|
||||
+uint32_t pnf_get_current_time_hr()
|
||||
+uint32_t pnf_get_current_time_hr(void)
|
||||
{
|
||||
struct timeval now;
|
||||
(void)gettimeofday(&now, NULL);
|
||||
@@ -307,11 +307,11 @@ void pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7_t* pnf_p7, pnf_p7_rx_reas
|
||||
@@ -64,11 +65,14 @@ void pnf_p7_free(pnf_p7_t* pnf_p7, void* ptr)
|
||||
// todo : for now these just malloc/free need to move to a memory cache
|
||||
nfapi_dl_config_request_t* allocate_nfapi_dl_config_request(pnf_p7_t* pnf_p7)
|
||||
{
|
||||
- return pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t));
|
||||
+ void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t));
|
||||
+ //printf("%s() ptr:%p\n", __FUNCTION__, ptr);
|
||||
+ return ptr;
|
||||
}
|
||||
|
||||
void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t* pnf_p7)
|
||||
{
|
||||
+ //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->dl_config_request_body.dl_config_pdu_list);
|
||||
if(pnf_p7->_public.codec_config.deallocate)
|
||||
{
|
||||
(pnf_p7->_public.codec_config.deallocate)(req->dl_config_request_body.dl_config_pdu_list);
|
||||
@@ -83,11 +87,14 @@ void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t
|
||||
|
||||
nfapi_ul_config_request_t* allocate_nfapi_ul_config_request(pnf_p7_t* pnf_p7)
|
||||
{
|
||||
- return pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t));
|
||||
+ void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t));
|
||||
+ //printf("%s() ptr:%p\n", __FUNCTION__, ptr);
|
||||
+ return ptr;
|
||||
}
|
||||
|
||||
void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t* pnf_p7)
|
||||
{
|
||||
+ //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->ul_config_request_body.ul_config_pdu_list);
|
||||
if(pnf_p7->_public.codec_config.deallocate)
|
||||
{
|
||||
(pnf_p7->_public.codec_config.deallocate)(req->ul_config_request_body.ul_config_pdu_list);
|
||||
@@ -107,6 +114,7 @@ nfapi_hi_dci0_request_t* allocate_nfapi_hi_dci0_request(pnf_p7_t* pnf_p7)
|
||||
|
||||
void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pnf_p7)
|
||||
{
|
||||
+ //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->hi_dci0_request_body.hi_dci0_pdu_list);
|
||||
if(pnf_p7->_public.codec_config.deallocate)
|
||||
{
|
||||
(pnf_p7->_public.codec_config.deallocate)(req->hi_dci0_request_body.hi_dci0_pdu_list);
|
||||
@@ -127,6 +135,9 @@ nfapi_tx_request_t* allocate_nfapi_tx_request(pnf_p7_t* pnf_p7)
|
||||
void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7)
|
||||
{
|
||||
int i = 0;
|
||||
+
|
||||
+ //printf("%s() SFN/SF:%d %s req:%p pdu[0]:data:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->tx_request_body.tx_pdu_list[i].segments[0].segment_data);
|
||||
+
|
||||
for(i = 0; i < req->tx_request_body.number_of_pdus; ++i)
|
||||
{
|
||||
void* data = req->tx_request_body.tx_pdu_list[i].segments[0].segment_data;
|
||||
@@ -307,11 +318,11 @@ void pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7_t* pnf_p7, pnf_p7_rx_reas
|
||||
}
|
||||
|
||||
|
||||
@@ -280,7 +327,7 @@ index 0fd7828..94b4fba 100644
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
@@ -482,29 +482,36 @@ void pnf_pack_and_send_timing_info(pnf_p7_t* pnf_p7)
|
||||
@@ -482,29 +493,36 @@ void pnf_pack_and_send_timing_info(pnf_p7_t* pnf_p7)
|
||||
|
||||
void send_dummy_subframe(pnf_p7_t* pnf_p7, uint16_t sfn_sf)
|
||||
{
|
||||
@@ -322,7 +369,7 @@ index 0fd7828..94b4fba 100644
|
||||
(pnf_p7->_public.lbt_dl_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.lbt_dl_config_req);
|
||||
}
|
||||
}
|
||||
@@ -527,7 +534,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
@@ -527,7 +545,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
}
|
||||
|
||||
// save the curren time and sfn_sf
|
||||
@@ -331,7 +378,7 @@ index 0fd7828..94b4fba 100644
|
||||
pnf_p7->sfn_sf = sfn_sf;
|
||||
|
||||
// If the subframe_buffer has been configured
|
||||
@@ -558,18 +565,38 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
@@ -558,18 +576,38 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
|
||||
nfapi_pnf_p7_subframe_buffer_t* subframe_buffer = &(pnf_p7->subframe_buffer[buffer_index]);
|
||||
|
||||
@@ -371,7 +418,7 @@ index 0fd7828..94b4fba 100644
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -586,7 +613,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
@@ -586,7 +624,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
if(pnf_p7->_public.ul_config_req)
|
||||
(pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), subframe_buffer->ul_config_req);
|
||||
|
||||
@@ -380,7 +427,7 @@ index 0fd7828..94b4fba 100644
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -603,7 +630,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
@@ -603,7 +641,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
if(pnf_p7->_public.hi_dci0_req)
|
||||
(pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), subframe_buffer->hi_dci0_req);
|
||||
|
||||
@@ -389,7 +436,7 @@ index 0fd7828..94b4fba 100644
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -615,29 +642,12 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
@@ -615,29 +653,12 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,7 +467,7 @@ index 0fd7828..94b4fba 100644
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -650,6 +660,17 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
@@ -650,6 +671,17 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
|
||||
}
|
||||
|
||||
@@ -438,7 +485,7 @@ index 0fd7828..94b4fba 100644
|
||||
memset(&(pnf_p7->subframe_buffer[buffer_index]), 0, sizeof(nfapi_pnf_p7_subframe_buffer_t));
|
||||
pnf_p7->subframe_buffer[buffer_index].sfn_sf = -1;
|
||||
}
|
||||
@@ -685,7 +706,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
@@ -685,7 +717,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
|
||||
if(pnf_p7->tick == 1000)
|
||||
{
|
||||
|
||||
@@ -447,7 +494,7 @@ index 0fd7828..94b4fba 100644
|
||||
pnf_p7->stats.dl_conf_ontime, pnf_p7->stats.dl_conf_late,
|
||||
pnf_p7->stats.ul_conf_ontime, pnf_p7->stats.ul_conf_late,
|
||||
pnf_p7->stats.hi_dci0_ontime, pnf_p7->stats.hi_dci0_late,
|
||||
@@ -724,7 +745,7 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy)
|
||||
@@ -724,7 +756,7 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy)
|
||||
if(recv_sfn_sf_dec > ((current_sfn_sf_dec + timing_window) % NFAPI_MAX_SFNSFDEC))
|
||||
{
|
||||
// out of window
|
||||
@@ -456,7 +503,7 @@ index 0fd7828..94b4fba 100644
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -736,7 +757,7 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy)
|
||||
@@ -736,7 +768,7 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy)
|
||||
else
|
||||
{
|
||||
// too late
|
||||
@@ -465,7 +512,7 @@ index 0fd7828..94b4fba 100644
|
||||
}
|
||||
|
||||
}
|
||||
@@ -751,8 +772,8 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy)
|
||||
@@ -751,8 +783,8 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy)
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -476,7 +523,7 @@ index 0fd7828..94b4fba 100644
|
||||
}
|
||||
|
||||
}
|
||||
@@ -785,15 +806,30 @@ void pnf_handle_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_
|
||||
@@ -785,15 +817,32 @@ void pnf_handle_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -503,6 +550,8 @@ index 0fd7828..94b4fba 100644
|
||||
+ {
|
||||
+ uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf);
|
||||
+ uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size;
|
||||
+
|
||||
+ //printf("%s() POPULATE DL_CONFIG_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, sfn_sf_dec, buffer_index);
|
||||
|
||||
// if there is already an dl_config_req make sure we free it.
|
||||
if(pnf_p7->subframe_buffer[buffer_index].dl_config_req != 0)
|
||||
@@ -512,10 +561,12 @@ index 0fd7828..94b4fba 100644
|
||||
//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing dl_config_req at index %d (%d/%d)",
|
||||
// pMyPhyInfo->sfnSf, bufferIdx,
|
||||
// SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf));
|
||||
@@ -994,6 +1030,11 @@ void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
|
||||
@@ -994,6 +1043,13 @@ void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
|
||||
uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf);
|
||||
uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size;
|
||||
|
||||
+//printf("%s() POPULATE TX_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, sfn_sf_dec, buffer_index);
|
||||
+
|
||||
+ if (0 && NFAPI_SFNSF2DEC(req->sfn_sf)%100==0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX_REQ.req sfn_sf:%d pdus:%d - TX_REQ is within window\n",
|
||||
+ __FUNCTION__,
|
||||
+ NFAPI_SFNSF2DEC(req->sfn_sf),
|
||||
@@ -524,7 +575,7 @@ index 0fd7828..94b4fba 100644
|
||||
if(pnf_p7->subframe_buffer[buffer_index].tx_req != 0)
|
||||
{
|
||||
//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing tx_req at index %d (%d/%d)",
|
||||
@@ -1126,12 +1167,27 @@ uint32_t calculate_t2(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t
|
||||
@@ -1126,12 +1182,27 @@ uint32_t calculate_t2(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t
|
||||
uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr);
|
||||
uint32_t t2 = (NFAPI_SFNSF2DEC(sfn_sf) * 1000) + sf_time_us;
|
||||
|
||||
@@ -553,7 +604,7 @@ index 0fd7828..94b4fba 100644
|
||||
|
||||
uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr);
|
||||
|
||||
@@ -1391,6 +1447,8 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time)
|
||||
@@ -1391,6 +1462,8 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time)
|
||||
// read the segment
|
||||
recvfrom_result = recvfrom(pnf_p7->p7_sock, pnf_p7->rx_message_buffer, header.message_length, MSG_DONTWAIT, (struct sockaddr*)&remote_addr, &remote_addr_size);
|
||||
|
||||
@@ -562,7 +613,7 @@ index 0fd7828..94b4fba 100644
|
||||
if(recvfrom_result > 0)
|
||||
{
|
||||
pnf_handle_p7_message(pnf_p7->rx_message_buffer, recvfrom_result, pnf_p7, now_hr_time);
|
||||
@@ -1417,7 +1475,10 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time)
|
||||
@@ -1417,7 +1490,10 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time)
|
||||
|
||||
// need to update the time as we would only use the value from the
|
||||
// select
|
||||
@@ -574,7 +625,7 @@ index 0fd7828..94b4fba 100644
|
||||
}
|
||||
while(recvfrom_result > 0);
|
||||
}
|
||||
@@ -1512,7 +1573,7 @@ int pnf_p7_message_pump(pnf_p7_t* pnf_p7)
|
||||
@@ -1512,7 +1588,7 @@ int pnf_p7_message_pump(pnf_p7_t* pnf_p7)
|
||||
|
||||
selectRetval = select(pnf_p7->p7_sock+1, &rfds, NULL, NULL, &timeout);
|
||||
|
||||
@@ -643,7 +694,7 @@ index fea3cf7..6800ee2 100644
|
||||
curr = curr->next;
|
||||
}
|
||||
diff --git a/vnf/src/vnf_interface.c b/vnf/src/vnf_interface.c
|
||||
index e559730..163bb6b 100644
|
||||
index e559730..0aba0a2 100644
|
||||
--- a/vnf/src/vnf_interface.c
|
||||
+++ b/vnf/src/vnf_interface.c
|
||||
@@ -342,6 +342,7 @@ int nfapi_vnf_start(nfapi_vnf_config_t* config)
|
||||
@@ -654,6 +705,15 @@ index e559730..163bb6b 100644
|
||||
memset(pnf, 0, sizeof(nfapi_vnf_pnf_info_t));
|
||||
pnf->p5_sock = p5Sock;
|
||||
pnf->p5_idx = p5_idx++;
|
||||
@@ -663,7 +664,7 @@ int nfapi_vnf_allocate_phy(nfapi_vnf_config_t* config, int p5_idx, uint16_t* phy
|
||||
info->p5_idx = p5_idx;
|
||||
info->phy_id = vnf->next_phy_id++;
|
||||
|
||||
- info->timing_window = 10;
|
||||
+ info->timing_window = 30; // This seems to override what gets set by the user - why???
|
||||
info->timing_info_mode = 0x03;
|
||||
info->timing_info_period = 128;
|
||||
|
||||
diff --git a/vnf/src/vnf_p7.c b/vnf/src/vnf_p7.c
|
||||
index 8630385..4947c40 100644
|
||||
--- a/vnf/src/vnf_p7.c
|
||||
|
||||
@@ -39,6 +39,10 @@
|
||||
|
||||
int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req);
|
||||
int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req);
|
||||
int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req);
|
||||
int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req);
|
||||
|
||||
extern uint8_t nfapi_pnf;
|
||||
|
||||
|
||||
void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,
|
||||
@@ -640,7 +644,7 @@ void schedule_response(Sched_Rsp_t *Sched_INFO)
|
||||
case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE:
|
||||
handle_nfapi_dci_dl_pdu(eNB,proc,dl_config_pdu);
|
||||
eNB->pdcch_vars[subframe&1].num_dci++;
|
||||
LOG_D(PHY,"Incremented num_dci:%d but already set??? dl_config:num_dci:%d\n", eNB->pdcch_vars[subframe&1].num_dci, number_dci);
|
||||
LOG_E(PHY,"Incremented num_dci:%d but already set??? dl_config:num_dci:%d\n", eNB->pdcch_vars[subframe&1].num_dci, number_dci);
|
||||
do_oai=1;
|
||||
break;
|
||||
case NFAPI_DL_CONFIG_BCH_PDU_TYPE:
|
||||
@@ -661,7 +665,7 @@ void schedule_response(Sched_Rsp_t *Sched_INFO)
|
||||
// handle_nfapi_mch_dl_pdu(eNB,dl_config_pdu);
|
||||
break;
|
||||
case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE:
|
||||
LOG_D(PHY,"%s() NFAPI_DL_CONFIG_DLSCH_PDU_TYPE TX:%d/%d RX:%d/%d transport_blocks:%d pdu_index:%d data:%p\n", __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->frame_rx, proc->subframe_rx, dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks, dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index, TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index].segments[0].segment_data);
|
||||
LOG_E(PHY,"%s() NFAPI_DL_CONFIG_DLSCH_PDU_TYPE TX:%d/%d RX:%d/%d transport_blocks:%d pdu_index:%d data:%p\n", __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->frame_rx, proc->subframe_rx, dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks, dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index, TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index].segments[0].segment_data);
|
||||
|
||||
/*
|
||||
AssertFatal(dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index<TX_req->tx_request_body.number_of_pdus,
|
||||
@@ -712,14 +716,17 @@ void schedule_response(Sched_Rsp_t *Sched_INFO)
|
||||
}
|
||||
}
|
||||
|
||||
#if 1
|
||||
if (do_oai)
|
||||
if (nfapi_pnf && do_oai)
|
||||
{
|
||||
oai_nfapi_tx_req(Sched_INFO->TX_req);
|
||||
|
||||
oai_nfapi_dl_config_req(Sched_INFO->DL_req); // DJP - .dl_config_request_body.dl_config_pdu_list[0]); // DJP - FIXME TODO - yuk - only copes with 1 pdu
|
||||
}
|
||||
#endif
|
||||
|
||||
if (nfapi_pnf && number_hi_dci0_pdu!=0)
|
||||
{
|
||||
oai_nfapi_hi_dci0_req(HI_DCI0_req);
|
||||
}
|
||||
|
||||
for (i=0;i<number_hi_dci0_pdu;i++) {
|
||||
|
||||
@@ -731,7 +738,9 @@ void schedule_response(Sched_Rsp_t *Sched_INFO)
|
||||
|
||||
|
||||
case NFAPI_HI_DCI0_DCI_PDU_TYPE:
|
||||
|
||||
handle_nfapi_hi_dci0_dci_pdu(eNB,proc,hi_dci0_req_pdu);
|
||||
|
||||
eNB->pdcch_vars[subframe&1].num_dci++;
|
||||
break;
|
||||
|
||||
@@ -742,6 +751,20 @@ void schedule_response(Sched_Rsp_t *Sched_INFO)
|
||||
}
|
||||
}
|
||||
|
||||
if (nfapi_pnf)
|
||||
{
|
||||
for (int future_subframe=0;future_subframe<10;future_subframe++)
|
||||
{
|
||||
// DJP - indexing directly into the mac - not good - ??????
|
||||
if (RC.mac[0]->UL_req_tmp[CC_id][future_subframe].ul_config_request_body.number_of_pdus > 0)
|
||||
{
|
||||
LOG_D(PHY,"UL_CONFIG for the future future_subframe:%d PDUs:%d\n", future_subframe, RC.mac[0]->UL_req_tmp[CC_id][future_subframe].ul_config_request_body.number_of_pdus);
|
||||
|
||||
oai_nfapi_ul_config_req(&RC.mac[0]->UL_req_tmp[CC_id][future_subframe]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0;i<number_ul_pdu;i++) {
|
||||
ul_config_pdu = &UL_req->ul_config_request_body.ul_config_pdu_list[i];
|
||||
LOG_D(PHY,"NFAPI: ul_pdu %d : type %d\n",i,ul_config_pdu->pdu_type);
|
||||
|
||||
@@ -477,8 +477,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
|
||||
num_dci = eNB->pdcch_vars[subframe&1].num_dci;
|
||||
// LOG_D(PHY,"num_pdcch_symbols %"PRIu8",(dci common %"PRIu8", dci uespec %"PRIu8"\n",num_pdcch_symbols,
|
||||
// DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
|
||||
LOG_D(PHY,"num_pdcch_symbols %"PRIu8",(number dci %"PRIu8"\n",num_pdcch_symbols,
|
||||
num_dci);
|
||||
//LOG_D(PHY,"num_pdcch_symbols %"PRIu8",number dci %"PRIu8"\n",num_pdcch_symbols, num_dci);
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,num_pdcch_symbols);
|
||||
|
||||
|
||||
@@ -487,10 +486,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
|
||||
if (num_dci > 0)
|
||||
LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (num_dci %"PRIu8") num_pdcch_symbols:%d\n",eNB->Mod_id,frame, subframe, num_dci, num_pdcch_symbols);
|
||||
|
||||
LOG_D(PHY,"Before generate_dci_top num_pdcch_symbols:%d num_dci:%d dci_alloc:dci_length:%d\n",
|
||||
num_pdcch_symbols,
|
||||
num_dci,
|
||||
eNB->pdcch_vars[subframe&1].dci_alloc[0].dci_length);
|
||||
//LOG_D(PHY,"Before generate_dci_top num_pdcch_symbols:%d num_dci:%d dci_alloc:dci_length:%d\n", num_pdcch_symbols, num_dci, eNB->pdcch_vars[subframe&1].dci_alloc[0].dci_length);
|
||||
|
||||
generate_dci_top(num_pdcch_symbols,
|
||||
num_dci,
|
||||
@@ -786,6 +782,7 @@ void fill_sr_indication(PHY_VARS_eNB *eNB,uint16_t rnti,int frame,int subframe,u
|
||||
|
||||
pdu->instance_length = 0; // don't know what to do with this
|
||||
// pdu->rx_ue_information.handle = handle;
|
||||
pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG;
|
||||
pdu->rx_ue_information.rnti = rnti;
|
||||
|
||||
int SNRtimes10 = dB_fixed_times10(stat) - 200;//(10*eNB->measurements.n0_power_dB[0]);
|
||||
@@ -1386,7 +1383,7 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
|
||||
|
||||
stop_meas(&eNB->ulsch_decoding_stats);
|
||||
|
||||
LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
|
||||
LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d ulsch_harq->cqi_crc_status:%d ackBits:%d\n",
|
||||
eNB->Mod_id,harq_pid,
|
||||
frame,subframe,
|
||||
ulsch->rnti,
|
||||
@@ -1396,7 +1393,9 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
|
||||
20,//eNB->measurements.n0_power_dB[1],
|
||||
ulsch_harq->o_ACK[0],
|
||||
ulsch_harq->o_ACK[1],
|
||||
ret);
|
||||
ret,
|
||||
ulsch_harq->cqi_crc_status,
|
||||
ulsch_harq->O_ACK);
|
||||
|
||||
|
||||
//compute the expected ULSCH RX power (for the stats)
|
||||
@@ -1445,6 +1444,9 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
|
||||
);
|
||||
#endif
|
||||
|
||||
} // ulsch in error
|
||||
else {
|
||||
|
||||
|
||||
fill_crc_indication(eNB,i,frame,subframe,0); // indicate ACK to MAC
|
||||
fill_rx_indication(eNB,i,frame,subframe); // indicate SDU to MAC
|
||||
@@ -1561,12 +1563,18 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe) {
|
||||
frame,subframe);
|
||||
|
||||
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
||||
pdu = &eNB->UL_INFO.rx_ind.rx_pdu_list[eNB->UL_INFO.rx_ind.number_of_pdus];
|
||||
|
||||
eNB->UL_INFO.rx_ind.sfn_sf = frame<<4| subframe;
|
||||
eNB->UL_INFO.rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG;
|
||||
|
||||
pdu = &eNB->UL_INFO.rx_ind.rx_indication_body.rx_pdu_list[eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus];
|
||||
|
||||
// pdu->rx_ue_information.handle = eNB->ulsch[UE_id]->handle;
|
||||
pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG;
|
||||
pdu->rx_ue_information.rnti = eNB->ulsch[UE_id]->rnti;
|
||||
pdu->rx_indication_rel8.tl.tag = NFAPI_RX_INDICATION_REL8_TAG;
|
||||
pdu->rx_indication_rel8.length = eNB->ulsch[UE_id]->harq_processes[harq_pid]->TBS>>3;
|
||||
pdu->rx_indication_rel8.offset = 0; // filled in at the end of the UL_INFO formation
|
||||
pdu->rx_indication_rel8.offset = 1; // DJP - I dont understand - but broken unless 1 ???? 0; // filled in at the end of the UL_INFO formation
|
||||
pdu->data = eNB->ulsch[UE_id]->harq_processes[harq_pid]->b;
|
||||
// estimate timing advance for MAC
|
||||
sync_pos = lte_est_timing_advance_pusch(eNB,UE_id);
|
||||
@@ -1613,7 +1621,7 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe) {
|
||||
harq_pid,SNRtimes10,pdu->rx_indication_rel8.ul_cqi,pdu->rx_indication_rel8.timing_advance,
|
||||
timing_advance_update);
|
||||
|
||||
eNB->UL_INFO.rx_ind.number_of_pdus++;
|
||||
eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus++;
|
||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||
|
||||
}
|
||||
@@ -1709,11 +1717,13 @@ void fill_ulsch_cqi_indication(PHY_VARS_eNB *eNB,uint16_t frame,uint8_t subframe
|
||||
nfapi_cqi_indication_pdu_t *pdu = &eNB->UL_INFO.cqi_ind.cqi_pdu_list[eNB->UL_INFO.cqi_ind.number_of_cqis];
|
||||
nfapi_cqi_indication_raw_pdu_t *raw_pdu = &eNB->UL_INFO.cqi_ind.cqi_raw_pdu_list[eNB->UL_INFO.cqi_ind.number_of_cqis];
|
||||
|
||||
pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG;
|
||||
pdu->rx_ue_information.rnti = rnti;
|
||||
if (ulsch_harq->cqi_crc_status != 1) pdu->cqi_indication_rel9.data_offset = 0;
|
||||
else pdu->cqi_indication_rel9.data_offset = 1; // fill in after all cqi_indications have been generated when non-zero
|
||||
|
||||
// by default set O to rank 1 value
|
||||
pdu->cqi_indication_rel9.tl.tag = NFAPI_CQI_INDICATION_REL9_TAG;
|
||||
pdu->cqi_indication_rel9.length = (ulsch_harq->Or1>>3) + ((ulsch_harq->Or1&7) > 0 ? 1 : 0);
|
||||
pdu->cqi_indication_rel9.ri[0] = 0;
|
||||
|
||||
@@ -1728,6 +1738,8 @@ void fill_ulsch_cqi_indication(PHY_VARS_eNB *eNB,uint16_t frame,uint8_t subframe
|
||||
pdu->ul_cqi_information.channel = 1; // PUSCH
|
||||
memcpy((void*)raw_pdu->pdu,ulsch_harq->o,pdu->cqi_indication_rel9.length);
|
||||
eNB->UL_INFO.cqi_ind.number_of_cqis++;
|
||||
LOG_E(PHY,"eNB->UL_INFO.cqi_ind.number_of_cqis:%d\n", eNB->UL_INFO.cqi_ind.number_of_cqis);
|
||||
|
||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||
|
||||
}
|
||||
@@ -1747,6 +1759,7 @@ void fill_ulsch_harq_indication(PHY_VARS_eNB *eNB,LTE_UL_eNB_HARQ_t *ulsch_harq,
|
||||
pdu->rx_ue_information.rnti = rnti;
|
||||
|
||||
if (eNB->frame_parms.frame_type == FDD) {
|
||||
pdu->harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG;
|
||||
pdu->harq_indication_fdd_rel13.mode = 0;
|
||||
pdu->harq_indication_fdd_rel13.number_of_ack_nack = ulsch_harq->O_ACK;
|
||||
|
||||
@@ -1772,6 +1785,7 @@ void fill_ulsch_harq_indication(PHY_VARS_eNB *eNB,LTE_UL_eNB_HARQ_t *ulsch_harq,
|
||||
M=ul_ACK_subframe2_M(&eNB->frame_parms,
|
||||
subframe);
|
||||
|
||||
pdu->harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG;
|
||||
pdu->harq_indication_fdd_rel13.mode = 1-bundling;
|
||||
pdu->harq_indication_fdd_rel13.number_of_ack_nack = ulsch_harq->O_ACK;
|
||||
|
||||
@@ -1791,7 +1805,9 @@ void fill_ulsch_harq_indication(PHY_VARS_eNB *eNB,LTE_UL_eNB_HARQ_t *ulsch_harq,
|
||||
}
|
||||
}
|
||||
|
||||
LOG_E(PHY,"eNB->UL_INFO.harq_ind.number_of_harqs:%d\n", eNB->UL_INFO.harq_ind.number_of_harqs);
|
||||
eNB->UL_INFO.harq_ind.number_of_harqs++;
|
||||
|
||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||
}
|
||||
|
||||
@@ -1951,6 +1967,7 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB,
|
||||
|
||||
|
||||
eNB->UL_INFO.harq_ind.number_of_harqs++;
|
||||
LOG_E(PHY,"Incremented eNB->UL_INFO.harq_ind.number_of_harqs:%d\n", eNB->UL_INFO.harq_ind.number_of_harqs);
|
||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||
|
||||
}
|
||||
@@ -1959,14 +1976,22 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB,
|
||||
void fill_crc_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe,uint8_t crc_flag) {
|
||||
|
||||
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
||||
nfapi_crc_indication_pdu_t *pdu = &eNB->UL_INFO.crc_ind.crc_pdu_list[eNB->UL_INFO.crc_ind.number_of_crcs];
|
||||
nfapi_crc_indication_pdu_t *pdu = &eNB->UL_INFO.crc_ind.crc_indication_body.crc_pdu_list[eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs];
|
||||
|
||||
eNB->UL_INFO.crc_ind.sfn_sf = frame<<4 | subframe;
|
||||
eNB->UL_INFO.crc_ind.crc_indication_body.tl.tag = NFAPI_CRC_INDICATION_BODY_TAG;
|
||||
|
||||
pdu->instance_length = 0; // don't know what to do with this
|
||||
// pdu->rx_ue_information.handle = handle;
|
||||
pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG;
|
||||
pdu->rx_ue_information.rnti = eNB->ulsch[UE_id]->rnti;
|
||||
pdu->crc_indication_rel8.tl.tag = NFAPI_CRC_INDICATION_REL8_TAG;
|
||||
pdu->crc_indication_rel8.crc_flag = crc_flag;
|
||||
|
||||
eNB->UL_INFO.crc_ind.number_of_crcs++;
|
||||
eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs++;
|
||||
|
||||
LOG_D(PHY, "%s() rnti:%04x pdus:%d\n", __FUNCTION__, pdu->rx_ue_information.rnti, eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs);
|
||||
|
||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||
}
|
||||
|
||||
@@ -1996,10 +2021,6 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const
|
||||
eNB->rb_mask_ul[2]=0;
|
||||
eNB->rb_mask_ul[3]=0;
|
||||
|
||||
// Fix me here, these should be locked
|
||||
eNB->UL_INFO.rx_ind.number_of_pdus = 0;
|
||||
eNB->UL_INFO.crc_ind.number_of_crcs = 0;
|
||||
|
||||
// Call SRS first since all others depend on presence of SRS or lack thereof
|
||||
srs_procedures(eNB,proc);
|
||||
|
||||
|
||||
@@ -245,6 +245,8 @@ void schedule_SR(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
|
||||
|
||||
ul_req = &RC.mac[module_idP]->UL_req[CC_id].ul_config_request_body;
|
||||
|
||||
LOG_E(MAC, "UE active UE_id:%d ul_req->number_of_pdus:%d\n", UE_id, ul_req->number_of_pdus);
|
||||
|
||||
AssertFatal(UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated != NULL, "physicalConfigDedicated is null for UE %d\n",UE_id);
|
||||
|
||||
// drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet
|
||||
@@ -417,23 +419,29 @@ void copy_ulreq(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP)
|
||||
{
|
||||
int CC_id;
|
||||
eNB_MAC_INST *eNB;
|
||||
nfapi_ul_config_request_body_t *ul_req_tmp;
|
||||
nfapi_ul_config_request_body_t *ul_req;
|
||||
nfapi_ul_config_request_body_t *ul_req_body_tmp;
|
||||
nfapi_ul_config_request_body_t *ul_req_body;
|
||||
|
||||
eNB = RC.mac[module_idP];
|
||||
|
||||
for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
|
||||
|
||||
ul_req_tmp = &eNB->UL_req_tmp[CC_id][subframeP].ul_config_request_body;
|
||||
ul_req = &eNB->UL_req[CC_id].ul_config_request_body;
|
||||
ul_req_body_tmp = &eNB->UL_req_tmp[CC_id][subframeP].ul_config_request_body;
|
||||
ul_req_body = &eNB->UL_req[CC_id].ul_config_request_body;
|
||||
|
||||
eNB->UL_req[CC_id].sfn_sf = (frameP<<4) + subframeP;
|
||||
ul_req->number_of_pdus = ul_req_tmp->number_of_pdus;
|
||||
ul_req_tmp->number_of_pdus = 0;
|
||||
eNB->UL_req[CC_id].header = eNB->UL_req_tmp[CC_id][subframeP].header;
|
||||
ul_req_body->number_of_pdus = ul_req_body_tmp->number_of_pdus;
|
||||
ul_req_body_tmp->number_of_pdus = 0;
|
||||
|
||||
memcpy((void*)ul_req->ul_config_pdu_list,
|
||||
(void*)ul_req_tmp->ul_config_pdu_list,
|
||||
ul_req->number_of_pdus*sizeof(nfapi_ul_config_request_pdu_t));
|
||||
if (ul_req_body->number_of_pdus>0)
|
||||
{
|
||||
LOG_E(PHY, "%s() Copy ul_req pdus:%d\n", __FUNCTION__, ul_req_body->number_of_pdus);
|
||||
}
|
||||
|
||||
memcpy((void*)ul_req_body->ul_config_pdu_list,
|
||||
(void*)ul_req_body_tmp->ul_config_pdu_list,
|
||||
ul_req_body->number_of_pdus*sizeof(nfapi_ul_config_request_pdu_t));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,6 +62,35 @@
|
||||
|
||||
#include "T.h"
|
||||
|
||||
|
||||
void add_subframe(int *frameP, int *subframeP, int offset)
|
||||
{
|
||||
*frameP = *frameP + ((*subframeP + offset) / 10);
|
||||
|
||||
*subframeP = ((*subframeP + offset) % 10);
|
||||
}
|
||||
|
||||
uint16_t sfnsf_add_subframe(int frameP, int subframeP, int offset)
|
||||
{
|
||||
add_subframe(&frameP, &subframeP, offset);
|
||||
return frameP<<4|subframeP;
|
||||
}
|
||||
|
||||
void subtract_subframe(int *frameP, int *subframeP, int offset)
|
||||
{
|
||||
if (*subframeP < offset)
|
||||
{
|
||||
*frameP = (*frameP+1024-1)%1024;
|
||||
}
|
||||
*subframeP = (*subframeP+10-offset)%10;
|
||||
}
|
||||
|
||||
uint16_t sfnsf_subtrace_subframe(int frameP, int subframeP, int offset)
|
||||
{
|
||||
subtract_subframe(&frameP, &subframeP, offset);
|
||||
return frameP<<4|subframeP;
|
||||
}
|
||||
|
||||
void add_msg3(module_id_t module_idP,int CC_id, RA_TEMPLATE *RA_template, frame_t frameP, sub_frame_t subframeP) {
|
||||
|
||||
eNB_MAC_INST *eNB = RC.mac[module_idP];
|
||||
@@ -112,12 +141,18 @@ void add_msg3(module_id_t module_idP,int CC_id, RA_TEMPLATE *RA_template, frame_
|
||||
ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.size = get_TBS_UL(RA_template->msg3_mcs,
|
||||
RA_template->msg3_nb_rb);
|
||||
// Re13 fields
|
||||
ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG;
|
||||
ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.ue_type = RA_template->rach_resource_type>2 ? 2 : 1;
|
||||
ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.total_number_of_repetitions = 1;
|
||||
ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.repetition_number = 1;
|
||||
ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.initial_transmission_sf_io = (RA_template->Msg3_frame*10)+RA_template->Msg3_subframe;
|
||||
|
||||
ul_req_body->number_of_pdus++;
|
||||
ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG;
|
||||
|
||||
// nFAPI on PNF is running at TX SFN/SF (so 4 ahead), so we need to add 4 to the SFN/SF so that the receive happens at the right time
|
||||
ul_req->sfn_sf = sfnsf_add_subframe(RA_template->Msg3_frame, RA_template->Msg3_subframe, 4);
|
||||
ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST;
|
||||
} // if (RA_template->rach_resource_type>0) {
|
||||
else
|
||||
#endif
|
||||
@@ -153,6 +188,8 @@ void add_msg3(module_id_t module_idP,int CC_id, RA_TEMPLATE *RA_template, frame_
|
||||
ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.size = get_TBS_UL(10,RA_template->msg3_nb_rb);
|
||||
ul_req_body->number_of_pdus++;
|
||||
ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG;
|
||||
ul_req->sfn_sf = sfnsf_add_subframe(RA_template->Msg3_frame, RA_template->Msg3_subframe, 4);
|
||||
ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST;
|
||||
// save UL scheduling information for preprocessor
|
||||
for (j=0;j<RA_template->msg3_nb_rb;j++) cc->vrb_map_UL[RA_template->msg3_first_rb+j]=1;
|
||||
|
||||
@@ -167,6 +204,11 @@ void add_msg3(module_id_t module_idP,int CC_id, RA_TEMPLATE *RA_template, frame_
|
||||
hi_dci0_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms = 0;
|
||||
hi_dci0_pdu->hi_pdu.hi_pdu_rel8.hi_value = 0;
|
||||
hi_dci0_req->number_of_hi++;
|
||||
|
||||
eNB->HI_DCI0_req[CC_id].sfn_sf = sfnsf_add_subframe(RA_template->Msg3_frame, RA_template->Msg3_subframe, 4);
|
||||
eNB->HI_DCI0_req[CC_id].hi_dci0_request_body.tl.tag = NFAPI_HI_DCI0_REQUEST_BODY_TAG;
|
||||
eNB->HI_DCI0_req[CC_id].header.message_id = NFAPI_HI_DCI0_REQUEST;
|
||||
|
||||
// save UL scheduling information for preprocessor
|
||||
for (j=0;j<RA_template->msg3_nb_rb;j++) cc->vrb_map_UL[RA_template->msg3_first_rb+j]=1;
|
||||
|
||||
@@ -320,6 +362,9 @@ void generate_Msg2(module_id_t module_idP,int CC_idP,frame_t frameP,sub_frame_t
|
||||
dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG;
|
||||
RA_template->Msg2_subframe = (RA_template->Msg2_subframe+9)%10;
|
||||
|
||||
eNB->DL_req[CC_idP].sfn_sf = sfnsf_add_subframe(RA_template->Msg2_frame, RA_template->Msg2_subframe, 4); // nFAPI is runnning at TX SFN/SF - ie 4 ahead
|
||||
eNB->DL_req[CC_idP].header.message_id = NFAPI_DL_CONFIG_REQUEST;
|
||||
|
||||
} //repetition_count==0 && SF condition met
|
||||
if (RA_template->msg2_mpdcch_repetition_cnt>0) { // we're in a stream of repetitions
|
||||
LOG_D(MAC,"[eNB %d][RAPROC] Frame %d, Subframe %d : In generate_Msg2, MPDCCH repetition %d\n",
|
||||
@@ -537,7 +582,8 @@ void generate_Msg4(module_id_t module_idP,int CC_idP,frame_t frameP,sub_frame_t
|
||||
nfapi_tx_request_pdu_t *TX_req;
|
||||
UE_list_t *UE_list=&eNB->UE_list;
|
||||
nfapi_dl_config_request_body_t *dl_req;
|
||||
nfapi_ul_config_request_body_t *ul_req;
|
||||
nfapi_ul_config_request_body_t *ul_req_body;
|
||||
nfapi_ul_config_request_t *ul_req;
|
||||
uint8_t lcid;
|
||||
uint8_t offset;
|
||||
|
||||
@@ -709,6 +755,9 @@ void generate_Msg4(module_id_t module_idP,int CC_idP,frame_t frameP,sub_frame_t
|
||||
dl_req->number_pdu++;
|
||||
dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG;
|
||||
|
||||
eNB->DL_req[CC_idP].sfn_sf = (frameP<<4)+subframeP;
|
||||
eNB->DL_req[CC_idP].header.message_id = NFAPI_DL_CONFIG_REQUEST;
|
||||
|
||||
} //repetition_count==0 && SF condition met
|
||||
else if (RA_template->msg4_mpdcch_repetition_cnt>0) { // we're in a stream of repetitions
|
||||
RA_template->msg4_mpdcch_repetition_cnt++;
|
||||
@@ -769,6 +818,9 @@ void generate_Msg4(module_id_t module_idP,int CC_idP,frame_t frameP,sub_frame_t
|
||||
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.drms_table_flag = 0;
|
||||
dl_req->number_pdu++;
|
||||
dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG;
|
||||
|
||||
eNB->DL_req[CC_idP].sfn_sf = (frameP<<4)+subframeP;
|
||||
eNB->DL_req[CC_idP].header.message_id = NFAPI_DL_CONFIG_REQUEST;
|
||||
|
||||
RA_template->generate_Msg4=0;
|
||||
RA_template->wait_ack_Msg4=1;
|
||||
@@ -805,9 +857,10 @@ void generate_Msg4(module_id_t module_idP,int CC_idP,frame_t frameP,sub_frame_t
|
||||
rrc_sdu_length);
|
||||
|
||||
// DL request
|
||||
eNB->TX_req[CC_idP].sfn_sf = (frameP<<4)+subframeP;
|
||||
eNB->TX_req[CC_idP].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG;
|
||||
eNB->TX_req[CC_idP].header.message_id = NFAPI_TX_REQUEST;
|
||||
eNB->TX_req[CC_idP].sfn_sf = (frameP<<4)+subframeP;
|
||||
eNB->TX_req[CC_idP].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG;
|
||||
eNB->TX_req[CC_idP].header.message_id = NFAPI_TX_REQUEST;
|
||||
|
||||
TX_req = &eNB->TX_req[CC_idP].tx_request_body.tx_pdu_list[eNB->TX_req[CC_idP].tx_request_body.number_of_pdus];
|
||||
TX_req->pdu_length = rrc_sdu_length;
|
||||
TX_req->pdu_index = eNB->pdu_index[CC_idP]++;
|
||||
@@ -821,17 +874,26 @@ void generate_Msg4(module_id_t module_idP,int CC_idP,frame_t frameP,sub_frame_t
|
||||
// see Section 10.2 from 36.213
|
||||
int ackNAK_absSF = absSF + reps + 4;
|
||||
AssertFatal(reps>2,"Have to handle programming of ACK when PDSCH repetitions is > 2\n");
|
||||
ul_req = &eNB->UL_req_tmp[CC_idP][ackNAK_absSF%10].ul_config_request_body;
|
||||
ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus];
|
||||
ul_req = &eNB->UL_req_tmp[CC_idP][ackNAK_absSF%10];
|
||||
ul_req_body = &ul_req->ul_config_request_body;
|
||||
ul_config_pdu = &ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus];
|
||||
|
||||
ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE;
|
||||
ul_config_pdu->pdu_size = (uint8_t)(2+sizeof(nfapi_ul_config_uci_harq_pdu));
|
||||
ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG;
|
||||
ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.handle = 0; // don't know how to use this
|
||||
ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti = RA_template->rnti;
|
||||
ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG;
|
||||
ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel13.ue_type = (RA_template->rach_resource_type < 3) ? 1 : 2;
|
||||
ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel13.empty_symbols = 0;
|
||||
ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel13.total_number_of_repetitions = pucchreps[RA_template->rach_resource_type-1];
|
||||
ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel13.repetition_number = 0;
|
||||
|
||||
ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG;
|
||||
|
||||
ul_req->sfn_sf = sfnsf_add_subframe(RA_template->Msg3_frame, RA_template->Msg3_subframe, 4); // this is for +4 frame, but nFAPI already running at +4 (because 4 is latency of Tx)
|
||||
ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST;
|
||||
|
||||
// Note need to keep sending this across reptitions!!!! Not really for PUCCH, to ask small-cell forum, we'll see for the other messages, maybe parameters change across repetitions and FAPI has to provide for that
|
||||
if (cc[CC_idP].tdd_Config==NULL) { // FDD case
|
||||
ul_config_pdu->uci_harq_pdu.harq_information.harq_information_rel8_fdd.n_pucch_1_0 = n1pucchan[RA_template->rach_resource_type-1];
|
||||
@@ -844,7 +906,7 @@ void generate_Msg4(module_id_t module_idP,int CC_idP,frame_t frameP,sub_frame_t
|
||||
else {
|
||||
AssertFatal(1==0,"PUCCH configuration for ACK/NAK not handled yet for TDD BL/CE case\n");
|
||||
}
|
||||
ul_req->number_of_pdus++;
|
||||
ul_req_body->number_of_pdus++;
|
||||
T(T_ENB_MAC_UE_DL_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_idP), T_INT(RA_template->rnti), T_INT(frameP), T_INT(subframeP),
|
||||
T_INT(0 /*harq_pid always 0?*/), T_BUFFER(&eNB->UE_list.DLSCH_pdu[CC_idP][0][UE_id].payload[0], RA_template->msg4_TBsize));
|
||||
|
||||
|
||||
@@ -756,6 +756,9 @@ schedule_ue_spec(
|
||||
dl_req->number_pdu++;
|
||||
dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG;
|
||||
|
||||
eNB->DL_req[CC_id].sfn_sf = frameP<<4 | subframeP;
|
||||
eNB->DL_req[CC_id].header.message_id = NFAPI_DL_CONFIG_REQUEST;
|
||||
|
||||
fill_nfapi_dlsch_config(eNB,dl_req,
|
||||
TBS,
|
||||
-1 /* retransmission, no pdu_index */,
|
||||
@@ -1245,6 +1248,9 @@ schedule_ue_spec(
|
||||
dl_req->number_pdu++;
|
||||
dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG;
|
||||
|
||||
eNB->DL_req[CC_id].sfn_sf = frameP<<4 | subframeP;
|
||||
eNB->DL_req[CC_id].header.message_id = NFAPI_DL_CONFIG_REQUEST;
|
||||
|
||||
// Toggle NDI for next time
|
||||
LOG_D(MAC,"CC_id %d Frame %d, subframeP %d: Toggling Format1 NDI for UE %d (rnti %x/%d) oldNDI %d\n",
|
||||
CC_id, frameP,subframeP,UE_id,
|
||||
@@ -1350,7 +1356,7 @@ fill_DLSCH_dci(
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_FILL_DLSCH_DCI,VCD_FUNCTION_IN);
|
||||
|
||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
LOG_D(MAC,"Doing fill DCI for CC_id %d\n",CC_id);
|
||||
//LOG_D(MAC,"Doing fill DCI for CC_id %d\n",CC_id);
|
||||
|
||||
if (mbsfn_flagP[CC_id]>0)
|
||||
continue;
|
||||
|
||||
@@ -1159,7 +1159,7 @@ void fill_nfapi_harq_information(module_id_t module_idP,
|
||||
|
||||
AssertFatal(UE_id>=0,"UE_id cannot be found, impossible\n");
|
||||
AssertFatal(UE_list!=NULL,"UE_list is null\n");
|
||||
AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated!=NULL,"physicalConfigDedicated for rnti %x is null\n",rntiP);
|
||||
AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated!=NULL,"physicalConfigDedicated for rnti %x is null CC_idP:%d UE_id:%d UE_list:rnti:%04x\n",rntiP,CC_idP,UE_id,UE_list->UE_template[CC_idP][UE_id].rnti);
|
||||
|
||||
harq_information->harq_information_rel11.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG;
|
||||
harq_information->harq_information_rel11.num_ant_ports = 1;
|
||||
@@ -1194,6 +1194,7 @@ void fill_nfapi_harq_information(module_id_t module_idP,
|
||||
break;
|
||||
default: // for any other TM we need 2 bits harq
|
||||
if (cc->tdd_Config!=NULL) {
|
||||
AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated!=NULL,"physicalConfigDedicated for rnti %x is null\n",rntiP);
|
||||
AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pucch_ConfigDedicated!=NULL,
|
||||
"pucch_ConfigDedicated is null for TDD!\n");
|
||||
if ((UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode!=NULL)&&
|
||||
|
||||
@@ -108,7 +108,7 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
|
||||
if (UE_id!=-1) {
|
||||
|
||||
LOG_D(MAC,"[eNB %d][PUSCH %d] CC_id %d Received ULSCH sdu round %d from PHY (rnti %x, UE_id %d) ul_cqi %d\n",enb_mod_idP,harq_pid,CC_idP, UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid],
|
||||
LOG_D(MAC,"[eNB %d][PUSCH %d] CC_id %d Received ULSCH sdu(%p) round %d from PHY (rnti %x, UE_id %d) ul_cqi %d\n",enb_mod_idP,harq_pid,CC_idP,sduP,UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid],
|
||||
rntiP,UE_id,ul_cqi);
|
||||
|
||||
AssertFatal(UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid] < 8,
|
||||
@@ -571,6 +571,8 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
hi_dci0_pdu->hi_pdu.hi_pdu_rel8.hi_value = 1;
|
||||
hi_dci0_req->number_of_hi++;
|
||||
hi_dci0_req->tl.tag = NFAPI_HI_DCI0_REQUEST_BODY_TAG;
|
||||
eNB->HI_DCI0_req[CC_idP].sfn_sf = frameP<<4|subframeP;
|
||||
eNB->HI_DCI0_req[CC_idP].header.message_id = NFAPI_HI_DCI0_REQUEST;
|
||||
|
||||
/* NN--> FK: we could either check the payload, or use a phy helper to detect a false msg3 */
|
||||
if ((num_sdu == 0) && (num_ce==0)) {
|
||||
@@ -878,13 +880,13 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
//ul_config_pdu = &ul_req_tmp->ul_config_pdu_list[0];
|
||||
|
||||
|
||||
LOG_D(MAC,"entering ulsch preprocesor\n");
|
||||
//LOG_D(MAC,"entering ulsch preprocesor\n");
|
||||
ulsch_scheduler_pre_processor(module_idP,
|
||||
frameP,
|
||||
subframeP,
|
||||
first_rb);
|
||||
|
||||
LOG_D(MAC,"exiting ulsch preprocesor\n");
|
||||
//LOG_D(MAC,"exiting ulsch preprocesor\n");
|
||||
|
||||
eNB->HI_DCI0_req[CC_id].sfn_sf = (frameP<<4)+subframeP;
|
||||
eNB->HI_DCI0_req[CC_id].hi_dci0_request_body.tl.tag = NFAPI_HI_DCI0_REQUEST_BODY_TAG;
|
||||
@@ -895,8 +897,7 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
|
||||
// don't schedule if Msg4 is not received yet
|
||||
if (UE_list->UE_template[UE_PCCID(module_idP,UE_id)][UE_id].configured==FALSE) {
|
||||
LOG_D(MAC,"[eNB %d] frame %d subfarme %d, UE %d: not configured, skipping UE scheduling \n",
|
||||
module_idP,frameP,subframeP,UE_id);
|
||||
//LOG_D(MAC,"[eNB %d] frame %d subfarme %d, UE %d: not configured, skipping UE scheduling \n", module_idP,frameP,subframeP,UE_id);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -975,8 +976,7 @@ abort();
|
||||
harq_pid = subframe2harqpid(&cc[CC_id],sched_frame,sched_subframeP);
|
||||
round = UE_sched_ctrl->round_UL[CC_id][harq_pid];
|
||||
AssertFatal(round<8,"round %d > 7 for UE %d/%x\n",round,UE_id,rnti);
|
||||
LOG_D(MAC,"[eNB %d] frame %d subframe %d,Checking PUSCH %d for UE %d/%x CC %d : aggregation level %d, N_RB_UL %d\n",
|
||||
module_idP,frameP,subframeP,harq_pid,UE_id,rnti,CC_id, aggregation,N_RB_UL);
|
||||
//LOG_D(MAC,"[eNB %d] frame %d subframe %d,Checking PUSCH %d for UE %d/%x CC %d : aggregation level %d, N_RB_UL %d\n", module_idP,frameP,subframeP,harq_pid,UE_id,rnti,CC_id, aggregation,N_RB_UL);
|
||||
|
||||
RC.eNB[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP*10)+subframeP] = UE_template->ul_total_buffer;
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BO,RC.eNB[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP*10)+subframeP]);
|
||||
|
||||
@@ -10,6 +10,12 @@
|
||||
IF_Module_t *if_inst[MAX_IF_MODULES];
|
||||
Sched_Rsp_t Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs];
|
||||
|
||||
extern int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind);
|
||||
extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind);
|
||||
extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind);
|
||||
extern int oai_nfapi_rx_ind(nfapi_rx_indication_t *ind);
|
||||
extern uint8_t nfapi_pnf;
|
||||
|
||||
void handle_rach(UL_IND_t *UL_info) {
|
||||
int i;
|
||||
|
||||
@@ -17,7 +23,7 @@ void handle_rach(UL_IND_t *UL_info) {
|
||||
|
||||
AssertFatal(UL_info->rach_ind.number_of_preambles==1,"More than 1 preamble not supported\n");
|
||||
UL_info->rach_ind.number_of_preambles=0;
|
||||
LOG_I(MAC,"Frame %d, Subframe %d Calling initiate_ra_proc\n",UL_info->frame,UL_info->subframe);
|
||||
LOG_E(MAC,"Frame %d, Subframe %d Calling initiate_ra_proc\n",UL_info->frame,UL_info->subframe);
|
||||
initiate_ra_proc(UL_info->module_id,
|
||||
UL_info->CC_id,
|
||||
UL_info->frame,
|
||||
@@ -73,6 +79,21 @@ void handle_cqi(UL_IND_t *UL_info) {
|
||||
|
||||
int i;
|
||||
|
||||
if (nfapi_pnf == 1)
|
||||
{
|
||||
if (UL_info->cqi_ind.number_of_cqis>0)
|
||||
{
|
||||
LOG_D(PHY,"UL_info->cqi_ind.number_of_cqis:%d\n", UL_info->cqi_ind.number_of_cqis);
|
||||
nfapi_cqi_indication_t ind;
|
||||
|
||||
ind.header.message_id = NFAPI_RX_CQI_INDICATION;
|
||||
ind.sfn_sf = UL_info->frame<<4 | UL_info->subframe;
|
||||
ind.cqi_indication_body = UL_info->cqi_ind;
|
||||
|
||||
oai_nfapi_cqi_indication(&ind);
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0;i<UL_info->cqi_ind.number_of_cqis;i++)
|
||||
cqi_indication(UL_info->module_id,
|
||||
UL_info->CC_id,
|
||||
@@ -90,6 +111,25 @@ void handle_harq(UL_IND_t *UL_info) {
|
||||
|
||||
int i;
|
||||
|
||||
//if (UL_info->harq_ind.number_of_harqs>0)
|
||||
|
||||
if (nfapi_pnf == 1 && UL_info->harq_ind.number_of_harqs>0) // PNF
|
||||
{
|
||||
LOG_E(PHY, "UL_info->harq_ind.number_of_harqs:%d Send to VNF\n", UL_info->harq_ind.number_of_harqs);
|
||||
|
||||
nfapi_harq_indication_t ind;
|
||||
|
||||
ind.header.message_id = NFAPI_HARQ_INDICATION;
|
||||
ind.sfn_sf = UL_info->frame<<4 | UL_info->subframe;
|
||||
|
||||
int retval = oai_nfapi_harq_indication(&ind);
|
||||
|
||||
if (retval!=0)
|
||||
{
|
||||
LOG_E(PHY, "Failed to encode NFAPI HARQ_IND retval:%d\n", retval);
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0;i<UL_info->harq_ind.number_of_harqs;i++)
|
||||
harq_indication(UL_info->module_id,
|
||||
UL_info->CC_id,
|
||||
@@ -104,23 +144,41 @@ void handle_ulsch(UL_IND_t *UL_info) {
|
||||
|
||||
int i,j;
|
||||
|
||||
for (i=0;i<UL_info->rx_ind.number_of_pdus;i++) {
|
||||
if(nfapi_pnf == 1)
|
||||
{
|
||||
if (UL_info->crc_ind.crc_indication_body.number_of_crcs>0)
|
||||
{
|
||||
LOG_D(PHY,"UL_info->crc_ind.crc_indication_body.number_of_crcs:%d\n", UL_info->crc_ind.crc_indication_body.number_of_crcs);
|
||||
|
||||
for (j=0;j<UL_info->crc_ind.number_of_crcs;j++) {
|
||||
oai_nfapi_crc_indication(&UL_info->crc_ind);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (nfapi_pnf == 1 && UL_info->rx_ind.rx_indication_body.number_of_pdus>0)
|
||||
{
|
||||
LOG_D(PHY,"UL_info->rx_ind.number_of_pdus:%d\n", UL_info->rx_ind.rx_indication_body.number_of_pdus);
|
||||
oai_nfapi_rx_ind(&UL_info->rx_ind);
|
||||
}
|
||||
|
||||
for (i=0;i<UL_info->rx_ind.rx_indication_body.number_of_pdus;i++) {
|
||||
for (j=0;j<UL_info->crc_ind.crc_indication_body.number_of_crcs;j++) {
|
||||
// find crc_indication j corresponding rx_indication i
|
||||
if (UL_info->crc_ind.crc_pdu_list[j].rx_ue_information.rnti ==
|
||||
UL_info->rx_ind.rx_pdu_list[i].rx_ue_information.rnti) {
|
||||
if (UL_info->crc_ind.crc_pdu_list[j].crc_indication_rel8.crc_flag == 1) { // CRC error indication
|
||||
LOG_D(MAC,"Frame %d, Subframe %d Calling rx_sdu (CRC error) \n",UL_info->frame,UL_info->subframe);
|
||||
rx_sdu(UL_info->module_id,
|
||||
UL_info->CC_id,
|
||||
UL_info->frame,
|
||||
UL_info->subframe,
|
||||
UL_info->rx_ind.rx_pdu_list[i].rx_ue_information.rnti,
|
||||
LOG_D(PHY,"UL_info->crc_ind.crc_indication_body.crc_pdu_list[%d].rx_ue_information.rnti:%04x UL_info->rx_ind.rx_indication_body.rx_pdu_list[%d].rx_ue_information.rnti:%04x\n", j, UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].rx_ue_information.rnti, i, UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti);
|
||||
if (UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].rx_ue_information.rnti ==
|
||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti) {
|
||||
LOG_D(PHY, "UL_info->crc_ind.crc_indication_body.crc_pdu_list[%d].crc_indication_rel8.crc_flag:%d\n", j, UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].crc_indication_rel8.crc_flag);
|
||||
if (UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].crc_indication_rel8.crc_flag == 1) { // CRC error indication
|
||||
LOG_D(MAC,"Frame %d, Subframe %d Calling rx_sdu (CRC error) \n",UL_info->frame,UL_info->subframe);
|
||||
rx_sdu(UL_info->module_id,
|
||||
UL_info->CC_id,
|
||||
UL_info->frame,
|
||||
UL_info->subframe,
|
||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti,
|
||||
(uint8_t *)NULL,
|
||||
UL_info->rx_ind.rx_pdu_list[i].rx_indication_rel8.length,
|
||||
UL_info->rx_ind.rx_pdu_list[i].rx_indication_rel8.timing_advance,
|
||||
UL_info->rx_ind.rx_pdu_list[i].rx_indication_rel8.ul_cqi);
|
||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.length,
|
||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.timing_advance,
|
||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.ul_cqi);
|
||||
}
|
||||
else {
|
||||
LOG_D(MAC,"Frame %d, Subframe %d Calling rx_sdu (CRC ok) \n",UL_info->frame,UL_info->subframe);
|
||||
@@ -128,21 +186,30 @@ void handle_ulsch(UL_IND_t *UL_info) {
|
||||
UL_info->CC_id,
|
||||
UL_info->frame,
|
||||
UL_info->subframe,
|
||||
UL_info->rx_ind.rx_pdu_list[i].rx_ue_information.rnti,
|
||||
UL_info->rx_ind.rx_pdu_list[i].data,
|
||||
UL_info->rx_ind.rx_pdu_list[i].rx_indication_rel8.length,
|
||||
UL_info->rx_ind.rx_pdu_list[i].rx_indication_rel8.timing_advance,
|
||||
UL_info->rx_ind.rx_pdu_list[i].rx_indication_rel8.ul_cqi);
|
||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti,
|
||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].data,
|
||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.length,
|
||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.timing_advance,
|
||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.ul_cqi);
|
||||
}
|
||||
break;
|
||||
} //if (UL_info->crc_ind.crc_pdu_list[j].rx_ue_information.rnti ==
|
||||
// UL_info->rx_ind.rx_pdu_list[i].rx_ue_information.rnti) {
|
||||
} // for (j=0;j<UL_info->crc_ind.number_of_crcs;j++) {
|
||||
AssertFatal(j<UL_info->crc_ind.number_of_crcs,"Couldn't find matchin CRC indication\n");
|
||||
} // for (j=0;j<UL_info->crc_ind.crc_indication_body.number_of_crcs;j++) {
|
||||
AssertFatal(j<UL_info->crc_ind.crc_indication_body.number_of_crcs,"Couldn't find matchin CRC indication\n");
|
||||
} // for (i=0;i<UL_info->rx_ind.number_of_pdus;i++) {
|
||||
|
||||
UL_info->rx_ind.number_of_pdus=0;
|
||||
UL_info->crc_ind.number_of_crcs=0;
|
||||
if (NFAPI_SFNSF2SFN(UL_info->rx_ind.sfn_sf) == UL_info->frame && NFAPI_SFNSF2SF(UL_info->rx_ind.sfn_sf) == UL_info->subframe && UL_info->rx_ind.rx_indication_body.number_of_pdus>0)
|
||||
{
|
||||
UL_info->rx_ind.rx_indication_body.number_of_pdus = 0;
|
||||
LOG_D(PHY, "UL_INFO:SFN/SF:%d/%d ZEROING rx_ind.number_of_pdus:%d \n", UL_info->frame, UL_info->subframe, UL_info->rx_ind.rx_indication_body.number_of_pdus);
|
||||
}
|
||||
|
||||
if (NFAPI_SFNSF2SFN(UL_info->rx_ind.sfn_sf) == UL_info->frame && NFAPI_SFNSF2SF(UL_info->rx_ind.sfn_sf) == UL_info->subframe && UL_info->crc_ind.crc_indication_body.number_of_crcs>0)
|
||||
{
|
||||
LOG_D(PHY, "UL_INFO:SFN/SF:%d/%d crcs:%d Reset to zero\n", UL_info->frame, UL_info->subframe, UL_info->crc_ind.crc_indication_body.number_of_crcs);
|
||||
UL_info->crc_ind.crc_indication_body.number_of_crcs=0;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -197,7 +264,7 @@ static void dump_ul(UL_IND_t *u)
|
||||
v->ul_cqi_information.channel);
|
||||
}
|
||||
|
||||
A("XXXX crc_ind %d\n", u->crc_ind.number_of_crcs);
|
||||
A("XXXX crc_ind %d\n", u->crc_ind.crc_indication_body.number_of_crcs);
|
||||
|
||||
A("XXXX sr_ind %d\n", u->sr_ind.number_of_srs);
|
||||
|
||||
@@ -205,7 +272,7 @@ static void dump_ul(UL_IND_t *u)
|
||||
|
||||
A("XXXX rach_ind %d\n", u->rach_ind.number_of_preambles);
|
||||
|
||||
A("XXXX rx_ind %d\n", u->rx_ind.number_of_pdus);
|
||||
A("XXXX rx_ind %d\n", u->rx_ind.rx_indication_body.number_of_pdus);
|
||||
|
||||
LOG_I(PHY, "XXXX UL\nXXXX UL\n%s", s);
|
||||
}
|
||||
@@ -366,21 +433,25 @@ void UL_indication(UL_IND_t *UL_info)
|
||||
UL_info->frame,UL_info->subframe,
|
||||
module_id,CC_id);
|
||||
|
||||
if (ifi->CC_mask==0) {
|
||||
ifi->current_frame = UL_info->frame;
|
||||
ifi->current_subframe = UL_info->subframe;
|
||||
if (nfapi_pnf != 1)
|
||||
{
|
||||
if (ifi->CC_mask==0) {
|
||||
ifi->current_frame = UL_info->frame;
|
||||
ifi->current_subframe = UL_info->subframe;
|
||||
}
|
||||
else {
|
||||
AssertFatal(UL_info->frame != ifi->current_frame,"CC_mask %x is not full and frame has changed\n",ifi->CC_mask);
|
||||
AssertFatal(UL_info->subframe != ifi->current_subframe,"CC_mask %x is not full and subframe has changed\n",ifi->CC_mask);
|
||||
}
|
||||
ifi->CC_mask |= (1<<CC_id);
|
||||
}
|
||||
else {
|
||||
AssertFatal(UL_info->frame != ifi->current_frame,"CC_mask %x is not full and frame has changed\n",ifi->CC_mask);
|
||||
AssertFatal(UL_info->subframe != ifi->current_subframe,"CC_mask %x is not full and subframe has changed\n",ifi->CC_mask);
|
||||
}
|
||||
ifi->CC_mask |= (1<<CC_id);
|
||||
|
||||
|
||||
|
||||
// clear DL/UL info for new scheduling round
|
||||
clear_nfapi_information(RC.mac[module_id],CC_id,
|
||||
UL_info->frame,UL_info->subframe);
|
||||
|
||||
LOG_D(PHY, "UL_info[rx_ind:%d number_of_harqs:%d number_of_crcs:%d number_of_cqis:%d number_of_preambles:%d]\n", UL_info->rx_ind.rx_indication_body.number_of_pdus, UL_info->harq_ind.number_of_harqs, UL_info->crc_ind.crc_indication_body.number_of_crcs, UL_info->cqi_ind.number_of_cqis, UL_info->rach_ind.number_of_preambles);
|
||||
|
||||
handle_rach(UL_info);
|
||||
|
||||
@@ -395,56 +466,64 @@ void UL_indication(UL_IND_t *UL_info)
|
||||
|
||||
handle_ulsch(UL_info);
|
||||
|
||||
if (ifi->CC_mask == ((1<<MAX_NUM_CCs)-1)) {
|
||||
if (nfapi_pnf != 1)
|
||||
{
|
||||
if (ifi->CC_mask == ((1<<MAX_NUM_CCs)-1)) {
|
||||
|
||||
eNB_dlsch_ulsch_scheduler(module_id,
|
||||
(UL_info->frame+((UL_info->subframe>5)?1:0)) % 1024,
|
||||
(UL_info->subframe+4)%10);
|
||||
eNB_dlsch_ulsch_scheduler(module_id,
|
||||
(UL_info->frame+((UL_info->subframe>5)?1:0)) % 1024,
|
||||
(UL_info->subframe+4)%10);
|
||||
|
||||
ifi->CC_mask = 0;
|
||||
ifi->CC_mask = 0;
|
||||
|
||||
sched_info->module_id = module_id;
|
||||
sched_info->CC_id = CC_id;
|
||||
sched_info->frame = (UL_info->frame + ((UL_info->subframe>5) ? 1 : 0)) % 1024;
|
||||
sched_info->subframe = (UL_info->subframe+4)%10;
|
||||
sched_info->DL_req = &mac->DL_req[CC_id];
|
||||
sched_info->HI_DCI0_req = &mac->HI_DCI0_req[CC_id];
|
||||
if ((mac->common_channels[CC_id].tdd_Config==NULL) ||
|
||||
(is_UL_sf(&mac->common_channels[CC_id],(sched_info->subframe+4)%10)>0))
|
||||
sched_info->UL_req = &mac->UL_req[CC_id];
|
||||
else
|
||||
sched_info->UL_req = NULL;
|
||||
sched_info->module_id = module_id;
|
||||
sched_info->CC_id = CC_id;
|
||||
sched_info->frame = (UL_info->frame + ((UL_info->subframe>5) ? 1 : 0)) % 1024;
|
||||
sched_info->subframe = (UL_info->subframe+4)%10;
|
||||
sched_info->DL_req = &mac->DL_req[CC_id];
|
||||
sched_info->HI_DCI0_req = &mac->HI_DCI0_req[CC_id];
|
||||
if ((mac->common_channels[CC_id].tdd_Config==NULL) ||
|
||||
(is_UL_sf(&mac->common_channels[CC_id],(sched_info->subframe+4)%10)>0))
|
||||
sched_info->UL_req = &mac->UL_req[CC_id];
|
||||
else
|
||||
sched_info->UL_req = NULL;
|
||||
|
||||
sched_info->TX_req = &mac->TX_req[CC_id];
|
||||
sched_info->TX_req = &mac->TX_req[CC_id];
|
||||
|
||||
#ifdef DUMP_FAPI
|
||||
dump_dl(sched_info);
|
||||
dump_dl(sched_info);
|
||||
#endif
|
||||
|
||||
AssertFatal(ifi->schedule_response!=NULL,
|
||||
"schedule_response is null (mod %d, cc %d)\n",
|
||||
module_id,
|
||||
CC_id);
|
||||
ifi->schedule_response(sched_info);
|
||||
if (ifi->schedule_response)
|
||||
{
|
||||
AssertFatal(ifi->schedule_response!=NULL,
|
||||
"schedule_response is null (mod %d, cc %d)\n",
|
||||
module_id,
|
||||
CC_id);
|
||||
ifi->schedule_response(sched_info);
|
||||
}
|
||||
|
||||
LOG_D(PHY,"Schedule_response: frame %d, subframe %d (dl_pdus %d / %p)\n",sched_info->frame,sched_info->subframe,sched_info->DL_req->dl_config_request_body.number_pdu,
|
||||
&sched_info->DL_req->dl_config_request_body.number_pdu);
|
||||
}
|
||||
LOG_D(PHY,"Schedule_response: frame %d, subframe %d (dl_pdus %d / %p)\n",sched_info->frame,sched_info->subframe,sched_info->DL_req->dl_config_request_body.number_pdu,
|
||||
&sched_info->DL_req->dl_config_request_body.number_pdu);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IF_Module_t *IF_Module_init(int Mod_id){
|
||||
|
||||
AssertFatal(Mod_id<MAX_MODULES,"Asking for Module %d > %d\n",Mod_id,MAX_IF_MODULES);
|
||||
|
||||
LOG_D(PHY,"Installing callbacks for IF_Module - UL_indication\n");
|
||||
|
||||
if (if_inst[Mod_id]==NULL) {
|
||||
if_inst[Mod_id] = (IF_Module_t*)malloc(sizeof(IF_Module_t));
|
||||
memset((void*)if_inst[Mod_id],0,sizeof(IF_Module_t));
|
||||
|
||||
|
||||
if_inst[Mod_id]->CC_mask=0;
|
||||
if_inst[Mod_id]->UL_indication = UL_indication;
|
||||
|
||||
AssertFatal(pthread_mutex_init(&if_inst[Mod_id]->if_mutex,NULL)==0,
|
||||
"allocation of if_inst[%d]->if_mutex fails\n",Mod_id);
|
||||
"allocation of if_inst[%d]->if_mutex fails\n",Mod_id);
|
||||
}
|
||||
return if_inst[Mod_id];
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ typedef struct{
|
||||
nfapi_harq_indication_body_t harq_ind;
|
||||
|
||||
/// crc indication list
|
||||
nfapi_crc_indication_body_t crc_ind;
|
||||
nfapi_crc_indication_t crc_ind;
|
||||
|
||||
/// SR indication list
|
||||
nfapi_sr_indication_body_t sr_ind;
|
||||
@@ -84,7 +84,7 @@ typedef struct{
|
||||
nfapi_srs_indication_body_t srs_ind;
|
||||
|
||||
/// RX indication
|
||||
nfapi_rx_indication_body_t rx_ind;
|
||||
nfapi_rx_indication_t rx_ind;
|
||||
|
||||
} UL_IND_t;
|
||||
|
||||
|
||||
@@ -151,20 +151,13 @@ void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe);
|
||||
void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe);
|
||||
#endif
|
||||
|
||||
void oai_subframe_ind(uint16_t frame, uint16_t subframe);
|
||||
extern void oai_subframe_ind(eNB_rxtx_proc_t *proc);
|
||||
extern uint8_t nfapi_pnf;
|
||||
|
||||
static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_name) {
|
||||
|
||||
start_meas(&softmodem_stats_rxtx_sf);
|
||||
|
||||
if (nfapi_pnf)
|
||||
{
|
||||
oai_subframe_ind(proc->frame_tx, proc->subframe_tx); // PNF ---> P7:subframe_ind --> VNF
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
// *******************************************************************
|
||||
|
||||
// ****************************************
|
||||
@@ -174,32 +167,59 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
|
||||
|
||||
// if this is IF5 or 3GPP_eNB
|
||||
if (eNB && eNB->RU_list && eNB->RU_list[0] && eNB->RU_list[0]->function < NGFI_RAU_IF4p5) {
|
||||
LOG_D(PHY,"%s:%s() %u/%u Before wakeup_prach_eNB() proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
//LOG_D(PHY,"%s:%s() %u/%u Before wakeup_prach_eNB() proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
wakeup_prach_eNB(eNB,NULL,proc->frame_rx,proc->subframe_rx);
|
||||
LOG_D(PHY,"%s:%s() %u/%u Before wakeup_prach_eNB_br() proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
//LOG_D(PHY,"%s:%s() %u/%u Before wakeup_prach_eNB_br() proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
#ifdef Rel14
|
||||
wakeup_prach_eNB_br(eNB,NULL,proc->frame_rx,proc->subframe_rx);
|
||||
LOG_D(PHY,"%s:%s() %u/%u proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
//LOG_D(PHY,"%s:%s() %u/%u proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
#endif
|
||||
}
|
||||
|
||||
LOG_D(PHY, "SFN/SF proc:%d/%d rx_ind:%d/%d [num_pdus:%d]\n", NFAPI_SFNSF2SFN(eNB->UL_INFO.rx_ind.sfn_sf), NFAPI_SFNSF2SF(eNB->UL_INFO.rx_ind.sfn_sf), proc->frame_rx, proc->subframe_rx, eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus);
|
||||
|
||||
if (eNB->UL_INFO.rx_ind.sfn_sf == (proc->frame_rx<<4|proc->subframe_rx) && eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus>0)
|
||||
{
|
||||
// Fix me here, these should be locked
|
||||
for (int i=0; i<eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus; i++)
|
||||
{
|
||||
LOG_E(PHY, "SFN/SF:%d/%d eNB->UL_INFO.rx_ind.number_of_pdus:%d Resetting!\n", proc->frame_rx, proc->subframe_rx, eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus);
|
||||
LOG_E(PHY, "NOT ZERO ING RX INDs\n\n\n\n\n\n\n");
|
||||
//eNB->UL_INFO.rx_ind[proc->subframe_rx&1].number_of_pdus = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (eNB->UL_INFO.crc_ind.sfn_sf == (proc->frame_rx<<4|proc->subframe_rx))
|
||||
{
|
||||
for (int i=0; i<eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs; i++)
|
||||
{
|
||||
LOG_E(PHY, "SFN/SF:%d/%d eNB->UL_INFO.crc_ind.number_of_crcs:%d Resetting!\n", proc->frame_rx, proc->subframe_rx, eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs);
|
||||
LOG_E(PHY, "NOT ZERO ING CRCs\n\n\n\n\n\n\n");
|
||||
//eNB->UL_INFO.crc_ind.number_of_crcs = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (nfapi_pnf)
|
||||
{
|
||||
oai_subframe_ind(proc); // PNF ---> P7:subframe_ind --> VNF
|
||||
//LOG_E(PHY, "Returned from oai_subframe_ind()\n");
|
||||
LOG_D(PHY, "UL_info[rx_ind:%d number_of_harqs:%d number_of_crcs:%d number_of_cqis:%d number_of_preambles:%d]\n", eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus, eNB->UL_INFO.harq_ind.number_of_harqs, eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs, eNB->UL_INFO.cqi_ind.number_of_cqis, eNB->UL_INFO.rach_ind.number_of_preambles);
|
||||
}
|
||||
|
||||
// UE-specific RX processing for subframe n
|
||||
LOG_D(PHY,"%s:%s() %u/%u Before phy_procedures_eNB_uespec_RX() proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
phy_procedures_eNB_uespec_RX(eNB, proc, no_relay );
|
||||
|
||||
|
||||
LOG_D(PHY,"%s:%s() %u/%u Before UL_INFO_mutex proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
||||
LOG_D(PHY,"%s:%s() %u/%u After UL_INFO_mutex proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
|
||||
eNB->UL_INFO.frame = proc->frame_rx;
|
||||
eNB->UL_INFO.subframe = proc->subframe_rx;
|
||||
eNB->UL_INFO.module_id = eNB->Mod_id;
|
||||
eNB->UL_INFO.CC_id = eNB->CC_id;
|
||||
LOG_D(PHY,"%s:%s() %u/%u Before UL_ind proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
|
||||
eNB->if_inst->UL_indication(&eNB->UL_INFO);
|
||||
LOG_D(PHY,"%s:%s() %u/%u After UL_ind proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
|
||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||
LOG_D(PHY,"%s:%s() %u/%u After UL_INFO_mutex unlock proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
|
||||
// *****************************************
|
||||
// TX processing for subframe n+4
|
||||
// run PHY TX procedures the one after the other for all CCs to avoid race conditions
|
||||
@@ -207,19 +227,9 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
|
||||
// *****************************************
|
||||
//if (wait_CCs(proc)<0) return(-1);
|
||||
|
||||
|
||||
|
||||
if (oai_exit) return(-1);
|
||||
|
||||
LOG_D(PHY,"%s:%s() %u/%u Before phy_procedures_eNB_TX() proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
phy_procedures_eNB_TX(eNB, proc, no_relay, NULL, 1);
|
||||
LOG_D(PHY,"%s:%s() %u/%u After phy_procedures_eNB_TX() proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
|
||||
LOG_D(PHY,"%s:%s() %u/%u Before release_thread() proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
|
||||
if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) return(-1);
|
||||
|
||||
LOG_D(PHY,"%s:%s() %u/%u AFTER release_thread() proc->instance_cnt_rxtx:%d\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->instance_cnt_rxtx);
|
||||
|
||||
stop_meas( &softmodem_stats_rxtx_sf );
|
||||
|
||||
@@ -271,6 +281,8 @@ static void* eNB_thread_rxtx( void* param ) {
|
||||
|
||||
LOG_D(PHY,"%s:%s() %u/%u DONE rxtx()\n", thread_name, __FUNCTION__, proc->frame_tx, proc->subframe_tx);
|
||||
|
||||
if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break;
|
||||
|
||||
} // while !oai_exit
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 );
|
||||
@@ -314,8 +326,8 @@ void eNB_top(PHY_VARS_eNB *eNB, int frame_rx, int subframe_rx, char *string)
|
||||
proc->subframe_rx = subframe_rx;
|
||||
|
||||
if (!oai_exit) {
|
||||
LOG_D(PHY,"eNB_top in %p (proc %p, CC_id %d), frame %d, subframe %d, instance_cnt_prach %d\n",
|
||||
(void*)pthread_self(), proc, eNB->CC_id, proc->frame_rx,proc->subframe_rx,proc->instance_cnt_prach);
|
||||
//LOG_D(PHY,"eNB_top in %p (proc %p, CC_id %d), frame %d, subframe %d, instance_cnt_prach %d\n",
|
||||
//(void*)pthread_self(), proc, eNB->CC_id, proc->frame_rx,proc->subframe_rx,proc->instance_cnt_prach);
|
||||
|
||||
T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx));
|
||||
|
||||
@@ -344,9 +356,14 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
|
||||
int i;
|
||||
struct timespec wait;
|
||||
|
||||
LOG_D(PHY,"About to wake RUs\n");
|
||||
|
||||
pthread_mutex_lock(&proc->mutex_RU);
|
||||
LOG_D(PHY,"eNB->num_RU:%d\n", eNB->num_RU);
|
||||
for (i=0;i<eNB->num_RU;i++) {
|
||||
LOG_D(PHY,"eNB->RU_list[%d]:%p\n",i,eNB->RU_list[i]);
|
||||
if (ru == eNB->RU_list[i]) {
|
||||
LOG_D(PHY,"proc->RU_mask:%02x\n", proc->RU_mask);
|
||||
if ((proc->RU_mask&(1<<i)) > 0)
|
||||
LOG_E(PHY,"eNB %d frame %d, subframe %d : previous information from RU %d (num_RU %d,mask %x) has not been served yet!\n",
|
||||
eNB->Mod_id,proc->frame_rx,proc->subframe_rx,ru->idx,eNB->num_RU,proc->RU_mask);
|
||||
@@ -354,6 +371,7 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
|
||||
}
|
||||
}
|
||||
if (proc->RU_mask != (1<<eNB->num_RU)-1) { // not all RUs have provided their information so return
|
||||
LOG_E(PHY,"Not all RUs have provided their info\n");
|
||||
pthread_mutex_unlock(&proc->mutex_RU);
|
||||
return(0);
|
||||
}
|
||||
@@ -389,7 +407,7 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
|
||||
}
|
||||
|
||||
++proc_rxtx->instance_cnt_rxtx;
|
||||
//LOG_D(PHY,"%s() %u/%u Just incremented proc->instance_cnt_rxtx:%d\n", __FUNCTION__, proc_rxtx->frame_tx, proc_rxtx->subframe_tx, proc_rxtx->instance_cnt_rxtx);
|
||||
LOG_D(PHY,"%s() %u/%u Just incremented proc->instance_cnt_rxtx:%d\n", __FUNCTION__, proc_rxtx->frame_tx, proc_rxtx->subframe_tx, proc_rxtx->instance_cnt_rxtx);
|
||||
|
||||
// We have just received and processed the common part of a subframe, say n.
|
||||
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
|
||||
@@ -403,6 +421,8 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
|
||||
proc_rxtx->frame_tx = (proc_rxtx->subframe_rx > 5) ? (proc_rxtx->frame_rx+1)&1023 : proc_rxtx->frame_rx;
|
||||
proc_rxtx->subframe_tx = (proc_rxtx->subframe_rx + 4)%10;
|
||||
|
||||
LOG_D(PHY,"Signal &proc_rxtx->cond_rxtx\n");
|
||||
|
||||
// the thread can now be woken up
|
||||
if (pthread_cond_signal(&proc_rxtx->cond_rxtx) != 0) {
|
||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n");
|
||||
@@ -990,8 +1010,7 @@ void init_eNB_afterRU(void) {
|
||||
RC.ru[ru_id]->wakeup_rxtx = wakeup_rxtx;
|
||||
RC.ru[ru_id]->wakeup_prach_eNB = wakeup_prach_eNB;
|
||||
RC.ru[ru_id]->wakeup_prach_eNB_br = wakeup_prach_eNB_br;
|
||||
if (nfapi_pnf!=1)
|
||||
RC.ru[ru_id]->eNB_top = eNB_top;
|
||||
RC.ru[ru_id]->eNB_top = eNB_top;
|
||||
}
|
||||
|
||||
LOG_I(PHY,"%s() Exitting\n", __FUNCTION__);
|
||||
@@ -1033,8 +1052,8 @@ void init_eNB(int single_thread_flag,int wait_for_sync) {
|
||||
memset((void*)&eNB->UL_INFO,0,sizeof(eNB->UL_INFO));
|
||||
memset((void*)&eNB->Sched_INFO,0,sizeof(eNB->Sched_INFO));
|
||||
LOG_I(PHY,"Setting indication lists\n");
|
||||
eNB->UL_INFO.rx_ind.rx_pdu_list = eNB->rx_pdu_list;
|
||||
eNB->UL_INFO.crc_ind.crc_pdu_list = eNB->crc_pdu_list;
|
||||
eNB->UL_INFO.rx_ind.rx_indication_body.rx_pdu_list = eNB->rx_pdu_list;
|
||||
eNB->UL_INFO.crc_ind.crc_indication_body.crc_pdu_list = eNB->crc_pdu_list;
|
||||
eNB->UL_INFO.sr_ind.sr_pdu_list = eNB->sr_pdu_list;
|
||||
eNB->UL_INFO.harq_ind.harq_pdu_list = eNB->harq_pdu_list;
|
||||
eNB->UL_INFO.cqi_ind.cqi_pdu_list = eNB->cqi_pdu_list;
|
||||
|
||||
@@ -1185,21 +1185,29 @@ void wakeup_eNBs(RU_t *ru) {
|
||||
int i;
|
||||
PHY_VARS_eNB **eNB_list = ru->eNB_list;
|
||||
|
||||
//LOG_D(PHY,"wakeup_eNBs (num %d) for RU %d\n",ru->num_eNB,ru->idx);
|
||||
//LOG_D(PHY,"wakeup_eNBs (num %d) for RU %d ru->eNB_top:%p\n",ru->num_eNB,ru->idx, ru->eNB_top);
|
||||
|
||||
if (ru->num_eNB==1 && ru->eNB_top!=0) {
|
||||
// call eNB function directly
|
||||
|
||||
char string[20];
|
||||
sprintf(string,"Incoming RU %d",ru->idx);
|
||||
//LOG_D(PHY,"RU %d Waking up eNB\n",ru->idx);
|
||||
//LOG_D(PHY,"RU %d Call eNB_top\n",ru->idx);
|
||||
ru->eNB_top(eNB_list[0],ru->proc.frame_rx,ru->proc.subframe_rx,string);
|
||||
}
|
||||
else {
|
||||
|
||||
LOG_D(PHY,"ru->num_eNB:%d\n", ru->num_eNB);
|
||||
|
||||
for (i=0;i<ru->num_eNB;i++)
|
||||
{
|
||||
LOG_D(PHY,"ru->wakeup_rxtx:%p\n", ru->wakeup_rxtx);
|
||||
|
||||
if (ru->wakeup_rxtx!=0 && ru->wakeup_rxtx(eNB_list[i],ru) < 0)
|
||||
{
|
||||
LOG_E(PHY,"could not wakeup eNB rxtx process for subframe %d\n", ru->proc.subframe_rx);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1263,8 +1271,6 @@ static inline int wakeup_prach_ru_br(RU_t *ru) {
|
||||
}
|
||||
#endif
|
||||
|
||||
void oai_subframe_ind(uint16_t frame, uint16_t subframe);
|
||||
|
||||
// this is for RU with local RF unit
|
||||
void fill_rf_config(RU_t *ru, char *rf_config_file) {
|
||||
|
||||
@@ -1495,9 +1501,14 @@ static void* ru_thread( void* param ) {
|
||||
if (ru->fh_south_in) ru->fh_south_in(ru,&frame,&subframe);
|
||||
else AssertFatal(1==0, "No fronthaul interface at south port");
|
||||
|
||||
//LOG_D(PHY,"AFTER fh_south_in - SFN/SF(RX):%d/%d (TX):%d/%d proc:%p ru->proc:%p\n",frame,subframe,proc->frame_tx,proc->subframe_tx,proc,&ru->proc);
|
||||
|
||||
oai_subframe_ind(proc->frame_tx, proc->subframe_tx);
|
||||
LOG_D(PHY,"AFTER fh_south_in - SFN/SF:%d/%d RX:%d/%d TX:%d/%d RC.eNB[0][0]:[RX:%d/%d TX(SFN):%d] eNB:%p RU:eNB:%p proc:%p ru->proc:%p\n",
|
||||
frame,subframe,
|
||||
proc->frame_rx,proc->subframe_rx,
|
||||
proc->frame_tx,proc->subframe_tx,
|
||||
RC.eNB[0][0]->proc.frame_rx,RC.eNB[0][0]->proc.subframe_rx,
|
||||
RC.eNB[0][0]->proc.frame_tx,
|
||||
RC.eNB[0][0], ru->eNB_list[0],
|
||||
proc,&ru->proc);
|
||||
|
||||
if (0 && is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx))
|
||||
LOG_D(PHY,"RU thread (do_prach %d, is_prach_subframe %d), received frame %d, subframe %d\n",
|
||||
@@ -1526,13 +1537,14 @@ static void* ru_thread( void* param ) {
|
||||
// If this proc is to provide synchronization, do so
|
||||
wakeup_slaves(proc);
|
||||
|
||||
//LOG_E(PHY,"RU %d/%d frame_tx %d, subframe_tx %d\n",0,ru->idx,proc->frame_tx,proc->subframe_tx);
|
||||
//LOG_E(PHY,"RU %d/%d frame_tx %d, subframe_tx %d - wakeup_eNBs...\n",0,ru->idx,proc->frame_tx,proc->subframe_tx);
|
||||
// wakeup all eNB processes waiting for this RU
|
||||
if (ru->num_eNB>0) wakeup_eNBs(ru);
|
||||
|
||||
//LOG_E(PHY,"%s() Before wait_on_condition()\n", __FUNCTION__);
|
||||
// wait until eNBs are finished subframe RX n and TX n+4
|
||||
wait_on_condition(&proc->mutex_eNBs,&proc->cond_eNBs,&proc->instance_cnt_eNBs,"ru_thread");
|
||||
|
||||
//LOG_E(PHY,"%s() AFTER wait_on_condition() ru->feptx_prec:%p ru->fh_north_asynch_in:%p ru->feptx_ofdm:%p ru->fh_south_out:%p ru->fh_north_out:%p\n",
|
||||
//__FUNCTION__, ru->feptx_prec, ru->fh_north_asynch_in, ru->feptx_ofdm, ru->fh_south_out, ru->fh_north_out);
|
||||
|
||||
@@ -2034,7 +2046,7 @@ LOG_E(PHY,"ru->if_south:%d\n", ru->if_south);
|
||||
malloc_IF4p5_buffer(ru);
|
||||
}
|
||||
else if (ru->function == eNodeB_3GPP) {
|
||||
ru->do_prach = 1; // no prach processing in RU
|
||||
ru->do_prach = 0; // no prach processing in RU
|
||||
ru->feprx = fep_full; // RX DFTs
|
||||
ru->feptx_ofdm = feptx_ofdm; // this is fep with idft and precoding
|
||||
ru->feptx_prec = feptx_prec; // this is fep with idft and precoding
|
||||
|
||||
@@ -846,7 +846,7 @@ void init_openair0() {
|
||||
|
||||
void wait_RUs(void) {
|
||||
|
||||
LOG_I(PHY,"Waiting for RUs to be configured ... RC.ru_mask:%02x\n", RC.ru_mask);
|
||||
LOG_I(PHY,"Waiting for RUs to be configured ... RC.ru_mask:%02lx\n", RC.ru_mask);
|
||||
|
||||
// wait for all RUs to be configured over fronthaul
|
||||
pthread_mutex_lock(&RC.ru_mutex);
|
||||
@@ -855,7 +855,7 @@ void wait_RUs(void) {
|
||||
|
||||
while (RC.ru_mask>0) {
|
||||
pthread_cond_wait(&RC.ru_cond,&RC.ru_mutex);
|
||||
printf("RC.ru_mask:%02x\n", RC.ru_mask);
|
||||
printf("RC.ru_mask:%02lx\n", RC.ru_mask);
|
||||
}
|
||||
|
||||
LOG_I(PHY,"RUs configured\n");
|
||||
|
||||
Reference in New Issue
Block a user