diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 5577f707fb7a3f620a3c3dc2ade58b9883719f6b..707ffa1b5d4ab3869865f2e24bec8fed749639bd 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -2471,19 +2471,14 @@ class SSHConnection(): if (not os.path.isfile('./' + UElogFile)): return -1 ue_log_file = open('./' + UElogFile, 'r') -<<<<<<< HEAD exitSignalReceived = False -======= ->>>>>>> origin/develop-nr foundAssertion = False msgAssertion = '' msgLine = 0 foundSegFault = False foundRealTimeIssue = False -<<<<<<< HEAD uciStatMsgCount = 0 pdcpDataReqFailedCount = 0 - badDciCount = 0 rrcConnectionRecfgComplete = 0 no_cell_sync_found = False mib_found = False @@ -2505,35 +2500,11 @@ class SSHConnection(): foundAssertion = True result = re.search('LLL', str(line)) if result is not None and not exitSignalReceived: -======= - rlcDiscardBuffer = 0 - rachCanceledProcedure = 0 - uciStatMsgCount = 0 - pdcpFailure = 0 - ulschFailure = 0 - no_cell_sync_found = False - mib_found = False - frequency_found = False - self.htmlUEFailureMsg = '' - for line in ue_log_file.readlines(): - result = re.search('[Ss]egmentation [Ff]ault', str(line)) - if result is not None: - foundSegFault = True - result = re.search('[Cc]ore [dD]ump', str(line)) - if result is not None: - foundSegFault = True - result = re.search('[Aa]ssertion', str(line)) - if result is not None: - foundAssertion = True - result = re.search('LLL', str(line)) - if result is not None: ->>>>>>> origin/develop-nr foundRealTimeIssue = True if foundAssertion and (msgLine < 3): msgLine += 1 msgAssertion += str(line) result = re.search('uci->stat', str(line)) -<<<<<<< HEAD if result is not None and not exitSignalReceived: uciStatMsgCount += 1 result = re.search('PDCP data request failed', str(line)) @@ -2545,10 +2516,6 @@ class SSHConnection(): result = re.search('Generating RRCConnectionReconfigurationComplete', str(line)) if result is not None: rrcConnectionRecfgComplete += 1 -======= - if result is not None: - uciStatMsgCount += 1 ->>>>>>> origin/develop-nr # No cell synchronization found, abandoning result = re.search('No cell synchronization found, abandoning', str(line)) if result is not None: @@ -2586,7 +2553,6 @@ class SSHConnection(): frequency_found = True except Exception as e: logging.error('\033[91m' + "Measured Carrier Frequency not found" + '\033[0m') -<<<<<<< HEAD result = re.search("PLMN MCC (?P<mcc>\d{1,3}), MNC (?P<mnc>\d{1,3}), TAC", str(line)) if result is not None and (not plmn_found): try: @@ -2596,8 +2562,6 @@ class SSHConnection(): plmn_found = True except Exception as e: logging.error('\033[91m' + "PLMN not found" + '\033[0m') -======= ->>>>>>> origin/develop-nr result = re.search("Found (?P<operator>[\w,\s]{1,15}) \(name from internal table\)", str(line)) if result is not None: try: @@ -2633,18 +2597,14 @@ class SSHConnection(): except Exception as e: logging.error('\033[91m' + " AllowedMeasBandwidth not found" + '\033[0m') ue_log_file.close() -<<<<<<< HEAD if rrcConnectionRecfgComplete > 0: statMsg = 'UE connected to eNB (' + str(rrcConnectionRecfgComplete) + ' RRCConnectionReconfigurationComplete message(s) generated)' logging.debug('\033[94m' + statMsg + '\033[0m') self.htmlUEFailureMsg += statMsg + '\n' -======= ->>>>>>> origin/develop-nr if uciStatMsgCount > 0: statMsg = 'UE showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)' logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') self.htmlUEFailureMsg += statMsg + '\n' -<<<<<<< HEAD if pdcpDataReqFailedCount > 0: statMsg = 'UE showed ' + str(pdcpDataReqFailedCount) + ' "PDCP data request failed" message(s)' logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') @@ -2653,20 +2613,6 @@ class SSHConnection(): statMsg = 'UE showed ' + str(badDciCount) + ' "bad DCI 1A" message(s)' logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') self.htmlUEFailureMsg += statMsg + '\n' -======= - if pdcpFailure > 0: - statMsg = 'UE showed ' + str(pdcpFailure) + ' "PDCP Out of Resources" message(s)' - logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') - self.htmlUEFailureMsg += statMsg + '\n' - if ulschFailure > 0: - statMsg = 'UE showed ' + str(ulschFailure) + ' "ULSCH in error in round" message(s)' - logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') - self.htmlUEFailureMsg += statMsg + '\n' - if rachCanceledProcedure > 0: - rachMsg = 'UE cancelled ' + str(rachCanceledProcedure) + ' RA procedure(s)' - logging.debug('\u001B[1;30;43m ' + rachMsg + ' \u001B[0m') - self.htmlUEFailureMsg += rachMsg + '\n' ->>>>>>> origin/develop-nr if foundSegFault: logging.debug('\u001B[1;37;41m UE ended with a Segmentation Fault! \u001B[0m') return ENB_PROCESS_SEG_FAULT @@ -2684,48 +2630,22 @@ class SSHConnection(): if no_cell_sync_found and not mib_found: logging.debug('\u001B[1;37;41m UE could not synchronize ! \u001B[0m') self.htmlUEFailureMsg += 'UE could not synchronize!\n' -<<<<<<< HEAD - return UE_PROCESS_COULD_NOT_SYNC -======= return UE_PROCESS_COULD_NOT_SYNC - if rlcDiscardBuffer > 0: - rlcMsg = 'UE RLC discarded ' + str(rlcDiscardBuffer) + ' buffer(s)' - logging.debug('\u001B[1;37;41m ' + rlcMsg + ' \u001B[0m') - self.htmlUEFailureMsg += rlcMsg + '\n' - return ENB_PROCESS_REALTIME_ISSUE ->>>>>>> origin/develop-nr return 0 def TerminateeNB(self): self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword) self.command('cd ' + self.eNBSourceCodePath + '/cmake_targets', '\$', 5) -<<<<<<< HEAD self.command('stdbuf -o0 ps -aux | grep --color=never softmodem | grep -v grep', '\$', 5) - result = re.search('lte-softmodem', str(self.ssh.before)) - if result is not None: - self.command('echo ' + self.eNBPassword + ' | sudo -S daemon --name=enb' + str(self.eNB_instance) + '_daemon --stop', '\$', 5) - self.command('echo ' + self.eNBPassword + ' | sudo -S killall --signal SIGINT lte-softmodem || true', '\$', 5) -======= - #to use daemon on CentOS we need to source the function - #linux_distro = platform.linux_distribution()[0] - #if re.match('(.*)CentOS(.*)', linux_distro, re.IGNORECASE): - #self.command('source /etc/init.d/functions', '\$', 5) - #use nohup instead of daemon - self.command('echo ' + self.eNBPassword + ' | sudo -S daemon --name=enb' + str(self.eNB_instance) + '_daemon --stop', '\$', 5) - self.command('rm -f my-lte-softmodem-run' + str(self.eNB_instance) + '.sh', '\$', 5) - self.command('echo ' + self.eNBPassword + ' | sudo -S killall --signal SIGINT -r .*-softmodem || true', '\$', 5) - time.sleep(5) - self.command('stdbuf -o0 ps -aux | grep softmodem | grep -v grep', '\$', 5) result = re.search('-softmodem', str(self.ssh.before)) if result is not None: - self.command('echo ' + self.eNBPassword + ' | sudo -S killall --signal SIGKILL -r .*-softmodem || true', '\$', 5) ->>>>>>> origin/develop-nr + self.command('echo ' + self.eNBPassword + ' | sudo -S daemon --name=enb' + str(self.eNB_instance) + '_daemon --stop', '\$', 5) + self.command('echo ' + self.eNBPassword + ' | sudo -S killall --signal SIGINT -r .*-softmodem || true', '\$', 5) time.sleep(5) - self.command('stdbuf -o0 ps -aux | grep --color=never softmodem | grep -v grep', '\$', 5) - result = re.search('lte-softmodem', str(self.ssh.before)) + self.command('stdbuf -o0 ps -aux | grep softmodem | grep -v grep', '\$', 5) + result = re.search('-softmodem', str(self.ssh.before)) if result is not None: - self.command('echo ' + self.eNBPassword + ' | sudo -S killall --signal SIGKILL lte-softmodem || true', '\$', 5) - time.sleep(2) + self.command('echo ' + self.eNBPassword + ' | sudo -S killall --signal SIGKILL -r .*-softmodem || true', '\$', 5) self.command('rm -f my-lte-softmodem-run' + str(self.eNB_instance) + '.sh', '\$', 5) self.close() # If tracer options is on, stopping tshark on EPC side @@ -2871,52 +2791,29 @@ class SSHConnection(): def TerminateOAIUE(self): self.open(self.UEIPAddress, self.UEUserName, self.UEPassword) self.command('cd ' + self.UESourceCodePath + '/cmake_targets', '\$', 5) -<<<<<<< HEAD self.command('ps -aux | grep --color=never softmodem | grep -v grep', '\$', 5) - result = re.search('lte-uesoftmodem', str(self.ssh.before)) + result = re.search('-uesoftmodem', str(self.ssh.before)) if result is not None: - self.command('echo ' + self.UEPassword + ' | sudo -S daemon --name=ue' + str(self.UE_instance) + '_daemon --stop', '\$', 5) - self.command('echo ' + self.UEPassword + ' | sudo -S killall --signal SIGINT lte-uesoftmodem || true', '\$', 5) + self.command('echo ' + self.UEPassword + ' | sudo -S killall --signal SIGINT -r .*-uesoftmodem || true', '\$', 5) time.sleep(5) - self.command('ps -aux | grep --color=never softmodem | grep -v grep', '\$', 5) - result = re.search('lte-uesoftmodem', str(self.ssh.before)) + self.command('stdbuf -o0 ps -aux | grep uesoftmodem | grep -v grep', '\$', 5) + result = re.search('-uesoftmodem', str(self.ssh.before)) if result is not None: - self.command('echo ' + self.UEPassword + ' | sudo -S killall --signal SIGKILL lte-uesoftmodem || true', '\$', 5) - time.sleep(2) - self.command('rm -f my-lte-uesoftmodem-run' + str(self.UE_instance) + '.sh', '\$', 5) -======= - #to use daemon on CentOS we need to source the function - #linux_distro = platform.linux_distribution()[0] - #if re.match('(.*)CentOS(.*)', linux_distro, re.IGNORECASE): - #self.command('source /etc/init.d/functions', '\$', 5) - #self.command('echo ' + self.UEPassword + ' | sudo -S daemon --name=ue' + str(self.UE_instance) + '_daemon --stop', '\$', 5) + self.command('echo ' + self.UEPassword + ' | sudo -S killall --signal SIGKILL -r .*-uesoftmodem || true', '\$', 5) + time.sleep(5) self.command('rm -f my-lte-uesoftmodem-run' + str(self.UE_instance) + '.sh', '\$', 5) - self.command('echo ' + self.UEPassword + ' | sudo -S killall --signal SIGINT -r .*-uesoftmodem || true', '\$', 5) - time.sleep(5) - self.command('stdbuf -o0 ps -aux | grep uesoftmodem | grep -v grep', '\$', 5) - result = re.search('-uesoftmodem', str(self.ssh.before)) - if result is not None: - self.command('echo ' + self.UEPassword + ' | sudo -S killall --signal SIGKILL -r .*-uesoftmodem || true', '\$', 5) - time.sleep(5) ->>>>>>> origin/develop-nr self.close() result = re.search('ue_', str(self.UELogFile)) if result is not None: copyin_res = self.copyin(self.UEIPAddress, self.UEUserName, self.UEPassword, self.UESourceCodePath + '/cmake_targets/' + self.UELogFile, '.') if (copyin_res == -1): logging.debug('\u001B[1;37;41m Could not copy UE logfile to analyze it! \u001B[0m') -<<<<<<< HEAD self.htmlUEFailureMsg = 'Could not copy UE logfile to analyze it!' self.CreateHtmlTestRow('N/A', 'KO', UE_PROCESS_NOLOGFILE_TO_ANALYZE, 'UE') -======= - optionsMsg = '<pre style="background-color:white">Could not copy UE logfile to analyze it!</pre>' - self.CreateHtmlTestRow(optionsMsg, 'KO', UE_PROCESS_NOLOGFILE_TO_ANALYZE, 'UE') ->>>>>>> origin/develop-nr self.UELogFile = '' return logging.debug('\u001B[1m Analyzing UE logfile \u001B[0m') logStatus = self.AnalyzeLogFile_UE(self.UELogFile) -<<<<<<< HEAD result = re.search('--no-L2-connect', str(self.Initialize_OAI_UE_args)) if result is not None: ueAction = 'Sniffing' @@ -2941,23 +2838,6 @@ class SSHConnection(): else: self.htmlUEFailureMsg = 'No Log File to analyze!' self.CreateHtmlTestRow('N/A', 'OK', ALL_PROCESSES_OK) -======= - if (logStatus < 0): - optionsMsg = '<pre style="background-color:white"><b>Sniffing Unsuccessful</b>\n' - optionsMsg += self.htmlUEFailureMsg - optionsMsg += '</pre>' - self.CreateHtmlTestRow(optionsMsg, 'KO', logStatus, 'UE') - self.CreateHtmlTabFooter(False) - sys.exit(1) - else: - optionsMsg = '<pre style="background-color:white"><b>Sniffing Successful</b>\n' - optionsMsg += self.htmlUEFailureMsg - optionsMsg += '</pre>' - self.CreateHtmlTestRow(optionsMsg, 'OK', ALL_PROCESSES_OK) - self.UELogFile = '' - else: - self.CreateHtmlTestRow('<pre style="background-color:white">No Log File to analyze</pre>', 'OK', ALL_PROCESSES_OK) ->>>>>>> origin/develop-nr def AutoTerminateUEandeNB(self): if (self.ADBIPAddress != 'none'): diff --git a/openair1/PHY/defs_RU.h b/openair1/PHY/defs_RU.h index 76769ed4db3866767b88eae7226f99eb94ec3fbb..e07b09d9fd563d82c9094c06bd10271f53e12337 100644 --- a/openair1/PHY/defs_RU.h +++ b/openair1/PHY/defs_RU.h @@ -35,6 +35,7 @@ #define MAX_BANDS_PER_RRU 4 +#define MAX_RRU_CONFIG_SIZE 1024 #ifdef OCP_FRAMEWORK @@ -272,9 +273,9 @@ typedef struct RU_proc_t_s { /// symbol mask for IF4p5 reception per subframe uint32_t symbol_mask[10]; /// number of slave threads - int num_slaves; + int num_slaves; /// array of pointers to slaves - struct RU_proc_t_s **slave_proc; + struct RU_proc_t_s **slave_proc; #ifdef PHY_TX_THREAD /// pthread structure for PRACH thread pthread_t pthread_phy_tx; @@ -323,7 +324,7 @@ typedef enum { typedef struct RU_t_s{ /// index of this ru uint32_t idx; - /// Pointer to configuration file + /// Pointer to configuration file char *rf_config_file; /// southbound interface RU_if_south_t if_south; @@ -340,7 +341,7 @@ typedef struct RU_t_s{ /// flag to indicate the RU is a slave to another source int is_slave; /// Total gain of receive chain - uint32_t rx_total_gain_dB; + uint32_t rx_total_gain_dB; /// number of bands that this device can support int num_bands; /// band list @@ -363,7 +364,11 @@ typedef struct RU_t_s{ struct LTE_DL_FRAME_PARMS *frame_parms; struct NR_DL_FRAME_PARMS *nr_frame_parms; ///timing offset used in TDD - int N_TA_offset; + int N_TA_offset; + /// SF extension used in TDD (unit: number of samples at 30.72MHz) (this is an expert option) + int sf_extension; + /// "end of burst delay" used in TDD (unit: number of samples at 30.72MHz) (this is an expert option) + int end_of_burst_delay; /// RF device descriptor openair0_device rfdevice; /// HW configuration @@ -373,49 +378,49 @@ typedef struct RU_t_s{ int num_gNB; /// list of NBs using this RU struct PHY_VARS_eNB_s *eNB_list[NUMBER_OF_eNB_MAX]; - struct PHY_VARS_gNB_s *gNB_list[NUMBER_OF_eNB_MAX]; + struct PHY_VARS_gNB_s *gNB_list[NUMBER_OF_gNB_MAX]; /// Mapping of antenna ports to RF chain index - openair0_rf_map rf_map; + openair0_rf_map rf_map; /// IF device descriptor openair0_device ifdevice; /// Pointer for ifdevice buffer struct if_buffer_t ifbuffer; /// if prach processing is to be performed in RU - int do_prach; + int do_prach; /// function pointer to synchronous RX fronthaul function (RRU,3GPP_eNB/3GPP_gNB) - void (*fh_south_in)(struct RU_t_s *ru,int *frame, int *subframe); + void (*fh_south_in)(struct RU_t_s *ru,int *frame, int *subframe); /// function pointer to synchronous TX fronthaul function - void (*fh_south_out)(struct RU_t_s *ru); + void (*fh_south_out)(struct RU_t_s *ru); /// function pointer to synchronous RX fronthaul function (RRU) - void (*fh_north_in)(struct RU_t_s *ru,int *frame, int *subframe); + void (*fh_north_in)(struct RU_t_s *ru,int *frame, int *subframe); /// function pointer to synchronous RX fronthaul function (RRU) - void (*fh_north_out)(struct RU_t_s *ru); + void (*fh_north_out)(struct RU_t_s *ru); /// function pointer to asynchronous fronthaul interface - void (*fh_north_asynch_in)(struct RU_t_s *ru,int *frame, int *subframe); + void (*fh_north_asynch_in)(struct RU_t_s *ru,int *frame, int *subframe); /// function pointer to asynchronous fronthaul interface - void (*fh_south_asynch_in)(struct RU_t_s *ru,int *frame, int *subframe); + void (*fh_south_asynch_in)(struct RU_t_s *ru,int *frame, int *subframe); /// function pointer to initialization function for radio interface - int (*start_rf)(struct RU_t_s *ru); + int (*start_rf)(struct RU_t_s *ru); /// function pointer to release function for radio interface - int (*stop_rf)(struct RU_t_s *ru); + int (*stop_rf)(struct RU_t_s *ru); /// function pointer to initialization function for radio interface - int (*start_if)(struct RU_t_s *ru,struct PHY_VARS_gNB_s *gNB); + int (*start_if)(struct RU_t_s *ru, struct PHY_VARS_eNB_s *eNB); + int (*nr_start_if)(struct RU_t_s *ru, struct PHY_VARS_gNB_s *gNB); /// function pointer to RX front-end processing routine (DFTs/prefix removal or NULL) - void (*feprx)(struct RU_t_s *ru); + void (*feprx)(struct RU_t_s *ru); /// function pointer to TX front-end processing routine (IDFTs and prefix removal or NULL) - void (*feptx_ofdm)(struct RU_t_s *ru); + void (*feptx_ofdm)(struct RU_t_s *ru); /// function pointer to TX front-end processing routine (PRECODING) - void (*feptx_prec)(struct RU_t_s *ru); + void (*feptx_prec)(struct RU_t_s *ru); /// function pointer to wakeup routine in lte-enb/nr-gnb. int (*wakeup_rxtx)(struct PHY_VARS_eNB_s *eNB, struct RU_t_s *ru); int (*nr_wakeup_rxtx)(struct PHY_VARS_gNB_s *gNB, struct RU_t_s *ru); /// function pointer to wakeup routine in lte-enb/nr-gnb. - void (*wakeup_prach_eNB)(struct PHY_VARS_eNB_s *eNB,struct RU_t_s *ru,int frame,int subframe); - - void (*wakeup_prach_gNB)(struct PHY_VARS_gNB_s *gNB,struct RU_t_s *ru,int frame,int subframe); + void (*wakeup_prach_eNB)(struct PHY_VARS_eNB_s *eNB, struct RU_t_s *ru, int frame, int subframe); + void (*wakeup_prach_gNB)(struct PHY_VARS_gNB_s *gNB, struct RU_t_s *ru, int frame, int subframe); #if (RRC_VERSION >= MAKE_VERSION(14, 0, 0)) /// function pointer to wakeup routine in lte-enb. - void (*wakeup_prach_eNB_br)(struct PHY_VARS_eNB_s *eNB,struct RU_t_s *ru,int frame,int subframe); + void (*wakeup_prach_eNB_br)(struct PHY_VARS_eNB_s *eNB, struct RU_t_s *ru, int frame, int subframe); #endif /// function pointer to NB entry routine @@ -443,29 +448,25 @@ typedef struct RU_t_s{ /// Timing statistics (Fronthaul transport) time_stats_t transport; /// RX and TX buffers for precoder output - RU_COMMON common; + RU_COMMON common; /// beamforming weight vectors per eNB int32_t **beam_weights[NUMBER_OF_eNB_MAX+1][15]; - /// beamforming weight vectors per eNB + /// beamforming weight vectors per gNB int32_t **nrbeam_weights[NUMBER_OF_gNB_MAX+1][16]; /// received frequency-domain signal for PRACH (IF4p5 RRU) - int16_t **prach_rxsigF; + int16_t **prach_rxsigF; /// received frequency-domain signal for PRACH BR (IF4p5 RRU) - int16_t **prach_rxsigF_br[4]; + int16_t **prach_rxsigF_br[4]; /// sequence number for IF5 uint8_t seqno; /// initial timestamp used as an offset make first real timestamp 0 - openair0_timestamp ts_offset; + openair0_timestamp ts_offset; /// process scheduling variables - RU_proc_t proc; + RU_proc_t proc; /// stats thread pthread descriptor - pthread_t ru_stats_thread; - + pthread_t ru_stats_thread; } RU_t; - - -#define MAX_RRU_CONFIG_SIZE 1024 typedef enum { RAU_tick=0, RRU_capabilities=1, @@ -487,8 +488,6 @@ typedef enum { MAX_FH_FMTs =4 } FH_fmt_options_t; -#define MAX_BANDS_PER_RRU 4 - typedef struct RRU_capabilities_s { /// Fronthaul format FH_fmt_options_t FH_fmt; @@ -513,7 +512,6 @@ typedef struct RRU_capabilities_s { } RRU_capabilities_t; typedef struct RRU_config_s { - /// Fronthaul format RU_if_south_t FH_fmt; /// number of EUTRA bands (<=4) configured in RRU diff --git a/openair1/PHY/defs_eNB.h b/openair1/PHY/defs_eNB.h index 4d2ff771d0932a2416ba6fd13c6ec806f7d3562d..87b999d54ee0654c984944a680971d29c3712e65 100644 --- a/openair1/PHY/defs_eNB.h +++ b/openair1/PHY/defs_eNB.h @@ -34,30 +34,26 @@ #define _GNU_SOURCE +#include <execinfo.h> +#include <getopt.h> +#include <malloc.h> +#include <math.h> +#include <pthread.h> #include <sched.h> +#include <signal.h> #include <stdio.h> #include <stdlib.h> -#include <unistd.h> #include <string.h> +#include <unistd.h> +#include <linux/sched.h> #include <sys/ioctl.h> -#include <sys/types.h> #include <sys/mman.h> -#include <linux/sched.h> -#include <signal.h> -#include <execinfo.h> -#include <getopt.h> #include <sys/sysinfo.h> +#include <sys/types.h> -#include <stdio.h> -#include <stdlib.h> -#include <malloc.h> -#include <string.h> -#include <math.h> #include "common_lib.h" #include "msc.h" - - #include "defs_common.h" #include "impl_defs_top.h" #include "PHY/TOOLS/time_meas.h" @@ -66,445 +62,19 @@ #include "platform_types.h" #include "PHY/LTE_TRANSPORT/transport_common.h" #include "PHY/LTE_TRANSPORT/transport_eNB.h" -#include <pthread.h> - - #include "openair2/PHY_INTERFACE/IF_Module.h" - -#define MAX_NUM_RU_PER_eNB 64 - -typedef struct RU_proc_t_s { - /// Pointer to associated RU descriptor - struct RU_t_s *ru; - /// timestamp received from HW - openair0_timestamp timestamp_rx; - /// timestamp to send to "slave rru" - openair0_timestamp timestamp_tx; - /// subframe to act upon for reception - int subframe_rx; - /// subframe to act upon for transmission - int subframe_tx; - /// subframe to act upon for reception of prach - int subframe_prach; -#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - /// subframe to act upon for reception of prach BL/CE UEs - int subframe_prach_br; -#endif - /// frame to act upon for reception - int frame_rx; - /// frame to act upon for transmission - int frame_tx; - /// unwrapped frame count - int frame_tx_unwrap; - /// frame to act upon for reception of prach - int frame_prach; -#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - /// frame to act upon for reception of prach - int frame_prach_br; -#endif - /// frame offset for slave RUs (to correct for frame asynchronism at startup) - int frame_offset; - /// \brief Instance count for FH processing thread. - /// \internal This variable is protected by \ref mutex_FH. - int instance_cnt_FH; - int instance_cnt_FH1; - /// \internal This variable is protected by \ref mutex_prach. - int instance_cnt_prach; -#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - /// \internal This variable is protected by \ref mutex_prach. - int instance_cnt_prach_br; -#endif - /// \internal This variable is protected by \ref mutex_synch. - int instance_cnt_synch; - /// \internal This variable is protected by \ref mutex_eNBs. - int instance_cnt_eNBs; - /// \brief Instance count for rx processing thread. - /// \internal This variable is protected by \ref mutex_asynch_rxtx. - int instance_cnt_asynch_rxtx; - /// \internal This variable is protected by \ref mutex_fep - int instance_cnt_fep; - /// \internal This variable is protected by \ref mutex_feptx - int instance_cnt_feptx; - /// This varible is protected by \ref mutex_emulatedRF - int instance_cnt_emulateRF; - /// pthread structure for RU FH processing thread - pthread_t pthread_FH; - pthread_t pthread_FH1; - /// pthread structure for RU prach processing thread - pthread_t pthread_prach; -#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - /// pthread structure for RU prach processing thread BL/CE UEs - pthread_t pthread_prach_br; -#endif - /// pthread struct for RU synch thread - pthread_t pthread_synch; - /// pthread struct for RU RX FEP worker thread - pthread_t pthread_fep; - /// pthread struct for RU TX FEP worker thread - pthread_t pthread_feptx; - /// pthread struct for emulated RF - pthread_t pthread_emulateRF; - /// pthread structure for asychronous RX/TX processing thread - pthread_t pthread_asynch_rxtx; - /// flag to indicate first RX acquisition - int first_rx; - /// flag to indicate first TX transmission - int first_tx; - /// pthread attributes for RU FH processing thread - pthread_attr_t attr_FH; - pthread_attr_t attr_FH1; - /// pthread attributes for RU prach - pthread_attr_t attr_prach; -#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - /// pthread attributes for RU prach BL/CE UEs - pthread_attr_t attr_prach_br; -#endif - /// pthread attributes for RU synch thread - pthread_attr_t attr_synch; - /// pthread attributes for asynchronous RX thread - pthread_attr_t attr_asynch_rxtx; - /// pthread attributes for worker fep thread - pthread_attr_t attr_fep; - /// pthread attributes for worker feptx thread - pthread_attr_t attr_feptx; - /// pthread attributes for emulated RF - pthread_attr_t attr_emulateRF; - /// scheduling parameters for RU FH thread - struct sched_param sched_param_FH; - struct sched_param sched_param_FH1; - /// scheduling parameters for RU prach thread - struct sched_param sched_param_prach; -#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - /// scheduling parameters for RU prach thread BL/CE UEs - struct sched_param sched_param_prach_br; -#endif - /// scheduling parameters for RU synch thread - struct sched_param sched_param_synch; - /// scheduling parameters for asynch_rxtx thread - struct sched_param sched_param_asynch_rxtx; - /// condition variable for RU FH thread - pthread_cond_t cond_FH; - pthread_cond_t cond_FH1; - /// condition variable for RU prach thread - pthread_cond_t cond_prach; -#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - /// condition variable for RU prach thread BL/CE UEs - pthread_cond_t cond_prach_br; -#endif - /// condition variable for RU synch thread - pthread_cond_t cond_synch; - /// condition variable for asynch RX/TX thread - pthread_cond_t cond_asynch_rxtx; - /// condition variable for RU RX FEP thread - pthread_cond_t cond_fep; - /// condition variable for RU TX FEP thread - pthread_cond_t cond_feptx; - /// condition variable for emulated RF - pthread_cond_t cond_emulateRF; - /// condition variable for eNB signal - pthread_cond_t cond_eNBs; - /// mutex for RU FH - pthread_mutex_t mutex_FH; - pthread_mutex_t mutex_FH1; - /// mutex for RU prach - pthread_mutex_t mutex_prach; -#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - /// mutex for RU prach BL/CE UEs - pthread_mutex_t mutex_prach_br; -#endif - /// mutex for RU synch - pthread_mutex_t mutex_synch; - /// mutex for eNB signal - pthread_mutex_t mutex_eNBs; - /// mutex for asynch RX/TX thread - pthread_mutex_t mutex_asynch_rxtx; - /// mutex for fep RX worker thread - pthread_mutex_t mutex_fep; - /// mutex for fep TX worker thread - pthread_mutex_t mutex_feptx; - /// mutex for emulated RF thread - pthread_mutex_t mutex_emulateRF; - /// symbol mask for IF4p5 reception per subframe - uint32_t symbol_mask[10]; - /// number of slave threads - int num_slaves; - /// array of pointers to slaves - struct RU_proc_t_s **slave_proc; -#ifdef PHY_TX_THREAD - /// pthread structure for PRACH thread - pthread_t pthread_phy_tx; - pthread_mutex_t mutex_phy_tx; - pthread_cond_t cond_phy_tx; - /// \internal This variable is protected by \ref mutex_phy_tx. - int instance_cnt_phy_tx; - /// frame to act upon for transmission - int frame_phy_tx; - /// subframe to act upon for transmission - int subframe_phy_tx; - /// timestamp to send to "slave rru" - openair0_timestamp timestamp_phy_tx; - /// pthread structure for RF TX thread - pthread_t pthread_rf_tx; - pthread_mutex_t mutex_rf_tx; - pthread_cond_t cond_rf_tx; - /// \internal This variable is protected by \ref mutex_rf_tx. - int instance_cnt_rf_tx; -#endif -#if defined(PRE_SCD_THREAD) - pthread_t pthread_pre_scd; - /// condition variable for time processing thread - pthread_cond_t cond_pre_scd; - /// mutex for time thread - pthread_mutex_t mutex_pre_scd; - int instance_pre_scd; -#endif - int emulate_rf_busy; -} RU_proc_t; - -typedef enum { - LOCAL_RF =0, - REMOTE_IF5 =1, - REMOTE_MBP_IF5 =2, - REMOTE_IF4p5 =3, - REMOTE_IF1pp =4, - MAX_RU_IF_TYPES =5 -} RU_if_south_t; - -typedef struct RU_t_s{ - /// index of this ru - uint32_t idx; - /// Pointer to configuration file - char *rf_config_file; - /// southbound interface - RU_if_south_t if_south; - /// timing - node_timing_t if_timing; - /// function - node_function_t function; - /// Ethernet parameters for fronthaul interface - eth_params_t eth_params; - /// flag to indicate the RU is in synch with a master reference - int in_synch; - /// timing offset - int rx_offset; - /// flag to indicate the RU is a slave to another source - int is_slave; - /// Total gain of receive chain - uint32_t rx_total_gain_dB; - /// number of bands that this device can support - int num_bands; - /// band list - int band[MAX_BANDS_PER_RRU]; - /// number of RX paths on device - int nb_rx; - /// number of TX paths on device - int nb_tx; - /// maximum PDSCH RS EPRE - int max_pdschReferenceSignalPower; - /// maximum RX gain - int max_rxgain; - /// Attenuation of RX paths on device - int att_rx; - /// Attenuation of TX paths on device - int att_tx; - /// flag to indicate precoding operation in RU - int do_precoding; - /// Frame parameters - LTE_DL_FRAME_PARMS frame_parms; - ///timing offset used in TDD - int N_TA_offset; - /// SF extension used in TDD (unit: number of samples at 30.72MHz) (this is an expert option) - int sf_extension; - /// "end of burst delay" used in TDD (unit: number of samples at 30.72MHz) (this is an expert option) - int end_of_burst_delay; - /// RF device descriptor - openair0_device rfdevice; - /// HW configuration - openair0_config_t openair0_cfg; - /// Number of eNBs using this RU - int num_eNB; - /// list of eNBs using this RU - struct PHY_VARS_eNB_s *eNB_list[NUMBER_OF_eNB_MAX]; - /// Mapping of antenna ports to RF chain index - openair0_rf_map rf_map; - /// IF device descriptor - openair0_device ifdevice; - /// Pointer for ifdevice buffer struct - if_buffer_t ifbuffer; - /// if prach processing is to be performed in RU - int do_prach; - /// function pointer to synchronous RX fronthaul function (RRU,3GPP_eNB) - void (*fh_south_in)(struct RU_t_s *ru,int *frame, int *subframe); - /// function pointer to synchronous TX fronthaul function - void (*fh_south_out)(struct RU_t_s *ru); - /// function pointer to synchronous RX fronthaul function (RRU) - void (*fh_north_in)(struct RU_t_s *ru,int *frame, int *subframe); - /// function pointer to synchronous RX fronthaul function (RRU) - void (*fh_north_out)(struct RU_t_s *ru); - /// function pointer to asynchronous fronthaul interface - void (*fh_north_asynch_in)(struct RU_t_s *ru,int *frame, int *subframe); - /// function pointer to asynchronous fronthaul interface - void (*fh_south_asynch_in)(struct RU_t_s *ru,int *frame, int *subframe); - /// function pointer to initialization function for radio interface - int (*start_rf)(struct RU_t_s *ru); - /// function pointer to release function for radio interface - int (*stop_rf)(struct RU_t_s *ru); - /// function pointer to initialization function for radio interface - int (*start_if)(struct RU_t_s *ru,struct PHY_VARS_eNB_s *eNB); - /// function pointer to RX front-end processing routine (DFTs/prefix removal or NULL) - void (*feprx)(struct RU_t_s *ru); - /// function pointer to TX front-end processing routine (IDFTs and prefix removal or NULL) - void (*feptx_ofdm)(struct RU_t_s *ru); - /// function pointer to TX front-end processing routine (PRECODING) - void (*feptx_prec)(struct RU_t_s *ru); - /// function pointer to wakeup routine in lte-enb. - int (*wakeup_rxtx)(struct PHY_VARS_eNB_s *eNB, struct RU_t_s *ru); - /// function pointer to wakeup routine in lte-enb. - void (*wakeup_prach_eNB)(struct PHY_VARS_eNB_s *eNB,struct RU_t_s *ru,int frame,int subframe); -#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - /// function pointer to wakeup routine in lte-enb. - void (*wakeup_prach_eNB_br)(struct PHY_VARS_eNB_s *eNB,struct RU_t_s *ru,int frame,int subframe); -#endif - /// function pointer to eNB entry routine - void (*eNB_top)(struct PHY_VARS_eNB_s *eNB, int frame_rx, int subframe_rx, char *string, struct RU_t_s *ru); - /// Timing statistics - time_stats_t ofdm_demod_stats; - /// Timing statistics (TX) - time_stats_t ofdm_mod_stats; - /// Timing wait statistics - time_stats_t ofdm_demod_wait_stats; - /// Timing wakeup statistics - time_stats_t ofdm_demod_wakeup_stats; - /// Timing wait statistics (TX) - time_stats_t ofdm_mod_wait_stats; - /// Timing wakeup statistics (TX) - time_stats_t ofdm_mod_wakeup_stats; - /// Timing statistics (RX Fronthaul + Compression) - time_stats_t rx_fhaul; - /// Timing statistics (TX Fronthaul + Compression) - time_stats_t tx_fhaul; - /// Timong statistics (Compression) - time_stats_t compression; - /// Timing statistics (Fronthaul transport) - time_stats_t transport; - /// RX and TX buffers for precoder output - RU_COMMON common; - /// beamforming weight vectors per eNB - int32_t **beam_weights[NUMBER_OF_eNB_MAX+1][15]; - - /// received frequency-domain signal for PRACH (IF4p5 RRU) - int16_t **prach_rxsigF; - /// received frequency-domain signal for PRACH BR (IF4p5 RRU) - int16_t **prach_rxsigF_br[4]; - /// sequence number for IF5 - uint8_t seqno; - /// initial timestamp used as an offset make first real timestamp 0 - openair0_timestamp ts_offset; - /// process scheduling variables - RU_proc_t proc; - /// stats thread pthread descriptor - pthread_t ru_stats_thread; - -} RU_t; - - - -#define MAX_RRU_CONFIG_SIZE 1024 -typedef enum { - RAU_tick=0, - RRU_capabilities=1, - RRU_config=2, - RRU_MSG_max_num=3 -} rru_config_msg_type_t; - -typedef struct RRU_CONFIG_msg_s { - rru_config_msg_type_t type; - ssize_t len; - uint8_t msg[MAX_RRU_CONFIG_SIZE]; -} RRU_CONFIG_msg_t; - -typedef enum { - OAI_IF5_only =0, - OAI_IF4p5_only =1, - OAI_IF5_and_IF4p5 =2, - MBP_IF5 =3, - MAX_FH_FMTs =4 -} FH_fmt_options_t; - -#define MAX_BANDS_PER_RRU 4 - -typedef struct RRU_capabilities_s { - /// Fronthaul format - FH_fmt_options_t FH_fmt; - /// number of EUTRA bands (<=4) supported by RRU - uint8_t num_bands; - /// EUTRA band list supported by RRU - uint8_t band_list[MAX_BANDS_PER_RRU]; - /// Number of concurrent bands (component carriers) - uint8_t num_concurrent_bands; - /// Maximum TX EPRE of each band - int8_t max_pdschReferenceSignalPower[MAX_BANDS_PER_RRU]; - /// Maximum RX gain of each band - uint8_t max_rxgain[MAX_BANDS_PER_RRU]; - /// Number of RX ports of each band - uint8_t nb_rx[MAX_BANDS_PER_RRU]; - /// Number of TX ports of each band - uint8_t nb_tx[MAX_BANDS_PER_RRU]; - /// max DL bandwidth (1,6,15,25,50,75,100) - uint8_t N_RB_DL[MAX_BANDS_PER_RRU]; - /// max UL bandwidth (1,6,15,25,50,75,100) - uint8_t N_RB_UL[MAX_BANDS_PER_RRU]; -} RRU_capabilities_t; - -typedef struct RRU_config_s { - - /// Fronthaul format - RU_if_south_t FH_fmt; - /// number of EUTRA bands (<=4) configured in RRU - uint8_t num_bands; - /// EUTRA band list configured in RRU - uint8_t band_list[MAX_BANDS_PER_RRU]; - /// TDD configuration (0-6) - uint8_t tdd_config[MAX_BANDS_PER_RRU]; - /// TDD special subframe configuration (0-10) - uint8_t tdd_config_S[MAX_BANDS_PER_RRU]; - /// TX frequency - uint32_t tx_freq[MAX_BANDS_PER_RRU]; - /// RX frequency - uint32_t rx_freq[MAX_BANDS_PER_RRU]; - /// TX attenation w.r.t. max - uint8_t att_tx[MAX_BANDS_PER_RRU]; - /// RX attenuation w.r.t. max - uint8_t att_rx[MAX_BANDS_PER_RRU]; - /// DL bandwidth - uint8_t N_RB_DL[MAX_BANDS_PER_RRU]; - /// UL bandwidth - uint8_t N_RB_UL[MAX_BANDS_PER_RRU]; - /// 3/4 sampling rate - uint8_t threequarter_fs[MAX_BANDS_PER_RRU]; - /// prach_FreqOffset for IF4p5 - int prach_FreqOffset[MAX_BANDS_PER_RRU]; - /// prach_ConfigIndex for IF4p5 - int prach_ConfigIndex[MAX_BANDS_PER_RRU]; -#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - int emtc_prach_CElevel_enable[MAX_BANDS_PER_RRU][4]; - /// emtc_prach_FreqOffset for IF4p5 per CE Level - int emtc_prach_FreqOffset[MAX_BANDS_PER_RRU][4]; - /// emtc_prach_ConfigIndex for IF4p5 per CE Level - int emtc_prach_ConfigIndex[MAX_BANDS_PER_RRU][4]; -#endif -} RRU_config_t; - -#include <pthread.h> - -#include "common_lib.h" #include "openairinterface5g_limits.h" +#define PBCH_A 24 #define NUMBER_OF_SUBBANDS_MAX 13 #define NUMBER_OF_HARQ_PID_MAX 8 - +#define MAX_BANDS_PER_RRU 4 #define MAX_FRAME_NUMBER 0x400 +#define MAX_NUM_RU_PER_eNB 64 +#define MAX_NUM_RX_PRACH_PREAMBLES 4 +#define MAX_RRU_CONFIG_SIZE 1024 + typedef struct { /// \brief Pointers (dynamic) to the received data in the time domain. @@ -606,14 +176,13 @@ typedef struct { int16_t *llr; } LTE_eNB_PUSCH; -#define PBCH_A 24 + typedef struct { uint8_t pbch_d[96+(3*(16+PBCH_A))]; uint8_t pbch_w[3*3*(16+PBCH_A)]; uint8_t pbch_e[1920]; } LTE_eNB_PBCH; -#define MAX_NUM_RX_PRACH_PREAMBLES 4 typedef struct { /// \brief ?. @@ -639,11 +208,6 @@ typedef struct { #endif } LTE_eNB_PRACH; -#include "PHY/TOOLS/time_meas.h" -#include "PHY/CODING/coding_defs.h" -#include "PHY/TOOLS/tools_defs.h" -#include "PHY/LTE_TRANSPORT/transport_eNB.h" - /// Context data structure for RX/TX portion of subframe processing typedef struct { /// Component Carrier index diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 24be9688dc08039c2df802b1e234b5568288dd29..61d39a12525d2220c58b916b2a3b262c32d24c3e 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -531,7 +531,7 @@ typedef struct PHY_VARS_gNB_s { module_id_t Mod_id; uint8_t CC_id; uint8_t configured; - gNB_L1_proc_t proc; + gNB_L1_proc_t proc; int single_thread_flag; int abstraction_flag; int num_RU; @@ -541,13 +541,13 @@ typedef struct PHY_VARS_gNB_s { /// Ethernet parameters for fronthaul interface eth_params_t eth_params; int rx_total_gain_dB; - int (*start_if)(struct RU_t_s *ru,struct PHY_VARS_gNB_s *gNB); + int (*nr_start_if)(struct RU_t_s *ru, struct PHY_VARS_gNB_s *gNB); uint8_t local_flag; nfapi_nr_config_request_t gNB_config; - NR_DL_FRAME_PARMS frame_parms; + NR_DL_FRAME_PARMS frame_parms; PHY_MEASUREMENTS_gNB measurements; - NR_IF_Module_t *if_inst; - NR_UL_IND_t UL_INFO; + NR_IF_Module_t *if_inst; + NR_UL_IND_t UL_INFO; pthread_mutex_t UL_INFO_mutex; /// NFAPI RX ULSCH information nfapi_rx_indication_pdu_t rx_pdu_list[NFAPI_RX_IND_MAX_PDU]; @@ -564,24 +564,24 @@ typedef struct PHY_VARS_gNB_s { /// NFAPI PRACH information nfapi_preamble_pdu_t preamble_list[MAX_NUM_RX_PRACH_PREAMBLES]; - Sched_Rsp_t Sched_INFO; - NR_gNB_PDCCH pdcch_vars; - NR_gNB_PBCH pbch; - LTE_eNB_PHICH phich_vars[2]; - - NR_gNB_COMMON common_vars; - LTE_eNB_UCI uci_vars[NUMBER_OF_UE_MAX]; - LTE_eNB_SRS srs_vars[NUMBER_OF_UE_MAX]; - LTE_eNB_PUSCH *pusch_vars[NUMBER_OF_UE_MAX]; - LTE_eNB_PRACH prach_vars; - NR_gNB_DLSCH_t *dlsch[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams - NR_gNB_ULSCH_t *ulsch[NUMBER_OF_UE_MAX+1][2]; // [Nusers times + number of RA][2 codewords], index 0 in [NUMBER_OF_UE_MAX+1] is for RA + Sched_Rsp_t Sched_INFO; + NR_gNB_PDCCH pdcch_vars; + NR_gNB_PBCH pbch; + LTE_eNB_PHICH phich_vars[2]; + + NR_gNB_COMMON common_vars; + LTE_eNB_UCI uci_vars[NUMBER_OF_UE_MAX]; + LTE_eNB_SRS srs_vars[NUMBER_OF_UE_MAX]; + LTE_eNB_PUSCH *pusch_vars[NUMBER_OF_UE_MAX]; + LTE_eNB_PRACH prach_vars; + NR_gNB_DLSCH_t *dlsch[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams + NR_gNB_ULSCH_t *ulsch[NUMBER_OF_UE_MAX+1][2]; // [Nusers times + number of RA][2 codewords], index 0 in [NUMBER_OF_UE_MAX+1] is for RA // LTE_eNB_ULSCH_t *ulsch[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA - NR_gNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p; - NR_gNB_DLSCH_t *dlsch_MCH; - NR_gNB_DLSCH_t *dlsch_PCH; - LTE_eNB_UE_stats UE_stats[NUMBER_OF_UE_MAX]; - LTE_eNB_UE_stats *UE_stats_ptr[NUMBER_OF_UE_MAX]; + NR_gNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p; + NR_gNB_DLSCH_t *dlsch_MCH; + NR_gNB_DLSCH_t *dlsch_PCH; + LTE_eNB_UE_stats UE_stats[NUMBER_OF_UE_MAX]; + LTE_eNB_UE_stats *UE_stats_ptr[NUMBER_OF_UE_MAX]; uint8_t pbch_configured; uint8_t pbch_pdu[4]; //PBCH_PDU_SIZE diff --git a/targets/RT/USER/nr-ru.c b/targets/RT/USER/nr-ru.c index c0598b9144d188bce1fd9ba3d7ab1029c1227204..5506e4841cddd216e44e11c6c5be7f9991f634d6 100644 --- a/targets/RT/USER/nr-ru.c +++ b/targets/RT/USER/nr-ru.c @@ -1428,9 +1428,9 @@ static void* ru_thread( void* param ) { } else{ // Start IF device if any - if (ru->start_if) { + if (ru->nr_start_if) { LOG_I(PHY,"Starting IF interface for RU %d\n",ru->idx); - AssertFatal(ru->start_if(ru,NULL) == 0, "Could not start the IF device\n"); + AssertFatal(ru->nr_start_if(ru,NULL) == 0, "Could not start the IF device\n"); if (ru->if_south == LOCAL_RF) ret = connect_rau(ru); else ret = attach_rru(ru); AssertFatal(ret==0,"Cannot connect to remote radio\n"); @@ -1671,7 +1671,7 @@ void *ru_thread_synch(void *arg) { } */ -int start_if(struct RU_t_s *ru,struct PHY_VARS_gNB_s *gNB) { +int nr_start_if(struct RU_t_s *ru,struct PHY_VARS_gNB_s *gNB) { return(ru->ifdevice.trx_start_func(&ru->ifdevice)); } @@ -2067,7 +2067,7 @@ void set_function_spec_param(RU_t *ru) ru->feprx = NULL; // nothing (this is a time-domain signal) ru->feptx_ofdm = NULL; // nothing (this is a time-domain signal) ru->feptx_prec = NULL; // nothing (this is a time-domain signal) - ru->start_if = start_if; // need to start the if interface for if5 + ru->nr_start_if = nr_start_if; // need to start the if interface for if5 ru->ifdevice.host_type = RRU_HOST; ru->rfdevice.host_type = RRU_HOST; ru->ifdevice.eth_params = &ru->eth_params; @@ -2092,7 +2092,7 @@ void set_function_spec_param(RU_t *ru) ru->feprx = (get_nprocs()<=2) ? fep_full :ru_fep_full_2thread; // RX DFTs ru->feptx_ofdm = (get_nprocs()<=2) ? nr_feptx_ofdm : nr_feptx_ofdm_2thread; // this is fep with idft only (no precoding in RRU) ru->feptx_prec = NULL; - ru->start_if = start_if; // need to start the if interface for if4p5 + ru->nr_start_if = nr_start_if; // need to start the if interface for if4p5 ru->ifdevice.host_type = RRU_HOST; ru->rfdevice.host_type = RRU_HOST; ru->ifdevice.eth_params = &ru->eth_params; @@ -2116,7 +2116,7 @@ void set_function_spec_param(RU_t *ru) ru->feptx_prec = feptx_prec; // this is fep with idft and precoding ru->fh_north_in = NULL; // no incoming fronthaul from north ru->fh_north_out = NULL; // no outgoing fronthaul to north - ru->start_if = NULL; // no if interface + ru->nr_start_if = NULL; // no if interface ru->rfdevice.host_type = RAU_HOST; } ru->fh_south_in = rx_rf; // local synchronous RF RX @@ -2149,7 +2149,7 @@ void set_function_spec_param(RU_t *ru) ru->fh_south_asynch_in = NULL; // no asynchronous UL ru->start_rf = NULL; // no local RF ru->stop_rf = NULL; - ru->start_if = start_if; // need to start if interface for IF5 + ru->nr_start_if = nr_start_if; // need to start if interface for IF5 ru->ifdevice.host_type = RAU_HOST; ru->ifdevice.eth_params = &ru->eth_params; ru->ifdevice.configure_rru = configure_ru; @@ -2174,7 +2174,7 @@ void set_function_spec_param(RU_t *ru) ru->fh_north_asynch_in = NULL; ru->start_rf = NULL; // no local RF ru->stop_rf = NULL; - ru->start_if = start_if; // need to start if interface for IF4p5 + ru->nr_start_if = nr_start_if; // need to start if interface for IF4p5 ru->ifdevice.host_type = RAU_HOST; ru->ifdevice.eth_params = &ru->eth_params; ru->ifdevice.configure_rru = configure_ru;