Commit 163d058d authored by Xin Zhe Khooi's avatar Xin Zhe Khooi

introduce dedicated nr pdcp tick thread for F1 split

Currently, NR PDCP ticks are active only with monolithic gNB, triggered by the MAC scheduler in gNB_scheduler.c.
In F1 split mode, as there is no MAC, there’s no source to advance the NR PDCP timer via "nr_pdcp_wakeup_timer_thread()".
This commit introduces a dedicated thread for NR PDCP ticks in gNB-CU and CU-UP mode.
Without it, packet losses at the F1 uplink would cause indefinite buffering, as t-Reordering won't expire due to the lack of NR PDCP timer ticks.
parent ba2d7aad
......@@ -168,7 +168,7 @@ int main(int argc, char **argv)
AssertFatal(rc >= 0, "Create task for GTPV1U failed\n");
rc = itti_create_task(TASK_CUUP_E1, E1AP_CUUP_task, NULL);
AssertFatal(rc >= 0, "Create task for CUUP E1 failed\n");
nr_pdcp_layer_init(true);
nr_pdcp_layer_init();
cu_init_f1_ue_data(); // for CU-UP/CP mapping: we use the same
E1_t e1type = UPtype;
MessageDef *msg = RCconfig_NR_CU_E1(&e1type);
......
......@@ -532,7 +532,7 @@ void init_pdcp(void) {
uint32_t pdcp_initmask = IS_SOFTMODEM_NOS1 ? ENB_NAS_USE_TUN_BIT : LINK_ENB_PDCP_TO_GTPV1U_BIT;
if (!NODE_IS_DU(get_node_type())) {
nr_pdcp_layer_init(get_node_type() == ngran_gNB_CUCP);
nr_pdcp_layer_init();
nr_pdcp_module_init(pdcp_initmask, 0);
}
}
......
......@@ -317,7 +317,7 @@ static void init_pdcp(int ue_id)
if (get_softmodem_params()->nsa && rlc_module_init(0) != 0) {
LOG_I(RLC, "Problem at RLC initiation \n");
}
nr_pdcp_layer_init(false);
nr_pdcp_layer_init();
nr_pdcp_module_init(pdcp_initmask, ue_id);
}
......
......@@ -277,7 +277,7 @@ void mac_top_init_gNB(ngran_node_t node_type,
AssertFatal(rlc_module_init(1) == 0,"Could not initialize RLC layer\n");
// These should be out of here later
if (get_softmodem_params()->usim_test == 0 ) nr_pdcp_layer_init(false);
if (get_softmodem_params()->usim_test == 0 ) nr_pdcp_layer_init();
if(IS_SOFTMODEM_NOS1 && get_softmodem_params()->phy_test) {
// get default noS1 configuration
......
......@@ -566,7 +566,7 @@ void pdcp_layer_init(void)
abort();
}
void nr_pdcp_layer_init(bool uses_e1)
void nr_pdcp_layer_init(void)
{
/* hack: be sure to initialize only once */
static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
......@@ -586,10 +586,12 @@ void nr_pdcp_layer_init(bool uses_e1)
if ((RC.nrrrc == NULL) || (!NODE_IS_CU(node_type))) {
init_nr_rlc_data_req_queue();
}
nr_pdcp_e1_if_init(uses_e1);
nr_pdcp_e1_if_init(node_type == ngran_gNB_CUUP || node_type == ngran_gNB_CUCP);
init_nr_pdcp_data_ind_queue();
nr_pdcp_init_timer_thread(nr_pdcp_ue_manager);
if (NODE_IS_CU(node_type)) {
nr_pdcp_init_tick_thread();
}
}
#include "nfapi/oai_integration/vendor_ext.h"
......
......@@ -25,7 +25,7 @@
#include "pdcp.h"
#include "nr_pdcp_ue_manager.h"
void nr_pdcp_layer_init(bool uses_e1);
void nr_pdcp_layer_init(void);
uint64_t nr_pdcp_module_init(uint64_t _pdcp_optmask, int id);
void du_rlc_data_req(const protocol_ctxt_t *const ctxt_pP,
......
......@@ -70,6 +70,26 @@ static void *nr_pdcp_timer_thread(void *_nr_pdcp_ue_manager)
return NULL;
}
static void *nr_pdcp_tick_thread() {
pthread_setname_np(pthread_self(),"nr_pdcp_tick_thread");
uint64_t curr_time = 0;
while (1) {
usleep(1000);
curr_time++;
nr_pdcp_wakeup_timer_thread(curr_time);
}
return NULL;
}
void nr_pdcp_init_tick_thread()
{
pthread_t t;
if (pthread_create(&t, NULL, nr_pdcp_tick_thread, NULL) != 0) {
LOG_E(PDCP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
exit(1);
}
}
void nr_pdcp_init_timer_thread(nr_pdcp_ue_manager_t *nr_pdcp_ue_manager)
{
pthread_t t;
......
......@@ -26,6 +26,7 @@
#include <stdint.h>
void nr_pdcp_init_tick_thread();
void nr_pdcp_init_timer_thread(nr_pdcp_ue_manager_t *nr_pdcp_ue_manager);
void nr_pdcp_wakeup_timer_thread(uint64_t time);
......
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