Merge remote-tracking branch 'origin/develop' into ue-phy-sync-improvements
# Conflicts: # openair1/PHY/LTE_UE_TRANSPORT/pcfich_ue.c
This commit is contained in:
+95
-15
@@ -57,12 +57,15 @@ import sshconnection
|
|||||||
import cls_module_ue
|
import cls_module_ue
|
||||||
import cls_ci_ueinfra #class defining the multi Ue infrastrucure
|
import cls_ci_ueinfra #class defining the multi Ue infrastrucure
|
||||||
|
|
||||||
|
logging.getLogger("matplotlib").setLevel(logging.WARNING)
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Utility functions
|
# Utility functions
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
def GetPingTimeAnalysis(ping_log_file):
|
def GetPingTimeAnalysis(RAN,ping_log_file,ping_rttavg_threshold):
|
||||||
#ping time values read from file
|
#ping time values read from file
|
||||||
t_ping=[]
|
t_ping=[]
|
||||||
#ping stats (dictionary) to be returned by the function
|
#ping stats (dictionary) to be returned by the function
|
||||||
@@ -86,17 +89,46 @@ def GetPingTimeAnalysis(ping_log_file):
|
|||||||
max_loc=t_ping.index(max(t_ping))
|
max_loc=t_ping.index(max(t_ping))
|
||||||
ping_stat['max_loc']=max_loc
|
ping_stat['max_loc']=max_loc
|
||||||
#remove it
|
#remove it
|
||||||
t_ping.pop(max_loc)
|
t_ping_post=t_ping.copy()
|
||||||
|
t_ping_post.pop(max_loc)
|
||||||
#new stats after removing max value
|
#new stats after removing max value
|
||||||
ping_stat['min_1']=min(t_ping)
|
ping_stat['min_1']=min(t_ping_post)
|
||||||
ping_stat['mean_1']=stat.mean(t_ping)
|
ping_stat['mean_1']=stat.mean(t_ping_post)
|
||||||
ping_stat['median_1']=stat.median(t_ping)
|
ping_stat['median_1']=stat.median(t_ping_post)
|
||||||
ping_stat['max_1']=max(t_ping)
|
ping_stat['max_1']=max(t_ping_post)
|
||||||
|
|
||||||
|
#plot ping over time and save png for artifacts
|
||||||
|
ticks = np.arange(0, len(t_ping), 1)
|
||||||
|
figure, axis = plt.subplots(figsize=(10, 10))
|
||||||
|
axis.plot(ticks,t_ping,marker='o')
|
||||||
|
axis.set_xlabel('Ping Events')
|
||||||
|
axis.set_ylabel("Ping RTT (in ms)")
|
||||||
|
axis.set_title(ping_log_file)
|
||||||
|
axis.set_xticks(ticks)
|
||||||
|
axis.set_xticklabels([])
|
||||||
|
YMAX=20 #base scale
|
||||||
|
if max(t_ping) > YMAX:
|
||||||
|
y_max=max(t_ping)+1
|
||||||
|
else:
|
||||||
|
y_max=YMAX+1
|
||||||
|
plt.ylim(0,y_max)
|
||||||
|
if ping_rttavg_threshold != '':
|
||||||
|
th_label="AVG Ping Fail Threshold="+ping_rttavg_threshold
|
||||||
|
plt.axhline(y=float(ping_rttavg_threshold), color='r', linestyle='-',label=th_label)
|
||||||
|
axis.legend()
|
||||||
|
plt.savefig(ping_log_file+'.png')
|
||||||
|
|
||||||
|
#copy the png file already to enb to move it move it later into the artifacts
|
||||||
|
try:
|
||||||
|
mySSH = sshconnection.SSHConnection()
|
||||||
|
mySSH.copyout(RAN.eNBIPAddress, RAN.eNBUserName, RAN.eNBPassword, ping_log_file+'.png', RAN.eNBSourceCodePath + '/cmake_targets/')
|
||||||
|
except:
|
||||||
|
logging.debug('\u001B[1;37;41m Ping PNG SCP to eNB FAILED\u001B[0m')
|
||||||
|
|
||||||
return ping_stat
|
return ping_stat
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logging.error("Ping log file does not exist")
|
logging.error("GetPingTimeAnalysis : Ping log file does not exist")
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
|
|
||||||
@@ -129,6 +161,7 @@ class OaiCiTest():
|
|||||||
self.ping_rttavg_threshold =''
|
self.ping_rttavg_threshold =''
|
||||||
self.iperf_args = ''
|
self.iperf_args = ''
|
||||||
self.iperf_packetloss_threshold = ''
|
self.iperf_packetloss_threshold = ''
|
||||||
|
self.iperf_bitrate_threshold = ''
|
||||||
self.iperf_profile = ''
|
self.iperf_profile = ''
|
||||||
self.iperf_options = ''
|
self.iperf_options = ''
|
||||||
self.iperf_direction = ''
|
self.iperf_direction = ''
|
||||||
@@ -1531,7 +1564,7 @@ class OaiCiTest():
|
|||||||
statusQueue.put(message)
|
statusQueue.put(message)
|
||||||
lock.release()
|
lock.release()
|
||||||
|
|
||||||
def Ping_common(self, lock, UE_IPAddress, device_id, statusQueue,EPC, Module_UE):
|
def Ping_common(self, lock, UE_IPAddress, device_id, statusQueue,EPC, Module_UE,RAN):
|
||||||
try:
|
try:
|
||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
# Launch ping on the EPC side (true for ltebox and old open-air-cn)
|
# Launch ping on the EPC side (true for ltebox and old open-air-cn)
|
||||||
@@ -1559,6 +1592,7 @@ class OaiCiTest():
|
|||||||
ping_status = SSH.command('docker exec -it prod-trf-gen /bin/bash -c "ping ' + self.ping_args + ' ' + UE_IPAddress + '" 2>&1 | tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
ping_status = SSH.command('docker exec -it prod-trf-gen /bin/bash -c "ping ' + self.ping_args + ' ' + UE_IPAddress + '" 2>&1 | tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
||||||
else:
|
else:
|
||||||
ping_status = SSH.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
ping_status = SSH.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
||||||
|
ping_log_file='ping_' + self.testCase_id + '_' + device_id + '.log'
|
||||||
#copy the ping log file to have it locally for analysis (ping stats)
|
#copy the ping log file to have it locally for analysis (ping stats)
|
||||||
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '.')
|
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '.')
|
||||||
else:
|
else:
|
||||||
@@ -1578,6 +1612,7 @@ class OaiCiTest():
|
|||||||
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
#cat is executed on EPC
|
#cat is executed on EPC
|
||||||
SSH.command('cat ' + EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
SSH.command('cat ' + EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
||||||
|
ping_log_file='/scripts/ping_' + self.testCase_id + '_' + device_id + '.log'
|
||||||
else: #launch from Module
|
else: #launch from Module
|
||||||
SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword)
|
SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword)
|
||||||
#target address is different depending on EPC type
|
#target address is different depending on EPC type
|
||||||
@@ -1595,6 +1630,7 @@ class OaiCiTest():
|
|||||||
|
|
||||||
#cat is executed locally
|
#cat is executed locally
|
||||||
SSH.command('cat ping_' + self.testCase_id + '_' + self.ue_id + '.log', '\$', 5)
|
SSH.command('cat ping_' + self.testCase_id + '_' + self.ue_id + '.log', '\$', 5)
|
||||||
|
ping_log_file='ping_' + self.testCase_id + '_' + self.ue_id + '.log'
|
||||||
ping_status=0
|
ping_status=0
|
||||||
|
|
||||||
# TIMEOUT CASE
|
# TIMEOUT CASE
|
||||||
@@ -1642,9 +1678,9 @@ class OaiCiTest():
|
|||||||
logging.debug('\u001B[1;34m ' + max_msg + '\u001B[0m')
|
logging.debug('\u001B[1;34m ' + max_msg + '\u001B[0m')
|
||||||
|
|
||||||
#adding extra ping stats from local file
|
#adding extra ping stats from local file
|
||||||
ping_log_file='ping_' + self.testCase_id + '_' + device_id + '.log'
|
#ping_log_file variable is defined above in this function, depending on device/ue
|
||||||
logging.debug('Analyzing Ping log file : ' + os.getcwd() + '/' + ping_log_file)
|
logging.debug('Analyzing Ping log file : ' + os.getcwd() + '/' + ping_log_file)
|
||||||
ping_stat=GetPingTimeAnalysis(ping_log_file)
|
ping_stat=GetPingTimeAnalysis(RAN,ping_log_file,self.ping_rttavg_threshold)
|
||||||
ping_stat_msg=''
|
ping_stat_msg=''
|
||||||
if (ping_stat!=-1) and (len(ping_stat)!=0):
|
if (ping_stat!=-1) and (len(ping_stat)!=0):
|
||||||
ping_stat_msg+='Ping stats before removing largest value : \n'
|
ping_stat_msg+='Ping stats before removing largest value : \n'
|
||||||
@@ -1834,7 +1870,7 @@ class OaiCiTest():
|
|||||||
device_id = self.UEDevices[i]
|
device_id = self.UEDevices[i]
|
||||||
else:
|
else:
|
||||||
device_id = Module_UE.ID + "-" + Module_UE.Kind
|
device_id = Module_UE.ID + "-" + Module_UE.Kind
|
||||||
p = Process(target = self.Ping_common, args = (lock,UE_IPAddress,device_id,status_queue,EPC,Module_UE,))
|
p = Process(target = self.Ping_common, args = (lock,UE_IPAddress,device_id,status_queue,EPC,Module_UE,RAN,))
|
||||||
p.daemon = True
|
p.daemon = True
|
||||||
p.start()
|
p.start()
|
||||||
multi_jobs.append(p)
|
multi_jobs.append(p)
|
||||||
@@ -2085,12 +2121,20 @@ class OaiCiTest():
|
|||||||
pl = float(100 * pl_sum / ps_sum)
|
pl = float(100 * pl_sum / ps_sum)
|
||||||
packetloss = '%2.1f ' % (pl)
|
packetloss = '%2.1f ' % (pl)
|
||||||
packetloss += '%'
|
packetloss += '%'
|
||||||
|
#checking packet loss compliance
|
||||||
if float(pl) > float(self.iperf_packetloss_threshold):
|
if float(pl) > float(self.iperf_packetloss_threshold):
|
||||||
pal_too_high_msg = 'Packet Loss too high : actual = '+packetloss+', target = '+self.iperf_packetloss_threshold+'%\n'
|
pal_too_high_msg = 'Packet Loss too high : tested = '+packetloss+', target = '+self.iperf_packetloss_threshold+'%'
|
||||||
else:
|
else:
|
||||||
pal_too_high_msg=''
|
pal_too_high_msg='Packet Loss value is within acceptance range'
|
||||||
|
#checking bitrate perf compliance
|
||||||
|
if float(br_loss) < float(self.iperf_bitrate_threshold):
|
||||||
|
bit_too_low_msg = 'Bitrate too low : tested = '+bitperf+', target = '+self.iperf_bitrate_threshold+'%'
|
||||||
|
else:
|
||||||
|
bit_too_low_msg='Bitrate perf value is within acceptance range'
|
||||||
lock.acquire()
|
lock.acquire()
|
||||||
if (br_loss < 90) or (float(pl) > float(self.iperf_packetloss_threshold)):
|
if (float(br_loss) < float(self.iperf_bitrate_threshold)) and (float(pl) > float(self.iperf_packetloss_threshold)):
|
||||||
|
statusQueue.put(-1)
|
||||||
|
elif (float(br_loss) < float(self.iperf_bitrate_threshold)) or (float(pl) > float(self.iperf_packetloss_threshold)):
|
||||||
statusQueue.put(1)
|
statusQueue.put(1)
|
||||||
else:
|
else:
|
||||||
statusQueue.put(0)
|
statusQueue.put(0)
|
||||||
@@ -2101,7 +2145,7 @@ class OaiCiTest():
|
|||||||
brl_msg = 'Bitrate Perf: ' + bitperf
|
brl_msg = 'Bitrate Perf: ' + bitperf
|
||||||
jit_msg = 'Jitter : ' + jitter
|
jit_msg = 'Jitter : ' + jitter
|
||||||
pal_msg = 'Packet Loss : ' + packetloss
|
pal_msg = 'Packet Loss : ' + packetloss
|
||||||
statusQueue.put(req_msg + '\n' + bir_msg + '\n' + brl_msg + '\n' + jit_msg + '\n' + pal_msg + '\n' + pal_too_high_msg + '\n')
|
statusQueue.put(req_msg + '\n' + bir_msg + '\n' + brl_msg + '\n' + jit_msg + '\n' + pal_msg + '\n' + pal_too_high_msg + '\n' + bit_too_low_msg + '\n')
|
||||||
logging.debug('\u001B[1;37;45m iperf result (' + UE_IPAddress + ') \u001B[0m')
|
logging.debug('\u001B[1;37;45m iperf result (' + UE_IPAddress + ') \u001B[0m')
|
||||||
logging.debug('\u001B[1;35m ' + req_msg + '\u001B[0m')
|
logging.debug('\u001B[1;35m ' + req_msg + '\u001B[0m')
|
||||||
logging.debug('\u001B[1;35m ' + bir_msg + '\u001B[0m')
|
logging.debug('\u001B[1;35m ' + bir_msg + '\u001B[0m')
|
||||||
@@ -2109,6 +2153,7 @@ class OaiCiTest():
|
|||||||
logging.debug('\u001B[1;35m ' + jit_msg + '\u001B[0m')
|
logging.debug('\u001B[1;35m ' + jit_msg + '\u001B[0m')
|
||||||
logging.debug('\u001B[1;35m ' + pal_msg + '\u001B[0m')
|
logging.debug('\u001B[1;35m ' + pal_msg + '\u001B[0m')
|
||||||
logging.debug('\u001B[1;35m ' + pal_too_high_msg + '\u001B[0m')
|
logging.debug('\u001B[1;35m ' + pal_too_high_msg + '\u001B[0m')
|
||||||
|
logging.debug('\u001B[1;35m ' + bit_too_low_msg + '\u001B[0m')
|
||||||
lock.release()
|
lock.release()
|
||||||
else:
|
else:
|
||||||
self.ping_iperf_wrong_exit(lock, UE_IPAddress, device_id, statusQueue, 'Could not analyze from server log')
|
self.ping_iperf_wrong_exit(lock, UE_IPAddress, device_id, statusQueue, 'Could not analyze from server log')
|
||||||
@@ -3391,6 +3436,41 @@ class OaiCiTest():
|
|||||||
CONTAINERS.UndeployObject(HTML,RAN)
|
CONTAINERS.UndeployObject(HTML,RAN)
|
||||||
RAN.prematureExit=True
|
RAN.prematureExit=True
|
||||||
|
|
||||||
|
#this function is called only if eNB/gNB fails to start
|
||||||
|
#RH to be re-factored
|
||||||
|
def AutoTerminateeNB(self,HTML,RAN,EPC,CONTAINERS):
|
||||||
|
if (RAN.Initialize_eNB_args != ''):
|
||||||
|
self.testCase_id = 'AUTO-KILL-RAN'
|
||||||
|
HTML.testCase_id = self.testCase_id
|
||||||
|
self.desc = 'Automatic Termination of all RAN nodes'
|
||||||
|
HTML.desc = self.desc
|
||||||
|
self.ShowTestID()
|
||||||
|
#terminate all RAN nodes eNB/gNB/OCP
|
||||||
|
for instance in range(0, len(RAN.air_interface)):
|
||||||
|
if RAN.air_interface[instance]!='':
|
||||||
|
logging.debug('Auto Termination of Instance ' + str(instance) + ' : ' + RAN.air_interface[instance])
|
||||||
|
RAN.eNB_instance=instance
|
||||||
|
RAN.TerminateeNB(HTML,EPC)
|
||||||
|
if RAN.flexranCtrlInstalled and RAN.flexranCtrlStarted:
|
||||||
|
self.testCase_id = 'AUTO-KILL-flexran-ctl'
|
||||||
|
HTML.testCase_id = self.testCase_id
|
||||||
|
self.desc = 'Automatic Termination of FlexRan CTL'
|
||||||
|
HTML.desc = self.desc
|
||||||
|
self.ShowTestID()
|
||||||
|
self.TerminateFlexranCtrl(HTML,RAN,EPC)
|
||||||
|
if CONTAINERS.yamlPath[0] != '':
|
||||||
|
self.testCase_id = 'AUTO-KILL-CONTAINERS'
|
||||||
|
HTML.testCase_id = self.testCase_id
|
||||||
|
self.desc = 'Automatic Termination of all RAN containers'
|
||||||
|
HTML.desc = self.desc
|
||||||
|
self.ShowTestID()
|
||||||
|
for instance in range(0, len(CONTAINERS.yamlPath)):
|
||||||
|
if CONTAINERS.yamlPath[instance]!='':
|
||||||
|
CONTAINERS.eNB_instance=instance
|
||||||
|
CONTAINERS.UndeployObject(HTML,RAN)
|
||||||
|
RAN.prematureExit=True
|
||||||
|
|
||||||
|
|
||||||
def IdleSleep(self,HTML):
|
def IdleSleep(self,HTML):
|
||||||
time.sleep(self.idle_sleep_time)
|
time.sleep(self.idle_sleep_time)
|
||||||
HTML.CreateHtmlTestRow(str(self.idle_sleep_time) + ' sec', 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(str(self.idle_sleep_time) + ' sec', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
|||||||
@@ -237,7 +237,7 @@ RUs = (
|
|||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 75;
|
max_rxgain = 75;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.241,addr=192.168.10.2";
|
sdr_addrs = "mgmt_addr=192.168.18.241,addr=192.168.20.2,second_addr=192.168.10.2";
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -237,7 +237,7 @@ RUs = (
|
|||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 75;
|
max_rxgain = 75;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.241,addr=192.168.10.2";
|
sdr_addrs = "mgmt_addr=192.168.18.241,addr=192.168.20.2,second_addr=192.168.10.2";
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -310,6 +310,13 @@ def GetParametersFromXML(action):
|
|||||||
CiTestObj.ue_id = ue_id
|
CiTestObj.ue_id = ue_id
|
||||||
CiTestObj.iperf_direction = test.findtext('direction')#used for modules only
|
CiTestObj.iperf_direction = test.findtext('direction')#used for modules only
|
||||||
CiTestObj.iperf_packetloss_threshold = test.findtext('iperf_packetloss_threshold')
|
CiTestObj.iperf_packetloss_threshold = test.findtext('iperf_packetloss_threshold')
|
||||||
|
iperf_bitrate_threshold = test.findtext('iperf_bitrate_threshold')
|
||||||
|
if (iperf_bitrate_threshold is None):
|
||||||
|
CiTestObj.iperf_bitrate_threshold = "90" #if no threshold is specified, default will be 90%
|
||||||
|
else:
|
||||||
|
CiTestObj.iperf_bitrate_threshold = iperf_bitrate_threshold
|
||||||
|
|
||||||
|
|
||||||
CiTestObj.iperf_profile = test.findtext('iperf_profile')
|
CiTestObj.iperf_profile = test.findtext('iperf_profile')
|
||||||
if (CiTestObj.iperf_profile is None):
|
if (CiTestObj.iperf_profile is None):
|
||||||
CiTestObj.iperf_profile = 'balanced'
|
CiTestObj.iperf_profile = 'balanced'
|
||||||
@@ -811,6 +818,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
check_OAI_UE = False
|
check_OAI_UE = False
|
||||||
RAN.pStatus=CiTestObj.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
RAN.pStatus=CiTestObj.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
RAN.InitializeeNB(HTML, EPC)
|
RAN.InitializeeNB(HTML, EPC)
|
||||||
|
if RAN.prematureExit:
|
||||||
|
CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS)
|
||||||
elif action == 'Terminate_eNB':
|
elif action == 'Terminate_eNB':
|
||||||
RAN.TerminateeNB(HTML, EPC)
|
RAN.TerminateeNB(HTML, EPC)
|
||||||
elif action == 'Initialize_UE':
|
elif action == 'Initialize_UE':
|
||||||
|
|||||||
+3
-3
@@ -346,7 +346,7 @@ class RANManagement():
|
|||||||
|
|
||||||
#reboot USRP if requested in xml
|
#reboot USRP if requested in xml
|
||||||
if self.USRPIPAddress!='':
|
if self.USRPIPAddress!='':
|
||||||
logging.debug('USRP '+ self.USRPIPAddress +'reboot request')
|
logging.debug('USRP '+ self.USRPIPAddress +': reboot request')
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
cmd2usrp='ssh root@'+self.USRPIPAddress+' reboot'
|
cmd2usrp='ssh root@'+self.USRPIPAddress+' reboot'
|
||||||
mySSH.command2(cmd2usrp,1)
|
mySSH.command2(cmd2usrp,1)
|
||||||
@@ -738,8 +738,8 @@ class RANManagement():
|
|||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/enb_*.pcap .','\$',20)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/enb_*.pcap .','\$',20)
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/gnb_*.pcap .','\$',20)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/gnb_*.pcap .','\$',20)
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm -f enb.log.zip', '\$', 5)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm -f enb.log.zip', '\$', 5)
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png log/*/*.log log/*/*.pcap', '\$', 60)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log.png log/*/*.log log/*/*.pcap', '\$', 60)
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png log/*/*.log log/*/*.pcap', '\$', 15)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log.png log/*/*.log log/*/*.pcap', '\$', 15)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
def AnalyzeLogFile_eNB(self, eNBlogFile, HTML):
|
def AnalyzeLogFile_eNB(self, eNBlogFile, HTML):
|
||||||
|
|||||||
@@ -124,6 +124,7 @@
|
|||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>3</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>3</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
@@ -134,6 +135,7 @@
|
|||||||
<direction>UL</direction>
|
<direction>UL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -107,6 +107,7 @@
|
|||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
@@ -117,6 +118,7 @@
|
|||||||
<direction>UL</direction>
|
<direction>UL</direction>
|
||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -119,6 +119,7 @@
|
|||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>3</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>3</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
@@ -129,6 +130,7 @@
|
|||||||
<direction>UL</direction>
|
<direction>UL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -105,6 +105,7 @@
|
|||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
@@ -115,6 +116,7 @@
|
|||||||
<direction>UL</direction>
|
<direction>UL</direction>
|
||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -104,6 +104,7 @@
|
|||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
<testCase id="070001">
|
<testCase id="070001">
|
||||||
@@ -113,6 +114,7 @@
|
|||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
<testCase id="070002">
|
<testCase id="070002">
|
||||||
@@ -122,6 +124,7 @@
|
|||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
<testCase id="070003">
|
<testCase id="070003">
|
||||||
@@ -131,6 +134,7 @@
|
|||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
<testCase id="070004">
|
<testCase id="070004">
|
||||||
@@ -140,6 +144,7 @@
|
|||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -21,21 +21,22 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>gNB-PHY-Test</htmlTabRef>
|
<htmlTabRef>gNB-PHY-Test</htmlTabRef>
|
||||||
<htmlTabName>Run-gNB-PHY-Test</htmlTabName>
|
<htmlTabName>Run-gNB-PHY-Test</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>3</repeatCount>
|
<repeatCount>3</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
090101 000001 090109
|
090101 000001 090109
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
<testCase id="090101">
|
<testCase id="090101">
|
||||||
<class>Initialize_eNB</class>
|
<class>Initialize_eNB</class>
|
||||||
<desc>Initialize gNB USRP</desc>
|
<desc>Initialize gNB USRP</desc>
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test -q -U 787200 -T 106 -t 28 -D 130175 -m 28 -M 106 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test -q -U 787200 -T 106 -t 28 -D 130175 -m 28 -M 106 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||||
<air_interface>NR</air_interface>
|
<air_interface>NR</air_interface>
|
||||||
</testCase>
|
<USRP_IPAddress>192.168.30.2</USRP_IPAddress>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
<class>IdleSleep</class>
|
<class>IdleSleep</class>
|
||||||
@@ -44,10 +45,10 @@
|
|||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="090109">
|
<testCase id="090109">
|
||||||
<class>Terminate_eNB</class>
|
<class>Terminate_eNB</class>
|
||||||
<desc>Terminate gNB</desc>
|
<desc>Terminate gNB</desc>
|
||||||
<air_interface>NR</air_interface>
|
<air_interface>NR</air_interface>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
<htmlTabName>Build</htmlTabName>
|
<htmlTabName>Build</htmlTabName>
|
||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
010101
|
000001
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList>
|
<TestCaseExclusionList>
|
||||||
</TestCaseExclusionList>
|
</TestCaseExclusionList>
|
||||||
@@ -38,4 +38,10 @@
|
|||||||
<eNB_serverId>0</eNB_serverId>
|
<eNB_serverId>0</eNB_serverId>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
|
|||||||
@@ -1541,6 +1541,10 @@ set(PHY_LDPC_CL_SRC
|
|||||||
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c
|
||||||
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
|
||||||
)
|
)
|
||||||
|
add_custom_target( nrLDPC_decoder_kernels_CL
|
||||||
|
COMMAND gcc ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c -dD -DNRLDPC_KERNEL_SOURCE -E -o ${CMAKE_CURRENT_BINARY_DIR}/nrLDPC_decoder_kernels_CL.clc
|
||||||
|
SOURCES ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c
|
||||||
|
)
|
||||||
|
|
||||||
set(PHY_NR_CODINGIF
|
set(PHY_NR_CODINGIF
|
||||||
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_load.c;
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_load.c;
|
||||||
@@ -1551,6 +1555,7 @@ add_library(ldpc_optim MODULE ${PHY_LDPC_OPTIM_SRC} )
|
|||||||
add_library(ldpc_optim8seg MODULE ${PHY_LDPC_OPTIM8SEG_SRC} )
|
add_library(ldpc_optim8seg MODULE ${PHY_LDPC_OPTIM8SEG_SRC} )
|
||||||
add_library(ldpc_cl MODULE ${PHY_LDPC_CL_SRC} )
|
add_library(ldpc_cl MODULE ${PHY_LDPC_CL_SRC} )
|
||||||
target_link_libraries(ldpc_cl OpenCL)
|
target_link_libraries(ldpc_cl OpenCL)
|
||||||
|
add_dependencies(ldpc_cl nrLDPC_decoder_kernels_CL)
|
||||||
|
|
||||||
if (CUDA_FOUND)
|
if (CUDA_FOUND)
|
||||||
cuda_add_library(ldpc_cuda MODULE ${PHY_LDPC_CUDA_SRC} )
|
cuda_add_library(ldpc_cuda MODULE ${PHY_LDPC_CUDA_SRC} )
|
||||||
|
|||||||
@@ -224,11 +224,9 @@ configmodule_interface_t *load_configmodule(int argc,
|
|||||||
cfgparam = getenv("OAI_CONFIGMODULE");
|
cfgparam = getenv("OAI_CONFIGMODULE");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* default different for UE and softmodem because UE doesn't use config file*/
|
/* default different for UE and softmodem because UE may run without config file */
|
||||||
/* and -O option is not mandatory for UE */
|
/* and -O option is not mandatory for UE */
|
||||||
/* phy simulators behave as UE */
|
/* phy simulators behave as UE */
|
||||||
/* test of exec name would better be replaced by a parameter to the l */
|
|
||||||
/* oad_configmodule function */
|
|
||||||
if (cfgparam == NULL) {
|
if (cfgparam == NULL) {
|
||||||
tmpflags = tmpflags | CONFIG_NOOOPT;
|
tmpflags = tmpflags | CONFIG_NOOOPT;
|
||||||
|
|
||||||
@@ -254,9 +252,14 @@ configmodule_interface_t *load_configmodule(int argc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
cfgptr = calloc(sizeof(configmodule_interface_t),1);
|
cfgptr = calloc(sizeof(configmodule_interface_t),1);
|
||||||
|
/* argv_info is used to memorize command line options which have been recognized */
|
||||||
|
/* and to detect unrecognized command line options which might have been specified */
|
||||||
cfgptr->argv_info = calloc(sizeof(int32_t), argc);
|
cfgptr->argv_info = calloc(sizeof(int32_t), argc);
|
||||||
|
/* argv[0] is the exec name, always Ok */
|
||||||
cfgptr->argv_info[0] |= CONFIG_CMDLINEOPT_PROCESSED;
|
cfgptr->argv_info[0] |= CONFIG_CMDLINEOPT_PROCESSED;
|
||||||
|
|
||||||
|
/* when OoptIdx is >0, -O option has been detected at position OoptIdx
|
||||||
|
* we must memorize arv[OoptIdx is Ok */
|
||||||
if (OoptIdx >= 0) {
|
if (OoptIdx >= 0) {
|
||||||
cfgptr->argv_info[OoptIdx] |= CONFIG_CMDLINEOPT_PROCESSED;
|
cfgptr->argv_info[OoptIdx] |= CONFIG_CMDLINEOPT_PROCESSED;
|
||||||
cfgptr->argv_info[OoptIdx+1] |= CONFIG_CMDLINEOPT_PROCESSED;
|
cfgptr->argv_info[OoptIdx+1] |= CONFIG_CMDLINEOPT_PROCESSED;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ By default, this facility is included at build-time and activated at run-time. T
|
|||||||
```bash
|
```bash
|
||||||
/build_oai --disable-T-Tracer
|
/build_oai --disable-T-Tracer
|
||||||
```
|
```
|
||||||
- To use the the T-Tracer instead of the console logging facility, use the command line option *T_stdout*. *T_stdout* is a boolean option, which, when set to 0 (false) disable the console logging facility. All stdout messages are then sent to the T-Tracer.
|
- To use the the T-Tracer, use the command line option *T_stdout*. When set to 0, it disables the console logging facility. All stdout messages are then sent to the T-Tracer. When set to 1 (the default), the logs are output to the linux console and no T trace is generated. When set to 2 both console logging and T traces are activated.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
|
|||||||
@@ -428,12 +428,12 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
|
|||||||
|
|
||||||
# if T_TRACER
|
# if T_TRACER
|
||||||
/* per component, level dependent macros */
|
/* per component, level dependent macros */
|
||||||
# define LOG_E(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_ERR ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_ERR, x) ;} else { T(T_LEGACY_ ## c ## _ERROR, T_PRINTF(x)) ;}} while (0)
|
# define LOG_E(c, x...) do { T(T_LEGACY_ ## c ## _ERROR, T_PRINTF(x)) ; if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_ERR ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_ERR, x) ;} } while (0)
|
||||||
# define LOG_W(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_WARNING) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x) ;} else { T(T_LEGACY_ ## c ## _WARNING, T_PRINTF(x)) ;}} while (0)
|
# define LOG_W(c, x...) do { T(T_LEGACY_ ## c ## _WARNING, T_PRINTF(x)); if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_WARNING) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x);} } while (0)
|
||||||
# define LOG_A LOG_I
|
# define LOG_A LOG_I
|
||||||
# define LOG_I(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_INFO ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ;} else { T(T_LEGACY_ ## c ## _INFO, T_PRINTF(x)) ;}} while (0)
|
# define LOG_I(c, x...) do { T(T_LEGACY_ ## c ## _INFO, T_PRINTF(x)) ; if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_INFO ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ;} } while (0)
|
||||||
# define LOG_D(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_DEBUG ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_DEBUG, x) ;} else { T(T_LEGACY_ ## c ## _DEBUG, T_PRINTF(x)) ;}} while (0)
|
# define LOG_D(c, x...) do { T(T_LEGACY_ ## c ## _DEBUG, T_PRINTF(x)) ; if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_DEBUG ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_DEBUG, x) ;} } while (0)
|
||||||
# define LOG_T(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_TRACE ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_TRACE, x) ;} else { T(T_LEGACY_ ## c ## _TRACE, T_PRINTF(x)) ;}} while (0)
|
# define LOG_T(c, x...) do { T(T_LEGACY_ ## c ## _TRACE, T_PRINTF(x)) ; if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_TRACE ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_TRACE, x) ;} } while (0)
|
||||||
# define VLOG(c,l, f, args) do { if (T_stdout) { if( g_log->log_component[c].level >= l ) vlogRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, l, f, args) ;} } while (0)
|
# define VLOG(c,l, f, args) do { if (T_stdout) { if( g_log->log_component[c].level >= l ) vlogRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, l, f, args) ;} } while (0)
|
||||||
/* macro used to dump a buffer or a message as in openair2/RRC/LTE/RRC_eNB.c, replaces LOG_F macro */
|
/* macro used to dump a buffer or a message as in openair2/RRC/LTE/RRC_eNB.c, replaces LOG_F macro */
|
||||||
# define LOG_DUMPMSG(c, f, b, s, x...) do { if(g_log->dump_mask & f) log_dump(c, b, s, LOG_DUMP_CHAR, x) ;} while (0) /* */
|
# define LOG_DUMPMSG(c, f, b, s, x...) do { if(g_log->dump_mask & f) log_dump(c, b, s, LOG_DUMP_CHAR, x) ;} while (0) /* */
|
||||||
|
|||||||
+6
-1
@@ -217,6 +217,11 @@ void T_Config_Init(void) {
|
|||||||
sizeof(ttraceparams) / sizeof(paramdef_t),
|
sizeof(ttraceparams) / sizeof(paramdef_t),
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (T_stdout == 0)
|
if (T_stdout < 0 || T_stdout > 2) {
|
||||||
|
printf("fatal error: T_stdout = %d but only values 0, 1, or 2 are allowed\n", T_stdout);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (T_stdout == 0 || T_stdout == 2)
|
||||||
T_init(T_port, 1-T_nowait, T_dont_fork);
|
T_init(T_port, 1-T_nowait, T_dont_fork);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -100,7 +100,7 @@ extern int T_stdout;
|
|||||||
20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)(__VA_ARGS__)
|
20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)(__VA_ARGS__)
|
||||||
#define TN_N(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,\
|
#define TN_N(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,\
|
||||||
n18,n19,n20,n21,n22,n23,n24,n25,n26,n27,n28,n29,n30,n31,n32,n,...) T##n
|
n18,n19,n20,n21,n22,n23,n24,n25,n26,n27,n28,n29,n30,n31,n32,n,...) T##n
|
||||||
#define T(...) do { if (T_stdout == 0) TN(__VA_ARGS__); } while (0)
|
#define T(...) do { if (T_stdout == 0 || T_stdout == 2) TN(__VA_ARGS__); } while (0)
|
||||||
|
|
||||||
/* type used to send arbitrary buffer data */
|
/* type used to send arbitrary buffer data */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -607,7 +607,7 @@ extern int *T_active;
|
|||||||
{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:TTRACER_DEFAULT_PORTNUM, TYPE_INT, 0},\
|
{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:TTRACER_DEFAULT_PORTNUM, TYPE_INT, 0},\
|
||||||
{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0},\
|
{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0},\
|
||||||
{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:0, TYPE_INT, 0},\
|
{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:0, TYPE_INT, 0},\
|
||||||
{"T_stdout", CONFIG_HLP_STDOUT, PARAMFLAG_BOOL, iptr:&T_stdout, defintval:1, TYPE_INT, 0},\
|
{"T_stdout", CONFIG_HLP_STDOUT, 0, iptr:&T_stdout, defintval:1, TYPE_INT, 0},\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+10
-8
@@ -698,6 +698,16 @@ void processSlotRX(void *arg) {
|
|||||||
int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx);
|
int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx);
|
||||||
uint8_t gNB_id = 0;
|
uint8_t gNB_id = 0;
|
||||||
|
|
||||||
|
if (IS_SOFTMODEM_NOS1 || get_softmodem_params()->sa) {
|
||||||
|
/* send tick to RLC and PDCP every ms */
|
||||||
|
if (proc->nr_slot_rx % UE->frame_parms.slots_per_subframe == 0) {
|
||||||
|
void nr_rlc_tick(int frame, int subframe);
|
||||||
|
void nr_pdcp_tick(int frame, int subframe);
|
||||||
|
nr_rlc_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe);
|
||||||
|
nr_pdcp_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (rx_slot_type == NR_DOWNLINK_SLOT || rx_slot_type == NR_MIXED_SLOT){
|
if (rx_slot_type == NR_DOWNLINK_SLOT || rx_slot_type == NR_MIXED_SLOT){
|
||||||
|
|
||||||
if(UE->if_inst != NULL && UE->if_inst->dl_indication != NULL) {
|
if(UE->if_inst != NULL && UE->if_inst->dl_indication != NULL) {
|
||||||
@@ -720,14 +730,6 @@ void processSlotRX(void *arg) {
|
|||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO, mac->crnti, proc->frame_rx, proc->nr_slot_rx, 0);
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO, mac->crnti, proc->frame_rx, proc->nr_slot_rx, 0);
|
||||||
pdcp_run(&ctxt);
|
pdcp_run(&ctxt);
|
||||||
|
|
||||||
/* send tick to RLC and PDCP every ms */
|
|
||||||
if (proc->nr_slot_rx % UE->frame_parms.slots_per_subframe == 0) {
|
|
||||||
void nr_rlc_tick(int frame, int subframe);
|
|
||||||
void nr_pdcp_tick(int frame, int subframe);
|
|
||||||
nr_rlc_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe);
|
|
||||||
nr_pdcp_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// calling UL_indication to schedule things other than PUSCH (eg, PUCCH)
|
// calling UL_indication to schedule things other than PUSCH (eg, PUCCH)
|
||||||
rxtxD->ue_sched_mode = NOT_PUSCH;
|
rxtxD->ue_sched_mode = NOT_PUSCH;
|
||||||
|
|||||||
@@ -24,12 +24,33 @@ loading `libldpc_cl.so` instead of `libldpc.so`:
|
|||||||
|
|
||||||
`make ldpc_cl`
|
`make ldpc_cl`
|
||||||
|
|
||||||
`cp ../../../openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_kernels_CL.cl`
|
This command creates the `libldpc_cl.so` shared library. To perform this build successfully, only the OpenCL header `(/usr/include/CL/opencl.h)` and library `(/usr/lib/x86_64-linux-gnu/libOpenCL.so)`are required, they implement OpenCL API support which is not hardware dependent.
|
||||||
|
|
||||||
|
```
|
||||||
|
Scanning dependencies of target nrLDPC_decoder_kernels_CL
|
||||||
|
Built target nrLDPC_decoder_kernels_CL
|
||||||
|
Scanning dependencies of target ldpc_cl
|
||||||
|
Building C object CMakeFiles/ldpc_cl.dir/usr/local/oai/oai-develop/openairinterface5g/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c.o
|
||||||
|
In file included from /usr/include/CL/cl.h:32,
|
||||||
|
from /usr/include/CL/opencl.h:38,
|
||||||
|
from /usr/local/oai/oai-develop/openairinterface5g/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c:49:
|
||||||
|
/usr/include/CL/cl_version.h:34:9: note: #pragma message: cl_version.h: CL_TARGET_OPENCL_VERSION is not defined. Defaulting to 220 (OpenCL 2.2)
|
||||||
|
#pragma message("cl_version.h: CL_TARGET_OPENCL_VERSION is not defined. Defaulting to 220 (OpenCL 2.2)")
|
||||||
|
^~~~~~~
|
||||||
|
|
||||||
|
Building C object CMakeFiles/ldpc_cl.dir/usr/local/oai/oai-develop/openairinterface5g/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c.o
|
||||||
|
Linking C shared module libldpc_cl.so
|
||||||
|
Built target ldpc_cl
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
At runtime, to successfully use hardware acceleration via OpenCL, you need to install vendor specific packages which deliver the required drivers and tools to make use of their GPU (Nvidia, Intel...) , fpga (Xilinx, Intel) or CPU (Intel, AMD, ARM...) through OpenCL.
|
||||||
|
|
||||||
`./nr-softmodem -O libconfig:gnb.band78.sa.fr1.106PRB.usrpb210.conf:dbgl5 --rfsim --rfsimulator.serveraddr server --sa --log_config.gtpu_log_level info --loader.ldpc.shlibversion _cl`
|
`./nr-softmodem -O libconfig:gnb.band78.sa.fr1.106PRB.usrpb210.conf:dbgl5 --rfsim --rfsimulator.serveraddr server --sa --log_config.gtpu_log_level info --loader.ldpc.shlibversion _cl`
|
||||||
|
|
||||||
``` [LOADER] library libldpc_cl.so successfully loaded
|
```
|
||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
|
[LOADER] library libldpc_cl.so successfully loaded
|
||||||
[HW] Platform 0, OpenCL profile FULL_PROFILE
|
[HW] Platform 0, OpenCL profile FULL_PROFILE
|
||||||
[HW] Platform 0, OpenCL version OpenCL 2.1 LINUX
|
[HW] Platform 0, OpenCL version OpenCL 2.1 LINUX
|
||||||
[HW] Device 0 is available
|
[HW] Device 0 is available
|
||||||
@@ -62,8 +83,9 @@ loading `libldpc_cl.so` instead of `libldpc.so`:
|
|||||||
|
|
||||||
`./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --sa -O libconfig:/usr/local/oai/conf/nrue_sim.conf:dbgl5 --nokrnmod --loader.ldpc.shlibversion _cl --log_config.hw_log_level info`
|
`./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --sa -O libconfig:/usr/local/oai/conf/nrue_sim.conf:dbgl5 --nokrnmod --loader.ldpc.shlibversion _cl --log_config.hw_log_level info`
|
||||||
|
|
||||||
```[CONFIG] shlibversion set to _cl from command line
|
```
|
||||||
............................................................
|
............................................................
|
||||||
|
[CONFIG] shlibversion set to _cl from command line
|
||||||
[CONFIG] loader.ldpc 1 options set from command line
|
[CONFIG] loader.ldpc 1 options set from command line
|
||||||
[LOADER] library libldpc_cl.so successfully loaded
|
[LOADER] library libldpc_cl.so successfully loaded
|
||||||
[HW] Platform 0, OpenCL profile FULL_PROFILE
|
[HW] Platform 0, OpenCL profile FULL_PROFILE
|
||||||
@@ -94,7 +116,6 @@ loading `libldpc_cl.so` instead of `libldpc.so`:
|
|||||||
[HW] Device 0, max Work Items size for dimension: 1 512
|
[HW] Device 0, max Work Items size for dimension: 1 512
|
||||||
[HW] Device 0, max Work Items size for dimension: 2 512
|
[HW] Device 0, max Work Items size for dimension: 2 512
|
||||||
------------------------------------------------------------
|
------------------------------------------------------------
|
||||||
```
|
|
||||||
```
|
```
|
||||||
|
|
||||||
A mechanism to select ldpc implementation is also available in the `ldpctest` phy simulator via the `-v`option, which can be used to specify the version of the ldpc shared library to be used.
|
A mechanism to select ldpc implementation is also available in the `ldpctest` phy simulator via the `-v`option, which can be used to specify the version of the ldpc shared library to be used.
|
||||||
@@ -103,7 +124,9 @@ A mechanism to select ldpc implementation is also available in the `ldpctest` ph
|
|||||||
|
|
||||||
Loading libldpc_cuda.so, the cuda implementation of the ldpc decoder:
|
Loading libldpc_cuda.so, the cuda implementation of the ldpc decoder:
|
||||||
|
|
||||||
```$ ./ldpctest -v _cuda
|
```
|
||||||
|
$ ./ldpctest -v _cuda
|
||||||
|
ldpctest -v _cuda
|
||||||
Initializing random number generator, seed 0
|
Initializing random number generator, seed 0
|
||||||
block length 8448:
|
block length 8448:
|
||||||
n_trials 1:
|
n_trials 1:
|
||||||
@@ -119,18 +142,16 @@ log init done
|
|||||||
[CONFIG] loader.ldpc: 1/2 parameters successfully set
|
[CONFIG] loader.ldpc: 1/2 parameters successfully set
|
||||||
[LOADER] library libldpc_cuda.so successfully loaded
|
[LOADER] library libldpc_cuda.so successfully loaded
|
||||||
...................................
|
...................................
|
||||||
```
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Loading libldpc_cl.so, the opencl implementation of the ldpc decoder:
|
Loading libldpc_cl.so, the opencl implementation of the ldpc decoder:
|
||||||
|
|
||||||
`make ldpc_cl`
|
`make ldpc_cl`
|
||||||
|
|
||||||
`cp ../../../openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_kernels_CL.cl`
|
|
||||||
|
|
||||||
`./ldpctest -v _cl`
|
```
|
||||||
|
$ ./ldpctest -v _cl
|
||||||
```$ ./ldpctest -v _cl
|
|
||||||
Initializing random number generator, seed 0
|
Initializing random number generator, seed 0
|
||||||
block length 8448:
|
block length 8448:
|
||||||
n_trials 1:
|
n_trials 1:
|
||||||
@@ -164,7 +185,6 @@ log init done
|
|||||||
[HW] Device 0, max Work Items size for dimension: 1 512
|
[HW] Device 0, max Work Items size for dimension: 1 512
|
||||||
[HW] Device 0, max Work Items size for dimension: 2 512
|
[HW] Device 0, max Work Items size for dimension: 2 512
|
||||||
................................
|
................................
|
||||||
```
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -174,6 +194,6 @@ Libraries implementing the LDPC algorithms must be named `libldpc<_version>.so`,
|
|||||||
|
|
||||||
`libldpc_cuda.so`has been tested with the `ldpctest` executable, usage from the softmodem's has to be tested.
|
`libldpc_cuda.so`has been tested with the `ldpctest` executable, usage from the softmodem's has to be tested.
|
||||||
|
|
||||||
`libldpc_cl`is under development.
|
`libldpc_cl.so`is under development.
|
||||||
|
|
||||||
[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
|
[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
|
||||||
|
|||||||
@@ -514,7 +514,7 @@ int main(int argc, char *argv[])
|
|||||||
unsigned char qbits=8;
|
unsigned char qbits=8;
|
||||||
unsigned int decoded_errors[10000]; // initiate the size of matrix equivalent to size of SNR
|
unsigned int decoded_errors[10000]; // initiate the size of matrix equivalent to size of SNR
|
||||||
int c,i=0, i1 = 0;
|
int c,i=0, i1 = 0;
|
||||||
|
int loglvl=OAILOG_WARNING;
|
||||||
int n_trials = 1;
|
int n_trials = 1;
|
||||||
double SNR_step = 0.1;
|
double SNR_step = 0.1;
|
||||||
|
|
||||||
@@ -525,8 +525,11 @@ int main(int argc, char *argv[])
|
|||||||
n_iter_stats_t dec_iter[3];
|
n_iter_stats_t dec_iter[3];
|
||||||
|
|
||||||
short BG=0,Zc,Kb=0;
|
short BG=0,Zc,Kb=0;
|
||||||
|
if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0) {
|
||||||
|
exit_fun(" Error, configuration module init failed\n");
|
||||||
|
} // must be done before specific options parsing to prevent errasing them
|
||||||
|
|
||||||
while ((c = getopt (argc, argv, "q:r:s:S:l:G:n:d:i:t:u:hv:")) != -1)
|
while ((c = getopt (argc, argv, "q:r:s:S:l:L:G:n:d:i:t:u:hv:")) != -1)
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
case 'q':
|
case 'q':
|
||||||
@@ -545,6 +548,10 @@ int main(int argc, char *argv[])
|
|||||||
block_length = atoi(optarg);
|
block_length = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'L':
|
||||||
|
loglvl = atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
case 'G':
|
case 'G':
|
||||||
ldpc_version="_cuda";
|
ldpc_version="_cuda";
|
||||||
break;
|
break;
|
||||||
@@ -581,6 +588,7 @@ int main(int argc, char *argv[])
|
|||||||
printf("BG1 (blocklength > 3840): 1/3, 2/3, 22/25 (8/9) \n");
|
printf("BG1 (blocklength > 3840): 1/3, 2/3, 22/25 (8/9) \n");
|
||||||
printf("BG2 (blocklength <= 3840): 1/5, 1/3, 2/3 \n\n");
|
printf("BG2 (blocklength <= 3840): 1/5, 1/3, 2/3 \n\n");
|
||||||
printf("-h This message\n");
|
printf("-h This message\n");
|
||||||
|
printf("-L <log level, 0(errors), 1(warning), 2(info) 3(debug) 4 (trace)>\n");
|
||||||
printf("-q Quantization bits, Default: 8\n");
|
printf("-q Quantization bits, Default: 8\n");
|
||||||
printf("-r Nominator rate, (1, 2, 22), Default: 1\n");
|
printf("-r Nominator rate, (1, 2, 22), Default: 1\n");
|
||||||
printf("-d Denominator rate, (3, 5, 25), Default: 1\n");
|
printf("-d Denominator rate, (3, 5, 25), Default: 1\n");
|
||||||
@@ -603,6 +611,8 @@ int main(int argc, char *argv[])
|
|||||||
printf("n_trials %d: \n", n_trials);
|
printf("n_trials %d: \n", n_trials);
|
||||||
printf("SNR0 %f: \n", SNR0);
|
printf("SNR0 %f: \n", SNR0);
|
||||||
|
|
||||||
|
logInit();
|
||||||
|
set_glog(loglvl);
|
||||||
|
|
||||||
if (ldpc_version != NULL)
|
if (ldpc_version != NULL)
|
||||||
load_nrLDPClib(ldpc_version);
|
load_nrLDPClib(ldpc_version);
|
||||||
|
|||||||
@@ -25,15 +25,7 @@
|
|||||||
* \version 1.0
|
* \version 1.0
|
||||||
* \note initial implem - translation of cuda version
|
* \note initial implem - translation of cuda version
|
||||||
*/
|
*/
|
||||||
/* uses HW component id for log messages ( --log_config.hw_log_level <warning| info|debug|trace>) */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <cuda_runtime.h>
|
|
||||||
#include <CL/opencl.h>
|
|
||||||
#include "PHY/CODING/nrLDPC_decoder/nrLDPC_types.h"
|
|
||||||
#include "PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h"
|
|
||||||
#include "assertions.h"
|
|
||||||
#include "common/utils/LOG/log.h"
|
|
||||||
|
|
||||||
#define MAX_ITERATION 2
|
#define MAX_ITERATION 2
|
||||||
#define MC 1
|
#define MC 1
|
||||||
@@ -41,16 +33,29 @@
|
|||||||
#define MAX_OCLDEV 10
|
#define MAX_OCLDEV 10
|
||||||
#define MAX_OCLRUNTIME 5
|
#define MAX_OCLRUNTIME 5
|
||||||
|
|
||||||
|
|
||||||
#define CLSETKERNELARG(A,B,C,D) \
|
|
||||||
rt=clSetKernelArg(A,B,C,D) ;\
|
|
||||||
AssertFatal(rt == CL_SUCCESS, "Error %d setting kernel argument index %d\n" , (int)rt, B);
|
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
char x;
|
char x;
|
||||||
char y;
|
char y;
|
||||||
short value;
|
short value;
|
||||||
} h_element;
|
} h_element;
|
||||||
|
|
||||||
|
#ifdef NRLDPC_KERNEL_SOURCE
|
||||||
|
#include "nrLDPC_decoder_kernels_CL.c"
|
||||||
|
#else
|
||||||
|
/* uses HW component id for log messages ( --log_config.hw_log_level <warning| info|debug|trace>) */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <CL/opencl.h>
|
||||||
|
#include "PHY/CODING/nrLDPC_decoder/nrLDPC_types.h"
|
||||||
|
#include "PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h"
|
||||||
|
#include "assertions.h"
|
||||||
|
#include "common/utils/LOG/log.h"
|
||||||
|
|
||||||
|
#define CLSETKERNELARG(A,B,C,D) \
|
||||||
|
rt=clSetKernelArg(A,B,C,D) ;\
|
||||||
|
AssertFatal(rt == CL_SUCCESS, "Error %d setting kernel argument index %d\n" , (int)rt, B);
|
||||||
|
|
||||||
#include "../nrLDPC_decoder_LYC/bgs/BG1_compact_in_C.h"
|
#include "../nrLDPC_decoder_LYC/bgs/BG1_compact_in_C.h"
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
@@ -213,20 +218,31 @@ void get_CompilErr(cl_program program, int pltf) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t load_source(char **source_str) {
|
size_t load_source(char **source_str, char *filename) {
|
||||||
int MAX_SOURCE_SIZE=(500*132);
|
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
struct stat st ;
|
||||||
size_t source_size;
|
size_t source_size;
|
||||||
|
char *src= NULL;
|
||||||
|
|
||||||
fp = fopen("nrLDPC_decoder_kernels_CL.cl", "r");
|
if (filename == NULL) {
|
||||||
AssertFatal(fp,"failed to open cl source: %s\n",strerror(errno));
|
src = "nrLDPC_decoder_kernels_CL.clc";
|
||||||
|
} else {
|
||||||
|
src = filename;
|
||||||
|
}
|
||||||
|
fp = fopen(src, "r");
|
||||||
|
AssertFatal(fp,"failed to open cl source %s: %s\n",src,strerror(errno));
|
||||||
|
|
||||||
*source_str = (char*)malloc(MAX_SOURCE_SIZE);
|
fstat(fileno(fp), &st);
|
||||||
source_size = fread( *source_str, 1, MAX_SOURCE_SIZE, fp);
|
source_size = st.st_size;
|
||||||
fclose( fp );
|
*source_str = (char*)malloc(source_size);
|
||||||
return source_size;
|
source_size = fread( *source_str, 1, source_size, fp);
|
||||||
|
fclose( fp );
|
||||||
|
LOG_I(HW,"Loaded kernel sources from %s %u bytes\n", (filename==NULL)?"embedded cl code":src,(unsigned int)source_size );
|
||||||
|
return source_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* from here: entry points in decoder shared lib */
|
/* from here: entry points in decoder shared lib */
|
||||||
int ldpc_autoinit(void) { // called by the library loader
|
int ldpc_autoinit(void) { // called by the library loader
|
||||||
cl_platform_id platforms[10];
|
cl_platform_id platforms[10];
|
||||||
@@ -284,11 +300,11 @@ int ldpc_autoinit(void) { // called by the library loader
|
|||||||
ocl.runtime[i].dev_tmp = clCreateBuffer(ocl.runtime[i].context, CL_MEM_READ_ONLY|CL_MEM_HOST_WRITE_ONLY, 68*384, NULL, (cl_int *)&rt);
|
ocl.runtime[i].dev_tmp = clCreateBuffer(ocl.runtime[i].context, CL_MEM_READ_ONLY|CL_MEM_HOST_WRITE_ONLY, 68*384, NULL, (cl_int *)&rt);
|
||||||
AssertFatal(rt == CL_SUCCESS, "Error %d creating buffer dev_tmp for platform %i \n" , (int)rt, i);
|
AssertFatal(rt == CL_SUCCESS, "Error %d creating buffer dev_tmp for platform %i \n" , (int)rt, i);
|
||||||
char *source_str;
|
char *source_str;
|
||||||
size_t source_size=load_source(&source_str);
|
size_t source_size=load_source(&source_str,"nrLDPC_decoder_kernels_CL.clc");
|
||||||
cl_program program = clCreateProgramWithSource(ocl.runtime[i].context, 1,
|
cl_program program = clCreateProgramWithSource(ocl.runtime[i].context, 1,
|
||||||
(const char **)&source_str, (const size_t *)&source_size, (cl_int *)&rt);
|
(const char **)&source_str, (const size_t *)&source_size, (cl_int *)&rt);
|
||||||
AssertFatal(rt == CL_SUCCESS, "Error %d creating program for platform %i \n" , (int)rt, i);
|
AssertFatal(rt == CL_SUCCESS, "Error %d creating program for platform %i \n" , (int)rt, i);
|
||||||
rt = clBuildProgram(program, ocl.runtime[i].num_devices,ocl.runtime[i].devices, NULL, NULL, NULL);
|
rt = clBuildProgram(program, ocl.runtime[i].num_devices,ocl.runtime[i].devices, NULL /* compile options */, NULL, NULL);
|
||||||
if (rt == CL_BUILD_PROGRAM_FAILURE) {
|
if (rt == CL_BUILD_PROGRAM_FAILURE) {
|
||||||
get_CompilErr(program,i);
|
get_CompilErr(program,i);
|
||||||
}
|
}
|
||||||
@@ -434,3 +450,4 @@ int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_
|
|||||||
return MAX_ITERATION;
|
return MAX_ITERATION;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif //NRLDPC_KERNEL_SOURCE
|
||||||
|
|||||||
+1
-11
@@ -29,16 +29,7 @@
|
|||||||
* \note initial implem - translation of cuda version
|
* \note initial implem - translation of cuda version
|
||||||
* \warning
|
* \warning
|
||||||
*/
|
*/
|
||||||
#define define MAX_ITERATION 2
|
|
||||||
#define MC 1
|
|
||||||
|
|
||||||
#define INT32_MAX 2147483647
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
char x;
|
|
||||||
char y;
|
|
||||||
short value;
|
|
||||||
} h_element;
|
|
||||||
|
|
||||||
//__global char dev_dt [46*68*384];
|
//__global char dev_dt [46*68*384];
|
||||||
//__local char *dev_t;
|
//__local char *dev_t;
|
||||||
@@ -46,7 +37,7 @@ typedef struct{
|
|||||||
//__global unsigned char dev_tmp[68*384];
|
//__global unsigned char dev_tmp[68*384];
|
||||||
|
|
||||||
|
|
||||||
|
#define INT32_MAX 2147483647
|
||||||
|
|
||||||
//__constant h_element dev_h_compact1[46*19] = {}; // used in kernel 1
|
//__constant h_element dev_h_compact1[46*19] = {}; // used in kernel 1
|
||||||
//__constant h_element dev_h_compact2[68*30] = {}; // used in kernel 2
|
//__constant h_element dev_h_compact2[68*30] = {}; // used in kernel 2
|
||||||
@@ -299,4 +290,3 @@ __kernel void pack_decoded_bit(__global unsigned char * dev_llr, __global unsign
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,14 +46,14 @@ static loader_shlibfunc_t shlib_fdesc[3];
|
|||||||
|
|
||||||
/* arguments used when called from phy simulators exec's which do not use the config module */
|
/* arguments used when called from phy simulators exec's which do not use the config module */
|
||||||
/* arg is used to initialize the config module so that the loader works as expected */
|
/* arg is used to initialize the config module so that the loader works as expected */
|
||||||
char *arg[64]={"ldpctest","-O","cmdlineonly::dbgl0",NULL,NULL};
|
char *arg[64]={"ldpctest",NULL};
|
||||||
|
|
||||||
int load_nrLDPClib(char *version) {
|
int load_nrLDPClib(char *version) {
|
||||||
char *ptr = (char*)config_get_if();
|
char *ptr = (char*)config_get_if();
|
||||||
char libname[64]="ldpc";
|
char libname[64]="ldpc";
|
||||||
|
|
||||||
if ( ptr==NULL ) {// phy simulators, config module possibly not loaded
|
if ( ptr==NULL ) {// phy simulators, config module possibly not loaded
|
||||||
load_configmodule(0,(char **)NULL,CONFIG_ENABLECMDLINEONLY) ;
|
load_configmodule(1,arg,CONFIG_ENABLECMDLINEONLY) ;
|
||||||
logInit();
|
logInit();
|
||||||
}
|
}
|
||||||
shlib_fdesc[0].fname = "nrLDPC_decod";
|
shlib_fdesc[0].fname = "nrLDPC_decod";
|
||||||
|
|||||||
@@ -250,11 +250,9 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
|
|||||||
int Ncp = NFAPI_CP_NORMAL;
|
int Ncp = NFAPI_CP_NORMAL;
|
||||||
int mu = cfg->ssb_config.scs_common.value;
|
int mu = cfg->ssb_config.scs_common.value;
|
||||||
|
|
||||||
#if DISABLE_LOG_X
|
|
||||||
printf("Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",mu, fp->N_RB_DL, Ncp);
|
|
||||||
#else
|
|
||||||
LOG_I(PHY,"Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",mu, fp->N_RB_DL, Ncp);
|
LOG_I(PHY,"Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",mu, fp->N_RB_DL, Ncp);
|
||||||
#endif
|
|
||||||
|
|
||||||
if (Ncp == NFAPI_CP_EXTENDED)
|
if (Ncp == NFAPI_CP_EXTENDED)
|
||||||
AssertFatal(mu == NR_MU_2,"Invalid cyclic prefix %d for numerology index %d\n", Ncp, mu);
|
AssertFatal(mu == NR_MU_2,"Invalid cyclic prefix %d for numerology index %d\n", Ncp, mu);
|
||||||
@@ -343,11 +341,8 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
|
|||||||
|
|
||||||
AssertFatal(fp->ul_CarrierFreq == (fp->dl_CarrierFreq + uplink_frequency_offset), "Disagreement in uplink frequency for band %d: ul_CarrierFreq = %lu Hz vs expected %lu Hz\n", fp->nr_band, fp->ul_CarrierFreq, fp->dl_CarrierFreq + uplink_frequency_offset);
|
AssertFatal(fp->ul_CarrierFreq == (fp->dl_CarrierFreq + uplink_frequency_offset), "Disagreement in uplink frequency for band %d: ul_CarrierFreq = %lu Hz vs expected %lu Hz\n", fp->nr_band, fp->ul_CarrierFreq, fp->dl_CarrierFreq + uplink_frequency_offset);
|
||||||
|
|
||||||
#if DISABLE_LOG_X
|
|
||||||
printf("Initializing UE frame parms for mu %d, N_RB %d, Ncp %d\n",fp->numerology_index, fp->N_RB_DL, Ncp);
|
|
||||||
#else
|
|
||||||
LOG_I(PHY,"Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",fp->numerology_index, fp->N_RB_DL, Ncp);
|
LOG_I(PHY,"Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",fp->numerology_index, fp->N_RB_DL, Ncp);
|
||||||
#endif
|
|
||||||
|
|
||||||
if (Ncp == NFAPI_CP_EXTENDED)
|
if (Ncp == NFAPI_CP_EXTENDED)
|
||||||
AssertFatal(fp->numerology_index == NR_MU_2,"Invalid cyclic prefix %d for numerology index %d\n", Ncp, fp->numerology_index);
|
AssertFatal(fp->numerology_index == NR_MU_2,"Invalid cyclic prefix %d for numerology index %d\n", Ncp, fp->numerology_index);
|
||||||
|
|||||||
@@ -45,10 +45,9 @@ void pcfich_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
{
|
{
|
||||||
|
|
||||||
uint8_t reset = 1;
|
uint8_t reset = 1;
|
||||||
uint32_t x1 = 0;
|
uint32_t x1 = 0; // x1 is set in lte_gold_generic
|
||||||
uint32_t s = 0;
|
uint32_t s = 0;
|
||||||
|
|
||||||
// x1 is set in lte_gold_generic
|
|
||||||
uint32_t x2 = ((((2*frame_parms->Nid_cell)+1)*(1+subframe))<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.7.1
|
uint32_t x2 = ((((2*frame_parms->Nid_cell)+1)*(1+subframe))<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.7.1
|
||||||
|
|
||||||
for (uint32_t i=0; i<32; i++) {
|
for (uint32_t i=0; i<32; i++) {
|
||||||
|
|||||||
@@ -1174,7 +1174,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
uint8_t aarx, aatx;
|
uint8_t aarx, aatx;
|
||||||
uint32_t nb_re_pusch, bwp_start_subcarrier;
|
uint32_t nb_re_pusch, bwp_start_subcarrier;
|
||||||
int avgs;
|
int avgs = 0;
|
||||||
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
|
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
int32_t corr_re[1+frame_parms->nb_antennas_rx][2];
|
int32_t corr_re[1+frame_parms->nb_antennas_rx][2];
|
||||||
int32_t corr_im[1+frame_parms->nb_antennas_rx][2];
|
int32_t corr_im[1+frame_parms->nb_antennas_rx][2];
|
||||||
//int32_t no_corr = 0;
|
//int32_t no_corr = 0;
|
||||||
int seq_index;
|
int seq_index = 0;
|
||||||
int64_t temp;
|
int64_t temp;
|
||||||
|
|
||||||
for(i=0;i<nr_sequences;i++){
|
for(i=0;i<nr_sequences;i++){
|
||||||
|
|||||||
@@ -642,7 +642,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
|
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
|
||||||
LOG_I(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
|
LOG_I(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
|
||||||
|
|
||||||
opp_enabled=1;
|
|
||||||
Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
|
Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
|
||||||
Kr_bytes = Kr>>3;
|
Kr_bytes = Kr>>3;
|
||||||
offset = 0;
|
offset = 0;
|
||||||
|
|||||||
@@ -376,13 +376,10 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
len = (pilots==1)? ((config_type==NFAPI_NR_DMRS_TYPE1)?nb_rb*(12-6*dlsch0_harq->n_dmrs_cdm_groups): nb_rb*(12-4*dlsch0_harq->n_dmrs_cdm_groups)):(nb_rb*12);
|
len = (pilots==1)? ((config_type==NFAPI_NR_DMRS_TYPE1)?nb_rb*(12-6*dlsch0_harq->n_dmrs_cdm_groups): nb_rb*(12-4*dlsch0_harq->n_dmrs_cdm_groups)):(nb_rb*12);
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d type %d: Pilot/Data extraction %5.2f \n",
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d type %d: Pilot/Data extraction %5.2f \n",
|
||||||
frame,nr_slot_rx,slot,symbol,type,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
frame,nr_slot_rx,slot,symbol,type,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d type %d: Pilot/Data extraction %5.2f \n",
|
|
||||||
frame,nr_slot_rx,slot,symbol,type,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
n_tx = dlsch0_harq->Nl;
|
n_tx = dlsch0_harq->Nl;
|
||||||
@@ -399,11 +396,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
nb_rb_pdsch);
|
nb_rb_pdsch);
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
if (first_symbol_flag==1) {
|
if (first_symbol_flag==1) {
|
||||||
if (beamforming_mode==0){
|
if (beamforming_mode==0){
|
||||||
@@ -460,11 +455,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_slot_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_slot_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_slot_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
// Now channel compensation
|
// Now channel compensation
|
||||||
@@ -512,11 +504,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n", frame, nr_slot_rx, slot, symbol, pdsch_vars[gNB_id]->log2_maxh, proc->channel_level, ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n", frame, nr_slot_rx, slot, symbol, pdsch_vars[gNB_id]->log2_maxh, proc->channel_level, ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n", frame, nr_slot_rx, slot, symbol, pdsch_vars[gNB_id]->log2_maxh, proc->channel_level, ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
|
|
||||||
if (frame_parms->nb_antennas_rx > 1) {
|
if (frame_parms->nb_antennas_rx > 1) {
|
||||||
@@ -571,11 +561,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
/* Store the valid DL RE's */
|
/* Store the valid DL RE's */
|
||||||
pdsch_vars[gNB_id]->dl_valid_re[symbol-1] = len;
|
pdsch_vars[gNB_id]->dl_valid_re[symbol-1] = len;
|
||||||
@@ -654,11 +642,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Please keep it: useful for debugging
|
// Please keep it: useful for debugging
|
||||||
#ifdef DEBUG_PDSCH_RX
|
#ifdef DEBUG_PDSCH_RX
|
||||||
|
|||||||
@@ -385,21 +385,15 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
|
|||||||
if( (abs(ue->common_vars.freq_offset) > 150) && (ret == 0) )
|
if( (abs(ue->common_vars.freq_offset) > 150) && (ret == 0) )
|
||||||
{
|
{
|
||||||
ret=-1;
|
ret=-1;
|
||||||
#if DISABLE_LOG_X
|
|
||||||
printf("Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
|
|
||||||
#else
|
|
||||||
LOG_E(HW, "Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
|
LOG_E(HW, "Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
|
||||||
#endif
|
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
if (ret==0) { // PBCH found so indicate sync to higher layers and configure frame parameters
|
if (ret==0) { // PBCH found so indicate sync to higher layers and configure frame parameters
|
||||||
|
|
||||||
//#ifdef DEBUG_INITIAL_SYNCH
|
//#ifdef DEBUG_INITIAL_SYNCH
|
||||||
#if DISABLE_LOG_X
|
|
||||||
printf("[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
|
|
||||||
#else
|
|
||||||
LOG_I(PHY, "[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
|
LOG_I(PHY, "[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
|
||||||
#endif
|
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
if (ue->UE_scan_carrier == 0) {
|
if (ue->UE_scan_carrier == 0) {
|
||||||
|
|||||||
@@ -51,24 +51,7 @@ double get_cpu_freq_GHz(void)
|
|||||||
return cpu_freq_GHz;
|
return cpu_freq_GHz;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpumeas(int action)
|
|
||||||
{
|
|
||||||
switch (action) {
|
|
||||||
case CPUMEAS_ENABLE:
|
|
||||||
opp_enabled = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CPUMEAS_DISABLE:
|
|
||||||
opp_enabled = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CPUMEAS_GETSTATE:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return opp_enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_meas_now(time_stats_t *ts,
|
void print_meas_now(time_stats_t *ts,
|
||||||
const char *name,
|
const char *name,
|
||||||
|
|||||||
@@ -115,7 +115,24 @@ static inline uint32_t rdtsc_oai(void) {
|
|||||||
#define CPUMEAS_DISABLE 0
|
#define CPUMEAS_DISABLE 0
|
||||||
#define CPUMEAS_ENABLE 1
|
#define CPUMEAS_ENABLE 1
|
||||||
#define CPUMEAS_GETSTATE 2
|
#define CPUMEAS_GETSTATE 2
|
||||||
int cpumeas(int action);
|
static inline int cpumeas(int action) {
|
||||||
|
switch (action) {
|
||||||
|
case CPUMEAS_ENABLE:
|
||||||
|
opp_enabled = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CPUMEAS_DISABLE:
|
||||||
|
opp_enabled = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CPUMEAS_GETSTATE:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return opp_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void start_meas(time_stats_t *ts) {
|
static inline void start_meas(time_stats_t *ts) {
|
||||||
if (opp_enabled) {
|
if (opp_enabled) {
|
||||||
if (ts->meas_flag==0) {
|
if (ts->meas_flag==0) {
|
||||||
|
|||||||
@@ -857,8 +857,8 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int gNB_
|
|||||||
} else AssertFatal(1==0,"Not RA_PDSCH, SI_PDSCH or PDSCH\n");
|
} else AssertFatal(1==0,"Not RA_PDSCH, SI_PDSCH or PDSCH\n");
|
||||||
|
|
||||||
stop_meas(&ue->dlsch_llr_stats_parallelization[proc->thread_id][slot]);
|
stop_meas(&ue->dlsch_llr_stats_parallelization[proc->thread_id][slot]);
|
||||||
LOG_D(PHY, "[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f \n",frame_rx,nr_slot_rx,m,ue->dlsch_llr_stats_parallelization[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
|
LOG_D(PHY, "[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f \n",frame_rx,nr_slot_rx,m,ue->dlsch_llr_stats_parallelization[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
if(first_symbol_flag) {
|
if(first_symbol_flag) {
|
||||||
proc->first_symbol_available = 1;
|
proc->first_symbol_available = 1;
|
||||||
}
|
}
|
||||||
@@ -1033,14 +1033,13 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
LOG_D(PHY, "In %s DL PDU length in bits: %d, in bytes: %d \n", __FUNCTION__, dlsch0->harq_processes[harq_pid]->TBS, dlsch0->harq_processes[harq_pid]->TBS / 8);
|
LOG_D(PHY, "In %s DL PDU length in bits: %d, in bytes: %d \n", __FUNCTION__, dlsch0->harq_processes[harq_pid]->TBS, dlsch0->harq_processes[harq_pid]->TBS / 8);
|
||||||
|
|
||||||
|
stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
|
||||||
|
if (cpumeas(CPUMEAS_GETSTATE)) {
|
||||||
|
LOG_D(PHY, " --> Unscrambling for CW0 %5.3f\n",
|
||||||
stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
|
(ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
|
||||||
LOG_D(PHY, " --> Unscrambling for CW0 %5.3f\n",
|
LOG_D(PHY, "AbsSubframe %d.%d --> LDPC Decoding for CW0 %5.3f\n",
|
||||||
(ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
|
frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
|
||||||
LOG_D(PHY, "AbsSubframe %d.%d --> LDPC Decoding for CW0 %5.3f\n",
|
}
|
||||||
frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
|
|
||||||
|
|
||||||
if(is_cw1_active) {
|
if(is_cw1_active) {
|
||||||
// start ldpc decode for CW 1
|
// start ldpc decode for CW 1
|
||||||
@@ -1092,21 +1091,15 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
LOG_T(PHY,"CWW sequential dlsch decoding, ret1 = %d\n", ret1);
|
LOG_T(PHY,"CWW sequential dlsch decoding, ret1 = %d\n", ret1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
|
stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
|
||||||
|
if (cpumeas(CPUMEAS_GETSTATE)) {
|
||||||
LOG_D(PHY, " --> Unscrambling for CW1 %5.3f\n",
|
LOG_D(PHY, " --> Unscrambling for CW1 %5.3f\n",
|
||||||
(ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
|
(ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
|
||||||
LOG_D(PHY, "AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
|
LOG_D(PHY, "AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
|
||||||
frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
|
frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
|
||||||
LOG_D(PHY,"AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
|
}
|
||||||
frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
|
LOG_D(PHY, "harq_pid: %d, TBS expected dlsch1: %d \n", harq_pid, dlsch1->harq_processes[harq_pid]->TBS);
|
||||||
|
|
||||||
LOG_D(PHY, "harq_pid: %d, TBS expected dlsch1: %d \n", harq_pid, dlsch1->harq_processes[harq_pid]->TBS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(PHY," ------ end ldpc decoder for AbsSubframe %d.%d ------ decoded in %d \n", frame_rx, nr_slot_rx, ret);
|
|
||||||
|
|
||||||
// send to mac
|
// send to mac
|
||||||
if (ue->if_inst && ue->if_inst->dl_indication) {
|
if (ue->if_inst && ue->if_inst->dl_indication) {
|
||||||
ue->if_inst->dl_indication(&dl_indication, ul_time_alignment);
|
ue->if_inst->dl_indication(&dl_indication, ul_time_alignment);
|
||||||
@@ -1407,8 +1400,8 @@ void *UE_thread_slot1_dl_processing(void *arg) {
|
|||||||
|
|
||||||
|
|
||||||
stop_meas(&ue->ue_front_end_per_slot_stat[proc->thread_id][1]);
|
stop_meas(&ue->ue_front_end_per_slot_stat[proc->thread_id][1]);
|
||||||
LOG_D(PHY, "[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",frame_rx,nr_slot_rx,ue->ue_front_end_per_slot_stat[proc->thread_id][1].p_time/(cpuf*1000.0));
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
|
LOG_D(PHY, "[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",frame_rx,nr_slot_rx,ue->ue_front_end_per_slot_stat[proc->thread_id][1].p_time/(cpuf*1000.0));
|
||||||
|
|
||||||
//wait until pdcch is decoded
|
//wait until pdcch is decoded
|
||||||
uint32_t wait = 0;
|
uint32_t wait = 0;
|
||||||
@@ -1497,7 +1490,8 @@ void *UE_thread_slot1_dl_processing(void *arg) {
|
|||||||
//printf("Set available LLR slot1 to 1 AbsSubframe %d.%d \n",frame_rx,nr_slot_rx);
|
//printf("Set available LLR slot1 to 1 AbsSubframe %d.%d \n",frame_rx,nr_slot_rx);
|
||||||
|
|
||||||
stop_meas(&ue->pdsch_procedures_per_slot_stat[proc->thread_id][1]);
|
stop_meas(&ue->pdsch_procedures_per_slot_stat[proc->thread_id][1]);
|
||||||
LOG_D(PHY, "[AbsSFN %d.%d] Slot1: LLR Computation %5.2f \n",frame_rx,nr_slot_rx,ue->pdsch_procedures_per_slot_stat[proc->thread_id][1].p_time/(cpuf*1000.0));
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
|
LOG_D(PHY, "[AbsSFN %d.%d] Slot1: LLR Computation %5.2f \n",frame_rx,nr_slot_rx,ue->pdsch_procedures_per_slot_stat[proc->thread_id][1].p_time/(cpuf*1000.0));
|
||||||
|
|
||||||
if (pthread_mutex_lock(&proc->mutex_slot1_dl_processing) != 0) {
|
if (pthread_mutex_lock(&proc->mutex_slot1_dl_processing) != 0) {
|
||||||
LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RXTX\n" );
|
LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RXTX\n" );
|
||||||
@@ -1866,9 +1860,10 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
dlsch_parallel);
|
dlsch_parallel);
|
||||||
|
|
||||||
stop_meas(&ue->dlsch_procedures_stat[proc->thread_id]);
|
stop_meas(&ue->dlsch_procedures_stat[proc->thread_id]);
|
||||||
LOG_D(PHY, "[SFN %d] Slot1: Pdsch Proc %5.2f\n",nr_slot_rx,ue->pdsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
|
if (cpumeas(CPUMEAS_GETSTATE)) {
|
||||||
LOG_D(PHY, "[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",nr_slot_rx,ue->dlsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
|
LOG_D(PHY, "[SFN %d] Slot1: Pdsch Proc %5.2f\n",nr_slot_rx,ue->pdsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
|
||||||
|
LOG_D(PHY, "[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",nr_slot_rx,ue->dlsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
|
||||||
|
}
|
||||||
|
|
||||||
// deactivate dlsch once dlsch proc is done
|
// deactivate dlsch once dlsch proc is done
|
||||||
ue->dlsch[proc->thread_id][gNB_id][0]->active = 0;
|
ue->dlsch[proc->thread_id][gNB_id][0]->active = 0;
|
||||||
@@ -1943,6 +1938,8 @@ if (nr_slot_rx==9) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat);
|
stop_meas(&ue->generic_stat);
|
||||||
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
|
LOG_D(PHY,"after tubo until end of Rx %5.2f \n",ue->generic_stat.p_time/(cpuf*1000.0));
|
||||||
|
|
||||||
#ifdef EMOS
|
#ifdef EMOS
|
||||||
phy_procedures_emos_UE_RX(ue,slot,gNB_id);
|
phy_procedures_emos_UE_RX(ue,slot,gNB_id);
|
||||||
@@ -1952,7 +1949,9 @@ phy_procedures_emos_UE_RX(ue,slot,gNB_id);
|
|||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
|
||||||
|
|
||||||
stop_meas(&ue->phy_proc_rx[proc->thread_id]);
|
stop_meas(&ue->phy_proc_rx[proc->thread_id]);
|
||||||
LOG_D(PHY, "------FULL RX PROC [SFN %d]: %5.2f ------\n",nr_slot_rx,ue->phy_proc_rx[proc->thread_id].p_time/(cpuf*1000.0));
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
|
LOG_D(PHY, "------FULL RX PROC [SFN %d]: %5.2f ------\n",nr_slot_rx,ue->phy_proc_rx[proc->thread_id].p_time/(cpuf*1000.0));
|
||||||
|
|
||||||
|
|
||||||
//#endif //pdsch
|
//#endif //pdsch
|
||||||
|
|
||||||
|
|||||||
@@ -402,7 +402,7 @@ int main(int argc, char **argv)
|
|||||||
NR_UE_MAC_INST_t *UE_mac;
|
NR_UE_MAC_INST_t *UE_mac;
|
||||||
int cyclic_prefix_type = NFAPI_CP_NORMAL;
|
int cyclic_prefix_type = NFAPI_CP_NORMAL;
|
||||||
int run_initial_sync=0;
|
int run_initial_sync=0;
|
||||||
int loglvl=OAILOG_INFO;
|
int loglvl=OAILOG_WARNING;
|
||||||
|
|
||||||
//float target_error_rate = 0.01;
|
//float target_error_rate = 0.01;
|
||||||
int css_flag=0;
|
int css_flag=0;
|
||||||
@@ -647,6 +647,7 @@ int main(int argc, char **argv)
|
|||||||
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
|
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
|
||||||
argv[0]);
|
argv[0]);
|
||||||
printf("-h This message\n");
|
printf("-h This message\n");
|
||||||
|
printf("-L <log level, 0(errors), 1(warning), 2(info) 3(debug) 4 (trace)>\n");
|
||||||
//printf("-p Use extended prefix mode\n");
|
//printf("-p Use extended prefix mode\n");
|
||||||
//printf("-d Use TDD\n");
|
//printf("-d Use TDD\n");
|
||||||
printf("-n Number of frames to simulate\n");
|
printf("-n Number of frames to simulate\n");
|
||||||
|
|||||||
@@ -275,7 +275,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
//unsigned char frame_type = 0;
|
//unsigned char frame_type = 0;
|
||||||
NR_DL_FRAME_PARMS *frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms;
|
||||||
int loglvl = OAILOG_INFO;
|
int loglvl = OAILOG_WARNING;
|
||||||
//uint64_t SSB_positions=0x01;
|
//uint64_t SSB_positions=0x01;
|
||||||
uint16_t nb_symb_sch = 12;
|
uint16_t nb_symb_sch = 12;
|
||||||
int start_symbol = 0;
|
int start_symbol = 0;
|
||||||
@@ -603,6 +603,7 @@ int main(int argc, char **argv)
|
|||||||
//printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
|
//printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
|
||||||
printf("-F Input filename (.txt format) for RX conformance testing\n");
|
printf("-F Input filename (.txt format) for RX conformance testing\n");
|
||||||
printf("-G Offset of samples to read from file (0 default)\n");
|
printf("-G Offset of samples to read from file (0 default)\n");
|
||||||
|
printf("-L <log level, 0(errors), 1(warning), 2(info) 3(debug) 4 (trace)>\n");
|
||||||
printf("-M Multiple SSB positions in burst\n");
|
printf("-M Multiple SSB positions in burst\n");
|
||||||
printf("-N Nid_cell\n");
|
printf("-N Nid_cell\n");
|
||||||
printf("-O oversampling factor (1,2,4,8,16)\n");
|
printf("-O oversampling factor (1,2,4,8,16)\n");
|
||||||
@@ -643,7 +644,7 @@ int main(int argc, char **argv)
|
|||||||
else if (N_RB_UL == 106) bandwidth = 40;
|
else if (N_RB_UL == 106) bandwidth = 40;
|
||||||
else if (N_RB_UL == 32) bandwidth = 50;
|
else if (N_RB_UL == 32) bandwidth = 50;
|
||||||
else { printf("Add N_RB_UL %d\n",N_RB_UL); exit(-1); }
|
else { printf("Add N_RB_UL %d\n",N_RB_UL); exit(-1); }
|
||||||
|
LOG_I( PHY,"++++++++++++++++++++++++++++++++++++++++++++++%i+++++++++++++++++++++++++++++++++++++++++",loglvl);
|
||||||
if (openair0_cfg[0].threequarter_fs == 1) sampling_frequency*=.75;
|
if (openair0_cfg[0].threequarter_fs == 1) sampling_frequency*=.75;
|
||||||
|
|
||||||
UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model,
|
UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model,
|
||||||
|
|||||||
@@ -820,7 +820,8 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
|
|||||||
|
|
||||||
AssertFatal((rfsimulator->epollfd = epoll_create1(0)) != -1,"");
|
AssertFatal((rfsimulator->epollfd = epoll_create1(0)) != -1,"");
|
||||||
|
|
||||||
//randominit(0);
|
// we need to call randominit() for telnet server (use gaussdouble=>uniformrand)
|
||||||
|
randominit(0);
|
||||||
set_taus_seed(0);
|
set_taus_seed(0);
|
||||||
/* look for telnet server, if it is loaded, add the channel modeling commands to it */
|
/* look for telnet server, if it is loaded, add the channel modeling commands to it */
|
||||||
add_telnetcmd_func_t addcmd = (add_telnetcmd_func_t)get_shlibmodule_fptr("telnetsrv", TELNET_ADDCMD_FNAME);
|
add_telnetcmd_func_t addcmd = (add_telnetcmd_func_t)get_shlibmodule_fptr("telnetsrv", TELNET_ADDCMD_FNAME);
|
||||||
|
|||||||
Reference in New Issue
Block a user