diff --git a/nfapi/nfapi_pnf.c b/nfapi/nfapi_pnf.c index 17a1c0ee68d26896a48b8425334053e584dc5e65..953e6349d6664c9ec2f2b83b1885190c573de80a 100644 --- a/nfapi/nfapi_pnf.c +++ b/nfapi/nfapi_pnf.c @@ -22,12 +22,20 @@ extern RAN_CONTEXT_t RC; #include <vendor_ext.h> #include "fapi_stub.h" +#include "UTIL/LOG/log.h" #define NUM_P5_PHY 2 extern void phy_init_RU(RU_t*); -extern int mac_top_init_eNB(void); +extern int config_sync_var; +extern pthread_cond_t nfapi_sync_cond; +extern pthread_mutex_t nfapi_sync_mutex; +extern int nfapi_sync_var; + +extern int sync_var; + +extern void init_eNB_afterRU(void); uint16_t phy_antenna_capability_values[] = { 1, 2, 4, 8, 16 }; @@ -216,12 +224,45 @@ typedef struct }pnf_phy_user_data_t; -void pnf_sim_trace(nfapi_trace_level_t level, const char* message, ...) +extern void nfapi_log(char *file, char *func, int line, int comp, int level, const char* format, va_list args); + +void pnf_nfapi_trace(nfapi_trace_level_t nfapi_level, const char* message, ...) { - va_list args; +#if 0 + + va_list args; + int oai_level; + + if (nfapi_level==NFAPI_TRACE_ERROR) + { + oai_level = LOG_ERR; + } + else if (nfapi_level==NFAPI_TRACE_WARN) + { + oai_level = LOG_WARNING; + } + else if (nfapi_level==NFAPI_TRACE_NOTE) + { + oai_level = LOG_INFO; + } + else if (nfapi_level==NFAPI_TRACE_INFO) + { + oai_level = LOG_INFO; + } + else + { + oai_level = LOG_INFO; + } + + va_start(args, message); + nfapi_log("FILE>", "FUNC", 999, PHY, oai_level, message, args); + va_end(args); + #else + va_list args; va_start(args, message); vprintf(message, args); va_end(args); + #endif } void pnf_set_thread_priority(int priority) @@ -882,20 +923,105 @@ int pnf_phy_hi_dci0_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_hi_dci0_request_t* return 0; } -nfapi_dl_config_request_pdu_t* dlsch_pdu[1023][10]; +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 - if (NFAPI_SFNSF2SF(req->sfn_sf)==5) - printf("[PNF] dl config request sfn_sf:%d(%d) pdcch:%u dci:%u pdu:%d pdsch_rnti:%d pcfich:%u\n", - req->sfn_sf, +#if 0 +if (NFAPI_SFNSF2SF(req->sfn_sf)==5) + printf("[PNF] dl config request sfn_sf:%d pdcch:%u dci:%u pdu:%d pdsch_rnti:%d pcfich:%u RC.ru:%p RC.eNB:%p sync_var:%d\n", NFAPI_SFNSF2DEC(req->sfn_sf), req->dl_config_request_body.number_pdcch_ofdm_symbols, req->dl_config_request_body.number_dci, req->dl_config_request_body.number_pdu, req->dl_config_request_body.number_pdsch_rnti, - req->dl_config_request_body.transmission_power_pcfich + req->dl_config_request_body.transmission_power_pcfich, + RC.ru, + RC.eNB, + sync_var ); #endif @@ -914,9 +1040,10 @@ int pnf_phy_dl_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_dl_config_request return -3; } - 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); @@ -925,39 +1052,95 @@ int pnf_phy_dl_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_dl_config_request struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0]; eNB_rxtx_proc_t *proc = &eNB->proc.proc_rxtx[0]; nfapi_dl_config_request_pdu_t* dl_config_pdu_list = req->dl_config_request_body.dl_config_pdu_list; - int total_number_of_pdus = req->dl_config_request_body.number_pdu; + 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; - eNB->pdcch_vars[sf&1].num_pdcch_symbols = req->dl_config_request_body.number_pdcch_ofdm_symbols; - eNB->pdcch_vars[sf&1].num_dci = 0; + 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); + //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); - for (int i=0;i<total_number_of_pdus;i++) + for (int i=0;i<req->dl_config_request_body.number_pdu;i++) { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PDU[%d]:\n", __FUNCTION__, i); + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sfn/sf:%d PDU[%d] size:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), i, dl_config_pdu_list[i].pdu_size); if (dl_config_pdu_list[i].pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE) { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DCI:\n", __FUNCTION__); + 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]); - eNB->pdcch_vars[sf&1].num_dci++; // Is actually number of DCI PDUs + //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 } else if (dl_config_pdu_list[i].pdu_type == NFAPI_DL_CONFIG_BCH_PDU_TYPE) { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH:\n", __FUNCTION__); + nfapi_dl_config_bch_pdu *bch_pdu = &dl_config_pdu_list[i].bch_pdu; + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH: pdu_index:%u\n", __FUNCTION__, bch_pdu->bch_pdu_rel8.pdu_index); + + 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]; + + eNB->pbch_configured=1; + + if (0 && NFAPI_SFNSF2DEC(req->sfn_sf) % 500 == 0) + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() [PDU:%u] len:%u pdu_index:%u segment[0]_length:%u pbch_sdu:%x %x %x\n", + __FUNCTION__, i, + 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]); } else if (dl_config_pdu_list[i].pdu_type == NFAPI_DL_CONFIG_DLSCH_PDU_TYPE) { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DLSCH:\n", __FUNCTION__); + 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; +#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 - dlsch_pdu[sfn][sf] = &dl_config_pdu_list[i]; + handle_nfapi_dlsch_pdu( + eNB, + &eNB->proc.proc_rxtx[0], + &dl_config_pdu_list[i], + rel8_pdu->transport_blocks-1, + dlsch_sdu); } else { @@ -965,191 +1148,33 @@ int pnf_phy_dl_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_dl_config_request } } + nfapi_procedures(eNB, sfn, sf); + if(req->vendor_extension) free(req->vendor_extension); return 0; } - -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); - -//int __attribute__((optimize("O0"))) pnf_phy_tx_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_tx_request_t* req) int pnf_phy_tx_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_tx_request_t* req) { - if (RC.ru == 0) - { - return -1; - } + uint16_t sfn = NFAPI_SFNSF2SFN(req->sfn_sf); + uint16_t sf = NFAPI_SFNSF2SF(req->sfn_sf); - if (RC.eNB == 0) - { - return -2; - } - - if (RC.eNB[0][0] == 0) - { - return -3; - } - - if (RC.eNB[0][0] == 0) + if (req->tx_request_body.tl.tag==NFAPI_TX_REQUEST_BODY_TAG) { - return -3; - } - - { - uint16_t sfn = NFAPI_SFNSF2SFN(req->sfn_sf); - uint16_t sf = NFAPI_SFNSF2SF(req->sfn_sf); - LTE_DL_FRAME_PARMS *fp = &RC.ru[0]->frame_parms; - int ONE_SUBFRAME_OF_SAMPLES = fp->ofdm_symbol_size*fp->symbols_per_tti; - //int ONE_SUBFRAME_OF_SAMPLES = fp->symbols_per_tti; - //int ONE_SUBFRAME_OF_SAMPLES = fp->ofdm_symbol_size*fp->symbols_per_tti*sizeof(int32_t); - int offset = sf * ONE_SUBFRAME_OF_SAMPLES; - struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0]; - - //DJP - the proc does not seem to be getting filled - so let fill it - - eNB->proc.proc_rxtx[0].frame_tx = sfn; - eNB->proc.proc_rxtx[0].subframe_tx = sf; - - // 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; - } - - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sfn_sf:%u pdus:%u\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), req->tx_request_body.number_of_pdus); - - for(int i = 0; i < req->tx_request_body.number_of_pdus; ++i) - { - // DJP - TODO FIXME - work out if BCH (common_var)s or DLSCH (common.txdata) - - for(int j=0; j < req->tx_request_body.tx_pdu_list[i].num_segments; ++j) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sfn_sf:%u pdu[%d] segment:%u segment_length:%u\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), i, j, req->tx_request_body.tx_pdu_list[i].segments[j].segment_length); - - // DJP - hack - assume tx_req segment of length 3 = bch - if (req->tx_request_body.tx_pdu_list[i].segments[0].segment_length == 3) - { - eNB->pbch_pdu[2] = req->tx_request_body.tx_pdu_list[i].segments[j].segment_data[0]; - eNB->pbch_pdu[1] = req->tx_request_body.tx_pdu_list[i].segments[j].segment_data[1]; - eNB->pbch_pdu[0] = req->tx_request_body.tx_pdu_list[i].segments[j].segment_data[2]; - - eNB->pbch_configured=1; - - if ( - 1 - //&& NFAPI_SFNSF2DEC(req->sfn_sf) % 500 == 0 - ) - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() [PDU:%u] len:%u pdu_index:%u num_segments:%u segment[0]_length:%u pbch_pdu:%x %x %x\n", - __FUNCTION__, i, req->tx_request_body.tx_pdu_list[i].pdu_length, req->tx_request_body.tx_pdu_list[i].pdu_index, req->tx_request_body.tx_pdu_list[i].num_segments, - req->tx_request_body.tx_pdu_list[i].segments[0].segment_length, - eNB->pbch_pdu[0], - eNB->pbch_pdu[1], - eNB->pbch_pdu[2]); - - } - else - { - // Not bch - handle_nfapi_dlsch_pdu( - eNB, - &eNB->proc.proc_rxtx[0], - dlsch_pdu[sfn][sf], - dlsch_pdu[sfn][sf]->dlsch_pdu.dlsch_pdu_rel8.transport_blocks-1, - req->tx_request_body.tx_pdu_list[dlsch_pdu[sfn][sf]->dlsch_pdu.dlsch_pdu_rel8.pdu_index].segments[0].segment_data - ); - } - } - } - - common_signal_procedures(eNB, sfn, sf); - - if (eNB->pdcch_vars[sf&1].num_dci > 0) + for (int i=0; i<req->tx_request_body.number_of_pdus; i++) { - LOG_E(PHY,"SFN/SF:%d/%d eNB->pdcch_vars[sf&1].num_dci:%d num_pdcch_symbols:%d\n", sfn, sf, eNB->pdcch_vars[sf&1].num_dci, eNB->pdcch_vars[sf&1].num_pdcch_symbols); - } - - generate_dci_top( - eNB->pdcch_vars[sf&1].num_pdcch_symbols, - eNB->pdcch_vars[sf&1].num_dci, - &eNB->pdcch_vars[sf&1].dci_alloc[0], - 0, - AMP, - fp, - eNB->common_vars.txdataF, - sf); - -#if 1 - // 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_E(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; - } - } -#endif - - if (0 && NFAPI_SFNSF2DEC(req->sfn_sf) % 500 == 0) - { - int32_t *txdataF = eNB->common_vars.txdataF[0]; - - char *buf = malloc(fp->ofdm_symbol_size * fp->symbols_per_tti * 3); - char *pbuf = buf; - - for (int i=0;i<10;i++) - { - buf[0]='\0'; - pbuf = buf; - - for (int j=0;j<fp->ofdm_symbol_size;j++) - { - for (int k=0;k<fp->symbols_per_tti;k++) - { - pbuf += sprintf(pbuf, "%2x ", txdataF[(i*fp->symbols_per_tti)+j]); - } - } - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s", buf); - - } - free(buf); + LOG_D(PHY,"%s() SFN/SF:%d/%d [PDU:%d] pdu_length:%d pdu_index:%d num_segments:%d\n", + __FUNCTION__, + sfn, sf, + i, + req->tx_request_body.tx_pdu_list[i].pdu_length, + req->tx_request_body.tx_pdu_list[i].pdu_index, + req->tx_request_body.tx_pdu_list[i].num_segments + ); + + tx_request_pdu[sfn][sf][i] = &req->tx_request_body.tx_pdu_list[i]; } } @@ -1256,6 +1281,11 @@ int pnf_sim_pack_vendor_extention_tlv(void* ve, uint8_t **ppWritePackedMsg, uint return -1; } +nfapi_dl_config_request_t dummy_dl_config_req; +nfapi_tx_request_t dummy_tx_req; + +nfapi_pnf_p7_subframe_buffer_t dummy_subframe; + int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_start_request_t* req) { printf("[PNF] Received NFAPI_START_REQ phy_id:%d\n", req->header.phy_id); @@ -1292,7 +1322,7 @@ int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi p7_config->codec_config.allocate = &pnf_allocate; p7_config->codec_config.deallocate = &pnf_deallocate; - p7_config->trace = &pnf_sim_trace; + p7_config->trace = &pnf_nfapi_trace; phy->user_data = p7_config; @@ -1314,6 +1344,28 @@ int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi p7_config->tx_req = &pnf_phy_tx_req; p7_config->lbt_dl_config_req = &pnf_phy_lbt_dl_config_req; + memset(&dummy_dl_config_req, 0, sizeof(dummy_dl_config_req)); + dummy_dl_config_req.dl_config_request_body.tl.tag=NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + dummy_dl_config_req.dl_config_request_body.number_pdcch_ofdm_symbols=1; + dummy_dl_config_req.dl_config_request_body.number_dci=0; + dummy_dl_config_req.dl_config_request_body.number_pdu=0; + dummy_dl_config_req.dl_config_request_body.number_pdsch_rnti=0; + dummy_dl_config_req.dl_config_request_body.transmission_power_pcfich=6000; + dummy_dl_config_req.dl_config_request_body.dl_config_pdu_list=0; + + memset(&dummy_tx_req, 0, sizeof(dummy_tx_req)); + dummy_tx_req.tx_request_body.number_of_pdus=0; + dummy_tx_req.tx_request_body.tl.tag=NFAPI_TX_REQUEST_BODY_TAG; + + dummy_subframe.dl_config_req = &dummy_dl_config_req; + dummy_subframe.tx_req = 0;//&dummy_tx_req; + + dummy_subframe.ul_config_req=0; + dummy_subframe.hi_dci0_req=0; + dummy_subframe.lbt_dl_config_req=0; + + p7_config->dummy_subframe = dummy_subframe; + p7_config->vendor_ext = &pnf_phy_vendor_ext; p7_config->allocate_p7_vendor_ext = &pnf_phy_allocate_p7_vendor_ext; @@ -1336,25 +1388,28 @@ int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] DJP - HACK - Set p7_config global ready for subframe ind%s\n", __FUNCTION__); p7_config_g = p7_config; - // DJP - INIT PHY RELATED STUFF - this should be separate i think but is not currently... - // Taken mostly from init_eNB_afterRU() dont think i can call it though... + // Need to wait for main thread to create RU structures + while(config_sync_var<0) { - printf("[PNF] %s() Calling phy_init_lte_eNB() and setting nb_antennas_rx = 1\n", __FUNCTION__); - printf("[PNF] %s() TBD create frame_parms from NFAPI message\n", __FUNCTION__); - - phy_init_lte_eNB(RC.eNB[0][0],0,0); - //RC.eNB[0][0]->frame_parms.nb_antennas_rx = 1; - for (int ce_level=0;ce_level<4;ce_level++) - RC.eNB[0][0]->prach_vars.rxsigF[ce_level] = (int16_t**)malloc16(64*sizeof(int16_t*)); -#ifdef Rel14 - for (int ce_level=0;ce_level<4;ce_level++) - RC.eNB[0][0]->prach_vars_br.rxsigF[ce_level] = (int16_t**)malloc16(64*sizeof(int16_t*)); -#endif - init_transport(RC.eNB[0][0]); - //DJP - this crashes because RC.nb_RU is 1 but RC.ru[0] is NULL - init_precoding_weights(RC.eNB[0][0]); + usleep(5000000); + printf("[PNF] waiting for OAI to be configured (eNB/RU)\n"); + } + printf("[PNF] OAI eNB/RU configured\n"); + + printf("[PNF] About to call init_eNB_afterRU()\n"); + init_eNB_afterRU(); - printf("[PNF] Calling mac_top_init_eNB() so that RC.mac[] is init\n"); - mac_top_init_eNB(); + printf("[PNF] About to call phy_init_RU()\n"); + phy_init_RU(RC.ru[0]); + + init_eNB_afterRU(); + + // Signal to main thread that it can carry on - otherwise RU will startup too quickly and it is not initialised + { + pthread_mutex_lock(&nfapi_sync_mutex); + nfapi_sync_var=0; + pthread_cond_broadcast(&nfapi_sync_cond); + pthread_mutex_unlock(&nfapi_sync_mutex); } while(sync_var<0) @@ -1363,16 +1418,12 @@ int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi printf("[PNF] waiting for OAI to be started\n"); } - printf("[PNF] RC.nb_inst=1 DJP - this is because phy_init_RU() uses that to index and not RC.num_eNB - why the 2 similar variables?\n"); - RC.nb_inst =1; // DJP - fepc_tx uses num_eNB but phy_init_RU uses nb_inst - printf("[PNF] About to call phy_init_RU()\n"); - phy_init_RU(RC.ru[0]); - printf("[PNF] Sending PNF_START_RESP\n"); nfapi_send_pnf_start_resp(config, p7_config->phy_id); printf("[PNF] Sending first P7 subframe ind\n"); nfapi_pnf_p7_subframe_ind(p7_config, p7_config->phy_id, 0); // DJP - SFN_SF set to zero - correct??? + printf("[PNF] Sent first P7 subframe ind\n"); } return 0; @@ -1681,6 +1732,9 @@ 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(); config->vnf_ip_addr = vnf_ip_addr; @@ -1718,7 +1772,7 @@ void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, config->vendor_ext = &vendor_ext; - config->trace = &pnf_sim_trace; + config->trace = &pnf_nfapi_trace; config->user_data = &pnf; diff --git a/nfapi/nfapi_vnf.c b/nfapi/nfapi_vnf.c index 23b4a6a7226e42499f2fd05d839904f36873dba6..19842dffcd4c533b23efdec0a3d612cef37a0ba4 100644 --- a/nfapi/nfapi_vnf.c +++ b/nfapi/nfapi_vnf.c @@ -1161,9 +1161,12 @@ void vnf_start_thread(void* ptr) } static vnf_info vnf; +extern uint8_t nfapi_pnf; /*------------------------------------------------------------------------------*/ void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) { + nfapi_pnf = 2; + memset(&vnf, 0, sizeof(vnf)); memset(vnf.p7_vnfs, 0, sizeof(vnf.p7_vnfs)); diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 6f398f12ab38b96ab05e5b110f36362a767ad08d..0877c028d336a60a2df60974fe60bb18fe871584 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -72,6 +72,10 @@ int l1_north_init_eNB() { } } } + else + { + LOG_I(PHY,"%s() Not installing PHY callbacks - RC.nb_L1_inst:%d RC.nb_L1_CC:%p RC.eNB:%p\n", __FUNCTION__, RC.nb_L1_inst, RC.nb_L1_CC, RC.eNB); + } return(0); } @@ -1728,13 +1732,13 @@ int phy_init_RU(RU_t *ru) { #endif } - LOG_D(PHY,"[INIT] %s() RC.nb_inst:%d \n", __FUNCTION__, RC.nb_inst); + LOG_E(PHY,"[INIT] %s() RC.nb_inst:%d \n", __FUNCTION__, RC.nb_inst); for (i=0; i<RC.nb_inst; i++) { for (p=0;p<15;p++) { LOG_D(PHY,"[INIT] %s() nb_antenna_ports_eNB:%d \n", __FUNCTION__, ru->eNB_list[i]->frame_parms.nb_antenna_ports_eNB); if (p<ru->eNB_list[i]->frame_parms.nb_antenna_ports_eNB || p==5) { - //LOG_E(PHY,"[INIT] %s() DO BEAM WEIGHTS nb_antenna_ports_eNB:%d nb_tx:%d\n", __FUNCTION__, ru->eNB_list[i]->frame_parms.nb_antenna_ports_eNB, ru->nb_tx); + LOG_D(PHY,"[INIT] %s() DO BEAM WEIGHTS nb_antenna_ports_eNB:%d nb_tx:%d\n", __FUNCTION__, ru->eNB_list[i]->frame_parms.nb_antenna_ports_eNB, ru->nb_tx); ru->beam_weights[i][p] = (int32_t **)malloc16_clear(ru->nb_tx*sizeof(int32_t*)); for (j=0; j<ru->nb_tx; j++) { ru->beam_weights[i][p][j] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); @@ -1838,7 +1842,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, if (i<fp->nb_antenna_ports_eNB || i==5) { common_vars->txdataF[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) ); - LOG_E(PHY,"[INIT] common_vars->txdataF[%d] = %p (%lu bytes)\n", + LOG_D(PHY,"[INIT] common_vars->txdataF[%d] = %p (%lu bytes)\n", i,common_vars->txdataF[i], fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t)); } diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index b9576e9c9d14f3505f58507eb620217956c2b2be..f561680491b4b23362c9fcd4529b4ec3e40212fb 100755 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -2074,6 +2074,11 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols, int Msymb2; int split_flag=0; + if (num_dci>0) + { + LOG_D(PHY,"%s(num_pdcch_symbols:%d num_dci:%d dci_alloc:%p n_rnti:%04x amp:%d frame_parms:%p txdataF:%p subframe:%d)\n", __FUNCTION__, num_pdcch_symbols, num_dci, dci_alloc, n_rnti, amp, frame_parms, txdataF, subframe); + } + switch (frame_parms->N_RB_DL) { case 100: Msymb2 = Msymb; @@ -2148,7 +2153,9 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols, } // Scrambling - // printf("pdcch scrambling\n"); +#ifdef DEBUG_DCI_ENCODING + printf("pdcch scrambling\n"); +#endif pdcch_scrambling(frame_parms, subframe, e, @@ -2232,6 +2239,18 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols, // This is the REG allocation algorithm from 36-211, second part of Section 6.8.5 // printf("DCI (SF %d) : txdataF %p (0 %p)\n",subframe,&txdataF[0][512*14*subframe],&txdataF[0][0]); +#ifdef DEBUG_DCI_ENCODING + printf("kprime loop - N_RB_DL:%d lprime:num_pdcch_symbols:%d Ncp:%d pcfich:%02x,%02x,%02x,%02x ofdm_symbol_size:%d first_carrier_offset:%d nb_antenna_ports_eNB:%d\n", + frame_parms->N_RB_DL, num_pdcch_symbols,frame_parms->Ncp, + frame_parms->pcfich_reg[0], + frame_parms->pcfich_reg[1], + frame_parms->pcfich_reg[2], + frame_parms->pcfich_reg[3], + frame_parms->ofdm_symbol_size, + frame_parms->first_carrier_offset, + frame_parms->nb_antenna_ports_eNB + ); +#endif for (kprime=0; kprime<frame_parms->N_RB_DL*12; kprime++) { for (lprime=0; lprime<num_pdcch_symbols; lprime++) { diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 445b97d2f4397f5e6bc28554224bc4b877d7fbfc..ace04441f3541a63d86cbb510f8e0e719328f53d 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -801,6 +801,29 @@ void generate_RIV_tables() // n_tilde_PRB(0,1) = (0,2) +void check_dlsch(char *file, int line) +{ + PHY_VARS_eNB *eNB = RC.eNB[0][0]; + static char oldbuf[13*NUMBER_OF_UE_MAX+100]=""; + char buf[13*NUMBER_OF_UE_MAX+100]; + char *pbuf=buf; + + for (int i=0; i<NUMBER_OF_UE_MAX; i++) { + pbuf+=sprintf(pbuf, "[%02d]:%02x:%04x ", i, eNB->dlsch[i][0]->harq_mask, eNB->dlsch[i][0]->rnti); + } + + int diff_size = memcmp(oldbuf, buf, strlen(buf)); + + if (diff_size!=0) + { + LOG_I(PHY,"check_dlsch:%s:%d:%s\n", file, line, buf); + LOG_I(PHY,"check_dlsch:%s:%d:%s\n", file, line, oldbuf); + } + + memcpy(oldbuf, buf, sizeof(buf)); + +} + int8_t find_dlsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type) { uint8_t i; @@ -1990,6 +2013,7 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_ computeRhoB_eNB(&eNB->pdsch_config_dedicated[UE_id],&(fp->pdsch_config_common),fp->nb_antenna_ports_eNB,dlsch1,dlsch1_harq->dl_power_off); } + LOG_D(PHY, "%s() dci_length:%d\n", __FUNCTION__, dci_alloc->dci_length); } @@ -4485,7 +4509,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format0 (FDD, 5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n", + LOG_I(PHY,"DCI format0 (FDD, 5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu[0])[0], ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->hopping, diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index 46572c52d69b1b3d54ce071896169e5fb8b26d6f..35a4fce414edcf480775ab736003fdfe0c7978d9 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -38,7 +38,7 @@ #include "defs.h" #include "UTIL/LOG/vcd_signal_dumper.h" -//#define DEBUG_DLSCH_MODULATION +//#define DEBUG_DLSCH_MODULATION 1 //#define is_not_pilot(pilots,re,nushift,use2ndpilots) ((pilots==0) || ((re!=nushift) && (re!=nushift+6)&&((re!=nushift+3)||(use2ndpilots==1))&&((re!=nushift+9)||(use2ndpilots==1)))?1:0) @@ -78,7 +78,7 @@ uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, if ((re!=nushift+offset) && (re!=((nushift+4+offset)%12)) && (re!=((nushift+8+offset)%12))) return(1); /*else{ - printf("(is_no_UEspec_RS):lprime=%d, re=%d, nushift=%d, offset=%d\n",lprime, re,nushift,offset); + LOG_I(PHY,"(is_no_UEspec_RS):lprime=%d, re=%d, nushift=%d, offset=%d\n",lprime, re,nushift,offset); }*/ } else { if ((re!=nushift+offset) && (re!=((nushift+3+offset)%12)) && (re!=((nushift+6+offset)%12)) && (re!=((nushift+9+offset)%12))) @@ -270,7 +270,7 @@ int allocate_REs_in_RB_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB, if (skip_dc == 0) { - // printf("pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]); + // LOG_I(PHY,"pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]); for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; re<12; x0p+=4) { @@ -281,7 +281,7 @@ int allocate_REs_in_RB_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB, qam16_table_offset_im+=x0p[3]; ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; - // printf("pilots: re %d, tti_offset %d, P1_SHIFT %d\n",re,tti_offset,P1_SHIFT[re+1]); + // LOG_I(PHY,"pilots: re %d, tti_offset %d, P1_SHIFT %d\n",re,tti_offset,P1_SHIFT[re+1]); tti_offset+=P1_SHIFT[re+1]; re+=P1_SHIFT[re+1]; } @@ -497,7 +497,7 @@ int allocate_REs_in_RB_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB, if (skip_dc == 0) { - // printf("pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]); + // LOG_I(PHY,"pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]); for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; re<12; x0p+=6) { @@ -510,7 +510,7 @@ int allocate_REs_in_RB_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB, qam64_table_offset_im+=x0p[5]; ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; - // printf("pilots: re %d, tti_offset %d, P1_SHIFT %d\n",re,tti_offset,P1_SHIFT[re+1]); + // LOG_I(PHY,"pilots: re %d, tti_offset %d, P1_SHIFT %d\n",re,tti_offset,P1_SHIFT[re+1]); tti_offset+=P1_SHIFT[re+1]; re+=P1_SHIFT[re+1]; } @@ -667,11 +667,11 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, if (dlsch0_harq != NULL){ #ifdef DEBUG_DLSCH_MODULATION - printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]); + LOG_I(PHY,"allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]); #endif } else{ #ifdef DEBUG_DLSCH_MODULATION - printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]); + LOG_I(PHY,"allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]); #endif } @@ -685,7 +685,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, for (re=first_re; re<last_re; re++) { - // printf("element %d precoder_index for allocation %d\n",re, precoder_index ); + // LOG_I(PHY,"element %d precoder_index for allocation %d\n",re, precoder_index ); if ((skip_dc == 1) && (re==6)) re_off=re_off - frame_parms->ofdm_symbol_size+1; @@ -695,7 +695,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, //check that RE is not from Cell-specific RS if (is_not_pilot(pilots,re,frame_parms->nushift,use2ndpilots)==1) { - //printf("re %d (jj %d)\n",re,*jj); + //LOG_I(PHY,"re %d (jj %d)\n",re,*jj); if (mimo_mode == SISO) { //SISO mapping @@ -705,7 +705,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, case 2: //QPSK - //printf("re %d %d(%d) : %d,%d => ",re,tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //LOG_I(PHY,"re %d %d(%d) : %d,%d => ",re,tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); ((int16_t*)&txdataF[0][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i *jj = *jj + 1; @@ -971,12 +971,12 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, break; case 2: //QPSK - //printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //LOG_I(PHY,"%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); xx0_re = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj = *jj + 1; xx0_im = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj = *jj + 1; - //printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //LOG_I(PHY,"%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); break; case 4: //16QAM @@ -1042,12 +1042,12 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, break; case 2: //QPSK - //printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //LOG_I(PHY,"%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); xx1_re = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj2 = *jj2 + 1; xx1_im = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj2 = *jj2 + 1; - //printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //LOG_I(PHY,"%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); break; case 4: //16QAM @@ -1114,7 +1114,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, ((int16_t *)&txdataF[0][tti_offset])[1]+=((xx0_im+xx1_im)>>1); ((int16_t *)&txdataF[1][tti_offset])[1]+=(s*((xx0_im-xx1_im)>>1)); /* - printf("CDD: xx0 (%d,%d), xx1(%d,%d), s(%d), txF[0] (%d,%d), txF[1] (%d,%d)\n", + LOG_I(PHY,"CDD: xx0 (%d,%d), xx1(%d,%d), s(%d), txF[0] (%d,%d), txF[1] (%d,%d)\n", xx0_re,xx0_im,xx1_re,xx1_im, s, ((int16_t *)&txdataF[0][tti_offset])[0],((int16_t *)&txdataF[0][tti_offset])[1], ((int16_t *)&txdataF[1][tti_offset])[0],((int16_t *)&txdataF[1][tti_offset])[1]); */ @@ -1244,7 +1244,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, precoder_index1 = 3; //[1 -j] } else { - printf("problem with precoder in TM4\n"); + LOG_I(PHY,"problem with precoder in TM4\n"); return(-1); } @@ -1263,7 +1263,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); ((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15); - //printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //LOG_I(PHY,"%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); if (frame_parms->nb_antenna_ports_eNB == 2) { layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index0); @@ -1466,7 +1466,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, ((int16_t*)&txdataF[5][tti_offset])[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj = *jj + 1; - //printf("%d(%d) : %d,%d => + //LOG_I(PHY,"%d(%d) : %d,%d => //",tti_offset,*jj,((int16_t*)&tmp_sample1)[0],((int16_t*)&tmp_sample1)[1]); break; @@ -1545,7 +1545,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, } } else { //precoding UE spec RS - //printf("precoding UE spec RS\n"); + //LOG_I(PHY,"precoding UE spec RS\n"); ind = 3*lprime*dlsch0_harq->nb_rb+mprime2; ind_dword = ind>>4; @@ -1563,7 +1563,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, switch (mod_order0) { case 2: //QPSK - // printf("%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + // LOG_I(PHY,"%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); for (int layer=first_layer0; layer<=(first_layer0+Nlayers0); layer++) { ((int16_t*)&txdataF[layer][tti_offset])[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i *jj = *jj + 1; @@ -1651,7 +1651,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, } } } else if (mimo_mode>=TM9_10) { - printf("allocate_REs_in_RB() [dlsch.c] : ERROR, unknown mimo_mode %d\n",mimo_mode); + LOG_I(PHY,"allocate_REs_in_RB() [dlsch.c] : ERROR, unknown mimo_mode %d\n",mimo_mode); return(-1); } } @@ -1686,7 +1686,7 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF, uint8_t first_re,last_re; int inc; #ifdef DEBUG_DLSCH_MODULATION - printf("allocate_re_MCH (mod %d): symbol_offset %d re_offset %d (%d), jj %d -> %d,%d, gain_lin_QPSK %d,txdataF %p\n",mod_order,symbol_offset,re_offset,skip_dc,*jj, x0[*jj], x0[1+*jj],gain_lin_QPSK,&txdataF[0][symbol_offset]); + LOG_I(PHY,"allocate_re_MCH (mod %d): symbol_offset %d re_offset %d (%d), jj %d -> %d,%d, gain_lin_QPSK %d,txdataF %p\n",mod_order,symbol_offset,re_offset,skip_dc,*jj, x0[*jj], x0[1+*jj],gain_lin_QPSK,&txdataF[0][symbol_offset]); #endif last_re=12; @@ -1707,7 +1707,7 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF, tti_offset = symbol_offset + re_off + re; - //printf("re %d (jj %d)\n",re,*jj); + //LOG_I(PHY,"re %d (jj %d)\n",re,*jj); *re_allocated = *re_allocated + 1; @@ -1715,7 +1715,7 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF, case 2: //QPSK - // printf("%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + // LOG_I(PHY,"%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); ((int16_t*)&txdataF[4][tti_offset])[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i *jj = *jj + 1; @@ -1724,7 +1724,7 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF, *jj = *jj + 1; - //printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //LOG_I(PHY,"%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); break; @@ -1931,7 +1931,7 @@ inline int check_skip(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms inline int check_skiphalf(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) __attribute__((always_inline)); inline int check_skiphalf(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) { - // printf("check_skiphalf : rb %d, subframe_offset %d,l %d, nsymb %d\n",rb,subframe_offset,l,nsymb); + // LOG_I(PHY,"check_skiphalf : rb %d, subframe_offset %d,l %d, nsymb %d\n",rb,subframe_offset,l,nsymb); if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL @@ -2154,19 +2154,19 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, re_allocated=0; - // printf("num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb); + // LOG_I(PHY,"num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb); for (l=num_pdcch_symbols; l<nsymb; l++) { if (dlsch0 != NULL ) { #ifdef DEBUG_DLSCH_MODULATION - printf("Generating DLSCH (harq_pid %d,mimo %d, pmi_alloc0 %lx, mod0 %d, mod1 %d, rb_alloc[0] %d) in %d\n", + LOG_I(PHY,"Generating DLSCH (harq_pid %d,mimo %d, pmi_alloc0 %lx, mod0 %d, mod1 %d, rb_alloc[0] %d)\n", harq_pid, dlsch0_harq->mimo_mode, pmi2hex_2Ar2(dlsch0_harq->pmi_alloc), mod_order0, mod_order1, - rb_alloc[0], - len); + rb_alloc[0] + ); #endif } @@ -2216,6 +2216,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, for (eNB_id=0;eNB_id<ru->num_eNB;eNB_id++){ if (phy_vars_eNB == ru->eNB_list[eNB_id]) { for (aa=0;aa<ru->nb_tx;aa++){ + LOG_I(PHY,"ru_id:%d eNB_id:%d aa:%d memcpy(ru->beam_weights, dlsch0->ue_spec_bf_weights[ru_id][0],)\n", ru_id, eNB_id, aa); memcpy(ru->beam_weights[eNB_id][5][aa], dlsch0->ue_spec_bf_weights[ru_id][0], frame_parms->ofdm_symbol_size*sizeof(int32_t)); @@ -2233,7 +2234,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, if (pilots>0) { // compute pilot arrays, could be done statically if performance suffers if (frame_parms->nb_antenna_ports_eNB == 1) { - // printf("l %d, nushift %d, offset %d\n",l,frame_parms->nushift,offset); + // LOG_I(PHY,"l %d, nushift %d, offset %d\n",l,frame_parms->nushift,offset); for (i=0,i2=0;i<12;i++) { if ((i!=(frame_parms->nushift+offset)) && (i!=((frame_parms->nushift+6+offset)%12))) P1_SHIFT[i2++]=1; @@ -2340,7 +2341,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, //for (aa=0;aa<frame_parms->nb_antennas_tx;aa++) //memset(&txdataF[aa][symbol_offset],0,frame_parms->ofdm_symbol_size<<2); - //printf("symbol_offset %d,subframe offset %d : pilots %d\n",symbol_offset,subframe_offset,pilots); + //LOG_I(PHY,"symbol_offset %d,subframe offset %d : pilots %d\n",symbol_offset,subframe_offset,pilots); for (rb=0; rb<frame_parms->N_RB_DL; rb++) { if (rb < 32) @@ -2371,7 +2372,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, if (dlsch1) { if (dlsch1_harq->Nlayers>1) { - printf("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); + LOG_I(PHY,"Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); return(-1); } } @@ -2379,7 +2380,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, if (rb_alloc_ind > 0) { - // printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj); + // LOG_I(PHY,"Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj); if (dlsch0 != NULL) { get_pmi_temp = get_pmi(frame_parms->N_RB_DL, @@ -2419,7 +2420,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, mprime +=3+frame_parms->Ncp; } else { - // printf("Unallocated rb %d/symbol %d, re_offset %d, jj %d\n",rb,l,re_offset,jj); + // LOG_I(PHY,"Unallocated rb %d/symbol %d, re_offset %d, jj %d\n",rb,l,re_offset,jj); } re_offset+=12; // go to next RB @@ -2436,9 +2437,9 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, #ifdef DEBUG_DLSCH_MODULATION if (dlsch0 != NULL){ - printf("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset)); + LOG_I(PHY,"generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset,1)); }else{ - printf("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch1_harq->nb_rb,dlsch1_harq->rb_alloc,mod_order1,Nl1,2,0,subframe_offset)); + LOG_I(PHY,"generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch1_harq->nb_rb,dlsch1_harq->rb_alloc,mod_order1,Nl1,2,0,subframe_offset,1)); } #endif @@ -2493,7 +2494,7 @@ int dlsch_modulation_SIC(int32_t **sic_buffer, jj = jj + 1; - //printf("recon %d,%d\n",((int16_t*)&sic_buffer[0][i])[0],((int16_t*)&sic_buffer[0][i])[1]); + //LOG_I(PHY,"recon %d,%d\n",((int16_t*)&sic_buffer[0][i])[0],((int16_t*)&sic_buffer[0][i])[1]); i++; break; @@ -2580,7 +2581,7 @@ int dlsch_modulation_SIC(int32_t **sic_buffer, #ifdef DEBUG_DLSCH_MODULATION - printf("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset,1/*transmission mode*/)); + LOG_I(PHY,"generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset,1/*transmission mode*/)); #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_OUT); @@ -2618,11 +2619,11 @@ int mch_modulation(int32_t **txdataF, jj=0; re_allocated=0; - // printf("num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb); + // LOG_I(PHY,"num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb); for (l=2; l<nsymb_pmch; l++) { #ifdef DEBUG_DLSCH_MODULATION - printf("Generating MCH (mod %d) in subframe %d for symbol %d\n",mod_order, subframe_offset,l); + LOG_I(PHY,"Generating MCH (mod %d) in subframe %d for symbol %d\n",mod_order, subframe_offset,l); #endif re_offset = frame_parms->first_carrier_offset; @@ -2647,7 +2648,7 @@ int mch_modulation(int32_t **txdataF, else qam_table_s = NULL; - //printf("Allocated rb %d, subframe_offset %d,amp %d\n",rb,subframe_offset,amp); + //LOG_I(PHY,"Allocated rb %d, subframe_offset %d,amp %d\n",rb,subframe_offset,amp); allocate_REs_in_RB_MCH(txdataF, &jj, re_offset, @@ -2674,7 +2675,7 @@ int mch_modulation(int32_t **txdataF, } #ifdef DEBUG_DLSCH_MODULATION - printf("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->rb_alloc,mod_order,1,2,0,subframe_offset,1/*transmission mode*/)); + LOG_I(PHY,"generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->rb_alloc,mod_order,1,2,0,subframe_offset,1/*transmission mode*/)); #endif return (re_allocated); diff --git a/openair1/PHY/LTE_TRANSPORT/rar_tools.c b/openair1/PHY/LTE_TRANSPORT/rar_tools.c index b62e46244980703ec41a3a9c34fc4b108ad60f5d..2a9f48eb5ea0d658a17748cacb775fd2cc9b8dd8 100644 --- a/openair1/PHY/LTE_TRANSPORT/rar_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/rar_tools.c @@ -185,7 +185,7 @@ int generate_eNB_ulsch_params_from_rar(PHY_VARS_eNB *eNB, LOG_D(PHY,"ulsch ra (eNB): harq_pid %d\n",harq_pid); LOG_D(PHY,"ulsch ra (eNB): round %d\n",ulsch_harq->round); LOG_D(PHY,"ulsch ra (eNB): TBS %d\n",ulsch_harq->TBS); - LOG_D(PHY,"ulsch ra (eNB): mcs %d\n",ulsch_harq->mcs); + LOG_D(PHY,"ulsch ra (eNB): mcs %d\n",ulsch_harq->Msc_initial); LOG_D(PHY,"ulsch ra (eNB): Or1 %d\n",ulsch_harq->Or1); LOG_D(PHY,"ulsch ra (eNB): ORI %d\n",ulsch_harq->O_RI); #endif diff --git a/openair1/SCHED/fapi_l1.c b/openair1/SCHED/fapi_l1.c index acc622c6f54018a85c572c9237d2e5af21d5410d..6aac8d55ca6c2fd11f4b24bd0c627757c0ee785a 100644 --- a/openair1/SCHED/fapi_l1.c +++ b/openair1/SCHED/fapi_l1.c @@ -49,7 +49,7 @@ void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB, LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[idx]; nfapi_dl_config_dci_dl_pdu *pdu = &dl_config_pdu->dci_dl_pdu; - LOG_D(PHY,"Frame %d, Subframe %d: DCI processing\n",proc->frame_tx,proc->subframe_tx); + LOG_D(PHY,"Frame %d, Subframe %d: DCI processing - populating pdcch_vars->dci_alloc[%d] subframe_tx:%d idx:%d pdcch_vars->num_dci:%d\n",proc->frame_tx,proc->subframe_tx, pdcch_vars->num_dci, proc->subframe_tx, idx, pdcch_vars->num_dci); // copy dci configuration into eNB structure fill_dci_and_dlsch(eNB,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci],pdu); @@ -582,6 +582,10 @@ void schedule_response(Sched_Rsp_t *Sched_INFO) { // DJP - AssertFatal(proc->subframe_tx == subframe, "Current subframe %d != NFAPI subframe %d\n",proc->subframe_tx,subframe); // DJP - AssertFatal(proc->subframe_tx == subframe, "Current frame %d != NFAPI frame %d\n",proc->frame_tx,frame); + uint8_t number_dci = DL_req->dl_config_request_body.number_dci; + uint8_t number_pdcch_ofdm_symbols = DL_req->dl_config_request_body.number_pdcch_ofdm_symbols; + + uint8_t number_dl_pdu = DL_req->dl_config_request_body.number_pdu; uint8_t number_hi_dci0_pdu = HI_DCI0_req->hi_dci0_request_body.number_of_dci+HI_DCI0_req->hi_dci0_request_body.number_of_hi; uint8_t number_ul_pdu = UL_req->ul_config_request_body.number_of_pdus; @@ -593,12 +597,14 @@ void schedule_response(Sched_Rsp_t *Sched_INFO) { int i; - eNB->pdcch_vars[subframe&1].num_pdcch_symbols = DL_req->dl_config_request_body.number_pdcch_ofdm_symbols; - eNB->pdcch_vars[subframe&1].num_dci = DL_req->dl_config_request_body.number_dci; + eNB->pdcch_vars[subframe&1].num_pdcch_symbols = number_pdcch_ofdm_symbols; + eNB->pdcch_vars[subframe&1].num_dci = number_dci; eNB->phich_vars[subframe&1].num_hi = 0; - LOG_D(PHY,"NFAPI: Frame %d, Subframe %d: received %d dl_pdu, %d tx_req, %d hi_dci0_config_req, %d UL_config \n", - frame,subframe,number_dl_pdu,TX_req->tx_request_body.number_of_pdus,number_hi_dci0_pdu,number_ul_pdu); + LOG_D(PHY,"NFAPI: Frame %d, Subframe %d: received %d dl_pdu, %d tx_req, %d hi_dci0_config_req, %d UL_config num_pdcch_symbols:%d\n", + frame,subframe,number_dl_pdu,TX_req->tx_request_body.number_of_pdus,number_hi_dci0_pdu,number_ul_pdu, + eNB->pdcch_vars[subframe&1].num_pdcch_symbols + ); int do_oai =0; @@ -623,6 +629,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); do_oai=1; break; case NFAPI_DL_CONFIG_BCH_PDU_TYPE: @@ -643,7 +650,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_E(PHY,"%s() NFAPI_DL_CONFIG_DLSCH_PDU_TYPE TX:%d/%d RX:%d/%d\n", __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->frame_rx, proc->subframe_rx); + 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); AssertFatal(dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index<TX_req->tx_request_body.number_of_pdus, "dlsch_pdu_rel8.pdu_index>=TX_req->number_of_pdus (%d>%d)\n", diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 60b2b006d2163a2ee2ba973b0e94fdea2a11ba02..5376cc6d584f1c0cbc122cc4580a9aef051665d0 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -141,7 +141,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,int frame, int subframe) { int **txdataF = eNB->common_vars.txdataF; uint8_t *pbch_pdu=&eNB->pbch_pdu[0]; - LOG_D(PHY,"common_signal_procedures: frame %d, subframe %d\n",frame,subframe); + LOG_D(PHY,"common_signal_procedures: frame %d, subframe %d fdd:%s dir:%s\n",frame,subframe,fp->frame_type == FDD?"FDD":"TDD", subframe_select(fp,subframe) == SF_DL?"DL":"UL?"); // generate Cell-Specific Reference Signals for both slots VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1); @@ -483,15 +483,20 @@ 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); + generate_dci_top(num_pdcch_symbols, - num_dci, - &eNB->pdcch_vars[subframe&1].dci_alloc[0], - 0, - AMP, - fp, - eNB->common_vars.txdataF, - subframe); - + num_dci, + &eNB->pdcch_vars[subframe&1].dci_alloc[0], + 0, + AMP, + fp, + eNB->common_vars.txdataF, + subframe); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0); @@ -1236,14 +1241,14 @@ void uci_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) } if (SR_payload == 1) { - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",eNB->Mod_id, + LOG_E(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",eNB->Mod_id, uci->rnti,frame,subframe); if (eNB->first_sr[i] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 eNB->first_sr[i] = 0; eNB->dlsch[i][0]->harq_processes[0]->round=0; eNB->dlsch[i][0]->harq_processes[0]->status=SCH_IDLE; - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", + LOG_E(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", eNB->Mod_id, eNB->ulsch[i]->rnti,frame,subframe); } @@ -1582,7 +1587,10 @@ void release_harq(PHY_VARS_eNB *eNB,int UE_id,int tb,uint16_t frame,uint8_t subf if ((dlsch1_harq == NULL)|| ((dlsch1_harq!=NULL)&& (dlsch1_harq->status == SCH_IDLE))) + { dlsch0->harq_mask &= ~(1<<harq_pid); + LOG_I(PHY,"%s() UE_id:%d SFN/SF:%d/%d dlsch0->harq_mask:%02x\n", __FUNCTION__, UE_id, frame, subframe,dlsch0->harq_mask); + } } else { // release all processes in the bundle that was acked, based on mask // This is at most 4 for multiplexing and 9 for bundling/special bundling @@ -1936,7 +1944,3 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const stop_meas(&eNB->phy_proc_rx); } - - - - diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index 2cfc1537110e23905676e2d3381d7f472c4eb951..33f0e526be135e000d82190a6e1eaeca718660fa 100644 --- a/openair2/ENB_APP/enb_app.c +++ b/openair2/ENB_APP/enb_app.c @@ -316,10 +316,14 @@ void *eNB_app_task(void *args_p) itti_mark_task_ready (TASK_ENB_APP); + LOG_I(PHY, "%s() Task ready initialise structures\n", __FUNCTION__); + RCconfig_L1(); RCconfig_macrlc(); + LOG_I(PHY, "%s() RC.nb_L1_inst:%d\n", __FUNCTION__, RC.nb_L1_inst); + if (RC.nb_L1_inst>0) AssertFatal(l1_north_init_eNB()==0,"could not initialize L1 north interface\n"); # if defined(ENABLE_ITTI) @@ -342,9 +346,11 @@ void *eNB_app_task(void *args_p) LOG_I(ENB_APP,"Allocating eNB_RRC_INST for %d instances\n",RC.nb_inst); RC.rrc = (eNB_RRC_INST **)malloc(RC.nb_inst*sizeof(eNB_RRC_INST *)); + LOG_I(PHY, "%s() RC.nb_inst:%d RC.rrc:%p\n", __FUNCTION__, RC.nb_inst, RC.rrc); for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) { RC.rrc[enb_id] = (eNB_RRC_INST*)malloc(sizeof(eNB_RRC_INST)); + LOG_I(PHY, "%s() Creating RRC instance RC.rrc[%d]:%p (%d of %d)\n", __FUNCTION__, enb_id, RC.rrc[enb_id], enb_id+1, enb_id_end); memset((void *)RC.rrc[enb_id],0,sizeof(eNB_RRC_INST)); configure_rrc(enb_id); } diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 591ec5b51fc256bc0f52b8a8c52f8385e3157967..ba431024b377c9d5fb8213ca87c3f63399d7247e 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -720,20 +720,12 @@ void RCconfig_L1(void) { if (RC.eNB == NULL) { RC.eNB = (PHY_VARS_eNB ***)malloc((1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB***)); - LOG_I(PHY,"DJP - have malloced RC.eNB - RC.eNB = %p\n",RC.eNB); + LOG_I(PHY,"RC.eNB:%p\n",RC.eNB); memset(RC.eNB,0,(1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB***)); RC.nb_L1_CC = malloc((1+RC.nb_L1_inst)*sizeof(int)); - printf("%s() RC.eNB:%p - RC.nb_L1_CC:%p\n", __FUNCTION__, RC.eNB, RC.nb_L1_CC); + LOG_I(PHY,"%s() RC.eNB:%p RC.nb_L1_CC:%p\n", __FUNCTION__, RC.eNB, RC.nb_L1_CC); } -#if 0 - if (RC.nb_L1_inst==0) - { - RC.nb_L1_inst = 1; - printf("********\n\n\n*********** DJP - hard coding RC.nb_L1_inst = 1 \n\n\n\n"); - } -#endif - setting = config_lookup(&cfg, CONFIG_STRING_L1_LIST); printf("%s() CONFIG_STRING_L1_LIST setting:%p\n", __FUNCTION__, setting); @@ -754,14 +746,6 @@ void RCconfig_L1(void) { "Failed to parse configuration file %s, L1 %d config !\n", RC.config_file_name, j); } - else - { -#if 0 - RC.nb_L1_CC[j] = 1; - - printf("****DJP - hard coding nb_L1_CC[%d] = 1 *************\n", j, RC.nb_L1_CC[j]); -#endif - } for (i=0;i<RC.nb_L1_CC[j];i++) { if (RC.eNB[j][i] == NULL) { @@ -775,14 +759,14 @@ void RCconfig_L1(void) { printf("l1 %d/%d (nb CC %d)\n",j,RC.nb_inst,RC.nb_L1_CC[j]); - if (setting) + if (setting_l1) { - printf("RU %d: Transport %s\n",j,tr_n_preference); if (!(config_setting_lookup_string(setting_l1, CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE, (const char **)&tr_n_preference))) { AssertFatal (0, "Failed to parse configuration file %s, L1 %d config !\n", RC.config_file_name, j); } + printf("RU %d: Transport %s\n",j,tr_n_preference); if (strcmp(tr_n_preference, "local_mac") == 0) { @@ -810,14 +794,23 @@ void RCconfig_L1(void) { RC.eNB[j][0]->eth_params_n.remote_portc = remote_n_portc; RC.eNB[j][0]->eth_params_n.my_portd = local_n_portd; RC.eNB[j][0]->eth_params_n.remote_portd = remote_n_portd; - RC.eNB[j][0]->eth_params_n.transp_preference = ETH_UDP_MODE; + RC.eNB[j][0]->eth_params_n.transp_preference = ETH_UDP_MODE; configure_nfapi_pnf(RC.eNB[j][0]->eth_params_n.remote_addr, RC.eNB[j][0]->eth_params_n.remote_portc, RC.eNB[j][0]->eth_params_n.my_addr, RC.eNB[j][0]->eth_params_n.my_portd, RC.eNB[j][0]->eth_params_n.remote_portd); - { - extern uint8_t nfapi_pnf; - nfapi_pnf = 1; - } + RC.nb_macrlc_inst = 1; // This is used by mac_top_init_eNB() + + // This is used by init_eNB_afterRU() + RC.nb_CC = (int *)malloc((1+RC.nb_inst)*sizeof(int)); + RC.nb_CC[0]=1; + + RC.nb_inst =1; // DJP - feptx_prec uses num_eNB but phy_init_RU uses nb_inst + + LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_inst=1 this is because phy_init_RU() uses that to index and not RC.num_eNB - why the 2 similar variables?\n", __FUNCTION__); + LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_CC[0]=1 for init_eNB_afterRU()\n", __FUNCTION__, RC.nb_CC[0]); + LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_macrlc_inst:%d because used by mac_top_init_eNB()\n", __FUNCTION__, RC.nb_macrlc_inst); + + mac_top_init_eNB(); } else { // other midhaul } @@ -854,14 +847,14 @@ void RCconfig_macrlc(void) { libconfig_int local_n_portd = 0; libconfig_int remote_n_portd = 0; + printf("%s() Enter\n" , __FUNCTION__); + load_config_file(&cfg); setting = config_lookup(&cfg, CONFIG_STRING_MACRLC_LIST); if (setting != NULL) { - - if ((RC.nb_macrlc_inst=config_setting_length(setting))>0) mac_top_init_eNB(); else AssertFatal(1==0,"improper macrlc setting\n"); @@ -950,17 +943,9 @@ void RCconfig_macrlc(void) { RC.mac[j]->eth_params_s.remote_portd = remote_s_portd; RC.mac[j]->eth_params_s.transp_preference = ETH_UDP_MODE; - { - extern uint8_t nfapi_pnf; - nfapi_pnf = 2; - } - - { - printf("**************** vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc); - configure_nfapi_vnf(RC.mac[j]->eth_params_s.my_addr, RC.mac[j]->eth_params_s.my_portc); - printf("**************** RETURNED FROM configure_nfapi_vnf() vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc); - - } + printf("**************** vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc); + configure_nfapi_vnf(RC.mac[j]->eth_params_s.my_addr, RC.mac[j]->eth_params_s.my_portc); + printf("**************** RETURNED FROM configure_nfapi_vnf() vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc); } else { // other midhaul @@ -968,7 +953,10 @@ void RCconfig_macrlc(void) { } }// j=0..num_inst } - return; + else + { + printf("No MAC/RLC instances\n"); + } } int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) { diff --git a/openair2/LAYER2/MAC/eNB_scheduler_bch.c b/openair2/LAYER2/MAC/eNB_scheduler_bch.c index cd21713aba75aa025b25a055dc5ab0344f2be2f2..9da9f5e1208c0cc753a757c4d261fe681feb608f 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_bch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_bch.c @@ -538,7 +538,7 @@ void schedule_mib(module_id_t module_idP, module_idP, 0); // not used in this case - LOG_E(MAC,"Frame %d, subframe %d: BCH PDU length %d\n", + LOG_D(MAC,"Frame %d, subframe %d: BCH PDU length %d\n", frameP,subframeP,mib_sdu_length); if (mib_sdu_length > 0) { @@ -575,7 +575,7 @@ void schedule_mib(module_id_t module_idP, eNB->TX_req[CC_id].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; eNB->TX_req[CC_id].header.message_id = NFAPI_TX_REQUEST; - if (frameP%100==0) LOG_E(MAC,"%s() TX_REQ: sfn_sf:%u pdus:%u pdu_length:%u pdu_index:%u segments:%u segment_length:%u\n", + if (frameP%100==0) LOG_D(MAC,"%s() TX_REQ: sfn_sf:%u pdus:%u pdu_length:%u pdu_index:%u segments:%u segment_length:%u\n", __FUNCTION__, eNB->TX_req[CC_id].sfn_sf, eNB->TX_req[CC_id].tx_request_body.number_of_pdus, TX_req->pdu_length, TX_req->pdu_index, TX_req->num_segments, TX_req->segments[0].segment_length); } @@ -701,7 +701,7 @@ schedule_SI( dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; dl_config_pdu->pdu_size = (uint8_t)(sizeof(nfapi_dl_config_dci_dl_pdu)); dl_req->number_dci++; - LOG_E(MAC, "%s() number_dci:%u\n", __FUNCTION__, dl_req->number_dci); + LOG_D(MAC, "%s() number_dci:%u\n", __FUNCTION__, dl_req->number_dci); dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = NFAPI_DL_DCI_FORMAT_1A; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = 4; @@ -719,8 +719,9 @@ schedule_SI( dl_config_request->header.message_id = NFAPI_DL_CONFIG_REQUEST; dl_config_request->sfn_sf = sfn_sf; + LOG_D(MAC, "%s() mcs:%d bcch_sdu_length:%d N_RB_DL:%d first_rb:%d resource_block_coding:%d\n", __FUNCTION__, mcs, bcch_sdu_length, N_RB_DL, first_rb, dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding); + if (!CCE_allocation_infeasible(module_idP,CC_id,1,subframeP,dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level,SI_RNTI)) { - // DJP - dl_req->number_dci++; dl_req->number_pdu++; dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; diff --git a/openair2/PHY_INTERFACE/IF_Module.c b/openair2/PHY_INTERFACE/IF_Module.c index a7e4439e458106536df1822847fac89c15ff9b50..c1819e19d334f85786027177b4500b255df96f20 100644 --- a/openair2/PHY_INTERFACE/IF_Module.c +++ b/openair2/PHY_INTERFACE/IF_Module.c @@ -180,7 +180,7 @@ void UL_indication(UL_IND_t *UL_info) handle_harq(UL_info); - // clear HI prior to hanling ULSCH + // clear HI prior to handling ULSCH mac->HI_DCI0_req[CC_id].hi_dci0_request_body.number_of_hi = 0; handle_ulsch(UL_info); diff --git a/openair2/UTIL/LOG/log.c b/openair2/UTIL/LOG/log.c index 9c28c4b68d0900afb21775314102bbeb9199b2f0..a9e8ca17bcfe2ca5097962bd8e606b7f114472a2 100644 --- a/openair2/UTIL/LOG/log.c +++ b/openair2/UTIL/LOG/log.c @@ -469,6 +469,48 @@ int logInit (void) return 0; } +void nfapi_log(char *file, char *func, int line, int comp, int level, const char* format, va_list args) +{ + LOG_params log_params; + int len; + + len = vsnprintf(log_params.l_buff_info, MAX_LOG_INFO-1, format, args); + + //2 first parameters must be passed as 'const' to the thread function + log_params.file = strdup(file); + log_params.func = strdup(func); + log_params.line = line; + log_params.comp = comp; + log_params.level = level; + log_params.format = format; + log_params.len = len; + + if (pthread_mutex_lock(&log_lock) != 0) { + return; + } + + log_list_tail++; + log_list[log_list_tail - 1] = log_params; + + if (log_list_tail >= 1000) { + log_list_tail = 0; + } + + if (log_list_nb_elements < 1000) { + log_list_nb_elements++; + } + + if(pthread_cond_signal(&log_notify) != 0) { + pthread_mutex_unlock(&log_lock); + return; + } + + if(pthread_mutex_unlock(&log_lock) != 0) { + return; + } + +} + //log record: add to a list void logRecord(const char *file, const char *func, int line, int comp, int level, const char *format, ...) diff --git a/openair2/UTIL/LOG/log.h b/openair2/UTIL/LOG/log.h index 5140a08dbd4489b77c7ca86b5aeb2383a82277b7..35e79b60b903371a74e0359076ac88f54912e0b8 100644 --- a/openair2/UTIL/LOG/log.h +++ b/openair2/UTIL/LOG/log.h @@ -315,6 +315,19 @@ void *log_thread_function(void * list); # define LOG_N(c, x...) /* */ # define LOG_F(c, x...) /* */ # else /* T_TRACER */ +extern log_t *g_log; +#if 0 +# define LOG_G(c, x...) do { if (g_log->log_component[c].level > g_log->level || LOG_EMERG > g_log->log_component[c].level || LOG_EMERG > g_log->level) logIt(c, LOG_EMERG, x); } while(0) +# define LOG_A(c, x...) do { if (g_log->log_component[c].level > g_log->level || LOG_ALERT > g_log->log_component[c].level || LOG_ALERT > g_log->level) logIt(c, LOG_ALERT, x); } while(0) +# define LOG_C(c, x...) do { if (g_log->log_component[c].level > g_log->level || LOG_CRIT > g_log->log_component[c].level || LOG_CRIT > g_log->level) logIt(c, LOG_CRIT, x); } while(0) +# define LOG_E(c, x...) do { if (g_log->log_component[c].level > g_log->level || LOG_ERR > g_log->log_component[c].level || LOG_ERR > g_log->level) logIt(c, LOG_ERR, x); } while(0) +# define LOG_W(c, x...) do { if (g_log->log_component[c].level > g_log->level || LOG_WARNING > g_log->log_component[c].level || LOG_WARNING > g_log->level) logIt(c, LOG_WARNING, x); } while(0) +# define LOG_N(c, x...) do { if (g_log->log_component[c].level > g_log->level || LOG_NOTICE > g_log->log_component[c].level || LOG_NOTICE > g_log->level) logIt(c, LOG_NOTICE, x); } while(0) +# define LOG_I(c, x...) do { if (g_log->log_component[c].level > g_log->level || LOG_INFO > g_log->log_component[c].level || LOG_INFO > g_log->level) logIt(c, LOG_INFO, x); } while(0) +# define LOG_D(c, x...) do { if (g_log->log_component[c].level > g_log->level || LOG_DEBUG > g_log->log_component[c].level || LOG_DEBUG > g_log->level) logIt(c, LOG_DEBUG, x); } while(0) +# define LOG_F(c, x...) do { if (g_log->log_component[c].level > g_log->level || LOG_FILE > g_log->log_component[c].level || LOG_FILE > g_log->level) logIt(c, LOG_FILE, x); } while(0) +# define LOG_T(c, x...) do { if (g_log->log_component[c].level > g_log->level || LOG_TRACE > g_log->log_component[c].level || LOG_TRACE > g_log->level) logIt(c, LOG_TRACE, x); } while(0) +#else # define LOG_G(c, x...) logIt(c, LOG_EMERG, x) # define LOG_A(c, x...) logIt(c, LOG_ALERT, x) # define LOG_C(c, x...) logIt(c, LOG_CRIT, x) @@ -325,6 +338,7 @@ void *log_thread_function(void * list); # define LOG_D(c, x...) logIt(c, LOG_DEBUG, x) # define LOG_F(c, x...) logIt(c, LOG_FILE, x) // log to a file, useful for the MSC chart generation # define LOG_T(c, x...) logIt(c, LOG_TRACE, x) +#endif # endif /* T_TRACER */ #else /* USER_MODE */ # define LOG_G(c, x...) printk(x) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index 842f32a70ea3dea8d747cc77290c1887b0a320fc..2b2c2a603467f77441f6da2de6bf324de114b1c2 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -37,7 +37,8 @@ eNBs = downlink_frequency = 2685000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; - N_RB_DL = 50; + // N_RB_DL = 50; + N_RB_DL = 25; Nid_cell_mbsfn = 0; nb_antenna_ports = 1; nb_antennas_tx = 1; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index beed295bc044f6900fe8ab48086105d1977e4c73..e4d98eb0986d587bea06c37376c144fa1e66ccf2 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -889,7 +889,7 @@ void init_transport(PHY_VARS_eNB *eNB) { fp->pucch_config_common.deltaPUCCH_Shift = 1; } -void init_eNB_afterRU() { +void init_eNB_afterRU(void) { int inst,CC_id,ru_id,i,aa; PHY_VARS_eNB *eNB; @@ -972,7 +972,8 @@ void init_eNB_afterRU() { 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; - RC.ru[ru_id]->eNB_top = eNB_top; + if (nfapi_pnf!=1) + RC.ru[ru_id]->eNB_top = eNB_top; } LOG_I(PHY,"%s() Exitting\n", __FUNCTION__); diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index 4a3078be9f4bfe6d8bebe6b6d76e3c6dfc2e01a1..411ae80820b476222cadbaa18e260aa375715f3b 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -1012,22 +1012,24 @@ static void* ru_thread_prach( void* param ) { thread_top_init("ru_thread_prach",1,500000L,1000000L,20000000L); + while (RC.ru_mask>0) { + usleep(1e6); + LOG_I(PHY,"%s() RACH waiting for RU to be configured\n"); + } + LOG_I(PHY,"%s() RU configured - RACH processing thread running\n"); + while (!oai_exit) { if (oai_exit) break; if (wait_on_condition(&proc->mutex_prach,&proc->cond_prach,&proc->instance_cnt_prach,"ru_prach_thread") < 0) break; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 1 ); - rx_prach(NULL, - ru, - NULL, - NULL, - NULL, - proc->frame_prach, - 0 + prach_procedures( + ru->eNB_list[0] #ifdef Rel14 - ,0 + ,0 #endif - ); + ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 0 ); if (release_thread(&proc->mutex_prach,&proc->instance_cnt_prach,"ru_prach_thread") < 0) break; } @@ -1252,6 +1254,7 @@ static inline int wakeup_prach_ru_br(RU_t *ru) { #endif void oai_subframe_ind(uint16_t frame, uint16_t subframe); +void check_dlsch(char *file, int line); static void* ru_thread( void* param ) { @@ -1347,24 +1350,41 @@ ru->openair0_cfg.tx_gain[3]=0.0; subframe++; } - LOG_D(PHY,"RU thread (proc %p), frame %d (%p), subframe %d (%p)\n", - proc, frame,&frame,subframe,&subframe); + LOG_D(PHY,"RU thread (proc %p), frame %d (%p), subframe %d (%p)\n", proc, frame,&frame,subframe,&subframe); + + + ru->proc.frame_rx = frame; + ru->proc.subframe_rx = subframe; + + ru->proc.frame_tx = subframe>9 ? (frame+1)&1023 : frame; + ru->proc.subframe_tx = subframe+1 % 10; + proc->frame_rx = ru->proc.frame_rx; + proc->subframe_rx = ru->proc.subframe_rx; // synchronization on input FH interface, acquire signals/data and block if (ru->fh_south_in) ru->fh_south_in(ru,&frame,&subframe); else AssertFatal(1==0, "No fronthaul interface at south port"); + check_dlsch(__FILE__, __LINE__); + oai_subframe_ind(frame, subframe); + check_dlsch(__FILE__, __LINE__); + LOG_D(PHY,"RU thread (do_prach %d, is_prach_subframe %d), received frame %d, subframe %d\n", ru->do_prach, is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx), proc->frame_rx,proc->subframe_rx); - if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)==1)) wakeup_prach_ru(ru); + if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)==1)) { + wakeup_prach_ru(ru); + check_dlsch(__FILE__, __LINE__); + } #ifdef Rel14 - else if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>1)) wakeup_prach_ru_br(ru); + else if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>1)) { + wakeup_prach_ru_br(ru); + } #endif // adjust for timing offset between RU @@ -1374,33 +1394,41 @@ ru->openair0_cfg.tx_gain[3]=0.0; // do RX front-end processing (frequency-shift, dft) if needed if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 1 ); if (ru->feprx) ru->feprx(ru); - if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 0 ); + check_dlsch(__FILE__, __LINE__); T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx)); // At this point, all information for subframe has been received on FH interface // If this proc is to provide synchronization, do so wakeup_slaves(proc); + check_dlsch(__FILE__, __LINE__); //LOG_E(PHY,"RU %d/%d frame_tx %d, subframe_tx %d\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); + check_dlsch(__FILE__, __LINE__); //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"); + check_dlsch(__FILE__, __LINE__); //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); // do TX front-end processing if needed (precoding and/or IDFTs) if (ru->feptx_prec) ru->feptx_prec(ru); + check_dlsch(__FILE__, __LINE__); // do OFDM if needed if ((ru->fh_north_asynch_in == NULL) && (ru->feptx_ofdm)) ru->feptx_ofdm(ru); + check_dlsch(__FILE__, __LINE__); // do outgoing fronthaul (south) if needed if ((ru->fh_north_asynch_in == NULL) && (ru->fh_south_out)) ru->fh_south_out(ru); + check_dlsch(__FILE__, __LINE__); if (ru->fh_north_out) ru->fh_north_out(ru); + check_dlsch(__FILE__, __LINE__); + if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 0 ); } @@ -1587,6 +1615,12 @@ void init_RU_proc(RU_t *ru) { pthread_setname_np( proc->pthread_FH, name ); } + else if (ru->function == eNodeB_3GPP && ru->if_south == LOCAL_RF) { // DJP - need something else to distinguish between monolithic and PNF + LOG_E(PHY,"%s() DJP - added creation of pthread_prach\n", __FUNCTION__); + pthread_create( &proc->pthread_prach, attr_prach, ru_thread_prach, (void*)ru ); + } + + } @@ -2022,7 +2056,7 @@ void init_RU(const char *rf_config_file) { malloc_IF4p5_buffer(ru); } else if (ru->function == eNodeB_3GPP) { - ru->do_prach = 0; // no prach processing in RU + ru->do_prach = 1; // 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 diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 3e24215cdd66f0954a670ac28ac427f2c87e88ab..c39f42a962876f0ff12b0c04824d46f5bceb16df 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -97,7 +97,6 @@ unsigned short config_frames[4] = {2,9,11,13}; #endif - #ifdef XFORMS // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) // at eNB 0, an UL scope for every UE @@ -116,6 +115,7 @@ int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex pthread_cond_t sync_cond; pthread_mutex_t sync_mutex; int sync_var=-1; //!< protected by mutex \ref sync_mutex. +int config_sync_var=-1; uint16_t runtime_phy_rx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100] uint16_t runtime_phy_tx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100] @@ -208,10 +208,12 @@ int16_t glog_level = LOG_INFO; int16_t glog_verbosity = LOG_MED; int16_t hw_log_level = LOG_INFO; int16_t hw_log_verbosity = LOG_MED; -int16_t phy_log_level = LOG_TRACE; +int16_t phy_log_level = LOG_DEBUG; int16_t phy_log_verbosity = LOG_FULL; -int16_t mac_log_level = LOG_INFO; -int16_t mac_log_verbosity = LOG_MED; +int16_t rach_log_level = LOG_DEBUG; +int16_t rach_log_verbosity = LOG_FULL; +int16_t mac_log_level = LOG_DEBUG; +int16_t mac_log_verbosity = LOG_FULL; int16_t rlc_log_level = LOG_INFO; int16_t rlc_log_verbosity = LOG_MED; int16_t pdcp_log_level = LOG_INFO; @@ -1689,8 +1691,7 @@ int main( int argc, char **argv ) pthread_cond_init(&sync_cond,NULL); pthread_mutex_init(&sync_mutex, NULL); - - if (nfapi_pnf==2) + if (nfapi_pnf==2) // VNF wait_nfapi_init("main?"); printf("START MAIN THREADS\n"); @@ -1728,6 +1729,11 @@ int main( int argc, char **argv ) } } + config_sync_var=0; + + if (nfapi_pnf==1) // PNF + wait_nfapi_init("main?"); + printf("wait RUs\n"); wait_RUs(); printf("ALL RUs READY!\n");