diff --git a/ci-scripts/conf_files/rcc.band38.tm1.50PRB.multi.rru.conf b/ci-scripts/conf_files/rcc.band38.tm1.50PRB.multi.rru.conf index 9b19536ba0ea52b82d07b9c728487888b9f8c1d2..b3899fdb6af99cac329720914e293cdbefc6e786 100644 --- a/ci-scripts/conf_files/rcc.band38.tm1.50PRB.multi.rru.conf +++ b/ci-scripts/conf_files/rcc.band38.tm1.50PRB.multi.rru.conf @@ -193,6 +193,7 @@ RUs = ( att_rx = 20; eNB_instances = [0]; is_slave = "no"; + ota_sync_enabled = "yes"; }, { local_if_name = "enp129s0f0"; @@ -210,6 +211,7 @@ RUs = ( att_rx = 20; eNB_instances = [0]; is_slave = "yes"; + ota_sync_enabled = "yes"; } ); diff --git a/ci-scripts/conf_files/rru.band38.tm1.master.conf b/ci-scripts/conf_files/rru.band38.tm1.master.conf index 2e4124c421506156aee8e4c9f460c7d0300d9c79..101ce83892e66d3d52ef1a70b55be9c24ca384e4 100644 --- a/ci-scripts/conf_files/rru.band38.tm1.master.conf +++ b/ci-scripts/conf_files/rru.band38.tm1.master.conf @@ -15,6 +15,7 @@ RUs = ( max_rxgain = 100; bands = [38]; is_slave = "no"; + ota_sync_enabled = "yes"; } ); diff --git a/ci-scripts/conf_files/rru.band38.tm1.slave.conf b/ci-scripts/conf_files/rru.band38.tm1.slave.conf index e4c65e148e537f7f7e017871f117ff186da6ce9d..d5efe6bd61ae925e9c08cf12350a6635abbcec27 100644 --- a/ci-scripts/conf_files/rru.band38.tm1.slave.conf +++ b/ci-scripts/conf_files/rru.band38.tm1.slave.conf @@ -15,6 +15,7 @@ RUs = ( max_rxgain = 100; bands = [38]; is_slave = "yes"; + ota_sync_enabled = "yes"; } ); diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 1074fcb92da3fa13a18369f758ab0e719fe5846d..22631a742f4ac7936f7a758534632fb3ec1b1bf6 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -58,6 +58,11 @@ OAI_UE_PROCESS_FAILED = -23 OAI_UE_PROCESS_NO_TUNNEL_INTERFACE = -24 OAI_UE_PROCESS_OK = +6 +UE_STATUS_DETACHED = 0 +UE_STATUS_DETACHING = 1 +UE_STATUS_ATTACHING = 2 +UE_STATUS_ATTACHED = 3 + #----------------------------------------------------------- # Import #----------------------------------------------------------- @@ -127,6 +132,7 @@ class SSHConnection(): self.iperf_profile = '' self.nbMaxUEtoAttach = -1 self.UEDevices = [] + self.UEDevicesStatus = [] self.CatMDevices = [] self.UEIPAddresses = [] self.htmlFile = '' @@ -350,6 +356,37 @@ class SSHConnection(): # Raphael: here add a check if git clone or git fetch went smoothly self.command('git config user.email "jenkins@openairinterface.org"', '\$', 5) self.command('git config user.name "OAI Jenkins"', '\$', 5) + # Checking the BUILD INFO file + if not self.backgroundBuild: + self.command('ls *.txt', '\$', 5) + result = re.search('LAST_BUILD_INFO', str(self.ssh.before)) + if result is not None: + mismatch = False + self.command('grep SRC_COMMIT LAST_BUILD_INFO.txt', '\$', 2) + result = re.search(self.ranCommitID, str(self.ssh.before)) + if result is None: + mismatch = True + self.command('grep MERGED_W_TGT_BRANCH LAST_BUILD_INFO.txt', '\$', 2) + if (self.ranAllowMerge): + result = re.search('YES', str(self.ssh.before)) + if result is None: + mismatch = True + self.command('grep TGT_BRANCH LAST_BUILD_INFO.txt', '\$', 2) + if self.ranTargetBranch == '': + result = re.search('develop', str(self.ssh.before)) + else: + result = re.search(self.ranTargetBranch, str(self.ssh.before)) + if result is None: + mismatch = True + else: + result = re.search('NO', str(self.ssh.before)) + if result is None: + mismatch = True + if not mismatch: + self.close() + self.CreateHtmlTestRow(self.Build_eNB_args, 'OK', ALL_PROCESSES_OK) + return + self.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30) # if the commit ID is provided use it to point to it if self.ranCommitID != '': @@ -419,6 +456,18 @@ class SSHConnection(): result = re.search('lte-softmodem', str(self.ssh.before)) if result is None: buildStatus = False + else: + # Generating a BUILD INFO file + self.command('echo "SRC_BRANCH: ' + self.ranBranch + '" > ../LAST_BUILD_INFO.txt', '\$', 2) + self.command('echo "SRC_COMMIT: ' + self.ranCommitID + '" >> ../LAST_BUILD_INFO.txt', '\$', 2) + if (self.ranAllowMerge): + self.command('echo "MERGED_W_TGT_BRANCH: YES" >> ../LAST_BUILD_INFO.txt', '\$', 2) + if self.ranTargetBranch == '': + self.command('echo "TGT_BRANCH: develop" >> ../LAST_BUILD_INFO.txt', '\$', 2) + else: + self.command('echo "TGT_BRANCH: ' + self.ranTargetBranch + '" >> ../LAST_BUILD_INFO.txt', '\$', 2) + else: + self.command('echo "MERGED_W_TGT_BRANCH: NO" >> ../LAST_BUILD_INFO.txt', '\$', 2) self.command('mkdir -p build_log_' + testcaseId, '\$', 5) self.command('mv log/* ' + 'build_log_' + testcaseId, '\$', 5) self.command('mv compile_oai_enb.log ' + 'build_log_' + testcaseId, '\$', 5) @@ -1194,6 +1243,7 @@ class SSHConnection(): nb_ue_to_connect = 0 for device_id in self.UEDevices: if (self.nbMaxUEtoAttach == -1) or (nb_ue_to_connect < self.nbMaxUEtoAttach): + self.UEDevicesStatus[nb_ue_to_connect] = UE_STATUS_ATTACHING p = Process(target = self.AttachUE_common, args = (device_id, status_queue, lock,)) p.daemon = True p.start() @@ -1222,6 +1272,11 @@ class SSHConnection(): html_cell = '<pre style="background-color:white">UE (' + device_id + ')\n' + message + ' in ' + str(count + 2) + ' seconds</pre>' html_queue.put(html_cell) if (attach_status): + cnt = 0 + while cnt < len(self.UEDevices): + if self.UEDevicesStatus[cnt] == UE_STATUS_ATTACHING: + self.UEDevicesStatus[cnt] = UE_STATUS_ATTACHED + cnt += 1 self.CreateHtmlTestRowQueue('N/A', 'OK', len(self.UEDevices), html_queue) result = re.search('T_stdout', str(self.Initialize_eNB_args)) if result is not None: @@ -1255,11 +1310,14 @@ class SSHConnection(): self.CreateHtmlTabFooter(False) sys.exit(1) multi_jobs = [] + cnt = 0 for device_id in self.UEDevices: + self.UEDevicesStatus[cnt] = UE_STATUS_DETACHING p = Process(target = self.DetachUE_common, args = (device_id,)) p.daemon = True p.start() multi_jobs.append(p) + cnt += 1 for job in multi_jobs: job.join() self.CreateHtmlTestRow('N/A', 'OK', ALL_PROCESSES_OK) @@ -1267,6 +1325,10 @@ class SSHConnection(): if result is not None: logging.debug('Waiting 5 seconds to fill up record file') time.sleep(5) + cnt = 0 + while cnt < len(self.UEDevices): + self.UEDevicesStatus[cnt] = UE_STATUS_DETACHED + cnt += 1 def RebootUE_common(self, device_id): try: @@ -1387,6 +1449,11 @@ class SSHConnection(): if len(self.UEDevices) == 0: logging.debug('\u001B[1;37;41m UE Not Found! \u001B[0m') sys.exit(1) + if len(self.UEDevicesStatus) == 0: + cnt = 0 + while cnt < len(self.UEDevices): + self.UEDevicesStatus.append(UE_STATUS_DETACHED) + cnt += 1 self.close() def GetAllCatMDevices(self, terminate_ue_flag): @@ -1537,7 +1604,11 @@ class SSHConnection(): self.close() return ue_ip_status self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword) + idx = 0 for device_id in self.UEDevices: + if self.UEDevicesStatus[idx] != UE_STATUS_ATTACHED: + idx += 1 + continue count = 0 while count < 4: self.command('stdbuf -o0 adb -s ' + device_id + ' shell ip addr show | grep rmnet', '\$', 15) @@ -1559,6 +1630,7 @@ class SSHConnection(): ue_ip_status -= 1 continue self.UEIPAddresses.append(UE_IPAddress) + idx += 1 self.close() return ue_ip_status @@ -3239,7 +3311,6 @@ class SSHConnection(): self.command('cd cmake_targets', '\$', 5) self.command('rm -f build.log.zip', '\$', 5) self.command('zip build.log.zip build_log_*/*', '\$', 60) - self.command('echo ' + Password + ' | sudo -S rm -rf build_log_*', '\$', 5) self.close() def LogCollecteNB(self): diff --git a/ci-scripts/xml_files/enb_usrp210_band7_test_10mhz_tm1.xml b/ci-scripts/xml_files/enb_usrp210_band7_test_10mhz_tm1.xml index fd6aabcbbc82b4aefe9def99120c4680d37d61c5..48ebdaef692cf2edfa504569cab3fcb18712236e 100644 --- a/ci-scripts/xml_files/enb_usrp210_band7_test_10mhz_tm1.xml +++ b/ci-scripts/xml_files/enb_usrp210_band7_test_10mhz_tm1.xml @@ -28,12 +28,19 @@ 030201 040101 030111 040301 040511 040613 040614 040615 040616 040617 040651 040652 040653 040654 040401 040201 030201 + 030112 040302 040512 040612 040650 040401 040201 030201 </TestCaseRequestedList> <TestCaseExclusionList></TestCaseExclusionList> <testCase id="030111"> <class>Initialize_eNB</class> <desc>Initialize eNB (FDD/Band7/10MHz)</desc> + <Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf --eNBs.[0].component_carriers.[0].drx_Config_present prRelease</Initialize_eNB_args> + </testCase> + + <testCase id="030112"> + <class>Initialize_eNB</class> + <desc>Initialize eNB (FDD/Band7/10MHz) with CDRX</desc> <Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf</Initialize_eNB_args> </testCase> @@ -57,6 +64,12 @@ <desc>Attach UE</desc> </testCase> + <testCase id="040302"> + <class>Attach_UE</class> + <desc>Attach UE</desc> + <nbMaxUEtoAttach>1</nbMaxUEtoAttach> + </testCase> + <testCase id="040401"> <class>Detach_UE</class> <desc>Detach UE</desc> @@ -69,6 +82,21 @@ <ping_packetloss_threshold>5</ping_packetloss_threshold> </testCase> + <testCase id="040512"> + <class>Ping</class> + <desc>ping (10MHz - 20 sec)</desc> + <ping_args>-c 20</ping_args> + <ping_packetloss_threshold>5</ping_packetloss_threshold> + </testCase> + + <testCase id="040612"> + <class>Iperf</class> + <desc>iperf (10MHz - DL/30Mbps/UDP)(30 sec)(balanced profile)</desc> + <iperf_args>-u -b 30M -t 30 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>balanced</iperf_profile> + </testCase> + <testCase id="040613"> <class>Iperf</class> <desc>iperf (10MHz - DL/30Mbps/UDP)(30 sec)(balanced profile)</desc> @@ -109,6 +137,14 @@ <iperf_profile>balanced</iperf_profile> </testCase> + <testCase id="040650"> + <class>Iperf</class> + <desc>iperf (10MHz - UL/20Mbps/UDP)(30 sec)(balanced profile)</desc> + <iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>balanced</iperf_profile> + </testCase> + <testCase id="040651"> <class>Iperf</class> <desc>iperf (10MHz - UL/20Mbps/UDP)(30 sec)(balanced profile)</desc> diff --git a/openair1/PHY/defs_eNB.h b/openair1/PHY/defs_eNB.h index f7123d6b43b72b06ce88fbd317a70174a0691162..e5ed607ea2f338582624fc9c3ac260ec8b5ee886 100644 --- a/openair1/PHY/defs_eNB.h +++ b/openair1/PHY/defs_eNB.h @@ -339,6 +339,8 @@ typedef struct RU_t_s{ int north_out_cnt; /// flag to indicate the RU is a slave to another source int is_slave; + /// flag to indicate if the RU has to perform OTA sync + int ota_sync_enable; /// flag to indicate that the RU should generate the DMRS sequence in slot 2 (subframe 1) for OTA synchronization and calibration int generate_dmrs_sync; /// flag to indicate if the RU has a control channel diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h index 63aeee09e45afa8a0b00a4b58204d4ad1a6c734c..2caba47e2b6d77592e8ffe8cc7b79ff36fae647f 100644 --- a/openair2/ENB_APP/enb_paramdef.h +++ b/openair2/ENB_APP/enb_paramdef.h @@ -104,6 +104,7 @@ typedef enum { #define CONFIG_STRING_RU_SDR_CLK_SRC "clock_src" #define CONFIG_STRING_RU_SF_EXTENSION "sf_extension" #define CONFIG_STRING_RU_END_OF_BURST_DELAY "end_of_burst_delay" +#define CONFIG_STRING_RU_OTA_SYNC_ENABLE "ota_sync_enabled" #define RU_LOCAL_IF_NAME_IDX 0 #define RU_LOCAL_ADDRESS_IDX 1 @@ -128,6 +129,7 @@ typedef enum { #define RU_SDR_CLK_SRC 20 #define RU_SF_EXTENSION_IDX 21 #define RU_END_OF_BURST_DELAY_IDX 22 +#define RU_OTA_SYNC_ENABLE_IDX 23 @@ -153,12 +155,13 @@ typedef enum { {CONFIG_STRING_RU_ENB_LIST, NULL, 0, uptr:NULL, defintarrayval:DEFENBS, TYPE_INTARRAY, 1}, \ {CONFIG_STRING_RU_ATT_TX, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ {CONFIG_STRING_RU_ATT_RX, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_RU_IS_SLAVE, NULL, 0, strptr:NULL, defstrval:"no", TYPE_STRING, 0}, \ +{CONFIG_STRING_RU_IS_SLAVE, NULL, 0, strptr:NULL, defstrval:"no", TYPE_STRING, 0}, \ {CONFIG_STRING_RU_NBIOTRRC_LIST, NULL, 0, uptr:NULL, defintarrayval:DEFENBS, TYPE_INTARRAY, 1}, \ {CONFIG_STRING_RU_SDR_ADDRS, NULL, 0, strptr:NULL, defstrval:"type=b200", TYPE_STRING, 0}, \ {CONFIG_STRING_RU_SDR_CLK_SRC, NULL, 0, strptr:NULL, defstrval:"internal", TYPE_STRING, 0}, \ {CONFIG_STRING_RU_SF_EXTENSION, NULL, 0, uptr:NULL, defuintval:312, TYPE_UINT, 0}, \ {CONFIG_STRING_RU_END_OF_BURST_DELAY, NULL, 0, uptr:NULL, defuintval:400, TYPE_UINT, 0}, \ +{CONFIG_STRING_RU_OTA_SYNC_ENABLE, NULL, 0, strptr:NULL, defstrval:"no", TYPE_STRING, 0}, \ } /*---------------------------------------------------------------------------------------------------------------------------------------*/ diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index 3ec08ac7b44e30e72b61039d43cdfaa815602a01..89abd124999abc6d964670340d9f57997e7c96ff 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -2633,7 +2633,11 @@ void init_RU(char *rf_config_file, clock_source_t clock_source,clock_source_t ti // NOTE: multiple CC_id are not handled here yet! ru->openair0_cfg.clock_source = clock_source; ru->openair0_cfg.time_source = time_source; - ru->generate_dmrs_sync = (ru->is_slave == 0) ? 1 : 0; + //ru->generate_dmrs_sync = (ru->is_slave == 0) ? 1 : 0; + if ((ru->is_slave == 0) && (ru->ota_sync_enable == 1)) + ru->generate_dmrs_sync = 1; + else + ru->generate_dmrs_sync = 0; if (ru->generate_dmrs_sync == 1) { generate_ul_ref_sigs(); ru->dmrssync = (int16_t*)malloc16_clear(ru->frame_parms.ofdm_symbol_size*2*sizeof(int16_t)); @@ -2920,6 +2924,9 @@ void RCconfig_RU(void) { printf("RU %d is_slave=%s\n",j,*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr)); if (strcmp(*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr), "yes") == 0) RC.ru[j]->is_slave=1; else RC.ru[j]->is_slave=0; + printf("RU %d ota_sync_enabled=%s\n",j,*(RUParamList.paramarray[j][RU_OTA_SYNC_ENABLE_IDX].strptr)); + if (strcmp(*(RUParamList.paramarray[j][RU_OTA_SYNC_ENABLE_IDX].strptr), "yes") == 0) RC.ru[j]->ota_sync_enable=1; + else RC.ru[j]->ota_sync_enable=0; } RC.ru[j]->max_pdschReferenceSignalPower = *(RUParamList.paramarray[j][RU_MAX_RS_EPRE_IDX].uptr);; RC.ru[j]->max_rxgain = *(RUParamList.paramarray[j][RU_MAX_RXGAIN_IDX].uptr);