Commit 63c02302 authored by laurent's avatar laurent

du in 2 threads, and fix UL in FS6 split

parent 283fed9c
...@@ -285,7 +285,7 @@ typedef struct { ...@@ -285,7 +285,7 @@ typedef struct {
TASK_DEF(TASK_PDCP_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \ TASK_DEF(TASK_PDCP_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
TASK_DEF(TASK_DATA_FORWARDING, TASK_PRIORITY_MED, 200, NULL, NULL) \ TASK_DEF(TASK_DATA_FORWARDING, TASK_PRIORITY_MED, 200, NULL, NULL) \
TASK_DEF(TASK_END_MARKER, TASK_PRIORITY_MED, 200, NULL, NULL) \ TASK_DEF(TASK_END_MARKER, TASK_PRIORITY_MED, 200, NULL, NULL) \
TASK_DEF(TASK_RRC_ENB, TASK_PRIORITY_MED, 200, NULL,NULL)\ TASK_DEF(TASK_RRC_ENB, TASK_PRIORITY_MED, 200, rrc_enb_process_itti_msg,NULL)\
TASK_DEF(TASK_RAL_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \ TASK_DEF(TASK_RAL_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
TASK_DEF(TASK_S1AP, TASK_PRIORITY_MED, 200, NULL, NULL) \ TASK_DEF(TASK_S1AP, TASK_PRIORITY_MED, 200, NULL, NULL) \
TASK_DEF(TASK_X2AP, TASK_PRIORITY_MED, 200, NULL, NULL) \ TASK_DEF(TASK_X2AP, TASK_PRIORITY_MED, 200, NULL, NULL) \
......
...@@ -1384,39 +1384,43 @@ void phy_procedures_eNB_TX_tosplit(uint8_t *bufferZone, PHY_VARS_eNB *eNB, L1_rx ...@@ -1384,39 +1384,43 @@ void phy_procedures_eNB_TX_tosplit(uint8_t *bufferZone, PHY_VARS_eNB *eNB, L1_rx
return; return;
} }
void DL_du_fs6(void *arg) { void *DL_du_fs6(void *arg) {
RU_t *ru = *(RU_t **)arg; RU_t *ru=(RU_t *)arg;
static uint64_t lastTS; static uint64_t lastTS;
L1_rxtx_proc_t L1_proc= {0}; L1_rxtx_proc_t L1_proc= {0};
for (int i=0; i<ru->num_eNB; i++) { while (1) {
initBufferZone(bufferZone); for (int i=0; i<ru->num_eNB; i++) {
initStaticTime(begingWait); initBufferZone(bufferZone);
initRefTimes(fullLoop); initStaticTime(begingWait);
pickStaticTime(begingWait); initRefTimes(fullLoop);
int nb_blocks=receiveSubFrame(&sockFS6, bufferZone, sizeof(bufferZone), CTsentCUv0 ); pickStaticTime(begingWait);
updateTimesReset(begingWait, &fullLoop, 1000, false, "DU wait CU"); int nb_blocks=receiveSubFrame(&sockFS6, bufferZone, sizeof(bufferZone), CTsentCUv0 );
updateTimesReset(begingWait, &fullLoop, 1000, false, "DU wait CU");
if (nb_blocks > 0) {
if ( lastTS+ru->eNB_list[i]->frame_parms.samples_per_tti != hUDP(bufferZone)->timestamp) { if (nb_blocks > 0) {
LOG_E(HW,"Missed a subframe: expecting: %lu, received %lu\n", if ( lastTS+ru->eNB_list[i]->frame_parms.samples_per_tti != hUDP(bufferZone)->timestamp) {
lastTS+ru->eNB_list[i]->frame_parms.samples_per_tti, LOG_E(HW,"Missed a subframe: expecting: %lu, received %lu\n",
hUDP(bufferZone)->timestamp); lastTS+ru->eNB_list[i]->frame_parms.samples_per_tti,
} hUDP(bufferZone)->timestamp);
}
lastTS=hUDP(bufferZone)->timestamp;
setAllfromTS(hUDP(bufferZone)->timestamp - sf_ahead*ru->eNB_list[i]->frame_parms.samples_per_tti, &L1_proc);
phy_procedures_eNB_TX_fromsplit( bufferZone, nb_blocks, ru->eNB_list[i], &L1_proc, 1);
} else
LOG_E(PHY,"DL not received for subframe\n");
}
lastTS=hUDP(bufferZone)->timestamp; feptx_prec(ru, &L1_proc);
setAllfromTS(hUDP(bufferZone)->timestamp - sf_ahead*ru->eNB_list[i]->frame_parms.samples_per_tti, &L1_proc); feptx_ofdm(ru, &L1_proc);
phy_procedures_eNB_TX_fromsplit( bufferZone, nb_blocks, ru->eNB_list[i], &L1_proc, 1); tx_rf(ru, &L1_proc);
} else
LOG_E(PHY,"DL not received for subframe\n");
} }
feptx_prec(ru, &L1_proc); return NULL;
feptx_ofdm(ru, &L1_proc);
tx_rf(ru, &L1_proc);
} }
void UL_du_fs6(RU_t *ru, L1_rxtx_proc_t *proc, int frame, int subframe) { void UL_du_fs6(RU_t *ru, L1_rxtx_proc_t *proc) {
initStaticTime(begingWait); initStaticTime(begingWait);
initRefTimes(fullLoop); initRefTimes(fullLoop);
pickStaticTime(begingWait); pickStaticTime(begingWait);
...@@ -1560,7 +1564,7 @@ void *du_fs6(void *arg) { ...@@ -1560,7 +1564,7 @@ void *du_fs6(void *arg) {
fill_rf_config(ru,ru->rf_config_file); fill_rf_config(ru,ru->rf_config_file);
init_frame_parms(&ru->frame_parms,1); init_frame_parms(&ru->frame_parms,1);
phy_init_RU(ru); phy_init_RU(ru);
openair0_device_load(&ru->rfdevice,&ru->openair0_cfg); init_rf(ru);
wait_sync("ru_thread"); wait_sync("ru_thread");
char *remoteIP; char *remoteIP;
...@@ -1570,33 +1574,26 @@ void *du_fs6(void *arg) { ...@@ -1570,33 +1574,26 @@ void *du_fs6(void *arg) {
remoteIP=CU_IP; remoteIP=CU_IP;
AssertFatal(createUDPsock(NULL, DU_PORT, remoteIP, CU_PORT, &sockFS6), ""); AssertFatal(createUDPsock(NULL, DU_PORT, remoteIP, CU_PORT, &sockFS6), "");
tpool_t pool;
tpool_t *Tpool = &pool;
char params[]="-1,-1";
initTpool(params, Tpool, false);
if (ru->start_rf) { if (ru->start_rf) {
if (ru->start_rf(ru) != 0) if (ru->start_rf(ru) != 0)
LOG_E(HW,"Could not start the RF device\n"); LOG_E(HW,"Could not start the RF device\n");
else LOG_I(PHY,"RU %d rf device ready\n",ru->idx); else
} else LOG_I(PHY,"RU %d no rf device\n",ru->idx); LOG_I(PHY,"RU %d rf device ready\n",ru->idx);
} else
LOG_I(PHY,"RU %d no rf device\n",ru->idx);
initStaticTime(begingWait); initStaticTime(begingWait);
initRefTimes(waitRxAndProcessingUL); initRefTimes(waitRxAndProcessingUL);
initRefTimes(fullLoop); initRefTimes(fullLoop);
L1_rxtx_proc_t L1proc; pthread_t t;
notifiedFIFO_t nf; threadCreate(&t, DL_du_fs6, (void *)ru, "MainDuTx", -1, OAI_PRIORITY_RT_MAX);
initNotifiedFIFO(&nf);
while(1) { while(1) {
L1_rxtx_proc_t *proc = &L1proc; L1_rxtx_proc_t L1proc;
updateTimesReset(begingWait, &fullLoop, 1000, true,"DU for full SubFrame (must be less 1ms)"); updateTimesReset(begingWait, &fullLoop, 1000, true,"DU for full SubFrame (must be less 1ms)");
pickStaticTime(begingWait); pickStaticTime(begingWait);
notifiedFIFO_elt_t *Msg=newNotifiedFIFO_elt(sizeof(ru),0,&nf, DL_du_fs6); UL_du_fs6(ru, &L1proc);
*(RU_t **)NotifiedFifoData(Msg)=ru;
pushTpool(Tpool, Msg);
UL_du_fs6(ru, proc, proc->frame_rx,proc->subframe_rx);
notifiedFIFO_elt_t *res=pullTpool(&nf, Tpool);
updateTimesReset(begingWait, &waitRxAndProcessingUL, 1000, true,"DU Time in wait Rx + Ul processing"); updateTimesReset(begingWait, &waitRxAndProcessingUL, 1000, true,"DU Time in wait Rx + Ul processing");
} }
......
...@@ -11,10 +11,11 @@ ...@@ -11,10 +11,11 @@
* The merger of OpenAir central code to this branch * The merger of OpenAir central code to this branch
* should check if these 3 files are modified and analyze if code code has to be copied in here * should check if these 3 files are modified and analyze if code code has to be copied in here
*/ */
#define _GNU_SOURCE
#include <pthread.h>
#include <common/utils/LOG/log.h> #include <common/utils/LOG/log.h>
#include <common/utils/system.h> #include <common/utils/system.h>
static int DEFBANDS[] = {7}; static int DEFBANDS[] = {7};
static int DEFENBS[] = {0}; static int DEFENBS[] = {0};
#include <common/config/config_userapi.h> #include <common/config/config_userapi.h>
...@@ -44,7 +45,6 @@ void reset_opp_meas(void) { ...@@ -44,7 +45,6 @@ void reset_opp_meas(void) {
// Fixme: there are many mistakes in the datamodel and in redondant variables // Fixme: there are many mistakes in the datamodel and in redondant variables
// TDD is also mode complex // TDD is also mode complex
void setAllfromTS(uint64_t TS, L1_rxtx_proc_t *proc) { void setAllfromTS(uint64_t TS, L1_rxtx_proc_t *proc) {
for (int i=0; i < RC.nb_inst; i++) { for (int i=0; i < RC.nb_inst; i++) {
for (int j=0; j<RC.nb_CC[i]; j++) { for (int j=0; j<RC.nb_CC[i]; j++) {
LTE_DL_FRAME_PARMS *fp=&RC.eNB[i][j]->frame_parms; LTE_DL_FRAME_PARMS *fp=&RC.eNB[i][j]->frame_parms;
...@@ -96,7 +96,6 @@ void init_eNB_proc(int inst) { ...@@ -96,7 +96,6 @@ void init_eNB_proc(int inst) {
} }
void init_RU_proc(RU_t *ru) { void init_RU_proc(RU_t *ru) {
pthread_t t; pthread_t t;
char *fs6=getenv("fs6"); char *fs6=getenv("fs6");
...@@ -104,7 +103,7 @@ void init_RU_proc(RU_t *ru) { ...@@ -104,7 +103,7 @@ void init_RU_proc(RU_t *ru) {
if ( strncasecmp(fs6,"cu", 2) == 0 ) if ( strncasecmp(fs6,"cu", 2) == 0 )
threadCreate(&t, cu_fs6, (void *)ru, "MainCu", -1, OAI_PRIORITY_RT_MAX); threadCreate(&t, cu_fs6, (void *)ru, "MainCu", -1, OAI_PRIORITY_RT_MAX);
else if ( strncasecmp(fs6,"du", 2) == 0 ) { else if ( strncasecmp(fs6,"du", 2) == 0 ) {
threadCreate(&t, du_fs6, (void *)ru, "MainDu", -1, OAI_PRIORITY_RT_MAX); threadCreate(&t, du_fs6, (void *)ru, "MainDuRx", -1, OAI_PRIORITY_RT_MAX);
} else } else
AssertFatal(false, "environement variable fs6 is not cu or du"); AssertFatal(false, "environement variable fs6 is not cu or du");
} else } else
...@@ -415,7 +414,7 @@ void init_precoding_weights(PHY_VARS_eNB *eNB) { ...@@ -415,7 +414,7 @@ void init_precoding_weights(PHY_VARS_eNB *eNB) {
} }
} }
void prach_procedures_ocp(PHY_VARS_eNB *eNB, L1_rxtx_proc_t * proc, int br_flag) { void prach_procedures_ocp(PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc, int br_flag) {
uint16_t max_preamble[4],max_preamble_energy[4],max_preamble_delay[4],avg_preamble_energy[4]; uint16_t max_preamble[4],max_preamble_energy[4],max_preamble_delay[4],avg_preamble_energy[4];
RU_t *ru; RU_t *ru;
int aa=0; int aa=0;
...@@ -436,7 +435,7 @@ void prach_procedures_ocp(PHY_VARS_eNB *eNB, L1_rxtx_proc_t * proc, int br_flag) ...@@ -436,7 +435,7 @@ void prach_procedures_ocp(PHY_VARS_eNB *eNB, L1_rxtx_proc_t * proc, int br_flag)
// run PRACH detection for CE-level 0 only for now when br_flag is set // run PRACH detection for CE-level 0 only for now when br_flag is set
rx_prach(eNB, rx_prach(eNB,
proc, proc,
eNB->RU_list[0], eNB->RU_list[0],
&max_preamble[0], &max_preamble[0],
&max_preamble_energy[0], &max_preamble_energy[0],
...@@ -536,7 +535,7 @@ void prach_procedures_ocp(PHY_VARS_eNB *eNB, L1_rxtx_proc_t * proc, int br_flag) ...@@ -536,7 +535,7 @@ void prach_procedures_ocp(PHY_VARS_eNB *eNB, L1_rxtx_proc_t * proc, int br_flag)
} }
} // else br_flag } // else br_flag
void prach_eNB(PHY_VARS_eNB *eNB, L1_rxtx_proc_t * proc, int frame,int subframe) { void prach_eNB(PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc, int frame,int subframe) {
// check if we have to detect PRACH first // check if we have to detect PRACH first
if (is_prach_subframe(&eNB->frame_parms, frame,subframe)>0) { if (is_prach_subframe(&eNB->frame_parms, frame,subframe)>0) {
prach_procedures_ocp(eNB, proc, 0); prach_procedures_ocp(eNB, proc, 0);
...@@ -576,7 +575,6 @@ static inline int rxtx(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc, char *thread_name ...@@ -576,7 +575,6 @@ static inline int rxtx(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc, char *thread_name
} }
void eNB_top(PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc, int dummy1, int dummy2, char *string,RU_t *ru) { void eNB_top(PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc, int dummy1, int dummy2, char *string,RU_t *ru) {
if (!oai_exit) { if (!oai_exit) {
if (rxtx(eNB,proc,string) < 0) if (rxtx(eNB,proc,string) < 0)
LOG_E(PHY,"eNB %d CC_id %d failed during execution\n",eNB->Mod_id,eNB->CC_id); LOG_E(PHY,"eNB %d CC_id %d failed during execution\n",eNB->Mod_id,eNB->CC_id);
...@@ -590,7 +588,7 @@ void rx_rf(RU_t *ru, L1_rxtx_proc_t *proc) { ...@@ -590,7 +588,7 @@ void rx_rf(RU_t *ru, L1_rxtx_proc_t *proc) {
int i; int i;
openair0_timestamp ts=0, timestamp_rx; openair0_timestamp ts=0, timestamp_rx;
static openair0_timestamp old_ts=0; static openair0_timestamp old_ts=0;
for (i=0; i<ru->nb_rx; i++) for (i=0; i<ru->nb_rx; i++)
//receive in the next slot //receive in the next slot
rxp[i] = (void *)&ru->common.rxdata[i][((proc->subframe_rx+1)%10)*fp->samples_per_tti]; rxp[i] = (void *)&ru->common.rxdata[i][((proc->subframe_rx+1)%10)*fp->samples_per_tti];
...@@ -615,15 +613,17 @@ void rx_rf(RU_t *ru, L1_rxtx_proc_t *proc) { ...@@ -615,15 +613,17 @@ void rx_rf(RU_t *ru, L1_rxtx_proc_t *proc) {
} }
if (timestamp_rx - old_ts != fp->samples_per_tti) { if (timestamp_rx - old_ts != fp->samples_per_tti) {
LOG_E(HW,"impossible shift in rx stream, rx: %ld, previous rx distance: %ld, should be %d\n", timestamp_rx, proc->timestamp_rx - old_ts, fp->samples_per_tti); LOG_E(HW,"impossible shift in rx stream, rx: %ld, previous rx distance: %ld, should be %d\n", timestamp_rx, proc->timestamp_rx - old_ts, fp->samples_per_tti);
//ru->ts_offset += (proc->timestamp_rx - old_ts - fp->samples_per_tti); //ru->ts_offset += (proc->timestamp_rx - old_ts - fp->samples_per_tti);
//proc->timestamp_rx = ts-ru->ts_offset; //proc->timestamp_rx = ts-ru->ts_offset;
} }
old_ts=timestamp_rx; old_ts=timestamp_rx;
setAllfromTS(timestamp_rx, proc); setAllfromTS(timestamp_rx, proc);
} }
void tx_rf(RU_t *ru, L1_rxtx_proc_t *proc) { int tx_rf(RU_t *ru, L1_rxtx_proc_t *proc) {
int ret=0;
LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; LTE_DL_FRAME_PARMS *fp = &ru->frame_parms;
void *txp[ru->nb_tx]; void *txp[ru->nb_tx];
int i; int i;
...@@ -671,29 +671,31 @@ void tx_rf(RU_t *ru, L1_rxtx_proc_t *proc) { ...@@ -671,29 +671,31 @@ void tx_rf(RU_t *ru, L1_rxtx_proc_t *proc) {
/* add fail safe for late command end */ /* add fail safe for late command end */
// prepare tx buffer pointers // prepare tx buffer pointers
ru->rfdevice.trx_write_func(&ru->rfdevice, ret=ru->rfdevice.trx_write_func(&ru->rfdevice,
proc->timestamp_tx+ru->ts_offset-ru->openair0_cfg.tx_sample_advance-sf_extension, proc->timestamp_tx+ru->ts_offset-ru->openair0_cfg.tx_sample_advance-sf_extension,
txp, txp,
siglen+sf_extension, siglen+sf_extension,
ru->nb_tx, ru->nb_tx,
flags); flags);
LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, subframe %d\n",ru->idx, LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, subframe %d\n",ru->idx,
(long long unsigned int)proc->timestamp_tx,proc->frame_tx,proc->subframe_tx); (long long unsigned int)proc->timestamp_tx,proc->frame_tx,proc->subframe_tx);
} }
return ret;
} }
static void *ru_thread( void *param ) { static void *ru_thread( void *param ) {
setbuf(stdout, NULL); setbuf(stdout, NULL);
setbuf(stderr, NULL); setbuf(stderr, NULL);
RU_t *ru = (RU_t *)param; RU_t *ru = (RU_t *)param;
L1_rxtx_proc_t L1proc; L1_rxtx_proc_t L1proc;
L1_rxtx_proc_t * proc=&L1proc; L1_rxtx_proc_t *proc=&L1proc;
if (ru->if_south == LOCAL_RF) { // configure RF parameters only if (ru->if_south == LOCAL_RF) { // configure RF parameters only
fill_rf_config(ru,ru->rf_config_file); fill_rf_config(ru,ru->rf_config_file);
init_frame_parms(&ru->frame_parms,1); init_frame_parms(&ru->frame_parms,1);
phy_init_RU(ru); phy_init_RU(ru);
openair0_device_load(&ru->rfdevice,&ru->openair0_cfg); init_rf(ru);
} }
AssertFatal(setup_RU_buffers(ru)==0, "Exiting, cannot initialize RU Buffers\n"); AssertFatal(setup_RU_buffers(ru)==0, "Exiting, cannot initialize RU Buffers\n");
...@@ -714,7 +716,7 @@ static void *ru_thread( void *param ) { ...@@ -714,7 +716,7 @@ static void *ru_thread( void *param ) {
// do RX front-end processing (frequency-shift, dft) if needed // do RX front-end processing (frequency-shift, dft) if needed
if (ru->feprx) if (ru->feprx)
ru->feprx(ru, proc); ru->feprx(ru, proc);
// At this point, all information for subframe has been received on FH interface // At this point, all information for subframe has been received on FH interface
// If this proc is to provide synchronization, do so // If this proc is to provide synchronization, do so
...@@ -750,8 +752,18 @@ static void *ru_thread( void *param ) { ...@@ -750,8 +752,18 @@ static void *ru_thread( void *param ) {
return NULL; return NULL;
} }
int init_rf(RU_t *ru) {
char name[256];
pthread_getname_np(pthread_self(),name, 255);
pthread_setname_np(pthread_self(),"UHD for OAI");
int ret=openair0_device_load(&ru->rfdevice,&ru->openair0_cfg);
pthread_setname_np(pthread_self(),name);
return ret;
}
int start_rf(RU_t *ru) { int start_rf(RU_t *ru) {
return(ru->rfdevice.trx_start_func(&ru->rfdevice)); int ret=ru->rfdevice.trx_start_func(&ru->rfdevice);
return ret;
} }
int stop_rf(RU_t *ru) { int stop_rf(RU_t *ru) {
......
...@@ -11,7 +11,8 @@ ...@@ -11,7 +11,8 @@
#define DU_PORT "8787" #define DU_PORT "8787"
#define MTU 65536 #define MTU 65536
#define UDP_TIMEOUT 1000L // in micro second (struct timeval, NOT struct timespec) #define UDP_TIMEOUT 900000L // in micro second (struct timeval, NOT struct timespec)
// linux may timeout for a much longer time (up to 10ms)
#define MAX_BLOCKS 16 #define MAX_BLOCKS 16
#define blockAlign 32 //bytes #define blockAlign 32 //bytes
...@@ -236,8 +237,9 @@ void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_ ...@@ -236,8 +237,9 @@ void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_
void *cu_fs6(void *arg); void *cu_fs6(void *arg);
void *du_fs6(void *arg); void *du_fs6(void *arg);
void fill_rf_config(RU_t *ru, char *rf_config_file); void fill_rf_config(RU_t *ru, char *rf_config_file);
int init_rf(RU_t *ru);
void rx_rf(RU_t *ru, L1_rxtx_proc_t *proc); void rx_rf(RU_t *ru, L1_rxtx_proc_t *proc);
void tx_rf(RU_t *ru, L1_rxtx_proc_t *proc); int tx_rf(RU_t *ru, L1_rxtx_proc_t *proc);
void common_signal_procedures (PHY_VARS_eNB *eNB,int frame, int subframe); void common_signal_procedures (PHY_VARS_eNB *eNB,int frame, int subframe);
void pmch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc); void pmch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc);
bool dlsch_procedures(PHY_VARS_eNB *eNB, bool dlsch_procedures(PHY_VARS_eNB *eNB,
......
...@@ -9124,9 +9124,10 @@ rrc_enb_task( ...@@ -9124,9 +9124,10 @@ rrc_enb_task(
itti_mark_task_ready(TASK_RRC_ENB); itti_mark_task_ready(TASK_RRC_ENB);
LOG_I(RRC,"Entering main loop of RRC message task\n"); LOG_I(RRC,"Entering main loop of RRC message task\n");
while (1) { //while (1) {
(void) rrc_enb_process_itti_msg(NULL); //(void) rrc_enb_process_itti_msg(NULL);
} //}
return NULL;
} }
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
......
...@@ -61,7 +61,7 @@ int create_tasks(uint32_t enb_nb) { ...@@ -61,7 +61,7 @@ int create_tasks(uint32_t enb_nb) {
rc = itti_create_task (TASK_RRC_ENB, rrc_enb_task, NULL); rc = itti_create_task (TASK_RRC_ENB, rrc_enb_task, NULL);
AssertFatal(rc >= 0, "Create task for RRC eNB failed\n"); AssertFatal(rc >= 0, "Create task for RRC eNB failed\n");
if (EPC_MODE_ENABLED) { if (EPC_MODE_ENABLED && !fs6Du ) {
rc = itti_create_task(TASK_SCTP, sctp_eNB_task, NULL); rc = itti_create_task(TASK_SCTP, sctp_eNB_task, NULL);
AssertFatal(rc >= 0, "Create task for SCTP failed\n"); AssertFatal(rc >= 0, "Create task for SCTP failed\n");
} }
......
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