Commit d14e9a18 authored by chenyi's avatar chenyi Committed by Robert Schmidt

do not allocate ul_dci on heap, introduces huge delay

- Process ul_dci whenever the number of ul_dci PDUs in the buffer > 0.
- Replace dynamic allocation on the heap with stack allocation.
- New function, **`cp_nr_ul_dci_req`**, to copy the **`ul_dci_req`**.
parent bf5efc1b
......@@ -576,7 +576,7 @@ typedef struct
//TODO: Change P7 structs to NR
nfapi_nr_dl_tti_request_t* dl_tti_req;//nfapi_dl_config_request_t* dl_config_req;
nfapi_nr_ul_tti_request_t* ul_tti_req;//nfapi_ul_config_request_t* ul_config_req;
nfapi_nr_ul_dci_request_t* ul_dci_req;//nfapi_hi_dci0_request_t* hi_dci0_req;
nfapi_nr_ul_dci_request_t ul_dci_req;//nfapi_hi_dci0_request_t* hi_dci0_req;
nfapi_nr_tx_data_request_t tx_data_req;//nfapi_tx_request_t* tx_req;
//TODO: check these two later
......
......@@ -934,12 +934,12 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
}
if(tx_slot_buffer->ul_dci_req!= 0 && tx_slot_buffer->ul_dci_req->SFN == sfn_tx && tx_slot_buffer->ul_dci_req->Slot == slot_tx)
if(tx_slot_buffer->ul_dci_req.numPdus > 0 && tx_slot_buffer->ul_dci_req.SFN == sfn_tx && tx_slot_buffer->ul_dci_req.Slot == slot_tx)
{
DevAssert(pnf_p7->_public.ul_dci_req_fn != NULL);
LOG_D(PHY, "Process ul_dci SFN/slot %d.%d buffer index: %d \n",sfn_tx,slot_tx,buffer_index_tx);
// pnf_phy_ul_dci_req()
(pnf_p7->_public.ul_dci_req_fn)(NULL, &(pnf_p7->_public), tx_slot_buffer->ul_dci_req);
(pnf_p7->_public.ul_dci_req_fn)(NULL, &(pnf_p7->_public), &tx_slot_buffer->ul_dci_req);
}
//deallocate slot buffers after passing down the PDUs to PHY processing
......@@ -951,13 +951,6 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
LOG_D(PHY,"SFN/slot %d.%d Buffer index : %d freed \n",sfn_tx,slot_tx,buffer_index_tx);
}
if(tx_slot_buffer->ul_dci_req != 0)
{
deallocate_nfapi_ul_dci_request(tx_slot_buffer->ul_dci_req, pnf_p7);
tx_slot_buffer->ul_dci_req = 0;
}
//checking in the rx slot buffers to see if a p7 msg is present.
if(rx_slot_buffer->ul_tti_req != 0)
......@@ -1743,20 +1736,28 @@ void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_
}
}
void pnf_handle_ul_dci_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
static void cp_nr_ul_dci_req(nfapi_nr_ul_dci_request_t* dst, const nfapi_nr_ul_dci_request_t* src)
{
//NFAPI_TRACE(NFAPI_TRACE_INFO, "HI_DCI0.req Received\n");
dst->header = src->header;
dst->SFN = src->SFN;
dst->Slot = src->Slot;
dst->numPdus = src->numPdus;
nfapi_nr_ul_dci_request_t* req = allocate_nfapi_ul_dci_request(pnf_p7);
for (int i = 0; i < dst->numPdus; ++i) {
nfapi_nr_ul_dci_request_pdus_t* dst_pdu = &dst->ul_dci_pdu_list[i];
const nfapi_nr_ul_dci_request_pdus_t* src_pdu = &src->ul_dci_pdu_list[i];
if(req == NULL)
{
NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to allocate nfapi_ul_dci_request structure\n");
return;
dst_pdu->PDUType = src_pdu->PDUType;
dst_pdu->PDUSize = src_pdu->PDUSize;
dst_pdu->pdcch_pdu = src_pdu->pdcch_pdu;
}
}
int unpack_result = nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_nr_ul_dci_request_t), &pnf_p7->_public.codec_config);
void pnf_handle_ul_dci_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
{
nfapi_nr_ul_dci_request_t req;
int unpack_result = nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(nfapi_nr_ul_dci_request_t), &pnf_p7->_public.codec_config);
if(unpack_result == 0)
{
......@@ -1766,31 +1767,20 @@ void pnf_handle_ul_dci_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
return;
}
if(is_nr_p7_request_in_window(req->SFN,req->Slot,"ul_dci_request", pnf_p7))
if(is_nr_p7_request_in_window(req.SFN,req.Slot,"ul_dci_request", pnf_p7))
{
uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot);
uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req.SFN,req.Slot);
uint8_t buffer_index = sfn_slot_dec % 20;
if(pnf_p7->slot_buffer[buffer_index].ul_dci_req!= 0)
{
//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing hi_dci0_req at index %d (%d/%d)",
// pMyPhyInfo->sfnSf, bufferIdx,
// SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf));
deallocate_nfapi_ul_dci_request(pnf_p7->slot_buffer[buffer_index].ul_dci_req, pnf_p7);
}
pnf_p7->slot_buffer[buffer_index].sfn = req.SFN;
cp_nr_ul_dci_req(&pnf_p7->slot_buffer[buffer_index].ul_dci_req, &req);
pnf_p7->slot_buffer[buffer_index].sfn = req->SFN;
pnf_p7->slot_buffer[buffer_index].ul_dci_req = req;
pnf_p7->stats.ul_dci_ontime++;
}
else
{
//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing hi_dci0_req SFN/SF %d/%d\n", pMyPhyInfo->sfnSf, SFNSF2SFN(req->sfn_sf), SFNSF2SF(req->sfn_sf));
deallocate_nfapi_ul_dci_request(req, pnf_p7);
if(pnf_p7->_public.timing_info_mode_aperiodic)
{
pnf_p7->timing_info_aperiodic_send = 1;
......@@ -1808,7 +1798,6 @@ void pnf_handle_ul_dci_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
else
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack UL DCI req\n");
deallocate_nfapi_ul_dci_request(req, pnf_p7);
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment