Creating new queue for ul_ttis if dl_tti is late
Also, this commit changes the len argument in the pusharray32 to match the actual field type (uint16_t). There is also simple name change from sf -> slot. The new queueing system is not a permanent solution. It was simply a way for us to try to handle late dl_tti_requests. If we queue every single ul_tti_req that we get, the queue gets full very quickly becasue we only remove ul_ttis from the queue when a uci has been populated with a matching sfn/sf. Because of this, we only queue ul_ttis if we have a uci_indication prepared already. Rarely, a dl_tti_req will arrive at the NRUE too late, and the NRUE does not have time to create the uci_ind so we dont process the corresponding ul_tti. A seprate queue was made to hold all other ul_ttis the arrive in the NRUE (this queue will continuously get full and then emptied) but will occasionally hold a ul_tti that corresponds to a uci that hasnt been populated yet.
This commit is contained in:
+8
-2
@@ -266,8 +266,13 @@ static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn_slot)
|
||||
nfapi_nr_ul_dci_request_t *ul_dci_request = get_queue(&nr_ul_dci_req_queue);
|
||||
|
||||
LOG_D(NR_MAC, "Try to get a ul_tti_req for sfn/slot %d %d from queue with %d items\n",
|
||||
NFAPI_SFNSLOT2SFN(mac->active_harq_sfn_sf),NFAPI_SFNSLOT2SLOT(mac->active_harq_sfn_sf), nr_ul_tti_req_queue.num_items);
|
||||
nfapi_nr_ul_tti_request_t *ul_tti_request = unqueue_matching(&nr_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &mac->active_harq_sfn_sf);
|
||||
NFAPI_SFNSLOT2SFN(mac->active_harq_sfn_slot),NFAPI_SFNSLOT2SLOT(mac->active_harq_sfn_slot), nr_ul_tti_req_queue.num_items);
|
||||
nfapi_nr_ul_tti_request_t *ul_tti_request = unqueue_matching(&nr_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &mac->active_harq_sfn_slot);
|
||||
if (!ul_tti_request)
|
||||
{
|
||||
LOG_D(NR_MAC, "Try to get a ul_tti_req from seprate queue because dl_tti_req was late\n");
|
||||
ul_tti_request = unqueue_matching(&nr_wait_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &mac->active_harq_sfn_slot);
|
||||
}
|
||||
|
||||
if (rach_ind && rach_ind->number_of_pdus > 0)
|
||||
{
|
||||
@@ -382,6 +387,7 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
|
||||
reset_queue(&nr_tx_req_queue);
|
||||
reset_queue(&nr_ul_dci_req_queue);
|
||||
reset_queue(&nr_ul_tti_req_queue);
|
||||
reset_queue(&nr_wait_ul_tti_req_queue);
|
||||
|
||||
NR_PRACH_RESOURCES_t prach_resources;
|
||||
memset(&prach_resources, 0, sizeof(prach_resources));
|
||||
|
||||
@@ -50,7 +50,7 @@ uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t le
|
||||
uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharray32(uint32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharray32(uint32_t in[], uint32_t max_len, uint16_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharrays32(int32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
|
||||
typedef uint8_t (*pack_array_elem_fn)(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end);
|
||||
|
||||
@@ -363,7 +363,7 @@ uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t le
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
uint32_t pusharray32(uint32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
|
||||
uint32_t pusharray32(uint32_t in[], uint32_t max_len, uint16_t len, uint8_t **out, uint8_t *end) {
|
||||
if(len == 0)
|
||||
return 1;
|
||||
|
||||
|
||||
@@ -437,7 +437,7 @@ typedef struct {
|
||||
|
||||
bool expected_dci;
|
||||
bool index_has_dci[16];
|
||||
int active_harq_sfn_sf;
|
||||
int active_harq_sfn_slot;
|
||||
|
||||
pthread_mutex_t mutex_dl_info;
|
||||
|
||||
|
||||
@@ -1283,7 +1283,7 @@ void set_harq_status(NR_UE_MAC_INST_t *mac,
|
||||
// FIXME k0 != 0 currently not taken into consideration
|
||||
current_harq->dl_frame = frame;
|
||||
current_harq->dl_slot = slot;
|
||||
mac->active_harq_sfn_sf = NFAPI_SFNSLOT2HEX(frame, (slot + data_toul_fb));
|
||||
mac->active_harq_sfn_slot = NFAPI_SFNSLOT2HEX(frame, (slot + data_toul_fb));
|
||||
|
||||
LOG_D(NR_PHY,"Setting harq_status for harq_id %d, dl %d.%d, sched ul %d.%d\n",
|
||||
harq_id, frame, slot, frame, (slot + data_toul_fb));
|
||||
|
||||
@@ -60,6 +60,7 @@ queue_t nr_dl_tti_req_queue;
|
||||
queue_t nr_tx_req_queue;
|
||||
queue_t nr_ul_dci_req_queue;
|
||||
queue_t nr_ul_tti_req_queue;
|
||||
queue_t nr_wait_ul_tti_req_queue;
|
||||
|
||||
void nrue_init_standalone_socket(int tx_port, int rx_port)
|
||||
{
|
||||
@@ -731,7 +732,7 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea
|
||||
}
|
||||
LOG_I(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST message in SFN/slot %d %d.\n",
|
||||
ul_tti_request->SFN, ul_tti_request->Slot);
|
||||
if (nr_uci_ind_queue.num_items > 0)
|
||||
if (nr_uci_ind_queue.num_items > 0) //TODO: In the future UL_TTIs can be for ULSCH and SRS.
|
||||
{
|
||||
LOG_I(NR_MAC, "Melissa, we added UL_TTI_REQ to queue for sfn slot %d %d\n",
|
||||
ul_tti_request->SFN, ul_tti_request->Slot);
|
||||
@@ -746,6 +747,27 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea
|
||||
}
|
||||
}
|
||||
}
|
||||
/* TODO: This indicates that dl_tti_req was late or never arrived. If there are
|
||||
not any prepared uci indications, the NRUE likely never had time to
|
||||
populate the message is the dl_tti_req came in late and we received a
|
||||
ul_tti_req immediately after the dl_tti_request. This is an attempt to
|
||||
mitigate proxy timing issues. */
|
||||
else if (nr_uci_ind_queue.num_items == 0)
|
||||
{
|
||||
LOG_I(NR_MAC, "Melissa, we added UL_TTI_REQ to queue for sfn slot %d %d\n",
|
||||
ul_tti_request->SFN, ul_tti_request->Slot);
|
||||
if (!put_queue(&nr_wait_ul_tti_req_queue, ul_tti_request))
|
||||
{
|
||||
reset_queue(&nr_wait_ul_tti_req_queue);
|
||||
if (!put_queue(&nr_wait_ul_tti_req_queue, ul_tti_request))
|
||||
{
|
||||
LOG_E(NR_PHY, "put_queue failed for nr_wait_ul_tti_req_queue.\n");
|
||||
free(ul_tti_request);
|
||||
ul_tti_request = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -2894,6 +2894,7 @@ static void start_oai_nrue_threads()
|
||||
init_queue(&nr_tx_req_queue);
|
||||
init_queue(&nr_ul_dci_req_queue);
|
||||
init_queue(&nr_ul_tti_req_queue);
|
||||
init_queue(&nr_wait_ul_tti_req_queue);
|
||||
|
||||
if (sem_init(&sfn_slot_semaphore, 0, 0) != 0)
|
||||
{
|
||||
|
||||
@@ -50,6 +50,7 @@ extern queue_t nr_dl_tti_req_queue;
|
||||
extern queue_t nr_tx_req_queue;
|
||||
extern queue_t nr_ul_dci_req_queue;
|
||||
extern queue_t nr_ul_tti_req_queue;
|
||||
extern queue_t nr_wait_ul_tti_req_queue;
|
||||
//
|
||||
// main_rrc.c
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user