diff --git a/ci-scripts/Jenkinsfile-git-dashboard b/ci-scripts/Jenkinsfile-git-dashboard
new file mode 100644
index 0000000000..6ebd46bc76
--- /dev/null
+++ b/ci-scripts/Jenkinsfile-git-dashboard
@@ -0,0 +1,45 @@
+#!/bin/groovy
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
+
+// Location of the python executor node shall be in the same subnet as the others servers
+def pythonExecutor = params.pythonExecutor
+
+
+pipeline {
+ agent {
+ label pythonExecutor
+ }
+ stages {
+ stage ("gDashboard") {
+ steps {
+ script {
+ //retrieve MR data from gitlab and export to gSheet
+ sh returnStdout: true, script: 'python3 ci-scripts/ran_dashboard.py'
+ }
+ }
+ }
+ }
+}
+
+
diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab
index f88ec62858..bb78a21ca0 100644
--- a/ci-scripts/Jenkinsfile-gitlab
+++ b/ci-scripts/Jenkinsfile-gitlab
@@ -224,7 +224,7 @@ pipeline {
}
}
}
- }
+ }
stage ("Variant Builds") {
parallel {
diff --git a/ci-scripts/conf_files/channelmod_rfsimu.conf b/ci-scripts/conf_files/channelmod_rfsimu.conf
new file mode 100644
index 0000000000..9a6ded24f1
--- /dev/null
+++ b/ci-scripts/conf_files/channelmod_rfsimu.conf
@@ -0,0 +1,57 @@
+#/* configuration for channel modelisation */
+#/* To be included in main config file when */
+#/* channel modelisation is used (rfsimulator with chanmod options enabled) */
+channelmod = {
+ max_chan=10;
+ modellist="modellist_rfsimu_1";
+ modellist_rfsimu_1 = (
+ {
+ model_name = "rfsimu_channel_enB0"
+ type = "AWGN";
+ ploss_dB = 0;
+ noise_power_dB = -10;
+ forgetfact = 0;
+ offset = 0;
+ ds_tdl = 0;
+ },
+ {
+ model_name = "rfsimu_channel_ue1"
+ type = "AWGN";
+ ploss_dB = 0;
+ noise_power_dB = 0;
+ forgetfact = 0;
+ offset = 0;
+ ds_tdl = 0;
+ }
+ );
+ modellist_rfsimu_2 = (
+ {
+ model_name = "rfsimu_channel_ue0"
+ type = "AWGN";
+ ploss_dB = 0;
+ noise_power_dB = 0;
+ forgetfact = 0;
+ offset = 0;
+ ds_tdl = 0;
+ },
+ {
+ model_name = "rfsimu_channel_ue1"
+ type = "AWGN";
+ ploss_dB = 0;
+ noise_power_dB = 0;
+ forgetfact = 0;
+ offset = 0;
+ ds_tdl = 0;
+ },
+ {
+ model_name = "rfsimu_channel_ue2"
+ type = "AWGN";
+ ploss_dB = 0;
+ noise_power_dB = 0;
+ forgetfact = 0;
+ offset = 0;
+ ds_tdl = 0;
+ }
+ );
+};
+
diff --git a/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf
index 4d89ad96da..087ee37f01 100644
--- a/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf
@@ -260,7 +260,6 @@ NETWORK_CONTROLLER :
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
FLEXRAN_AWAIT_RECONF = "no";
};
-
log_config :
{
global_log_level ="info";
@@ -279,3 +278,4 @@ NETWORK_CONTROLLER :
rrc_log_verbosity ="medium";
};
+@include "channelmod_rfsimu.conf"
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf
new file mode 100644
index 0000000000..809203f672
--- /dev/null
+++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf
@@ -0,0 +1,305 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+
+gNBs =
+(
+ {
+ ////////// Identification parameters:
+ gNB_ID = 0xe00;
+
+ cell_type = "CELL_MACRO_GNB";
+ gNB_name = "gNB-Eurecom-5GNRBox";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 1;
+ plmn_list = ({mcc = 222; mnc = 01; mnc_length = 2;});
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 31; //0;
+ pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
+ pusch_TargetSNRx10 = 200;
+ pucch_TargetSNRx10 = 200;
+
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3600 MHz + 84 PRBs@30kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 641272; //641032; #641968; 641968=start of ssb at 3600MHz + 82 RBs 641032=center of SSB at center of cell
+ dl_frequencyBand = 78;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 640000;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 106;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=84,L=13 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6368;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 0;
+ initialDLBWPsearchSpaceZero = 0;
+ #pdsch-ConfigCommon
+ #pdschTimeDomainAllocationList (up to 16 entries)
+ initialDLBWPk0_0 = 0;
+ #initialULBWPmappingType
+ #0=typeA,1=typeB
+ initialDLBWPmappingType_0 = 0;
+ #this is SS=1,L=13
+ initialDLBWPstartSymbolAndLength_0 = 40;
+
+ initialDLBWPk0_1 = 0;
+ initialDLBWPmappingType_1 = 0;
+ #this is SS=2,L=12
+ initialDLBWPstartSymbolAndLength_1 = 53;
+
+ initialDLBWPk0_2 = 0;
+ initialDLBWPmappingType_2 = 0;
+ #this is SS=1,L=12
+ initialDLBWPstartSymbolAndLength_2 = 54;
+
+ initialDLBWPk0_3 = 0;
+ initialDLBWPmappingType_3 = 0;
+ #this is SS=1,L=4 //5 (4 is for 43, 5 is for 57)
+ initialDLBWPstartSymbolAndLength_3 = 57; //43; //57;
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 106;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 6368;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 1;
+ #rach-ConfigCommon
+ #rach-ConfigGeneric
+ prach_ConfigurationIndex = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+ prach_msg1_FDM = 0;
+ prach_msg1_FrequencyStart = 0;
+ zeroCorrelationZoneConfig = 13;
+ preambleReceivedTargetPower = -100;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+ preambleTransMax = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+ powerRampingStep = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+ ra_ResponseWindow = 5;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; //15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+ ra_ContentionResolutionTimer = 7;
+ rsrp_ThresholdSSB = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+ prach_RootSequenceIndex_PR = 2;
+ prach_RootSequenceIndex = 1;
+ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+ #
+ msg1_SubcarrierSpacing = 1,
+
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+ restrictedSetConfig = 0,
+ # pusch-ConfigCommon (up to 16 elements)
+ initialULBWPk2_0 = 2;
+ initialULBWPmappingType_0 = 1
+ # this is SS=0 L=11
+ initialULBWPstartSymbolAndLength_0 = 55;
+
+ initialULBWPk2_1 = 2;
+ initialULBWPmappingType_1 = 1;
+ # this is SS=0 L=12
+ initialULBWPstartSymbolAndLength_1 = 69;
+
+ initialULBWPk2_2 = 7;
+ initialULBWPmappingType_2 = 1;
+ # this is SS=10 L=4
+ initialULBWPstartSymbolAndLength_2 = 52;
+
+ msg3_DeltaPreamble = 1;
+ p0_NominalWithGrant =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+ pucchGroupHopping = 0;
+ hoppingId = 40;
+ p0_nominal = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+ ssb_PositionsInBurst_PR = 2;
+ ssb_PositionsInBurst_Bitmap = 1; #0x80;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+ ssb_periodicityServingCell = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+ dmrs_TypeA_Position = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ subcarrierSpacing = 1;
+
+
+ #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ referenceSubcarrierSpacing = 1;
+ # pattern1
+ # dl_UL_TransmissionPeriodicity
+ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+ dl_UL_TransmissionPeriodicity = 6;
+ nrofDownlinkSlots = 7; //8; //7;
+ nrofDownlinkSymbols = 6; //0; //6;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4; //0; //4;
+
+ ssPBCH_BlockPower = -25;
+ }
+
+ );
+
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+
+ ////////// MME parameters:
+ mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
+ ipv6 = "192:168:30::17";
+ port = 36412 ;
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ ///X2
+ enable_x2 = "yes";
+ t_reloc_prep = 1000; /* unit: millisecond */
+ tx2_reloc_overall = 2000; /* unit: millisecond */
+ t_dc_prep = 1000; /* unit: millisecond */
+ t_dc_overall = 2000; /* unit: millisecond */
+ target_enb_x2_ip_address = (
+ { ipv4 = "CI_FR1_CTL_ENB_IP_ADDR";
+ ipv6 = "192:168:30::17";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1_MME = "CI_GNB_IP_ADDR";
+ GNB_INTERFACE_NAME_FOR_S1U = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1U = "CI_GNB_IP_ADDR";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ GNB_IPV4_ADDRESS_FOR_X2C = "CI_GNB_IP_ADDR";
+ GNB_PORT_FOR_X2C = 36422; # Spec 36422
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 6;
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [7];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 75; #114
+ eNB_instances = [0];
+ sdr_addrs = "addr=192.168.80.50"
+ clock_src = "internal"
+
+ }
+);
+
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ //parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
+ log_config :
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+
+uicc: {
+opc = "testopc";
+};
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 783adb98e6..f1f79a2435 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -694,8 +694,8 @@ class RANManagement():
NSA_RAPROC_PUSCH_check = 0
#dlsch and ulsch statistics (dictionary)
dlsch_ulsch_stats = {}
- #count "L1 thread not ready" msg
- L1_thread_not_ready_cnt = 0
+ #real time statistics (dictionary)
+ real_time_stats = {}
#count "problem receiving samples" msg
pb_receiving_samples_cnt = 0
@@ -857,16 +857,21 @@ class RANManagement():
#keys below are the markers we are loooking for, loop over this keys list
#everytime these markers are found in the log file, the previous ones are overwritten in the dict
#eventually we record and print only the last occurence
- keys = {'dlsch_rounds','dlsch_total_bytes','ulsch_rounds','ulsch_total_bytes_scheduled'}
+ keys = {'UE ID','dlsch_rounds','dlsch_total_bytes','ulsch_rounds','ulsch_total_bytes_scheduled', 'scheduling timing stats'}
for k in keys:
result = re.search(k, line)
if result is not None:
#remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
dlsch_ulsch_stats[k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
- #count "L1 thread not ready" msg
- result = re.search('\[PHY\]\s+L1_thread isn\'t ready', str(line))
- if result is not None:
- L1_thread_not_ready_cnt += 1
+ #real time statistics
+ #same method as above
+ keys = {'feprx','feptx_prec','feptx_ofdm','feptx_total','L1 Tx processing','DLSCH encoding','L1 Rx processing','PUSCH inner-receiver','PUSCH decoding'}
+ for k in keys:
+ result = re.search(k, line)
+ if result is not None:
+ #remove 1- all useless char before relevant info 2- trailing char
+ tmp=re.match(rf'^.*?(\b{k}\b.*)',line.rstrip()) #from python 3.6 we can use literal string interpolation for the variable k, using rf' in the regex
+ real_time_stats[k]=tmp.group(1)
#count "problem receiving samples" msg
result = re.search('\[PHY\]\s+problem receiving samples', str(line))
if result is not None:
@@ -897,15 +902,10 @@ class RANManagement():
statMsg = '[RAPROC] PUSCH with TC_RNTI message check for ' + nodeB_prefix + 'NB : PASS '
htmlMsg = statMsg+'\n'
else:
- statMsg = '[RAPROC] PUSCH with TC_RNTI message check for ' + nodeB_prefix + 'NB : FAIL '
+ statMsg = '[RAPROC] PUSCH with TC_RNTI message check for ' + nodeB_prefix + 'NB : FAIL or not relevant'
htmlMsg = statMsg+'\n'
logging.debug(statMsg)
htmleNBFailureMsg += htmlMsg
- #L1 thread not ready log
- statMsg = '[PHY] L1 thread is not ready msg count = '+str(L1_thread_not_ready_cnt)
- htmlMsg = statMsg+'\n'
- logging.debug(statMsg)
- htmleNBFailureMsg += htmlMsg
#problem receiving samples log
statMsg = '[PHY] problem receiving samples msg count = '+str(pb_receiving_samples_cnt)
htmlMsg = statMsg+'\n'
@@ -920,6 +920,18 @@ class RANManagement():
logging.debug(dlsch_ulsch_stats[key])
htmleNBFailureMsg += statMsg
+ #real time statistics statistics
+ if len(real_time_stats)!=0: #check if dictionary is not empty
+ statMsg=''
+ for key in real_time_stats: #for each dictionary key
+ statMsg += real_time_stats[key] + '\n'
+ logging.debug(real_time_stats[key])
+ htmleNBFailureMsg += statMsg
+ else:
+ statMsg = 'No real time stats found in the log file\n'
+ logging.debug('No real time stats found in the log file')
+ htmleNBFailureMsg += statMsg
+
if uciStatMsgCount > 0:
statMsg = nodeB_prefix + 'NB showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
diff --git a/ci-scripts/ran_dashboard.py b/ci-scripts/ran_dashboard.py
new file mode 100644
index 0000000000..601cda1722
--- /dev/null
+++ b/ci-scripts/ran_dashboard.py
@@ -0,0 +1,275 @@
+#/*
+# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+# * contributor license agreements. See the NOTICE file distributed with
+# * this work for additional information regarding copyright ownership.
+# * The OpenAirInterface Software Alliance licenses this file to You under
+# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+# * except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.openairinterface.org/?page_id=698
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# *-------------------------------------------------------------------------------
+# * For more information about the OpenAirInterface (OAI) Software Alliance:
+# * contact@openairinterface.org
+# */
+#---------------------------------------------------------------------
+# Merge Requests Dashboard for RAN on googleSheet
+#
+# Required Python Version
+# Python 3.x
+#
+#---------------------------------------------------------------------
+
+#-----------------------------------------------------------
+# Import
+#-----------------------------------------------------------
+
+#import google spreadsheet API
+import gspread
+from oauth2client.service_account import ServiceAccountCredentials
+
+
+import subprocess
+import shlex #lexical analysis
+import json #json structures
+import datetime #now() and date formating
+from datetime import datetime
+
+#-----------------------------------------------------------
+# Class Declaration
+#-----------------------------------------------------------
+
+class gDashboard:
+ def __init__(self, creds_file, spreadsheet, worksheet): #"creds.json", 'OAI RAN Dashboard', 'MR Status'
+ self.scope = ["https://spreadsheets.google.com/feeds",'https://www.googleapis.com/auth/spreadsheets',"https://www.googleapis.com/auth/drive.file","https://www.googleapis.com/auth/drive"]
+ self.creds = ServiceAccountCredentials.from_json_keyfile_name(creds_file, self.scope)
+ self.client = gspread.authorize(self.creds)
+ #spreadsheet
+ self.ss = self.client.open(spreadsheet)
+ #worksheet
+ self.sheet = self.ss.worksheet(worksheet)
+ self.ss.del_worksheet(self.sheet) #start by deleting the old sheet
+ self.sheet = self.ss.add_worksheet(title=worksheet, rows="100", cols="20") #create a new one
+
+ self.d = {} #data dictionary
+
+
+ def fetchData(self,cmd):
+ #cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """
+ process = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
+ output = process.stdout.readline()
+ tmp=output.decode("utf-8")
+ self.d = json.loads(tmp)
+
+
+ def gBuild(self, destinationSheetName):
+
+ #line 1 : update date/time, format dd/mm/YY H:M:S
+ now = datetime.now()
+ dt_string = "Update : " + now.strftime("%d/%m/%Y %H:%M")
+ row =[dt_string]
+ self.sheet.insert_row(row, index=1, value_input_option='RAW')
+
+ #line 2 empty
+ #line 3 is for the column names
+ i=3
+ row =["MR","Created_at","Author","Title","Assignee", "Reviewer", "CAN START","IN PROGRESS","COMPLETED","OK MERGE","Merge conflicts"]
+ self.sheet.insert_row(row, index=i, value_input_option='RAW')
+
+ #line 4 onward, MR data lines
+ for x in range(len(self.d)):
+ i=i+1
+ date_time_str = self.d[x]['created_at']
+ date_time_obj = datetime.strptime(date_time_str, '%Y-%m-%dT%H:%M:%S.%fZ')
+
+ milestone1=milestone2=milestone3=milestone4=""
+ if self.d[x]['milestone']!=None:
+ if self.d[x]['milestone']['title']=="REVIEW_CAN_START":
+ milestone1="X"
+ elif self.d[x]['milestone']['title']=="REVIEW_IN_PROGRESS":
+ milestone2="X"
+ elif self.d[x]['milestone']['title']=="REVIEW_COMPLETED_AND_APPROVED":
+ milestone3="X"
+ elif self.d[x]['milestone']['title']=="OK_TO_BE_MERGED":
+ milestone4="X"
+ else:
+ pass
+ else:
+ pass
+
+ #check if empty or not
+ if self.d[x]['assignee']!=None:
+ assignee = str(self.d[x]['assignee']['name'])
+ else:
+ assignee = ""
+
+ #check if empty or not
+ if len(self.d[x]['reviewers'])!=0:
+ reviewer = str(self.d[x]['reviewers'][0]['name'])
+ else:
+ reviewer = ""
+
+ if self.d[x]['has_conflicts']==True:
+ conflicts = "YES"
+ else:
+ conflicts = ""
+
+ #build final row to be inserted, the first column is left empty for now, will be filled afterward with hyperlinks to gitlab MR
+ row =["", str(date_time_obj.date()),str(self.d[x]['author']['name']),str(self.d[x]['title']),\
+ assignee, reviewer,\
+ milestone1,milestone2,milestone3,milestone4,conflicts]
+
+ #insert the row to worksheet
+ self.sheet.insert_row(row, index=i, value_input_option='RAW')
+
+
+ #add MR hyperlinks in a list of requests to be sent as one update batch; this to save API calls (quotas)
+ i=3
+ requests=[]
+ for x in range(len(self.d)):
+ rowIndex=i
+ colIndex=0
+ hyperlink= '\"'+"https://gitlab.eurecom.fr/oai/openairinterface5g/-/merge_requests/"+ str(self.d[x]['iid']) +'\"'
+ text= '\"'+str(self.d[x]['iid'])+'"'
+ requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex))
+ i=i+1
+ body = {"requests": requests}
+ self.ss.batch_update(body)
+
+
+
+ def addHyperlink(self, hyperlink, text, destinationSheetName, rowIndex, colIndex):
+ sheetId = self.ss.worksheet(destinationSheetName)._properties['sheetId']
+ request =\
+ {
+ "updateCells": {
+ "rows": [
+ {
+ "values": [
+ {
+ "userEnteredValue": {
+ "formulaValue":"=HYPERLINK({},{})".format(hyperlink, text)
+ }
+ }
+ ]
+ }
+ ],
+ "fields": "userEnteredValue",
+ "start": {
+ "sheetId": sheetId,
+ "rowIndex": rowIndex,
+ "columnIndex": colIndex
+ }
+ }
+ }
+ return request
+
+
+
+ def gFormat(self,sourceSheetName,destinationSheetName): # "Formating" , "MR Status"
+ #the requests are appended in a list of requests to be sent as one update batch; this to save API calls (quotas)
+ #copy formating template
+ sourceSheetId = self.ss.worksheet(sourceSheetName)._properties['sheetId']
+ destinationSheetId = self.ss.worksheet(destinationSheetName)._properties['sheetId']
+ requests=[]
+ requests.append(
+ {
+ "copyPaste": {
+ "source": {
+ "sheetId": sourceSheetId,
+ "startRowIndex": 0,
+ "endRowIndex": 40,
+ "startColumnIndex": 0,
+ "endColumnIndex": 12
+ },
+ "destination": {
+ "sheetId": destinationSheetId,
+ "startRowIndex": 0,
+ "endRowIndex": 40,
+ "startColumnIndex": 0,
+ "endColumnIndex": 12
+ },
+ "pasteType": "PASTE_FORMAT"
+ }
+ }
+ )
+
+
+ #resize columns fit to data, except col 0
+ sheetId = self.ss.worksheet(destinationSheetName)._properties['sheetId']
+ requests.append(
+ {
+ 'autoResizeDimensions': {
+ 'dimensions': {
+ 'sheetId': sheetId,
+ 'dimension': 'COLUMNS',
+ 'startIndex': 1,
+ 'endIndex': 12
+ }
+ }
+ }
+ )
+
+
+ #resize col 0
+ sheetId = self.ss.worksheet(destinationSheetName)._properties['sheetId']
+ requests.append(
+ {
+ "updateDimensionProperties": {
+ "range": {
+ "sheetId": sheetId,
+ "dimension": "COLUMNS",
+ "startIndex": 0,
+ "endIndex": 1
+ },
+ "properties": {
+ "pixelSize": 100
+ },
+ "fields": "pixelSize"
+ }
+ }
+ )
+
+
+ #resize milestones to be cleaner
+ sheetId = self.ss.worksheet(destinationSheetName)._properties['sheetId']
+ requests.append(
+ {
+ "updateDimensionProperties": {
+ "range": {
+ "sheetId": sheetId,
+ "dimension": "COLUMNS",
+ "startIndex": 6,
+ "endIndex": 10
+ },
+ "properties": {
+ "pixelSize": 135
+ },
+ "fields": "pixelSize"
+ }
+ }
+ )
+
+ body = {"requests": requests}
+ self.ss.batch_update(body)
+
+
+
+def main():
+ my_gDashboard=gDashboard("/home/oaicicd/remi/creds.json", 'OAI RAN Dashboard', 'MR Status')
+ cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """
+ my_gDashboard.fetchData(cmd)
+ my_gDashboard.gBuild("MR Status")
+ my_gDashboard.gFormat("Formating" , "MR Status")
+
+
+
+if __name__ == "__main__":
+ # execute only if run as a script
+ main()
diff --git a/ci-scripts/xml_files/gnb_phytest_usrp_run.xml b/ci-scripts/xml_files/gnb_phytest_usrp_run.xml
new file mode 100644
index 0000000000..00610d430e
--- /dev/null
+++ b/ci-scripts/xml_files/gnb_phytest_usrp_run.xml
@@ -0,0 +1,53 @@
+
+
+ gNB-PHY-Test
+ Run-gNB-PHY-Test
+ tasks
+ 2
+
+090101 000001 090109
+
+
+
+
+ Initialize_eNB
+ Initialize gNB USRP
+ -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
+ NR
+
+
+
+ IdleSleep
+ Sleep
+ 180
+
+
+
+
+ Terminate_eNB
+ Terminate gNB
+ NR
+
+
+
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 4402083218..775110a774 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -45,6 +45,8 @@ include_directories(${CONFIG_INCLUDE_DIRS})
pkg_search_module(CRYPTO libcrypto REQUIRED)
include_directories(${CRYPTO_INCLUDE_DIRS})
+#uhd 4.0 and iris installs by default in /usr/local
+include_directories("/usr/local/include/")
#use native cmake method as this package is not in pkg-config
if (${RF_BOARD} STREQUAL "OAI_USRP")
find_package(Boost REQUIRED)
@@ -52,7 +54,7 @@ if (${RF_BOARD} STREQUAL "OAI_USRP")
elseif (${RF_BOARD} STREQUAL "OAI_IRIS")
include_directories("${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/")
- include_directories("/usr/local/include/")
+
set(HW_SOURCE ${HW_SOURCE}
${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp)
LINK_DIRECTORIES("/usr/local/lib")
@@ -334,8 +336,8 @@ else (CUDA_FOUND)
endif ()
if (SANITIZE_ADDRESS)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-common")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-common")
endif ()
add_definitions("-DASN_DISABLE_OER_SUPPORT")
@@ -345,7 +347,7 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CU
#########################
# set a flag for changes in the source code
# these changes are related to hardcoded path to include .h files
-set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g3 -O0 -DMALLOC_CHECK_=3")
+set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g3 -Og -DMALLOC_CHECK_=3")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g3 -DMALLOC_CHECK_=3 -O2 -fno-delete-null-pointer-checks")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3")
@@ -410,6 +412,7 @@ add_boolean_option(UE_AUTOTEST_TRACE False "Activate UE autotest specific logs
add_boolean_option(UE_DEBUG_TRACE False "Activate UE debug trace")
add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace")
add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering")
+add_boolean_option(NEW_GTPU True "NEW_GTP")
set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti)
add_library(ITTI
@@ -418,7 +421,6 @@ add_library(ITTI
)
add_dependencies(ITTI rrc_flag)
set(ITTI_LIB ITTI)
- set(GTPU_need_ITTI ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_eNB.c)
##################################################
@@ -2234,26 +2236,21 @@ add_library(CN_UTILS
)
set(GTPV1U_DIR ${OPENAIR3_DIR}/GTPV1-U)
-set (GTPV1U_SRC
- ${RRC_DIR}/rrc_eNB_GTPV1U.c
- ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTunnelEndPoint.c
- ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTrxn.c
- ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uMsg.c
- ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1u.c
- ${GTPV1U_DIR}/gtpv1u_teid_pool.c
-)
-add_library(GTPV1U ${GTPV1U_SRC})
-add_dependencies(GTPV1U rrc_flag)
-#add_library (GTPV1U_OCP
-#${OPENAIR3_DIR}/ocp-gtp/gtp_itf.cpp
-#)
-#include_directories(${OPENAIR3_DIR}/ocp-gtp)
+add_library (GTPV1U_OCP
+ ${NR_RRC_DIR}/rrc_gNB_GTPV1U.c
+ ${RRC_DIR}/rrc_eNB_GTPV1U.c
+${OPENAIR3_DIR}/ocp-gtpu/gtp_itf.cpp
+)
+add_dependencies(GTPV1U_OCP rrc_flag)
+include_directories(${OPENAIR3_DIR}/ocp-gtp)
#NR case
set (NR_GTPV1U_SRC
${NR_RRC_DIR}/rrc_gNB_GTPV1U.c
${RRC_DIR}/rrc_eNB_GTPV1U.c
+ ${GTPV1U_DIR}/gtpv1u_eNB.c
+ ${GTPV1U_DIR}/gtpv1u_gNB.c
${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTunnelEndPoint.c
${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTrxn.c
${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uMsg.c
@@ -2263,6 +2260,12 @@ set (NR_GTPV1U_SRC
add_library(NR_GTPV1U ${NR_GTPV1U_SRC})
add_dependencies(NR_GTPV1U rrc_flag)
+if (${NEW_GTPU})
+set(GTPV1U GTPV1U_OCP)
+else()
+set(GTPV1U NR_GTPV1U)
+endif()
+
set (MME_APP_SRC
${OPENAIR3_DIR}/MME_APP/mme_app.c
${OPENAIR3_DIR}/MME_APP/mme_config.c
@@ -2801,6 +2804,7 @@ add_library(rfsimulator MODULE
${OPENAIR_TARGETS}/ARCH/rfsimulator/simulator.c
${OPENAIR_TARGETS}/ARCH/rfsimulator/apply_channelmod.c
${OPENAIR_TARGETS}/ARCH/rfsimulator/new_channel_sim.c
+ ${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c
)
target_link_libraries(rfsimulator SIMU_COMMON ${ATLAS_LIBRARIES})
@@ -2815,6 +2819,7 @@ include_directories("${OPENAIR_DIR}/common/utils/T")
if (${T_TRACER})
set(T_SOURCE
+ ${OPENAIR_DIR}/common/utils/T/T_IDs.h
${OPENAIR_DIR}/common/utils/T/T.c
${OPENAIR_DIR}/common/utils/T/local_tracer.c)
set(T_LIB "rt")
@@ -2824,8 +2829,6 @@ endif (${T_TRACER})
#This rule and the following deal with it.
add_custom_command (
OUTPUT ${OPENAIR_DIR}/common/utils/T/T_IDs.h
- COMMAND make clean
- COMMAND make -j2
COMMAND make check_vcd
WORKING_DIRECTORY ${OPENAIR_DIR}/common/utils/T
DEPENDS ${OPENAIR_DIR}/common/utils/T/T_messages.txt
@@ -2833,6 +2836,10 @@ add_custom_command (
${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.h
)
+execute_process (
+ COMMAND make check_vcd
+ WORKING_DIRECTORY ${OPENAIR_DIR}/common/utils/T
+)
#This rule is specifically needed to generate T files
#before anything else in a project that uses the T.
#See below, there are some 'add_dependencies' showing that.
@@ -2902,7 +2909,6 @@ add_executable(lte-softmodem
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
${OPENAIR_DIR}/common/utils/utils.c
${OPENAIR_DIR}/common/utils/system.c
- ${GTPU_need_ITTI}
${XFORMSINTERFACE_SOURCE}
${T_SOURCE}
${CONFIG_SOURCES}
@@ -2912,7 +2918,8 @@ add_dependencies(lte-softmodem rrc_flag s1ap_flag x2_flag oai_iqplayer)
target_link_libraries (lte-softmodem
-Wl,--start-group
- RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB
+
+ RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB ${GTPV1U} SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB
PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB LFDS7
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB}
-Wl,--end-group z dl)
@@ -2943,7 +2950,6 @@ add_executable(ocp-enb
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
${OPENAIR_DIR}/common/utils/utils.c
${OPENAIR_DIR}/common/utils/system.c
- ${GTPU_need_ITTI}
${XFORMSINTERFACE_SOURCE}
${T_SOURCE}
${CONFIG_SOURCES}
@@ -2953,7 +2959,8 @@ add_dependencies(ocp-enb rrc_flag s1ap_flag x2_flag oai_iqplayer coding params_l
target_link_libraries (ocp-enb
-Wl,--start-group
- RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB
+
+ RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB ${GTPV1U} SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB
PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB MISC_NFAPI_LTE_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 SIMU_COMMON
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB}
-Wl,--end-group z dl)
@@ -3023,7 +3030,8 @@ endif()
target_link_libraries (lte-uesoftmodem
-Wl,--start-group
RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP F1AP_LIB
- GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
+
+ ${GTPV1U} SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES}
-Wl,--end-group z dl)
@@ -3051,21 +3059,20 @@ add_executable(nr-softmodem
${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
- ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_gNB.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
${OPENAIR_DIR}/common/utils/utils.c
${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
- ${GTPU_need_ITTI}
${XFORMSINTERFACE_SOURCE}
${T_SOURCE}
${CONFIG_SOURCES}
${SHLIB_LOADER_SOURCES}
+ ${OPENAIR2_DIR}/ENB_APP/flexran_agent_ran_api_to_fix.c
)
target_link_libraries (nr-softmodem
-Wl,--start-group
- UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA
+ UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS ${GTPV1U} SECU_CN SECU_OSA
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
@@ -3095,7 +3102,6 @@ add_executable(ocp-gnb
${OPENAIR_DIR}/common/utils/nr/nr_common.c
${OPENAIR_DIR}/common/utils/utils.c
${OPENAIR_DIR}/common/utils/system.c
- ${GTPU_need_ITTI}
${XFORMS_SOURCE_NR}
${T_SOURCE}
${CONFIG_SOURCES}
@@ -3105,7 +3111,7 @@ add_executable(ocp-gnb
target_link_libraries (ocp-gnb
-Wl,--start-group
- UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA
+ UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS ${GTPV1U} SECU_CN SECU_OSA
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB SIMU_COMMON
@@ -3182,6 +3188,17 @@ target_link_libraries (dlsim_tm4
pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${T_LIB}
)
+add_executable(rftest
+ ${OPENAIR_DIR}/openair1/PHY/TOOLS/calibration_test.c
+ ${OPENAIR_DIR}/openair1/PHY/TOOLS/calibration_scope.c
+ ${OPENAIR_DIR}/common/utils/system.c
+ ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
+ ${OPENAIR_DIR}/executables/softmodem-common.c
+ ${CONFIG_SOURCES}
+ ${SHLIB_LOADER_SOURCES}
+)
+target_link_libraries(rftest minimal_lib PHY_NR_COMMON pthread dl m forms ${T_LIB} )
+
add_executable(polartest
${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/polartest.c
${OPENAIR_DIR}/common/utils/backtrace.c
@@ -3414,7 +3431,7 @@ add_executable(test_epc_generate_scenario
${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h
)
target_link_libraries (test_epc_generate_scenario
- -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB}
+ -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP ${GTPV1U} LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB}
)
add_executable(test_epc_play_scenario
@@ -3433,7 +3450,7 @@ add_executable(test_epc_play_scenario
)
target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c)
target_link_libraries (test_epc_play_scenario
- -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB}
+ -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP ${GTPV1U} LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB}
)
@@ -3479,7 +3496,7 @@ if (${T_TRACER})
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_NR MAC_UE_NR NGAP_GNB
- CN_UTILS GTPV1U NR_GTPV1U SCTP_CLIENT MME_APP UDP LIB_NAS_UE NB_IoT LFDS LFDS7 SIMU_COMMON SIMU SIMU_ETH OPENAIR0_LIB
+ CN_UTILS ${GTPV1U} SCTP_CLIENT MME_APP UDP LIB_NAS_UE NB_IoT LFDS LFDS7 SIMU_COMMON SIMU SIMU_ETH OPENAIR0_LIB
ldpc_orig ldpc_optim ldpc_optim8seg ldpc PROTO_AGENT dfts)
if (TARGET ${i})
add_dependencies(${i} generate_T)
@@ -3570,14 +3587,12 @@ add_executable(nr-ittisim
${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
- ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_gNB.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
${OPENAIR_DIR}/common/utils/utils.c
${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
- ${GTPU_need_ITTI}
${XFORMSINTERFACE_SOURCE}
${T_SOURCE}
${CONFIG_SOURCES}
@@ -3586,7 +3601,7 @@ add_executable(nr-ittisim
target_link_libraries (nr-ittisim
-Wl,--start-group
- UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA
+ UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS ${GTPV1U} SECU_CN SECU_OSA
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_SIM_LIB} RRC_LIB NR_RRC_LIB
NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
diff --git a/cmake_targets/install_external_packages.ubuntu20 b/cmake_targets/install_external_packages.ubuntu20
index 9ef79be9c2..4b1cda42f8 100755
--- a/cmake_targets/install_external_packages.ubuntu20
+++ b/cmake_targets/install_external_packages.ubuntu20
@@ -83,6 +83,8 @@ get_distribution_release() {
check_supported_distribution() {
case $(get_distribution_release) in
"ubuntu20.04") return 0 ;;
+ "ubuntu20.10") return 0 ;;
+ "ubuntu21.04") return 0 ;;
esac
return 1
}
@@ -157,8 +159,16 @@ install_protobuf_from_source(){
#cd protobuf-2.6.1/
rm -rf /tmp/protobuf-cpp-3.3.0.tar.gz* /tmp/protobuf-3.3.0
wget --tries=3 --retry-connrefused https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz
- tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner "$USER" --group "$(groups | cut -d" " -f1)" --no-same-owner
- cd protobuf-3.3.0/ || exit
+ tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner $(id -u) --group $(id -g) --no-same-owner
+ cd protobuf-3.3.0/
+ else
+ export LD_LIBRARY_PATH=/usr/local/lib #protoc needs to know where toclook for shared libs
+ rm -rf /tmp/protobuf
+ git clone --depth=1 --branch=v3.3.0 https://github.com/protocolbuffers/protobuf.git /tmp/protobuf
+ cd /tmp/protobuf
+ git submodule update --init --recursive
+ ./autogen.sh
+ fi
./configure
echo "Compiling protobuf"
make -j"$(nproc)"
@@ -198,15 +208,15 @@ install_usrp_uhd_driver_from_source(){
rm -rf /tmp/uhd
git clone https://github.com/EttusResearch/uhd.git
cd uhd || exit
- git checkout tags/v3.13.0.2
+ git checkout UHD-3.15.LTS
mkdir -p host/build
cd host/build || exit
- $CMAKE ../
+ $CMAKE ../ -GNinja
echo "Compiling UHD"
- make -j"$(nproc)"
- make test
- $SUDO make install
+ ninja
+ $SUDO ninja install
$SUDO ldconfig
+ $SUDO /usr/lib/uhd/utils/uhd_images_downloader.py
) >& "$uhd_install_log"
}
@@ -329,6 +339,7 @@ check_install_ubuntu_packages() {
$SUDO apt install -y software-properties-common
case "$(get_distribution_release)" in
"ubuntu20.04")
+ "ubuntu21.04")
specific_packages="libtasn1-6-dev libgnutls28-dev iproute2 libconfig-dev"
LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu"
LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so"
@@ -345,7 +356,6 @@ check_install_ubuntu_packages() {
openvpn \
pkg-config \
python3-dev \
- python-pexpect \
sshfs \
swig \
tshark \
@@ -358,7 +368,6 @@ check_install_ubuntu_packages() {
iperf3 \
android-tools-adb \
wvdial \
- python-numpy \
sshpass \
nscd \
bc \
@@ -379,7 +388,6 @@ check_install_ubuntu_packages() {
git \
graphviz \
gtkwave \
- guile-2.0-dev \
iperf \
iptables \
libxtables-dev \
@@ -419,7 +427,8 @@ check_install_ubuntu_packages() {
libxpm-dev \
libboost-all-dev \
nettle-dev \
- nettle-bin
+ nettle-bin \
+ libreadline-dev
fi
$SUDO update-alternatives --set "$LAPACK_LIBNAME" "$LAPACK_TARGET"
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 9b8363fc2b..9880b66685 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -113,6 +113,7 @@ check_supported_distribution() {
"rhel7.6") return 0 ;;
"rhel7.7") return 0 ;;
"rhel7.8") return 0 ;;
+ "rhel7.9") return 0 ;;
"rhel8.2") return 0 ;;
"rhel8.3") return 0 ;;
"rhel8.4") return 0 ;;
diff --git a/cmake_targets/tools/run_enb_s1_usrp b/cmake_targets/tools/run_enb_s1_usrp
index e119126683..1a4c6b10b8 100755
--- a/cmake_targets/tools/run_enb_s1_usrp
+++ b/cmake_targets/tools/run_enb_s1_usrp
@@ -101,7 +101,6 @@ function main()
local -i run_gdb=0
local -i show_stdout=0
local exe_arguments=""
- local itti_dump_file=""
until [ -z "$1" ]
do
@@ -154,18 +153,6 @@ function main()
exe_arguments="$exe_arguments --rf-config-file=$rf_config_file"
fi
;;
- -K | --itti-dump-file)
- itti_dump_file=$2
- # can omit file name if last arg on the line
- if [ "x$itti_dump_file" = "x" ]; then
- itti_dump_file="/tmp/enb_s1_usrp_itti.log"
- shift 1;
- else
- shift 2;
- fi
- echo "setting ITTI dump file to: $itti_dump_file"
- exe_arguments="$exe_arguments -K $itti_dump_file"
- ;;
-m | --mscgen)
g_msc_dir=$2
# can omit file name if last arg on the line
diff --git a/common/config/config_cmdline.c b/common/config/config_cmdline.c
index 6d01d98c65..1df1bc16f7 100644
--- a/common/config/config_cmdline.c
+++ b/common/config/config_cmdline.c
@@ -255,7 +255,7 @@ int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix)
if ( ((strlen(oneargv) == 2) && (strcmp(oneargv + 1,cfgpath) == 0)) || /* short option, one "-" */
((strlen(oneargv) > 2) && (strcmp(oneargv + 2,cfgpath ) == 0 )) || /* long option beginning with "--" */
((strlen(oneargv) == 2) && (strcmp(oneargv + 1,cfgoptions[n].optname) == 0) && (cfgoptions[n].paramflags & PARAMFLAG_CMDLINE_NOPREFIXENABLED )) ||
- ((strlen(oneargv) > 2) && (strcmp(oneargv + 2,cfgpath ) == 0 ) && (cfgoptions[n].paramflags & PARAMFLAG_CMDLINE_NOPREFIXENABLED )) ) {
+ ((strlen(oneargv) > 2) && (strcmp(oneargv + 2, cfgoptions[n].optname) == 0 ) && (cfgoptions[n].paramflags & PARAMFLAG_CMDLINE_NOPREFIXENABLED )) ) {
char *valptr=NULL;
int ret;
config_get_if()->argv_info[i] |= CONFIG_CMDLINEOPT_PROCESSED;
diff --git a/common/config/config_load_configmodule.h b/common/config/config_load_configmodule.h
index 8baaa99bb8..0688f6531f 100644
--- a/common/config/config_load_configmodule.h
+++ b/common/config/config_load_configmodule.h
@@ -82,10 +82,12 @@ typedef struct configmodule_interface {
#ifdef CONFIG_LOADCONFIG_MAIN
configmodule_interface_t *cfgptr=NULL;
-static char config_helpstr [] = "\n lte-softmodem -O [config mode]<:dbgl[debugflags]> \n \
- debugflags can also be defined in the config_libconfig section of the config file\n \
+static char config_helpstr [] = "\n lte-softmodem -O [config mode]<:dbgl[debugflags]><:incp[path]>\n \
+ debugflags can also be defined in the config section of the config file\n \
debugflags: mask, 1->print parameters, 2->print memory allocations debug messages\n \
- 4->print command line processing debug messages\n ";
+ 4->print command line processing debug messages\n \
+ incp parameter can be used to define the include path used for config files (@include directive)\n \
+ defaults is set to the path of the main config file.\n";
#define CONFIG_SECTIONNAME "config"
#define CONFIGPARAM_DEBUGFLAGS_IDX 0
diff --git a/common/config/libconfig/config_libconfig.c b/common/config/libconfig/config_libconfig.c
index eb08a70183..17266246f0 100644
--- a/common/config/libconfig/config_libconfig.c
+++ b/common/config/libconfig/config_libconfig.c
@@ -33,8 +33,9 @@
#include
#include
+#include
+ #include
-#include
#include "config_libconfig.h"
#include "config_libconfig_private.h"
@@ -347,17 +348,35 @@ int config_libconfig_init(char *cfgP[], int numP) {
config_get_if()->numptrs=0;
memset(config_get_if()->ptrs,0,sizeof(void *) * CONFIG_MAX_ALLOCATEDPTRS);
memset(config_get_if()->ptrsAllocated, 0, sizeof(config_get_if()->ptrsAllocated));
-
+ /* search for include path parameter and set config file include path accordingly */
+ for (int i=0; isched_get_priority_max(SCHED_FIFO)) {
+ LOG_E(TMR,"Prio not possible: %d, min is %d, max: %d, forced in the range\n",
+ priority,
+ sched_get_priority_min(SCHED_OAI),
+ sched_get_priority_max(SCHED_OAI));
+ if(prioritysched_get_priority_max(SCHED_OAI))
+ priority=sched_get_priority_max(SCHED_OAI);
+ }
+ AssertFatal(priority<=sched_get_priority_max(SCHED_OAI),"");
struct sched_param sparam={0};
sparam.sched_priority = priority;
- pthread_attr_setschedparam(&attr, &sparam);
-
- pthread_create(t, &attr, func, param);
+ ret=pthread_attr_setschedparam(&attr, &sparam);
+ AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno);
+ ret=pthread_create(t, &attr, func, param);
+ AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno);
pthread_setname_np(*t, name);
if (affinity != -1 ) {
@@ -216,7 +233,6 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name,
CPU_SET(affinity, &cpuset);
AssertFatal( pthread_setaffinity_np(*t, sizeof(cpu_set_t), &cpuset) == 0, "Error setting processor affinity");
}
-
pthread_attr_destroy(&attr);
}
diff --git a/common/utils/system.h b/common/utils/system.h
index a89a6c5b17..fbfd338a1a 100644
--- a/common/utils/system.h
+++ b/common/utils/system.h
@@ -46,9 +46,11 @@ void set_latency_target(void);
void configure_linux(void);
void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, int affinity, int priority);
-#define OAI_PRIORITY_RT_LOW sched_get_priority_min(SCHED_FIFO)
-#define OAI_PRIORITY_RT sched_get_priority_max(SCHED_FIFO)-10
-#define OAI_PRIORITY_RT_MAX sched_get_priority_max(SCHED_FIFO)
+
+#define SCHED_OAI SCHED_RR
+#define OAI_PRIORITY_RT_LOW sched_get_priority_min(SCHED_OAI)
+#define OAI_PRIORITY_RT ((sched_get_priority_min(SCHED_OAI)+sched_get_priority_max(SCHED_OAI))/2)
+#define OAI_PRIORITY_RT_MAX sched_get_priority_max(SCHED_OAI)-2
void thread_top_init(char *thread_name,
int affinity,
diff --git a/common/utils/telnetsrv/telnetsrv.c b/common/utils/telnetsrv/telnetsrv.c
index 03f7af99bc..734126721a 100644
--- a/common/utils/telnetsrv/telnetsrv.c
+++ b/common/utils/telnetsrv/telnetsrv.c
@@ -461,12 +461,12 @@ int process_command(char *buf) {
int i,j,k;
char modulename[TELNET_CMD_MAXSIZE];
char cmd[TELNET_CMD_MAXSIZE];
- char cmdb[TELNET_MAX_MSGLENGTH];
+ char *cmdb=NULL;
char *bufbck;
int rt;
memset(modulename,0,sizeof(modulename));
memset(cmd,0,sizeof(cmd));
- memset(cmdb,0,sizeof(cmdb));
+
if (strncasecmp(buf,"ex",2) == 0)
return CMDSTATUS_EXIT;
@@ -490,12 +490,10 @@ int process_command(char *buf) {
return CMDSTATUS_FOUND;
}
- memset(modulename,0,sizeof(modulename));
- memset(cmd,0,sizeof(cmd));
- memset(cmdb,0,sizeof(cmdb));
+
bufbck=strdup(buf);
rt=CMDSTATUS_NOTFOUND;
- j = sscanf(buf,"%19s %19s %19[^\t\n]",modulename,cmd,cmdb);
+ j = sscanf(buf,"%19s %19s %m[^\t\n]",modulename,cmd,&cmdb);
if (telnetparams.telnetdbg > 0)
printf("process_command: %i words, module=%s cmd=%s, parameters= %s\n",j,modulename,cmd,cmdb);
@@ -562,7 +560,7 @@ int process_command(char *buf) {
rt= CMDSTATUS_FOUND;
} /* loop */
} /* for i */
-
+ free(cmdb);
free(bufbck);
return rt;
}
@@ -702,7 +700,7 @@ void poll_telnetcmdq(void *qid, void *arg) {
*/
void exec_moduleinit(char *modname) {
void (*fptr)(void);
- char initfunc[TELNET_CMD_MAXSIZE+9];
+ char initfunc[TELNET_CMD_MAXSIZE+10];
if (strlen(modname) > TELNET_CMD_MAXSIZE) {
fprintf(stderr,"[TELNETSRV] module %s not loaded, name exceeds the %i size limit\n",
diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h
index 5db1a5e34e..a32b7c3859 100644
--- a/common/utils/threadPool/thread-pool.h
+++ b/common/utils/threadPool/thread-pool.h
@@ -37,14 +37,21 @@
#else
#define THREADINIT PTHREAD_MUTEX_INITIALIZER
#endif
-#define mutexinit(mutex) AssertFatal(pthread_mutex_init(&mutex,NULL)==0,"");
-#define condinit(signal) AssertFatal(pthread_cond_init(&signal,NULL)==0,"");
-#define mutexlock(mutex) AssertFatal(pthread_mutex_lock(&mutex)==0,"");
+#define mutexinit(mutex) {int ret=pthread_mutex_init(&mutex,NULL); \
+ AssertFatal(ret==0,"ret=%d\n",ret);}
+#define condinit(signal) {int ret=pthread_cond_init(&signal,NULL); \
+ AssertFatal(ret==0,"ret=%d\n",ret);}
+#define mutexlock(mutex) {int ret=pthread_mutex_lock(&mutex); \
+ AssertFatal(ret==0,"ret=%d\n",ret);}
#define mutextrylock(mutex) pthread_mutex_trylock(&mutex)
-#define mutexunlock(mutex) AssertFatal(pthread_mutex_unlock(&mutex)==0,"");
-#define condwait(condition, mutex) AssertFatal(pthread_cond_wait(&condition, &mutex)==0,"");
-#define condbroadcast(signal) AssertFatal(pthread_cond_broadcast(&signal)==0,"");
-#define condsignal(signal) AssertFatal(pthread_cond_broadcast(&signal)==0,"");
+#define mutexunlock(mutex) {int ret=pthread_mutex_unlock(&mutex); \
+ AssertFatal(ret==0,"ret=%d\n",ret);}
+#define condwait(condition, mutex) {int ret=pthread_cond_wait(&condition, &mutex); \
+ AssertFatal(ret==0,"ret=%d\n",ret);}
+#define condbroadcast(signal) {int ret=pthread_cond_broadcast(&signal); \
+ AssertFatal(ret==0,"ret=%d\n",ret);}
+#define condsignal(signal) {int ret=pthread_cond_broadcast(&signal); \
+ AssertFatal(ret==0,"ret=%d\n",ret);}
#define tpool_nbthreads(tpool) (tpool.nbThreads)
typedef struct notifiedFIFO_elt_s {
struct notifiedFIFO_elt_s *next;
@@ -78,7 +85,7 @@ static inline notifiedFIFO_elt_t *newNotifiedFIFO_elt(int size,
ret->reponseFifo=reponseFifo;
ret->processingFunc=processingFunc;
// We set user data piece aligend 32 bytes to be able to process it with SIMD
- ret->msgData=(void *)ret+(sizeof(notifiedFIFO_elt_t)/32+1)*32;
+ ret->msgData=(void *)((uint8_t*)ret+(sizeof(notifiedFIFO_elt_t)/32+1)*32);
ret->malloced=true;
return ret;
}
diff --git a/common/utils/threadPool/thread-pool.md b/common/utils/threadPool/thread-pool.md
index a087b989fa..f2422d9822 100644
--- a/common/utils/threadPool/thread-pool.md
+++ b/common/utils/threadPool/thread-pool.md
@@ -210,8 +210,8 @@ time the worker finished the job
time the client reads the result
if you set the environement variable:
-thread-pool-measurements to a valid file name
+threadPoolMeasurements to a valid file name
These measurements will be wrote to this Linux pipe.
-A tool to read the linux fifo and display it in ascii is provided:
-see the local directory Makefile for this tool and to compile the thread pool unitary tests.
+A tool to read the linux fifo and display it in ascii is provided; compute the binay:
+in cmake building directory: make/ninja measurement_display
diff --git a/doc/SW_archi.md b/doc/SW_archi.md
index d92f802148..0d03591891 100644
--- a/doc/SW_archi.md
+++ b/doc/SW_archi.md
@@ -296,6 +296,28 @@ gtp thread calls directly pdcp_data_req(), so it runs inside it's context intern
## inside other threads
gtpv1u_create_s1u_tunnel(), delete tunnel, ... functions are called inside the other threads, without mutex.
+# New GTP
+## initialization
+Coexistance until full merge with legacy GTP
+cmake new option: NEW_GTPU to use the new implementation (it changes for the entire executable)
+It is possible to use both old and new GTP in same executable because the itti task and all functions names are different
+Current status of new implementation: not tested, X2 not developped, 5G new GTP option not developped, remain issues on data coming from void: muid, enb_flag, ...
+
+ocp_gtpv1uTask(): this creates only the thread, doesn't configure anything
+gtpv1Init(): creates a listening socket to Linux for a given reception and select a local IP address
+
+newGtpuCreateTunnel() this function will replace the xxx_create_tunnel_xxx() for various cases
+This creates a outgoing context for a teid (in input), it computes and return the incoming teid that will be used for incoming packets
+These teids and in a "instance", so in a Linux socket: same teid can co-exist for different sockets
+ Remain here a lack to fill: the information given in the legacy funtions is not enough to fullfil the data needed by the callback
+stuff like enb_flag, but also mui and more important data are not given explicitly by any legacy function (gtpv1u_create_s1u_tunnel), but the legacy and the new interface to lower layer (like pdcp) require this data.
+The datamodel is still not fully understood, so this data source remain unknown
+A new parameter is the callback function: will be pdpcp_data_req() and gtpv_data_req() (x2 case) for existing implementation and later other call backs like the F1-U implementation.
+
+incoming packets
+the gtp layer retrieves the data, the teid, find out the related data: rnti, bearer and quite a lot of other parameters (not clear why, because it looks like all is statefull, so the lower layer should have the context)
+if lower layers can be stateless, it is a good idea to keep the context in the gtp layer and pass it to the callback, but the design remain obfuscated.
+
# NGAP
NGAP would be a itti thread as is S1AP (+twin thread SCTP that is almost void processing)?
About all messages are exchanged with RRC thread
diff --git a/executables/main-ocp.c b/executables/main-ocp.c
index ee95a96ce9..0712dfbf57 100644
--- a/executables/main-ocp.c
+++ b/executables/main-ocp.c
@@ -73,13 +73,14 @@ int sync_var=-1; //!< protected by mutex \ref sync_mutex.
int config_sync_var=-1;
volatile int oai_exit = 0;
double cpuf;
+THREAD_STRUCT thread_struct;
+
uint16_t sf_ahead=4;
//uint16_t slot_ahead=6;
int otg_enabled;
uint64_t downlink_frequency[MAX_NUM_CCs][4];
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
int split73;
-int usrp_tx_thread = 0;
char * split73_config;
int split73;
AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB]= {0};
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index a92f433560..f5e49b73b8 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -228,16 +228,6 @@ void rx_func(void *param) {
rnti_to_remove_count = 0;
if (pthread_mutex_unlock(&rnti_to_remove_mutex)) exit(1);
- // Call the scheduler
-
- pthread_mutex_lock(&gNB->UL_INFO_mutex);
- gNB->UL_INFO.frame = frame_rx;
- gNB->UL_INFO.slot = slot_rx;
- gNB->UL_INFO.module_id = gNB->Mod_id;
- gNB->UL_INFO.CC_id = gNB->CC_id;
- gNB->if_inst->NR_UL_indication(&gNB->UL_INFO);
- pthread_mutex_unlock(&gNB->UL_INFO_mutex);
-
// RX processing
int tx_slot_type = nr_slot_select(cfg,frame_tx,slot_tx);
int rx_slot_type = nr_slot_select(cfg,frame_rx,slot_rx);
@@ -264,6 +254,18 @@ void rx_func(void *param) {
stop_meas( &softmodem_stats_rxtx_sf );
LOG_D(PHY,"%s() Exit proc[rx:%d%d tx:%d%d]\n", __FUNCTION__, frame_rx, slot_rx, frame_tx, slot_tx);
+ // Call the scheduler
+
+ start_meas(&gNB->ul_indication_stats);
+ pthread_mutex_lock(&gNB->UL_INFO_mutex);
+ gNB->UL_INFO.frame = frame_rx;
+ gNB->UL_INFO.slot = slot_rx;
+ gNB->UL_INFO.module_id = gNB->Mod_id;
+ gNB->UL_INFO.CC_id = gNB->CC_id;
+ gNB->if_inst->NR_UL_indication(&gNB->UL_INFO);
+ pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+ stop_meas(&gNB->ul_indication_stats);
+
notifiedFIFO_elt_t *res;
if (tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT) {
@@ -323,18 +325,40 @@ static void *process_stats_thread(void *param) {
PHY_VARS_gNB *gNB = (PHY_VARS_gNB *)param;
+ reset_meas(&gNB->phy_proc_tx);
reset_meas(&gNB->dlsch_encoding_stats);
- reset_meas(&gNB->dlsch_scrambling_stats);
- reset_meas(&gNB->dlsch_modulation_stats);
+ reset_meas(&gNB->phy_proc_rx);
+ reset_meas(&gNB->ul_indication_stats);
+ reset_meas(&gNB->rx_pusch_stats);
+ reset_meas(&gNB->ulsch_decoding_stats);
wait_sync("process_stats_thread");
while(!oai_exit)
{
sleep(1);
- print_meas(&gNB->dlsch_encoding_stats, "pdsch_encoding", NULL, NULL);
- print_meas(&gNB->dlsch_scrambling_stats, "pdsch_scrambling", NULL, NULL);
- print_meas(&gNB->dlsch_modulation_stats, "pdsch_modulation", NULL, NULL);
+ print_meas(&gNB->phy_proc_tx, "L1 Tx processing", NULL, NULL);
+ print_meas(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL);
+ print_meas(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL);
+ print_meas(&gNB->ul_indication_stats, "UL Indication", NULL, NULL);
+ print_meas(&gNB->rx_pusch_stats, "PUSCH inner-receiver", NULL, NULL);
+ print_meas(&gNB->ulsch_decoding_stats, "PUSCH decoding", NULL, NULL);
+ }
+ return(NULL);
+}
+
+void *nrL1_stats_thread(void *param) {
+ PHY_VARS_gNB *gNB = (PHY_VARS_gNB *)param;
+ wait_sync("L1_stats_thread");
+ FILE *fd;
+ while (!oai_exit) {
+ sleep(1);
+ fd=fopen("nrL1_stats.log","w");
+ AssertFatal(fd!=NULL,"Cannot open ngL1_stats.log\n");
+ dump_nr_I0_stats(fd,gNB);
+ dump_pusch_stats(fd,gNB);
+ // dump_uci_stats(fd,eNB,eNB->proc.L1_proc_tx.frame_tx);
+ fclose(fd);
}
return(NULL);
}
@@ -355,6 +379,7 @@ void init_gNB_Tpool(int inst) {
sprintf(ul_pool+2+s_offset,",-1");
s_offset += 3;
}
+ if (getenv("noThreads")) strcpy(ul_pool, "n");
initTpool(ul_pool, gNB->threadPool, false);
// ULSCH decoder result FIFO
gNB->respDecode = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
@@ -373,7 +398,10 @@ void init_gNB_Tpool(int inst) {
initNotifiedFIFO(gNB->resp_RU_tx);
// Stats measurement thread
- if(opp_enabled == 1) threadCreate(&proc->L1_stats_thread, process_stats_thread,(void *)gNB, "time_meas", -1, OAI_PRIORITY_RT_LOW);
+ if(opp_enabled == 1) threadCreate(&proc->process_stats_thread, process_stats_thread,(void *)gNB, "time_meas", -1, OAI_PRIORITY_RT_LOW);
+ threadCreate(&proc->L1_stats_thread,nrL1_stats_thread,(void*)gNB,"L1_stats",-1,OAI_PRIORITY_RT_LOW);
+
+
}
@@ -462,6 +490,8 @@ printf("after %p\n", gNB->common_vars.rxdataF[aa]);
}
+
+
void init_gNB(int single_thread_flag,int wait_for_sync) {
int inst;
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index f0d56f23f9..6d5b0ec8a3 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -119,7 +119,6 @@ uint16_t sl_ahead;
extern int emulate_rf;
extern int numerology;
-extern int usrp_tx_thread;
/*************************************************************/
/* Functions to attach and configure RRU */
@@ -904,6 +903,18 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
cfg->tx_bw = 80e6;
cfg->rx_bw = 80e6;
}
+ break;
+ case 133 :
+ if (fp->threequarter_fs) {
+ AssertFatal(1==0,"N_RB %d cannot use 3/4 sampling\n",N_RB);
+ }
+ else {
+ cfg->sample_rate=61.44e6;
+ cfg->samples_per_frame = 614400;
+ cfg->tx_bw = 50e6;
+ cfg->rx_bw = 50e6;
+ }
+
break;
case 106:
if (fp->threequarter_fs) {
@@ -918,7 +929,7 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
cfg->tx_bw = 40e6;
cfg->rx_bw = 40e6;
}
- break;
+ break;
case 51:
if (fp->threequarter_fs) {
cfg->sample_rate=23.04e6;
diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h
index a1e1c103ee..c38d1249d2 100644
--- a/executables/nr-softmodem-common.h
+++ b/executables/nr-softmodem-common.h
@@ -69,10 +69,14 @@
#define CONFIG_HLP_SOFTS "Enable soft scope and L1 and L2 stats (Xforms)\n"
#define CONFIG_HLP_EXMCAL "Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n"
#define CONFIG_HLP_ITTIL "Generate ITTI analyzser logs (similar to wireshark logs but with more details)\n"
-#define CONFIG_HLP_DLMCS "Set the maximum downlink MCS\n"
+#define CONFIG_HLP_DLMCS_PHYTEST "Set the downlink MCS for PHYTEST mode\n"
#define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n"
#define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n"
-#define CONFIG_HLP_ULMCS "Set the maximum uplink MCS\n"
+#define CONFIG_HLP_ULMCS_PHYTEST "Set the uplink MCS for PHYTEST mode\n"
+#define CONFIG_HLP_DLBW_PHYTEST "Set the number of PRBs used for DLSCH in PHYTEST mode\n"
+#define CONFIG_HLP_ULBW_PHYTEST "Set the number of PRBs used for ULSCH in PHYTEST mode\n"
+#define CONFIG_HLP_DLBM_PHYTEST "Bitmap for DLSCH slots (slot 0 starts at LSB)\n"
+#define CONFIG_HLP_ULBM_PHYTEST "Bitmap for ULSCH slots (slot 0 starts at LSB)\n"
#define CONFIG_HLP_TDD "Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n"
#define CONFIG_HLP_UE "Set the lte softmodem as a UE\n"
#define CONFIG_HLP_L2MONW "Enable L2 wireshark messages on localhost \n"
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 2fa8081dd5..c7e636736b 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -85,6 +85,7 @@ unsigned short config_frames[4] = {2,9,11,13};
#include "x2ap_eNB.h"
#include "ngap_gNB.h"
#include "gnb_paramdef.h"
+#include
#include "nfapi/oai_integration/vendor_ext.h"
pthread_cond_t nfapi_sync_cond;
@@ -92,7 +93,7 @@ pthread_mutex_t nfapi_sync_mutex;
int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
extern uint8_t nfapi_mode; // Default to monolithic mode
-
+THREAD_STRUCT thread_struct;
pthread_cond_t sync_cond;
pthread_mutex_t sync_mutex;
int sync_var=-1; //!< protected by mutex \ref sync_mutex.
@@ -114,7 +115,6 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
//Temp fix for inexistent NR upper layer
unsigned char NB_gNB_INST = 1;
-static char *itti_dump_file = NULL;
int UE_scan = 1;
int UE_scan_carrier = 0;
@@ -160,8 +160,6 @@ int otg_enabled;
//static NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs];
//static nfapi_nr_config_request_t *config[MAX_NUM_CCs];
-uint32_t target_dl_mcs = 28; //maximum allowed mcs
-uint32_t target_ul_mcs = 20;
uint32_t timing_advance = 0;
uint64_t num_missed_slots=0; // counter for the number of missed slots
@@ -179,7 +177,6 @@ extern void *udp_eNB_task(void *args_p);
int transmission_mode=1;
int emulate_rf = 0;
int numerology = 0;
-int usrp_tx_thread = 0;
static char *parallel_config = NULL;
@@ -366,7 +363,7 @@ int create_gNB_tasks(uint32_t gnb_nb) {
}
}
- if (itti_create_task (TASK_GTPV1_U, >pv1u_gNB_task, NULL) < 0) {
+ if (itti_create_task (TASK_GTPV1_U, &nr_gtpv1u_gNB_task, NULL) < 0) {
LOG_E(GTPU, "Create task for GTPV1U failed\n");
return -1;
}
@@ -859,13 +856,6 @@ if(!IS_SOFTMODEM_NOS1)
printf("NFAPI mode - DO NOT call init_gNB_afterRU()\n");
}
- if (nfapi_mode != 1 && nfapi_mode != 2) {
- printf("Not NFAPI mode - call init_eNB_afterRU()\n");
- init_eNB_afterRU();
- } else {
- printf("NFAPI mode - DO NOT call init_gNB_afterRU()\n");
- }
-
printf("ALL RUs ready - ALL gNBs ready\n");
// connect the TX/RX buffers
printf("Sending sync to all threads\n");
diff --git a/executables/nr-softmodem.h b/executables/nr-softmodem.h
index d6cfe6b906..928558013c 100644
--- a/executables/nr-softmodem.h
+++ b/executables/nr-softmodem.h
@@ -18,19 +18,27 @@
/* optname helpstr paramflags XXXptr defXXXval type numelt */
/*----------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
#define CMDLINE_PARAMS_DESC_GNB { \
- {"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, uptr:&mmapped_dma, defintval:0, TYPE_INT, 0}, \
{"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \
{"A" , CONFIG_HLP_TADV, 0, uptr:&timing_advance, defintval:0, TYPE_UINT, 0}, \
{"E" , CONFIG_HLP_TQFS, PARAMFLAG_BOOL, i8ptr:&threequarter_fs, defintval:0, TYPE_INT8, 0}, \
- {"K" , CONFIG_HLP_ITTIL, PARAMFLAG_NOFREE, strptr:&itti_dump_file, defstrval:"/tmp/itti.dump", TYPE_STRING, 0}, \
- {"m" , CONFIG_HLP_DLMCS, 0, uptr:&target_dl_mcs, defintval:0, TYPE_UINT, 0}, \
- {"t" , CONFIG_HLP_ULMCS, 0, uptr:&target_ul_mcs, defintval:0, TYPE_UINT, 0}, \
+ {"m" , CONFIG_HLP_DLMCS_PHYTEST,0, uptr:&target_dl_mcs, defintval:0, TYPE_UINT, 0}, \
+ {"t" , CONFIG_HLP_ULMCS_PHYTEST,0, uptr:&target_ul_mcs, defintval:0, TYPE_UINT, 0}, \
+ {"M" , CONFIG_HLP_DLBW_PHYTEST,0, uptr:&target_dl_bw, defintval:0, TYPE_UINT, 0}, \
+ {"T" , CONFIG_HLP_ULBW_PHYTEST,0, uptr:&target_ul_bw, defintval:0, TYPE_UINT, 0}, \
+ {"D" , CONFIG_HLP_DLBM_PHYTEST,0, u64ptr:&dlsch_slot_bitmap, defintval:0, TYPE_UINT64, 0}, \
+ {"U" , CONFIG_HLP_ULBM_PHYTEST,0, u64ptr:&ulsch_slot_bitmap, defintval:0, TYPE_UINT64, 0}, \
{"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \
{"s" , CONFIG_HLP_SNR, 0, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0}, \
}
#include "threads_t.h"
extern threads_t threads;
+extern uint32_t target_dl_mcs;
+extern uint32_t target_ul_mcs;
+extern uint32_t target_dl_bw;
+extern uint32_t target_ul_bw;
+extern uint64_t dlsch_slot_bitmap;
+extern uint64_t ulsch_slot_bitmap;
// In nr-gnb.c
extern void init_gNB(int single_thread_flag,int wait_for_sync);
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 6df9e32e5f..21534734ad 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -93,6 +93,7 @@ unsigned short config_frames[4] = {2,9,11,13};
#endif
extern const char *duplex_mode[];
+THREAD_STRUCT thread_struct;
// Thread variables
pthread_cond_t nfapi_sync_cond;
@@ -150,7 +151,7 @@ int chain_offset = 0;
int card_offset = 0;
uint64_t num_missed_slots = 0; // counter for the number of missed slots
int transmission_mode = 1;
-int usrp_tx_thread = 0;
+int numerology = 0;
int oaisim_flag = 0;
int emulate_rf = 0;
uint32_t N_RB_DL=106;
diff --git a/executables/ocp-gnb.c b/executables/ocp-gnb.c
index a468861533..326f7d277f 100644
--- a/executables/ocp-gnb.c
+++ b/executables/ocp-gnb.c
@@ -61,8 +61,6 @@ uint32_t do_forms=0;
unsigned int mmapped_dma=0;
int8_t threequarter_fs=0;
-uint32_t target_dl_mcs = 28; //maximum allowed mcs
-uint32_t target_ul_mcs = 20;
int chain_offset=0;
uint16_t sl_ahead=6;
uint16_t sf_ahead=6;
@@ -70,16 +68,15 @@ uint32_t timing_advance = 0;
int transmission_mode=1;
int emulate_rf = 0;
int numerology = 0;
-int usrp_tx_thread = 0;
int config_sync_var=-1;
pthread_mutex_t nfapi_sync_mutex;
pthread_cond_t nfapi_sync_cond;
int nfapi_sync_var=-1;
-uint8_t nfapi_mode = NFAPI_MONOLITHIC; // Default to monolithic mode
double cpuf;
+THREAD_STRUCT thread_struct;
pthread_cond_t sync_cond;
pthread_mutex_t sync_mutex;
@@ -95,7 +92,8 @@ time_stats_t nfapi_meas; // total tx time
time_stats_t softmodem_stats_rx_sf; // total rx time
// not used but needed for link
openair0_config_t openair0_cfg[MAX_CARDS];
-
+uint16_t slot_ahead=6;
+msc_interface_t msc_interface;
AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB];
AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB];
int flexran_agent_start(mid_t mod_id) {
@@ -122,7 +120,6 @@ int restart_L1L2(module_id_t gnb_id) {
}
static int wait_for_sync = 0;
-static char *itti_dump_file = NULL;
static double snr_dB=20;
static int DEFBANDS[] = {7};
static int DEFENBS[] = {0};
diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c
index 72cf2e32c5..fa6b674765 100644
--- a/executables/softmodem-common.c
+++ b/executables/softmodem-common.c
@@ -45,6 +45,8 @@
static softmodem_params_t softmodem_params;
char *parallel_config=NULL;
char *worker_config=NULL;
+msc_interface_t msc_interface;
+int usrp_tx_thread = 0;
uint8_t nfapi_mode=0;
@@ -86,7 +88,7 @@ char *get_softmodem_function(uint64_t *sofmodemfunc_mask_ptr) {
void get_common_options(uint32_t execmask) {
uint32_t online_log_messages=0;
uint32_t glog_level=0 ;
- uint32_t start_telnetsrv = 0;
+ uint32_t start_telnetsrv = 0, start_telnetclt = 0;
uint32_t noS1 = 0, nokrnmod = 0, nonbiot = 0;
uint32_t rfsim = 0, basicsim = 0, do_forms = 0;
char *logmem_filename = NULL;
@@ -95,21 +97,26 @@ void get_common_options(uint32_t execmask) {
checkedparam_t cmdline_log_CheckParams[] = CMDLINE_LOGPARAMS_CHECK_DESC;
check_execmask(execmask);
config_get( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
- config_set_checkfunctions(cmdline_logparams, cmdline_log_CheckParams,
- sizeof(cmdline_logparams)/sizeof(paramdef_t));
- config_get( cmdline_logparams,sizeof(cmdline_logparams)/sizeof(paramdef_t),NULL);
-
- if(config_isparamset(cmdline_logparams,CMDLINE_ONLINELOG_IDX)) {
+
+ int numparams=sizeof(cmdline_logparams)/sizeof(paramdef_t);
+ config_set_checkfunctions(cmdline_logparams, cmdline_log_CheckParams,numparams);
+ config_get( cmdline_logparams,numparams,NULL);
+
+ if(config_isparamset(cmdline_logparams,config_paramidx_fromname(cmdline_logparams,numparams, CONFIG_FLOG_OPT))) {
set_glog_onlinelog(online_log_messages);
}
- if(config_isparamset(cmdline_logparams,CMDLINE_GLOGLEVEL_IDX)) {
+ if(config_isparamset(cmdline_logparams,config_paramidx_fromname(cmdline_logparams,numparams, CONFIG_LOGL_OPT))) {
set_glog(glog_level);
}
if (start_telnetsrv) {
load_module_shlib("telnetsrv",NULL,0,NULL);
}
+
+ if (start_telnetclt) {
+ set_softmodem_optmask(SOFTMODEM_TELNETCLT_BIT);
+ }
if (logmem_filename != NULL && strlen(logmem_filename) > 0) {
log_mem_filename = &logmem_filename[0];
diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h
index 1722df4bc8..43a91449ff 100644
--- a/executables/softmodem-common.h
+++ b/executables/softmodem-common.h
@@ -92,6 +92,7 @@ extern "C"
#define CONFIG_HLP_RFSIM "Run in rf simulator mode (also known as basic simulator)\n"
#define CONFIG_HLP_NOKRNMOD "(noS1 only): Use tun instead of namesh module \n"
#define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n"
+#define CONFIG_HLP_USRP_THREAD "having extra thead for usrp tx\n"
#define CONFIG_HLP_NFAPI "Change the nFAPI mode for NR\n"
/*-----------------------------------------------------------------------------------------------------------------------------------------------------*/
@@ -119,10 +120,11 @@ extern "C"
#define DEFAULT_RFCONFIG_FILE "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR40.dat";
+extern int usrp_tx_thread;
#define CMDLINE_PARAMS_DESC { \
{"rf-config-file", CONFIG_HLP_RFCFGF, 0, strptr:(char **)&RF_CONFIG_FILE, defstrval:NULL, TYPE_STRING, sizeof(RF_CONFIG_FILE)},\
- {"split73", CONFIG_HLP_SPLIT73, 0, strptr:(char **)&SPLIT73, defstrval:NULL, TYPE_STRING, sizeof(SPLIT73)},\
- {"thread-pool", CONFIG_HLP_TPOOL, 0, strptr:(char **)&TP_CONFIG, defstrval:"n", TYPE_STRING, sizeof(TP_CONFIG)}, \
+ {"split73", CONFIG_HLP_SPLIT73, 0, strptr:(char **)&SPLIT73, defstrval:NULL, TYPE_STRING, sizeof(SPLIT73)}, \
+ {"thread-pool", CONFIG_HLP_TPOOL, 0, strptr:(char **)&TP_CONFIG, defstrval:"n", TYPE_STRING, sizeof(TP_CONFIG)}, \
{"phy-test", CONFIG_HLP_PHYTST, PARAMFLAG_BOOL, iptr:&PHY_TEST, defintval:0, TYPE_INT, 0}, \
{"do-ra", CONFIG_HLP_DORA, PARAMFLAG_BOOL, iptr:&DO_RA, defintval:0, TYPE_INT, 0}, \
{"sa", CONFIG_HLP_SA, PARAMFLAG_BOOL, iptr:&SA, defintval:0, TYPE_INT, 0}, \
@@ -147,6 +149,7 @@ extern "C"
{"nokrnmod", CONFIG_HLP_NOKRNMOD, PARAMFLAG_BOOL, uptr:&nokrnmod, defintval:0, TYPE_INT, 0}, \
{"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \
{"use-256qam-table", CONFIG_HLP_256QAM, PARAMFLAG_BOOL, iptr:&USE_256QAM_TABLE, defintval:0, TYPE_INT, 0}, \
+ {"usrp-tx-thread-config",CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \
{"nfapi", CONFIG_HLP_NFAPI, 0, u8ptr:&nfapi_mode, defintval:0, TYPE_UINT8, 0}, \
}
@@ -156,23 +159,22 @@ extern "C"
#define CONFIG_HLP_LOGV "Set the global log verbosity \n"
#define CONFIG_HLP_TELN "Start embedded telnet server \n"
#define CONFIG_HLP_MSC "Enable the MSC tracing utility \n"
-/*----------------------------------------------------------------------------------------------------------------------------*/
-/* command line parameters for LOG utility */
-/* optname helpstr paramflags XXXptr defXXXval type numelt */
-/*----------------------------------------------------------------------------------------------------------------------------*/
+#define CONFIG_FLOG_OPT "R"
+#define CONFIG_LOGL_OPT "g"
+/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
+/* command line parameters for LOG utility */
+/* optname helpstr paramflags XXXptr defXXXval type numelt */
+/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
#define START_MSC softmodem_params.start_msc
#define CMDLINE_LOGPARAMS_DESC { \
- {"R" , CONFIG_HLP_FLOG, 0, uptr:&online_log_messages, defintval:1, TYPE_INT, 0}, \
- {"g" , CONFIG_HLP_LOGL, 0, uptr:&glog_level, defintval:0, TYPE_UINT, 0}, \
- {"telnetsrv", CONFIG_HLP_TELN, PARAMFLAG_BOOL, uptr:&start_telnetsrv, defintval:0, TYPE_UINT, 0}, \
- {"msc", CONFIG_HLP_MSC, PARAMFLAG_BOOL, uptr:&START_MSC, defintval:0, TYPE_UINT, 0}, \
- {"log-mem", NULL, 0, strptr:(char **)&logmem_filename, defstrval:NULL, TYPE_STRING, 0}, \
+ {CONFIG_FLOG_OPT , CONFIG_HLP_FLOG, 0, uptr:&online_log_messages, defintval:1, TYPE_INT, 0}, \
+ {CONFIG_LOGL_OPT , CONFIG_HLP_LOGL, 0, uptr:&glog_level, defintval:0, TYPE_UINT, 0}, \
+ {"telnetsrv", CONFIG_HLP_TELN, PARAMFLAG_BOOL, uptr:&start_telnetsrv, defintval:0, TYPE_UINT, 0}, \
+ {"msc", CONFIG_HLP_MSC, PARAMFLAG_BOOL, uptr:&START_MSC, defintval:0, TYPE_UINT, 0}, \
+ {"log-mem", NULL, 0, strptr:(char **)&logmem_filename, defstrval:NULL, TYPE_STRING, 0}, \
+ {"telnetclt", NULL, 0, uptr:&start_telnetclt, defstrval:NULL, TYPE_UINT, 0}, \
}
-#define CMDLINE_ONLINELOG_IDX 0
-#define CMDLINE_GLOGLEVEL_IDX 1
-#define CMDLINE_GLOGVERBO_IDX 2
-#define CMDLINE_STARTTELN_IDX 3
/* check function for global log level */
#define CMDLINE_LOGPARAMS_CHECK_DESC { \
@@ -181,6 +183,7 @@ extern "C"
{ .s5= {NULL} } , \
{ .s5= {NULL} } , \
{ .s5= {NULL} } , \
+ { .s5= {NULL} } , \
}
/***************************************************************************************************************************************/
@@ -193,6 +196,7 @@ extern "C"
#define SOFTMODEM_SIML1_BIT (1<<12)
#define SOFTMODEM_DOSCOPE_BIT (1<<15)
#define SOFTMODEM_RECPLAY_BIT (1<<16)
+#define SOFTMODEM_TELNETCLT_BIT (1<<17)
#define SOFTMODEM_ENB_BIT (1<<20)
#define SOFTMODEM_GNB_BIT (1<<21)
#define SOFTMODEM_4GUE_BIT (1<<22)
@@ -209,6 +213,7 @@ extern "C"
#define IS_SOFTMODEM_SIML1 ( get_softmodem_optmask() & SOFTMODEM_SIML1_BIT)
#define IS_SOFTMODEM_DOSCOPE ( get_softmodem_optmask() & SOFTMODEM_DOSCOPE_BIT)
#define IS_SOFTMODEM_IQPLAYER ( get_softmodem_optmask() & SOFTMODEM_RECPLAY_BIT)
+#define IS_SOFTMODEM_TELNETCLT_BIT ( get_softmodem_optmask() & SOFTMODEM_TELNETCLT_BIT)
#define IS_SOFTMODEM_ENB_BIT ( get_softmodem_optmask() & SOFTMODEM_ENB_BIT)
#define IS_SOFTMODEM_GNB_BIT ( get_softmodem_optmask() & SOFTMODEM_GNB_BIT)
#define IS_SOFTMODEM_4GUE_BIT ( get_softmodem_optmask() & SOFTMODEM_4GUE_BIT)
diff --git a/executables/thread-common.h b/executables/thread-common.h
index 6f3af3cfc0..0aaeb3c30e 100644
--- a/executables/thread-common.h
+++ b/executables/thread-common.h
@@ -3,7 +3,7 @@
#include "PHY/defs_common.h"
-THREAD_STRUCT thread_struct;
+extern THREAD_STRUCT thread_struct;
static inline void set_parallel_conf(char *parallel_conf) {
mapping config[]= {
diff --git a/nfapi/oai_integration/nfapi_pnf.c b/nfapi/oai_integration/nfapi_pnf.c
index 4ca02ed929..5ce66aad89 100644
--- a/nfapi/oai_integration/nfapi_pnf.c
+++ b/nfapi/oai_integration/nfapi_pnf.c
@@ -73,7 +73,6 @@ extern pthread_mutex_t nfapi_sync_mutex;
extern int nfapi_sync_var;
extern int sync_var;
-char uecap_xer_in;
extern void init_eNB_afterRU(void);
extern void init_UE_stub(int nb_inst,int,int);
@@ -2199,7 +2198,7 @@ void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_add
pnf.phys[0].udp.tx_port = vnf_p7_port;
strcpy(pnf.phys[0].udp.tx_addr, vnf_ip_addr);
strcpy(pnf.phys[0].local_addr, pnf_ip_addr);
- printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%d rx:%d]\n",
+ printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%u rx:%u]\n",
__FUNCTION__,config->vnf_ip_addr, config->vnf_p5_port,
pnf.phys[0].local_addr,
pnf.phys[0].udp.tx_addr, pnf.phys[0].udp.tx_port,
@@ -2250,7 +2249,7 @@ void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr,
pnf.phys[0].udp.tx_port = vnf_p7_port;
strcpy(pnf.phys[0].udp.tx_addr, vnf_ip_addr);
strcpy(pnf.phys[0].local_addr, pnf_ip_addr);
- printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%d rx:%d]\n",
+ printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%u rx:%u]\n",
__FUNCTION__,
config->vnf_ip_addr, config->vnf_p5_port,
pnf.phys[0].local_addr,
diff --git a/nfapi/oai_integration/nfapi_pnf.h b/nfapi/oai_integration/nfapi_pnf.h
index b3ab7cbdbc..61d4847eba 100644
--- a/nfapi/oai_integration/nfapi_pnf.h
+++ b/nfapi/oai_integration/nfapi_pnf.h
@@ -21,6 +21,7 @@
#if !defined(NFAPI_PNF_H__)
#define NFAPI_PNF_H__
+extern nfapi_ue_release_request_body_t release_rntis;
int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind);
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
diff --git a/nfapi/open-nFAPI/common/src/debug.c b/nfapi/open-nFAPI/common/src/debug.c
index a45d41d7d7..f53be43223 100644
--- a/nfapi/open-nFAPI/common/src/debug.c
+++ b/nfapi/open-nFAPI/common/src/debug.c
@@ -1,76 +1,76 @@
-/*
- * Copyright 2017 Cisco Systems, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-
-#define MAX_MSG_LENGTH 2096
-#define TRACE_HEADER_LENGTH 44
-
-void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...);
-
-// initialize the trace function to 0
-void (*nfapi_trace_g)(nfapi_trace_level_t level, const char* format, ...) = &nfapi_trace_dbg;
-
-nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_INFO;
-//nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_WARN;
-
-void nfapi_set_trace_level(nfapi_trace_level_t new_level)
-{
- nfapi_trace_level_g = new_level;
-}
-
-void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...)
-{
- char trace_buff[MAX_MSG_LENGTH + TRACE_HEADER_LENGTH];
- uint32_t num_chars;
- va_list p_args;
- struct timeval tv;
- pthread_t tid = pthread_self();
-
- (void)gettimeofday(&tv, NULL);
-
- num_chars = (uint32_t)snprintf(trace_buff, TRACE_HEADER_LENGTH, "%04u.%06u: 0x%02x: %10u: ", ((uint32_t)tv.tv_sec) & 0x1FFF, (uint32_t)tv.tv_usec, (uint32_t)level, (uint32_t)tid);
-
- if (num_chars > TRACE_HEADER_LENGTH)
- {
- printf("trace_dbg: Error, num_chars is too large: %d", num_chars);
- return;
- }
-
- va_start(p_args, format);
- if ((num_chars = (uint32_t)vsnprintf(&trace_buff[num_chars], MAX_MSG_LENGTH, format, p_args)))
- {
- if (level <= NFAPI_TRACE_WARN)
- {
- printf("%s", trace_buff);
- }
- printf("%s", trace_buff);
- }
- va_end(p_args);
-}
+/*
+ * Copyright 2017 Cisco Systems, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#define MAX_MSG_LENGTH 2096
+#define TRACE_HEADER_LENGTH 44
+
+void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...);
+
+// initialize the trace function to 0
+void (*nfapi_trace_g)(nfapi_trace_level_t level, const char* format, ...) = &nfapi_trace_dbg;
+
+nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_INFO;
+//nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_WARN;
+
+void nfapi_set_trace_level(nfapi_trace_level_t new_level)
+{
+ nfapi_trace_level_g = new_level;
+}
+
+void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...)
+{
+ char trace_buff[MAX_MSG_LENGTH + TRACE_HEADER_LENGTH];
+ uint32_t num_chars;
+ va_list p_args;
+ struct timeval tv;
+ pthread_t tid = pthread_self();
+
+ (void)gettimeofday(&tv, NULL);
+
+ num_chars = (uint32_t)snprintf(trace_buff, TRACE_HEADER_LENGTH, "%04u.%06u: 0x%02x: %10u: ", ((uint32_t)tv.tv_sec) & 0x1FFF, (uint32_t)tv.tv_usec, (uint32_t)level, (uint32_t)tid);
+
+ if (num_chars > TRACE_HEADER_LENGTH)
+ {
+ printf("trace_dbg: Error, num_chars is too large: %u", num_chars);
+ return;
+ }
+
+ va_start(p_args, format);
+ if ((num_chars = (uint32_t)vsnprintf(&trace_buff[num_chars], MAX_MSG_LENGTH, format, p_args)))
+ {
+ if (level <= NFAPI_TRACE_WARN)
+ {
+ printf("%s", trace_buff);
+ }
+ printf("%s", trace_buff);
+ }
+ va_end(p_args);
+}
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
index 444140509c..bcb0a94ca8 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
@@ -691,7 +691,7 @@ typedef struct
typedef struct
{
uint16_t pm_idx;//Index to precoding matrix (PM) pre-stored at cell configuration. Note: If precoding is not used this parameter should be set to 0. Value: 0->65535.
- nfapi_nr_dig_bf_interface_t dig_bf_interface_list[255];//max dig_bf_interfaces
+ nfapi_nr_dig_bf_interface_t dig_bf_interface_list[1];//max dig_bf_interfaces
}nfapi_nr_tx_precoding_and_beamforming_number_of_prgs_t;
@@ -702,7 +702,7 @@ typedef struct
uint16_t prg_size;//Size in RBs of a precoding resource block group (PRG) – to which same precoding and digital beamforming gets applied. Value: 1->275
//watchout: dig_bf_interfaces here, in table 3-53 it's dig_bf_interface
uint8_t dig_bf_interfaces;//Number of STD ant ports (parallel streams) feeding into the digBF Value: 0->255
- nfapi_nr_tx_precoding_and_beamforming_number_of_prgs_t prgs_list[275];//max prg_size
+ nfapi_nr_tx_precoding_and_beamforming_number_of_prgs_t prgs_list[1];//max prg_size
}nfapi_nr_tx_precoding_and_beamforming_t;
diff --git a/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp b/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp
index 1c2f0bef80..4fe5065cea 100644
--- a/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp
+++ b/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp
@@ -278,7 +278,7 @@ void *fapi_thread_start(void *ptr) {
if(instance->tick == 1000) {
if(instance->tx_byte_count > 0) {
- printf("[FAPI] Tx rate %d bytes/sec\n", instance->tx_byte_count);
+ printf("[FAPI] Tx rate %u bytes/sec\n", instance->tx_byte_count);
instance->tx_byte_count = 0;
}
@@ -319,7 +319,7 @@ void *fapi_thread_start(void *ptr) {
millisec = now_ts.tv_nsec / 1e6;
if(last_millisec != -1 && ((last_millisec + 1 ) % 1000) != millisec) {
- printf("*** missing millisec %d %d\n", last_millisec, millisec);
+ printf("*** missing millisec %u %u\n", last_millisec, millisec);
catchup = millisec - last_millisec - 1;
}
diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c
index 2a7b789650..fffd04ea3c 100644
--- a/openair1/PHY/CODING/3gpplte_sse.c
+++ b/openair1/PHY/CODING/3gpplte_sse.c
@@ -44,8 +44,6 @@
//#define DEBUG_TURBO_ENCODER 1
//#define CALLGRIND 1
-unsigned short threegpplte_interleaver_output;
-unsigned long long threegpplte_interleaver_tmp;
#if defined(__x86_64__) || defined(__i386__)
struct treillis {
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
index e1ca906b55..bc1c0dac56 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
@@ -798,11 +798,11 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
n is the size in bits of the coded block, with the tail */
int n2;
llr_t y8[3*(n+16)] __attribute__((aligned(16)));
- llr_t systematic0[n+16] __attribute__ ((aligned(16)));
- llr_t systematic1[n+16] __attribute__ ((aligned(16)));
- llr_t systematic2[n+16] __attribute__ ((aligned(16)));
- llr_t yparity1[n+16] __attribute__ ((aligned(16)));
- llr_t yparity2[n+16] __attribute__ ((aligned(16)));
+ llr_t systematic0[n+32] __attribute__ ((aligned(16)));
+ llr_t systematic1[n+32] __attribute__ ((aligned(16)));
+ llr_t systematic2[n+32] __attribute__ ((aligned(16)));
+ llr_t yparity1[n+32] __attribute__ ((aligned(16)));
+ llr_t yparity2[n+32] __attribute__ ((aligned(16)));
llr_t ext[n+128] __attribute__((aligned(16)));
llr_t ext2[n+128] __attribute__((aligned(16)));
llr_t alpha[(n+16)*8] __attribute__ ((aligned(16)));
@@ -811,7 +811,7 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
llr_t m10[n+16] __attribute__ ((aligned(16)));
// int *pi2_p,*pi4_p,*pi5_p,*pi6_p;
int *pi4_p,*pi5_p,*pi6_p;
- llr_t *s,*s1,*s2,*yp1,*yp2,*yp;
+ llr_t *s1,*s2,*yp1,*yp2,*yp;
unsigned int i,j,iind;//,pi;
unsigned char iteration_cnt=0;
unsigned int crc,oldcrc,crc_len;
@@ -927,7 +927,6 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
yp128 = (int8x16_t *)y8;
#endif
- s = systematic0;
s1 = systematic1;
s2 = systematic2;
yp1 = yparity1;
@@ -938,7 +937,7 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
for (i=0; i<16 ; i++ )
for (j=0; jn) {
/*
- s[n]=0;s[n+1]=0;s[n+2]=0;s[n+3]=0;
- s[n+4]=0;s[n+5]=0;s[n+6]=0;s[n+7]=0;
+ systematic0[n]=0;systematic0[n+1]=0;systematic0[n+2]=0;systematic0[n+3]=0;
+ systematic0[n+4]=0;s[n+5]=0;s[n+6]=0;s[n+7]=0;
s1[n]=0;s1[n+1]=0;s1[n+2]=0;s1[n+3]=0;
s1[n+4]=0;s1[n+5]=0;s1[n+6]=0;s1[n+7]=0;
s2[n]=0;s2[n+1]=0;s2[n+2]=0;s2[n+3]=0;
@@ -961,26 +960,26 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
// Termination
for (i=n2; i 1280, 2401 -> 2560\n");
printf("block length %d: \n", block_length);
@@ -704,25 +702,25 @@ int main(int argc, char *argv[])
printf("SNR %f, Std iterations: %f\n",SNR, dec_iter->n_iter_std);
printf("SNR %f, Max iterations: %d\n",SNR, dec_iter->n_iter_max);
printf("\n");
- printf("Encoding time mean: %15.3f us\n",(double)time_optim->diff/time_optim->trials/1000.0/cpu_freq_GHz);
- printf("Encoding time std: %15.3f us\n",sqrt((double)time_optim->diff_square/time_optim->trials/pow(1000,2)/pow(cpu_freq_GHz,2)-pow((double)time_optim->diff/time_optim->trials/1000.0/cpu_freq_GHz,2)));
- printf("Encoding time max: %15.3f us\n",(double)time_optim->max/1000.0/cpu_freq_GHz);
+ printf("Encoding time mean: %15.3f us\n",(double)time_optim->diff/time_optim->trials/1000.0/get_cpu_freq_GHz());
+ printf("Encoding time std: %15.3f us\n",sqrt((double)time_optim->diff_square/time_optim->trials/pow(1000,2)/pow(get_cpu_freq_GHz(),2)-pow((double)time_optim->diff/time_optim->trials/1000.0/get_cpu_freq_GHz(),2)));
+ printf("Encoding time max: %15.3f us\n",(double)time_optim->max/1000.0/get_cpu_freq_GHz());
printf("\n");
- printf("Decoding time mean: %15.3f us\n",(double)time_decoder->diff/time_decoder->trials/1000.0/cpu_freq_GHz);
- printf("Decoding time std: %15.3f us\n",sqrt((double)time_decoder->diff_square/time_decoder->trials/pow(1000,2)/pow(cpu_freq_GHz,2)-pow((double)time_decoder->diff/time_decoder->trials/1000.0/cpu_freq_GHz,2)));
- printf("Decoding time max: %15.3f us\n",(double)time_decoder->max/1000.0/cpu_freq_GHz);
+ printf("Decoding time mean: %15.3f us\n",(double)time_decoder->diff/time_decoder->trials/1000.0/get_cpu_freq_GHz());
+ printf("Decoding time std: %15.3f us\n",sqrt((double)time_decoder->diff_square/time_decoder->trials/pow(1000,2)/pow(get_cpu_freq_GHz(),2)-pow((double)time_decoder->diff/time_decoder->trials/1000.0/get_cpu_freq_GHz(),2)));
+ printf("Decoding time max: %15.3f us\n",(double)time_decoder->max/1000.0/get_cpu_freq_GHz());
fprintf(fd,"%f %f %f %f %f %f %f %f %f %f %f %f %d \n",
SNR,
(double)decoded_errors[i]/(double)n_trials ,
(double)errors_bit/(double)n_trials/(double)block_length/(double)n_segments ,
errors_bit_uncoded/(double)n_trials/(double)n_segments ,
- (double)time_optim->diff/time_optim->trials/1000.0/cpu_freq_GHz,
- sqrt((double)time_optim->diff_square/time_optim->trials/pow(1000,2)/pow(cpu_freq_GHz,2)-pow((double)time_optim->diff/time_optim->trials/1000.0/cpu_freq_GHz,2)),
- (double)time_optim->max/1000.0/cpu_freq_GHz,
- (double)time_decoder->diff/time_decoder->trials/1000.0/cpu_freq_GHz,
- sqrt((double)time_decoder->diff_square/time_decoder->trials/pow(1000,2)/pow(cpu_freq_GHz,2)-pow((double)time_decoder->diff/time_decoder->trials/1000.0/cpu_freq_GHz,2)),
- (double)time_decoder->max/1000.0/cpu_freq_GHz,
+ (double)time_optim->diff/time_optim->trials/1000.0/get_cpu_freq_GHz(),
+ sqrt((double)time_optim->diff_square/time_optim->trials/pow(1000,2)/pow(get_cpu_freq_GHz(),2)-pow((double)time_optim->diff/time_optim->trials/1000.0/get_cpu_freq_GHz(),2)),
+ (double)time_optim->max/1000.0/get_cpu_freq_GHz(),
+ (double)time_decoder->diff/time_decoder->trials/1000.0/get_cpu_freq_GHz(),
+ sqrt((double)time_decoder->diff_square/time_decoder->trials/pow(1000,2)/pow(get_cpu_freq_GHz(),2)-pow((double)time_decoder->diff/time_decoder->trials/1000.0/get_cpu_freq_GHz(),2)),
+ (double)time_decoder->max/1000.0/get_cpu_freq_GHz(),
dec_iter->n_iter_mean,
dec_iter->n_iter_std,
dec_iter->n_iter_max
diff --git a/openair1/PHY/CODING/TESTBENCH/polartest.c b/openair1/PHY/CODING/TESTBENCH/polartest.c
index d9adf3e24f..e43ba507ab 100644
--- a/openair1/PHY/CODING/TESTBENCH/polartest.c
+++ b/openair1/PHY/CODING/TESTBENCH/polartest.c
@@ -113,7 +113,6 @@ int main(int argc, char *argv[])
//Initiate timing. (Results depend on CPU Frequency. Therefore, might change due to performance variances during simulation.)
time_stats_t timeEncoder,timeDecoder;
opp_enabled=1;
- cpu_freq_GHz = get_cpu_freq_GHz();
reset_meas(&timeEncoder);
reset_meas(&timeDecoder);
randominit(0);
@@ -324,9 +323,9 @@ if (logFlag){
#endif
//Iteration times are in microseconds.
- timeEncoderCumulative+=(timeEncoder.diff/(cpu_freq_GHz*1000.0));
- timeDecoderCumulative+=(timeDecoder.diff/(cpu_freq_GHz*1000.0));
- if (logFlag) fprintf(logFile,",%f,%d,%u,%f,%f\n", SNR, nBitError, blockErrorState, (timeEncoder.diff/(cpu_freq_GHz*1000.0)), (timeDecoder.diff/(cpu_freq_GHz*1000.0)));
+ timeEncoderCumulative+=(timeEncoder.diff/(get_cpu_freq_GHz()*1000.0));
+ timeDecoderCumulative+=(timeDecoder.diff/(get_cpu_freq_GHz()*1000.0));
+ if (logFlag) fprintf(logFile,",%f,%d,%u,%f,%f\n", SNR, nBitError, blockErrorState, (timeEncoder.diff/(get_cpu_freq_GHz()*1000.0)), (timeDecoder.diff/(get_cpu_freq_GHz()*1000.0)));
if (nBitError<0) {
blockErrorCumulative++;
@@ -348,7 +347,7 @@ if (logFlag){
printf("[ListSize=%d] SNR=%+8.3f, BLER=%9.6f, BER=%12.9f, t_Encoder=%9.3fus, t_Decoder=%9.3fus\n",
decoderListSize, SNR, ((double)blockErrorCumulative/iterations),
((double)bitErrorCumulative / (iterations*testLength)),
- (double)timeEncoder.diff/timeEncoder.trials/(cpu_freq_GHz*1000.0),(double)timeDecoder.diff/timeDecoder.trials/(cpu_freq_GHz*1000.0));
+ (double)timeEncoder.diff/timeEncoder.trials/(get_cpu_freq_GHz()*1000.0),(double)timeDecoder.diff/timeDecoder.trials/(get_cpu_freq_GHz()*1000.0));
//(timeEncoderCumulative/iterations),timeDecoderCumulative/iterations);
if (blockErrorCumulative==0 && bitErrorCumulative==0) break;
diff --git a/openair1/PHY/CODING/TESTBENCH/smallblocktest.c b/openair1/PHY/CODING/TESTBENCH/smallblocktest.c
index 02d5dc64e0..f750d24977 100644
--- a/openair1/PHY/CODING/TESTBENCH/smallblocktest.c
+++ b/openair1/PHY/CODING/TESTBENCH/smallblocktest.c
@@ -13,7 +13,6 @@ int main(int argc, char *argv[])
{
time_stats_t timeEncoder,timeDecoder;
opp_enabled=1;
- cpu_freq_GHz = get_cpu_freq_GHz();
reset_meas(&timeEncoder);
reset_meas(&timeDecoder);
randominit(0);
@@ -141,8 +140,8 @@ int main(int argc, char *argv[])
SNR,
((double)bitErrorCumulative / (iterations*messageLength)),
((double)blockErrorCumulative/iterations),
- ((double)timeEncoder.diff/timeEncoder.trials)/(cpu_freq_GHz),
- ((double)timeDecoder.diff/timeDecoder.trials)/(cpu_freq_GHz*1000.0));
+ ((double)timeEncoder.diff/timeEncoder.trials)/(get_cpu_freq_GHz()),
+ ((double)timeDecoder.diff/timeDecoder.trials)/(get_cpu_freq_GHz()*1000.0));
blockErrorCumulative=0;
bitErrorCumulative=0;
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
index 785b588b9f..3226c97f87 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
@@ -39,7 +39,7 @@
#include "nrLDPC_bnProc.h"
#define NR_LDPC_ENABLE_PARITY_CHECK
-#define NR_LDPC_PROFILER_DETAIL
+//#define NR_LDPC_PROFILER_DETAIL
#ifdef NR_LDPC_DEBUG_MODE
#include "nrLDPC_tools/nrLDPC_debug.h"
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c
index 0d765a18b3..57b4c28661 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c
@@ -37,266 +37,82 @@
// Note: this is for prototype of generate_drs_pusch (OTA synchronization of RRUs)
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
-int* sync_corr_ue0 = NULL;
-int* sync_corr_ue1 = NULL;
-int* sync_corr_ue2 = NULL;
-int sync_tmp[2048*4] __attribute__((aligned(32)));
-short syncF_tmp[2048*2] __attribute__((aligned(32)));
+static struct complex16 *primary_synch0_time __attribute__((aligned(32)));
+static struct complex16 *primary_synch1_time __attribute__((aligned(32)));
+static struct complex16 *primary_synch2_time __attribute__((aligned(32)));
+static void doIdft(int size, short *in, short *out) {
+ switch (size) {
+ case 6:
+ idft(IDFT_128,in,out,1);
+ break;
-int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *common_vars
-{
- int i,k;
+ case 25:
+ idft(IDFT_512,in,out,1);
+ break;
- sync_corr_ue0 = (int *)malloc16(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int)*frame_parms->samples_per_tti);
- sync_corr_ue1 = (int *)malloc16(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int)*frame_parms->samples_per_tti);
- sync_corr_ue2 = (int *)malloc16(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int)*frame_parms->samples_per_tti);
+ case 50:
+ idft(IDFT_1024,in,out,1);
+ break;
+
+ case 75:
+ idft(IDFT_1536,in,out,1);
+ break;
- if (sync_corr_ue0) {
-#ifdef DEBUG_PHY
- LOG_D(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue allocated at %p\n", sync_corr_ue0);
-#endif
- //common_vars->sync_corr = sync_corr;
- } else {
- LOG_E(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue0 not allocated\n");
- return(-1);
+ case 100:
+ idft(IDFT_2048,in,out,1);
+ break;
+
+ default:
+ LOG_E(PHY,"Unsupported N_RB_DL %d\n",size);
+ abort();
+ break;
+ }
}
- if (sync_corr_ue1) {
-#ifdef DEBUG_PHY
- LOG_D(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue allocated at %p\n", sync_corr_ue1);
-#endif
- //common_vars->sync_corr = sync_corr;
- } else {
- LOG_E(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue1 not allocated\n");
- return(-1);
+static void copyPrimary( struct complex16 *out, struct complex16 *in, int ofdmSize) {
+ int k=ofdmSize-36;
+
+ for (int i=0; i<72; i++) {
+ out[k].r = in[i].r>>1; //we need to shift input to avoid overflow in fft
+ out[k].i = in[i].i>>1;
+ k++;
+
+ if (k >= ofdmSize) {
+ k++; // skip DC carrier
+ k-=ofdmSize;
+ }
+ }
}
- if (sync_corr_ue2) {
-#ifdef DEBUG_PHY
- LOG_D(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue allocated at %p\n", sync_corr_ue2);
-#endif
- //common_vars->sync_corr = sync_corr;
- } else {
- LOG_E(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue2 not allocated\n");
- return(-1);
- }
-
- // primary_synch0_time = (int *)malloc16((frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int));
- primary_synch0_time = (int16_t *)malloc16((frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2);
-
- if (primary_synch0_time) {
- // bzero(primary_synch0_time,(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int));
- bzero(primary_synch0_time,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2);
-#ifdef DEBUG_PHY
- LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch0_time allocated at %p\n", primary_synch0_time);
-#endif
- } else {
- LOG_E(PHY,"[openair][LTE_PHY][SYNC] primary_synch0_time not allocated\n");
- return(-1);
- }
-
- // primary_synch1_time = (int *)malloc16((frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int));
- primary_synch1_time = (int16_t *)malloc16((frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2);
-
- if (primary_synch1_time) {
- // bzero(primary_synch1_time,(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int));
- bzero(primary_synch1_time,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2);
-#ifdef DEBUG_PHY
- LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch1_time allocated at %p\n", primary_synch1_time);
-#endif
- } else {
- LOG_E(PHY,"[openair][LTE_PHY][SYNC] primary_synch1_time not allocated\n");
- return(-1);
- }
-
- // primary_synch2_time = (int *)malloc16((frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int));
- primary_synch2_time = (int16_t *)malloc16((frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2);
-
- if (primary_synch2_time) {
- // bzero(primary_synch2_time,(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int));
- bzero(primary_synch2_time,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2);
-#ifdef DEBUG_PHY
- LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch2_time allocated at %p\n", primary_synch2_time);
-#endif
- } else {
- LOG_E(PHY,"[openair][LTE_PHY][SYNC] primary_synch2_time not allocated\n");
- return(-1);
- }
-
-
+int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) { // LTE_UE_COMMON *common_vars
+ struct complex16 syncF_tmp[2048]__attribute__((aligned(32)))= {{0}};
+ int sz=frame_parms->ofdm_symbol_size*sizeof(*primary_synch0_time);
+ AssertFatal( NULL != (primary_synch0_time = (struct complex16 *)malloc16(sz)),"");
+ bzero(primary_synch0_time,sz);
+ AssertFatal( NULL != (primary_synch1_time = (struct complex16 *)malloc16(sz)),"");
+ bzero(primary_synch1_time,sz);
+ AssertFatal( NULL != (primary_synch2_time = (struct complex16 *)malloc16(sz)),"");
+ bzero(primary_synch2_time,sz);
// generate oversampled sync_time sequences
- k=frame_parms->ofdm_symbol_size-36;
-
- for (i=0; i<72; i++) {
- syncF_tmp[2*k] = primary_synch0[2*i]>>2; //we need to shift input to avoid overflow in fft
- syncF_tmp[2*k+1] = primary_synch0[2*i+1]>>2;
- k++;
-
- if (k >= frame_parms->ofdm_symbol_size) {
- k++; // skip DC carrier
- k-=frame_parms->ofdm_symbol_size;
- }
- }
-
- switch (frame_parms->N_RB_DL) {
- case 6:
- idft(IDFT_128,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
- case 25:
- idft(IDFT_512,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
- case 50:
- idft(IDFT_1024,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
-
- case 75:
- idft(IDFT_1536,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp,
- 1); /// complex output
- break;
- case 100:
- idft(IDFT_2048,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
- default:
- LOG_E(PHY,"Unsupported N_RB_DL %d\n",frame_parms->N_RB_DL);
- break;
- }
-
- for (i=0; iofdm_symbol_size; i++)
- ((int32_t*)primary_synch0_time)[i] = sync_tmp[i];
-
- k=frame_parms->ofdm_symbol_size-36;
-
- for (i=0; i<72; i++) {
- syncF_tmp[2*k] = primary_synch1[2*i]>>2; //we need to shift input to avoid overflow in fft
- syncF_tmp[2*k+1] = primary_synch1[2*i+1]>>2;
- k++;
-
- if (k >= frame_parms->ofdm_symbol_size) {
- k++; // skip DC carrier
- k-=frame_parms->ofdm_symbol_size;
- }
- }
-
- switch (frame_parms->N_RB_DL) {
- case 6:
- idft(IDFT_128,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
- case 25:
- idft(IDFT_512,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
- case 50:
- idft(IDFT_1024,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
-
- case 75:
- idft(IDFT_1536,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
- case 100:
- idft(IDFT_2048,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
- default:
- LOG_E(PHY,"Unsupported N_RB_DL %d\n",frame_parms->N_RB_DL);
- break;
- }
-
- for (i=0; iofdm_symbol_size; i++)
- ((int32_t*)primary_synch1_time)[i] = sync_tmp[i];
-
- k=frame_parms->ofdm_symbol_size-36;
-
- for (i=0; i<72; i++) {
- syncF_tmp[2*k] = primary_synch2[2*i]>>2; //we need to shift input to avoid overflow in fft
- syncF_tmp[2*k+1] = primary_synch2[2*i+1]>>2;
- k++;
-
- if (k >= frame_parms->ofdm_symbol_size) {
- k++; // skip DC carrier
- k-=frame_parms->ofdm_symbol_size;
- }
- }
-
- switch (frame_parms->N_RB_DL) {
- case 6:
- idft(IDFT_128,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
- case 25:
- idft(IDFT_512,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
- case 50:
- idft(IDFT_1024,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
-
- case 75:
- idft(IDFT_1536,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
- case 100:
- idft(IDFT_2048,(short*)syncF_tmp, /// complex input
- (short*)sync_tmp, /// complex output
- 1);
- break;
- default:
- LOG_E(PHY,"Unsupported N_RB_DL %d\n",frame_parms->N_RB_DL);
- break;
- }
-
- for (i=0; iofdm_symbol_size; i++)
- ((int32_t*)primary_synch2_time)[i] = sync_tmp[i];
-
+ copyPrimary( syncF_tmp, (struct complex16 *) primary_synch0, frame_parms->ofdm_symbol_size);
+ doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch0_time);
+ copyPrimary( syncF_tmp, (struct complex16 *) primary_synch1, frame_parms->ofdm_symbol_size);
+ doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch1_time);
+ copyPrimary( syncF_tmp, (struct complex16 *) primary_synch2, frame_parms->ofdm_symbol_size);
+ doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch2_time);
if ( LOG_DUMPFLAG(DEBUG_LTEESTIM)){
LOG_M("primary_sync0.m","psync0",primary_synch0_time,frame_parms->ofdm_symbol_size,1,1);
LOG_M("primary_sync1.m","psync1",primary_synch1_time,frame_parms->ofdm_symbol_size,1,1);
LOG_M("primary_sync2.m","psync2",primary_synch2_time,frame_parms->ofdm_symbol_size,1,1);
}
+
return (1);
}
-void lte_sync_time_free(void)
-{
- if (sync_corr_ue0) {
- LOG_D(PHY,"Freeing sync_corr_ue (%p)...\n",sync_corr_ue0);
- free(sync_corr_ue0);
- }
-
- if (sync_corr_ue1) {
- LOG_D(PHY,"Freeing sync_corr_ue (%p)...\n",sync_corr_ue1);
- free(sync_corr_ue1);
- }
-
- if (sync_corr_ue2) {
- LOG_D(PHY,"Freeing sync_corr_ue (%p)...\n",sync_corr_ue2);
- free(sync_corr_ue2);
- }
-
+void lte_sync_time_free(void) {
if (primary_synch0_time) {
LOG_D(PHY,"Freeing primary_sync0_time ...\n");
free(primary_synch0_time);
@@ -312,126 +128,81 @@ void lte_sync_time_free(void)
free(primary_synch2_time);
}
- sync_corr_ue0 = NULL;
- sync_corr_ue1 = NULL;
- sync_corr_ue2 = NULL;
primary_synch0_time = NULL;
primary_synch1_time = NULL;
primary_synch2_time = NULL;
}
-static inline int abs32(int x)
-{
+static inline int abs32(int x) {
return (((int)((short*)&x)[0])*((int)((short*)&x)[0]) + ((int)((short*)&x)[1])*((int)((short*)&x)[1]));
}
+static inline double absF(struct complexd x) {
+ return x.r*x.r+x.i*x.i;
+}
+
+#define complexNull(c) bzero((void*) &(c), sizeof(c))
#define SHIFT 17
int lte_sync_time(int **rxdata, ///rx data in time domain
LTE_DL_FRAME_PARMS *frame_parms,
- int *eNB_id)
-{
+ int *eNB_id) {
// perform a time domain correlation using the oversampled sync sequence
-
unsigned int n, ar, s, peak_pos, peak_val, sync_source;
int result,result2;
- int sync_out[3] = {0,0,0},sync_out2[3] = {0,0,0};
- int tmp[3] = {0,0,0};
+ struct complexd sync_out[3]= {{0}}, sync_out2[3]= {{0}};
int length = LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti>>1;
-
- //LOG_D(PHY,"[SYNC TIME] Calling sync_time.\n");
- AssertFatal(sync_corr_ue0 != NULL,
- "sync_corr_ue0 not yet allocated! Exiting.\n");
- AssertFatal(sync_corr_ue1 != NULL,
- "sync_corr_ue0 not yet allocated! Exiting.\n");
- AssertFatal(sync_corr_ue2 != NULL,
- "sync_corr_ue0 not yet allocated! Exiting.\n");
-
peak_val = 0;
peak_pos = 0;
sync_source = 0;
-
for (n=0; nofdm_symbol_size-frame_parms->nb_prefix_samples)) {
if (n<(length-frame_parms->ofdm_symbol_size)) {
-
//calculate dot product of primary_synch0_time and rxdata[ar][n] (ar=0..nb_ant_rx) and store the sum in temp[n];
for (ar=0; arnb_antennas_rx; ar++) {
-
- result = dot_product((short*)primary_synch0_time, (short*) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT);
- result2 = dot_product((short*)primary_synch0_time, (short*) &(rxdata[ar][n+length]), frame_parms->ofdm_symbol_size, SHIFT);
-
- ((short*)sync_corr_ue0)[2*n] += ((short*) &result)[0];
- ((short*)sync_corr_ue0)[2*n+1] += ((short*) &result)[1];
- ((short*)sync_corr_ue0)[2*(length+n)] += ((short*) &result2)[0];
- ((short*)sync_corr_ue0)[(2*(length+n))+1] += ((short*) &result2)[1];
- ((short*)sync_out)[0] += ((short*) &result)[0];
- ((short*)sync_out)[1] += ((short*) &result)[1];
- ((short*)sync_out2)[0] += ((short*) &result2)[0];
- ((short*)sync_out2)[1] += ((short*) &result2)[1];
+ result = dot_product((short *)primary_synch0_time, (short *) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT);
+ result2 = dot_product((short *)primary_synch0_time, (short *) &(rxdata[ar][n+length]), frame_parms->ofdm_symbol_size, SHIFT);
+ sync_out[0].r += ((short *) &result)[0];
+ sync_out[0].i += ((short *) &result)[1];
+ sync_out2[0].r += ((short *) &result2)[0];
+ sync_out2[0].i += ((short *) &result2)[1];
}
for (ar=0; arnb_antennas_rx; ar++) {
- result = dot_product((short*)primary_synch1_time, (short*) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT);
- result2 = dot_product((short*)primary_synch1_time, (short*) &(rxdata[ar][n+length]), frame_parms->ofdm_symbol_size, SHIFT);
- ((short*)sync_corr_ue1)[2*n] += ((short*) &result)[0];
- ((short*)sync_corr_ue1)[2*n+1] += ((short*) &result)[1];
- ((short*)sync_corr_ue1)[2*(length+n)] += ((short*) &result2)[0];
- ((short*)sync_corr_ue1)[(2*(length+n))+1] += ((short*) &result2)[1];
-
- ((short*)sync_out)[2] += ((short*) &result)[0];
- ((short*)sync_out)[3] += ((short*) &result)[1];
- ((short*)sync_out2)[2] += ((short*) &result2)[0];
- ((short*)sync_out2)[3] += ((short*) &result2)[1];
+ result = dot_product((short *)primary_synch1_time, (short *) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT);
+ result2 = dot_product((short *)primary_synch1_time, (short *) &(rxdata[ar][n+length]), frame_parms->ofdm_symbol_size, SHIFT);
+ sync_out[1].r += ((short *) &result)[0];
+ sync_out[1].i += ((short *) &result)[1];
+ sync_out2[1].r += ((short *) &result2)[0];
+ sync_out2[1].i += ((short *) &result2)[1];
}
for (ar=0; arnb_antennas_rx; ar++) {
-
- result = dot_product((short*)primary_synch2_time, (short*) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT);
- result2 = dot_product((short*)primary_synch2_time, (short*) &(rxdata[ar][n+length]), frame_parms->ofdm_symbol_size, SHIFT);
- ((short*)sync_corr_ue2)[2*n] += ((short*) &result)[0];
- ((short*)sync_corr_ue2)[2*n+1] += ((short*) &result)[1];
- ((short*)sync_corr_ue2)[2*(length+n)] += ((short*) &result2)[0];
- ((short*)sync_corr_ue2)[(2*(length+n))+1] += ((short*) &result2)[1];
- ((short*)sync_out)[4] += ((short*) &result)[0];
- ((short*)sync_out)[5] += ((short*) &result)[1];
- ((short*)sync_out2)[4] += ((short*) &result2)[0];
- ((short*)sync_out2)[5] += ((short*) &result2)[1];
+ result = dot_product((short *)primary_synch2_time, (short *) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT);
+ result2 = dot_product((short *)primary_synch2_time, (short *) &(rxdata[ar][n+length]), frame_parms->ofdm_symbol_size, SHIFT);
+ sync_out[2].r += ((short *) &result)[0];
+ sync_out[2].i += ((short *) &result)[1];
+ sync_out2[2].r += ((short *) &result2)[0];
+ sync_out2[2].i += ((short *) &result2)[1];
}
-
}
// calculate the absolute value of sync_corr[n]
- sync_corr_ue0[n] = abs32(sync_corr_ue0[n]);
- sync_corr_ue0[n+length] = abs32(sync_corr_ue0[n+length]);
- sync_corr_ue1[n] = abs32(sync_corr_ue1[n]);
- sync_corr_ue1[n+length] = abs32(sync_corr_ue1[n+length]);
- sync_corr_ue2[n] = abs32(sync_corr_ue2[n]);
- sync_corr_ue2[n+length] = abs32(sync_corr_ue2[n+length]);
-
for (s=0; s<3; s++) {
- tmp[s] = (abs32(sync_out[s])>>1) + (abs32(sync_out2[s])>>1);
+ double tmp = absF(sync_out[s]) + absF(sync_out2[s]);
- if (tmp[s]>peak_val) {
- peak_val = tmp[s];
+ if (tmp>peak_val) {
+ peak_val = tmp;
peak_pos = n;
sync_source = s;
/*
@@ -443,42 +214,22 @@ int lte_sync_time(int **rxdata, ///rx data in time domain
}
*eNB_id = sync_source;
-
- LOG_I(PHY,"[UE] lte_sync_time: Sync source = %d, Peak found at pos %d, val = %d (%d dB)\n",sync_source,peak_pos,peak_val,dB_fixed(peak_val)/2);
-
-
- if ( LOG_DUMPFLAG(DEBUG_LTEESTIM)){
- static int debug_cnt;
- if (debug_cnt == 0) {
- LOG_M("sync_corr0_ue.m","synccorr0",sync_corr_ue0,2*length,1,2);
- LOG_M("sync_corr1_ue.m","synccorr1",sync_corr_ue1,2*length,1,2);
- LOG_M("sync_corr2_ue.m","synccorr2",sync_corr_ue2,2*length,1,2);
- LOG_M("rxdata0.m","rxd0",rxdata[0],length<<1,1,1);
- // exit(-1);
- } else {
- debug_cnt++;
- }
-}
+ LOG_I(PHY,"[UE] lte_sync_time: Sync source = %d, Peak found at pos %d, val = %d (%d dB)\n",sync_source,peak_pos,peak_val/2,dB_fixed(peak_val/2)/2);
return(peak_pos);
}
-int ru_sync_time_init(RU_t *ru) // LTE_UE_COMMON *common_vars
-{
+int ru_sync_time_init(RU_t *ru) { // LTE_UE_COMMON *common_vars
/*
int16_t dmrs[2048];
int16_t *dmrsp[2] = {dmrs,NULL};
*/
-
int32_t dmrs[ru->frame_parms->ofdm_symbol_size*14] __attribute__((aligned(32)));
//int32_t *dmrsp[2] = {&dmrs[(3-ru->frame_parms->Ncp)*ru->frame_parms->ofdm_symbol_size],NULL};
int32_t *dmrsp[2] = {&dmrs[0],NULL};
-
generate_ul_ref_sigs();
-
- ru->dmrssync = (int16_t*)malloc16_clear(ru->frame_parms->ofdm_symbol_size*2*sizeof(int16_t));
- ru->dmrs_corr = (uint64_t*)malloc16_clear(ru->frame_parms->samples_per_tti*10*sizeof(uint64_t));
-
+ ru->dmrssync = (int16_t *)malloc16_clear(ru->frame_parms->ofdm_symbol_size*2*sizeof(int16_t));
+ ru->dmrs_corr = (uint64_t *)malloc16_clear(ru->frame_parms->samples_per_tti*10*sizeof(uint64_t));
generate_drs_pusch(NULL,
NULL,
ru->frame_parms,
@@ -491,35 +242,39 @@ int ru_sync_time_init(RU_t *ru) // LTE_UE_COMMON *common_vars
0);
switch (ru->frame_parms->N_RB_DL) {
- case 6:
- idft(IDFT_128,(int16_t*)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]),
- ru->dmrssync, /// complex output
- 1);
- break;
- case 25:
- idft(IDFT_512,(int16_t*)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]),
- ru->dmrssync, /// complex output
- 1);
- break;
- case 50:
- idft(IDFT_1024,(int16_t*)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]),
- ru->dmrssync, /// complex output
- 1);
- break;
-
- case 75:
- idft(IDFT_1536,(int16_t*)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]),
- ru->dmrssync,
- 1); /// complex output
- break;
- case 100:
- idft(IDFT_2048,(int16_t*)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]),
- ru->dmrssync, /// complex output
- 1);
- break;
- default:
- AssertFatal(1==0,"Unsupported N_RB_DL %d\n",ru->frame_parms->N_RB_DL);
- break;
+ case 6:
+ idft(IDFT_128,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]),
+ ru->dmrssync, /// complex output
+ 1);
+ break;
+
+ case 25:
+ idft(IDFT_512,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]),
+ ru->dmrssync, /// complex output
+ 1);
+ break;
+
+ case 50:
+ idft(IDFT_1024,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]),
+ ru->dmrssync, /// complex output
+ 1);
+ break;
+
+ case 75:
+ idft(IDFT_1536,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]),
+ ru->dmrssync,
+ 1); /// complex output
+ break;
+
+ case 100:
+ idft(IDFT_2048,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]),
+ ru->dmrssync, /// complex output
+ 1);
+ break;
+
+ default:
+ AssertFatal(1==0,"Unsupported N_RB_DL %d\n",ru->frame_parms->N_RB_DL);
+ break;
}
return(0);
@@ -527,10 +282,11 @@ int ru_sync_time_init(RU_t *ru) // LTE_UE_COMMON *common_vars
void ru_sync_time_free(RU_t *ru) {
-
AssertFatal(ru->dmrssync!=NULL,"ru->dmrssync is NULL\n");
free(ru->dmrssync);
- if (ru->dmrs_corr) free(ru->dmrs_corr);
+
+ if (ru->dmrs_corr)
+ free(ru->dmrs_corr);
}
//#define DEBUG_PHY
@@ -539,10 +295,8 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
LTE_DL_FRAME_PARMS *frame_parms,
uint32_t length,
uint32_t *peak_val_out,
- uint32_t *sync_corr_eNB)
-{
+ uint32_t *sync_corr_eNB) {
// perform a time domain correlation using the oversampled sync sequence
-
unsigned int n, ar, peak_val, peak_pos;
uint64_t mean_val;
int result;
@@ -556,21 +310,21 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
}
switch (eNB_id) {
- case 0:
- primary_synch_time = (short*)primary_synch0_time;
- break;
+ case 0:
+ primary_synch_time = (short *)primary_synch0_time;
+ break;
- case 1:
- primary_synch_time = (short*)primary_synch1_time;
- break;
+ case 1:
+ primary_synch_time = (short *)primary_synch1_time;
+ break;
- case 2:
- primary_synch_time = (short*)primary_synch2_time;
- break;
+ case 2:
+ primary_synch_time = (short *)primary_synch2_time;
+ break;
- default:
- LOG_E(PHY,"[SYNC TIME] Illegal eNB_id!\n");
- return (-1);
+ default:
+ LOG_E(PHY,"[SYNC TIME] Illegal eNB_id!\n");
+ return (-1);
}
peak_val = 0;
@@ -578,21 +332,16 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
mean_val = 0;
for (n=0; nofdm_symbol_size-frame_parms->nb_prefix_samples)) {
-
//calculate dot product of primary_synch0_time and rxdata[ar][n] (ar=0..nb_ant_rx) and store the sum in temp[n];
for (ar=0; arnb_antennas_rx; ar++) {
-
- result = dot_product((short*)primary_synch_time, (short*) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT);
+ result = dot_product((short *)primary_synch_time, (short *) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT);
//((short*)sync_corr)[2*n] += ((short*) &result)[0];
//((short*)sync_corr)[2*n+1] += ((short*) &result)[1];
sync_corr_eNB[n] += abs32(result);
-
}
-
}
/*
@@ -610,7 +359,6 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
}
mean_val/=length;
-
*peak_val_out = peak_val;
if (peak_val <= (40*(uint32_t)mean_val)) {
@@ -620,88 +368,91 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
LOG_I(PHY,"[SYNC TIME] Peak found at pos %u, val = %u, mean_val = %"PRIu64"\n",peak_pos,peak_val,mean_val);
return(peak_pos);
}
-
}
-static inline int64_t abs64(int64_t x)
-{
- return (((int64_t)((int32_t*)&x)[0])*((int64_t)((int32_t*)&x)[0]) + ((int64_t)
-((int32_t*)&x)[1])*((int64_t)((int32_t*)&x)[1]));
+static inline int64_t abs64(int64_t x) {
+ return (((int64_t)((int32_t *)&x)[0])*((int64_t)((int32_t *)&x)[0]) + ((int64_t)
+ ((int32_t *)&x)[1])*((int64_t)((int32_t *)&x)[1]));
}
int ru_sync_time(RU_t *ru,
int64_t *lev,
- int64_t *avg)
-{
+ int64_t *avg) {
LTE_DL_FRAME_PARMS *frame_parms = ru->frame_parms;
RU_CALIBRATION *calibration = &ru->calibration;
-
// perform a time domain correlation using the oversampled sync sequence
-
int length = LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti;
-
// circular copy of beginning to end of rxdata buffer. Note: buffer should be big enough upon calling this function
- for (int ar=0;arnb_rx;ar++) memcpy((void*)&ru->common.rxdata[ar][2*length],
- (void*)&ru->common.rxdata[ar][0],
- frame_parms->ofdm_symbol_size);
-
+ for (int ar=0; arnb_rx; ar++)
+ memcpy((void *)&ru->common.rxdata[ar][2*length],
+ (void *)&ru->common.rxdata[ar][0],
+ frame_parms->ofdm_symbol_size);
+
int32_t maxlev0=0;
int maxpos0=0;
int64_t avg0=0;
int64_t result;
int64_t dmrs_corr;
-
int maxval=0;
- for (int i=0;i<2*(frame_parms->ofdm_symbol_size);i++) {
+
+ for (int i=0; i<2*(frame_parms->ofdm_symbol_size); i++) {
maxval = max(maxval,ru->dmrssync[i]);
maxval = max(maxval,-ru->dmrssync[i]);
}
if (ru->state == RU_CHECK_SYNC) {
- for (int i=0;i<2*(frame_parms->ofdm_symbol_size);i++) {
- maxval = max(maxval,calibration->drs_ch_estimates_time[0][i]);
- maxval = max(maxval,-calibration->drs_ch_estimates_time[0][i]);
- }
+ for (int i=0; i<2*(frame_parms->ofdm_symbol_size); i++) {
+ maxval = max(maxval,calibration->drs_ch_estimates_time[0][i]);
+ maxval = max(maxval,-calibration->drs_ch_estimates_time[0][i]);
+ }
}
int shift = log2_approx(maxval);
for (int n=0; nnb_rx; ar++) {
-
result = dot_product64(ru->dmrssync,
- (int16_t*) &ru->common.rxdata[ar][n],
- frame_parms->ofdm_symbol_size,
- shift);
-
- if (ru->state == RU_CHECK_SYNC) {
- result = dot_product64((int16_t*) &calibration->drs_ch_estimates_time[ar],
- (int16_t*) &ru->common.rxdata[ar][n],
+ (int16_t *) &ru->common.rxdata[ar][n],
frame_parms->ofdm_symbol_size,
shift);
+
+ if (ru->state == RU_CHECK_SYNC) {
+ result = dot_product64((int16_t *) &calibration->drs_ch_estimates_time[ar],
+ (int16_t *) &ru->common.rxdata[ar][n],
+ frame_parms->ofdm_symbol_size,
+ shift);
}
+
dmrs_corr += abs64(result);
}
- if (ru->dmrs_corr != NULL) ru->dmrs_corr[n] = dmrs_corr;
+
+ if (ru->dmrs_corr != NULL)
+ ru->dmrs_corr[n] = dmrs_corr;
// tmpi holds ++...+
+ if (dmrs_corr>maxlev0) {
+ maxlev0 = dmrs_corr;
+ maxpos0 = n;
+ }
- if (dmrs_corr>maxlev0) { maxlev0 = dmrs_corr; maxpos0 = n; }
avg0 += dmrs_corr;
}
- avg0/=(length/4);
+ avg0/=(length/4);
int dmrsoffset = frame_parms->samples_per_tti + (3*frame_parms->ofdm_symbol_size)+(3*frame_parms->nb_prefix_samples) + frame_parms->nb_prefix_samples0;
-
- if ((int64_t)maxlev0 > (10*avg0)) {*lev = maxlev0; *avg=avg0; return((length+maxpos0-dmrsoffset)%length);}
+
+ if ((int64_t)maxlev0 > (10*avg0)) {
+ *lev = maxlev0;
+ *avg=avg0;
+ return((length+maxpos0-dmrsoffset)%length);
+ }
return(-1);
}
diff --git a/openair1/PHY/LTE_REFSIG/lte_gold.c b/openair1/PHY/LTE_REFSIG/lte_gold.c
index c5e48d8364..596760541b 100644
--- a/openair1/PHY/LTE_REFSIG/lte_gold.c
+++ b/openair1/PHY/LTE_REFSIG/lte_gold.c
@@ -56,7 +56,7 @@ void lte_gold(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table[20][2][14]
(((1+(Nid_cell<<1))*(1 + (((frame_parms->Ncp==0)?4:3)*l) + (7*(1+ns))))<<10); //cinit
//x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit
//n = 0
- x1 = 1+ (1<<31);
+ x1 = 1+ (1U<<31);
x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
// skip first 50 double words (1600 bits)
@@ -103,7 +103,7 @@ void lte_gold_ue_spec(uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_
//x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit
//n = 0
// printf("cinit (ns %d, l %d) => %d\n",ns,l,x2);
- x1 = 1+ (1<<31);
+ x1 = 1+ (1U<<31);
x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
// skip first 50 double words (1600 bits)
@@ -143,7 +143,7 @@ void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_
//x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit
//n = 0
//printf("cinit (ns %d, l %d) => %d\n",ns,l,x2);
- x1 = 1+ (1<<31);
+ x1 = 1+ (1U<<31);
x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
//skip first 50 double words (1600 bits)
diff --git a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c
index b057f6a403..78f0fd93fe 100644
--- a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c
+++ b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c
@@ -59,7 +59,7 @@ void lte_gold_mbsfn(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_mbsfn_tabl
//n = 0
// printf("cinit (sfn %d, l %d) => %d\n",sfn,l,x2);
// Initializing the Sequence
- x1 = 1+ (1<<31);
+ x1 = 1+ (1U<<31);
x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
// skip first 50 double words (1600 bits)
// printf("n=0 : x1 %x, x2 %x\n",x1,x2);
@@ -90,7 +90,7 @@ void lte_gold_mbsfn_khz_1dot25(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold
for (sfn=0; sfn<10; sfn++) {
x2 = (Nid_mbsfn) + (((1+(Nid_mbsfn<<1))*(1 + (7*(1+sfn))))<<9); //cinit
- x1 = 1+ (1<<31);
+ x1 = 1+ (1U<<31);
x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
for (n=1; n<50; n++) {
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
index d48164e07d..b03f59fb78 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
@@ -121,7 +121,7 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
for (n=0; n<(1+(G>>5)); n++) {
#ifdef DEBUG_SCRAMBLING
- for (int k=0; k<32; k++) printf("scrambling %d : %d xor %d = %d\n",k+(n<<5),e[k],(s>>k)&1,e[k]^((s>>k)&1));
+ for (int k=0; k<32; k++) printf("scrambling %d : %x xor %x = %d\n",k+(n<<5),e[k],(s>>k)&1,e[k]^((s>>k)&1));
#endif
e[0] = (e[0]) ^ (s&1);
diff --git a/openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c b/openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c
index b249052cbf..a23f8db4f2 100644
--- a/openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c
+++ b/openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c
@@ -41,7 +41,7 @@ extern inline uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t res
{
// Init value for x1: x1(0) = 1, x1(n) = 0, n=1,2,...,30
// x1(31) = [x1(3) + x1(0)]mod2 = 1
- *x1 = 1 + (1<<31);
+ *x1 = 1 + (1U<<31);
// Init value for x2: cinit = sum_{i=0}^30 x2*2^i
// x2(31) = [x2(3) + x2(2) + x2(1) + x2(0)]mod2
// = (*x2>>3) ^ (*x2>>2) + (*x2>>1) + *x2
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index 92fe777201..476d7028b1 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -374,7 +374,7 @@ static inline unsigned int lte_gold_unscram(unsigned int *x1, unsigned int *x2,
int n;
if (reset) {
- *x1 = 1+ (1<<31);
+ *x1 = 1+ (1U<<31);
*x2=*x2 ^ ((*x2 ^ (*x2>>1) ^ (*x2>>2) ^ (*x2>>3))<<31);
// skip first 50 double words (1600 bits)
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/srs_modulation.c b/openair1/PHY/LTE_UE_TRANSPORT/srs_modulation.c
index e6960273c7..9c0edb467c 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/srs_modulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/srs_modulation.c
@@ -170,6 +170,7 @@ int32_t generate_srs(LTE_DL_FRAME_PARMS *frame_parms,
Msc_RS = msrsb * 6;
k0 = ( ( (int16_t)(frame_parms->N_RB_UL>>1) - (int16_t)(msrs0>>1) ) * 12 ) + kTC;
+ AssertFatal(msrsb,"divide by 0");
nb = (4*n_RRC/msrsb)%Nb;
for (b=0; b<=Bsrs; b++) {
diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c
index 0be635ba0b..39c730bfac 100644
--- a/openair1/PHY/MODULATION/slot_fep_nr.c
+++ b/openair1/PHY/MODULATION/slot_fep_nr.c
@@ -211,16 +211,19 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int32_t));
int16_t *rxdata_ptr;
+ rx_offset%=frame_length_samples*2;
- if (frame_length_samples - rx_offset < frame_parms->ofdm_symbol_size) {
+ if (rx_offset+frame_parms->ofdm_symbol_size > frame_length_samples*2 ) {
+ // rxdata is 2 frames len
+ // we have to wrap on the end
memcpy((void *)&tmp_dft_in[0],
(void *)&common_vars->rxdata[aa][rx_offset],
- (frame_length_samples - rx_offset) * sizeof(int32_t));
- memcpy((void *)&tmp_dft_in[frame_length_samples - rx_offset],
+ (frame_length_samples*2 - rx_offset) * sizeof(int32_t));
+ memcpy((void *)&tmp_dft_in[frame_length_samples*2 - rx_offset],
(void *)&common_vars->rxdata[aa][0],
- (frame_parms->ofdm_symbol_size - (frame_length_samples - rx_offset)) * sizeof(int32_t));
- rxdata_ptr = (int16_t *)&tmp_dft_in[0];
+ (frame_parms->ofdm_symbol_size - (frame_length_samples*2 - rx_offset)) * sizeof(int32_t));
+ rxdata_ptr = (int16_t *)tmp_dft_in;
} else if ((rx_offset & 7) != 0) {
@@ -228,7 +231,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
memcpy((void *)&tmp_dft_in[0],
(void *)&common_vars->rxdata[aa][rx_offset],
frame_parms->ofdm_symbol_size * sizeof(int32_t));
- rxdata_ptr = (int16_t *)&tmp_dft_in[0];
+ rxdata_ptr = (int16_t *)tmp_dft_in;
} else {
@@ -308,7 +311,7 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
memcpy((void *)&tmp_dft_in[sample_offset - rxdata_offset],
(void *)&rxdata[0],
(frame_parms->ofdm_symbol_size - sample_offset + rxdata_offset) * sizeof(int32_t));
- rxdata_ptr = (int16_t *)&tmp_dft_in[0];
+ rxdata_ptr = (int16_t *)tmp_dft_in;
} else if (((rxdata_offset - sample_offset) & 7) != 0) {
@@ -316,7 +319,7 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
memcpy((void *)&tmp_dft_in[0],
(void *)&rxdata[rxdata_offset - sample_offset],
(frame_parms->ofdm_symbol_size) * sizeof(int32_t));
- rxdata_ptr = (int16_t *)&tmp_dft_in[0];
+ rxdata_ptr = (int16_t *)tmp_dft_in;
} else {
diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
index d3e33a91a8..116a943880 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
@@ -70,7 +70,34 @@ int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id)
}
-void gNB_I0_measurements(PHY_VARS_gNB *gNB) {
+void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB) {
+
+
+ int min_I0=1000,max_I0=0;
+ int amin=0,amax=0;
+ for (int i=0; iframe_parms.N_RB_UL; i++) {
+ if (i==(gNB->frame_parms.N_RB_UL>>1) - 1) i+=2;
+
+ if (gNB->measurements.n0_subband_power_tot_dB[i]measurements.n0_subband_power_tot_dB[i]; amin=i;}
+
+ if (gNB->measurements.n0_subband_power_tot_dB[i]>max_I0) {max_I0 = gNB->measurements.n0_subband_power_tot_dB[i]; amax=i;}
+ }
+
+ for (int i=0; iframe_parms.N_RB_UL; i++) {
+ fprintf(fd,"%2d.",gNB->measurements.n0_subband_power_tot_dB[i]-gNB->measurements.n0_subband_power_avg_dB);
+ if (i%25 == 24) fprintf(fd,"\n");
+ }
+
+ fprintf(fd,"\nmax_I0 %d (rb %d), min_I0 %d (rb %d), avg I0 %d\n", max_I0, amax, min_I0, amin, gNB->measurements.n0_subband_power_avg_dB);
+
+ fprintf(fd,"PRACH I0 = %d.%d dB\n",gNB->measurements.prach_I0/10,gNB->measurements.prach_I0%10);
+
+
+}
+
+
+
+void gNB_I0_measurements(PHY_VARS_gNB *gNB,int first_symb,int num_symb) {
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
NR_gNB_COMMON *common_vars = &gNB->common_vars;
@@ -79,42 +106,49 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB) {
double rx_gain = openair0_cfg[0].rx_gain[0];
double rx_gain_offset = openair0_cfg[0].rx_gain_offset[0];
uint32_t *rb_mask = gNB->rb_mask_ul;
- int symbol = gNB->ulmask_symb;
- int rb, offset, nb_rb;
+ int rb, offset, offset0, nb_rb, len;
uint32_t n0_subband_power_temp = 0;
int32_t *ul_ch;
+ int32_t n0_power_tot;
+ int64_t n0_power_tot2;
- if (symbol>-1) {
- measurements->n0_power_tot = 0;
- for (int aarx=0; aarxnb_antennas_rx; aarx++) {
- nb_rb = 0;
- for (rb=0; rbN_RB_UL; rb++) {
- if ((rb_mask[rb>>5]&(1<<(rb&31))) == 0) { // check that rb was not used in this subframe
- nb_rb++;
- offset = (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
- offset += (symbol*frame_parms->ofdm_symbol_size);
- ul_ch = &common_vars->rxdataF[aarx][offset];
- //TODO what about DC?
- n0_subband_power_temp += signal_energy_nodc(ul_ch,12);
- }
- }
-
- if (nb_rb != 0) {
- measurements->n0_power[aarx] = n0_subband_power_temp/nb_rb;
- measurements->n0_power_dB[aarx] = dB_fixed(measurements->n0_power[aarx]);
- measurements->n0_power_tot += measurements->n0_power[aarx];
- }
+ nb_rb = 0;
+ n0_power_tot2=0;
+ for (rb=0; rbN_RB_UL; rb++) {
+ n0_power_tot=0;
+ offset0 = (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
+ if ((rb_mask[rb>>5]&(1<<(rb&31))) == 0) { // check that rb was not used in this subframe
+ nb_rb++;
+ for (int aarx=0; aarxnb_antennas_rx; aarx++) {
+ measurements->n0_subband_power[aarx][rb]=0;
+ for (int s=first_symb;s<(first_symb+num_symb);s++) {
+ offset = offset0 + (s*frame_parms->ofdm_symbol_size);
+ ul_ch = &common_vars->rxdataF[aarx][offset];
+ len = 12;
+ if (((frame_parms->N_RB_UL&1) == 1) &&
+ (rb==(frame_parms->N_RB_UL>>1))) {
+ len=6;
+ }
+ AssertFatal(ul_ch, "RX signal buffer (freq) problem\n");
+ measurements->n0_subband_power[aarx][rb] += signal_energy_nodc(ul_ch,len);
+ } // symbol
+ measurements->n0_subband_power[aarx][rb]/=num_symb;
+ measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(measurements->n0_subband_power[aarx][rb]);
+ n0_power_tot += measurements->n0_subband_power[aarx][rb];
+ } //antenna
+ n0_power_tot/=frame_parms->nb_antennas_rx;
+ n0_power_tot2 += n0_power_tot;
+ measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot);
+ measurements->n0_subband_power_tot_dBm[rb] = measurements->n0_subband_power_tot_dB[rb] - gNB->rx_total_gain_dB - dB_fixed(frame_parms->N_RB_UL);
}
+ } //rb
- measurements->n0_power_tot_dB = dB_fixed(measurements->n0_power_tot);
- measurements->n0_power_tot_dBm = measurements->n0_power_tot_dB + 30 - 10 * log10(pow(2, 30)) - (rx_gain - rx_gain_offset) - dB_fixed(fp->ofdm_symbol_size);
+ if (nb_rb>0) measurements->n0_subband_power_avg_dB = dB_fixed(n0_power_tot2/nb_rb);
- LOG_D(PHY, "In %s: tot n0 power %d dBm for %d RBs (tot N0 power = %d)\n", __FUNCTION__, measurements->n0_power_tot_dBm, nb_rb, measurements->n0_power_tot);
-
- }
}
+
// Scope: This function computes the UL SNR from the UL channel estimates
//
// Todo:
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
index 7bd004a4d4..7ecaa97f6a 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
@@ -47,7 +47,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
unsigned short bwp_start_subcarrier,
nfapi_nr_pusch_pdu_t *pusch_pdu);
-void gNB_I0_measurements(PHY_VARS_gNB *gNB);
+void gNB_I0_measurements(PHY_VARS_gNB *gNB,int first_symb,int num_symb);
void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq_pid, unsigned char symbol);
diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.c b/openair1/PHY/NR_REFSIG/dmrs_nr.c
index 03a37e2b27..2e270318f8 100644
--- a/openair1/PHY/NR_REFSIG/dmrs_nr.c
+++ b/openair1/PHY/NR_REFSIG/dmrs_nr.c
@@ -150,7 +150,7 @@ void pseudo_random_sequence_optimised(unsigned int size, uint32_t *c, uint32_t c
unsigned int n,x1,x2;
/* init of m-sequences */
- x1 = 1+ (1<<31);
+ x1 = 1+ (1U<<31);
x2 = cinit;
x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
diff --git a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c
index b0f9e6d03c..9ed2bd949f 100644
--- a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c
+++ b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c
@@ -21,6 +21,18 @@
#include "nr_refsig.h"
#include "nr_mod_table.h"
+short nr_qpsk_mod_table[8];
+
+int32_t nr_16qam_mod_table[16];
+#if defined(__SSE2__)
+__m128i nr_qpsk_byte_mod_table[2048];
+#endif
+
+int64_t nr_16qam_byte_mod_table[1024];
+
+int64_t nr_64qam_mod_table[4096];
+
+int32_t nr_256qam_mod_table[512];
void nr_generate_modulation_table() {
float sqrt2 = 0.70711;
diff --git a/openair1/PHY/NR_REFSIG/nr_mod_table.h b/openair1/PHY/NR_REFSIG/nr_mod_table.h
index aa8b99f584..2c6964fe96 100644
--- a/openair1/PHY/NR_REFSIG/nr_mod_table.h
+++ b/openair1/PHY/NR_REFSIG/nr_mod_table.h
@@ -29,16 +29,16 @@
#define NR_MOD_TABLE_QAM64_OFFSET 23
#define NR_MOD_TABLE_QAM256_OFFSET 87
-short nr_qpsk_mod_table[8];
+extern short nr_qpsk_mod_table[8];
-int32_t nr_16qam_mod_table[16];
+extern int32_t nr_16qam_mod_table[16];
#if defined(__SSE2__)
-__m128i nr_qpsk_byte_mod_table[2048];
+extern __m128i nr_qpsk_byte_mod_table[2048];
#endif
-int64_t nr_16qam_byte_mod_table[1024];
+extern int64_t nr_16qam_byte_mod_table[1024];
-int64_t nr_64qam_mod_table[4096];
+extern int64_t nr_64qam_mod_table[4096];
-int32_t nr_256qam_mod_table[512];
+extern int32_t nr_256qam_mod_table[512];
#endif
diff --git a/openair1/PHY/NR_REFSIG/pss_nr.h b/openair1/PHY/NR_REFSIG/pss_nr.h
index 19b9736bcb..b32d48a2e9 100644
--- a/openair1/PHY/NR_REFSIG/pss_nr.h
+++ b/openair1/PHY/NR_REFSIG/pss_nr.h
@@ -120,8 +120,7 @@ EXTERN int64_t *pss_corr_ue[NUMBER_PSS_SEQUENCE]
;
/* profiling structure */
-EXTERN double cpuf;
-time_stats_t generic_time[TIME_LAST];
+EXTERN time_stats_t generic_time[TIME_LAST];
#ifndef DEFINE_HEADER_ONLY
diff --git a/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h b/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h
index 44d30da8f3..43ec0c03dc 100644
--- a/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h
+++ b/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h
@@ -58,7 +58,7 @@
#define INDEX_SB_LESS_32 (4) /* index of dftsizes array for which subcarrier number is less than 36 */
-const uint16_t ul_allocated_re[SRS_SB_CONF] /* number of uplink allocated resource elements */
+EXTERN const uint16_t ul_allocated_re[SRS_SB_CONF] /* number of uplink allocated resource elements */
/* this table is derivated from TS 38.211 Table 6.4.1.4.3-1: SRS bandwidth configuration which gives m_SRS_b then all possible values of sequence length is */
/* M_sc_b_SRS = m_SRS_b * N_SC_RB/K_TC with K_TC = 2 or K_TC = 4 as specified in TS 38.211 6.4.1.4.3 */
#ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H
@@ -82,7 +82,7 @@ m_SRS_b 224 116, 240 256 264 272 144 152 160 168 176 184
;
/* table of largest prime number lower than uplink allocated resource elements "ul_allocated_re" */
-const uint16_t ref_ul_primes[SRS_SB_CONF]
+EXTERN const uint16_t ref_ul_primes[SRS_SB_CONF]
#ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H
= {
/* 6, 12, 18, 24, 30, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 168, 180, 192, 204, 216, 228, 240, */
@@ -101,10 +101,10 @@ const uint16_t ref_ul_primes[SRS_SB_CONF]
;
/* Low-PAPR base sequence; see TS 38.211 clause 5.2.2 */
-int16_t *rv_ul_ref_sig[U_GROUP_NUMBER][V_BASE_SEQUENCE_NUMBER][SRS_SB_CONF];
+EXTERN int16_t *rv_ul_ref_sig[U_GROUP_NUMBER][V_BASE_SEQUENCE_NUMBER][SRS_SB_CONF];
/* 38.211 table Table 5.2.2.2-1: Definition of phi(n) for M_ZC = 6 */
-const char phi_M_ZC_6[6*U_GROUP_NUMBER]
+EXTERN const char phi_M_ZC_6[6*U_GROUP_NUMBER]
#ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H
= {
/* 0 1 2 3 4 5 */
@@ -142,7 +142,7 @@ const char phi_M_ZC_6[6*U_GROUP_NUMBER]
#endif
;
/* Table 5.2.2.2-2: Definition of phi ( n ) for M ZC = 12 */
-const char phi_M_ZC_12[12*U_GROUP_NUMBER]
+EXTERN const char phi_M_ZC_12[12*U_GROUP_NUMBER]
#ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H
= {
/* 0 1 2 3 4 5 6 7 8 9 10 11 */
@@ -181,7 +181,7 @@ const char phi_M_ZC_12[12*U_GROUP_NUMBER]
;
/* Table 5.2.2.2-3: Definition of phi (n ) for M_ZC = 18 */
-const char phi_M_ZC_18[18*U_GROUP_NUMBER]
+EXTERN const char phi_M_ZC_18[18*U_GROUP_NUMBER]
#ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H
= {
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 */
@@ -220,7 +220,7 @@ const char phi_M_ZC_18[18*U_GROUP_NUMBER]
;
/* Table 5.2.2.2-4: Definition of phi (n ) for M_ZC = 24 */
-const char phi_M_ZC_24[24*U_GROUP_NUMBER]
+EXTERN const char phi_M_ZC_24[24*U_GROUP_NUMBER]
#ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H
= {
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 */
@@ -260,10 +260,10 @@ const char phi_M_ZC_24[24*U_GROUP_NUMBER]
/************** FUNCTION ******************************************/
-int16_t *base_sequence_36_or_larger(unsigned int M_ZC, unsigned int u, unsigned int v, unsigned int scaling, unsigned int if_dmrs_seq);
+EXTERN int16_t *base_sequence_36_or_larger(unsigned int M_ZC, unsigned int u, unsigned int v, unsigned int scaling, unsigned int if_dmrs_seq);
-int16_t *base_sequence_less_than_36(unsigned int M_ZC, unsigned int u, unsigned int scaling);
+EXTERN int16_t *base_sequence_less_than_36(unsigned int M_ZC, unsigned int u, unsigned int scaling);
/*!
\brief This function generate the sounding reference symbol (SRS) for the uplink.
@param tables of srs
@@ -278,7 +278,7 @@ void free_ul_reference_signal_sequences(void);
#define MAX_INDEX_DMRS_UL_ALLOCATED_REs 53
-const uint16_t dmrs_ul_allocated_res[MAX_INDEX_DMRS_UL_ALLOCATED_REs]
+EXTERN const uint16_t dmrs_ul_allocated_res[MAX_INDEX_DMRS_UL_ALLOCATED_REs]
/* Number of possible DMRS REs based on PRBs allocated for PUSCH. Array has values until 273 RBs (100Mhz BW)
Number of PUSCH RBs allocated should be able to be expressed as 2topowerofn*3topowerofn*5tothepowerofn
According to 3GPP spec 38.211 section 6.3.1.4
@@ -307,7 +307,7 @@ const uint16_t dmrs_ul_allocated_res[MAX_INDEX_DMRS_UL_ALLOCATED_REs]
/* Table of largest prime number N_ZC < possible DMRS REs M_ZC, this array has values until 100Mhz
According to 3GPP spec 38.211 section 5.2.2.1
Table used in calculating DMRS low papr type1 sequence for transform precoding */
-const uint16_t dmrs_ref_ul_primes[MAX_INDEX_DMRS_UL_ALLOCATED_REs]
+EXTERN const uint16_t dmrs_ref_ul_primes[MAX_INDEX_DMRS_UL_ALLOCATED_REs]
#ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H
= {
/*DMRS REs 6, 12, 18, 24, 30, 36, 48, 54, 60, 72, 90, 96, */
@@ -331,8 +331,8 @@ const uint16_t dmrs_ref_ul_primes[MAX_INDEX_DMRS_UL_ALLOCATED_REs]
;
/// PUSCH DMRS for transform precoding
-int16_t *gNB_dmrs_lowpaprtype1_sequence[U_GROUP_NUMBER][V_BASE_SEQUENCE_NUMBER][MAX_INDEX_DMRS_UL_ALLOCATED_REs];
-int16_t *dmrs_lowpaprtype1_ul_ref_sig[U_GROUP_NUMBER][V_BASE_SEQUENCE_NUMBER][MAX_INDEX_DMRS_UL_ALLOCATED_REs];
+EXTERN int16_t *gNB_dmrs_lowpaprtype1_sequence[U_GROUP_NUMBER][V_BASE_SEQUENCE_NUMBER][MAX_INDEX_DMRS_UL_ALLOCATED_REs];
+EXTERN int16_t *dmrs_lowpaprtype1_ul_ref_sig[U_GROUP_NUMBER][V_BASE_SEQUENCE_NUMBER][MAX_INDEX_DMRS_UL_ALLOCATED_REs];
int16_t get_index_for_dmrs_lowpapr_seq(int16_t num_dmrs_res);
void generate_lowpapr_typ1_refsig_sequences(unsigned int scaling);
void free_gnb_lowpapr_sequences(void);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c
index a7721c68df..aa31cbe17b 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dci.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c
@@ -94,7 +94,6 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
* in time: by its first slot and its first symbol*/
const nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[d];
- LOG_D(PHY,"DCI pdu %d, rnti %x, aggregation %d CCE %d Scrambling_Id %x ScramblingRNTI %x PayloadSizeBits %d\n",d,dci_pdu->RNTI,dci_pdu->AggregationLevel,dci_pdu->CceIndex,dci_pdu->ScramblingId,dci_pdu->ScramblingRNTI,dci_pdu->PayloadSizeBits);
cset_start_symb = pdcch_pdu_rel15->StartSymbolIndex;
cset_nsymb = pdcch_pdu_rel15->DurationSymbols;
dci_idx = 0;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index ca696f690d..9c832d58e3 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -288,8 +288,8 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
}
G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,rel15->nrOfLayers);
- LOG_D(PHY,"DLSCH coding, A %d (%d) G %d nb_re_dmrs %d length_dmrs %d Nl %d nb_symb_sch %d nb_rb %d\n",
- A,A/8,G,nb_re_dmrs,length_dmrs,rel15->nrOfLayers,nb_symb_sch,nb_rb);
+ LOG_D(PHY,"dlsch coding A %d G %d (nb_rb %d, nb_symb_sch %d, nb_re_dmrs %d, length_dmrs %d, mod_order %d)\n",
+ A,G, nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs,(int)mod_order);
if (A > 3824) {
// Add 24-bit crc (polynomial A) to payload
diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c
index 34c647810d..bf944e27aa 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c
@@ -858,36 +858,36 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
memset(prachF, 0, sizeof(int16_t)*2*1024 );
if (LOG_DUMPFLAG(PRACH)) {
- LOG_M("prach_rxF0.m","prach_rxF0",rxsigF[0],N_ZC,1,1);
- LOG_M("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1);
+ LOG_M("prach_rxF0.m","prach_rxF0",rxsigF[0],N_ZC,1,1);
+ LOG_M("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1);
}
for (aa=0;aa>15);
- prachF[offset+1] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][offset+1] - (int32_t)Xu[offset+1]*rxsigF[aa][offset])>>15);
- }
+ for (offset=0; offset<(N_ZC<<1); offset+=2) {
+ prachF[offset] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][offset] + (int32_t)Xu[offset+1]*rxsigF[aa][offset+1])>>15);
+ prachF[offset+1] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][offset+1] - (int32_t)Xu[offset+1]*rxsigF[aa][offset])>>15);
+ }
- // Now do IFFT of size 1024 (N_ZC=839) or 256 (N_ZC=139)
- if (N_ZC == 839) {
- log2_ifft_size = 10;
- idft(IDFT_1024,prachF,prach_ifft_tmp,1);
- // compute energy and accumulate over receive antennas
- for (i=0;i<2048;i++)
- prach_ifft[i] += ((int32_t)prach_ifft_tmp[i<<1]*(int32_t)prach_ifft_tmp[i<<1] + (int32_t)prach_ifft_tmp[1+(i<<1)]*(int32_t)prach_ifft_tmp[1+(i<<1)])>>10;
- } else {
- idft(IDFT_256,prachF,prach_ifft_tmp,1);
- log2_ifft_size = 8;
+ // Now do IFFT of size 1024 (N_ZC=839) or 256 (N_ZC=139)
+ if (N_ZC == 839) {
+ log2_ifft_size = 10;
+ idft(IDFT_1024,prachF,prach_ifft_tmp,1);
+ // compute energy and accumulate over receive antennas
+ for (i=0;i<2048;i++)
+ prach_ifft[i] += ((int32_t)prach_ifft_tmp[i<<1]*(int32_t)prach_ifft_tmp[i<<1] + (int32_t)prach_ifft_tmp[1+(i<<1)]*(int32_t)prach_ifft_tmp[1+(i<<1)])/nb_rx;
+ } else {
+ idft(IDFT_256,prachF,prach_ifft_tmp,1);
+ log2_ifft_size = 8;
// compute energy and accumulate over receive antennas and repetitions for BR
for (i=0;i<256;i++)
- prach_ifft[i] += ((int32_t)prach_ifft_tmp[i<<1]*(int32_t)prach_ifft_tmp[(i<<1)] + (int32_t)prach_ifft_tmp[1+(i<<1)]*(int32_t)prach_ifft_tmp[1+(i<<1)])>>10;
+ prach_ifft[i] += ((int32_t)prach_ifft_tmp[i<<1]*(int32_t)prach_ifft_tmp[(i<<1)] + (int32_t)prach_ifft_tmp[1+(i<<1)]*(int32_t)prach_ifft_tmp[1+(i<<1)])/nb_rx;
}
if (LOG_DUMPFLAG(PRACH)) {
if (aa==0) LOG_M("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1);
- if (aa==1) LOG_M("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1);
+ if (aa==1) LOG_M("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1);
}
}// antennas_rx
} // new dft
@@ -900,10 +900,10 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
lev = (int32_t)prach_ifft[(preamble_shift2+i)];
levdB = dB_fixed_times10(lev);
if (levdB>*max_preamble_energy) {
- LOG_D(PHY,"preamble_index %d, delay %d en %d dB > %d dB\n",preamble_index,i,levdB,*max_preamble_energy);
- *max_preamble_energy = levdB;
- *max_preamble_delay = i; // Note: This has to be normalized to the 30.72 Ms/s sampling rate
- *max_preamble = preamble_index;
+ LOG_D(PHY,"preamble_index %d, delay %d en %d dB > %d dB\n",preamble_index,i,levdB,*max_preamble_energy);
+ *max_preamble_energy = levdB;
+ *max_preamble_delay = i; // Note: This has to be normalized to the 30.72 Ms/s sampling rate
+ *max_preamble = preamble_index;
}
}
}// preamble_index
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
index e5e81109e4..5e6011c437 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
@@ -357,6 +357,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
nfapi_nr_pucch_pdu_t* pucch_pdu);
void nr_decode_pucch0(PHY_VARS_gNB *gNB,
+ int frame,
int slot,
nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
nfapi_nr_pucch_pdu_t* pucch_pdu);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c
index 0040f01544..e6b709b2aa 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c
@@ -137,12 +137,27 @@ void nr_ulsch_unscrambling_optim(int16_t* llr,
#endif
}
-void dump_pusch_stats(PHY_VARS_gNB *gNB) {
+#define STATSTRLEN 16384
+void dump_pusch_stats(FILE *fd,PHY_VARS_gNB *gNB) {
- for (int i=0;iulsch_stats[i].rnti>0)
- LOG_I(PHY,"ULSCH RNTI %x: round_trials %d(%1.1e):%d(%1.1e):%d(%1.1e):%d, current_Qm %d, current_RI %d, total_bytes RX/SCHED %d/%d\n",
- gNB->ulsch_stats[i].rnti,
+ char output[16384];
+ int stroff=0;
+
+ for (int i=0;iulsch_stats[i].rnti>0) {
+ for (int aa=0;aaframe_parms.nb_antennas_rx;aa++)
+ if (aa==0) stroff+=sprintf(output+stroff,"ULSCH RNTI %4x: ulsch_power[%d] %d,%d ulsch_noise_power[%d] %d.%d\n",
+ gNB->ulsch_stats[i].rnti,
+ aa,gNB->ulsch_stats[i].power[aa]/10,gNB->ulsch_stats[i].power[aa]%10,
+ aa,gNB->ulsch_stats[i].noise_power[aa]/10,gNB->ulsch_stats[i].noise_power[aa]%10);
+ else stroff+=sprintf(output+stroff," ulsch_power[%d] %d.%d, ulsch_noise_power[%d] %d.%d\n",
+ aa,gNB->ulsch_stats[i].power[aa]/10,gNB->ulsch_stats[i].power[aa]%10,
+ gNB->ulsch_stats[i].noise_power[aa]/10,gNB->ulsch_stats[i].noise_power[aa]%10);
+
+ AssertFatal(stroff<(STATSTRLEN-1000),"Increase STATSTRLEN\n");
+
+
+ stroff+=sprintf(output+stroff," round_trials %d(%1.1e):%d(%1.1e):%d(%1.1e):%d, DTX %d, current_Qm %d, current_RI %d, total_bytes RX/SCHED %d/%d\n",
gNB->ulsch_stats[i].round_trials[0],
(double)gNB->ulsch_stats[i].round_trials[1]/gNB->ulsch_stats[i].round_trials[0],
gNB->ulsch_stats[i].round_trials[1],
@@ -150,11 +165,14 @@ void dump_pusch_stats(PHY_VARS_gNB *gNB) {
gNB->ulsch_stats[i].round_trials[2],
(double)gNB->ulsch_stats[i].round_trials[3]/gNB->ulsch_stats[i].round_trials[0],
gNB->ulsch_stats[i].round_trials[3],
+ gNB->ulsch_stats[i].DTX,
gNB->ulsch_stats[i].current_Qm,
gNB->ulsch_stats[i].current_RI,
gNB->ulsch_stats[i].total_bytes_rx,
gNB->ulsch_stats[i].total_bytes_tx);
-
+ }
+ }
+ fprintf(fd,"%s",output);
}
void clear_pusch_stats(PHY_VARS_gNB *gNB) {
@@ -162,3 +180,20 @@ void clear_pusch_stats(PHY_VARS_gNB *gNB) {
for (int i=0;iulsch_stats[i],0,sizeof(gNB->ulsch_stats[i]));
}
+
+NR_gNB_SCH_STATS_t *get_ulsch_stats(PHY_VARS_gNB *gNB,NR_gNB_ULSCH_t *ulsch) {
+ NR_gNB_SCH_STATS_t *stats=NULL;
+ int first_free=-1;
+ for (int i=0;iulsch_stats[i].rnti == 0 && first_free == -1) {
+ first_free = i;
+ stats=&gNB->ulsch_stats[i];
+ }
+ if (gNB->ulsch_stats[i].rnti == ulsch->rnti) {
+ stats=&gNB->ulsch_stats[i];
+ break;
+ }
+ }
+ return(stats);
+}
+
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch.h b/openair1/PHY/NR_TRANSPORT/nr_ulsch.h
index de9b5f48c3..2ca8e24af1 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch.h
@@ -89,6 +89,8 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB,
uint8_t harq_pid);
int16_t find_nr_ulsch(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type);
-void dump_pusch_stats(PHY_VARS_gNB *gNB);
+void dump_pusch_stats(FILE *fd,PHY_VARS_gNB *gNB);
void clear_pusch_stats(PHY_VARS_gNB *gNB);
+
+NR_gNB_SCH_STATS_t *get_ulsch_stats(PHY_VARS_gNB *gNB,NR_gNB_ULSCH_t *ulsch);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
index b572a6e5bb..3aad4980bc 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
@@ -449,7 +449,7 @@ void nr_processULSegment(void* arg) {
}
uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
- uint8_t UE_id,
+ uint8_t ULSCH_id,
short *ulsch_llr,
NR_DL_FRAME_PARMS *frame_parms,
nfapi_nr_pusch_pdu_t *pusch_pdu,
@@ -471,7 +471,8 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
#endif
- NR_gNB_ULSCH_t *ulsch = phy_vars_gNB->ulsch[UE_id][0];
+ NR_gNB_ULSCH_t *ulsch = phy_vars_gNB->ulsch[ULSCH_id][0];
+ NR_gNB_PUSCH *pusch = phy_vars_gNB->pusch_vars[ULSCH_id];
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
if (!harq_process) {
@@ -557,9 +558,11 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
if (stats) {
stats->rnti = ulsch->rnti;
stats->round_trials[harq_process->round]++;
- }
- if (harq_process->round == 0) {
- if (stats) {
+ for (int aarx=0;aarxnb_antennas_rx;aarx++) {
+ stats->power[aarx]=dB_fixed_x10(pusch->ulsch_power[aarx]);
+ stats->noise_power[aarx]=dB_fixed_x10(pusch->ulsch_noise_power[aarx]);
+ }
+ if (harq_process->round == 0) {
stats->current_Qm = Qm;
stats->current_RI = n_layers;
stats->total_bytes_tx += harq_process->TBS;
@@ -639,7 +642,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
rdata->Tbslbrm = Tbslbrm;
rdata->offset = offset;
rdata->ulsch = ulsch;
- rdata->ulsch_id = UE_id;
+ rdata->ulsch_id = ULSCH_id;
pushTpool(phy_vars_gNB->threadPool,req);
phy_vars_gNB->nbDecode++;
LOG_D(PHY,"Added a block to decode, in pipe: %d\n",phy_vars_gNB->nbDecode);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index 2a05477380..032b277030 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -1218,15 +1218,19 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
rel15_ul);
nr_gnb_measurements(gNB, ulsch_id, harq_pid, symbol);
-
+ int num_symb = rel15_ul->nr_of_symbols;
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
- gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] = signal_energy_nodc(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][symbol*frame_parms->ofdm_symbol_size],
+ if (symbol == rel15_ul->start_symbol_index) {
+ gNB->pusch_vars[ulsch_id]->ulsch_power[aarx]=0;
+ gNB->pusch_vars[ulsch_id]->ulsch_noise_power[aarx]=0;
+ }
+ gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] += signal_energy_nodc(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][symbol*frame_parms->ofdm_symbol_size],
rel15_ul->rb_size*12);
- LOG_D(PHY,"ulsch_power[%d] symbol %d %f (%p)\n",aarx,symbol,dB_fixed_times10( gNB->pusch_vars[ulsch_id]->ulsch_power[aarx])/10.0,
- &gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][symbol*frame_parms->ofdm_symbol_size]);
- if (gNB->pusch_vars[ulsch_id]->ulsch_power[aarx]==1) return (1);
- }
-
+ for (int rb=0;rbrb_size;rb++) {
+ gNB->pusch_vars[ulsch_id]->ulsch_noise_power[aarx]+=gNB->measurements.n0_subband_power[aarx][rel15_ul->bwp_start+rel15_ul->rb_start+rb]/rel15_ul->rb_size;
+ }
+
+ }
}
stop_meas(&gNB->ulsch_channel_estimation_stats);
//----------------------------------------------------------
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index 99bc5b5774..7e2ec05b7f 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -161,6 +161,7 @@ int16_t idft12_im[12][12] = {
void nr_decode_pucch0(PHY_VARS_gNB *gNB,
+ int frame,
int slot,
nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
nfapi_nr_pucch_pdu_t* pucch_pdu) {
@@ -178,6 +179,19 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
"Either bit_len_harq (%d) or sr_flag (%d) must be > 0\n",
pucch_pdu->bit_len_harq,pucch_pdu->sr_flag);
+ NR_gNB_UCI_STATS_t *uci_stats=NULL;
+ NR_gNB_UCI_STATS_t *first_uci_stats=NULL;
+ for (int i=0;iuci_stats[i].rnti == pucch_pdu->rnti) {
+ uci_stats = &gNB->uci_stats[i];
+ break;
+ } else if (first_uci_stats == NULL && gNB->uci_stats[i].rnti == 0) first_uci_stats = &gNB->uci_stats[i];
+
+ if (uci_stats == NULL) { uci_stats=first_uci_stats; uci_stats->rnti = pucch_pdu->rnti;}
+
+ AssertFatal(uci_stats!=NULL,"No stat index found\n");
+ uci_stats->frame = frame;
+
if(pucch_pdu->bit_len_harq==0){
mcs=table1_mcs;
nr_sequences=1;
@@ -191,7 +205,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
nr_sequences=8>>(1-pucch_pdu->sr_flag);
}
- LOG_I(PHY,"pucch0: nr_symbols %d, start_symbol %d, prb_start %d, second_hop_prb %d, group_hop_flag %d, sequence_hop_flag %d, O_ACK %d, O_SR %d, mcs %d\n",pucch_pdu->nr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->bit_len_harq,pucch_pdu->sr_flag,mcs[0]);
+ LOG_D(PHY,"pucch0: nr_symbols %d, start_symbol %d, prb_start %d, second_hop_prb %d, group_hop_flag %d, sequence_hop_flag %d, O_ACK %d, O_SR %d, mcs %d\n",pucch_pdu->nr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->bit_len_harq,pucch_pdu->sr_flag,mcs[0]);
int cs_ind = get_pucch0_cs_lut_index(gNB,pucch_pdu);
/*
@@ -227,17 +241,17 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
int prb_offset[2] = {pucch_pdu->bwp_start+pucch_pdu->prb_start, pucch_pdu->bwp_start+pucch_pdu->prb_start};
nr_group_sequence_hopping(pucch_GroupHopping,pucch_pdu->hopping_id,0,slot,&u[0],&v[0]); // calculating u and v value first hop
- LOG_I(PHY,"pucch0: u %d, v %d\n",u[0],v[0]);
+ LOG_D(PHY,"pucch0: u %d, v %d\n",u[0],v[0]);
if (pucch_pdu->freq_hop_flag == 1) {
nr_group_sequence_hopping(pucch_GroupHopping,pucch_pdu->hopping_id,1,slot,&u[1],&v[1]); // calculating u and v value second hop
- LOG_I(PHY,"pucch0 second hop: u %d, v %d\n",u[1],v[1]);
+ LOG_D(PHY,"pucch0 second hop: u %d, v %d\n",u[1],v[1]);
prb_offset[1] = pucch_pdu->bwp_start+pucch_pdu->second_hop_prb;
}
AssertFatal(pucch_pdu->nr_of_symbols < 3,"nr_of_symbols %d not allowed\n",pucch_pdu->nr_of_symbols);
- uint32_t re_offset=0;
+ uint32_t re_offset[2]={0,0};
uint8_t l2;
const int16_t *x_re[2],*x_im[2];
@@ -253,22 +267,23 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
memset((void*)xr[0],0,24*sizeof(int16_t));
memset((void*)xr[1],0,24*sizeof(int16_t));
int n2;
+
for (l=0; lnr_of_symbols; l++) {
l2 = l+pucch_pdu->start_symbol_index;
- re_offset = (12*prb_offset[l]) + frame_parms->first_carrier_offset;
- if (re_offset>= frame_parms->ofdm_symbol_size)
- re_offset-=frame_parms->ofdm_symbol_size;
+ re_offset[l] = (12*prb_offset[l]) + frame_parms->first_carrier_offset;
+ if (re_offset[l]>= frame_parms->ofdm_symbol_size)
+ re_offset[l]-=frame_parms->ofdm_symbol_size;
- AssertFatal(re_offset+12 < frame_parms->ofdm_symbol_size,"pucch straddles DC carrier, handle this!\n");
+ AssertFatal(re_offset[l]+12 < frame_parms->ofdm_symbol_size,"pucch straddles DC carrier, handle this!\n");
- int16_t *r=(int16_t*)&rxdataF[0][(l2*frame_parms->ofdm_symbol_size)+re_offset];
+ int16_t *r=(int16_t*)&rxdataF[0][(l2*frame_parms->ofdm_symbol_size)+re_offset[l]];
n2=0;
for (n=0;n<12;n++,n2+=2) {
xr[l][n2] =(int16_t)(((int32_t)x_re[l][n]*r[n2]+(int32_t)x_im[l][n]*r[n2+1])>>15);
xr[l][n2+1]=(int16_t)(((int32_t)x_re[l][n]*r[n2+1]-(int32_t)x_im[l][n]*r[n2])>>15);
#ifdef DEBUG_NR_PUCCH_RX
printf("x (%d,%d), r%d.%d (%d,%d), xr (%d,%d)\n",
- x_re[l][n],x_im[l][n],l2,re_offset,r[n2],r[n2+1],xr[l][n2],xr[l][n2+1]);
+ x_re[l][n],x_im[l][n],l2,re_offset[l],r[n2],r[n2+1],xr[l][n2],xr[l][n2+1]);
#endif
}
}
@@ -286,15 +301,15 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
#endif
n2=0;
for (n=0;n<12;n++,n2+=2) {
- corr_re[l]+=(xr[l][n2]*idft12_re[seq_index][n]+xr[l][n2+1]*idft12_im[seq_index][n])>>15;
- corr_im[l]+=(xr[l][n2]*idft12_im[seq_index][n]-xr[l][n2+1]*idft12_re[seq_index][n])>>15;
+ corr_re[l]+=(xr[l][n2]*idft12_re[seq_index][n]+xr[l][n2+1]*idft12_im[seq_index][n])>>15;
+ corr_im[l]+=(xr[l][n2]*idft12_im[seq_index][n]-xr[l][n2+1]*idft12_re[seq_index][n])>>15;
}
}
-//#ifdef DEBUG_NR_PUCCH_RX
+#ifdef DEBUG_NR_PUCCH_RX
LOG_I(PHY,"PUCCH IDFT = (%d,%d)=>%f\n",corr_re[0],corr_im[0],10*log10((double)corr_re[0]*corr_re[0] + (double)corr_im[0]*corr_im[0]));
if (l>1) LOG_I(PHY,"PUCCH 2nd symbol IDFT[%d/%d] = (%d,%d)=>%f\n",mcs[i],seq_index,corr_re[1],corr_im[1],10*log10((double)corr_re[1]*corr_re[1] + (double)corr_im[1]*corr_im[1]));
-//#endif
+#endif
if (pucch_pdu->freq_hop_flag == 0 && l==1) // non-coherent correlation
temp=(int64_t)corr_re[0]*corr_re[0] + (int64_t)corr_im[0]*corr_im[0];
else if (pucch_pdu->freq_hop_flag == 0 && l==2) {
@@ -312,6 +327,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
if (temp>xrtmag) {
xrtmag=temp;
maxpos=i;
+ uci_stats->current_pucch0_stat0 = dB_fixed64((int64_t)corr_re[0]*corr_re[0] + (int64_t)corr_im[0]*corr_im[0]);
+ if (l==2) uci_stats->current_pucch0_stat1 = dB_fixed64((int64_t)corr_re[1]*corr_re[1] + (int64_t)corr_im[1]*corr_im[1]);
}
}
if(nr_sequences>1)
@@ -328,31 +345,37 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
// estimate CQI for MAC (from antenna port 0 only)
- int SNRtimes10 = dB_fixed_times10(signal_energy_nodc(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset],12)) - (10*gNB->measurements.n0_power_tot_dB);
+ int max_n0 = uci_stats->pucch0_n00>uci_stats->pucch0_n01 ? uci_stats->pucch0_n00:uci_stats->pucch0_n01;
+ int SNRtimes10 = dB_fixed_times10(signal_energy_nodc(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset[0]],12)) - (10*max_n0);
int cqi;
if (SNRtimes10 < -640) cqi=0;
else if (SNRtimes10 > 635) cqi=255;
else cqi=(640+SNRtimes10)/5;
+ uci_stats->pucch0_thres = gNB->pucch0_thres + (10*max_n0);
bool no_conf=false;
if (nr_sequences>1) {
- if ((xrtmag_dB<(11+dB_fixed(no_corr))) || (dB_fixed(av_corr)<(13+gNB->measurements.n0_power_tot_dB))) //TODO these are temporary threshold based on measurments with the phone
+ if (10*xrtmag_dB < uci_stats->pucch0_thres)
no_conf=true;
}
- gNB->bad_pucch += no_conf;
// first bit of bitmap for sr presence and second bit for acknack presence
uci_pdu->pduBitmap = pucch_pdu->sr_flag | ((pucch_pdu->bit_len_harq>0)<<1);
uci_pdu->pucch_format = 0; // format 0
uci_pdu->rnti = pucch_pdu->rnti;
uci_pdu->ul_cqi = cqi;
uci_pdu->timing_advance = 0xffff; // currently not valid
- uci_pdu->rssi = 1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(signal_energy_nodc(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset],12)));
+ uci_pdu->rssi = 1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(signal_energy_nodc(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset[0]],12)));
+
+ uci_stats->pucch0_n00 = gNB->measurements.n0_subband_power_tot_dB[prb_offset[0]];
+ uci_stats->pucch0_n01 = gNB->measurements.n0_subband_power_tot_dB[prb_offset[1]];
if (pucch_pdu->bit_len_harq==0) {
uci_pdu->harq = NULL;
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
- uci_pdu->sr->sr_confidence_level = (xrtmag_dB<(13+gNB->measurements.n0_power_tot_dB)) ? 1 : 0;
+ uci_pdu->sr->sr_confidence_level = no_conf ? 1 : 0;
+ uci_stats->pucch0_sr_trials++;
if (xrtmag_dB>(gNB->measurements.n0_power_tot_dB)) {
uci_pdu->sr->sr_indication = 1;
+ uci_stats->pucch0_positive_SR++;
} else {
uci_pdu->sr->sr_indication = 0;
}
@@ -360,16 +383,19 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
else if (pucch_pdu->bit_len_harq==1) {
uci_pdu->harq = calloc(1,sizeof(*uci_pdu->harq));
uci_pdu->harq->num_harq = 1;
- uci_pdu->harq->harq_confidence_level = (no_conf) ? 1 : 0;
+ uci_pdu->harq->harq_confidence_level = no_conf ? 1 : 0;
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(1);
uci_pdu->harq->harq_list[0].harq_value = index&0x01;
- LOG_I(PHY, "Slot %d HARQ value %d with confidence level (0 is good, 1 is bad) %d xrt_mag %d\n",
- slot,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dB);
+ LOG_D(PHY, "Slot %d HARQ value %d with confidence level (0 is good, 1 is bad) %d xrt_mag %d n0 %d pucch0_thres %d\n",
+ slot,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dB,max_n0,uci_stats->pucch0_thres);
if (pucch_pdu->sr_flag == 1) {
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
uci_pdu->sr->sr_indication = (index>1) ? 1 : 0;
- uci_pdu->sr->sr_confidence_level = (no_conf) ? 1 : 0;
+ uci_pdu->sr->sr_confidence_level = no_conf ? 1 : 0;
+ uci_stats->pucch0_positive_SR++;
}
+ uci_stats->pucch01_trials++;
+
}
else {
uci_pdu->harq = calloc(1,sizeof(*uci_pdu->harq));
@@ -1612,4 +1638,34 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
uci_pdu->pduBitmap|=8;
}
}
-
+
+
+void dump_uci_stats(FILE *fd,PHY_VARS_gNB *gNB,int frame) {
+
+ int strpos=0;
+ char output[16384];
+
+ for (int i=0;iuci_stats[i].rnti>0) {
+ NR_gNB_UCI_STATS_t *uci_stats = &gNB->uci_stats[i];
+ if (uci_stats->pucch0_sr_trials > 0)
+ strpos+=sprintf(output+strpos,"UCI %d RNTI %x: pucch0_sr_trials %d, pucch0_n00 %d dB, pucch0_n01 %d dB, pucch0_sr_thres %d dB, current pucch1_stat0 %d dB, current pucch1_stat1 %d dB, positive SR count %d\n",
+ i,uci_stats->rnti,uci_stats->pucch0_sr_trials,uci_stats->pucch0_n00,uci_stats->pucch0_n01,uci_stats->pucch0_sr_thres,dB_fixed(uci_stats->current_pucch0_sr_stat0),dB_fixed(uci_stats->current_pucch0_sr_stat1),uci_stats->pucch0_positive_SR);
+ if (uci_stats->pucch01_trials > 0)
+ strpos+=sprintf(output+strpos,"UCI %d RNTI %x: pucch01_trials %d, pucch0_n00 %d dB, pucch0_n01 %d dB, pucch0_thres %d dB, current pucch0_stat0 %d dB, current pucch1_stat1 %d dB, pucch01_DTX %d\n",
+ i,uci_stats->rnti,uci_stats->pucch01_trials,uci_stats->pucch0_n01,uci_stats->pucch0_n01,uci_stats->pucch0_thres,dB_fixed(uci_stats->current_pucch0_stat0),dB_fixed(uci_stats->current_pucch0_stat1),uci_stats->pucch01_DTX);
+
+ if (uci_stats->pucch02_trials > 0)
+ strpos+=sprintf(output+strpos,"UCI %d RNTI %x: pucch01_trials %d, pucch0_n00 %d dB, pucch0_n01 %d dB, pucch0_thres %d dB, current pucch0_stat0 %d dB, current pucch0_stat1 %d dB, pucch01_DTX %d\n",
+ i,uci_stats->rnti,uci_stats->pucch02_trials,uci_stats->pucch0_n00,uci_stats->pucch0_n01,uci_stats->pucch0_thres,dB_fixed(uci_stats->current_pucch0_stat0),dB_fixed(uci_stats->current_pucch0_stat1),uci_stats->pucch02_DTX);
+
+ if (uci_stats->pucch2_trials > 0)
+ strpos+=sprintf(output+strpos,"UCI %d RNTI %x: pucch2_trials %d, pucch2_DTX %d\n",
+ i,uci_stats->rnti,
+ uci_stats->pucch2_trials,
+ uci_stats->pucch2_DTX);
+ }
+ }
+ if (fd) fprintf(fd,"%s",output);
+ else printf("%s",output);
+}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 139635bf62..58eb071346 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -588,10 +588,10 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
ret = no_iteration_ldpc;
}
else {
- LOG_D(PHY,"CRC NOT OK\n\033[0m");
+ LOG_D(PHY,"CRC NOT OK\n\033[0m"); /*
ret = 1 + dlsch->max_ldpc_iterations;
dump_nrdlsch(phy_vars_ue,0,nr_slot_rx,&E,0,0);
- exit(-1);
+ exit(-1);*/
}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index 133bd50922..7c2db4f3c0 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -52,7 +52,7 @@
* set as command line argument, see lte-softmodem.c
* default value: 0
*/
-int16_t nr_dlsch_demod_shift = 0;
+int32_t nr_dlsch_demod_shift = 0;
//int16_t interf_unaw_shift = 13;
//#define DEBUG_HARQ
diff --git a/openair1/PHY/TOOLS/calibration_scope.c b/openair1/PHY/TOOLS/calibration_scope.c
new file mode 100644
index 0000000000..da1acb5175
--- /dev/null
+++ b/openair1/PHY/TOOLS/calibration_scope.c
@@ -0,0 +1,387 @@
+#include
+#include
+#include "executables/softmodem-common.h"
+#include "executables/nr-softmodem-common.h"
+#include
+#include
+
+#define TPUT_WINDOW_LENGTH 100
+#define ScaleZone 4
+
+const FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW};
+const FL_COLOR water_colors[4] = {FL_BLUE,FL_GREEN,FL_YELLOW,FL_RED};
+
+typedef struct {
+ int16_t r;
+ int16_t i;
+} scopeSample_t;
+#define SquaredNorm(VaR) ((VaR).r*(VaR).r+(VaR).i*(VaR).i)
+typedef struct {
+ void ** samplesRx;
+ openair0_device *rfdevice;
+} calibData_t;
+
+typedef struct OAIgraph {
+ FL_OBJECT *graph;
+ FL_OBJECT *text;
+ float maxX;
+ float maxY;
+ float minX;
+ float minY;
+ int x;
+ int y;
+ int w;
+ int h;
+ int waterFallh;
+ double *waterFallAvg;
+ boolean_t initDone;
+ int iteration;
+ void (*funct) (struct OAIgraph *graph, calibData_t *);
+} OAIgraph_t;
+
+
+/* Forms and Objects */
+typedef struct {
+ calibData_t * context;
+ FL_FORM *phy_scope;
+ OAIgraph_t graph[20];
+ FL_OBJECT *button_0;
+} OAI_phy_scope_t;
+
+typedef struct {
+ FL_FORM *stats_form;
+ void *vdata;
+ char *cdata;
+ long ldata;
+ FL_OBJECT *stats_text;
+ FL_OBJECT *stats_button;
+} FD_stats_form;
+
+static void drawsymbol(FL_OBJECT *obj, int id,
+ FL_POINT *p, int n, int w, int h) {
+ fl_points( p, n, FL_YELLOW);
+}
+
+#define WATERFALL 10000
+
+static void commonGraph(OAIgraph_t *graph, int type, FL_Coord x, FL_Coord y, FL_Coord w, FL_Coord h, const char *label, FL_COLOR pointColor) {
+ if (type==WATERFALL) {
+ graph->waterFallh=h-15;
+ graph->waterFallAvg=malloc(sizeof(*graph->waterFallAvg) * graph->waterFallh);
+
+ for (int i=0; i< graph->waterFallh; i++)
+ graph->waterFallAvg[i]=0;
+
+ graph->graph=fl_add_canvas(FL_NORMAL_CANVAS, x, y, w, graph->waterFallh, label);
+ graph->text=fl_add_text(FL_NORMAL_TEXT, x, y+graph->waterFallh, w, 15, label);
+ fl_set_object_lcolor(graph->text,FL_WHITE);
+ fl_set_object_color(graph->text, FL_BLACK, FL_BLACK);
+ fl_set_object_lalign(graph->text, FL_ALIGN_CENTER );
+ } else {
+ graph->graph=fl_add_xyplot(type, x, y, w, h, label);
+ fl_set_object_lcolor(graph->graph, FL_WHITE ); // Label color
+ fl_set_object_color(graph->graph, FL_BLACK, pointColor);
+
+ for (int i=0; i< FL_MAX_XYPLOTOVERLAY; i++)
+ fl_set_xyplot_symbol(graph->graph, i, drawsymbol);
+ }
+
+ graph->x=x;
+ graph->y=y;
+ graph->w=w;
+ graph->h=h;
+ graph->maxX=0;
+ graph->maxY=0;
+ graph->minX=0;
+ graph->minY=0;
+ graph->initDone=false;
+ graph->iteration=0;
+}
+
+static OAIgraph_t calibrationCommonGraph( void (*funct) (OAIgraph_t *graph, calibData_t *context),
+ int type, FL_Coord x, FL_Coord y, FL_Coord w, FL_Coord h, const char *label, FL_COLOR pointColor) {
+ OAIgraph_t graph;
+ commonGraph(&graph, type, x, y, w, h, label, pointColor);
+ graph.funct=funct;
+ return graph;
+}
+
+
+static void setRange(OAIgraph_t *graph, float minX, float maxX, float minY, float maxY) {
+ if ( maxX > graph->maxX || minX < graph->minX ||
+ abs(maxX-graph->maxX)>abs(graph->maxX)/2 ||
+ abs(maxX-graph->maxX)>abs(graph->maxX)/2 ) {
+ graph->maxX/=2;
+ graph->minX/=2;
+ graph->maxX=max(graph->maxX,maxX);
+ graph->minX=min(graph->minX,minX);
+ fl_set_xyplot_xbounds(graph->graph, graph->minX*1.2, graph->maxX*1.2);
+ }
+
+ if ( maxY > graph->maxY || minY < graph->minY ||
+ abs(maxY-graph->maxY)>abs(graph->maxY)/2 ||
+ abs(maxY-graph->maxY)>abs(graph->maxY)/2 ) {
+ graph->maxY/=2;
+ graph->minY/=2;
+ graph->maxY=max(graph->maxY,maxY);
+ graph->minY=min(graph->minY,minY);
+ fl_set_xyplot_ybounds(graph->graph, graph->minY*1.2, graph->maxY*1.2);
+ }
+}
+
+static void oai_xygraph_getbuff(OAIgraph_t *graph, float **x, float **y, int len, int layer) {
+ float *old_x;
+ float *old_y;
+ int old_len=-1;
+
+ if (graph->iteration >1)
+ fl_get_xyplot_data_pointer(graph->graph, layer, &old_x, &old_y, &old_len);
+
+ if (old_len != len) {
+ LOG_W(HW,"allocating graph of %d scope\n", len);
+ float values[len];
+ float time[len];
+
+ // make time in case we will use it
+ for (int i=0; igraph,time,values,len,"","","");
+ else
+ fl_add_xyplot_overlay(graph->graph,layer,time,values,len,rx_antenna_colors[layer]);
+
+ fl_get_xyplot_data_pointer(graph->graph, layer, &old_x, &old_y, &old_len);
+ AssertFatal(old_len==len,"");
+ }
+
+ *x=old_x;
+ *y=old_y;
+}
+
+static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int layer, boolean_t NoAutoScale) {
+ fl_redraw_object(graph->graph);
+
+ if ( NoAutoScale && graph->iteration%NoAutoScale == 0) {
+ float maxX=0, maxY=0, minX=0, minY=0;
+
+ for (int k=0; kiteration++;
+}
+
+static void genericWaterFall (OAIgraph_t *graph, scopeSample_t *values, const int datasize, const int divisions, const char *label) {
+ if ( values == NULL )
+ return;
+ fl_winset(FL_ObjWin(graph->graph));
+ const int samplesPerPixel=datasize/graph->w;
+ int displayPart=graph->waterFallh-ScaleZone;
+ int row=graph->iteration%displayPart;
+ double avg=0;
+
+ for (int i=0; i < displayPart; i++)
+ avg+=graph->waterFallAvg[i];
+
+ avg/=displayPart;
+ graph->waterFallAvg[row]=0;
+
+ for (int pix=0; pixw; pix++) {
+ scopeSample_t *end=values+(pix+1)*samplesPerPixel;
+ end-=2;
+ AssertFatal(end <= values+datasize,"diff : %ld", end-values+datasize);
+ double val=0;
+
+ for (scopeSample_t *s=values+(pix)*samplesPerPixel;
+ s waterFallAvg[row]+=val/graph->w;
+ int col=0;
+
+ if (val > avg*2 )
+ col=1;
+
+ if (val > avg*10 )
+ col=2;
+
+ if (val > avg*100 )
+ col=3;
+
+ fl_point(pix, graph->iteration%displayPart, water_colors[col]);
+ }
+
+ if (graph->initDone==false) {
+ for ( int i=0; i < graph->waterFallh; i++ )
+ for ( int j = 0 ; j < graph->w ; j++ )
+ fl_point(j, i, FL_BLACK);
+
+ for ( int i=1; iwaterFallh; j++)
+ fl_point(i*(graph->w/divisions),j, FL_WHITE);
+
+ graph->initDone=true;
+ }
+
+ fl_set_object_label_f(graph->text, "%s, avg I/Q pow: %4.1f", label, sqrt(avg));
+ graph->iteration++;
+}
+
+static void genericPowerPerAntena(OAIgraph_t *graph, const int nb_ant, const scopeSample_t **data, const int len) {
+ float *values, *time;
+ oai_xygraph_getbuff(graph, &time, &values, len, 0);
+
+ for (int ant=0; antsamplesRx[0],
+ 0, 0,
+ "X axis:one frame in time");
+}
+static void gNBfreqWaterFall (OAIgraph_t *graph, calibData_t *context) {
+ //use 1st antenna
+ genericWaterFall(graph, (scopeSample_t *)context->samplesRx[0],
+ 0, 0,
+ "X axis:one frame in time");
+}
+static void timeResponse (OAIgraph_t *graph, calibData_t *context) {
+ #if 0
+ const int len=2*phy_vars_gnb->frame_parms.ofdm_symbol_size;
+ float *values, *time;
+ oai_xygraph_getbuff(graph, &time, &values, len, 0);
+ const int ant=0; // display antenna 0 for each UE
+
+ for (int ue=0; uepusch_vars[ue]->ul_ch_estimates_time[ant];
+
+ if (data != NULL) {
+ for (int i=0; iframe_parms;
+ int sz=frame_parms->N_RB_UL*12*frame_parms->symbols_per_slot;
+
+ for (int ue=0; uepusch_vars[ue]->rxdataF_comp[0];
+ float *I, *Q;
+ oai_xygraph_getbuff(graph, &I, &Q, sz, ue);
+
+ if (pusch_comp) {
+ for (int k=0; kcontext=context;
+ // Define form
+ fdui->phy_scope = fl_bgn_form( FL_NO_BOX, 800, 800 );
+ // This the whole UI box
+ obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 800, "" );
+ fl_set_object_color( obj, FL_BLACK, FL_WHITE );
+ int curY=0,x,y,w,h;
+ // Received signal
+ fdui->graph[0] = calibrationCommonGraph( gNBWaterFall, WATERFALL, 0, curY, 400, 100,
+ "Received Signal (Time-Domain, one frame)", FL_RED );
+
+ // Time-domain channel response
+ //fdui->graph[1] = calibrationCommonGraph( timeResponse, FL_NORMAL_XYPLOT, 410, curY, 400, 100, "SRS Frequency Response (samples, abs)", FL_RED );
+ fl_get_object_bbox(fdui->graph[0].graph,&x, &y,&w, &h);
+ curY+=h;
+ // Frequency-domain channel response
+ fdui->graph[1] = calibrationCommonGraph( gNBfreqWaterFall, WATERFALL, 0, curY, 800, 100,
+ "Channel Frequency domain (RE, one frame)", FL_RED );
+ fl_get_object_bbox(fdui->graph[1].graph,&x, &y,&w, &h);
+ curY+=h+20;
+ // LLR of PUSCH
+ //fdui->graph[3] = calibrationCommonGraph( puschLLR, FL_POINTS_XYPLOT, 0, curY, 500, 200, "PUSCH Log-Likelihood Ratios (LLR, mag)", FL_YELLOW );
+ // I/Q PUSCH comp
+ fdui->graph[2] = calibrationCommonGraph( puschIQ, FL_POINTS_XYPLOT, 500, curY, 300, 200,
+ "PUSCH I/Q of MF Output", FL_YELLOW );
+ fl_get_object_bbox(fdui->graph[2].graph,&x, &y,&w, &h);
+ curY+=h;
+ //fl_get_object_bbox(fdui->graph[6].graph,&x, &y,&w, &h);
+ curY+=h;
+ fdui->graph[3].graph=NULL;
+ fl_end_form( );
+ fdui->phy_scope->fdui = fdui;
+ fl_show_form (fdui->phy_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, "LTE UL SCOPE gNB");
+ return fdui;
+}
+
+void calibrationScope(OAI_phy_scope_t *form) {
+ int i=0;
+
+ while (form->graph[i].graph) {
+ form->graph[i].funct(form->graph+i, form->context);
+ i++;
+ }
+
+ //fl_check_forms();
+}
+
+static void *scopeThread(void *arg) {
+ calibData_t * context = (calibData_t *)arg;
+ size_t stksize=0;
+ pthread_attr_t atr;
+ pthread_attr_init(&atr);
+ pthread_attr_getstacksize(&atr, &stksize);
+ pthread_attr_setstacksize(&atr,32*1024*1024 );
+ sleep(3); // no clean interthread barriers
+ int fl_argc=1;
+ char *name="Calibration-scope";
+ fl_initialize (&fl_argc, &name, NULL, 0, 0);
+ OAI_phy_scope_t *form = createScopeCalibration(context);
+
+ while (!oai_exit) {
+ calibrationScope(form);
+ usleep(99*1000);
+ }
+
+ return NULL;
+}
+
+void CalibrationInitScope(void ** samplesRx,openair0_device *rfdevice) {
+ pthread_t forms_thread;
+ calibData_t * tmp=(calibData_t *) malloc(sizeof(*tmp));
+ tmp->samplesRx=samplesRx;
+ tmp->rfdevice=rfdevice;
+ threadCreate(&forms_thread, scopeThread, (void*) tmp, "scope", -1, OAI_PRIORITY_RT_LOW);
+}
diff --git a/openair1/PHY/TOOLS/calibration_scope.h b/openair1/PHY/TOOLS/calibration_scope.h
new file mode 100644
index 0000000000..052a1a6b6e
--- /dev/null
+++ b/openair1/PHY/TOOLS/calibration_scope.h
@@ -0,0 +1,5 @@
+#ifndef CALIB_SCOPE_H
+#define CALIB_SCOPE_H
+
+void CalibrationInitScope(void ** samplesRx,openair0_device *rfdevice);
+#endif
diff --git a/openair1/PHY/TOOLS/calibration_test.c b/openair1/PHY/TOOLS/calibration_test.c
new file mode 100644
index 0000000000..53baf83d41
--- /dev/null
+++ b/openair1/PHY/TOOLS/calibration_test.c
@@ -0,0 +1,340 @@
+#include
+#include
+#include
+#include
+#include
+
+
+volatile int oai_exit=false;
+unsigned int mmapped_dma=0;
+int single_thread_flag;
+uint32_t timing_advance;
+int8_t threequarter_fs;
+uint64_t downlink_frequency[MAX_NUM_CCs][4];
+int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
+int opp_enabled;
+static double snr_dB=20;
+THREAD_STRUCT thread_struct;
+uint32_t target_ul_mcs = 9;
+uint32_t target_dl_mcs = 9;
+uint64_t dlsch_slot_bitmap = (1<<1);
+uint64_t ulsch_slot_bitmap = (1<<8);
+uint32_t target_ul_bw = 50;
+uint32_t target_dl_bw = 50;
+#include
+
+int read_recplayconfig(recplay_conf_t **recplay_conf, recplay_state_t **recplay_state) {return 0;}
+void nfapi_setmode(nfapi_mode_t nfapi_mode) {}
+void set_taus_seed(unsigned int seed_init){};
+
+int main(int argc, char **argv) {
+ ///static configuration for NR at the moment
+ if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == NULL) {
+ exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
+ }
+ set_softmodem_sighandler();
+ setvbuf(stdout, NULL, _IONBF, 0);
+ setvbuf(stderr, NULL, _IONBF, 0);
+ logInit();
+ paramdef_t cmdline_params[] = CMDLINE_PARAMS_DESC_GNB ;
+
+ CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP);
+ get_common_options(SOFTMODEM_GNB_BIT );
+ config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
+ CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP);
+ configure_linux();
+
+
+ int N_RB=50;
+ int subCarrierFreq=30e3;
+ int sampling_rate=30.72e6;
+ int DFT=2048;
+ int TxAdvanceInDFTSize=12;
+ int antennas=1;
+ uint64_t freq=3619.200e6;
+ int rxGain=90;
+ int txGain=90;
+ int filterBand=40e6;
+ char * usrp_addrs="type=b200";
+
+ openair0_config_t openair0_cfg= {
+ //! Module ID for this configuration
+ .Mod_id=0,
+ //! device log level
+ .log_level=0,
+ //! duplexing mode
+ .duplex_mode=0,
+ //! number of downlink resource blocks
+ .num_rb_dl=N_RB,
+ //! number of samples per frame
+ .samples_per_frame=0,
+ //! the sample rate for both transmit and receive.
+ .sample_rate=sampling_rate,
+ //device is doing mmapped DMA transfers
+ .mmapped_dma=0,
+ //! offset in samples between TX and RX paths
+ .tx_sample_advance=0,
+ //! samples per packet on the fronthaul interface
+ .samples_per_packet=1024,
+ //! number of RX channels (=RX antennas)
+ .rx_num_channels=antennas,
+ //! number of TX channels (=TX antennas)
+ .tx_num_channels=antennas,
+ //! \brief Center frequency in Hz for RX.
+ //! index: [0..rx_num_channels[
+ .rx_freq={freq,freq,freq,freq},
+ //! \brief Center frequency in Hz for TX.
+ //! index: [0..rx_num_channels[ !!! see lte-ue.c:427 FIXME iterates over rx_num_channels
+ .tx_freq={freq,freq,freq,freq},
+ //! \brief memory
+ //! \brief Pointer to Calibration table for RX gains
+ .rx_gain_calib_table=NULL,
+ //! mode for rxgain (ExpressMIMO2)
+ .rxg_mode={0},
+ //! \brief Gain for RX in dB.
+ //! index: [0..rx_num_channels]
+ .rx_gain={rxGain,rxGain,rxGain,rxGain},
+ //! \brief Gain offset (for calibration) in dB
+ //! index: [0..rx_num_channels]
+ .rx_gain_offset={0},
+ //! gain for TX in dB
+ .tx_gain={txGain,txGain,txGain,txGain},
+ //! RX bandwidth in Hz
+ .rx_bw=filterBand,
+ //! TX bandwidth in Hz
+ .tx_bw=filterBand,
+ //! clock source
+ .clock_source=external,//internal gpsdo external
+ //! timing_source
+ .time_source=internal, //internal gpsdo external
+ //! Manual SDR IP address
+ //#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
+ .sdr_addrs=usrp_addrs,
+ //! Auto calibration flag
+ .autocal={0},
+ //! rf devices work with x bits iqs when oai have its own iq format
+ //! the two following parameters are used to convert iqs
+ .iq_txshift=0,
+ .iq_rxrescale=0,
+ //! Configuration file for LMS7002M
+ .configFilename="",
+ //! remote IP/MAC addr for Ethernet interface
+ .remote_addr="",
+ //! remote port number for Ethernet interface
+ .remote_port=0,
+ //! local IP/MAC addr for Ethernet interface (eNB/BBU, UE)
+ .my_addr=0,
+ //! local port number for Ethernet interface (eNB/BBU, UE)
+ .my_port=0,
+ //! record player configuration, definition in record_player.h
+ .recplay_mode=0,
+ .recplay_conf=NULL,
+ //! number of samples per tti
+ .samples_per_tti=0,
+ //! check for threequarter sampling rate
+ .threequarter_fs=0,
+ };
+ //-----------------------
+ openair0_device rfdevice= {
+ /*!tx write thread*/
+ //.write_thread={0},
+ /*!brief Module ID of this device */
+ .Mod_id=0,
+ /*!brief Component Carrier ID of this device */
+ .CC_id=0,
+ /*!brief Type of this device */
+ .type=NONE_DEV,
+ /*!brief Transport protocol type that the device supports (in case I/Q samples need to be transported) */
+ .transp_type=NONE_TP,
+ /*!brief Type of the device's host (RAU/RRU) */
+ .host_type=MIN_HOST_TYPE,
+ /* !brief RF frontend parameters set by application */
+ .openair0_cfg=NULL, //set by device_init
+ /* !brief ETH params set by application */
+ .eth_params=NULL,
+ //! record player data, definition in record_player.h
+ .recplay_state=NULL,
+ /* !brief Indicates if device already initialized */
+ .is_init=0,
+ /*!brief Can be used by driver to hold internal structure*/
+ .priv=NULL,
+ /* Functions API, which are called by the application*/
+ /*! \brief Called to start the transceiver. Return 0 if OK, < 0 if error
+ @param device pointer to the device structure specific to the RF hardware target
+ */
+ .trx_start_func=NULL,
+
+ /*! \brief Called to configure the device
+ @param device pointer to the device structure specific to the RF hardware target
+ */
+ .trx_config_func=NULL,
+
+ /*! \brief Called to send a request message between RAU-RRU on control port
+ @param device pointer to the device structure specific to the RF hardware target
+ @param msg pointer to the message structure passed between RAU-RRU
+ @param msg_len length of the message
+ */
+ .trx_ctlsend_func=NULL,
+
+ /*! \brief Called to receive a reply message between RAU-RRU on control port
+ @param device pointer to the device structure specific to the RF hardware target
+ @param msg pointer to the message structure passed between RAU-RRU
+ @param msg_len length of the message
+ */
+ .trx_ctlrecv_func=NULL,
+
+ /*! \brief Called to send samples to the RF target
+ @param device pointer to the device structure specific to the RF hardware target
+ @param timestamp The timestamp at whicch the first sample MUST be sent
+ @param buff Buffer which holds the samples (2 dimensional)
+ @param nsamps number of samples to be sent
+ @param number of antennas
+ @param flags flags must be set to TRUE if timestamp parameter needs to be applied
+ */
+ .trx_write_func=NULL,
+
+ /*! \brief Called to send samples to the RF target
+ @param device pointer to the device structure specific to the RF hardware target
+ @param timestamp The timestamp at whicch the first sample MUST be sent
+ @param buff Buffer which holds the samples (1 dimensional)
+ @param nsamps number of samples to be sent
+ @param antenna_id index of the antenna if the device has multiple anteannas
+ @param flags flags must be set to TRUE if timestamp parameter needs to be applied
+ */
+ .trx_write_func2=NULL,
+
+ /*! \brief Receive samples from hardware.
+ * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for
+ * the first channel. *ptimestamp is the time at which the first sample
+ * was received.
+ * \param device the hardware to use
+ * \param[out] ptimestamp the time at which the first sample was received.
+ * \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps.
+ * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte.
+ * \param num_antennas number of antennas from which to receive samples
+ * \returns the number of sample read
+ */
+
+ .trx_read_func=NULL,
+
+ /*! \brief Receive samples from hardware, this version provides a single antenna at a time and returns.
+ * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for
+ * the first channel. *ptimestamp is the time at which the first sample
+ * was received.
+ * \param device the hardware to use
+ * \param[out] ptimestamp the time at which the first sample was received.
+ * \param[out] buff A pointers to a buffer for received samples. The buffer must be large enough to hold the number of samples \ref nsamps.
+ * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte.
+ * \param antenna_id Index of antenna from which samples were received
+ * \returns the number of sample read
+ */
+ .trx_read_func2=NULL,
+
+ /*! \brief print the device statistics
+ * \param device the hardware to use
+ * \returns 0 on success
+ */
+ /*! \brief print the device statistics
+ * \param device the hardware to use
+ * \returns 0 on success
+ */
+ .trx_get_stats_func=NULL,
+
+ /*! \brief Reset device statistics
+ * \param device the hardware to use
+ * \returns 0 in success
+ */
+ .trx_reset_stats_func=NULL,
+
+ /*! \brief Terminate operation of the transceiver -- free all associated resources
+ * \param device the hardware to use
+ */
+ .trx_end_func=NULL,
+
+ /*! \brief Stop operation of the transceiver
+ */
+ .trx_stop_func=NULL,
+
+ /* Functions API related to UE*/
+
+ /*! \brief Set RX feaquencies
+ * \param device the hardware to use
+ * \param openair0_cfg RF frontend parameters set by application
+ * \param exmimo_dump_config dump EXMIMO configuration
+ * \returns 0 in success
+ */
+ .trx_set_freq_func=NULL,
+
+ /*! \brief Set gains
+ * \param device the hardware to use
+ * \param openair0_cfg RF frontend parameters set by application
+ * \returns 0 in success
+ */
+ .trx_set_gains_func=NULL,
+
+ /*! \brief RRU Configuration callback
+ * \param idx RU index
+ * \param arg pointer to capabilities or configuration
+ */
+ .configure_rru=NULL,
+ /*! \brief Pointer to generic RRU private information
+ */
+ .thirdparty_priv=NULL,
+ .thirdparty_init=NULL,
+ /*! \brief Callback for Third-party RRU Cleanup routine
+ \param device the hardware configuration to use
+ */
+ .thirdparty_cleanup=NULL,
+
+ /*! \brief Callback for Third-party start streaming routine
+ \param device the hardware configuration to use
+ */
+ .thirdparty_startstreaming=NULL,
+
+ /*! \brief RRU Configuration callback
+ * \param idx RU index
+ * \param arg pointer to capabilities or configuration
+ */
+ .trx_write_init=NULL,
+ /* \brief Get internal parameter
+ * \param id parameter to get
+ * \return a pointer to the parameter
+ */
+ .get_internal_parameter=NULL,
+ };
+
+ openair0_device_load(&rfdevice,&openair0_cfg);
+
+ void ** samplesRx = (void **)malloc16(antennas* sizeof(struct complex16 *) );
+ void ** samplesTx = (void **)malloc16(antennas* sizeof(struct complex16 *) );
+
+ int fd=open(getenv("rftestInputFile"),O_RDONLY);
+ AssertFatal(fd>=0,"%s",strerror(errno));
+
+ for (int i=0; ilte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
- if (otg_enabled) {
+ if (0) {
fl_set_button(form_enb[CC_id][UE_id]->button_0,1);
fl_set_object_label(form_enb[CC_id][UE_id]->button_0,"DL Traffic ON");
} else {
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c
index acd22bc78d..d28bb1b8ba 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.c
+++ b/openair1/PHY/TOOLS/lte_phy_scope.c
@@ -27,7 +27,6 @@
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
#define TPUT_WINDOW_LENGTH 100
-int otg_enabled;
FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW};
@@ -57,11 +56,9 @@ static void ia_receiver_on_off( FL_OBJECT *button, long arg) {
static void dl_traffic_on_off( FL_OBJECT *button, long arg) {
if (fl_get_button(button)) {
fl_set_object_label(button, "DL Traffic ON");
- otg_enabled = 1;
fl_set_object_color(button, FL_GREEN, FL_GREEN);
} else {
fl_set_object_label(button, "DL Traffic OFF");
- otg_enabled = 0;
fl_set_object_color(button, FL_RED, FL_RED);
}
}
@@ -131,7 +128,6 @@ FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void ) {
fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 20, 600, 240, 40, "" );
fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
fl_set_button(fdui->button_0,0);
- otg_enabled = 0;
fl_set_object_label(fdui->button_0, "DL Traffic OFF");
fl_set_object_color(fdui->button_0, FL_RED, FL_RED);
fl_set_object_callback(fdui->button_0, dl_traffic_on_off, 0 );
@@ -153,7 +149,6 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
int16_t **chest_t;
int16_t **chest_f;
int16_t *pusch_llr;
- int32_t *pusch_comp;
int32_t *pucch1_comp;
int32_t *pucch1_thres;
int32_t *pucch1ab_comp;
@@ -184,12 +179,11 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
chest_f_abs = (float *) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float));
llr = (float *) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero
bit = malloc(coded_bits_per_codeword*sizeof(float));
-
- rxsig_t = (int16_t**) phy_vars_enb->RU_list[0]->common.rxdata;
+ rxsig_t = (int16_t **) phy_vars_enb->RU_list[0]->common.rxdata;
chest_t = (int16_t **) phy_vars_enb->srs_vars[UE_id].srs_ch_estimates;
chest_f = (int16_t **) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates;
pusch_llr = (int16_t *) phy_vars_enb->pusch_vars[UE_id]->llr;
- pusch_comp = (int32_t *) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[0];
+ int16_t *pusch_comp= (int16_t *) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[0];
pucch1_comp = (int32_t *) phy_vars_enb->pucch1_stats[UE_id];
pucch1_thres = (int32_t *) phy_vars_enb->pucch1_stats_thres[UE_id];
pucch1ab_comp = (int32_t *) phy_vars_enb->pucch1ab_stats[UE_id];
diff --git a/openair1/PHY/TOOLS/lte_phy_scope_tm4.c b/openair1/PHY/TOOLS/lte_phy_scope_tm4.c
index d44f8e325b..a9caf8713b 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope_tm4.c
+++ b/openair1/PHY/TOOLS/lte_phy_scope_tm4.c
@@ -32,8 +32,7 @@ float tput_time_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
float tput_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
float tput_ue_max[NUMBER_OF_UE_MAX] = {0};
-static void ia_receiver_on_off( FL_OBJECT *button, long arg)
-{
+static void ia_receiver_on_off( FL_OBJECT *button, long arg) {
if (fl_get_button(button)) {
fl_set_object_label(button, "IA Receiver ON");
// PHY_vars_UE_g[0][0]->use_ia_receiver = 1;
@@ -45,8 +44,7 @@ static void ia_receiver_on_off( FL_OBJECT *button, long arg)
}
}
-static void dl_traffic_on_off( FL_OBJECT *button, long arg)
-{
+static void dl_traffic_on_off( FL_OBJECT *button, long arg) {
if (fl_get_button(button)) {
fl_set_object_label(button, "DL Traffic ON");
otg_enabled = 1;
@@ -58,9 +56,7 @@ static void dl_traffic_on_off( FL_OBJECT *button, long arg)
}
}
-static void sic_receiver_on_off( FL_OBJECT *button, long arg)
-{
-
+static void sic_receiver_on_off( FL_OBJECT *button, long arg) {
if (fl_get_button(button)) {
fl_set_object_label(button, "SIC Receiver ON");
use_sic_receiver = 1;
@@ -72,8 +68,7 @@ static void sic_receiver_on_off( FL_OBJECT *button, long arg)
}
}
-FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void )
-{
+FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void ) {
FL_OBJECT *obj;
FD_lte_phy_scope_enb *fdui = fl_malloc( sizeof *fdui );
// Define form
@@ -145,8 +140,7 @@ FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void )
void phy_scope_eNB(FD_lte_phy_scope_enb *form,
PHY_VARS_eNB *phy_vars_enb,
- int UE_id)
-{
+ int UE_id) {
int eNB_id = 0;
int i,i2,arx,atx,ind,k;
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->frame_parms;
@@ -176,24 +170,27 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
int coded_bits_per_codeword = 0;
uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2
int mcs = 0;
+
// choose max MCS to compute coded_bits_per_codeword
if (phy_vars_enb->ulsch[UE_id]!=NULL) {
for (harq_pid=0; harq_pid<3; harq_pid++) {
mcs = cmax(phy_vars_enb->ulsch[UE_id]->harq_processes[harq_pid]->mcs,mcs);
}
}
+
coded_bits_per_codeword = frame_parms->N_RB_UL*12*get_Qm(mcs)*frame_parms->symbols_per_tti;
- chest_f_abs = (float*) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float));
- llr = (float*) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero
+ chest_f_abs = (float *) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float));
+ llr = (float *) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero
bit = malloc(coded_bits_per_codeword*sizeof(float));
- rxsig_t = (int16_t**) phy_vars_enb->common_vars.rxdata[eNB_id];
- chest_t = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id];
- chest_f = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates[eNB_id];
- pusch_llr = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->llr;
- pusch_comp = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[eNB_id][0];
- pucch1_comp = (int32_t*) phy_vars_enb->pucch1_stats[UE_id];
- pucch1_thres = (int32_t*) phy_vars_enb->pucch1_stats_thres[UE_id];
- pucch1ab_comp = (int32_t*) phy_vars_enb->pucch1ab_stats[UE_id];
+ rxsig_t = (int16_t **) phy_vars_enb->common_vars.rxdata[eNB_id];
+ chest_t = (int16_t **) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id];
+ chest_f = (int16_t **) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates[eNB_id];
+ pusch_llr = (int16_t *) phy_vars_enb->pusch_vars[UE_id]->llr;
+ pusch_comp = (int16_t *) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[eNB_id][0];
+ pucch1_comp = (int32_t *) phy_vars_enb->pucch1_stats[UE_id];
+ pucch1_thres = (int32_t *) phy_vars_enb->pucch1_stats_thres[UE_id];
+ pucch1ab_comp = (int32_t *) phy_vars_enb->pucch1ab_stats[UE_id];
+
// Received signal in time domain of receive antenna 0
if (rxsig_t != NULL) {
if (rxsig_t[0] != NULL) {
@@ -201,48 +198,61 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
rxsig_t_dB[0][i] = 10*log10(1.0+(float) ((rxsig_t[0][2*i])*(rxsig_t[0][2*i])+(rxsig_t[0][2*i+1])*(rxsig_t[0][2*i+1])));
time[i] = (float) i;
}
+
fl_set_xyplot_data(form->rxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","","");
}
+
for (arx=1; arxrxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]);
}
}
}
+
// Channel Impulse Response
if (chest_t != NULL) {
ymax = 0;
+
if (chest_t[0] !=NULL) {
for (i=0; i<(frame_parms->ofdm_symbol_size); i++) {
- i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size;
- time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1));
+ i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size;
+ time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1));
chest_t_abs[0][i] = 10*log10((float) (1+chest_t[0][2*i2]*chest_t[0][2*i2]+chest_t[0][2*i2+1]*chest_t[0][2*i2+1]));
+
if (chest_t_abs[0][i] > ymax)
ymax = chest_t_abs[0][i];
}
+
fl_set_xyplot_data(form->chest_t,time2,chest_t_abs[0],(frame_parms->ofdm_symbol_size),"","","");
}
+
for (arx=1; arxofdm_symbol_size>>3); i++) {
chest_t_abs[arx][i] = 10*log10((float) (1+chest_t[arx][2*i]*chest_t[arx][2*i]+chest_t[arx][2*i+1]*chest_t[arx][2*i+1]));
+
if (chest_t_abs[arx][i] > ymax)
ymax = chest_t_abs[arx][i];
}
+
fl_add_xyplot_overlay(form->chest_t,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT);
}
}
+
// Avoid flickering effect
// fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
fl_set_xyplot_ybounds(form->chest_t,0,ymax);
}
+
// Channel Frequency Response
if (chest_f != NULL) {
ind = 0;
+
for (atx=0; atxchest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,3);
fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","","");
+
for (arx=1; arxchest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
}
+
// other tx antennas
if (nb_antennas_tx > 1) {
if (nb_antennas_rx > 1) {
@@ -279,17 +292,21 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
}
}
}
+
// PUSCH LLRs
if (pusch_llr != NULL) {
for (i=0; ipusch_llr,bit,llr,coded_bits_per_codeword,"","","");
}
+
// PUSCH I/Q of MF Output
if (pusch_comp!=NULL) {
ind=0;
+
for (k=0; ksymbols_per_tti; k++) {
for (i=0; i<12*frame_parms->N_RB_UL; i++) {
I[ind] = pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i];
@@ -297,8 +314,10 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
ind++;
}
}
+
fl_set_xyplot_data(form->pusch_comp,I,Q,ind,"","","");
}
+
// PUSCH I/Q of MF Output
if (pucch1ab_comp!=NULL) {
for (ind=0; ind<10240; ind++) {
@@ -308,6 +327,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
B_pucch[ind] = ind;
C_pucch[ind] = (float)pucch1_thres[ind];
}
+
fl_set_xyplot_data(form->pucch_comp,I_pucch,Q_pucch,10240,"","","");
fl_set_xyplot_data(form->pucch_comp1,B_pucch,A_pucch,1024,"","","");
fl_add_xyplot_overlay(form->pucch_comp1,1,B_pucch,C_pucch,1024,FL_RED);
@@ -315,6 +335,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
fl_set_xyplot_xbounds(form->pucch_comp,-5000,5000);
fl_set_xyplot_ybounds(form->pucch_comp1,0,80);
}
+
// PUSCH Throughput
memmove( tput_time_enb[UE_id], &tput_time_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
memmove( tput_enb[UE_id], &tput_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
@@ -329,509 +350,564 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
free(chest_f_abs);
}
-FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void )
-{
- FL_OBJECT *obj;
- FD_lte_phy_scope_ue *fdui = fl_malloc( sizeof *fdui );
- // Define form
- fdui->lte_phy_scope_ue = fl_bgn_form( FL_NO_BOX, 800, 1000 );
- // This the whole UI box
- obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 1000, "" );
- fl_set_object_color( obj, FL_BLACK, FL_BLACK );
- // Received signal
- fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" );
- fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
- fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
- fl_set_xyplot_ybounds(fdui->rxsig_t,30,70);
- // Time-domain channel response
- fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
- fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED );
- fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color
- // Frequency-domain channel response
- fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency Response (RE, dB)" );
- fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED );
- fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color
- fl_set_xyplot_ybounds( fdui->chest_f,30,70);
- /*
- // LLR of PBCH
- fdui->pbch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 100, "PBCH Log-Likelihood Ratios (LLR, mag)" );
- fl_set_object_boxtype( fdui->pbch_llr, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pbch_llr, FL_BLACK, FL_GREEN );
- fl_set_object_lcolor( fdui->pbch_llr, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pbch_llr,2);
- fl_set_xyplot_xgrid( fdui->pbch_llr,FL_GRID_MAJOR);
- fl_set_xyplot_xbounds( fdui->pbch_llr,0,1920);
- // I/Q PBCH comp
- fdui->pbch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 100, "PBCH I/Q of MF Output" );
- fl_set_object_boxtype( fdui->pbch_comp, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pbch_comp, FL_BLACK, FL_GREEN );
- fl_set_object_lcolor( fdui->pbch_comp, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pbch_comp,2);
- fl_set_xyplot_xbounds( fdui->pbch_comp,-100,100);
- fl_set_xyplot_ybounds( fdui->pbch_comp,-100,100);
- // LLR of PDCCH
- fdui->pdcch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 380, 500, 100, "PDCCH Log-Likelihood Ratios (LLR, mag)" );
- fl_set_object_boxtype( fdui->pdcch_llr, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pdcch_llr, FL_BLACK, FL_CYAN );
- fl_set_object_lcolor( fdui->pdcch_llr, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pdcch_llr,2);
- // I/Q PDCCH comp
- fdui->pdcch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 380, 240, 100, "PDCCH I/Q of MF Output" );
- fl_set_object_boxtype( fdui->pdcch_comp, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pdcch_comp, FL_BLACK, FL_CYAN );
- fl_set_object_lcolor( fdui->pdcch_comp, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pdcch_comp,2);
- fl_set_xyplot_xgrid( fdui->pdcch_llr,FL_GRID_MAJOR);
- */
- int offset=240;
- // LLR of PDSCH
- fdui->pdsch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 500-offset, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" );
- fl_set_object_boxtype( fdui->pdsch_llr, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pdsch_llr, FL_BLACK, FL_YELLOW );
- fl_set_object_lcolor( fdui->pdsch_llr, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pdsch_llr,2);
- fl_set_xyplot_xgrid( fdui->pdsch_llr,FL_GRID_MAJOR);
- // I/Q PDSCH comp
- fdui->pdsch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 500-offset, 240, 200, "PDSCH I/Q of MF Output" );
- fl_set_object_boxtype( fdui->pdsch_comp, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pdsch_comp, FL_BLACK, FL_YELLOW );
- fl_set_object_lcolor( fdui->pdsch_comp, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pdsch_comp,2);
- // LLR of PDSCH
- fdui->pdsch_llr1 = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 720-offset, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" );
- fl_set_object_boxtype( fdui->pdsch_llr1, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pdsch_llr1, FL_BLACK, FL_YELLOW );
- fl_set_object_lcolor( fdui->pdsch_llr1, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pdsch_llr1,2);
- fl_set_xyplot_xgrid( fdui->pdsch_llr1,FL_GRID_MAJOR);
- // I/Q PDSCH comp
- fdui->pdsch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 720-offset, 240, 200, "PDSCH I/Q of MF Output" );
- fl_set_object_boxtype( fdui->pdsch_comp1, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pdsch_comp1, FL_BLACK, FL_YELLOW );
- fl_set_object_lcolor( fdui->pdsch_comp1, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pdsch_comp1,2);
- /*
- // Throughput on PDSCH
- fdui->pdsch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 720, 500, 100, "PDSCH Throughput [frame]/[kbit/s]" );
- fl_set_object_boxtype( fdui->pdsch_tput, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pdsch_tput, FL_BLACK, FL_WHITE );
- fl_set_object_lcolor( fdui->pdsch_tput, FL_WHITE ); // Label color
- */
- // Generic UE Button
- fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" );
- fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
- //use_sic_receiver = 0;
- fl_set_button(fdui->button_0,0);
- fl_set_object_label(fdui->button_0, "SIC Receiver OFF");
- fl_set_object_color(fdui->button_0, FL_RED, FL_RED);
- fl_set_object_callback(fdui->button_0, sic_receiver_on_off, 0 );
- fl_hide_object(fdui->button_0);
-
- fl_end_form( );
- fdui->lte_phy_scope_ue->fdui = fdui;
- return fdui;
+FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void ) {
+ FL_OBJECT *obj;
+ FD_lte_phy_scope_ue *fdui = fl_malloc( sizeof *fdui );
+ // Define form
+ fdui->lte_phy_scope_ue = fl_bgn_form( FL_NO_BOX, 800, 1000 );
+ // This the whole UI box
+ obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 1000, "" );
+ fl_set_object_color( obj, FL_BLACK, FL_BLACK );
+ // Received signal
+ fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" );
+ fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
+ fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
+ fl_set_xyplot_ybounds(fdui->rxsig_t,30,70);
+ // Time-domain channel response
+ fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
+ fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED );
+ fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color
+ // Frequency-domain channel response
+ fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency Response (RE, dB)" );
+ fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED );
+ fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color
+ fl_set_xyplot_ybounds( fdui->chest_f,30,70);
+ /*
+ // LLR of PBCH
+ fdui->pbch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 100, "PBCH Log-Likelihood Ratios (LLR, mag)" );
+ fl_set_object_boxtype( fdui->pbch_llr, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pbch_llr, FL_BLACK, FL_GREEN );
+ fl_set_object_lcolor( fdui->pbch_llr, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pbch_llr,2);
+ fl_set_xyplot_xgrid( fdui->pbch_llr,FL_GRID_MAJOR);
+ fl_set_xyplot_xbounds( fdui->pbch_llr,0,1920);
+ // I/Q PBCH comp
+ fdui->pbch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 100, "PBCH I/Q of MF Output" );
+ fl_set_object_boxtype( fdui->pbch_comp, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pbch_comp, FL_BLACK, FL_GREEN );
+ fl_set_object_lcolor( fdui->pbch_comp, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pbch_comp,2);
+ fl_set_xyplot_xbounds( fdui->pbch_comp,-100,100);
+ fl_set_xyplot_ybounds( fdui->pbch_comp,-100,100);
+ // LLR of PDCCH
+ fdui->pdcch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 380, 500, 100, "PDCCH Log-Likelihood Ratios (LLR, mag)" );
+ fl_set_object_boxtype( fdui->pdcch_llr, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdcch_llr, FL_BLACK, FL_CYAN );
+ fl_set_object_lcolor( fdui->pdcch_llr, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pdcch_llr,2);
+ // I/Q PDCCH comp
+ fdui->pdcch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 380, 240, 100, "PDCCH I/Q of MF Output" );
+ fl_set_object_boxtype( fdui->pdcch_comp, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdcch_comp, FL_BLACK, FL_CYAN );
+ fl_set_object_lcolor( fdui->pdcch_comp, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pdcch_comp,2);
+ fl_set_xyplot_xgrid( fdui->pdcch_llr,FL_GRID_MAJOR);
+ */
+ int offset=240;
+ // LLR of PDSCH
+ fdui->pdsch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 500-offset, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" );
+ fl_set_object_boxtype( fdui->pdsch_llr, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdsch_llr, FL_BLACK, FL_YELLOW );
+ fl_set_object_lcolor( fdui->pdsch_llr, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pdsch_llr,2);
+ fl_set_xyplot_xgrid( fdui->pdsch_llr,FL_GRID_MAJOR);
+ // I/Q PDSCH comp
+ fdui->pdsch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 500-offset, 240, 200, "PDSCH I/Q of MF Output" );
+ fl_set_object_boxtype( fdui->pdsch_comp, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdsch_comp, FL_BLACK, FL_YELLOW );
+ fl_set_object_lcolor( fdui->pdsch_comp, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pdsch_comp,2);
+ // LLR of PDSCH
+ fdui->pdsch_llr1 = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 720-offset, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" );
+ fl_set_object_boxtype( fdui->pdsch_llr1, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdsch_llr1, FL_BLACK, FL_YELLOW );
+ fl_set_object_lcolor( fdui->pdsch_llr1, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pdsch_llr1,2);
+ fl_set_xyplot_xgrid( fdui->pdsch_llr1,FL_GRID_MAJOR);
+ // I/Q PDSCH comp
+ fdui->pdsch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 720-offset, 240, 200, "PDSCH I/Q of MF Output" );
+ fl_set_object_boxtype( fdui->pdsch_comp1, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdsch_comp1, FL_BLACK, FL_YELLOW );
+ fl_set_object_lcolor( fdui->pdsch_comp1, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pdsch_comp1,2);
+ /*
+ // Throughput on PDSCH
+ fdui->pdsch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 720, 500, 100, "PDSCH Throughput [frame]/[kbit/s]" );
+ fl_set_object_boxtype( fdui->pdsch_tput, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdsch_tput, FL_BLACK, FL_WHITE );
+ fl_set_object_lcolor( fdui->pdsch_tput, FL_WHITE ); // Label color
+ */
+ // Generic UE Button
+ fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" );
+ fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
+ //use_sic_receiver = 0;
+ fl_set_button(fdui->button_0,0);
+ fl_set_object_label(fdui->button_0, "SIC Receiver OFF");
+ fl_set_object_color(fdui->button_0, FL_RED, FL_RED);
+ fl_set_object_callback(fdui->button_0, sic_receiver_on_off, 0 );
+ fl_hide_object(fdui->button_0);
+ fl_end_form( );
+ fdui->lte_phy_scope_ue->fdui = fdui;
+ return fdui;
}
void phy_scope_UE(FD_lte_phy_scope_ue *form,
PHY_VARS_UE *phy_vars_ue,
int eNB_id,
int UE_id,
- uint8_t subframe)
-{
- int i,arx,atx,ind,k;
- LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
- int nsymb_ce = frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti;
- uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
- uint8_t nb_antennas_tx = frame_parms->nb_antenna_ports_eNB;
- int16_t **rxsig_t;
- int16_t **chest_t;
- int16_t **chest_f;
- int16_t *pdsch_llr,*pdsch_llr1;
- int16_t *pdsch_comp,*pdsch_comp1;
- int16_t *pdsch_mag0,*pdsch_mag1,*pdsch_magb0,*pdsch_magb1;
- int8_t *pdcch_llr;
- int16_t *pdcch_comp;
- int8_t *pbch_llr;
- int16_t *pbch_comp;
- float Re,Im,ymax=1;
- int num_pdcch_symbols=3;
- float *llr0, *bit0, *llr1, *bit1, *chest_f_abs, llr_pbch[1920], bit_pbch[1920], *llr_pdcch, *bit_pdcch;
- float *I, *Q;
- float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES];
- float **chest_t_abs;
- float time[FRAME_LENGTH_COMPLEX_SAMPLES];
- float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
- int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx;
- uint32_t total_dlsch_bitrate = phy_vars_ue->bitrate[eNB_id];
- int coded_bits_per_codeword0=0,coded_bits_per_codeword1=1;
- int mod0,mod1;
- int mcs0 = 0;
- int mcs1=0;
- unsigned char harq_pid = 0;
- int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0;
- if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
- harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->current_harq_pid;
- if (harq_pid>=8)
- return;
- mcs0 = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->mcs;
- // Button 0
- /*
- if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
- // we are in TM5
- fl_show_object(form->button_0);
- }
- */
- }
- fl_show_object(form->button_0);
- if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]!=NULL) {
- harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->current_harq_pid;
- if (harq_pid>=8)
- return;
- mcs1 = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->mcs;
- }
- if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]!=NULL) {
- num_pdcch_symbols = phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->num_pdcch_symbols;
- }
- // coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
- if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
- mod0 = get_Qm(mcs0);
- coded_bits_per_codeword0 = get_G(frame_parms,
- phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb,
- phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
- get_Qm(mcs0),
- phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl,
- num_pdcch_symbols,
- frame,
- subframe,
- beamforming_mode);
- } else {
- coded_bits_per_codeword0 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
- mod0=0;
- }
- if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]!=NULL) {
- mod1 = get_Qm(mcs1);
- coded_bits_per_codeword1 = get_G(frame_parms,
- phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->nb_rb,
- phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->rb_alloc_even,
- get_Qm(mcs1),
- phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->Nl,
- num_pdcch_symbols,
- frame,
- subframe,
- beamforming_mode);
- } else {
- coded_bits_per_codeword1 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
- mod1=0;
- }
- I = (float*) calloc(nsymb_ce*2,sizeof(float));
- Q = (float*) calloc(nsymb_ce*2,sizeof(float));
- chest_t_abs = (float**) malloc(nb_antennas_rx*sizeof(float*));
- for (arx=0;arxofdm_symbol_size,sizeof(float));
- }
- chest_f_abs = (float*) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float));
- //llr0 = (float*) calloc(coded_bits_per_codeword0,sizeof(float)); // Cppcheck returns "invalidFunctionArg" error.
- llr0 = (float*) malloc(coded_bits_per_codeword0*sizeof(float));
- memset((void *)llr0, 0,coded_bits_per_codeword0*sizeof(float)); // init to zero
- bit0 = malloc(coded_bits_per_codeword0*sizeof(float));
+ uint8_t subframe) {
+ int i,arx,atx,ind,k;
+ LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
+ int nsymb_ce = frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti;
+ uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
+ uint8_t nb_antennas_tx = frame_parms->nb_antenna_ports_eNB;
+ int16_t **rxsig_t;
+ int16_t **chest_t;
+ int16_t **chest_f;
+ int16_t *pdsch_llr,*pdsch_llr1;
+ int16_t *pdsch_comp,*pdsch_comp1;
+ int16_t *pdsch_mag0,*pdsch_mag1,*pdsch_magb0,*pdsch_magb1;
+ int8_t *pdcch_llr;
+ int16_t *pdcch_comp;
+ int8_t *pbch_llr;
+ int16_t *pbch_comp;
+ float Re,Im,ymax=1;
+ int num_pdcch_symbols=3;
+ float *llr0, *bit0, *llr1, *bit1, *chest_f_abs, llr_pbch[1920], bit_pbch[1920], *llr_pdcch, *bit_pdcch;
+ float *I, *Q;
+ float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES];
+ float **chest_t_abs;
+ float time[FRAME_LENGTH_COMPLEX_SAMPLES];
+ float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
+ int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx;
+ uint32_t total_dlsch_bitrate = phy_vars_ue->bitrate[eNB_id];
+ int coded_bits_per_codeword0=0,coded_bits_per_codeword1=1;
+ int mod0,mod1;
+ int mcs0 = 0;
+ int mcs1=0;
+ unsigned char harq_pid = 0;
+ int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0;
- //llr1 = (float*) calloc(coded_bits_per_codeword1,sizeof(float)); // Cppcheck returns "invalidFunctionArg" error.
- llr1 = (float*) malloc(coded_bits_per_codeword1*sizeof(float));
- memset((void *)llr1, 0,coded_bits_per_codeword1*sizeof(float)); // init to zero
- bit1 = malloc(coded_bits_per_codeword1*sizeof(float));
- llr_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); // init to zero
- bit_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float));
- rxsig_t = (int16_t**) phy_vars_ue->common_vars.rxdata;
- chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id];
- chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id];
- pbch_llr = (int8_t*) phy_vars_ue->pbch_vars[eNB_id]->llr;
- pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0];
- pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr;
- pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0];
- pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; // stream 0
- pdsch_llr1 = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[1]; // stream 1
- pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0];
- //pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[0];
- //pdsch_comp1 = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[1];
- pdsch_comp1 = (int16_t*) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[0][0])[0];
- //pdsch_comp1 = (int16_t*) (phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[0][0])[0];
- pdsch_mag0 = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0];
- pdsch_mag1 = (int16_t*) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag1[0][0])[0];
- pdsch_magb0 = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb0[0];
- pdsch_magb1 = (int16_t*) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb1[0][0])[0];
- fl_freeze_form(form->lte_phy_scope_ue);
- // Received signal in time domain of receive antenna 0
- if (rxsig_t != NULL) {
- if (rxsig_t[0] != NULL) {
- for (i=0; irxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","","");
- }
- for (arx=1;arxrxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]);
- }
- }
+ if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
+ harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->current_harq_pid;
+
+ if (harq_pid>=8)
+ return;
+
+ mcs0 = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->mcs;
+ // Button 0
+ /*
+ if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
+ // we are in TM5
+ fl_show_object(form->button_0);
+ }
+ */
+ }
+
+ fl_show_object(form->button_0);
+
+ if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]!=NULL) {
+ harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->current_harq_pid;
+
+ if (harq_pid>=8)
+ return;
+
+ mcs1 = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->mcs;
+ }
+
+ if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]!=NULL) {
+ num_pdcch_symbols = phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->num_pdcch_symbols;
+ }
+
+ // coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
+ if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
+ mod0 = get_Qm(mcs0);
+ coded_bits_per_codeword0 = get_G(frame_parms,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
+ get_Qm(mcs0),
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl,
+ num_pdcch_symbols,
+ frame,
+ subframe,
+ beamforming_mode);
+ } else {
+ coded_bits_per_codeword0 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
+ mod0=0;
+ }
+
+ if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]!=NULL) {
+ mod1 = get_Qm(mcs1);
+ coded_bits_per_codeword1 = get_G(frame_parms,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->nb_rb,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->rb_alloc_even,
+ get_Qm(mcs1),
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->Nl,
+ num_pdcch_symbols,
+ frame,
+ subframe,
+ beamforming_mode);
+ } else {
+ coded_bits_per_codeword1 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
+ mod1=0;
+ }
+
+ I = (float *) calloc(nsymb_ce*2,sizeof(float));
+ Q = (float *) calloc(nsymb_ce*2,sizeof(float));
+ chest_t_abs = (float **) malloc(nb_antennas_rx*sizeof(float *));
+
+ for (arx=0; arxofdm_symbol_size,sizeof(float));
+ }
+
+ chest_f_abs = (float *) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float));
+ //llr0 = (float*) calloc(coded_bits_per_codeword0,sizeof(float)); // Cppcheck returns "invalidFunctionArg" error.
+ llr0 = (float *) malloc(coded_bits_per_codeword0*sizeof(float));
+ memset((void *)llr0, 0,coded_bits_per_codeword0*sizeof(float)); // init to zero
+ bit0 = malloc(coded_bits_per_codeword0*sizeof(float));
+ //llr1 = (float*) calloc(coded_bits_per_codeword1,sizeof(float)); // Cppcheck returns "invalidFunctionArg" error.
+ llr1 = (float *) malloc(coded_bits_per_codeword1*sizeof(float));
+ memset((void *)llr1, 0,coded_bits_per_codeword1*sizeof(float)); // init to zero
+ bit1 = malloc(coded_bits_per_codeword1*sizeof(float));
+ llr_pdcch = (float *) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); // init to zero
+ bit_pdcch = (float *) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float));
+ rxsig_t = (int16_t **) phy_vars_ue->common_vars.rxdata;
+ chest_t = (int16_t **) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id];
+ chest_f = (int16_t **) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id];
+ pbch_llr = (int8_t *) phy_vars_ue->pbch_vars[eNB_id]->llr;
+ pbch_comp = (int16_t *) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0];
+ pdcch_llr = (int8_t *) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr;
+ pdcch_comp = (int16_t *) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0];
+ pdsch_llr = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; // stream 0
+ pdsch_llr1 = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[1]; // stream 1
+ pdsch_comp = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0];
+ //pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[0];
+ //pdsch_comp1 = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[1];
+ pdsch_comp1 = (int16_t *) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[0][0])[0];
+ //pdsch_comp1 = (int16_t*) (phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[0][0])[0];
+ pdsch_mag0 = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0];
+ pdsch_mag1 = (int16_t *) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag1[0][0])[0];
+ pdsch_magb0 = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb0[0];
+ pdsch_magb1 = (int16_t *) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb1[0][0])[0];
+ fl_freeze_form(form->lte_phy_scope_ue);
+
+ // Received signal in time domain of receive antenna 0
+ if (rxsig_t != NULL) {
+ if (rxsig_t[0] != NULL) {
+ for (i=0; irxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","","");
}
+
+ for (arx=1; arxrxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]);
+ }
+ }
+ }
+
// Channel Impulse Response (still repeated format)
if (chest_t != NULL) {
ymax = 0;
+
if (chest_t[0] !=NULL) {
for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
chest_t_abs[0][i] = (float) (chest_t[0][4*i]*chest_t[0][4*i]+chest_t[0][4*i+1]*chest_t[0][4*i+1]);
+
if (chest_t_abs[0][i] > ymax)
ymax = chest_t_abs[0][i];
}
+
fl_set_xyplot_data(form->chest_t,time,chest_t_abs[0],(frame_parms->ofdm_symbol_size>>3),"","","");
}
+
for (arx=1; arxofdm_symbol_size>>3); i++) {
chest_t_abs[arx][i] = (float) (chest_t[arx][4*i]*chest_t[arx][4*i]+chest_t[arx][4*i+1]*chest_t[arx][4*i+1]);
+
if (chest_t_abs[arx][i] > ymax)
ymax = chest_t_abs[arx][i];
}
+
fl_add_xyplot_overlay(form->chest_t,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT);
}
}
- // Avoid flickering effect
- // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
- fl_set_xyplot_ybounds(form->chest_t,0,ymax);
+
+ // Avoid flickering effect
+ // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
+ fl_set_xyplot_ybounds(form->chest_t,0,ymax);
+ }
+
+ // Channel Frequency Response (includes 5 complex sample for filter)
+ if (chest_f != NULL) {
+ ind = 0;
+
+ for (atx=0; atxchest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
- //fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
- // fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
- fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
- fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","","");
- for (arx=1;arxchest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
- }
- // other tx antennas
- if (nb_antennas_tx > 1) {
- if (nb_antennas_rx > 1) {
- for (atx=1;atxchest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
- }
- }
- } else { // 1 rx antenna
- atx=1; arx=0;
- fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
- }
- }
+
+ // tx antenna 0
+ fl_set_xyplot_xbounds(form->chest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
+ //fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
+ // fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
+ fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
+ fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","","");
+
+ for (arx=1; arxchest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
}
- /*
- // PBCH LLRs
- if (pbch_llr != NULL) {
- for (i=0; i<1920;i++) {
- llr_pbch[i] = (float) pbch_llr[i];
- bit_pbch[i] = (float) i;
+
+ // other tx antennas
+ if (nb_antennas_tx > 1) {
+ if (nb_antennas_rx > 1) {
+ for (atx=1; atxchest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
+ }
}
- fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,1920,"","","");
+ } else { // 1 rx antenna
+ atx=1;
+ arx=0;
+ fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
+ }
}
- // PBCH I/Q of MF Output
- if (pbch_comp!=NULL) {
- for (i=0; i<72*2; i++) {
- I[i] = pbch_comp[2*i];
- Q[i] = pbch_comp[2*i+1];
- }
- fl_set_xyplot_data(form->pbch_comp,I,Q,72*2,"","","");
- }
- // PDCCH LLRs
- if (pdcch_llr != NULL) {
- for (i=0; i<12*frame_parms->N_RB_DL*2*num_pdcch_symbols;i++) {
- llr_pdcch[i] = (float) pdcch_llr[i];
- bit_pdcch[i] = (float) i;
- }
- fl_set_xyplot_xbounds(form->pdcch_llr,0,12*frame_parms->N_RB_DL*2*3);
- fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*2*num_pdcch_symbols,"","","");
- }
- // PDCCH I/Q of MF Output
- if (pdcch_comp!=NULL) {
- for (i=0; i<12*frame_parms->N_RB_DL*num_pdcch_symbols; i++) {
- I[i] = pdcch_comp[2*i];
- Q[i] = pdcch_comp[2*i+1];
- }
- fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","","");
- }
- */
- // PDSCH LLRs CW0
- if (pdsch_llr != NULL) {
- for (i=0; ipdsch_llr,0,coded_bits_per_codeword0);
- fl_set_xyplot_data(form->pdsch_llr,bit0,llr0,coded_bits_per_codeword0,"","","");
+ }
+
+ /*
+ // PBCH LLRs
+ if (pbch_llr != NULL) {
+ for (i=0; i<1920;i++) {
+ llr_pbch[i] = (float) pbch_llr[i];
+ bit_pbch[i] = (float) i;
+ }
+ fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,1920,"","","");
+ }
+ // PBCH I/Q of MF Output
+ if (pbch_comp!=NULL) {
+ for (i=0; i<72*2; i++) {
+ I[i] = pbch_comp[2*i];
+ Q[i] = pbch_comp[2*i+1];
+ }
+ fl_set_xyplot_data(form->pbch_comp,I,Q,72*2,"","","");
+ }
+ // PDCCH LLRs
+ if (pdcch_llr != NULL) {
+ for (i=0; i<12*frame_parms->N_RB_DL*2*num_pdcch_symbols;i++) {
+ llr_pdcch[i] = (float) pdcch_llr[i];
+ bit_pdcch[i] = (float) i;
+ }
+ fl_set_xyplot_xbounds(form->pdcch_llr,0,12*frame_parms->N_RB_DL*2*3);
+ fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*2*num_pdcch_symbols,"","","");
+ }
+ // PDCCH I/Q of MF Output
+ if (pdcch_comp!=NULL) {
+ for (i=0; i<12*frame_parms->N_RB_DL*num_pdcch_symbols; i++) {
+ I[i] = pdcch_comp[2*i];
+ Q[i] = pdcch_comp[2*i+1];
+ }
+ fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","","");
+ }
+ */
+ // PDSCH LLRs CW0
+ if (pdsch_llr != NULL) {
+ for (i=0; ipdsch_llr,0,coded_bits_per_codeword0);
+ fl_set_xyplot_data(form->pdsch_llr,bit0,llr0,coded_bits_per_codeword0,"","","");
+ }
+
// PDSCH I/Q of MF Output
- if (pdsch_comp!=NULL) {
- ind=0;
- for (k=0; ksymbols_per_tti; k++) {
- for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
- I[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i];
- Q[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i+1];
- ind++;
- }
- }
- fl_set_xyplot_data(form->pdsch_comp,I,Q,ind,"","","");
+ if (pdsch_comp!=NULL) {
+ ind=0;
+
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+ I[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i];
+ Q[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i+1];
+ ind++;
+ }
}
- if (pdsch_mag0 != NULL) {
- ind=0;
- for (k=0; ksymbols_per_tti; k++) {
- for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+
+ fl_set_xyplot_data(form->pdsch_comp,I,Q,ind,"","","");
+ }
+
+ if (pdsch_mag0 != NULL) {
+ ind=0;
+
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
I[ind] = pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
Q[ind] = pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
ind++;
- }
- }
- fl_add_xyplot_overlay(form->pdsch_comp,1,I,Q,ind,FL_GREEN);
+ }
}
- if (pdsch_magb0 != NULL) {
- ind=0;
- for (k=0; ksymbols_per_tti; k++) {
- for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+
+ fl_add_xyplot_overlay(form->pdsch_comp,1,I,Q,ind,FL_GREEN);
+ }
+
+ if (pdsch_magb0 != NULL) {
+ ind=0;
+
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
I[ind] = pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
Q[ind] = pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
ind++;
- }
- }
- fl_add_xyplot_overlay(form->pdsch_comp,2,I,Q,ind,FL_RED);
+ }
}
- if ((pdsch_mag0 != NULL) && (pdsch_magb0 != NULL)) {
- ind=0;
- for (k=0; ksymbols_per_tti; k++) {
- for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+
+ fl_add_xyplot_overlay(form->pdsch_comp,2,I,Q,ind,FL_RED);
+ }
+
+ if ((pdsch_mag0 != NULL) && (pdsch_magb0 != NULL)) {
+ ind=0;
+
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
I[ind] =
- (pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i]+
- pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i])*
- cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ (pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i]+
+ pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i])*
+ cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
Q[ind] =
- (pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]+
- pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i+1])*
- sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ (pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]+
+ pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i+1])*
+ sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
ind++;
- }
- }
- fl_add_xyplot_overlay(form->pdsch_comp,3,I,Q,ind,FL_BLUE);
+ }
}
- // PDSCH LLRs CW1
- if (pdsch_llr1 != NULL) {
- for (i=0; ipdsch_llr1,0,coded_bits_per_codeword1);
- fl_set_xyplot_data(form->pdsch_llr1,bit1,llr1,coded_bits_per_codeword1,"","","");
+
+ fl_add_xyplot_overlay(form->pdsch_comp,3,I,Q,ind,FL_BLUE);
+ }
+
+ // PDSCH LLRs CW1
+ if (pdsch_llr1 != NULL) {
+ for (i=0; isymbols_per_tti; k++) {
- for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
- I[ind] = pdsch_comp1[(2*frame_parms->N_RB_DL*12*k)+4*i];
- Q[ind] = pdsch_comp1[(2*frame_parms->N_RB_DL*12*k)+4*i+1];
- ind++;
- }
- }
- fl_set_xyplot_data(form->pdsch_comp1,I,Q,ind,"","","");
+
+ fl_set_xyplot_xbounds(form->pdsch_llr1,0,coded_bits_per_codeword1);
+ fl_set_xyplot_data(form->pdsch_llr1,bit1,llr1,coded_bits_per_codeword1,"","","");
+ }
+
+ // PDSCH I/Q of MF Output
+ if (pdsch_comp1!=NULL) {
+ ind=0;
+
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+ I[ind] = pdsch_comp1[(2*frame_parms->N_RB_DL*12*k)+4*i];
+ Q[ind] = pdsch_comp1[(2*frame_parms->N_RB_DL*12*k)+4*i+1];
+ ind++;
+ }
}
- if (pdsch_mag1 != NULL) {
- ind=0;
- for (k=0; ksymbols_per_tti; k++) {
- for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+
+ fl_set_xyplot_data(form->pdsch_comp1,I,Q,ind,"","","");
+ }
+
+ if (pdsch_mag1 != NULL) {
+ ind=0;
+
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
I[ind] = pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
Q[ind] = pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
ind++;
- }
- }
- fl_add_xyplot_overlay(form->pdsch_comp1,1,I,Q,ind,FL_GREEN);
+ }
}
- if (pdsch_magb1 != NULL) {
- ind=0;
- for (k=0; ksymbols_per_tti; k++) {
- for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+
+ fl_add_xyplot_overlay(form->pdsch_comp1,1,I,Q,ind,FL_GREEN);
+ }
+
+ if (pdsch_magb1 != NULL) {
+ ind=0;
+
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
I[ind] = pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
Q[ind] = pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
ind++;
- }
- }
- fl_add_xyplot_overlay(form->pdsch_comp1,2,I,Q,ind,FL_RED);
+ }
}
- if ((pdsch_mag1 != NULL) && (pdsch_magb1 != NULL)) {
- ind=0;
- for (k=0; ksymbols_per_tti; k++) {
- for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+
+ fl_add_xyplot_overlay(form->pdsch_comp1,2,I,Q,ind,FL_RED);
+ }
+
+ if ((pdsch_mag1 != NULL) && (pdsch_magb1 != NULL)) {
+ ind=0;
+
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
I[ind] =
- (pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i]+
- pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i])*
- cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ (pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i]+
+ pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i])*
+ cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
Q[ind] =
- (pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]+
- pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i+1])*
- sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ (pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]+
+ pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i+1])*
+ sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
ind++;
- }
- }
- fl_add_xyplot_overlay(form->pdsch_comp1,3,I,Q,ind,FL_BLUE);
+ }
}
- /*
- // PDSCH Throughput
- memcpy((void*)tput_time_ue[UE_id],(void*)&tput_time_ue[UE_id][1],(TPUT_WINDOW_LENGTH-1)*sizeof(float));
- memcpy((void*)tput_ue[UE_id],(void*)&tput_ue[UE_id][1],(TPUT_WINDOW_LENGTH-1)*sizeof(float));
- tput_time_ue[UE_id][TPUT_WINDOW_LENGTH-1] = (float) frame;
- tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0;
- if (tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] > tput_ue_max[UE_id]) {
- tput_ue_max[UE_id] = tput_ue[UE_id][TPUT_WINDOW_LENGTH-1];
- }
- fl_set_xyplot_data(form->pdsch_tput,tput_time_ue[UE_id],tput_ue[UE_id],TPUT_WINDOW_LENGTH,"","","");
- fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]);
- */
- fl_unfreeze_form(form->lte_phy_scope_ue);
- fl_check_forms();
- free(I);
- free(Q);
- free(chest_f_abs);
- free(llr0);
- free(bit0);
- free(llr1);
- free(bit1);
- free(bit_pdcch);
- free(llr_pdcch);
- //This is done to avoid plotting old data when TB0 is disabled, and TB1 is mapped onto CW0
- /*if (phy_vars_ue->transmission_mode[eNB_id]==3 && phy_vars_ue->transmission_mode[eNB_id]==4){
- for (int i = 0; i<8; ++i)
- for (int j = 0; j < 7*2*frame_parms->N_RB_DL*12+4; ++j )
- phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[0][0][i][j]=0;
+ fl_add_xyplot_overlay(form->pdsch_comp1,3,I,Q,ind,FL_BLUE);
+ }
- for (int m=0; mpdsch_vars[subframe&0x1][eNB_id]->llr[0][m]=0;
- }*/
+ /*
+ // PDSCH Throughput
+ memcpy((void*)tput_time_ue[UE_id],(void*)&tput_time_ue[UE_id][1],(TPUT_WINDOW_LENGTH-1)*sizeof(float));
+ memcpy((void*)tput_ue[UE_id],(void*)&tput_ue[UE_id][1],(TPUT_WINDOW_LENGTH-1)*sizeof(float));
+ tput_time_ue[UE_id][TPUT_WINDOW_LENGTH-1] = (float) frame;
+ tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0;
+ if (tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] > tput_ue_max[UE_id]) {
+ tput_ue_max[UE_id] = tput_ue[UE_id][TPUT_WINDOW_LENGTH-1];
+ }
+ fl_set_xyplot_data(form->pdsch_tput,tput_time_ue[UE_id],tput_ue[UE_id],TPUT_WINDOW_LENGTH,"","","");
+ fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]);
+ */
+ fl_unfreeze_form(form->lte_phy_scope_ue);
+ fl_check_forms();
+ free(I);
+ free(Q);
+ free(chest_f_abs);
+ free(llr0);
+ free(bit0);
+ free(llr1);
+ free(bit1);
+ free(bit_pdcch);
+ free(llr_pdcch);
+ //This is done to avoid plotting old data when TB0 is disabled, and TB1 is mapped onto CW0
+ /*if (phy_vars_ue->transmission_mode[eNB_id]==3 && phy_vars_ue->transmission_mode[eNB_id]==4){
+ for (int i = 0; i<8; ++i)
+ for (int j = 0; j < 7*2*frame_parms->N_RB_DL*12+4; ++j )
+ phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[0][0][i][j]=0;
+
+ for (int m=0; mpdsch_vars[subframe&0x1][eNB_id]->llr[0][m]=0;
+ }*/
}
diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c
index 776d844666..90a252dc98 100644
--- a/openair1/PHY/TOOLS/nr_phy_scope.c
+++ b/openair1/PHY/TOOLS/nr_phy_scope.c
@@ -240,7 +240,7 @@ static void genericWaterFall (OAIgraph_t *graph, scopeSample_t *values, const in
for (int pix=0; pixw; pix++) {
scopeSample_t *end=values+(pix+1)*samplesPerPixel;
end-=2;
- AssertFatal(end <= values+datasize,"diff : %ld", end-values+datasize);
+ AssertFatal(end <= values+datasize,"diff : %u", end-values+datasize);
double val=0;
for (scopeSample_t *s=values+(pix)*samplesPerPixel;
@@ -276,7 +276,7 @@ static void genericWaterFall (OAIgraph_t *graph, scopeSample_t *values, const in
graph->initDone=true;
}
- fl_set_object_label_f(graph->text, "%s, avg I/Q pow: %4.1f", label, sqrt(avg));
+ fl_set_object_label_f(graph->text, "%s, avg I/Q pow: %4.1f", label, 0/*sqrt(avg)*/);
graph->iteration++;
}
@@ -444,7 +444,6 @@ static void puschThroughtput (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) {
// fl_set_xyplot_ybounds(form->pusch_tput,0,ymax);
*/
}
-
static OAI_phy_scope_t *create_phy_scope_gnb(void) {
FL_OBJECT *obj;
OAI_phy_scope_t *fdui = calloc(( sizeof *fdui ),1);
@@ -493,7 +492,6 @@ static OAI_phy_scope_t *create_phy_scope_gnb(void) {
fl_show_form (fdui->phy_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, "LTE UL SCOPE gNB");
return fdui;
}
-
static const int scope_enb_num_ue = 1;
void phy_scope_gNB(OAI_phy_scope_t *form,
scopeData_t *p,
@@ -517,7 +515,6 @@ void phy_scope_gNB(OAI_phy_scope_t *form,
//fl_check_forms();
}
-
static void *scope_thread_gNB(void *arg) {
scopeData_t *p=(scopeData_t *) arg;
//# ifdef ENABLE_XFORMS_WRITE_STATS
@@ -542,7 +539,6 @@ static void *scope_thread_gNB(void *arg) {
return NULL;
}
-
static void copyRxdataF(int32_t *data, int slot, void *scopeData) {
scopeData_t *scope=(scopeData_t *)scopeData;
memcpy(scope->rxdataF + slot*scope->gNB->frame_parms.samples_per_slot_wCP,
@@ -562,7 +558,6 @@ void gNBinitScope(scopeParms_t *p) {
pthread_t forms_thread;
threadCreate(&forms_thread, scope_thread_gNB, p->gNB->scopeData, "scope", -1, OAI_PRIORITY_RT_LOW);
}
-
static void ueWaterFall (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// Received signal in time domain of receive antenna 0
genericWaterFall(graph,
@@ -571,7 +566,6 @@ static void ueWaterFall (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eN
phy_vars_ue->frame_parms.slots_per_frame,
"X axis: one frame time");
}
-
/* replaced by waterfall
static void ueTimeResponse (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// Received signal in time domain of receive antenna 0
@@ -580,14 +574,12 @@ static void ueTimeResponse (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int
phy_vars_ue->frame_parms.samples_per_frame);
}
*/
-
static void ueChannelResponse (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// Channel Impulse Response
genericPowerPerAntena(graph, phy_vars_ue->frame_parms.nb_antennas_rx,
(const scopeSample_t **) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time,
phy_vars_ue->frame_parms.ofdm_symbol_size>>3);
}
-
static void ueFreqWaterFall (OAIgraph_t *graph,PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id ) {
NR_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->frame_parms;
//use 1st antenna
@@ -597,7 +589,6 @@ static void ueFreqWaterFall (OAIgraph_t *graph,PHY_VARS_NR_UE *phy_vars_ue, int
phy_vars_ue->frame_parms.slots_per_frame,
"X axis: one frame frequency" );
}
-
/*
static void uePbchFrequencyResp (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// Channel Frequency Response (includes 5 complex sample for filter)
@@ -633,7 +624,6 @@ static void uePbchFrequencyResp (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue
oai_xygraph(graph,freq,chest_f_abs,frame_parms->ofdm_symbol_size,0,10);
}
*/
-
static void uePbchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PBCH LLRs
if ( !phy_vars_ue->pbch_vars[eNB_id]->llr)
@@ -649,7 +639,6 @@ static void uePbchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_
oai_xygraph(graph,bit_pbch,llr_pbch,864,0,10);
}
-
static void uePbchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PBCH I/Q of MF Output
if (!phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0])
@@ -684,15 +673,14 @@ static void uePbchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
AssertFatal(base <= 180*3,"");
oai_xygraph(graph,I,Q,base,0, 10);
}
-
static void uePcchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PDCCH LLRs
if (!phy_vars_ue->pdcch_vars[0][eNB_id]->llr)
return;
- int num_re = 4*273*12; // 12*frame_parms->N_RB_DL*num_pdcch_symbols
- int Qm = 2;
- int coded_bits_per_codeword = num_re*Qm;
+ //int num_re = 4*273*12; // 12*frame_parms->N_RB_DL*num_pdcch_symbols
+ //int Qm = 2;
+ int coded_bits_per_codeword = 2*4*100*12; //num_re*Qm;
float *llr, *bit;
oai_xygraph_getbuff(graph, &bit, &llr, coded_bits_per_codeword*RX_NB_TH_MAX, 0);
int base=0;
@@ -710,7 +698,6 @@ static void uePcchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_
AssertFatal(base <= coded_bits_per_codeword*RX_NB_TH_MAX, "");
oai_xygraph(graph,bit,llr,base,0,10);
}
-
static void uePcchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PDCCH I/Q of MF Output
if (!phy_vars_ue->pdcch_vars[0][eNB_id]->rxdataF_comp[0])
@@ -735,7 +722,6 @@ static void uePcchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
AssertFatal(base <= nb*RX_NB_TH_MAX, "");
oai_xygraph(graph,I,Q,base,0,10);
}
-
static void uePdschLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PDSCH LLRs
if (!phy_vars_ue->pdsch_vars[0][eNB_id]->llr[0])
@@ -763,7 +749,6 @@ static void uePdschLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB
//fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword);
oai_xygraph(graph,bit,llr,base,0,10);
}
-
static void uePdschIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PDSCH I/Q of MF Output
if (!phy_vars_ue->pdsch_vars[0][eNB_id]->rxdataF_comp0[0])
@@ -791,7 +776,6 @@ static void uePdschIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_
AssertFatal(base <= sz*RX_NB_TH_MAX, "");
oai_xygraph(graph,I,Q,sz*RX_NB_TH_MAX,0,10);
}
-
static void uePdschThroughput (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
/*
float tput_time_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
@@ -815,7 +799,6 @@ static void uePdschThroughput (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue,
fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]);
*/
}
-
static OAI_phy_scope_t *create_phy_scope_nrue( int ID ) {
FL_OBJECT *obj;
OAI_phy_scope_t *fdui = calloc(( sizeof *fdui ),1);
@@ -885,7 +868,6 @@ static OAI_phy_scope_t *create_phy_scope_nrue( int ID ) {
fl_show_form (fdui->phy_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, buf);
return fdui;
}
-
void phy_scope_nrUE(OAI_phy_scope_t *form,
PHY_VARS_NR_UE *phy_vars_ue,
int eNB_id,
@@ -909,8 +891,6 @@ void phy_scope_nrUE(OAI_phy_scope_t *form,
//fl_check_forms();
}
-
-
static void *nrUEscopeThread(void *arg) {
PHY_VARS_NR_UE *ue=(PHY_VARS_NR_UE *)arg;
size_t stksize;
@@ -934,13 +914,10 @@ static void *nrUEscopeThread(void *arg) {
pthread_exit((void *)arg);
}
-
void nrUEinitScope(PHY_VARS_NR_UE *ue) {
pthread_t forms_thread;
threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW);
}
-
-
void nrscope_autoinit(void *dataptr) {
AssertFatal( (IS_SOFTMODEM_GNB_BIT||IS_SOFTMODEM_5GUE_BIT),"Scope cannot find NRUE or GNB context");
@@ -975,7 +952,6 @@ static void reset_stats_gNB(FL_OBJECT *button,
}
}
}
-
static FD_stats_form *create_form_stats_form(int ID) {
FL_OBJECT *obj;
FD_stats_form *fdui = calloc(( sizeof *fdui ),1);
diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c
index cfa3b93007..001770c876 100644
--- a/openair1/PHY/TOOLS/time_meas.c
+++ b/openair1/PHY/TOOLS/time_meas.c
@@ -26,9 +26,12 @@
// global var for openair performance profiler
int opp_enabled = 0;
+double cpu_freq_GHz __attribute__ ((aligned(32)));
+double cpu_freq_GHz __attribute__ ((aligned(32)))=0.0;
double get_cpu_freq_GHz(void)
{
+ if (cpu_freq_GHz <1 ) {
time_stats_t ts = {0};
reset_meas(&ts);
ts.trials++;
@@ -37,6 +40,7 @@ double get_cpu_freq_GHz(void)
ts.diff = (rdtsc_oai()-ts.in);
cpu_freq_GHz = (double)ts.diff/1000000000;
printf("CPU Freq is %f \n", cpu_freq_GHz);
+ }
return cpu_freq_GHz;
}
@@ -99,10 +103,11 @@ void print_meas(time_stats_t *ts,
if (ts->trials>0) {
//printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials);
if ((total_exec_time == NULL) || (sf_exec_time== NULL)) {
- fprintf(stderr, "%25s: %15.3f us; %15d;\n",
+ fprintf(stderr, "%25s: %15.3f us; %15d; %15.3f us;\n",
name,
(ts->diff/ts->trials/cpu_freq_GHz/1000.0),
- ts->trials);
+ ts->trials,
+ ts->max/cpu_freq_GHz/1000.0);
} else {
fprintf(stderr, "%25s: %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;\n",
name,
diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h
index 2deab40f27..e2ceef8405 100644
--- a/openair1/PHY/TOOLS/time_meas.h
+++ b/openair1/PHY/TOOLS/time_meas.h
@@ -33,7 +33,7 @@
#include
// global var to enable openair performance profiler
extern int opp_enabled;
-double cpu_freq_GHz __attribute__ ((aligned(32)));;
+extern double cpu_freq_GHz __attribute__ ((aligned(32)));;
#if defined(__x86_64__) || defined(__i386__)
typedef struct {
diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h
index db7ac3d813..4c68c15cb6 100644
--- a/openair1/PHY/TOOLS/tools_defs.h
+++ b/openair1/PHY/TOOLS/tools_defs.h
@@ -44,6 +44,11 @@ struct complex {
double y;
};
+struct complexd {
+ double r;
+ double i;
+};
+
struct complexf {
float r;
float i;
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index a165aa1984..129f7a9a71 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -133,8 +133,32 @@ typedef struct {
int total_bytes_rx;
int current_Qm;
int current_RI;
+ int power[NB_ANTENNAS_RX];
+ int noise_power[NB_ANTENNAS_RX];
+ int DTX;
} NR_gNB_SCH_STATS_t;
+typedef struct {
+ int frame;
+ uint16_t rnti;
+ int pucch0_sr_trials;
+ int pucch0_sr_thres;
+ int current_pucch0_sr_stat0;
+ int current_pucch0_sr_stat1;
+ int pucch0_positive_SR;
+ int pucch01_trials;
+ int pucch0_n00;
+ int pucch0_n01;
+ int pucch0_thres;
+ int current_pucch0_stat0;
+ int current_pucch0_stat1;
+ int pucch01_DTX;
+ int pucch02_trials;
+ int pucch02_DTX;
+ int pucch2_trials;
+ int pucch2_DTX;
+} NR_gNB_UCI_STATS_t;
+
typedef struct {
/// Pointers to variables related to DLSCH harq process
NR_DL_gNB_HARQ_t harq_process;
@@ -465,7 +489,13 @@ typedef struct {
/// - second index: ? [0..168*N_RB_UL[
int32_t **ul_ch_magb1[8][8];
/// measured RX power based on DRS
- int ulsch_power[2];
+ int ulsch_power[8];
+ /// total signal over antennas
+ int ulsch_power_tot;
+ /// measured RX noise power
+ int ulsch_noise_power[8];
+ /// total noise over antennas
+ int ulsch_noise_power_tot;
/// \brief llr values.
/// - first index: ? [0..1179743] (hard coded)
int16_t *llr;
@@ -486,6 +516,8 @@ typedef struct {
int16_t *ul_valid_re_per_slot;
/// flag to verify if channel level computation is done
uint8_t cl_done;
+ /// flag to indicate DTX on reception
+ int DTX;
} NR_gNB_PUSCH;
/// Context data structure for RX/TX portion of slot processing
@@ -562,8 +594,10 @@ typedef struct gNB_L1_proc_t_s {
pthread_t pthread_single;
/// pthread structure for asychronous RX/TX processing thread
pthread_t pthread_asynch_rxtx;
- /// pthread structure for printing time meas
+ /// pthread structure for dumping L1 stats
pthread_t L1_stats_thread;
+ /// pthread structure for printing time meas
+ pthread_t process_stats_thread;
/// flag to indicate first RX acquisition
int first_rx;
/// flag to indicate first TX transmission
@@ -629,6 +663,8 @@ typedef struct {
unsigned short n0_subband_power[MAX_NUM_RU_PER_gNB][275];
//! estimated avg noise power per RB per RX ant (dB)
unsigned short n0_subband_power_dB[MAX_NUM_RU_PER_gNB][275];
+ //! estimated avg subband noise power (dB)
+ unsigned short n0_subband_power_avg_dB;
//! estimated avg noise power per RB (dB)
short n0_subband_power_tot_dB[275];
//! estimated avg noise power per RB (dBm)
@@ -734,7 +770,7 @@ typedef struct PHY_VARS_gNB_s {
NR_gNB_SCH_STATS_t dlsch_stats[NUMBER_OF_NR_SCH_STATS_MAX];
/// statistics for ULSCH measurement collection
NR_gNB_SCH_STATS_t ulsch_stats[NUMBER_OF_NR_SCH_STATS_MAX];
-
+ NR_gNB_UCI_STATS_t uci_stats[NUMBER_OF_NR_UCI_STATS_MAX];
t_nrPolar_params *uci_polarParams;
uint8_t pbch_configured;
@@ -801,6 +837,8 @@ typedef struct PHY_VARS_gNB_s {
int prach_energy_counter;
int pucch0_thres;
+ int pusch_thres;
+ int prach_thres;
uint64_t bad_pucch;
/*
time_stats_t phy_proc;
@@ -824,6 +862,7 @@ typedef struct PHY_VARS_gNB_s {
time_stats_t dlsch_segmentation_stats;
time_stats_t rx_pusch_stats;
+ time_stats_t ul_indication_stats;
time_stats_t ulsch_decoding_stats;
time_stats_t ulsch_rate_unmatching_stats;
time_stats_t ulsch_ldpc_decoding_stats;
diff --git a/openair1/PHY/impl_defs_nr.h b/openair1/PHY/impl_defs_nr.h
index ceb75c2554..fad578c8b0 100644
--- a/openair1/PHY/impl_defs_nr.h
+++ b/openair1/PHY/impl_defs_nr.h
@@ -214,10 +214,8 @@ typedef enum {
#define NB_SRS_PERIOD (17)
-const uint16_t srs_period[NB_SRS_PERIOD]
-#ifdef INIT_VARIABLES_PHY_IMPLEMENTATION_DEFS_NR_H
+static const uint16_t srs_period[NB_SRS_PERIOD]
= { 1, 2, 4, 5, 8, 10, 16, 20, 32, 40, 64, 80, 160, 320, 640, 1280, 2560}
-#endif
;
/// SRS_Resource of SRS_Config information element from 38.331 RRC specifications
@@ -796,7 +794,6 @@ typedef struct {
uint8_t initial_CS_indexes[MAX_NB_CYCLIC_SHIFT];
} initial_pucch_resource_t;
-const initial_pucch_resource_t initial_pucch_resource[NB_INITIAL_PUCCH_RESOURCE]; /* TS 36.213 Table 9.2.1-1: PUCCH resource sets before dedicated PUCCH resource configuration */
/* structure with all possible fields for pucch format from 0 to 4 */
typedef struct {
@@ -1051,11 +1048,6 @@ typedef struct {
#define NB_SR_PERIOD (15)
-const uint16_t scheduling_request_periodicity[NB_SR_PERIOD]
-#ifdef INIT_VARIABLES_PHY_IMPLEMENTATION_DEFS_NR_H
-= { 0, 0, 1, 2, 4, 5, 8, 10, 16, 20, 40, 80, 160, 320, 640 }
-#endif
-;
typedef enum {
sr_sym2 = 0,
diff --git a/openair1/PHY/phy_extern.h b/openair1/PHY/phy_extern.h
index 165ed961b3..4ba5e328e3 100644
--- a/openair1/PHY/phy_extern.h
+++ b/openair1/PHY/phy_extern.h
@@ -48,12 +48,6 @@ extern short primary_synch2[144];
extern unsigned char primary_synch0_tab[72];
extern unsigned char primary_synch1_tab[72];
extern unsigned char primary_synch2_tab[72];
-extern int16_t *primary_synch0_time; //!< index: [0..ofdm_symbol_size*2[
-extern int16_t *primary_synch1_time; //!< index: [0..ofdm_symbol_size*2[
-extern int16_t *primary_synch2_time; //!< index: [0..ofdm_symbol_size*2[
-extern int *sync_corr_ue0; //!< index [0..10*samples_per_tti[
-extern int *sync_corr_ue1; //!< index [0..10*samples_per_tti[
-extern int *sync_corr_ue2; //!< index [0..10*samples_per_tti[
extern int flagMag;
//extern short **txdataF_rep_tmp;
diff --git a/openair1/PHY/phy_extern_nr_ue.h b/openair1/PHY/phy_extern_nr_ue.h
index 700419c61c..f1704a7902 100644
--- a/openair1/PHY/phy_extern_nr_ue.h
+++ b/openair1/PHY/phy_extern_nr_ue.h
@@ -55,9 +55,6 @@ extern unsigned char primary_synch2_tab[72];
extern int16_t *primary_synch0_time; //!< index: [0..ofdm_symbol_size*2[
extern int16_t *primary_synch1_time; //!< index: [0..ofdm_symbol_size*2[
extern int16_t *primary_synch2_time; //!< index: [0..ofdm_symbol_size*2[
-extern int *sync_corr_ue0; //!< index [0..10*samples_per_tti[
-extern int *sync_corr_ue1; //!< index [0..10*samples_per_tti[
-extern int *sync_corr_ue2; //!< index [0..10*samples_per_tti[
extern int flagMag;
//extern short **txdataF_rep_tmp;
diff --git a/openair1/PHY/phy_extern_ue.h b/openair1/PHY/phy_extern_ue.h
index 622551c2fe..fdaf6eaa89 100644
--- a/openair1/PHY/phy_extern_ue.h
+++ b/openair1/PHY/phy_extern_ue.h
@@ -47,12 +47,6 @@ extern short primary_synch2[144];
extern unsigned char primary_synch0_tab[72];
extern unsigned char primary_synch1_tab[72];
extern unsigned char primary_synch2_tab[72];
-extern int16_t *primary_synch0_time; //!< index: [0..ofdm_symbol_size*2[
-extern int16_t *primary_synch1_time; //!< index: [0..ofdm_symbol_size*2[
-extern int16_t *primary_synch2_time; //!< index: [0..ofdm_symbol_size*2[
-extern int *sync_corr_ue0; //!< index [0..10*samples_per_tti[
-extern int *sync_corr_ue1; //!< index [0..10*samples_per_tti[
-extern int *sync_corr_ue2; //!< index [0..10*samples_per_tti[
extern int flagMag;
//extern short **txdataF_rep_tmp;
diff --git a/openair1/PHY/phy_vars.h b/openair1/PHY/phy_vars.h
index 5e2be8bd8f..dadb1649ec 100644
--- a/openair1/PHY/phy_vars.h
+++ b/openair1/PHY/phy_vars.h
@@ -33,9 +33,6 @@ char* namepointer_log2;
#include "PHY/LTE_REFSIG/primary_synch.h"
-int16_t *primary_synch0_time;
-int16_t *primary_synch1_time;
-int16_t *primary_synch2_time;
#include "PHY/LTE_TRANSPORT/transport_vars.h"
diff --git a/openair1/PHY/phy_vars_ue.h b/openair1/PHY/phy_vars_ue.h
index e90c2641aa..469a5c4754 100644
--- a/openair1/PHY/phy_vars_ue.h
+++ b/openair1/PHY/phy_vars_ue.h
@@ -33,9 +33,6 @@ char *namepointer_log2;
#include "PHY/LTE_REFSIG/primary_synch.h"
-int16_t *primary_synch0_time;
-int16_t *primary_synch1_time;
-int16_t *primary_synch2_time;
PHY_VARS_UE ***PHY_vars_UE_g;
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 38307a7b9e..d894061acd 100644
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -40,6 +40,7 @@
#include "common/utils/LOG/log.h"
#include
#include "common/utils/LOG/vcd_signal_dumper.h"
+#include
#include "assertions.h"
#include "msc.h"
@@ -51,7 +52,6 @@
#define MBMS_NFAPI_SCHEDULER
-nfapi_ue_release_request_body_t release_rntis;
int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *eNB,uint16_t UE_id,uint8_t harq_pid, uint8_t bw_factor) {
uint32_t Nre,sumKr,MPR_x100,Kr,r;
diff --git a/openair1/SCHED_NR/nr_prach_procedures.c b/openair1/SCHED_NR/nr_prach_procedures.c
index 5a98b17cea..848b11dcde 100644
--- a/openair1/SCHED_NR/nr_prach_procedures.c
+++ b/openair1/SCHED_NR/nr_prach_procedures.c
@@ -114,23 +114,25 @@ void L1_nr_prach_procedures(PHY_VARS_gNB *gNB,int frame,int slot) {
&max_preamble_delay[0]
);
free_nr_prach_entry(gNB,prach_id);
- LOG_D(PHY,"[RAPROC] Frame %d, slot %d, occasion %d (prachStartSymbol %d) : Most likely preamble %d, energy %d dB delay %d (prach_energy counter %d)\n",
+ LOG_D(PHY,"[RAPROC] Frame %d, slot %d, occasion %d (prachStartSymbol %d) : Most likely preamble %d, energy %d.%d dB delay %d (prach_energy counter %d)\n",
frame,slot,prach_oc,prachStartSymbol,
max_preamble[0],
max_preamble_energy[0]/10,
+ max_preamble_energy[0]%10,
max_preamble_delay[0],
gNB->prach_energy_counter);
if ((gNB->prach_energy_counter == 100) &&
- (max_preamble_energy[0] > gNB->measurements.prach_I0+100)) {
+ (max_preamble_energy[0] > gNB->measurements.prach_I0+gNB->prach_thres)) {
- LOG_I(PHY,"[gNB %d][RAPROC] Frame %d, slot %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d start symbol %u freq index %u\n",
+ LOG_I(PHY,"[gNB %d][RAPROC] Frame %d, slot %d Initiating RA procedure with preamble %d, energy %d.%d dB (I0 %d, thres %d), delay %d start symbol %u freq index %u\n",
gNB->Mod_id,
frame,
slot,
max_preamble[0],
max_preamble_energy[0]/10,
max_preamble_energy[0]%10,
+ gNB->measurements.prach_I0,gNB->prach_thres,
max_preamble_delay[0],
prachStartSymbol,
prach_pdu->num_ra);
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 9110e04331..fad1d79dd3 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -194,6 +194,8 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,0);
}
+ if (do_meas==1) stop_meas(&gNB->phy_proc_tx);
+
if ((frame&127) == 0) dump_pdsch_stats(gNB);
//apply the OFDM symbol rotation here
@@ -354,7 +356,7 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
}
-void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id, uint8_t harq_pid, uint8_t crc_flag) {
+ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id, uint8_t harq_pid, uint8_t crc_flag) {
pthread_mutex_lock(&gNB->UL_INFO_mutex);
@@ -380,10 +382,12 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
LOG_D(PHY, "Estimated timing advance PUSCH is = %d, timing_advance_update is %d \n", sync_pos,timing_advance_update);
- // estimate UL_CQI for MAC (from antenna port 0 only)
- int SNRtimes10 = dB_fixed_times10(gNB->pusch_vars[ULSCH_id]->ulsch_power[0]) - (10*gNB->measurements.n0_power_dB[0]);
+ // estimate UL_CQI for MAC
- LOG_D(PHY, "Estimated SNR for PUSCH is = %f dB (ulsch_power %f)\n", SNRtimes10/10,dB_fixed_times10(gNB->pusch_vars[ULSCH_id]->ulsch_power[0])/10.0);
+ int SNRtimes10 = dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot) -
+ dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot);
+
+ LOG_D(PHY, "Estimated SNR for PUSCH is = %f dB (ulsch_power %f, noise %f)\n", SNRtimes10/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot)/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot)/10.0);
if (SNRtimes10 < -640) cqi=0;
else if (SNRtimes10 > 635) cqi=255;
@@ -444,14 +448,14 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
NR_gNB_PUCCH_t *pucch = gNB->pucch[i];
if (pucch) {
if ((pucch->active == 1) &&
- (pucch->frame == frame_rx) &&
- (pucch->slot == slot_rx) ) {
+ (pucch->frame == frame_rx) &&
+ (pucch->slot == slot_rx) ) {
gNB->ulmask_symb = symbol;
nfapi_nr_pucch_pdu_t *pucch_pdu = &pucch->pucch_pdu;
if ((symbol>=pucch_pdu->start_symbol_index) &&
(symbol<(pucch_pdu->start_symbol_index + pucch_pdu->nr_of_symbols))){
for (rb=0; rbprb_size; rb++) {
- rb2 = rb+pucch_pdu->prb_start;
+ rb2 = rb+pucch_pdu->prb_start+pucch_pdu->bwp_start;
gNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31));
}
nb_rb+=pucch_pdu->prb_size;
@@ -479,7 +483,7 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
if ((symbol>=symbol_start) &&
(symbolulsch_pdu.rb_size; rb++) {
- rb2 = rb+ulsch_harq->ulsch_pdu.rb_start;
+ rb2 = rb+ulsch_harq->ulsch_pdu.rb_start+ulsch_harq->ulsch_pdu.bwp_start;
gNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31));
}
nb_rb+=ulsch_harq->ulsch_pdu.rb_size;
@@ -533,18 +537,29 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
if (gNB->frame_parms.frame_type == TDD)
fill_ul_rb_mask(gNB, frame_rx, slot_rx);
- gNB_I0_measurements(gNB);
+ int first_symb=0,num_symb=0;
+ if (gNB->frame_parms.frame_type == TDD)
+ for(int symbol_count=0; symbol_countgNB_config.tdd_table.max_tdd_periodicity_list[slot_rx].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==1) {
+ if (num_symb==0) first_symb=symbol_count;
+ num_symb++;
+ }
+ }
+ else num_symb=NR_NUMBER_OF_SYMBOLS_PER_SLOT;
+ gNB_I0_measurements(gNB,first_symb,num_symb);
int offset = 10*gNB->frame_parms.ofdm_symbol_size + gNB->frame_parms.first_carrier_offset;
int power_rxF = signal_energy_nodc(&gNB->common_vars.rxdataF[0][offset+(47*12)],12*18);
LOG_D(PHY,"frame %d, slot %d: UL signal energy %d\n",frame_rx,slot_rx,power_rxF);
+ start_meas(&gNB->phy_proc_rx);
+
for (int i=0;ipucch[i];
if (pucch) {
if ((pucch->active == 1) &&
- (pucch->frame == frame_rx) &&
- (pucch->slot == slot_rx) ) {
+ (pucch->frame == frame_rx) &&
+ (pucch->slot == slot_rx) ) {
pucch_decode_done = 1;
@@ -561,13 +576,14 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu_format0 = &gNB->uci_pdu_list[num_ucis].pucch_pdu_format_0_1;
nr_decode_pucch0(gNB,
- slot_rx,
+ frame_rx,
+ slot_rx,
uci_pdu_format0,
pucch_pdu);
gNB->UL_INFO.uci_ind.num_ucis += 1;
pucch->active = 0;
- break;
+ break;
case 2:
num_ucis = gNB->UL_INFO.uci_ind.num_ucis;
gNB->UL_INFO.uci_ind.uci_list = &gNB->uci_pdu_list[0];
@@ -586,7 +602,7 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
pucch->active = 0;
break;
default:
- AssertFatal(1==0,"Only PUCCH formats 0 and 2 are currently supported\n");
+ AssertFatal(1==0,"Only PUCCH formats 0 and 2 are currently supported\n");
}
}
}
@@ -595,22 +611,24 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
for (int ULSCH_id=0;ULSCH_idulsch[ULSCH_id][0];
int harq_pid;
- int no_sig;
NR_UL_gNB_HARQ_t *ulsch_harq;
if ((ulsch) &&
(ulsch->rnti > 0)) {
// for for an active HARQ process
for (harq_pid=0;harq_pidharq_processes[harq_pid];
- AssertFatal(ulsch_harq!=NULL,"harq_pid %d is not allocated\n",harq_pid);
- if ((ulsch_harq->status == NR_ACTIVE) &&
- (ulsch_harq->frame == frame_rx) &&
- (ulsch_harq->slot == slot_rx) &&
- (ulsch_harq->handled == 0)){
+ ulsch_harq = ulsch->harq_processes[harq_pid];
+ AssertFatal(ulsch_harq!=NULL,"harq_pid %d is not allocated\n",harq_pid);
+ if ((ulsch_harq->status == NR_ACTIVE) &&
+ (ulsch_harq->frame == frame_rx) &&
+ (ulsch_harq->slot == slot_rx) &&
+ (ulsch_harq->handled == 0)){
LOG_D(PHY, "PUSCH detection started in frame %d slot %d\n",
frame_rx,slot_rx);
+ int num_dmrs=0;
+ for (int s=0;sulsch_pdu.ul_dmrs_symb_pos>>s)&1;
#ifdef DEBUG_RXDATA
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
@@ -641,16 +659,33 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
uint8_t symbol_start = ulsch_harq->ulsch_pdu.start_symbol_index;
uint8_t symbol_end = symbol_start + ulsch_harq->ulsch_pdu.nr_of_symbols;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RX_PUSCH,1);
- start_meas(&gNB->rx_pusch_stats);
- for(uint8_t symbol = symbol_start; symbol < symbol_end; symbol++) {
- no_sig = nr_rx_pusch(gNB, ULSCH_id, frame_rx, slot_rx, symbol, harq_pid);
- if (no_sig) {
- LOG_I(PHY, "PUSCH not detected in symbol %d\n",symbol);
- nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1);
- return;
- }
- }
- stop_meas(&gNB->rx_pusch_stats);
+ start_meas(&gNB->rx_pusch_stats);
+ for (uint8_t symbol = symbol_start; symbol < symbol_end; symbol++) {
+ nr_rx_pusch(gNB, ULSCH_id, frame_rx, slot_rx, symbol, harq_pid);
+ }
+ gNB->pusch_vars[ULSCH_id]->ulsch_power_tot=0;
+ gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot=0;
+ for (int aarx=0;aarxframe_parms.nb_antennas_rx;aarx++) {
+ gNB->pusch_vars[ULSCH_id]->ulsch_power[aarx]/=num_dmrs;
+ gNB->pusch_vars[ULSCH_id]->ulsch_power_tot += gNB->pusch_vars[ULSCH_id]->ulsch_power[aarx];
+ gNB->pusch_vars[ULSCH_id]->ulsch_noise_power[aarx]/=num_dmrs;
+ gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot += gNB->pusch_vars[ULSCH_id]->ulsch_noise_power[aarx];
+ }
+ if (dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot) <
+ dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot) + gNB->pusch_thres) {
+ NR_gNB_SCH_STATS_t *stats=get_ulsch_stats(gNB,ulsch);
+
+ LOG_D(PHY, "PUSCH not detected in %d.%d (%d,%d,%d)\n",frame_rx,slot_rx,
+ dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot),
+ dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot),gNB->pusch_thres);
+ gNB->pusch_vars[ULSCH_id]->ulsch_power_tot = gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot;
+ nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1);
+ gNB->pusch_vars[ULSCH_id]->DTX=1;
+ if (stats) stats->DTX++;
+ return;
+ } else gNB->pusch_vars[ULSCH_id]->DTX=0;
+
+ stop_meas(&gNB->rx_pusch_stats);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RX_PUSCH,0);
//LOG_M("rxdataF_comp.m","rxF_comp",gNB->pusch_vars[0]->rxdataF_comp[0],6900,1,1);
//LOG_M("rxdataF_ext.m","rxF_ext",gNB->pusch_vars[0]->rxdataF_ext[0],6900,1,1);
@@ -662,12 +697,8 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
}
}
}
+ stop_meas(&gNB->phy_proc_rx);
// figure out a better way to choose slot_rx, 19 is ok for a particular TDD configuration with 30kHz SCS
- if ((frame_rx&127) == 0 && slot_rx==19) {
- dump_pusch_stats(gNB);
- LOG_I(PHY, "Number of bad PUCCH received: %lu\n", gNB->bad_pucch);
- }
-
if (pucch_decode_done || pusch_decode_done) {
T(T_GNB_PHY_PUCCH_PUSCH_IQ, T_INT(frame_rx), T_INT(slot_rx), T_BUFFER(&gNB->common_vars.rxdataF[0][0], gNB->frame_parms.symbols_per_slot * gNB->frame_parms.ofdm_symbol_size * 4));
}
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 8873cfed60..fdf3f8891d 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -1135,7 +1135,8 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
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 ------ \n", frame_rx, nr_slot_rx);
+
+ LOG_D(PHY," ------ end ldpc decoder for AbsSubframe %d.%d ------ decoded in %d \n", frame_rx, nr_slot_rx, ret);
LOG_D(PHY, "harq_pid: %d, TBS expected dlsch0: %d \n",harq_pid, dlsch0->harq_processes[harq_pid]->TBS);
if(retmax_ldpc_iterations+1){
diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
index 12e8dc4427..c8929449ff 100644
--- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
+++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
@@ -40,7 +40,8 @@
#include
#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
#include "openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h"
-#include "common/utils/nr/nr_common.h"
+#include
+#include
#ifndef NO_RAT_NR
@@ -55,10 +56,172 @@
#endif
+/* TS 36.213 Table 9.2.3-3: Mapping of values for one HARQ-ACK bit to sequences */
+static const int sequence_cyclic_shift_1_harq_ack_bit[2]
+/* HARQ-ACK Value 0 1 */
+/* Sequence cyclic shift */ = { 0, 6 }
+;
+
+/* TS 36.213 Table 9.2.5-2: Mapping of values for two HARQ-ACK bits and positive SR to sequences */
+static const int sequence_cyclic_shift_2_harq_ack_bits_positive_sr[4]
+/* HARQ-ACK Value (0,0) (0,1) (1,0) (1,1) */
+/* Sequence cyclic shift */ = { 1, 4, 10, 7 }
+;
+
uint8_t nr_is_cqi_TXOp(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t gNB_id);
uint8_t nr_is_ri_TXOp(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t gNB_id);
+static const uint16_t scheduling_request_periodicity[NB_SR_PERIOD]
+= { 0, 0, 1, 2, 4, 5, 8, 10, 16, 20, 40, 80, 160, 320, 640 }
+;
+
+/* TS 38.213 9.2.5.2 UE procedure for multiplexing HARQ-ACK/SR and CSI in a PUCCH */
+/* this is a counter of number of pucch format 4 per subframe */
+static int nb_pucch_format_4_in_subframes[LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] = { 0 } ;
+
+/* TS 36.213 Table 9.2.5.2-1: Code rate corresponding to higher layer parameter PUCCH-F2-maximum-coderate, */
+/* or PUCCH-F3-maximum-coderate, or PUCCH-F4-maximum-coderate */
+/* add one additional element set to 0 for parsing the array until this end */
+/* stored values are code rates * 100 */
+//static const int code_rate_r_time_100[8] = { (0.08 * 100), (0.15 * 100), (0.25*100), (0.35*100), (0.45*100), (0.60*100), (0.80*100), 0 } ;
+
+/* TS 38.213 Table 9.2.3-4: Mapping of values for two HARQ-ACK bits to sequences */
+static const int sequence_cyclic_shift_2_harq_ack_bits[4]
+/* HARQ-ACK Value (0,0) (0,1) (1,0) (1,1) */
+/* Sequence cyclic shift */ = { 0, 3, 9, 6 }
+;
+
+/* TS 38.211 Table 6.4.1.3.3.2-1: DM-RS positions for PUCCH format 3 and 4 */
+static const int nb_symbols_excluding_dmrs[NB_SYMBOL_MINUS_FOUR][2][2]
+= {
+/* No additional DMRS Additional DMRS */
+/* PUCCH length No hopping hopping No hopping hopping */
+/* index 0 1 0 1 */
+/* 4 */ {{ 3 , 2 } , { 3 , 2 }},
+/* 5 */ {{ 3 , 3 } , { 3 , 3 }},
+/* 6 */ {{ 4 , 4 } , { 4 , 4 }},
+/* 7 */ {{ 5 , 5 } , { 5 , 5 }},
+/* 8 */ {{ 6 , 6 } , { 6 , 6 }},
+/* 9 */ {{ 7 , 7 } , { 7 , 7 }},
+/* 10 */ {{ 8 , 8 } , { 6 , 6 }},
+/* 11 */ {{ 9 , 9 } , { 7 , 7 }},
+/* 12 */ {{ 10 , 10 } , { 8 , 8 }},
+/* 13 */ {{ 11 , 11 } , { 9 , 9 }},
+/* 14 */ {{ 12 , 12 } , { 10 , 10 }},
+}
+;
+
+
+/* TS 36.213 Table 9.2.5-1: Mapping of values for one HARQ-ACK bit and positive SR to sequences */
+static const int sequence_cyclic_shift_1_harq_ack_bit_positive_sr[2]
+/* HARQ-ACK Value 0 1 */
+/* Sequence cyclic shift */ = { 3, 9 }
+;
+
+static float RSRP_meas_mapping_nr[98]
+= {
+ -140,
+ -139,
+ -138,
+ -137,
+ -136,
+ -135,
+ -134,
+ -133,
+ -132,
+ -131,
+ -130,
+ -129,
+ -128,
+ -127,
+ -126,
+ -125,
+ -124,
+ -123,
+ -122,
+ -121,
+ -120,
+ -119,
+ -118,
+ -117,
+ -116,
+ -115,
+ -114,
+ -113,
+ -112,
+ -111,
+ -110,
+ -109,
+ -108,
+ -107,
+ -106,
+ -105,
+ -104,
+ -103,
+ -102,
+ -101,
+ -100,
+ -99,
+ -98,
+ -97,
+ -96,
+ -95,
+ -94,
+ -93,
+ -92,
+ -91,
+ -90,
+ -89,
+ -88,
+ -87,
+ -86,
+ -85,
+ -84,
+ -83,
+ -82,
+ -81,
+ -80,
+ -79,
+ -78,
+ -77,
+ -76,
+ -75,
+ -74,
+ -73,
+ -72,
+ -71,
+ -70,
+ -69,
+ -68,
+ -67,
+ -66,
+ -65,
+ -64,
+ -63,
+ -62,
+ -61,
+ -60,
+ -59,
+ -58,
+ -57,
+ -56,
+ -55,
+ -54,
+ -53,
+ -52,
+ -51,
+ -50,
+ -49,
+ -48,
+ -47,
+ -46,
+ -45,
+ -44,
+ -43
+ }
+ ;
+
long
binary_search_float_nr(
float elements[],
@@ -203,6 +366,30 @@ void nr_generate_pucch3_4(int32_t **txdataF,
*
*********************************************************************/
+/* TS 36.213 Table 9.2.1-1: PUCCH resource sets before dedicated PUCCH resource configuration */
+const initial_pucch_resource_t initial_pucch_resource[NB_INITIAL_PUCCH_RESOURCE]
+=
+{
+/* format first symbol Number of symbols PRB offset nb index for set of initial CS */
+/* 0 */ { pucch_format0_nr, 12, 2, 0, 2, { 0, 3, 0, 0 } },
+/* 1 */ { pucch_format0_nr, 12, 2, 0, 3, { 0, 4, 8, 0 } },
+/* 2 */ { pucch_format0_nr, 12, 2, 3, 3, { 0, 4, 8, 0 } },
+/* 3 */ { pucch_format1_nr, 10, 4, 0, 2, { 0, 6, 0, 0 } },
+/* 4 */ { pucch_format1_nr, 10, 4, 0, 4, { 0, 3, 6, 9 } },
+/* 5 */ { pucch_format1_nr, 10, 4, 2, 4, { 0, 3, 6, 9 } },
+/* 6 */ { pucch_format1_nr, 10, 4, 4, 4, { 0, 3, 6, 9 } },
+/* 7 */ { pucch_format1_nr, 4, 10, 0, 2, { 0, 6, 0, 0 } },
+/* 8 */ { pucch_format1_nr, 4, 10, 0, 4, { 0, 3, 6, 9 } },
+/* 9 */ { pucch_format1_nr, 4, 10, 2, 4, { 0, 3, 6, 9 } },
+/* 10 */ { pucch_format1_nr, 4, 10, 4, 4, { 0, 3, 6, 9 } },
+/* 11 */ { pucch_format1_nr, 0, 14, 0, 2, { 0, 6, 0, 0 } },
+/* 12 */ { pucch_format1_nr, 0, 14, 0, 4, { 0, 3, 6, 9 } },
+/* 13 */ { pucch_format1_nr, 0, 14, 2, 4, { 0, 3, 6, 9 } },
+/* 14 */ { pucch_format1_nr, 0, 14, 4, 4, { 0, 3, 6, 9 } },
+/* 15 */ { pucch_format1_nr, 0, 14, 0, 4, { 0, 3, 6, 9 } },
+}
+;
+
bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t *proc, bool reset_harq)
{
uint8_t sr_payload = 0;
@@ -352,7 +539,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
mac->cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig)
AssertFatal(1==0,"6 > %d.%d csi_MeasConfig is not null\n",frame_tx,nr_slot_tx);
-
+
N_UCI = O_SR + O_ACK + O_CSI;
if (N_UCI ==0) return(TRUE);
@@ -459,8 +646,12 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup)
- pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
+ mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
+ pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
+ BWPsize = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
+ BWPstart = NRRIV2PRBOFFSET(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
+ }
+
else AssertFatal(1==0,"no pucch_Config\n");
pucch_resource = select_resource_by_id(pucch_resource_id, pucch_Config);
format = pucch_resource->format.present;
@@ -860,7 +1051,7 @@ uint8_t get_downlink_ack(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t
LOG_E(PHY,"PUCCH Downlink DAI has an invalid value : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
}
else if (harq_status->send_harq_status == 0) {
- LOG_D(PHY,"PUCCH Downlink ack can not be transmitted : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
+ LOG_E(PHY,"PUCCH Downlink ack can not be transmitted : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
}
else {
@@ -1017,9 +1208,9 @@ boolean_t select_pucch_resource(PHY_VARS_NR_UE *ue, NR_UE_MAC_INST_t *mac, uint8
//*resource_set_id = MAX_NB_OF_PUCCH_RESOURCE_SETS;
//*resource_id = MAX_NB_OF_PUCCH_RESOURCES;
- if ((bwp_id ==0 &&
+ if ((bwp_id ==0 &&
mac->cg == NULL) ||
- (bwp_id == 0 &&
+ (bwp_id == 0 &&
mac->cg &&
mac->cg->spCellConfig &&
mac->cg->spCellConfig->spCellConfigDedicated &&
@@ -1221,7 +1412,7 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size)
mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup &&
mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL) ||
+ mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL) ||
(bwp_id==0 &&
mac->cg &&
mac->cg->spCellConfig &&
@@ -1232,7 +1423,7 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size)
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup &&
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList &&
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL)) {
- if (uci_size <= 2) {
+ if (uci_size <= 2) {
pucch_resource_set_id = 0;
return (pucch_resource_set_id);
break;
diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h
index 9b53331f50..97d8d73282 100644
--- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h
+++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h
@@ -60,214 +60,12 @@
/************** VARIABLES *****************************************/
-float RSRP_meas_mapping_nr[98]
-#ifdef INIT_VARIABLES_PUCCH_UE_NR_H
-= {
- -140,
- -139,
- -138,
- -137,
- -136,
- -135,
- -134,
- -133,
- -132,
- -131,
- -130,
- -129,
- -128,
- -127,
- -126,
- -125,
- -124,
- -123,
- -122,
- -121,
- -120,
- -119,
- -118,
- -117,
- -116,
- -115,
- -114,
- -113,
- -112,
- -111,
- -110,
- -109,
- -108,
- -107,
- -106,
- -105,
- -104,
- -103,
- -102,
- -101,
- -100,
- -99,
- -98,
- -97,
- -96,
- -95,
- -94,
- -93,
- -92,
- -91,
- -90,
- -89,
- -88,
- -87,
- -86,
- -85,
- -84,
- -83,
- -82,
- -81,
- -80,
- -79,
- -78,
- -77,
- -76,
- -75,
- -74,
- -73,
- -72,
- -71,
- -70,
- -69,
- -68,
- -67,
- -66,
- -65,
- -64,
- -63,
- -62,
- -61,
- -60,
- -59,
- -58,
- -57,
- -56,
- -55,
- -54,
- -53,
- -52,
- -51,
- -50,
- -49,
- -48,
- -47,
- -46,
- -45,
- -44,
- -43
- }
- #endif
- ;
-
-/* TS 36.213 Table 9.2.1-1: PUCCH resource sets before dedicated PUCCH resource configuration */
-const initial_pucch_resource_t initial_pucch_resource[NB_INITIAL_PUCCH_RESOURCE]
-#ifdef INIT_VARIABLES_PUCCH_UE_NR_H
-=
-{
-/* format first symbol Number of symbols PRB offset nb index for set of initial CS */
-/* 0 */ { pucch_format0_nr, 12, 2, 0, 2, { 0, 3, 0, 0 } },
-/* 1 */ { pucch_format0_nr, 12, 2, 0, 3, { 0, 4, 8, 0 } },
-/* 2 */ { pucch_format0_nr, 12, 2, 3, 3, { 0, 4, 8, 0 } },
-/* 3 */ { pucch_format1_nr, 10, 4, 0, 2, { 0, 6, 0, 0 } },
-/* 4 */ { pucch_format1_nr, 10, 4, 0, 4, { 0, 3, 6, 9 } },
-/* 5 */ { pucch_format1_nr, 10, 4, 2, 4, { 0, 3, 6, 9 } },
-/* 6 */ { pucch_format1_nr, 10, 4, 4, 4, { 0, 3, 6, 9 } },
-/* 7 */ { pucch_format1_nr, 4, 10, 0, 2, { 0, 6, 0, 0 } },
-/* 8 */ { pucch_format1_nr, 4, 10, 0, 4, { 0, 3, 6, 9 } },
-/* 9 */ { pucch_format1_nr, 4, 10, 2, 4, { 0, 3, 6, 9 } },
-/* 10 */ { pucch_format1_nr, 4, 10, 4, 4, { 0, 3, 6, 9 } },
-/* 11 */ { pucch_format1_nr, 0, 14, 0, 2, { 0, 6, 0, 0 } },
-/* 12 */ { pucch_format1_nr, 0, 14, 0, 4, { 0, 3, 6, 9 } },
-/* 13 */ { pucch_format1_nr, 0, 14, 2, 4, { 0, 3, 6, 9 } },
-/* 14 */ { pucch_format1_nr, 0, 14, 4, 4, { 0, 3, 6, 9 } },
-/* 15 */ { pucch_format1_nr, 0, 14, 0, 4, { 0, 3, 6, 9 } },
-}
-#endif
-;
-
-/* TS 36.213 Table 9.2.3-3: Mapping of values for one HARQ-ACK bit to sequences */
-const int sequence_cyclic_shift_1_harq_ack_bit[2]
-#ifdef INIT_VARIABLES_PUCCH_UE_NR_H
-/* HARQ-ACK Value 0 1 */
-/* Sequence cyclic shift */ = { 0, 6 }
-#endif
-;
-
-/* TS 38.213 Table 9.2.3-4: Mapping of values for two HARQ-ACK bits to sequences */
-const int sequence_cyclic_shift_2_harq_ack_bits[4]
-#ifdef INIT_VARIABLES_PUCCH_UE_NR_H
-/* HARQ-ACK Value (0,0) (0,1) (1,0) (1,1) */
-/* Sequence cyclic shift */ = { 0, 3, 9, 6 }
-#endif
-;
-
-/* TS 36.213 Table 9.2.5-1: Mapping of values for one HARQ-ACK bit and positive SR to sequences */
-const int sequence_cyclic_shift_1_harq_ack_bit_positive_sr[2]
-#ifdef INIT_VARIABLES_PUCCH_UE_NR_H
-/* HARQ-ACK Value 0 1 */
-/* Sequence cyclic shift */ = { 3, 9 }
-#endif
-;
-
-/* TS 36.213 Table 9.2.5-2: Mapping of values for two HARQ-ACK bits and positive SR to sequences */
-const int sequence_cyclic_shift_2_harq_ack_bits_positive_sr[4]
-#ifdef INIT_VARIABLES_PUCCH_UE_NR_H
-/* HARQ-ACK Value (0,0) (0,1) (1,0) (1,1) */
-/* Sequence cyclic shift */ = { 1, 4, 10, 7 }
-#endif
-;
-
-/* TS 36.213 Table 9.2.5.2-1: Code rate corresponding to higher layer parameter PUCCH-F2-maximum-coderate, */
-/* or PUCCH-F3-maximum-coderate, or PUCCH-F4-maximum-coderate */
-/* add one additional element set to 0 for parsing the array until this end */
-/* stored values are code rates * 100 */
-const int code_rate_r_time_100[8]
-#ifdef INIT_VARIABLES_PUCCH_UE_NR_H
-= { (0.08 * 100), (0.15 * 100), (0.25*100), (0.35*100), (0.45*100), (0.60*100), (0.80*100), 0 }
-#endif
-;
-
#define NB_SYMBOL_MINUS_FOUR (11)
#define I_PUCCH_NO_ADDITIONAL_DMRS (0)
#define I_PUCCH_ADDITIONAL_DMRS (1)
#define I_PUCCH_NO_HOPPING (0)
#define I_PUCCH_HOPING (1)
-/* TS 38.211 Table 6.4.1.3.3.2-1: DM-RS positions for PUCCH format 3 and 4 */
-const int nb_symbols_excluding_dmrs[NB_SYMBOL_MINUS_FOUR][2][2]
-#ifdef INIT_VARIABLES_PUCCH_UE_NR_H
-= {
-/* No additional DMRS Additional DMRS */
-/* PUCCH length No hopping hopping No hopping hopping */
-/* index 0 1 0 1 */
-/* 4 */ {{ 3 , 2 } , { 3 , 2 }},
-/* 5 */ {{ 3 , 3 } , { 3 , 3 }},
-/* 6 */ {{ 4 , 4 } , { 4 , 4 }},
-/* 7 */ {{ 5 , 5 } , { 5 , 5 }},
-/* 8 */ {{ 6 , 6 } , { 6 , 6 }},
-/* 9 */ {{ 7 , 7 } , { 7 , 7 }},
-/* 10 */ {{ 8 , 8 } , { 6 , 6 }},
-/* 11 */ {{ 9 , 9 } , { 7 , 7 }},
-/* 12 */ {{ 10 , 10 } , { 8 , 8 }},
-/* 13 */ {{ 11 , 11 } , { 9 , 9 }},
-/* 14 */ {{ 12 , 12 } , { 10 , 10 }},
-}
-#endif
-;
-
-/* TS 38.213 9.2.5.2 UE procedure for multiplexing HARQ-ACK/SR and CSI in a PUCCH */
-/* this is a counter of number of pucch format 4 per subframe */
-int nb_pucch_format_4_in_subframes[LTE_NUMBER_OF_SUBFRAMES_PER_FRAME]
-#ifdef INIT_VARIABLES_PUCCH_UE_NR_H
-= { 0 }
-#endif
-;
/*************** FUNCTIONS ****************************************/
diff --git a/openair1/SIMULATION/LTE_PHY/common_sim.h b/openair1/SIMULATION/LTE_PHY/common_sim.h
index 796a576aed..5e0be3de89 100644
--- a/openair1/SIMULATION/LTE_PHY/common_sim.h
+++ b/openair1/SIMULATION/LTE_PHY/common_sim.h
@@ -46,13 +46,13 @@ void sumUpStatsSlot(time_stats_t *res, time_stats_t src[RX_NB_TH][2], int lastAc
}
double squareRoot(time_stats_t *ptr) {
- double timeBase=1/(1000*cpu_freq_GHz);
+ double timeBase=1/(1000*get_cpu_freq_GHz());
return sqrt((double)ptr->diff_square*pow(timeBase,2)/ptr->trials -
pow((double)ptr->diff/ptr->trials*timeBase,2));
}
void printDistribution(time_stats_t *ptr, varArray_t *sortedList, char *txt) {
- double timeBase=1/(1000*cpu_freq_GHz);
+ double timeBase=1/(1000*get_cpu_freq_GHz());
printf("%-43s %6.2f us (%d trials)\n",
txt,
(double)ptr->diff/ptr->trials*timeBase,
@@ -69,7 +69,7 @@ void printStatIndent(time_stats_t *ptr, char *txt) {
}
void printStatIndent2(time_stats_t *ptr, char *txt) {
- double timeBase=1/(1000*cpu_freq_GHz);
+ double timeBase=1/(1000*get_cpu_freq_GHz());
printf(" |__ %-34s %6.2f us (%3d trials)\n",
txt,
ptr->trials?((double)ptr->diff)/ptr->trials*timeBase:0,
@@ -77,7 +77,7 @@ void printStatIndent2(time_stats_t *ptr, char *txt) {
}
void printStatIndent3(time_stats_t *ptr, char *txt) {
- double timeBase=1/(1000*cpu_freq_GHz);
+ double timeBase=1/(1000*get_cpu_freq_GHz());
printf(" |__ %-30s %6.2f us (%3d trials)\n",
txt,
ptr->trials?((double)ptr->diff)/ptr->trials*timeBase:0,
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index 667913d377..8955454282 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -65,11 +65,14 @@ void feptx_ofdm(RU_t *ru, int frame, int subframe);
void feptx_prec(RU_t *ru, int frame, int subframe);
double cpuf;
-#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0))
+#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
//#define MCS_COUNT 23//added for PHY abstraction
#include
int otg_enabled=0;
+THREAD_STRUCT thread_struct;
+nfapi_ue_release_request_body_t release_rntis;
+
/*the following parameters are used to control the processing times calculations*/
double t_tx_max = -1000000000; /*!< \brief initial max process time for tx */
double t_rx_max = -1000000000; /*!< \brief initial max process time for rx */
@@ -1179,7 +1182,7 @@ int main(int argc, char **argv) {
DS_TDL,
forgetting_factor,
rx_sample_offset,
- 0);
+ 0, 0);
reset_meas(&eNB2UE[0]->random_channel);
reset_meas(&eNB2UE[0]->interp_time);
@@ -1193,7 +1196,7 @@ int main(int argc, char **argv) {
DS_TDL,
forgetting_factor,
rx_sample_offset,
- 0);
+ 0, 0);
reset_meas(&eNB2UE[n]->random_channel);
reset_meas(&eNB2UE[n]->interp_time);
}
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c
index a585e8efc6..3b4e6782da 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c
@@ -988,7 +988,7 @@ int main(int argc, char **argv)
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
forgetting_factor,
rx_sample_offset,
- 0);
+ 0, 0);
if(num_rounds>1) {
for(n=1; n<8; n++)
@@ -999,7 +999,7 @@ int main(int argc, char **argv)
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
forgetting_factor,
rx_sample_offset,
- 0);
+ 0, 0);
}
if (eNB2UE[0]==NULL) {
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c
index 5973f80b55..bd164150c5 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c
@@ -834,7 +834,7 @@ int main(int argc, char **argv) {
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
forgetting_factor,
rx_sample_offset,
- 0);
+ 0, 0);
if(num_rounds>1) {
for(n=1; n<4; n++)
@@ -845,7 +845,7 @@ int main(int argc, char **argv) {
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
forgetting_factor,
rx_sample_offset,
- 0);
+ 0, 0);
}
if (eNB2UE[0]==NULL) {
diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c
index b1f4d933b3..78fd1a293e 100644
--- a/openair1/SIMULATION/LTE_PHY/mbmssim.c
+++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c
@@ -1290,7 +1290,7 @@ int main(int argc, char **argv) {
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
forgetting_factor,
rx_sample_offset,
- 0);
+ 0, 0);
reset_meas(&eNB2UE[0]->random_channel);
reset_meas(&eNB2UE[0]->interp_time);
@@ -1303,7 +1303,7 @@ int main(int argc, char **argv) {
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
forgetting_factor,
rx_sample_offset,
- 0);
+ 0, 0);
reset_meas(&eNB2UE[n]->random_channel);
reset_meas(&eNB2UE[n]->interp_time);
}
diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c
index 00ad03c52d..71286faafb 100644
--- a/openair1/SIMULATION/LTE_PHY/pbchsim.c
+++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c
@@ -386,7 +386,7 @@ int main(int argc, char **argv) {
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
0,
0,
- 0);
+ 0, 0);
if (interf1>-20)
eNB2UE1 = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
@@ -396,7 +396,7 @@ int main(int argc, char **argv) {
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
0,
4,
- 0);
+ 0, 0);
if (interf2>-20)
eNB2UE2 = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
@@ -406,7 +406,7 @@ int main(int argc, char **argv) {
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
0,
8,
- 0);
+ 0, 0);
if (eNB2UE==NULL) {
msg("Problem generating channel model. Exiting.\n");
diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c
index 004eb24243..bd2c2d66b9 100644
--- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c
+++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c
@@ -708,7 +708,7 @@ int main(int argc, char **argv) {
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
0,
0,
- 0);
+ 0, 0);
L1_rxtx_proc_t *proc_rxtx = (subframe == 0)? &eNB->proc.L1_proc: &eNB->proc.L1_proc_tx;
eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0);
UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0);
diff --git a/openair1/SIMULATION/LTE_PHY/prachsim.c b/openair1/SIMULATION/LTE_PHY/prachsim.c
index c997aa7639..229764a893 100644
--- a/openair1/SIMULATION/LTE_PHY/prachsim.c
+++ b/openair1/SIMULATION/LTE_PHY/prachsim.c
@@ -343,7 +343,7 @@ int main(int argc, char **argv) {
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
0.0,
delay,
- 0);
+ 0, 0);
if (UE2eNB==NULL) {
msg("Problem generating channel model. Exiting.\n");
diff --git a/openair1/SIMULATION/LTE_PHY/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c
index 127bfcb533..083a756afb 100644
--- a/openair1/SIMULATION/LTE_PHY/pucchsim.c
+++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c
@@ -323,7 +323,7 @@ int main(int argc, char **argv) {
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
0.0,
0,
- 0);
+ 0, 0);
if (UE2eNB==NULL) {
printf("Problem generating channel model. Exiting.\n");
diff --git a/openair1/SIMULATION/LTE_PHY/scansim.c b/openair1/SIMULATION/LTE_PHY/scansim.c
index 5ceeee7f2f..839d30a8de 100644
--- a/openair1/SIMULATION/LTE_PHY/scansim.c
+++ b/openair1/SIMULATION/LTE_PHY/scansim.c
@@ -335,7 +335,7 @@ int main(int argc, char **argv) {
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
0,
0,
- 0);
+ 0, 0);
if (eNB2UE==NULL) {
msg("Problem generating channel model. Exiting.\n");
diff --git a/openair1/SIMULATION/LTE_PHY/syncsim.c b/openair1/SIMULATION/LTE_PHY/syncsim.c
index 80598b37e4..e8ee7d3d5e 100644
--- a/openair1/SIMULATION/LTE_PHY/syncsim.c
+++ b/openair1/SIMULATION/LTE_PHY/syncsim.c
@@ -724,7 +724,7 @@ int main(int argc, char **argv) {
BW,
0,
0,
- 0);
+ 0, 0);
if (interf1>-20)
eNB2UE1 = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
@@ -733,7 +733,7 @@ int main(int argc, char **argv) {
BW,
0,
0,
- 0);
+ 0, 0);
if (interf2>-20)
eNB2UE2 = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
@@ -742,7 +742,7 @@ int main(int argc, char **argv) {
BW,
0,
0,
- 0);
+ 0, 0);
if (eNB2UE==NULL) {
msg("Problem generating channel model. Exiting.\n");
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index 80beee4bed..c6049bc31d 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -57,7 +57,7 @@
#include "executables/split_headers.h"
double cpuf;
-#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0))
+#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
//#define MCS_COUNT 23//added for PHY abstraction
#include
channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];
@@ -70,6 +70,9 @@ node_desc_t *ue_data[NUMBER_OF_UE_MAX];
extern uint16_t beta_ack[16],beta_ri[16],beta_cqi[16];
//extern char* namepointer_chMag ;
int xforms=0;
+THREAD_STRUCT thread_struct;
+nfapi_ue_release_request_body_t release_rntis;
+
FD_lte_phy_scope_enb *form_enb;
char title[255];
@@ -734,7 +737,7 @@ int main(int argc, char **argv) {
30e-9,
forgetting_factor,
delay,
- 0);
+ 0, 0);
// set Doppler
UE2eNB->max_Doppler = maxDoppler;
diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c
index 00983553d8..12b0b1d1f0 100644
--- a/openair1/SIMULATION/NR_PHY/dlschsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlschsim.c
@@ -339,7 +339,7 @@ int main(int argc, char **argv)
61.44e6, //N_RB2sampling_rate(N_RB_DL),
40e6, //N_RB2channel_bandwidth(N_RB_DL),
DS_TDL,
- 0, 0, 0);
+ 0, 0, 0, 0);
if (gNB2UE == NULL) {
printf("Problem generating channel model. Exiting.\n");
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 60e9ae879d..fa1d7a4615 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -63,7 +63,7 @@
//#include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c"
#include "PHY/NR_REFSIG/ptrs_nr.h"
#include "NR_RRCReconfiguration.h"
-#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0))
+#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
#include "SIMULATION/LTE_PHY/common_sim.h"
#include
@@ -83,6 +83,10 @@ uint16_t sf_ahead=4 ;
uint16_t sl_ahead=0;
//uint8_t nfapi_mode = 0;
uint64_t downlink_frequency[MAX_NUM_CCs][4];
+THREAD_STRUCT thread_struct;
+nfapi_ue_release_request_body_t release_rntis;
+msc_interface_t msc_interface;
+
// dummy functions
int dummy_nr_ue_ul_indication(nr_uplink_indication_t *ul_info) { return(0); }
@@ -223,7 +227,8 @@ void nr_dlsim_preprocessor(module_id_t module_id,
/* manually set free CCE to 0 */
const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
- sched_ctrl->search_space = get_searchspace(sched_ctrl->active_bwp, target_ss);
+ NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
+ sched_ctrl->search_space = get_searchspace(scc, sched_ctrl->active_bwp, target_ss);
uint8_t nr_of_candidates;
find_aggregation_candidates(&sched_ctrl->aggregation_level,
&nr_of_candidates,
@@ -273,7 +278,7 @@ int main(int argc, char **argv)
//float psnr;
float eff_tp_check = 0.7;
uint8_t snrRun;
- uint32_t TBS;
+ uint32_t TBS = 0;
int **txdata;
double **s_re,**s_im,**r_re,**r_im;
//double iqim = 0.0;
@@ -770,7 +775,7 @@ int main(int argc, char **argv)
30e-9,
0,
0,
- 0);
+ 0, 0);
if (gNB2UE==NULL) {
printf("Problem generating channel model. Exiting.\n");
@@ -991,7 +996,7 @@ int main(int argc, char **argv)
if (run_initial_sync)
nr_common_signal_procedures(gNB,frame,slot,gNB->ssb[0].ssb_pdu);
else
- phy_procedures_gNB_TX(gNB,frame,slot,0);
+ phy_procedures_gNB_TX(gNB,frame,slot,1);
int txdataF_offset = (slot%2) * frame_parms->samples_per_slot_wCP;
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index c244ecfe3a..3e1b37ac61 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -66,6 +66,7 @@ uint8_t const nr_rv_round_map[4] = {0, 2, 1, 3};
uint8_t const nr_rv_round_map_ue[4] = {0, 2, 1, 3};
uint64_t get_softmodem_optmask(void) {return 0;}
+softmodem_params_t *get_softmodem_params(void) {return 0;}
void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
@@ -479,7 +480,7 @@ int main(int argc, char **argv)
300e-9,
0,
0,
- 0);
+ 0, 0);
if (gNB2UE==NULL) {
printf("Problem generating channel model. Exiting.\n");
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index abe3cbf729..26c1518188 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -67,10 +67,12 @@ extern uint16_t prach_root_sequence_map0_3[838];
openair0_config_t openair0_cfg[MAX_CARDS];
//uint8_t nfapi_mode=0;
uint16_t sl_ahead = 0;
+msc_interface_t msc_interface;
//void dump_nr_prach_config(NR_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
/* temporary dummy implem of get_softmodem_optmask, till basic simulators implemented as device */
+msc_interface_t msc_interface;
uint64_t get_softmodem_optmask(void) {return 0;}
softmodem_params_t *get_softmodem_params(void) {return 0;}
int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0); }
@@ -675,7 +677,7 @@ int main(int argc, char **argv){
DS_TDL,
0.0,
delay,
- 0);
+ 0, 0);
if (UE2gNB==NULL) {
printf("Problem generating channel model. Exiting.\n");
diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c
index 8d79633a6f..4cef1213c9 100644
--- a/openair1/SIMULATION/NR_PHY/pucchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pucchsim.c
@@ -418,7 +418,7 @@ int main(int argc, char **argv)
printf("FFO = %lf; IFO = %d\n",eps-IFO,IFO);
}
- UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model, fs, bw, DS_TDL,0, 0, 0);
+ UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model, fs, bw, DS_TDL,0, 0, 0, 0);
if (UE2gNB==NULL) {
printf("Problem generating channel model. Exiting.\n");
diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c
index 6f2af73a1d..f84e553683 100644
--- a/openair1/SIMULATION/NR_PHY/ulschsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulschsim.c
@@ -364,7 +364,7 @@ int main(int argc, char **argv)
61.44e6, //N_RB2sampling_rate(N_RB_DL),
40e6, //N_RB2channel_bandwidth(N_RB_DL),
DS_TDL,
- 0,0,0);
+ 0,0,0, 0);
if (gNB2UE == NULL) {
printf("Problem generating channel model. Exiting.\n");
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index fb22c5c026..7a6df7d519 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -57,7 +57,7 @@
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
#include "common/utils/threadPool/thread-pool.h"
#include "PHY/NR_REFSIG/ptrs_nr.h"
-#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0))
+#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
#include "SIMULATION/LTE_PHY/common_sim.h"
#include
@@ -81,6 +81,9 @@ uint16_t sl_ahead=0;
double cpuf;
//uint8_t nfapi_mode = 0;
uint64_t downlink_frequency[MAX_NUM_CCs][4];
+THREAD_STRUCT thread_struct;
+nfapi_ue_release_request_body_t release_rntis;
+msc_interface_t msc_interface;
extern void fix_scd(NR_ServingCellConfig_t *scd);// forward declaration
@@ -604,7 +607,7 @@ int main(int argc, char **argv)
sampling_frequency,
bandwidth,
DS_TDL,
- 0, 0, 0);
+ 0, 0, 0, 0);
if (UE2gNB == NULL) {
printf("Problem generating channel model. Exiting.\n");
@@ -1167,7 +1170,6 @@ int main(int argc, char **argv)
gNB->UL_INFO.rx_ind.number_of_pdus = 0;
gNB->UL_INFO.crc_ind.number_crcs = 0;
- start_meas(&gNB->phy_proc_rx);
phy_procedures_gNB_common_RX(gNB, frame, slot);
phy_procedures_gNB_uespec_RX(gNB, frame, slot);
@@ -1199,7 +1201,6 @@ int main(int argc, char **argv)
LOG_M("rxsigF0_llr.m","rxsF0_llr",
&gNB->pusch_vars[0]->llr[0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
}
- start_meas(&gNB->phy_proc_rx);
////////////////////////////////////////////////////////////
if (gNB->ulsch[0][0]->last_iteration_cnt >=
diff --git a/openair1/SIMULATION/TOOLS/DOC/arch.md b/openair1/SIMULATION/TOOLS/DOC/arch.md
new file mode 100644
index 0000000000..30be337829
--- /dev/null
+++ b/openair1/SIMULATION/TOOLS/DOC/arch.md
@@ -0,0 +1,9 @@
+# Channel simulation source files
+
+1. [random_channel.c](../random_channel.c)
+1. [sim.h](../sim.h)
+
+
+
+[channel simulation main page](channel_simulation.md)
+[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
\ No newline at end of file
diff --git a/openair1/SIMULATION/TOOLS/DOC/channel_simulation.md b/openair1/SIMULATION/TOOLS/DOC/channel_simulation.md
new file mode 100644
index 0000000000..be2b987b40
--- /dev/null
+++ b/openair1/SIMULATION/TOOLS/DOC/channel_simulation.md
@@ -0,0 +1,13 @@
+# OAI channel simulation feature
+
+oai includes a channel simulation feature that any component can use to alter time domain samples of a RF channel by applying pre-defined models as defined, for example, in 3GPP TR 36.873 or TR 38.901
+
+Definition, configuration and run-time modification of a channel model are implemented in common code included in UEs, gNb, eNB and used when running with the rfsimulator or the L1 simulator. Phy simulators are also using channel simulation but configuration is done via dedicated command line options. The rfsimulator is the only option to get access to all the configurations and run-time modifications features of oai channel simulation.
+
+## Documentation
+
+* [runtime usage](rtusage.md)
+* [developer usage](devusage.md)
+* [module architecture](arch.md)
+
+[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
diff --git a/openair1/SIMULATION/TOOLS/DOC/devusage.md b/openair1/SIMULATION/TOOLS/DOC/devusage.md
new file mode 100644
index 0000000000..8fa6b3fe7a
--- /dev/null
+++ b/openair1/SIMULATION/TOOLS/DOC/devusage.md
@@ -0,0 +1,7 @@
+### channel simulation developer usage
+
+
+[Configuring the channel simulation](rtusage.md)
+
+[channel simulation main page](channel_simulation.md)
+[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
\ No newline at end of file
diff --git a/openair1/SIMULATION/TOOLS/DOC/rtusage.md b/openair1/SIMULATION/TOOLS/DOC/rtusage.md
new file mode 100644
index 0000000000..37fc62b496
--- /dev/null
+++ b/openair1/SIMULATION/TOOLS/DOC/rtusage.md
@@ -0,0 +1,69 @@
+## configuring the channel simulation
+Oai channel simulation is using the [config module](../../../config/config.md) to get its parameters at init time. The [telnet server](../../telnetsrv/DOC/telnetsrv.md) includes a set of commands which can be used to dynamically modify some channel model parameters
+
+All channel simulation parameters are defined in the `channelmod` section. Most parameters are specific to a channel model and are only used by the rfsimulator.
+
+### global parameters
+
+| name | type | default | description |
+|:---:|:---:|:---:|:----|
+| `max_chan` | integer | `25` | Maximum number of channel model that can be defined in the system. Must be greater than the number of model definitions in the model list loaded at init time. |
+| `modellist` | character string | `DefaultChannelList` | Name of the channel models list to load at init time. |
+
+### Model lists
+
+Several model lists can be defined in the oai configuration file. One, defined by the `modellist` parameter is loaded at init time. In the configuration file each model list item describes a channel model using a group of parameters:
+
+| parameter name | type | default | description |
+|:---:|:---:|:---:|:----|
+| `model name` | character string | mandatory |name of the model, as used in the code to retrieve a model definition|
+| `type` | | `AWGN` | name of the channel modelization algorithm applied on rf signal. The list of available model types can be listed via the [telnet server](../../telnetsrv/DOC/telnetsrv.md) or by entering an invalid type name |
+| `ploss_dB` | real (float) | | path loss of the channel, in dB |
+| `noise_power_dB` | real (double) | | noise of the channel in dB |
+| `forgetfact` | real (double) | | |
+| `offset` | integer | | |
+| `ds_tdl` | real double | | |
+
+Channel simulation parameters can also be specified on the command line:
+
+```bash
+./lte-softmodem -O ../../../ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf --noS1 --rfsim --rfsimulator.options chanmod --rfsimulator.serveraddr enb --telnetsrv --channelmod.modellist modellist_rfsimu_2 --channelmod.modellist_rfsimu_2.[1].offset 120
+```
+### Using the telnet server to modify channel simulator parameters
+The telnet server includes a `channelmod` command which can be used to dynamically modify some channel model parameters. This command is only available when channel simulation is enabled (via `rfsimulator.options chanmod` option when running the rfsimulator. `channelmod` command has its own help:
+
+```
+$ telnet 127.0.0.1 9090
+Trying 127.0.0.1...
+Connected to 127.0.0.1.
+Escape character is '^]'.
+
+softmodem_enb> help
+.....................................
+ module 6 = channelmod:
+ channelmod help
+ channelmod show
+ channelmod modify
+ module 7 = rfsimu:
+ rfsimu setmodel
+softmodem_enb> channelmod help
+channelmod commands can be used to display or modify channel models parameters
+channelmod show predef: display predefined model algorithms available in oai
+channelmod show current: display the currently used models in the running executable
+channelmod modify : set the specified parameters in a current model to the given value
+ specifies the model, the show current model command can be used to list the current models indexes
+ can be one of "riceanf", "aoa", "randaoa", "ploss", "noise_power_dB", "offset", "forgetf"
+softmodem_enb>
+
+```
+
+
+
+
+
+
+
+The [rfsimulator documentation](../../../../targets/ARCH/rfsimulator/README.md ) has also some specific information when using the channel simulation via this tool.
+
+[channel simulation main page](channel_simulation.md)
+[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
\ No newline at end of file
diff --git a/openair1/SIMULATION/TOOLS/phase_noise.c b/openair1/SIMULATION/TOOLS/phase_noise.c
index 5958a0ccdd..6cc24f23db 100644
--- a/openair1/SIMULATION/TOOLS/phase_noise.c
+++ b/openair1/SIMULATION/TOOLS/phase_noise.c
@@ -26,6 +26,7 @@
#include "sim.h"
+static uint16_t LUTSin[ResolSinCos+1];
/* linear phase noise model */
void phase_noise(double ts, int16_t * InRe, int16_t * InIm)
{
diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c
index 47597f4d6e..4e26d9a954 100644
--- a/openair1/SIMULATION/TOOLS/random_channel.c
+++ b/openair1/SIMULATION/TOOLS/random_channel.c
@@ -50,7 +50,7 @@ static int channelmod_print_help(char *buff, int debug, telnet_printfunc_t prnt)
static telnetshell_cmddef_t channelmod_cmdarray[] = {
{"help","",channelmod_print_help},
{"show","",channelmod_show_cmd},
- {"modify"," ",channelmod_modify_cmd},
+ {"modify"," ",channelmod_modify_cmd},
{"","",NULL},
};
@@ -62,13 +62,16 @@ static double snr_dB=25;
static double sinr_dB=0;
static unsigned int max_chan;
static channel_desc_t **defined_channels;
+static char modellist_name[MAX_OPTNAME_SIZE]= {0};
+
+
void fill_channel_desc(channel_desc_t *chan_desc,
uint8_t nb_tx,
uint8_t nb_rx,
uint8_t nb_taps,
uint8_t channel_length,
double *amps,
- double *delays,
+ double *delays,
struct complex **R_sqrt,
double Td,
double sampling_rate,
@@ -136,8 +139,10 @@ void fill_channel_desc(channel_desc_t *chan_desc,
if (R_sqrt == NULL) {
chan_desc->R_sqrt = (struct complex **) calloc(nb_taps,sizeof(struct complex *));
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_NTAPS ;
+
for (i = 0; iR_sqrt[i] = (struct complex *) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
+ chan_desc->R_sqrt[i] = (struct complex *) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
+
for (j = 0; jR_sqrt[i][j].x = 1.0;
chan_desc->R_sqrt[i][j].y = 0.0;
@@ -145,7 +150,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
}
} else {
chan_desc->R_sqrt = (struct complex **) calloc(nb_taps,sizeof(struct complex *));
-
+
for (i = 0; iR_sqrt[i] = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
//chan_desc->R_sqrt = (struct complex*)&R_sqrt[i][0];
@@ -175,224 +180,229 @@ void fill_channel_desc(channel_desc_t *chan_desc,
double mbsfn_delays[] = {0,.03,.15,.31,.37,1.09,12.490,12.52,12.64,12.80,12.86,13.58,27.49,27.52,27.64,27.80,27.86,28.58};
double mbsfn_amps_dB[] = {0,-1.5,-1.4,-3.6,-0.6,-7.0,-10,-11.5,-11.4,-13.6,-10.6,-17.0,-20,-21.5,-21.4,-23.6,-20.6,-27};
-double scm_c_delays[] = {0, 0.0125, 0.0250, 0.3625, 0.3750, 0.3875, 0.2500, 0.2625, 0.2750, 1.0375, 1.0500, 1.0625, 2.7250, 2.7375, 2.7500, 4.6000, 4.6125, 4.6250};
+double scm_c_delays[] = {0, 0.0125, 0.0250, 0.3625, 0.3750, 0.3875, 0.2500, 0.2625, 0.2750, 1.0375, 1.0500, 1.0625, 2.7250, 2.7375, 2.7500, 4.6000, 4.6125, 4.6250};
double scm_c_amps_dB[] = {0.00, -2.22, -3.98, -1.86, -4.08, -5.84, -1.08, -3.30, -5.06, -9.08, -11.30, -13.06, -15.14, -17.36, -19.12, -20.64, -22.85, -24.62};
double tdl_a_delays[] = {0.0000,
- 0.3819,
- 0.4025,
- 0.5868,
- 0.4610,
- 0.5375,
- 0.6708,
- 0.5750,
- 0.7618,
- 1.5375,
- 1.8978,
- 2.2242,
- 2.1718,
- 2.4942,
- 2.5119,
- 3.0582,
- 4.0810,
- 4.4579,
- 4.5695,
- 4.7966,
- 5.0066,
- 5.3043,
- 9.6586};
+ 0.3819,
+ 0.4025,
+ 0.5868,
+ 0.4610,
+ 0.5375,
+ 0.6708,
+ 0.5750,
+ 0.7618,
+ 1.5375,
+ 1.8978,
+ 2.2242,
+ 2.1718,
+ 2.4942,
+ 2.5119,
+ 3.0582,
+ 4.0810,
+ 4.4579,
+ 4.5695,
+ 4.7966,
+ 5.0066,
+ 5.3043,
+ 9.6586
+ };
double tdl_a_amps_dB[] = {-13.4,
- 0,
- -2.2,
- -4,
- -6,
- -8.2,
- -9.9,
- -10.5,
- -7.5,
- -15.9,
- -6.6,
- -16.7,
- -12.4,
- -15.2,
- -10.8,
- -11.3,
- -12.7,
- -16.2,
- -18.3,
- -18.9,
- -16.6,
- -19.9,
- -29.7};
-#define TDL_A_PATHS 23
+ 0,
+ -2.2,
+ -4,
+ -6,
+ -8.2,
+ -9.9,
+ -10.5,
+ -7.5,
+ -15.9,
+ -6.6,
+ -16.7,
+ -12.4,
+ -15.2,
+ -10.8,
+ -11.3,
+ -12.7,
+ -16.2,
+ -18.3,
+ -18.9,
+ -16.6,
+ -19.9,
+ -29.7
+ };
double tdl_b_delays[] = {0.0000,
- 0.1072,
- 0.2155,
- 0.2095,
- 0.2870,
- 0.2986,
- 0.3752,
- 0.5055,
- 0.3681,
- 0.3697,
- 0.5700,
- 0.5283,
- 1.1021,
- 1.2756,
- 1.5474,
- 1.7842,
- 2.0169,
- 2.8294,
- 3.0219,
- 3.6187,
- 4.1067,
- 4.2790,
- 4.7834};
+ 0.1072,
+ 0.2155,
+ 0.2095,
+ 0.2870,
+ 0.2986,
+ 0.3752,
+ 0.5055,
+ 0.3681,
+ 0.3697,
+ 0.5700,
+ 0.5283,
+ 1.1021,
+ 1.2756,
+ 1.5474,
+ 1.7842,
+ 2.0169,
+ 2.8294,
+ 3.0219,
+ 3.6187,
+ 4.1067,
+ 4.2790,
+ 4.7834
+ };
double tdl_b_amps_dB[] = {0,
- -2.2,
- -4,
- -3.2,
- -9.8,
- -1.2,
- -3.4,
- -5.2,
- -7.6,
- -3,
- -8.9,
- -9,
- -4.8,
- -5.7,
- -7.5,
- -1.9,
- -7.6,
- -12.2,
- -9.8,
- -11.4,
- -14.9,
- -9.2,
- -11.3};
-#define TDL_B_PATHS 23
+ -2.2,
+ -4,
+ -3.2,
+ -9.8,
+ -1.2,
+ -3.4,
+ -5.2,
+ -7.6,
+ -3,
+ -8.9,
+ -9,
+ -4.8,
+ -5.7,
+ -7.5,
+ -1.9,
+ -7.6,
+ -12.2,
+ -9.8,
+ -11.4,
+ -14.9,
+ -9.2,
+ -11.3
+ };
double tdl_c_delays[] = {0,
- 0.2099,
- 0.2219,
- 0.2329,
- 0.2176,
- 0.6366,
- 0.6448,
- 0.6560,
- 0.6584,
- 0.7935,
- 0.8213,
- 0.9336,
- 1.2285,
- 1.3083,
- 2.1704,
- 2.7105,
- 4.2589,
- 4.6003,
- 5.4902,
- 5.6077,
- 6.3065,
- 6.6374,
- 7.0427,
- 8.6523};
+ 0.2099,
+ 0.2219,
+ 0.2329,
+ 0.2176,
+ 0.6366,
+ 0.6448,
+ 0.6560,
+ 0.6584,
+ 0.7935,
+ 0.8213,
+ 0.9336,
+ 1.2285,
+ 1.3083,
+ 2.1704,
+ 2.7105,
+ 4.2589,
+ 4.6003,
+ 5.4902,
+ 5.6077,
+ 6.3065,
+ 6.6374,
+ 7.0427,
+ 8.6523
+ };
double tdl_c_amps_dB[] = {-4.4,
- -1.2,
- -3.5,
- -5.2,
- -2.5,
- 0,
- -2.2,
- -3.9,
- -7.4,
- -7.1,
- -10.7,
- -11.1,
- -5.1,
- -6.8,
- -8.7,
- -13.2,
- -13.9,
- -13.9,
- -15.8,
- -17.1,
- -16,
- -15.7,
- -21.6,
- -22.8};
-#define TDL_C_PATHS 24
+ -1.2,
+ -3.5,
+ -5.2,
+ -2.5,
+ 0,
+ -2.2,
+ -3.9,
+ -7.4,
+ -7.1,
+ -10.7,
+ -11.1,
+ -5.1,
+ -6.8,
+ -8.7,
+ -13.2,
+ -13.9,
+ -13.9,
+ -15.8,
+ -17.1,
+ -16,
+ -15.7,
+ -21.6,
+ -22.8
+ };
double tdl_d_delays[] = {//0,
- 0,
- 0.035,
- 0.612,
- 1.363,
- 1.405,
- 1.804,
- 2.596,
- 1.775,
- 4.042,
- 7.937,
- 9.424,
- 9.708,
- 12.525};
+ 0,
+ 0.035,
+ 0.612,
+ 1.363,
+ 1.405,
+ 1.804,
+ 2.596,
+ 1.775,
+ 4.042,
+ 7.937,
+ 9.424,
+ 9.708,
+ 12.525
+};
double tdl_d_amps_dB[] = {//-0.2,
-//-13.5,
- -.00147,
- -18.8,
- -21,
- -22.8,
- -17.9,
- -20.1,
- -21.9,
- -22.9,
- -27.8,
- -23.6,
- -24.8,
- -30.0,
- -27.7};
+ //-13.5,
+ -.00147,
+ -18.8,
+ -21,
+ -22.8,
+ -17.9,
+ -20.1,
+ -21.9,
+ -22.9,
+ -27.8,
+ -23.6,
+ -24.8,
+ -30.0,
+ -27.7
+ };
-#define TDL_D_PATHS 13
#define TDL_D_RICEAN_FACTOR .046774
double tdl_e_delays[] = {0,
- 0.5133,
- 0.5440,
- 0.5630,
- 0.5440,
- 0.7112,
- 1.9092,
- 1.9293,
- 1.9589,
- 2.6426,
- 3.7136,
- 5.4524,
- 12.0034,
- 20.6519};
+ 0.5133,
+ 0.5440,
+ 0.5630,
+ 0.5440,
+ 0.7112,
+ 1.9092,
+ 1.9293,
+ 1.9589,
+ 2.6426,
+ 3.7136,
+ 5.4524,
+ 12.0034,
+ 20.6519
+ };
double tdl_e_amps_dB[] = {//-0.03,
- //-22.03,
- -.00433,
- -15.8,
- -18.1,
- -19.8,
- -22.9,
- -22.4,
- -18.6,
- -20.8,
- -22.6,
- -22.3,
- -25.6,
- -20.2,
- -29.8,
- -29.2};
+ //-22.03,
+ -.00433,
+ -15.8,
+ -18.1,
+ -19.8,
+ -22.9,
+ -22.4,
+ -18.6,
+ -20.8,
+ -22.6,
+ -22.3,
+ -25.6,
+ -20.2,
+ -29.8,
+ -29.2
+ };
-#define TDL_E_PATHS 14
#define TDL_E_RICEAN_FACTOR 0.0063096
double epa_delays[] = { 0,.03,.07,.09,.11,.19,.41};
@@ -494,31 +504,101 @@ struct complex *R_sqrt_22_EPA_medium[1] = {R_sqrt_22_EPA_medium_tap};
//Rayleigh1_orth_eff_ch_TM4
+void tdlModel(int tdl_paths, double *tdl_delays, double *tdl_amps_dB, double DS_TDL, channel_desc_t *chan_desc ) {
+ int nb_rx=chan_desc-> nb_rx;
+ int nb_tx=chan_desc-> nb_tx;
+ int tdl_pathsby3 = tdl_paths/3;
+
+ if ((tdl_paths%3)>0)
+ tdl_pathsby3++;
+
+ chan_desc->nb_taps = tdl_paths;
+ chan_desc->Td = tdl_delays[tdl_paths-1]*DS_TDL;
+ printf("last path (%d) at %f * %e = %e\n",tdl_paths-1,tdl_delays[tdl_paths-1],DS_TDL,chan_desc->Td);
+ chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td +
+ 1 +
+ 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
+ printf("TDL : %f Ms/s, nb_taps %d, Td %e, channel_length %d\n",chan_desc->sampling_rate,tdl_paths,chan_desc->Td,chan_desc->channel_length);
+ double sum_amps = 0;
+ chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
+
+ for (int i = 0; inb_taps; i++) {
+ chan_desc->amps[i] = pow(10,.1*tdl_amps_dB[i]);
+ sum_amps += chan_desc->amps[i];
+ }
+
+ for (int i = 0; inb_taps; i++) {
+ chan_desc->amps[i] /= sum_amps;
+ tdl_delays[i] *= DS_TDL;
+ }
+
+ chan_desc->delays = tdl_delays;
+ chan_desc->aoa = 0;
+ chan_desc->random_aoa = 0;
+ chan_desc->ch = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
+ chan_desc->chF = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
+ chan_desc->a = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+
+ for (int i = 0; ich[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+
+ for (int i = 0; ichF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+
+ for (int i = 0; inb_taps; i++)
+ chan_desc->a[i] = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+
+ chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **));
+
+ if (nb_tx==2 && nb_rx==2) {
+ for (int i = 0; i<(tdl_pathsby3); i++)
+ chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+ } else if (nb_tx==2 && nb_rx==1) {
+ for (int i = 0; i<(tdl_pathsby3); i++)
+ chan_desc->R_sqrt[i] = (struct complex *) &R21_sqrt[i][0];
+ } else if (nb_tx==1 && nb_rx==2) {
+ for (int i = 0; i<(tdl_pathsby3); i++)
+ chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
+ } else {
+ for (int i = 0; i<(tdl_pathsby3); i++) {
+ chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+
+ for (int j = 0; jR_sqrt[i][j].x = 1.0;
+ chan_desc->R_sqrt[i][j].y = 0.0;
+ }
+
+ LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
+ }
+ }
+}
+
channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
uint8_t nb_rx,
SCM_t channel_model,
double sampling_rate,
double channel_bandwidth,
- double DS_TDL,
+ double DS_TDL,
double forgetting_factor,
int32_t channel_offset,
- double path_loss_dB) {
+ double path_loss_dB,
+ float noise_power_dB) {
channel_desc_t *chan_desc = (channel_desc_t *)calloc(1,sizeof(channel_desc_t));
- for(int i=0; ichan_idx=i;
- break;
- }
- else {
- AssertFatal(i<(max_chan-1),
- "No more channel descriptors available, increase channelmod.max_chan parameter above %u\n",max_chan);
- }
+
+ for(int i=0; ichan_idx=i;
+ break;
+ } else {
+ AssertFatal(i<(max_chan-1),
+ "No more channel descriptors available, increase channelmod.max_chan parameter above %u\n",max_chan);
+ }
}
+
uint16_t i,j;
double sum_amps;
double aoa,ricean_factor,Td,maxDoppler;
-
int channel_length,nb_taps;
chan_desc->modelid = channel_model;
chan_desc->nb_tx = nb_tx;
@@ -530,13 +610,13 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc->path_loss_dB = path_loss_dB;
chan_desc->first_run = 1;
chan_desc->ip = 0.0;
+ chan_desc->noise_power_dB = noise_power_dB;
LOG_I(OCM,"Channel Model (inside of new_channel_desc_scm)=%d\n\n", channel_model);
-
int tdl_paths=0;
- double tdl_ricean_factor = 1;
double *tdl_amps_dB;
double *tdl_delays;
+ /* Spatial Channel Models (SCM) channel model from TR 38.901 Section 7.7.2 */
switch (channel_model) {
case SCM_A:
LOG_W(OCM,"channel model not yet supported\n");
@@ -554,7 +634,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
sum_amps = 0;
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
- chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
+ chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
+
for (i = 0; inb_taps; i++) {
chan_desc->amps[i] = pow(10,.1*scm_c_amps_dB[i]);
sum_amps += chan_desc->amps[i];
@@ -592,10 +673,11 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
for (i = 0; i<6; i++)
chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
} else {
- chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
+ chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
+
for (i = 0; i<6; i++) {
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
-
+
for (j = 0; jR_sqrt[i][j].x = 1.0;
chan_desc->R_sqrt[i][j].y = 0.0;
@@ -615,6 +697,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps = 0;
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
+
for (i = 0; inb_taps; i++) {
chan_desc->amps[i] = pow(10,.1*scm_c_amps_dB[i]);
sum_amps += chan_desc->amps[i];
@@ -652,7 +735,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
for (i = 0; i<6; i++)
chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
} else {
- chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
+ chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
+
for (i = 0; i<6; i++) {
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
@@ -666,99 +750,41 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
}
break;
-
+ /* tapped delay line (TDL) channel model from TR 38.901 Section 7.7.2 */
+#define tdl_m(MoDel)\
+ DevAssert(sizeof(tdl_ ## MoDel ## _amps_dB) == sizeof(tdl_ ## MoDel ## _delays)); \
+ tdl_paths=sizeof(tdl_ ## MoDel ## _amps_dB)/sizeof(*tdl_ ## MoDel ## _amps_dB);\
+ tdl_delays=tdl_ ## MoDel ## _delays;\
+ tdl_amps_dB=tdl_ ## MoDel ## _amps_dB
+
case TDL_A:
+ chan_desc->ricean_factor = 1;
+ tdl_m(a);
+ tdlModel(tdl_paths, tdl_delays, tdl_amps_dB, DS_TDL, chan_desc);
+ break;
+
case TDL_B:
- case TDL_C:
- case TDL_D:
+ chan_desc->ricean_factor = 1;
+ tdl_m(b);
+ tdlModel(tdl_paths, tdl_delays, tdl_amps_dB, DS_TDL, chan_desc);
+ break;
+
+ case TDL_C:
+ chan_desc->ricean_factor = 1;
+ tdl_m(c);
+ tdlModel(tdl_paths, tdl_delays, tdl_amps_dB, DS_TDL, chan_desc);
+ break;
+
+ case TDL_D:
+ chan_desc->ricean_factor = TDL_D_RICEAN_FACTOR;
+ tdl_m(d);
+ tdlModel(tdl_paths, tdl_delays, tdl_amps_dB, DS_TDL, chan_desc);
+ break;
+
case TDL_E:
- if (channel_model == TDL_A) {
- tdl_paths=TDL_A_PATHS;
- tdl_delays=tdl_a_delays;
- tdl_amps_dB=tdl_a_amps_dB;
- }else if (channel_model == TDL_B) {
- tdl_paths=TDL_B_PATHS;
- tdl_delays=tdl_b_delays;
- tdl_amps_dB=tdl_b_amps_dB;
- }
- else if (channel_model == TDL_C) {
- tdl_paths=TDL_C_PATHS;
- tdl_delays=tdl_c_delays;
- tdl_amps_dB=tdl_c_amps_dB;
- printf("Initializing TDL_C channel with %d paths\n",TDL_C_PATHS);
- } else if (channel_model == TDL_D) {
- tdl_paths=TDL_D_PATHS;
- tdl_delays=tdl_d_delays;
- tdl_amps_dB=tdl_d_amps_dB;
- tdl_ricean_factor = TDL_D_RICEAN_FACTOR;
- } else if (channel_model == TDL_E) {
- tdl_paths=TDL_E_PATHS-1;
- tdl_delays=tdl_e_delays+1;
- tdl_amps_dB=tdl_e_amps_dB;
- tdl_ricean_factor = TDL_E_RICEAN_FACTOR;
- }
-
- int tdl_pathsby3 = tdl_paths/3;
- if ((tdl_paths%3)>0) tdl_pathsby3++;
-
- chan_desc->nb_taps = tdl_paths;
- chan_desc->Td = tdl_delays[tdl_paths-1]*DS_TDL;
- printf("last path (%d) at %f * %e = %e\n",tdl_paths-1,tdl_delays[tdl_paths-1],DS_TDL,chan_desc->Td);
- chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
- printf("TDL : %f Ms/s, nb_taps %d, Td %e, channel_length %d\n",chan_desc->sampling_rate,tdl_paths,chan_desc->Td,chan_desc->channel_length);
- sum_amps = 0;
- chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
-
- for (i = 0; inb_taps; i++) {
- chan_desc->amps[i] = pow(10,.1*tdl_amps_dB[i]);
- sum_amps += chan_desc->amps[i];
- }
-
- for (i = 0; inb_taps; i++) {
- chan_desc->amps[i] /= sum_amps;
- tdl_delays[i] *= DS_TDL;
- }
- chan_desc->delays = tdl_delays;
- chan_desc->ricean_factor = tdl_ricean_factor;
- chan_desc->aoa = 0;
- chan_desc->random_aoa = 0;
- chan_desc->ch = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
- chan_desc->chF = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
- chan_desc->a = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
-
- for (i = 0; ich[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
-
- for (i = 0; ichF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
-
- for (i = 0; inb_taps; i++)
- chan_desc->a[i] = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
-
- chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **));
-
- if (nb_tx==2 && nb_rx==2) {
- for (i = 0; i<(tdl_pathsby3); i++)
- chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
- } else if (nb_tx==2 && nb_rx==1) {
- for (i = 0; i<(tdl_pathsby3); i++)
- chan_desc->R_sqrt[i] = (struct complex *) &R21_sqrt[i][0];
- } else if (nb_tx==1 && nb_rx==2) {
- for (i = 0; i<(tdl_pathsby3); i++)
- chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
- } else {
- for (i = 0; i<(tdl_pathsby3); i++) {
- chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
-
- for (j = 0; jR_sqrt[i][j].x = 1.0;
- chan_desc->R_sqrt[i][j].y = 0.0;
- }
-
- LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
- }
- }
-
+ chan_desc->ricean_factor = TDL_E_RICEAN_FACTOR;
+ tdl_m(e);
+ tdlModel(tdl_paths, tdl_delays, tdl_amps_dB, DS_TDL, chan_desc);
break;
case EPA:
@@ -768,6 +794,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps = 0;
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
+
for (i = 0; inb_taps; i++) {
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
sum_amps += chan_desc->amps[i];
@@ -786,7 +813,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
for (i = 0; ich[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
-
+
for (i = 0; ichF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
@@ -801,6 +828,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
} else {
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **));
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
+
for (i = 0; i<6; i++) {
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
@@ -822,6 +850,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps = 0;
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
+
for (i = 0; inb_taps; i++) {
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
sum_amps += chan_desc->amps[i];
@@ -867,7 +896,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
}
}*/
- break;
+ break;
case EPA_high:
chan_desc->nb_taps = 7;
@@ -876,6 +905,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps = 0;
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
+
for (i = 0; inb_taps; i++) {
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
sum_amps += chan_desc->amps[i];
@@ -929,7 +959,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
sum_amps = 0;
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
- chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
+ chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
+
for (i = 0; inb_taps; i++) {
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
sum_amps += chan_desc->amps[i];
@@ -984,6 +1015,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps = 0;
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
+
for (i = 0; inb_taps; i++) {
chan_desc->amps[i] = pow(10,.1*eva_amps_dB[i]);
sum_amps += chan_desc->amps[i];
@@ -1017,7 +1049,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
} else {
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **));
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
- for (i = 0; i<6; i++) {
+
+ for (i = 0; i<6; i++) {
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
for (j = 0; jamps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
+
for (i = 0; inb_taps; i++) {
chan_desc->amps[i] = pow(10,.1*etu_amps_dB[i]);
sum_amps += chan_desc->amps[i];
@@ -1071,6 +1105,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
} else {
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **));
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
+
for (i = 0; i<6; i++) {
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
@@ -1092,6 +1127,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
sum_amps = 0;
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
+
for (i = 0; inb_taps; i++) {
chan_desc->amps[i] = pow(10,.1*mbsfn_amps_dB[i]);
sum_amps += chan_desc->amps[i];
@@ -1119,6 +1155,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex *));
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6;
+
for (i = 0; i<6; i++) {
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
@@ -1628,38 +1665,65 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc->nb_paths = 10;
return(chan_desc);
-}
-
+} /* channel_desc_t *new_channel_desc_scm */
+
+channel_desc_t *find_channel_desc_fromname( char *modelname ) {
+ for(int i=0; imodel_name,modelname) == 0)
+ return defined_channels[i];
+ }
+ }
+
+ LOG_E(OCM,"Model %s not found \n", modelname);
+ return NULL;
+} /* channel_desc_t * new_channel_desc_fromconfig */
+
+
+
void free_channel_desc_scm(channel_desc_t *ch) {
// Must be made cleanly, a lot of leaks...
if (max_chan != 0) defined_channels[ch->chan_idx]=NULL;
if(ch->free_flags&CHANMODEL_FREE_AMPS)
free(ch->amps);
- for (int i = 0; inb_tx*ch->nb_rx; i++) {
+
+ for (int i = 0; inb_tx*ch->nb_rx; i++) {
free(ch->ch[i]);
free(ch->chF[i]);
}
-
+
for (int i = 0; inb_taps; i++) {
- free(ch->a[i]);
- }
+ free(ch->a[i]);
+ }
+
if(ch->free_flags&CHANMODEL_FREE_DELAY)
- free(ch->delays);
+ free(ch->delays);
+
if(ch->free_flags&CHANMODEL_FREE_RSQRT_6)
- for (int i = 0; i<6; i++)
- free(ch->R_sqrt[i]);
+ for (int i = 0; i<6; i++)
+ free(ch->R_sqrt[i]);
+
if(ch->free_flags&CHANMODEL_FREE_RSQRT_NTAPS)
- for (int i = 0; inb_taps;i++)
- free(ch->R_sqrt[i]);
- free(ch->R_sqrt);
- free(ch->ch);
+ for (int i = 0; inb_taps; i++)
+ free(ch->R_sqrt[i]);
+
+ free(ch->R_sqrt);
+ free(ch->ch);
free(ch->chF);
- free(ch->a);
- free(ch);
+ free(ch->a);
+ free(ch->model_name);
+ free(ch);
}
void set_channeldesc_owner(channel_desc_t *cdesc, uint32_t module_id) {
- cdesc->module_id=module_id;
+ cdesc->module_id=module_id;
+}
+
+void set_channeldesc_name(channel_desc_t *cdesc,char *modelname) {
+ if(cdesc->model_name != NULL)
+ free(cdesc->model_name);
+
+ cdesc->model_name=strdup(modelname);
}
int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
@@ -1780,14 +1844,14 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
desc->ch[aarx+(aatx*desc->nb_rx)][k].x += s*desc->a[l][aarx+(aatx*desc->nb_rx)].x;
desc->ch[aarx+(aatx*desc->nb_rx)][k].y += s*desc->a[l][aarx+(aatx*desc->nb_rx)].y;
- // printf("l %d : desc->ch.x %f, s %e, delay %f\n",l,desc->a[l][aarx+(aatx*desc->nb_rx)].x,s,desc->delays[l]);
+ // printf("l %d : desc->ch.x %f, s %e, delay %f\n",l,desc->a[l][aarx+(aatx*desc->nb_rx)].x,s,desc->delays[l]);
} //nb_taps
#ifdef DEBUG_CH
printf("(%d,%d,%d)->(%e,%e)\n",k,aarx,aatx,desc->ch[aarx+(aatx*desc->nb_rx)][k].x,desc->ch[aarx+(aatx*desc->nb_rx)][k].y);
#endif
} //channel_length
- }
+ }
} //aatx
} //aarx
@@ -1799,7 +1863,7 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
return (0);
}
-
+
double N_RB2sampling_rate(uint16_t N_RB) {
double sampling_rate;
@@ -1848,128 +1912,144 @@ double N_RB2channel_bandwidth(uint16_t N_RB) {
break;
default:
- LOG_E(PHY,"Unknown N_PRB\n");
+ LOG_E(OCM,"Unknown N_PRB\n");
return(-1);
}
- return(channel_bandwidth);
-}
-
+ return(channel_bandwidth);
+}
+
+
static int channelmod_print_help(char *buff, int debug, telnet_printfunc_t prnt ) {
- prnt("channelmod commands can be used to display or modify channel models parameters\n");
- prnt("channelmod show predef: display predefined model algorithms available in oai\n");
- prnt("channelmod show current: display the currently used models in the running executable\n");
- prnt("channelmod modify : set the specified parameters in a current model to the given value\n");
- prnt(" specifies the model, the show current model command can be used to list the current models indexes\n");
- prnt(" can be one of \"riceanf\", \"aoa\", \"randaoa\", \"ploss\", \"offset\", \"forgetf\"\n");
- return CMDSTATUS_FOUND;
+ prnt("channelmod commands can be used to display or modify channel models parameters\n");
+ prnt("channelmod show predef: display predefined model algorithms available in oai\n");
+ prnt("channelmod show current: display the currently used models in the running executable\n");
+ prnt("channelmod modify : set the specified parameters in a current model to the given value\n");
+ prnt(" specifies the model, the show current model command can be used to list the current models indexes\n");
+ prnt(" can be one of \"riceanf\", \"aoa\", \"randaoa\", \"ploss\", \"noise_power_dB\", \"offset\", \"forgetf\"\n");
+ return CMDSTATUS_FOUND;
}
static void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_t prnt) {
- char *module_id_str[]=MODULEID_STR_INIT;
- if (cd->module_id != 0) {
- prnt("model owner: %s\n",module_id_str[cd->module_id]);
- }
- prnt("nb_tx: %i nb_rx: %i taps: %i bandwidth: %lf sampling: %lf\n",cd->nb_tx, cd->nb_rx, cd->nb_taps, cd->channel_bandwidth, cd->sampling_rate);
- prnt("channel length: %i Max path delay: %lf ricean fact.: %lf angle of arrival: %lf (randomized:%s)\n",
- cd->channel_length, cd->Td, cd->ricean_factor, cd->aoa, (cd->random_aoa?"Yes":"No"));
- prnt("max Doppler: %lf path loss: %lf rchannel offset: %i forget factor; %lf\n",
- cd->max_Doppler, cd->path_loss_dB, cd->channel_offset, cd->forgetting_factor);
- prnt("Initial phase: %lf nb_path: %i \n",
- cd->ip, cd->nb_paths);
- for (int i=0; inb_taps ; i++) {
- prnt("taps: %i lin. ampli. : %lf delay: %lf \n",i,cd->amps[i], cd->delays[i]);
- }
+ char *module_id_str[]=MODULEID_STR_INIT;
+ prnt("model owner: %s\n",(cd->module_id != 0)?module_id_str[cd->module_id]:"not set");
+ prnt("nb_tx: %i nb_rx: %i taps: %i bandwidth: %lf sampling: %lf\n",cd->nb_tx, cd->nb_rx, cd->nb_taps, cd->channel_bandwidth, cd->sampling_rate);
+ prnt("channel length: %i Max path delay: %lf ricean fact.: %lf angle of arrival: %lf (randomized:%s)\n",
+ cd->channel_length, cd->Td, cd->ricean_factor, cd->aoa, (cd->random_aoa?"Yes":"No"));
+ prnt("max Doppler: %lf path loss: %lf noise: %lf rchannel offset: %i forget factor; %lf\n",
+ cd->max_Doppler, cd->path_loss_dB, cd->noise_power_dB, cd->channel_offset, cd->forgetting_factor);
+ prnt("Initial phase: %lf nb_path: %i \n",
+ cd->ip, cd->nb_paths);
+
+ for (int i=0; inb_taps ; i++) {
+ prnt("taps: %i lin. ampli. : %lf delay: %lf \n",i,cd->amps[i], cd->delays[i]);
+ }
}
-
-
+
+
static int channelmod_show_cmd(char *buff, int debug, telnet_printfunc_t prnt) {
- char *subcmd=NULL;
+ char *subcmd=NULL;
int s = sscanf(buff,"%ms\n",&subcmd);
if (s>0) {
if ( strcmp(subcmd,"predef") == 0) {
for (int i=0; channelmod_names[i].name != NULL ; i++) {
prnt(" %i %s\n", i, map_int_to_str(channelmod_names,i ));
- }
+ }
} else if ( strcmp(subcmd,"current") == 0) {
for (int i=0; i < max_chan ; i++) {
- if (defined_channels[i] != NULL) {
- prnt("model %i %s: \n----------------\n", i, map_int_to_str(channelmod_names,defined_channels[i]->modelid));
- display_channelmodel(defined_channels[i],debug,prnt);
+ if (defined_channels[i] != NULL) {
+ prnt("model %i %s type %s: \n----------------\n", i, (defined_channels[i]->model_name !=NULL)?defined_channels[i]->model_name:"(no name set)",
+ map_int_to_str(channelmod_names,defined_channels[i]->modelid));
+ display_channelmodel(defined_channels[i],debug,prnt);
}
}
} else {
- channelmod_print_help(buff, debug, prnt);
+ channelmod_print_help(buff, debug, prnt);
}
- free(subcmd);
+
+ free(subcmd);
}
+
return CMDSTATUS_FOUND;
}
-
+
static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt) {
- char *param=NULL, *value=NULL;
+ char *param=NULL, *value=NULL;
int cd_id= -1;
int s = sscanf(buff,"%i %ms %ms \n",&cd_id,¶m, &value);
+
if (cd_id<0 || cd_id >= max_chan) {
- prnt("ERROR, %i: Channel model id outof range (0-%i)\n",cd_id,max_chan-1);
- return CMDSTATUS_FOUND;
+ prnt("ERROR, %i: Channel model id outof range (0-%i)\n",cd_id,max_chan-1);
+ return CMDSTATUS_FOUND;
}
+
if (defined_channels[cd_id]==NULL) {
- prnt("ERROR, %i: Channel model has not been set\n",cd_id);
- return CMDSTATUS_FOUND;
- }
-
+ prnt("ERROR, %i: Channel model has not been set\n",cd_id);
+ return CMDSTATUS_FOUND;
+ }
+
if (s==3) {
if ( strcmp(param,"riceanf") == 0) {
- double dbl = atof(value);
- if (dbl <0 || dbl > 1)
- prnt("ERROR: ricean factor range: 0 to 1, %lf is outof range\n",dbl);
- else
- defined_channels[cd_id]->ricean_factor=dbl;
+ double dbl = atof(value);
+
+ if (dbl <0 || dbl > 1)
+ prnt("ERROR: ricean factor range: 0 to 1, %lf is outof range\n",dbl);
+ else
+ defined_channels[cd_id]->ricean_factor=dbl;
} else if ( strcmp(param,"aoa") == 0) {
- double dbl = atof(value);
- if (dbl <0 || dbl >6.28)
- prnt("ERROR: angle of arrival range: 0 to 2*Pi, %lf is outof range\n",dbl);
- else
- defined_channels[cd_id]->aoa=dbl;
+ double dbl = atof(value);
+
+ if (dbl <0 || dbl >6.28)
+ prnt("ERROR: angle of arrival range: 0 to 2*Pi, %lf is outof range\n",dbl);
+ else
+ defined_channels[cd_id]->aoa=dbl;
} else if ( strcmp(param,"randaoa") == 0) {
- int i = atoi(value);
- if (i!=0 && i!=1)
- prnt("ERROR: randaoa is a boolean, must be 0 or 1\n");
- else
- defined_channels[cd_id]->random_aoa=i;
+ int i = atoi(value);
+
+ if (i!=0 && i!=1)
+ prnt("ERROR: randaoa is a boolean, must be 0 or 1\n");
+ else
+ defined_channels[cd_id]->random_aoa=i;
} else if ( strcmp(param,"ploss") == 0) {
- double dbl = atof(value);
- defined_channels[cd_id]->path_loss_dB=dbl;
+ double dbl = atof(value);
+ defined_channels[cd_id]->path_loss_dB=dbl;
+ } else if ( strcmp(param,"noise_power_dB") == 0) {
+ double dbl = atof(value);
+ defined_channels[cd_id]->noise_power_dB=dbl;
} else if ( strcmp(param,"offset") == 0) {
- int i = atoi(value);
- defined_channels[cd_id]->channel_offset=i;
+ int i = atoi(value);
+ defined_channels[cd_id]->channel_offset=i;
} else if ( strcmp(param,"forgetf") == 0) {
- double dbl = atof(value);
- if (dbl <0 || dbl > 1)
- prnt("ERROR: forgetting factor range: 0 to 1 (disable variation), %lf is outof range\n",dbl);
- else
- defined_channels[cd_id]->forgetting_factor=dbl;
+ double dbl = atof(value);
+
+ if (dbl <0 || dbl > 1)
+ prnt("ERROR: forgetting factor range: 0 to 1 (disable variation), %lf is outof range\n",dbl);
+ else
+ defined_channels[cd_id]->forgetting_factor=dbl;
} else {
- prnt("ERROR: %s, unknown channel parameter\n",param);
- return CMDSTATUS_FOUND;
+ prnt("ERROR: %s, unknown channel parameter\n",param);
+ return CMDSTATUS_FOUND;
}
- display_channelmodel(defined_channels[cd_id],debug,prnt);
- free(param);
- free(value);
- random_channel(defined_channels[cd_id],false);
+
+ display_channelmodel(defined_channels[cd_id],debug,prnt);
+ free(param);
+ free(value);
+ random_channel(defined_channels[cd_id],false);
}
- return CMDSTATUS_FOUND;
+
+ return CMDSTATUS_FOUND;
}
-
-int modelid_fromname(char *modelname) {
- int modelid=map_str_to_int(channelmod_names,modelname);
- if (modelid < 0)
- LOG_E(OCM,"random_channel.c: Error channel model %s unknown\n",modelname);
+
+int modelid_fromstrtype(char *modeltype) {
+ int modelid=map_str_to_int(channelmod_names,modeltype);
+
+ if (modelid < 0)
+ LOG_E(OCM,"random_channel.c: Error channel model %s unknown\n",modeltype);
+
return modelid;
}
@@ -1983,18 +2063,61 @@ double channelmod_get_sinr_dB(void) {
void init_channelmod(void) {
paramdef_t channelmod_params[] = CHANNELMOD_PARAMS_DESC;
- int ret = config_get( channelmod_params,sizeof(channelmod_params)/sizeof(paramdef_t),CHANNELMOD_SECTION);
+ int numparams=sizeof(channelmod_params)/sizeof(paramdef_t);
+ int ret = config_get( channelmod_params,numparams,CHANNELMOD_SECTION);
AssertFatal(ret >= 0, "configuration couldn't be performed");
- defined_channels=calloc(max_chan,sizeof( channel_desc_t*));
+ defined_channels=calloc(max_chan,sizeof( channel_desc_t *));
AssertFatal(defined_channels!=NULL, "couldn't allocate %u channel descriptors\n",max_chan);
-
/* 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);
if (addcmd != NULL) {
addcmd("channelmod",channelmod_vardef,channelmod_cmdarray);
}
-}
+} /* init_channelmod */
+
+
+int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth) {
+ paramdef_t achannel_params[] = CHANNELMOD_MODEL_PARAMS_DESC;
+ paramlist_def_t channel_list;
+ memset(&channel_list,0,sizeof(paramlist_def_t));
+ memcpy(channel_list.listname,modellist_name,sizeof(channel_list.listname)-1);
+ int numparams = sizeof(achannel_params)/sizeof(paramdef_t);
+ config_getlist( &channel_list,achannel_params,numparams, CHANNELMOD_SECTION);
+ AssertFatal(channel_list.numelt>0, "List %s.%s not found in config file\n",CHANNELMOD_SECTION,channel_list.listname);
+ int pindex_NAME = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_NAME_PNAME);
+ int pindex_DT = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_DT_PNAME );
+ int pindex_FF = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_FF_PNAME );
+ int pindex_CO = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_CO_PNAME );
+ int pindex_PL = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_PL_PNAME );
+ int pindex_NP = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_NP_PNAME );
+ int pindex_TYPE = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_TYPE_PNAME);
+
+ for (int i=0; imodel_name = strdup(*(channel_list.paramarray[i][pindex_NAME].strptr));
+ LOG_I(OCM,"Model %s type %s allocated from config file, list %s\n",*(channel_list.paramarray[i][pindex_NAME].strptr),
+ *(channel_list.paramarray[i][pindex_TYPE].strptr), modellist_name);
+ } /* for loop on channel_list */
+
+ return channel_list.numelt;
+} /* load_channelist */
#ifdef RANDOM_CHANNEL_MAIN
#define sampling_rate 5.0
diff --git a/openair1/SIMULATION/TOOLS/sim.h b/openair1/SIMULATION/TOOLS/sim.h
index 55a78e9778..7696f9202f 100644
--- a/openair1/SIMULATION/TOOLS/sim.h
+++ b/openair1/SIMULATION/TOOLS/sim.h
@@ -89,6 +89,7 @@ typedef struct {
double path_loss_dB;
///additional delay of channel in samples.
int32_t channel_offset;
+ float noise_power_dB;
///This parameter (0...1) allows for simple 1st order temporal variation. 0 means a new channel every call, 1 means keep channel constant all the time
double forgetting_factor;
///needs to be set to 1 for the first call, 0 otherwise.
@@ -106,8 +107,10 @@ typedef struct {
unsigned int chan_idx;
/// id of the channel modeling algorithm
int modelid;
- /// identifies channel descriptor owner (the module which created this descriptor)
+ /// identifies channel descriptor owner (the module which created this descriptor
channelmod_moduleid_t module_id;
+ /// name of this descriptor,used for model created from config file at init time
+ char *model_name;
/// flags to properly trigger memory free
unsigned int free_flags;
} channel_desc_t;
@@ -241,12 +244,37 @@ typedef enum {
#define CONFIG_HLP_SNR "Set average SNR in dB (for --siml1 option)\n"
#define CHANNELMOD_SECTION "channelmod"
+
+/* global channel modelization parameters */
+#define CHANNELMOD_MODELLIST_PARANAME "modellist"
+
+#define CHANNELMOD_HELP_MODELLIST " channel list name in config file describing the model type and its parameters\n"
#define CHANNELMOD_PARAMS_DESC { \
- {"s" , CONFIG_HLP_SNR, PARAMFLAG_CMDLINE_NOPREFIXENABLED, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0},\
- {"sinr_dB", NULL, 0 , dblptr:&sinr_dB, defdblval:0 , TYPE_DOUBLE, 0},\
- {"max_chan, CONFIG_HLP_MAX_CHAN", 0, uptr:&max_chan, defintval:10, TYPE_UINT, 0},\
+ {"s" , CONFIG_HLP_SNR, PARAMFLAG_CMDLINE_NOPREFIXENABLED, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0},\
+ {"sinr_dB", NULL, 0, dblptr:&sinr_dB, defdblval:0 , TYPE_DOUBLE, 0},\
+ {"max_chan", "Max number of runtime models", 0, uptr:&max_chan, defintval:10, TYPE_UINT, 0},\
+ {CHANNELMOD_MODELLIST_PARANAME, CHANNELMOD_HELP_MODELLIST, 0, strptr:(char **)&modellist_name, defstrval:"DefaultChannelList", TYPE_STRING, 60 },\
}
+/* parameters for one model */
+#define CHANNELMOD_MODEL_NAME_PNAME "model_name"
+#define CHANNELMOD_MODEL_TYPE_PNAME "type"
+#define CHANNELMOD_MODEL_PL_PNAME "ploss_dB"
+#define CHANNELMOD_MODEL_NP_PNAME "noise_power_dB"
+#define CHANNELMOD_MODEL_FF_PNAME "forgetfact"
+#define CHANNELMOD_MODEL_CO_PNAME "offset"
+#define CHANNELMOD_MODEL_DT_PNAME "ds_tdl"
+
+#define CHANNELMOD_MODEL_PARAMS_DESC { \
+ {CHANNELMOD_MODEL_NAME_PNAME, "name of the model\n", 0, strptr:NULL , defstrval:"", TYPE_STRING, 0 },\
+ {CHANNELMOD_MODEL_TYPE_PNAME, "name of the model type\n", 0, strptr:NULL , defstrval:"AWGN", TYPE_STRING, 0 },\
+ {CHANNELMOD_MODEL_PL_PNAME, "channel path loss in dB\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 },\
+ {CHANNELMOD_MODEL_NP_PNAME, "channel noise in dB\n", 0, dblptr:NULL, defdblval:-50, TYPE_DOUBLE, 0 },\
+ {CHANNELMOD_MODEL_FF_PNAME, "channel forget factor ((0 to 1)\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 },\
+ {CHANNELMOD_MODEL_CO_PNAME, "channel offset in samps\n", 0, iptr:NULL, defintval:0, TYPE_INT, 0 },\
+ {CHANNELMOD_MODEL_DT_PNAME, "delay spread for TDL models\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 }\
+}
+
#include "platform_constants.h"
typedef struct {
@@ -275,12 +303,17 @@ typedef struct {
channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
uint8_t nb_rx,
SCM_t channel_model,
- double sampling_rate,
+ double sampling_rate,
double channel_bandwidth,
- double TDL_DS,
+ double TDL_DS,
double forgetting_factor,
int32_t channel_offset,
- double path_loss_dB);
+ double path_loss_dB,
+ float noise_power_dB);
+
+channel_desc_t *find_channel_desc_fromname( char *modelname );
+
+
/**
\brief free memory allocated for a model descriptor
\param ch points to the model, which cannot be used after calling this fuction
@@ -293,6 +326,12 @@ void free_channel_desc_scm(channel_desc_t *ch);
\param module_id identifies the channel model. should be define as a macro in simu.h
*/
void set_channeldesc_owner(channel_desc_t *cdesc, channelmod_moduleid_t module_id);
+/**
+\brief This function set a model name to a model descriptor, can be later used to identify a allocated channel model
+\param cdesc points to the model descriptor
+\param module_name is the C string to use as model name for the channel pointed by cdesc
+*/
+void set_channeldesc_name(channel_desc_t *cdesc,char *modelname);
/** \fn void random_channel(channel_desc_t *desc)
\brief This routine generates a random channel response (time domain) according to a tapped delay line model.
\param desc Pointer to the channel descriptor
@@ -452,11 +491,11 @@ void multipath_tv_channel(channel_desc_t *desc,
/**@} */
/**@} */
-int modelid_fromname(char *modelname);
+int modelid_fromstrtype(char *modeltype);
double channelmod_get_snr_dB(void);
double channelmod_get_sinr_dB(void);
void init_channelmod(void) ;
-
+int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth) ;
double N_RB2sampling_rate(uint16_t N_RB);
double N_RB2channel_bandwidth(uint16_t N_RB);
@@ -468,7 +507,6 @@ double N_RB2channel_bandwidth(uint16_t N_RB);
*/
//look-up table for the sine (cosine) function
#define ResolSinCos 100
-uint16_t LUTSin[ResolSinCos+1];
void InitSinLUT( void );
void phase_noise(double ts, int16_t * InRe, int16_t * InIm);
diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h
index b94997c90b..63911d46cb 100644
--- a/openair2/COMMON/gtpv1_u_messages_types.h
+++ b/openair2/COMMON/gtpv1_u_messages_types.h
@@ -176,11 +176,15 @@ typedef struct gtpv1u_enb_end_marker_ind_s {
typedef struct {
in_addr_t enb_ip_address_for_S1u_S12_S4_up;
tcp_udp_port_t enb_port_for_S1u_S12_S4_up;
+ char addrStr[256];
+ char portStr[256];
} Gtpv1uS1Req;
typedef struct {
in_addr_t gnb_ip_address_for_NGu_up;
tcp_udp_port_t gnb_port_for_NGu_up;
+ char addrStr[256];
+ char portStr[256];
} Gtpv1uNGReq;
typedef struct gtpv1u_gnb_create_tunnel_req_s {
rnti_t rnti;
diff --git a/openair2/COMMON/platform_constants.h b/openair2/COMMON/platform_constants.h
index 3915f12bb9..be6927ec37 100644
--- a/openair2/COMMON/platform_constants.h
+++ b/openair2/COMMON/platform_constants.h
@@ -90,6 +90,7 @@
#define NUMBER_OF_NR_DLSCH_MAX 2//16
#define NUMBER_OF_NR_ULSCH_MAX 2//16
#define NUMBER_OF_NR_SCH_STATS_MAX 16
+#define NUMBER_OF_NR_UCI_STATS_MAX 16
#define NUMBER_OF_NR_PUCCH_MAX 16
#define NUMBER_OF_NR_SR_MAX 16
#define NUMBER_OF_NR_PDCCH_MAX 16
diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.h b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.h
index 9db5d61a11..d6dd6e3b6f 100644
--- a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.h
+++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.h
@@ -51,8 +51,6 @@ typedef struct {
pthread_mutex_t *mutex;
} mac_stats_updates_context_t;
-/*Array holding the last stats reports for each eNB. Used for continuous reporting*/
-mac_stats_updates_context_t mac_stats_context[NUM_MAX_ENB];
/*Functions to initialize and destroy the struct required for the
*continuous stats update report*/
diff --git a/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_defs.h b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_defs.h
index 5f6432732f..a9236af80b 100644
--- a/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_defs.h
+++ b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_defs.h
@@ -49,8 +49,6 @@ typedef struct
/*To Be Extended*/
}rrc_meas_stats;
-/* RRC CMI statistics */
-rrc_meas_stats * meas_stats;
/* FLEXRAN AGENT-RRC Interface */
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index 8ffb7e51cf..ee7b26ff1a 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -57,6 +57,7 @@
#include "enb_paramdef.h"
#include "proto_agent.h"
#include "executables/thread-common.h"
+#include
extern uint32_t to_earfcn_DL(int eutra_bandP, uint32_t dl_CarrierFreq, uint32_t bw);
extern uint32_t to_earfcn_UL(int eutra_bandP, uint32_t ul_CarrierFreq, uint32_t bw);
@@ -2058,7 +2059,9 @@ int RCconfig_gtpu(void ) {
IPV4_STR_ADDR_TO_INT_NWBO ( address, GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" );
LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up);
GTPV1U_ENB_S1_REQ(message).enb_port_for_S1u_S12_S4_up = enb_port_for_S1U;
- itti_send_msg_to_task (TASK_GTPV1_U, 0, message); // data model is wrong: gtpu doesn't have enb_id (or module_id)
+ strcpy(GTPV1U_ENB_S1_REQ(message).addrStr,address);
+ sprintf(GTPV1U_ENB_S1_REQ(message).portStr,"%d", enb_port_for_S1U);
+ itti_send_msg_to_task (TASK_VARIABLE, 0, message); // data model is wrong: gtpu doesn't have enb_id (or module_id)
} else
LOG_E(GTPU,"invalid address for S1U\n");
diff --git a/openair2/ENB_APP/flexran_agent_common.c b/openair2/ENB_APP/flexran_agent_common.c
index abb5b57e0c..1af59eab87 100644
--- a/openair2/ENB_APP/flexran_agent_common.c
+++ b/openair2/ENB_APP/flexran_agent_common.c
@@ -648,18 +648,6 @@ error:
* ************************************
*/
-int sort_ue_config(const void *a, const void *b) {
- const Protocol__FlexUeConfig *fa = a;
- const Protocol__FlexUeConfig *fb = b;
-
- if (fa->rnti < fb->rnti)
- return -1;
- else if (fa->rnti < fb->rnti)
- return 1;
-
- return 0;
-}
-
int flexran_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) {
xid_t xid;
Protocol__FlexHeader *header = NULL;
diff --git a/openair2/ENB_APP/flexran_agent_common.h b/openair2/ENB_APP/flexran_agent_common.h
index ae690c7124..18d32421dd 100644
--- a/openair2/ENB_APP/flexran_agent_common.h
+++ b/openair2/ENB_APP/flexran_agent_common.h
@@ -70,7 +70,6 @@ typedef struct {
pthread_mutex_t *mutex;
} stats_updates_context_t;
-stats_updates_context_t stats_context[NUM_MAX_ENB];
/**********************************
* FlexRAN protocol messages helper
diff --git a/openair2/ENB_APP/flexran_agent_net_comm.c b/openair2/ENB_APP/flexran_agent_net_comm.c
index 0d1c52096d..568a0e32cc 100644
--- a/openair2/ENB_APP/flexran_agent_net_comm.c
+++ b/openair2/ENB_APP/flexran_agent_net_comm.c
@@ -30,7 +30,7 @@
#include "common/utils/LOG/log.h"
flexran_agent_channel_t *agent_channel[NUM_MAX_ENB][FLEXRAN_AGENT_MAX];
-flexran_agent_channel_instance_t channel_instance;
+static flexran_agent_channel_instance_t channel_instance;
int flexran_agent_channel_id = 0;
int flexran_agent_msg_send(mid_t mod_id, agent_id_t agent_id, void *data, int size, int priority) {
diff --git a/openair2/ENB_APP/flexran_agent_ran_api_to_fix.c b/openair2/ENB_APP/flexran_agent_ran_api_to_fix.c
new file mode 100644
index 0000000000..a5eb850712
--- /dev/null
+++ b/openair2/ENB_APP/flexran_agent_ran_api_to_fix.c
@@ -0,0 +1,33 @@
+#include
+#include
+#include
+pdcp_enb_t pdcp_enb[MAX_NUM_CCs];
+uint32_t Pdcp_stats_tx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB];
+uint32_t Pdcp_stats_tx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_throughput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+
+uint32_t Pdcp_stats_rx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB];
+uint32_t Pdcp_stats_rx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_goodput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_outoforder[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+
diff --git a/openair2/F1AP/f1ap_du_rrc_message_transfer.c b/openair2/F1AP/f1ap_du_rrc_message_transfer.c
index 0aaa77e77f..92ce430bca 100644
--- a/openair2/F1AP/f1ap_du_rrc_message_transfer.c
+++ b/openair2/F1AP/f1ap_du_rrc_message_transfer.c
@@ -985,135 +985,6 @@ int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
msg->rrc_container_length);
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
- if (msg->srb_id == 1 || msg->srb_id == 2) {
- struct rrc_gNB_ue_context_s* ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[instance], rnti);
-
-
- NR_UL_DCCH_Message_t* ul_dcch_msg=NULL;
- asn_dec_rval_t dec_rval;
- dec_rval = uper_decode(NULL,
- &asn_DEF_NR_UL_DCCH_Message,
- (void**)&ul_dcch_msg,
- &ie->value.choice.RRCContainer.buf[1], // buf[0] includes the pdcp header
- msg->rrc_container_length, 0, 0);
-
- if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
- LOG_E(F1AP, " Failed to decode UL-DCCH (%zu bytes)\n",dec_rval.consumed);
- /* for rfsim, because UE send RRCSetupRequest in SRB1 */
- // NR_UL_CCCH_Message_t *ul_ccch_msg;
- // dec_rval = uper_decode(NULL,
- // &asn_DEF_NR_UL_CCCH_Message,
- // (void**)&ul_ccch_msg,
- // &ie->value.choice.RRCContainer.buf[1], // buf[0] includes the pdcp header
- // msg->rrc_container_length, 0, 0);
- // if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
- // LOG_E(F1AP, " Failed to decode UL-CCCH (%zu bytes)\n",dec_rval.consumed);
- // } else {
- // LOG_I(F1AP, "decode UL-CCCH success \n");
- // LOG_I(F1AP, "Received message: present %d and c1 present %d\n",
- // ul_ccch_msg->message.present, ul_ccch_msg->message.choice.c1->present);
-
- // if (ul_ccch_msg->message.present == NR_UL_CCCH_MessageType_PR_c1) {
- // if (ul_ccch_msg->message.choice.c1->present == NR_UL_CCCH_MessageType__c1_PR_rrcSetupRequest) {
- // LOG_I(F1AP, "[MSG] RRC Setup Request\n");
-
- // }
- // }
- // }
- }
- else
- LOG_I(F1AP, "Received message: present %d and c1 present %d\n",
- ul_dcch_msg->message.present, ul_dcch_msg->message.choice.c1->present);
-
- if (ul_dcch_msg->message.present == NR_UL_DCCH_MessageType_PR_c1) {
-
- switch (ul_dcch_msg->message.choice.c1->present) {
- case NR_UL_DCCH_MessageType__c1_PR_NOTHING: /* No components present */
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_measurementReport:
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_rrcReconfigurationComplete:
- LOG_I(F1AP, "[MSG] RRC UL rrcReconfigurationComplete\n");
-
- /* CDRX: activated when RRC Connection Reconfiguration Complete is received */
-#if(0)
- int UE_id_mac = find_nr_UE_id(instance, rnti);
-
- if (UE_id_mac == -1) {
- LOG_E(F1AP, "Can't find UE_id(MAC) of UE rnti %x\n", rnti);
- break;
- }
-
- UE_sched_ctrl_t *UE_scheduling_control = &(RC.nrmac[instance]->UE_info.UE_sched_ctrl[UE_id_mac]);
-
- if (UE_scheduling_control->cdrx_waiting_ack == TRUE) {
- UE_scheduling_control->cdrx_waiting_ack = FALSE;
- UE_scheduling_control->cdrx_configured = TRUE; // Set to TRUE when RRC Connection Reconfiguration Complete is received
- LOG_I(F1AP, "CDRX configuration activated after RRC Connection Reconfiguration Complete reception\n");
- }
- /* End of CDRX processing */
-#endif
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_rrcSetupComplete:
- LOG_I(F1AP, "[MSG] RRC UL rrcSetupComplete \n");
-
- if(!ue_context_p){
- LOG_E(F1AP, "Did not find the UE context associated with UE RNTOI %x, ue_context_p is NULL\n", rnti);
-
- } else {
- LOG_I(F1AP, "Processing RRCSetupComplete UE %x\n", rnti);
- ue_context_p->ue_context.Status = NR_RRC_CONNECTED;
- }
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_rrcReestablishmentComplete:
- LOG_I(F1AP, "[MSG] RRC ReestablishmentComplete \n");
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_rrcResumeComplete:
- LOG_I(F1AP, "[MSG] RRC ResumeComplete \n");
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_securityModeComplete:
- LOG_I(F1AP, "[MSG] RRC securityModeComplete \n");
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_securityModeFailure:
- LOG_I(F1AP, "[MSG] RRC securityModeFailure \n");
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_ulInformationTransfer:
- LOG_I(F1AP, "[MSG] RRC UL Information Transfer \n");
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_locationMeasurementIndication:
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_ueCapabilityInformation:
- LOG_I(F1AP, "[MSG] RRC ueCapabilityInformation \n");
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_ueAssistanceInformation:
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_failureInformation:
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_scgFailureInformation:
- break;
-
- case NR_UL_DCCH_MessageType__c1_PR_scgFailureInformationEUTRA:
- break;
-
- default:
- LOG_E(NR_RRC, "Unknown UL DCCH message type, present %d \n", ul_dcch_msg->message.choice.c1->present);
- break;
- }
- }
- }
/* encode */
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
LOG_E(F1AP, "Failed to encode F1 UL RRC MESSAGE TRANSFER \n");
@@ -1291,45 +1162,17 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
rrcSetup_ies->masterCellGroup.size,0,0);
AssertFatal(dec_rval.code == RC_OK, "could not decode masterCellGroup\n");
- // configure MAC
- rrc_mac_config_req_gNB(ctxt.module_id,
- rrc->carrier.ssb_SubcarrierOffset,
- rrc->carrier.pdsch_AntennaPorts,
- rrc->carrier.pusch_AntennaPorts,
- rrc->carrier.sib1_tda,
- NULL,
- 0,
- ue_context_p->ue_context.rnti,
- ue_context_p->ue_context.masterCellGroup
- );
- // rrc_rlc_config_asn1_req
- nr_rrc_rlc_config_asn1_req(&ctxt,
- ue_context_p->ue_context.SRB_configList,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL);
- // This should be somewhere in the f1ap_cudu_ue_inst_t
- /*int macrlc_instance = 0;
+ apply_macrlc_config(rrc,ue_context_p,&ctxt);
- rnti_t rnti = f1ap_get_rnti_by_du_id(&f1ap_du_inst[0], du_ue_f1ap_id);
- struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[macrlc_instance],rnti);
- */
- gNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
- AssertFatal(ue_p->Srb0.Active == 1,"SRB0 is not active\n");
+ gNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
+ AssertFatal(ue_p->Srb0.Active == 1,"SRB0 is not active\n");
- memcpy((void*)ue_p->Srb0.Tx_buffer.Payload,
- (void*)ie->value.choice.RRCContainer.buf,
- rrc_dl_sdu_len); // ie->value.choice.RRCContainer.size
+ memcpy((void*)ue_p->Srb0.Tx_buffer.Payload,
+ (void*)ie->value.choice.RRCContainer.buf,
+ rrc_dl_sdu_len); // ie->value.choice.RRCContainer.size
- ue_p->Srb0.Tx_buffer.payload_size = rrc_dl_sdu_len;
+ ue_p->Srb0.Tx_buffer.payload_size = rrc_dl_sdu_len;
- // NR_MAC_CellGroupConfig_t *mac_CellGroupConfig = NULL;
- // if (cellGroupConfig->mac_CellGroupConfig)
- // mac_CellGroupConfig = cellGroupConfig->mac_CellGroupConfig;
-
- // rrc_mac_config_req_gNB
break;
} // case
diff --git a/openair2/GNB_APP/L1_nr_paramdef.h b/openair2/GNB_APP/L1_nr_paramdef.h
index 67be560778..fd22e92730 100644
--- a/openair2/GNB_APP/L1_nr_paramdef.h
+++ b/openair2/GNB_APP/L1_nr_paramdef.h
@@ -47,7 +47,9 @@
#define CONFIG_STRING_L1_REMOTE_N_PORTD "remote_n_portd"
#define CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE "tr_n_preference"
#define CONFIG_STRING_L1_PUSCH_PROC_THREADS "pusch_proc_threads"
-
+#define CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD "pucch0_dtx_threshold"
+#define CONFIG_STRING_L1_PRACH_DTX_THRESHOLD "prach_dtx_threshold"
+#define CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD "pusch_dtx_threshold"
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
/* L1 configuration parameters */
/* optname helpstr paramflags XXXptr defXXXval type numelt */
@@ -62,7 +64,10 @@
{CONFIG_STRING_L1_REMOTE_N_PORTC, NULL, 0, uptr:NULL, defintval:50030, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_LOCAL_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_REMOTE_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \
-{CONFIG_STRING_L1_PUSCH_PROC_THREADS, NULL, 0, uptr:NULL, defintval:1, TYPE_UINT, 0} \
+{CONFIG_STRING_L1_PUSCH_PROC_THREADS, NULL, 0, uptr:NULL, defintval:1, TYPE_UINT, 0}, \
+{CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:100, TYPE_UINT, 0}, \
+{CONFIG_STRING_L1_PRACH_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:200, TYPE_UINT, 0}, \
+{CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:50, TYPE_UINT, 0} \
}
#define L1_CC_IDX 0
#define L1_TRANSPORT_N_PREFERENCE_IDX 1
@@ -74,6 +79,9 @@
#define L1_LOCAL_N_PORTD_IDX 7
#define L1_REMOTE_N_PORTD_IDX 8
#define L1_PUSCH_PROC_THREADS 9
+#define L1_PUCCH0_DTX_THRESHOLD 10
+#define L1_PRACH_DTX_THRESHOLD 11
+#define L1_PUSCH_DTX_THRESHOLD 12
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
#endif
diff --git a/openair2/GNB_APP/MACRLC_nr_paramdef.h b/openair2/GNB_APP/MACRLC_nr_paramdef.h
index bf568457e6..dd971801e9 100644
--- a/openair2/GNB_APP/MACRLC_nr_paramdef.h
+++ b/openair2/GNB_APP/MACRLC_nr_paramdef.h
@@ -55,9 +55,10 @@
#define CONFIG_STRING_MACRLC_REMOTE_S_PORTC "remote_s_portc"
#define CONFIG_STRING_MACRLC_LOCAL_S_PORTD "local_s_portd"
#define CONFIG_STRING_MACRLC_REMOTE_S_PORTD "remote_s_portd"
-#define CONFIG_STRING_MACRLC_PUSCHTARGETPOWX10 "pusch_TargetSNRx10"
-#define CONFIG_STRING_MACRLC_PUCCHTARGETPOWX10 "pucch_TargetSNRx10"
-
+#define CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10 "pusch_TargetSNRx10"
+#define CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10 "pucch_TargetSNRx10"
+#define CONFIG_STRING_MACRLC_PUCCHFAILURETHRES "pucch_FailureThres"
+#define CONFIG_STRING_MACRLC_PUSCHFAILURETHRES "pusch_FailureThres"
/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
/* MacRLC configuration parameters */
@@ -81,8 +82,10 @@
{CONFIG_STRING_MACRLC_REMOTE_S_PORTC, NULL, 0, uptr:NULL, defintval:50020, TYPE_UINT, 0}, \
{CONFIG_STRING_MACRLC_LOCAL_S_PORTD, NULL, 0, uptr:NULL, defintval:50021, TYPE_UINT, 0}, \
{CONFIG_STRING_MACRLC_REMOTE_S_PORTD, NULL, 0, uptr:NULL, defintval:50021, TYPE_UINT, 0}, \
-{CONFIG_STRING_MACRLC_PUSCHTARGETPOWX10, NULL, 0, iptr:NULL, defintval:200, TYPE_INT, 0}, \
-{CONFIG_STRING_MACRLC_PUCCHTARGETPOWX10, NULL, 0, iptr:NULL, defintval:200, TYPE_INT, 0}, \
+{CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10, NULL, 0, iptr:NULL, defintval:200, TYPE_INT, 0}, \
+{CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10, NULL, 0, iptr:NULL, defintval:150, TYPE_INT, 0}, \
+{CONFIG_STRING_MACRLC_PUCCHFAILURETHRES, NULL, 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \
+{CONFIG_STRING_MACRLC_PUSCHFAILURETHRES, NULL, 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \
}
#define MACRLC_CC_IDX 0
#define MACRLC_TRANSPORT_N_PREFERENCE_IDX 1
@@ -101,7 +104,9 @@
#define MACRLC_REMOTE_S_PORTC_IDX 14
#define MACRLC_LOCAL_S_PORTD_IDX 15
#define MACRLC_REMOTE_S_PORTD_IDX 16
-#define MACRLC_PUSCHTARGETPOWX1_IDX 17
-#define MACRLC_PUCCHTARGETPOWX1_IDX 18
+#define MACRLC_PUSCHTARGETSNRX10_IDX 17
+#define MACRLC_PUCCHTARGETSNRX10_IDX 18
+#define MACRLC_PUCCHFAILURETHRES_IDX 19
+#define MACRLC_PUSCHFAILURETHRES_IDX 20
/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
#endif
diff --git a/openair2/GNB_APP/gnb_app.c b/openair2/GNB_APP/gnb_app.c
index 767a3c203b..d79d09d409 100644
--- a/openair2/GNB_APP/gnb_app.c
+++ b/openair2/GNB_APP/gnb_app.c
@@ -188,7 +188,7 @@ void *gNB_app_task(void *args_p)
/* For the CU case the gNB registration with the AMF might have to take place after the F1 setup, as the PLMN info
* can originate from the DU. */
- if (AMF_MODE_ENABLED && !NODE_IS_DU(RC.nrrrc[0]->node_type) && !NODE_IS_CU(RC.nrrrc[0]->node_type)) {
+ if (AMF_MODE_ENABLED && !NODE_IS_DU(RC.nrrrc[0]->node_type)) {
/* Try to register each gNB */
//registered_gnb = 0;
__attribute__((unused)) uint32_t register_gnb_pending = gNB_app_register (gnb_id_start, gnb_id_end);
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index edfe175f92..b669451813 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -59,6 +59,7 @@
//#include "RRC_config_tools.h"
#include "gnb_paramdef.h"
#include "NR_MAC_gNB/mac_proto.h"
+#include
#include "NR_asn_constant.h"
#include "executables/thread-common.h"
@@ -129,7 +130,37 @@ void prepare_scc(NR_ServingCellConfigCommon_t *scc) {
scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup = CALLOC(1,sizeof(struct NR_PDCCH_ConfigCommon));
scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->controlResourceSetZero = CALLOC(1,sizeof(long));
scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceZero = CALLOC(1,sizeof(long));
- // scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = CALLOC(1,sizeof(struct NR_ControlResourceSet));
+
+ NR_ControlResourceSet_t *coreset0 = CALLOC(1,sizeof(struct NR_ControlResourceSet));
+ coreset0->controlResourceSetId = 0;
+ // frequencyDomainResources '11111111 00000000 00000000 00000000 00000000 00000'B,
+ if(coreset0->frequencyDomainResources.buf == NULL) coreset0->frequencyDomainResources.buf = calloc(1,6);
+ coreset0->frequencyDomainResources.buf[0] = 0xff;
+ coreset0->frequencyDomainResources.buf[1] = 0;
+ coreset0->frequencyDomainResources.buf[2] = 0;
+ coreset0->frequencyDomainResources.buf[3] = 0;
+ coreset0->frequencyDomainResources.buf[4] = 0;
+ coreset0->frequencyDomainResources.buf[5] = 0;
+ coreset0->frequencyDomainResources.size = 6;
+ coreset0->frequencyDomainResources.bits_unused = 3;
+ coreset0->duration = 1;
+ coreset0->cce_REG_MappingType.present=NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved;
+ coreset0->cce_REG_MappingType.choice.interleaved=calloc(1,sizeof(*coreset0->cce_REG_MappingType.choice.interleaved));
+ coreset0->cce_REG_MappingType.choice.interleaved->reg_BundleSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6;
+ coreset0->cce_REG_MappingType.choice.interleaved->interleaverSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n2;
+ coreset0->cce_REG_MappingType.choice.interleaved->shiftIndex = scc->physCellId;
+ coreset0->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
+ if(coreset0->tci_StatesPDCCH_ToAddList == NULL) coreset0->tci_StatesPDCCH_ToAddList = calloc(1,sizeof(*coreset0->tci_StatesPDCCH_ToAddList));
+ NR_TCI_StateId_t *tci[8];
+ for (int i=0;i<8;i++) {
+ tci[i]=calloc(1,sizeof(*tci[i]));
+ *tci[i] = i;
+ ASN_SEQUENCE_ADD(&coreset0->tci_StatesPDCCH_ToAddList->list,tci[i]);
+ }
+ coreset0->tci_StatesPDCCH_ToReleaseList = NULL;
+ coreset0->tci_PresentInDCI = NULL;
+ coreset0->pdcch_DMRS_ScramblingID = NULL;
+ scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset0;
// scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList = CALLOC(1,sizeof(struct NR_PDCCH_ConfigCommon__commonSearchSpaceList));
// scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 = CALLOC(1,sizeof(NR_SearchSpaceId_t));
@@ -566,11 +597,13 @@ void RCconfig_NR_L1(void) {
RC.gNB[j] = (PHY_VARS_gNB *)malloc(sizeof(PHY_VARS_gNB));
LOG_I(NR_PHY,"RC.gNB[%d] = %p\n",j,RC.gNB[j]);
memset(RC.gNB[j],0,sizeof(PHY_VARS_gNB));
- RC.gNB[j]->Mod_id = j;
+ RC.gNB[j]->Mod_id = j;
}
RC.gNB[j]->pusch_proc_threads = *(L1_ParamList.paramarray[j][L1_PUSCH_PROC_THREADS].uptr);
-
+ RC.gNB[j]->pucch0_thres = *(L1_ParamList.paramarray[j][L1_PUCCH0_DTX_THRESHOLD].uptr);
+ RC.gNB[j]->prach_thres = *(L1_ParamList.paramarray[j][L1_PRACH_DTX_THRESHOLD].uptr);
+ RC.gNB[j]->pusch_thres = *(L1_ParamList.paramarray[j][L1_PUSCH_DTX_THRESHOLD].uptr);
if(strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) {
//sf_ahead = 2; // Need 4 subframe gap between RX and TX
}else if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) {
@@ -640,7 +673,11 @@ void RCconfig_nr_macrlc() {
for (j=0;jpusch_target_snrx10 = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHTARGETSNRX10_IDX].iptr);
+ RC.nrmac[j]->pucch_target_snrx10 = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHTARGETSNRX10_IDX].iptr);
+ RC.nrmac[j]->pucch_failure_thres = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHFAILURETHRES_IDX].iptr);
+ RC.nrmac[j]->pusch_failure_thres = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHFAILURETHRES_IDX].iptr);
+
if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_RRC") == 0) {
// check number of instances is same as RRC/PDCP
@@ -679,9 +716,6 @@ void RCconfig_nr_macrlc() {
RC.nrmac[j]->eth_params_s.my_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTD_IDX].iptr);
RC.nrmac[j]->eth_params_s.remote_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTD_IDX].iptr);
RC.nrmac[j]->eth_params_s.transp_preference = ETH_UDP_MODE;
- RC.nrmac[j]->pusch_target_snrx10 = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHTARGETPOWX1_IDX].iptr);
- RC.nrmac[j]->pucch_target_snrx10 = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHTARGETPOWX1_IDX].iptr);
- //sf_ahead = 2; // Cannot cope with 4 subframes between RX and TX - set it to 2
printf("**************** vnf_port:%d\n", RC.nrmac[j]->eth_params_s.my_portc);
configure_nr_nfapi_vnf(RC.nrmac[j]->eth_params_s.my_addr, RC.nrmac[j]->eth_params_s.my_portc);
@@ -1071,20 +1105,25 @@ int RCconfig_nr_gtpu(void ) {
MessageDef *message;
if (gnb_mode == 1) { // NSA
- AssertFatal((message = itti_alloc_new_message(TASK_GNB_APP, 0, GTPV1U_ENB_S1_REQ))!=NULL,"");
+ message = itti_alloc_new_message(TASK_GNB_APP, 0, GTPV1U_ENB_S1_REQ);
+ AssertFatal(message!=NULL,"");
// IPV4_STR_ADDR_TO_INT_NWBO ( address, RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" );
// LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up);
IPV4_STR_ADDR_TO_INT_NWBO (address, GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" );
LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up);
GTPV1U_ENB_S1_REQ(message).enb_port_for_S1u_S12_S4_up = gnb_port_for_S1U;
+ strcpy(GTPV1U_ENB_S1_REQ(message).addrStr,address);
+ sprintf(GTPV1U_ENB_S1_REQ(message).portStr,"%d", gnb_port_for_NGU);
} else {// TODO SA
- AssertFatal((message = itti_alloc_new_message(TASK_GNB_APP, 0, GTPV1U_GNB_NG_REQ))!=NULL,"");
+ message = itti_alloc_new_message(TASK_GNB_APP, 0, GTPV1U_GNB_NG_REQ);
+ AssertFatal(message!=NULL,"");
IPV4_STR_ADDR_TO_INT_NWBO (address, GTPV1U_GNB_NG_REQ(message).gnb_ip_address_for_NGu_up, "BAD IP ADDRESS FORMAT FOR gNB NG_U !\n" );
LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,GTPV1U_GNB_NG_REQ(message).gnb_ip_address_for_NGu_up);
GTPV1U_GNB_NG_REQ(message).gnb_port_for_NGu_up = gnb_port_for_NGU;
+ strcpy(GTPV1U_GNB_NG_REQ(message).addrStr,address);
+ sprintf(GTPV1U_GNB_NG_REQ(message).portStr,"%d", gnb_port_for_NGU);
}
-
- itti_send_msg_to_task (TASK_GTPV1_U, 0, message); // data model is wrong: gtpu doesn't have enb_id (or module_id)
+ itti_send_msg_to_task (TASK_VARIABLE, 0, message); // data model is wrong: gtpu doesn't have enb_id (or module_id)
} else
LOG_E(GTPU,"invalid address for NGU\n");
diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c
index 781347abaa..71f91a67ec 100644
--- a/openair2/LAYER2/MAC/config.c
+++ b/openair2/LAYER2/MAC/config.c
@@ -337,7 +337,8 @@ config_sib2(int Mod_idP,
LTE_ARFCN_ValueEUTRA_t *ul_CArrierFreqP,
long *ul_BandwidthP,
LTE_AdditionalSpectrumEmission_t *additionalSpectrumEmissionP,
- struct LTE_MBSFN_SubframeConfigList *mbsfn_SubframeConfigListP) {
+ struct LTE_MBSFN_SubframeConfigList *mbsfn_SubframeConfigListP,
+ int dl_Bandwidth) {
nfapi_config_request_t *cfg = &RC.mac[Mod_idP]->config[CC_idP];
cfg->subframe_config.pb.value = radioResourceConfigCommonP->pdsch_ConfigCommon.p_b;
cfg->subframe_config.pb.tl.tag = NFAPI_SUBFRAME_CONFIG_PB_TAG;
@@ -345,7 +346,7 @@ config_sib2(int Mod_idP,
cfg->rf_config.reference_signal_power.value = radioResourceConfigCommonP->pdsch_ConfigCommon.referenceSignalPower;
cfg->rf_config.reference_signal_power.tl.tag = NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG;
cfg->num_tlv++;
- cfg->nfapi_config.max_transmit_power.value = cfg->rf_config.reference_signal_power.value + power_off_dB[cfg->rf_config.dl_channel_bandwidth.value];
+ cfg->nfapi_config.max_transmit_power.value = cfg->rf_config.reference_signal_power.value + power_off_dB[dl_Bandwidth];
cfg->nfapi_config.max_transmit_power.tl.tag = NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG;
cfg->num_tlv++;
cfg->prach_config.configuration_index.value = radioResourceConfigCommonP->prach_Config.prach_ConfigInfo.prach_ConfigIndex;
@@ -870,7 +871,8 @@ int rrc_mac_config_req_eNB(module_id_t Mod_idP,
config_sib2(Mod_idP, CC_idP, radioResourceConfigCommon,
radioResourceConfigCommon_BR,
NULL, ul_Bandwidth, additionalSpectrumEmission,
- mbsfn_SubframeConfigList);
+ mbsfn_SubframeConfigList,
+ mib->message.dl_Bandwidth);
} // mib != NULL
if (mobilityControlInfo !=NULL) {
diff --git a/openair2/LAYER2/MAC/config_ue.c b/openair2/LAYER2/MAC/config_ue.c
index 1c5e706218..79202d87e3 100644
--- a/openair2/LAYER2/MAC/config_ue.c
+++ b/openair2/LAYER2/MAC/config_ue.c
@@ -85,10 +85,6 @@ void ue_mac_reset(module_id_t module_idP, uint8_t eNB_index) {
ue_init_mac(module_idP); //This will hopefully do the rest of the MAC reset procedure
}
-int32_t **rxdata;
-int32_t **txdata;
-
-
int
rrc_mac_config_req_ue(module_id_t Mod_idP,
int CC_idP,
diff --git a/openair2/LAYER2/MAC/defs_NB_IoT.h b/openair2/LAYER2/MAC/defs_NB_IoT.h
index 517f01d1b9..78524e104d 100644
--- a/openair2/LAYER2/MAC/defs_NB_IoT.h
+++ b/openair2/LAYER2/MAC/defs_NB_IoT.h
@@ -537,9 +537,6 @@ typedef struct {
// global variables
-nprach_parameters_NB_IoT_t nprach_list[3];
-//DLSF Table
-DLSF_INFO_t DLSF_information;
#endif /*__LAYER2_MAC_DEFS_NB_IoT_H__ */
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_mch.c b/openair2/LAYER2/MAC/eNB_scheduler_mch.c
index f3a77ed703..1272b16ec0 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_mch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_mch.c
@@ -84,7 +84,7 @@ get_mbsfn_sf_alloction(module_id_t module_idP, uint8_t CC_id,
static uint32_t bytes_in_buffer=0;
static uint32_t msi_pmch_stop=0;
-uint16_t mbms_rab_id=2047;//[8] = {2047,2047,2047,2047,2047,2047,2047,2047};
+rb_id_t mbms_rab_id=2047;//[8] = {2047,2047,2047,2047,2047,2047,2047,2047};
static uint32_t msi_sfs=0;
diff --git a/openair2/LAYER2/MAC/mac_extern.h b/openair2/LAYER2/MAC/mac_extern.h
index cee6066a9e..cda64ec0e9 100644
--- a/openair2/LAYER2/MAC/mac_extern.h
+++ b/openair2/LAYER2/MAC/mac_extern.h
@@ -65,6 +65,7 @@ extern const int cqi_to_mcs[16];
extern uint32_t RRC_CONNECTION_FLAG;
extern uint8_t rb_table[34];
+extern rb_id_t mbms_rab_id;
#if defined(PRE_SCD_THREAD)
@@ -77,4 +78,5 @@ extern eNB_UE_STATS pre_scd_eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
extern mac_rlc_am_muilist_t rlc_am_mui;
extern SCHEDULER_MODES global_scheduler_mode;
+extern rb_id_t mbms_rab_id;
#endif //DEF_H
diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c
index 0dedacb11f..9ae8f82a00 100644
--- a/openair2/LAYER2/MAC/ue_procedures.c
+++ b/openair2/LAYER2/MAC/ue_procedures.c
@@ -72,7 +72,7 @@ extern UL_IND_t *UL_INFO;
extern int next_ra_frame;
extern module_id_t next_Mod_id;
-int mbms_rab_id=2047;//[8] = {2047,2047,2047,2047,2047,2047,2047,2047};
+rb_id_t mbms_rab_id=2047;//[8] = {2047,2047,2047,2047,2047,2047,2047,2047};
static int mbms_mch_i=0;
//static int num_msi_per_CSA[28];
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index bb3d4e4b36..63d46d207e 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -1237,7 +1237,7 @@ int get_format0(uint8_t index,
uint8_t unpaired,
frequency_range_t frequency_range){
- uint16_t format;
+ uint16_t format=0;
if (unpaired) {
if (frequency_range==FR1)
format = table_6_3_3_2_3_prachConfig_Index[index][0];
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
index 73c386fb83..9bfd3bbc22 100755
--- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
@@ -510,5 +510,8 @@ typedef struct ssb_list_info {
uint8_t nb_tx_ssb;
} ssb_list_info_t;
+void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id);
+void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
+
/*@}*/
#endif /*__LAYER2_MAC_DEFS_H__ */
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index c30e7dae81..e5985e5192 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -1019,7 +1019,7 @@ int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac,
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
// k2 as per 3GPP TS 38.214 version 15.9.0 Release 15 ch 6.1.2.1.1
// PUSCH time domain resource allocation is higher layer configured from uschTimeDomainAllocationList in either pusch-ConfigCommon
- uint8_t k2;
+ int k2;
if (is_Msg3) {
k2 = *pusch_TimeDomainAllocationList->list.array[tda_id]->k2;
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 310e980535..803c906798 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -54,6 +54,87 @@ extern RAN_CONTEXT_t RC;
extern void mac_top_init_gNB(void);
extern uint8_t nfapi_mode;
+void process_rlcBearerConfig(struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list,
+ struct NR_CellGroupConfig__rlc_BearerToReleaseList *rlc_bearer2release_list,
+ NR_UE_sched_ctrl_t *sched_ctrl) {
+
+ if (rlc_bearer2add_list)
+ // keep lcids
+ for (int i=0;ilist.count;i++) {
+ sched_ctrl->lcid_mask |= (1<list.array[i]->logicalChannelIdentity);
+ LOG_I(NR_MAC,"Adding LCID %d (%s %d)\n",
+ (int)rlc_bearer2add_list->list.array[i]->logicalChannelIdentity,
+ rlc_bearer2add_list->list.array[i]->logicalChannelIdentity<4 ? "SRB" : "DRB",
+ (int)rlc_bearer2add_list->list.array[i]->logicalChannelIdentity);
+ }
+ if (rlc_bearer2release_list)
+ for (int i=0;ilist.count;i++)
+ sched_ctrl->lcid_mask |= (1<<*rlc_bearer2release_list->list.array[i]);
+
+}
+
+
+void process_drx_Config(NR_UE_sched_ctrl_t *sched_ctrl,NR_SetupRelease_DRX_Config_t *drx_Config) {
+ if (!drx_Config) return;
+ AssertFatal(drx_Config->present != NR_SetupRelease_DRX_Config_PR_NOTHING, "Cannot have NR_SetupRelease_DRX_Config_PR_NOTHING\n");
+
+ if (drx_Config->present == NR_SetupRelease_DRX_Config_PR_setup) {
+ LOG_I(NR_MAC,"Adding DRX config\n");
+ }
+ else {
+ LOG_I(NR_MAC,"Removing DRX config\n");
+ }
+}
+
+void process_schedulingRequestConfig(NR_UE_sched_ctrl_t *sched_ctrl,NR_SchedulingRequestConfig_t *schedulingRequestConfig) {
+ if (!schedulingRequestConfig) return;
+
+ LOG_I(NR_MAC,"Adding SchedulingRequestconfig\n");
+}
+
+void process_bsrConfig(NR_UE_sched_ctrl_t *sched_ctrl,NR_BSR_Config_t *bsr_Config) {
+ if (!bsr_Config) return;
+ LOG_I(NR_MAC,"Adding BSR config\n");
+}
+
+void process_tag_Config(NR_UE_sched_ctrl_t *sched_ctrl,NR_TAG_Config_t *tag_Config) {
+ if (!tag_Config) return;
+ LOG_I(NR_MAC,"Adding TAG config\n");
+}
+
+void process_phr_Config(NR_UE_sched_ctrl_t *sched_ctrl,NR_SetupRelease_PHR_Config_t *phr_Config) {
+ if (!phr_Config) return;
+ AssertFatal(phr_Config->present != NR_SetupRelease_PHR_Config_PR_NOTHING, "Cannot have NR_SetupRelease_PHR_Config_PR_NOTHING\n");
+
+ if (phr_Config->present == NR_SetupRelease_PHR_Config_PR_setup) {
+ LOG_I(NR_MAC,"Adding PHR config\n");
+ }
+ else {
+ LOG_I(NR_MAC,"Removing PHR config\n");
+ }
+}
+
+void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl) {
+
+ AssertFatal(CellGroup, "CellGroup is null\n");
+ NR_MAC_CellGroupConfig_t *mac_CellGroupConfig = CellGroup->mac_CellGroupConfig;
+
+
+ if (mac_CellGroupConfig) {
+ process_drx_Config(sched_ctrl,mac_CellGroupConfig->drx_Config);
+ process_schedulingRequestConfig(sched_ctrl,mac_CellGroupConfig->schedulingRequestConfig);
+ process_bsrConfig(sched_ctrl,mac_CellGroupConfig->bsr_Config);
+ process_tag_Config(sched_ctrl,mac_CellGroupConfig->tag_Config);
+ process_phr_Config(sched_ctrl,mac_CellGroupConfig->phr_Config);
+ }
+ else {
+ // apply defaults
+
+ }
+
+ process_rlcBearerConfig(CellGroup->rlc_BearerToAddModList,CellGroup->rlc_BearerToReleaseList,sched_ctrl);
+
+}
void config_common(int Mod_idP, int ssb_SubcarrierOffset, int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) {
nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[Mod_idP]->config[0];
@@ -340,9 +421,9 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
int pusch_AntennaPorts,
int sib1_tda,
NR_ServingCellConfigCommon_t *scc,
- int add_ue,
- uint32_t rnti,
- NR_CellGroupConfig_t *CellGroup){
+ int add_ue,
+ uint32_t rnti,
+ NR_CellGroupConfig_t *CellGroup) {
if (scc != NULL ) {
AssertFatal((scc->ssb_PositionsInBurst->present > 0) && (scc->ssb_PositionsInBurst->present < 4), "SSB Bitmap type %d is not valid\n",scc->ssb_PositionsInBurst->present);
@@ -385,7 +466,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
ssb_SubcarrierOffset,
pdsch_AntennaPorts,
pusch_AntennaPorts,
- scc);
+ scc);
LOG_E(NR_MAC, "%s() %s:%d RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req:%p\n", __FUNCTION__, __FILE__, __LINE__, RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req);
// if in nFAPI mode
@@ -411,12 +492,12 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
NR_COMMON_channels_t *cc = &RC.nrmac[Mod_idP]->common_channels[0];
RC.nrmac[Mod_idP]->sib1_tda = sib1_tda;
for (int n=0;nra[n].cfra = false;
- cc->ra[n].rnti = 0;
- cc->ra[n].preambles.num_preambles = MAX_NUM_NR_PRACH_PREAMBLES;
- cc->ra[n].preambles.preamble_list = (uint8_t *) malloc(MAX_NUM_NR_PRACH_PREAMBLES*sizeof(uint8_t));
- for (int i = 0; i < MAX_NUM_NR_PRACH_PREAMBLES; i++)
- cc->ra[n].preambles.preamble_list[i] = i;
+ cc->ra[n].cfra = false;
+ cc->ra[n].rnti = 0;
+ cc->ra[n].preambles.num_preambles = MAX_NUM_NR_PRACH_PREAMBLES;
+ cc->ra[n].preambles.preamble_list = (uint8_t *) malloc(MAX_NUM_NR_PRACH_PREAMBLES*sizeof(uint8_t));
+ for (int i = 0; i < MAX_NUM_NR_PRACH_PREAMBLES; i++)
+ cc->ra[n].preambles.preamble_list[i] = i;
}
}
}
@@ -427,6 +508,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
if (add_ue == 1 && get_softmodem_params()->phy_test) {
const int UE_id = add_new_nr_ue(Mod_idP, rnti, CellGroup);
LOG_I(PHY,"Added new UE_id %d/%x with initial CellGroup\n",UE_id,rnti);
+ process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]);
} else if (add_ue == 1 && !get_softmodem_params()->phy_test) {
const int CC_id = 0;
NR_COMMON_channels_t *cc = &RC.nrmac[Mod_idP]->common_channels[CC_id];
@@ -442,7 +524,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
NR_RA_t *ra = &cc->ra[ra_index];
ra->CellGroup = CellGroup;
if (CellGroup->spCellConfig && CellGroup->spCellConfig->reconfigurationWithSync &&
- CellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated!=NULL) {
+ CellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated!=NULL) {
if (CellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra != NULL) {
ra->cfra = true;
ra->rnti = rnti;
@@ -474,6 +556,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
const int UE_id = find_nr_UE_id(Mod_idP,rnti);
UE_info->CellGroup[UE_id] = CellGroup;
LOG_I(NR_MAC,"Modified UE_id %d/%x with CellGroup\n",UE_id,rnti);
+ process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]);
}
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index d98ac2ba95..20f0bea3b2 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -53,6 +53,7 @@
#include "executables/softmodem-common.h"
#include "nfapi/oai_integration/vendor_ext.h"
+#include "executables/nr-softmodem.h"
uint16_t nr_pdcch_order_table[6] = { 31, 31, 511, 2047, 2047, 8191 };
@@ -76,10 +77,12 @@ void dump_mac_stats(gNB_MAC_INST *gNB)
stats->num_rsrp_meas = 0;
stats->cumul_rsrp = 0 ;
LOG_I(MAC, "UE %d: dlsch_total_bytes %d\n", UE_id, stats->dlsch_total_bytes);
- LOG_I(MAC, "UE %d: ulsch_rounds %d/%d/%d/%d, ulsch_errors %d\n",
+ LOG_I(MAC, "UE %d: ulsch_rounds %d/%d/%d/%d, ulsch_DTX %d, ulsch_errors %d\n",
UE_id,
stats->ulsch_rounds[0], stats->ulsch_rounds[1],
- stats->ulsch_rounds[2], stats->ulsch_rounds[3], stats->ulsch_errors);
+ stats->ulsch_rounds[2], stats->ulsch_rounds[3],
+ stats->ulsch_DTX,
+ stats->ulsch_errors);
LOG_I(MAC,
"UE %d: ulsch_total_bytes_scheduled %d, ulsch_total_bytes_received %d\n",
UE_id,
@@ -91,6 +94,7 @@ void dump_mac_stats(gNB_MAC_INST *gNB)
LOG_I(MAC, "UE %d: LCID %d: %d bytes RX\n", UE_id, lc_id, stats->lc_bytes_rx[lc_id]);
}
}
+ print_meas(&gNB->eNB_scheduler, "DL & UL scheduling timing stats", NULL, NULL);
}
void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
@@ -309,7 +313,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
frame_t frame,
sub_frame_t slot){
- protocol_ctxt_t ctxt;
+ protocol_ctxt_t ctxt={0};
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frame, slot,module_idP);
int nb_periods_per_frame;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index c3caa04d28..6cd89c7424 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -527,7 +527,6 @@ void nr_initiate_ra_proc(module_id_t module_idP,
ra_rnti = 1 + symbol + (9 /*slotP*/ * 14) + (freq_index * 14 * 80) + (ul_carrier_id * 14 * 80 * 8);
else
ra_rnti = 1 + symbol + (slotP * 14) + (freq_index * 14 * 80) + (ul_carrier_id * 14 * 80 * 8);
-
// This should be handled differently when we use the initialBWP for RA
ra->bwp_id = 0;
NR_BWP_Downlink_t *bwp=NULL;
@@ -569,6 +568,7 @@ void nr_initiate_ra_proc(module_id_t module_idP,
bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList:
scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
AssertFatal(commonSearchSpaceList->list.count > 0, "common SearchSpace list has 0 elements\n");
+
// Common searchspace list
for (int i = 0; i < commonSearchSpaceList->list.count; i++) {
ss = commonSearchSpaceList->list.array[i];
@@ -891,14 +891,9 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
- long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ NR_SearchSpace_t *ss = ra->ra_ss;
- NR_SearchSpace_t *ss = NULL;
- if(ra->ra_ss) {
- ss = ra->ra_ss;
- } else {
- AssertFatal(1==0,"RA SS missing\n");
- }
+ long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
NR_BWP_Downlink_t *bwp = NULL;
NR_ControlResourceSet_t *coreset = NULL;
@@ -965,7 +960,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
// important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them
const int bwpid = bwp ? bwp->bwp_Id : 0;
const int coresetid = coreset->controlResourceSetId;
- nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid];
+ nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid];
if (!pdcch_pdu_rel15) {
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
memset(dl_tti_pdcch_pdu, 0, sizeof(nfapi_nr_dl_tti_request_pdu_t));
@@ -974,7 +969,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
dl_req->nPDUs += 1;
pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, genericParameters, NULL);
- nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15;
+ nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid] = pdcch_pdu_rel15;
}
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
@@ -1104,8 +1099,6 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
pdsch_pdu_rel15->BWPSize,
bwpid);
-
-
// DL TX request
nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs];
@@ -1152,12 +1145,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
uint8_t time_domain_assignment = 0;
uint8_t mcsIndex = 0;
- NR_SearchSpace_t *ss = NULL;
- if(ra->ra_ss) {
- ss = ra->ra_ss;
- } else {
- AssertFatal(1==0,"RA SS missing\n");
- }
+ NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
+ NR_SearchSpace_t *ss = ra->ra_ss;
NR_BWP_Downlink_t *bwp = ra->CellGroup ? ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1] : NULL;
NR_ControlResourceSet_t *coreset = get_coreset(scc,ra->CellGroup ? ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1] : NULL,
@@ -1315,7 +1304,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
// important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them
const int bwpid = bwp ? bwp->bwp_Id : 0;
const int coresetid = coreset->controlResourceSetId;
- nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid];
+ nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid];
if (!pdcch_pdu_rel15) {
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
memset(dl_tti_pdcch_pdu, 0, sizeof(nfapi_nr_dl_tti_request_pdu_t));
@@ -1324,7 +1313,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
dl_req->nPDUs += 1;
pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, genericParameters, NULL);
- nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15;
+ nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid] = pdcch_pdu_rel15;
}
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index ad84737003..882a80396f 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -55,7 +55,7 @@
#define HALFWORD 16
#define WORD 32
//#define SIZE_OF_POINTER sizeof (void *)
-static boolean_t loop_dcch_dtch = TRUE;
+static int loop_dcch_dtch = DL_SCH_LCID_DTCH;
// Compute and write all MAC CEs and subheaders, and return number of written
// bytes
int nr_write_ce_dlsch_pdu(module_id_t module_idP,
@@ -343,8 +343,14 @@ void nr_store_dlsch_buffer(module_id_t module_id,
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
sched_ctrl->num_total_bytes = 0;
- loop_dcch_dtch = BOOL_NOT(loop_dcch_dtch);
- const int lcid = loop_dcch_dtch?DL_SCH_LCID_DTCH:DL_SCH_LCID_DCCH;
+ if ((sched_ctrl->lcid_mask&(1<<4)) > 0 && loop_dcch_dtch == DL_SCH_LCID_DCCH1)
+ loop_dcch_dtch = DL_SCH_LCID_DTCH;
+ else if ((sched_ctrl->lcid_mask&(1<<1)) > 0 && loop_dcch_dtch == DL_SCH_LCID_DTCH)
+ loop_dcch_dtch = DL_SCH_LCID_DCCH;
+ else if ((sched_ctrl->lcid_mask&(1<<2)) > 0 && loop_dcch_dtch == DL_SCH_LCID_DCCH)
+ loop_dcch_dtch = DL_SCH_LCID_DCCH1;
+
+ const int lcid = loop_dcch_dtch;
// const int lcid = DL_SCH_LCID_DTCH;
const uint16_t rnti = UE_info->rnti[UE_id];
sched_ctrl->rlc_status[lcid] = mac_rlc_status_ind(module_id,
@@ -358,22 +364,22 @@ void nr_store_dlsch_buffer(module_id_t module_id,
0,
0);
sched_ctrl->num_total_bytes += sched_ctrl->rlc_status[lcid].bytes_in_buffer;
- LOG_I(NR_MAC,
+ LOG_D(NR_MAC,
"%d.%d, LCID%d:->DLSCH, RLC status %d bytes. \n",
frame,
slot,
lcid,
sched_ctrl->num_total_bytes);
-
if (sched_ctrl->num_total_bytes == 0
&& !sched_ctrl->ta_apply) /* If TA should be applied, give at least one RB */
return;
LOG_D(NR_MAC,
- "[%s][%d.%d], DTCH%d->DLSCH, RLC status %d bytes TA %d\n",
+ "[%s][%d.%d], %s%d->DLSCH, RLC status %d bytes TA %d\n",
__func__,
frame,
slot,
+ lcid<4?"DCCH":"DTCH",
lcid,
sched_ctrl->rlc_status[lcid].bytes_in_buffer,
sched_ctrl->ta_apply);
@@ -452,10 +458,18 @@ void pf_dl(module_id_t module_id,
if (UE_info->Msg4_ACKed[UE_id] != true) continue;
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
int bwp_Id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0;
- sched_ctrl->search_space = get_searchspace(scc,sched_ctrl->active_bwp,
- sched_ctrl->active_bwp ?
- NR_SearchSpace__searchSpaceType_PR_ue_Specific:
- NR_SearchSpace__searchSpaceType_PR_common);
+ NR_BWP_DownlinkDedicated_t *bwp_Dedicated=NULL;
+ if (sched_ctrl->active_bwp) bwp_Dedicated = sched_ctrl->active_bwp->bwp_Dedicated;
+ else if (UE_info->CellGroup[UE_id] &&
+ UE_info->CellGroup[UE_id]->spCellConfig &&
+ UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated)
+ bwp_Dedicated = UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
+
+ sched_ctrl->search_space = get_searchspace(scc,bwp_Dedicated,
+ bwp_Dedicated ?
+ NR_SearchSpace__searchSpaceType_PR_ue_Specific:
+ NR_SearchSpace__searchSpaceType_PR_common);
+
sched_ctrl->coreset = get_coreset(scc,sched_ctrl->active_bwp, sched_ctrl->search_space, 1 /* dedicated */);
if (sched_ctrl->coreset == NULL) sched_ctrl->coreset = mac->sched_ctrlCommon->coreset;
/* get the PID of a HARQ process awaiting retrnasmission, or -1 otherwise */
@@ -709,6 +723,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
NR_list_t *UE_list = &UE_info->list;
for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ if (sched_ctrl->ul_failure==1) continue;
UE_info->mac_stats[UE_id].dlsch_current_bytes = 0;
/* update TA and set ta_apply every 10 frames.
@@ -787,7 +802,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
harq->is_waiting = true;
UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++;
- LOG_I(NR_MAC,
+ LOG_D(NR_MAC,
"%4d.%2d RNTI %04x start %d RBs %d startSymbol %d nb_symbsol %d MCS %d TBS %d HARQ PID %d round %d NDI %d\n",
frame,
slot,
@@ -801,6 +816,22 @@ void nr_schedule_ue_spec(module_id_t module_id,
current_harq_pid,
harq->round,
harq->ndi);
+ if ((get_softmodem_params()->phy_test == 1) && (frame&127) == 0)
+ LOG_D(MAC,
+ "%4d.%2d RNTI %04x start %d RBs %d startSymbol %d nb_symbsol %d MCS %d TBS %d (%f Mbps) HARQ PID %d round %d NDI %d\n",
+ frame,
+ slot,
+ rnti,
+ sched_ctrl->rbStart,
+ sched_ctrl->rbSize,
+ startSymbolIndex,
+ nrOfSymbols,
+ sched_ctrl->mcs,
+ TBS,
+ ((double)TBS)*(1<uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing)/1000,
+ current_harq_pid,
+ harq->round,
+ harq->ndi);
NR_BWP_Downlink_t *bwp = sched_ctrl->active_bwp;
@@ -820,7 +851,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
dl_req->nPDUs += 1;
pdcch_pdu = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
- LOG_I(NR_MAC,"Trying to configure DL pdcch for bwp %d, cs %d\n",bwpid,coresetid);
+ LOG_D(NR_MAC,"Trying to configure DL pdcch for bwp %d, cs %d\n",bwpid,coresetid);
NR_SearchSpace_t *ss = bwp ? sched_ctrl->search_space:gNB_mac->sched_ctrlCommon->search_space;
NR_ControlResourceSet_t *coreset = bwp? sched_ctrl->coreset:gNB_mac->sched_ctrlCommon->coreset;
nr_configure_pdcch(pdcch_pdu, ss, coreset, scc, genericParameters, NULL);
@@ -958,9 +989,9 @@ void nr_schedule_ue_spec(module_id_t module_id,
dci_payload.pdsch_to_harq_feedback_timing_indicator.val = pucch->timing_indicator; // PDSCH to HARQ TI
dci_payload.antenna_ports.val = 0; // nb of cdm groups w/o data 1 and dmrs port 0
dci_payload.dmrs_sequence_initialization.val = pdsch_pdu->SCID;
- LOG_I(NR_MAC,
+ LOG_D(NR_MAC,
"%4d.%2d DCI type 1 payload: freq_alloc %d (%d,%d,%d), "
- "time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d\n",
+ "time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d tpc %d\n",
frame,
slot,
dci_payload.frequency_domain_assignment.val,
@@ -972,7 +1003,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
dci_payload.mcs,
dci_payload.tb_scaling,
dci_payload.ndi,
- dci_payload.rv);
+ dci_payload.rv,
+ dci_payload.tpc);
const long f = sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats;
const int dci_format = bwp ? (f ? NR_DL_DCI_FORMAT_1_1 : NR_DL_DCI_FORMAT_1_0) : NR_DL_DCI_FORMAT_1_0;
@@ -987,7 +1019,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
pdsch_pdu->BWPSize,
bwp? bwp->bwp_Id : 0);
- LOG_I(NR_MAC,
+ LOG_D(NR_MAC,
"coreset params: FreqDomainResource %llx, start_symbol %d n_symb %d\n",
(unsigned long long)pdcch_pdu->FreqDomainResource,
pdcch_pdu->StartSymbolIndex,
@@ -1051,7 +1083,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
/* next, get RLC data */
// const int lcid = DL_SCH_LCID_DTCH;
- const int lcid = loop_dcch_dtch?DL_SCH_LCID_DTCH:DL_SCH_LCID_DCCH;
+ const int lcid = loop_dcch_dtch;
int dlsch_total_bytes = 0;
if (sched_ctrl->num_total_bytes > 0) {
tbs_size_t len = 0;
@@ -1079,11 +1111,12 @@ void nr_schedule_ue_spec(module_id_t module_id,
0);
LOG_I(NR_MAC,
- "%4d.%2d RNTI %04x: %d bytes from DTCH %d (ndata %d, remaining size %d)\n",
+ "%4d.%2d RNTI %04x: %d bytes from %s %d (ndata %d, remaining size %d)\n",
frame,
slot,
rnti,
len,
+ lcid < 4 ? "DCCH" : "DTCH",
lcid,
ndata,
size);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 0d99336ce4..dbbc40e426 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -255,12 +255,17 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP,
}
}
+extern int getNrOfSymbols(NR_BWP_Downlink_t *bwp, int tda);
+extern uint8_t getN_PRB_DMRS(NR_BWP_Downlink_t *bwp, int numDmrsCdmGrpsNoData);
+uint32_t target_dl_mcs = 9;
+uint32_t target_dl_bw = 50;
+uint64_t dlsch_slot_bitmap = (1<<1);
/* schedules whole bandwidth for first user, all the time */
void nr_preprocessor_phytest(module_id_t module_id,
frame_t frame,
sub_frame_t slot)
{
- if (slot != 1)
+ if (!is_xlsch_in_slot(dlsch_slot_bitmap, slot))
return;
NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
@@ -274,24 +279,25 @@ void nr_preprocessor_phytest(module_id_t module_id,
/* find largest unallocated chunk */
const int bwpSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
int rbStart = 0;
- int tStart = 0;
int rbSize = 0;
uint16_t *vrb_map = RC.nrmac[module_id]->common_channels[CC_id].vrb_map;
- /* find largest unallocated RB region */
- do {
+ /* loop ensures that we allocate exactly target_dl_bw, or return */
+ while (true) {
/* advance to first free RB */
- while (tStart < bwpSize && vrb_map[tStart])
- tStart++;
- /* find maximum rbSize at current rbStart */
- int tSize = 1;
- while (tStart + tSize < bwpSize && !vrb_map[tStart + tSize])
- tSize++;
- if (tSize > rbSize) {
- rbStart = tStart;
- rbSize = tSize;
- }
- tStart += tSize;
- } while (tStart < bwpSize);
+ while (rbStart < bwpSize && vrb_map[rbStart])
+ rbStart++;
+ rbSize = 1;
+ /* iterate until we are at target_dl_bw or no available RBs */
+ while (rbStart + rbSize < bwpSize && !vrb_map[rbStart + rbSize] && rbSize < target_dl_bw)
+ rbSize++;
+ /* found target_dl_bw? */
+ if (rbSize == target_dl_bw)
+ break;
+ /* at end and below target_dl_bw? */
+ if (rbStart + rbSize >= bwpSize)
+ return;
+ rbStart += rbSize;
+ }
sched_ctrl->num_total_bytes = 0;
const int lcid = DL_SCH_LCID_DTCH;
@@ -364,7 +370,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
else
sched_ctrl->mcsTableIdx = 2;
}
- sched_ctrl->mcs = 9;
+ sched_ctrl->mcs = target_dl_mcs;
sched_ctrl->numDmrsCdmGrpsNoData = 1;
/* get the PID of a HARQ process awaiting retransmission, or -1 otherwise */
sched_ctrl->dl_harq_pid = sched_ctrl->retrans_dl_harq.head;
@@ -372,8 +378,13 @@ void nr_preprocessor_phytest(module_id_t module_id,
/* mark the corresponding RBs as used */
for (int rb = 0; rb < sched_ctrl->rbSize; rb++)
vrb_map[rb + sched_ctrl->rbStart] = 1;
+
+ if ((frame&127) == 0) LOG_I(MAC,"phytest: %d.%d DL mcs %d, DL rbStart %d, DL rbSize %d\n", frame, slot, sched_ctrl->mcs, rbStart,rbSize);
}
+uint32_t target_ul_mcs = 9;
+uint32_t target_ul_bw = 50;
+uint64_t ulsch_slot_bitmap = (1<<8);
bool nr_ul_preprocessor_phytest(module_id_t module_id,
frame_t frame,
sub_frame_t slot,
@@ -410,19 +421,20 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id,
/* check if slot is UL, and that slot is 8 (assuming K2=6 because of UE
* limitations). Note that if K2 or the TDD configuration is changed, below
* conditions might exclude each other and never be true */
- if (!(is_xlsch_in_slot(ulsch_in_slot_bitmap, sched_slot) && sched_slot == 8))
+ if (!is_xlsch_in_slot(ulsch_slot_bitmap, sched_slot))
return false;
- const int bw = NRRIV2BW(sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
uint16_t rbStart = 0;
- uint16_t rbSize = 50; /* due to OAI UE limitations */
- if (rbSize>bw)
- rbSize = bw;
+ uint16_t rbSize = target_ul_bw;
uint16_t *vrb_map_UL =
&RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
+ const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
+ int startSymbolIndex, nrOfSymbols;
+ SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols);
+ const uint16_t symb = ((1 << nrOfSymbols) - 1) << startSymbolIndex;
for (int i = rbStart; i < rbStart + rbSize; ++i) {
- if (vrb_map_UL[i]) {
+ if ((vrb_map_UL[i] & symb) != 0) {
LOG_E(MAC,
"%s(): %4d.%2d RB %d is already reserved, cannot schedule UE\n",
__func__,
@@ -478,7 +490,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id,
num_dmrs_cdm_grps_no_data,
ps);
- const int mcs = 9;
+ const int mcs = target_ul_mcs;
NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
sched_pusch->mcs = mcs;
sched_pusch->rbStart = rbStart;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index de520f64be..23b19c51ff 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -154,16 +154,15 @@ NR_ControlResourceSet_t *get_coreset(NR_ServingCellConfigCommon_t *scc,
}
NR_SearchSpace_t *get_searchspace(NR_ServingCellConfigCommon_t *scc,
- NR_BWP_Downlink_t *bwp,
+ NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
NR_SearchSpace__searchSpaceType_PR target_ss) {
-
- const int n = bwp ?
- bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count:
+ const int n = bwp_Dedicated ?
+ bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count:
scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list.count;
for (int i=0;ibwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.array[i]:
+ NR_SearchSpace_t *ss = bwp_Dedicated ?
+ bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.array[i]:
scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list.array[i];
AssertFatal(ss->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n");
AssertFatal(ss->searchSpaceType != NULL, "ss->searchSpaceType is null\n");
@@ -171,7 +170,7 @@ NR_SearchSpace_t *get_searchspace(NR_ServingCellConfigCommon_t *scc,
return ss;
}
}
- AssertFatal(0, "Couldn't find an adequate searchspace\n");
+ AssertFatal(0, "Couldn't find an adequate searchspace bwp_Dedicated %p\n",bwp_Dedicated);
}
int allocate_nr_CCEs(gNB_MAC_INST *nr_mac,
@@ -1256,9 +1255,9 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
case NR_UL_DCI_FORMAT_0_0:
switch (rnti_type) {
case NR_RNTI_C:
- // indicating a DL DCI format 1bit
+ // indicating a UL DCI format 1bit
pos=1;
- *dci_pdu |= ((uint64_t)dci_pdu_rel15->format_indicator & 1) << (dci_size - pos);
+ //*dci_pdu |= ((uint64_t)dci_pdu_rel15->format_indicator & 1) << (dci_size - pos);
// Freq domain assignment max 16 bit
fsize = (int)ceil(log2((N_RB * (N_RB + 1)) >> 1));
pos+=fsize;
@@ -1732,10 +1731,14 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
compute_csi_bitlen (CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, mod_idP);
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
memset(sched_ctrl, 0, sizeof(*sched_ctrl));
+ sched_ctrl->lcid_mask = 0;
sched_ctrl->ta_frame = 0;
sched_ctrl->ta_update = 31;
sched_ctrl->ta_apply = false;
sched_ctrl->ul_rssi = 0;
+ sched_ctrl->pucch_consecutive_dtx_cnt = 0;
+ sched_ctrl->pusch_consecutive_dtx_cnt = 0;
+ sched_ctrl->ul_failure = 0;
/* set illegal time domain allocation to force recomputation of all fields */
sched_ctrl->pusch_save.time_domain_allocation = -1;
const NR_ServingCellConfig_t *servingCellConfig = CellGroup ? CellGroup->spCellConfig->spCellConfigDedicated : NULL;
@@ -1863,6 +1866,7 @@ uint8_t nr_get_tpc(int target, uint8_t cqi, int incr) {
// al values passed to this function are x10
int snrx10 = (cqi*5) - 640;
+ LOG_D(NR_MAC,"tpc : target %d, snrx10 %d\n",target,snrx10);
if (snrx10 > target + incr) return 0; // decrease 1dB
if (snrx10 < target - incr) return 2; // increase 1dB
if (snrx10 < target - (3*incr)) return 3; // increase 3dB
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index 8ea7165a65..1aef076db0 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -126,6 +126,7 @@ void nr_schedule_pucch(int Mod_idP,
for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ if (sched_ctrl->ul_failure==1) continue;
const int n = sizeof(sched_ctrl->sched_pucch) / sizeof(*sched_ctrl->sched_pucch);
for (int i = 0; i < n; i++) {
NR_sched_pucch_t *curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[i];
@@ -574,7 +575,9 @@ static void handle_dl_harq(module_id_t mod_id,
add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].available_dl_harq, harq_pid);
harq->round = 0;
harq->ndi ^= 1;
- } else if (harq->round == MAX_HARQ_ROUNDS) {
+ } else {
+ harq->round++;
+ if (harq->round == MAX_HARQ_ROUNDS) {
add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].available_dl_harq, harq_pid);
harq->round = 0;
harq->ndi ^= 1;
@@ -583,7 +586,7 @@ static void handle_dl_harq(module_id_t mod_id,
LOG_D(MAC, "retransmission error for UE %d (total %d)\n", UE_id, stats->dlsch_errors);
} else {
add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].retrans_dl_harq, harq_pid);
- harq->round++;
+ }
}
}
@@ -659,7 +662,7 @@ int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, int Mod_idP, int UE_i
//returns the measured RSRP value (upper limit)
int get_measured_rsrp(uint8_t index) {
//if index is invalid returning minimum rsrp -140
- if((index >= 0 && index <= 15) || index >= 114)
+ if(index <= 15 || index >= 114)
return MIN_RSRP_VALUE;
return L1_SSB_CSI_RSRP_measReport_mapping_38133_10_1_6_1_1[index];
@@ -970,10 +973,11 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id,
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
// tpc (power control)
- sched_ctrl->tpc1 = nr_get_tpc(RC.nrmac[mod_id]->pucch_target_snrx10,
- uci_01->ul_cqi,
- 30);
-
+ if (uci_01->harq->harq_confidence_level == 0)
+ sched_ctrl->tpc1 = nr_get_tpc(RC.nrmac[mod_id]->pucch_target_snrx10,
+ uci_01->ul_cqi,
+ 30);
+ LOG_D(NR_MAC,"pucch tpc %d\n",sched_ctrl->tpc1);
NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon;
const int num_slots = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
if (((uci_01->pduBitmap >> 1) & 0x01)) {
@@ -981,7 +985,7 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id,
for (int harq_bit = 0; harq_bit < uci_01->harq->num_harq; harq_bit++) {
const uint8_t harq_value = uci_01->harq->harq_list[harq_bit].harq_value;
const uint8_t harq_confidence = uci_01->harq->harq_confidence_level;
- const int feedback_slot = (slot - 1 + num_slots) % num_slots;
+ const int feedback_slot = (slot + num_slots) % num_slots;
/* In case of realtime problems: we can only identify a HARQ process by
* timing. If the HARQ process's feedback_slot is not the one we
* expected, we assume that processing has been aborted and we need to
@@ -1038,7 +1042,7 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
// iterate over received harq bits
for (int harq_bit = 0; harq_bit < uci_234->harq.harq_bit_len; harq_bit++) {
const int acknack = ((uci_234->harq.harq_payload[harq_bit >> 3]) >> harq_bit) & 0x01;
- const int feedback_slot = (slot - 1 + num_slots) % num_slots;
+ const int feedback_slot = (slot + num_slots) % num_slots;
/* In case of realtime problems: we can only identify a HARQ process by
* timing. If the HARQ process's feedback_slot is not the one we
* expected, we assume that processing has been aborted and we need to
@@ -1147,7 +1151,7 @@ bool nr_acknack_scheduling(int mod_id,
}
}
- LOG_I(MAC,"1. DL slot %d, UL_ACK %d\n",slot,pucch->ul_slot);
+ LOG_D(MAC,"1. DL slot %d, UL_ACK %d\n",slot,pucch->ul_slot);
/* if the UE's next PUCCH occasion is after the possible UL slots (within the
* same frame) or wrapped around to the next frame, then we assume there is
* no possible PUCCH allocation anymore */
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index fb140dcaac..aa1ed57a8d 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -227,6 +227,7 @@ void nr_process_mac_pdu(
break;
case UL_SCH_LCID_SRB1:
+ case UL_SCH_LCID_SRB2:
if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
//mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
mac_subheader_len = 3;
@@ -236,7 +237,7 @@ void nr_process_mac_pdu(
mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
mac_subheader_len = 2;
}
- LOG_I(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-DCCH %d (gNB %d, %d bytes), rnti: %d \n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len, rnti);
+ LOG_D(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-DCCH %d (gNB %d, %d bytes), rnti: %d \n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len, rnti);
mac_rlc_data_ind(module_idP,
rnti,
module_idP,
@@ -249,9 +250,6 @@ void nr_process_mac_pdu(
1,
NULL);
break;
- case UL_SCH_LCID_SRB2:
- // todo
- break;
case UL_SCH_LCID_SRB3:
// todo
break;
@@ -307,11 +305,11 @@ void nr_process_mac_pdu(
mac_subheader_len = 2;
}
- LOG_D(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-DTCH %d (gNB %d, %d bytes)\n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len);
- int UE_id = find_nr_UE_id(module_idP, rnti);
- RC.nrmac[module_idP]->UE_info.mac_stats[UE_id].lc_bytes_rx[rx_lcid] += mac_sdu_len;
+ LOG_I(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-%s %d (gNB %d, %d bytes)\n", module_idP, frameP, rx_lcid<4?"DCCH":"DTCH",rx_lcid, module_idP, mac_sdu_len);
+ int UE_id = find_nr_UE_id(module_idP, rnti);
+ RC.nrmac[module_idP]->UE_info.mac_stats[UE_id].lc_bytes_rx[rx_lcid] += mac_sdu_len;
#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
- log_dump(NR_MAC, pdu_ptr + mac_subheader_len, 32, LOG_DUMP_CHAR, "\n");
+ log_dump(NR_MAC, pdu_ptr + mac_subheader_len, 32, LOG_DUMP_CHAR, "\n");
#endif
@@ -403,25 +401,26 @@ void handle_nr_ul_harq(module_id_t mod_id,
harq_pid,
crc_pdu->rnti);
add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid);
- } else if (harq->round == MAX_HARQ_ROUNDS) {
- harq->ndi ^= 1;
- harq->round = 0;
- LOG_D(NR_MAC,
- "RNTI %04x: Ulharq id %d crc failed in all rounds\n",
- crc_pdu->rnti,
- harq_pid);
- UE_info->mac_stats[UE_id].ulsch_errors++;
- add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid);
} else {
harq->round++;
- LOG_D(NR_MAC,
- "Ulharq id %d crc failed for RNTI %04x\n",
- harq_pid,
- crc_pdu->rnti);
- add_tail_nr_list(&sched_ctrl->retrans_ul_harq, harq_pid);
+ if (harq->round == MAX_HARQ_ROUNDS) {
+ harq->ndi ^= 1;
+ harq->round = 0;
+ LOG_D(NR_MAC,
+ "RNTI %04x: Ulharq id %d crc failed in all rounds\n",
+ crc_pdu->rnti,
+ harq_pid);
+ UE_info->mac_stats[UE_id].ulsch_errors++;
+ add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid);
+ } else {
+ LOG_D(NR_MAC,
+ "Ulharq id %d crc failed for RNTI %04x\n",
+ harq_pid,
+ crc_pdu->rnti);
+ add_tail_nr_list(&sched_ctrl->retrans_ul_harq, harq_pid);
+ }
}
}
-
/*
* When data are received on PHY and transmitted to MAC
*/
@@ -441,7 +440,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
const int current_rnti = rntiP;
const int UE_id = find_nr_UE_id(gnb_mod_idP, current_rnti);
const int target_snrx10 = gNB_mac->pusch_target_snrx10;
-
+ const int pusch_failure_thres = gNB_mac->pusch_failure_thres;
if (UE_id != -1) {
NR_UE_sched_ctrl_t *UE_scheduling_control = &UE_info->UE_sched_ctrl[UE_id];
const int8_t harq_pid = UE_scheduling_control->feedback_ul_harq.head;
@@ -452,7 +451,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
T_BUFFER(sduP, sdu_lenP));
UE_info->mac_stats[UE_id].ulsch_total_bytes_rx += sdu_lenP;
- LOG_D(NR_MAC, "[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu from PHY (rnti %x, UE_id %d) ul_cqi %d sduP %p\n",
+ LOG_D(NR_MAC, "[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu from PHY (rnti %x, UE_id %d) ul_cqi %d TA %d sduP %p\n",
gnb_mod_idP,
harq_pid,
CC_idP,
@@ -461,6 +460,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
current_rnti,
UE_id,
ul_cqi,
+ timing_advance,
sduP);
// if not missed detection (10dB threshold for now)
@@ -490,6 +490,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
if (sduP != NULL){
LOG_D(NR_MAC, "Received PDU at MAC gNB \n");
+ UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt = 0;
const uint32_t tb_size = UE_scheduling_control->ul_harq_processes[harq_pid].sched_pusch.tb_size;
UE_scheduling_control->sched_ul_bytes -= tb_size;
if (UE_scheduling_control->sched_ul_bytes < 0)
@@ -506,9 +507,18 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
if (UE_scheduling_control->sched_ul_bytes < 0)
UE_scheduling_control->sched_ul_bytes = 0;
}
+ if (ul_cqi <= 128) {
+ UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt++;
+ UE_info->mac_stats[UE_id].ulsch_DTX++;
+ }
+ if (UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt >= pusch_failure_thres) {
+ LOG_I(NR_MAC,"Detected UL Failure on PUSCH, stopping scheduling\n");
+ UE_info->UE_sched_ctrl[UE_id].ul_failure = 1;
+ }
}
} else if(sduP) {
+
bool no_sig = true;
for (int k = 0; k < sdu_lenP; k++) {
if(sduP[k]!=0) {
@@ -534,7 +544,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
continue;
if(no_sig) {
- LOG_W(NR_MAC, "Random Access %i failed at state %i\n", i, ra->state);
+ LOG_W(NR_MAC, "Random Access %i failed at state %i (no signal)\n", i, ra->state);
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
} else {
@@ -547,48 +557,48 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
current_rnti);
if( (frameP==ra->Msg3_frame) && (slotP==ra->Msg3_slot) ) {
- LOG_W(NR_MAC, "Random Access %i failed at state %i\n", i, ra->state);
+ LOG_W(NR_MAC, "Random Access %i failed at state %i (TC_RNTI %04x RNTI %04x\n", i, ra->state,ra->rnti,current_rnti);
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
}
continue;
}
- int UE_id=-1;
+ int UE_id=-1;
- UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti, ra->CellGroup);
- UE_info->UE_beam_index[UE_id] = ra->beam_id;
+ UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti, ra->CellGroup);
+ UE_info->UE_beam_index[UE_id] = ra->beam_id;
- // re-initialize ta update variables after RA procedure completion
- UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP;
+ // re-initialize ta update variables after RA procedure completion
+ UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP;
- LOG_I(NR_MAC,
- "reset RA state information for RA-RNTI %04x/index %d\n",
- ra->rnti,
- i);
+ LOG_I(NR_MAC,
+ "reset RA state information for RA-RNTI %04x/index %d\n",
+ ra->rnti,
+ i);
- LOG_I(NR_MAC,
- "[gNB %d][RAPROC] PUSCH with TC_RNTI %x received correctly, "
- "adding UE MAC Context UE_id %d/RNTI %04x\n",
- gnb_mod_idP,
- current_rnti,
- UE_id,
- ra->rnti);
+ LOG_I(NR_MAC,
+ "[gNB %d][RAPROC] PUSCH with TC_RNTI %x received correctly, "
+ "adding UE MAC Context UE_id %d/RNTI %04x\n",
+ gnb_mod_idP,
+ current_rnti,
+ UE_id,
+ ra->rnti);
- if(ra->cfra) {
+ if (ra->cfra) {
- LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) CFRA procedure succeeded!\n", UE_id, ra->rnti);
- nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
- nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
- UE_info->active[UE_id] = true;
+ LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) CFRA procedure succeeded!\n", UE_id, ra->rnti);
+ nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
+ nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
+ UE_info->active[UE_id] = true;
- } else {
+ } else {
- LOG_I(NR_MAC,"[RAPROC] RA-Msg3 received (sdu_lenP %d)\n",sdu_lenP);
- LOG_D(NR_MAC,"[RAPROC] Received Msg3:\n");
- for (int k = 0; k < sdu_lenP; k++) {
- LOG_D(NR_MAC,"(%i): 0x%x\n",k,sduP[k]);
- }
+ LOG_I(NR_MAC,"[RAPROC] RA-Msg3 received (sdu_lenP %d)\n",sdu_lenP);
+ LOG_D(NR_MAC,"[RAPROC] Received Msg3:\n");
+ for (int k = 0; k < sdu_lenP; k++) {
+ LOG_D(NR_MAC,"(%i): 0x%x\n",k,sduP[k]);
+ }
// UE Contention Resolution Identity
// Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to fill in Msg4
@@ -604,7 +614,6 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
}
return;
-
}
}
} else {
@@ -613,7 +622,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
if (ra->state != WAIT_Msg3)
continue;
- LOG_W(NR_MAC, "Random Access %i failed at state %i\n", i, ra->state);
+ LOG_W(NR_MAC, "Random Access %i failed at state %i (state is not WAIT_Msg3)\n", i, ra->state);
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
}
@@ -694,8 +703,14 @@ void pf_ul(module_id_t module_id,
* every TTI if we can save it, so check whether dci_format, TDA, or
* num_dmrs_cdm_grps_no_data has changed and only then recompute */
sched_ctrl->sched_pusch.time_domain_allocation = tda;
- sched_ctrl->search_space = get_searchspace(scc,sched_ctrl->active_bwp,
- sched_ctrl->active_bwp ?
+ NR_BWP_DownlinkDedicated_t *bwp_Dedicated=NULL;
+ if (sched_ctrl->active_bwp) bwp_Dedicated = sched_ctrl->active_bwp->bwp_Dedicated;
+ else if (UE_info->CellGroup[UE_id] &&
+ UE_info->CellGroup[UE_id]->spCellConfig &&
+ UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated)
+ bwp_Dedicated = UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
+ sched_ctrl->search_space = get_searchspace(scc,bwp_Dedicated,
+ bwp_Dedicated ?
NR_SearchSpace__searchSpaceType_PR_ue_Specific:
NR_SearchSpace__searchSpaceType_PR_common);
sched_ctrl->coreset = get_coreset(scc,sched_ctrl->active_bwp, sched_ctrl->search_space, 1 /* dedicated */);
@@ -731,7 +746,7 @@ void pf_ul(module_id_t module_id,
/* Get previous PSUCH filed info */
sched_ctrl->sched_pusch = cur_harq->sched_pusch;
NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
- LOG_I(NR_MAC, "%4d.%2d Allocate UL retransmission UE %d/RNTI %04x sched %4d.%2d (%d RBs)\n",
+ LOG_D(NR_MAC, "%4d.%2d Allocate UL retransmission UE %d/RNTI %04x sched %4d.%2d (%d RBs)\n",
frame, slot, UE_id, UE_info->rnti[UE_id],
sched_pusch->frame, sched_pusch->slot,
sched_pusch->rbSize);
@@ -759,8 +774,9 @@ void pf_ul(module_id_t module_id,
sched_pusch->mcs = mcs;
sched_pusch->R = nr_get_code_rate_ul(mcs, ps->mcs_table);
sched_pusch->Qm = nr_get_Qm_ul(mcs, ps->mcs_table);
- if (ps->pusch_Config->tp_pi2BPSK
- && ((ps->mcs_table == 3 && mcs < 2) || (ps->mcs_table == 4 && mcs < 6))) {
+ LOG_D(NR_MAC, "Fixme: work around a NULL pointer (set in function nr_save_pusch_fields that is actually called)\n");
+ if (ps->pusch_Config && (ps->pusch_Config->tp_pi2BPSK
+ && ((ps->mcs_table == 3 && mcs < 2) || (ps->mcs_table == 4 && mcs < 6)))) {
sched_pusch->R >>= 1;
sched_pusch->Qm <<= 1;
}
@@ -1018,6 +1034,7 @@ void nr_schedule_ulsch(module_id_t module_id,
const NR_list_t *UE_list = &UE_info->list;
for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ if (sched_ctrl->ul_failure == 1) continue;
UE_info->mac_stats[UE_id].ulsch_current_bytes = 0;
/* dynamic PUSCH values (RB alloc, MCS, hence R, Qm, TBS) that change in
* every TTI are pre-populated by the preprocessor and used below */
@@ -1068,7 +1085,7 @@ void nr_schedule_ulsch(module_id_t module_id,
cur_harq->sched_pusch = *sched_pusch;
sched_ctrl->sched_ul_bytes += sched_pusch->tb_size;
} else {
- LOG_I(NR_MAC,
+ LOG_D(NR_MAC,
"%d.%2d UL retransmission RNTI %04x sched %d.%2d HARQ PID %d round %d NDI %d\n",
frame,
slot,
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index edc553c92b..a5821aaa3c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -53,9 +53,9 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
int pusch_AntennaPorts,
int sib1_tda,
NR_ServingCellConfigCommon_t *scc,
- int nsa_flag,
- uint32_t rnti,
- NR_CellGroupConfig_t *CellGroup
+ int nsa_flag,
+ uint32_t rnti,
+ NR_CellGroupConfig_t *CellGroup
);
void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
@@ -273,8 +273,8 @@ NR_ControlResourceSet_t *get_coreset(NR_ServingCellConfigCommon_t *scc,
/* find a search space within a BWP */
NR_SearchSpace_t *get_searchspace(NR_ServingCellConfigCommon_t *scc,
- NR_BWP_Downlink_t *bwp,
- NR_SearchSpace__searchSpaceType_PR target_ss);
+ NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
+ NR_SearchSpace__searchSpaceType_PR target_ss);
long get_K2(NR_ServingCellConfigCommon_t *scc, NR_BWP_Uplink_t *ubwp, int time_domain_assignment, int mu);
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index be96716570..ce8883edbb 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -517,6 +517,7 @@ typedef struct {
/// DL HARQ PID to use for this UE, or -1 for "any new"
int8_t dl_harq_pid;
+ int lcid_mask;
uint16_t ta_frame;
int16_t ta_update;
bool ta_apply;
@@ -524,6 +525,9 @@ typedef struct {
uint8_t tpc1;
uint16_t ul_rssi;
uint8_t current_harq_pid;
+ int pusch_consecutive_dtx_cnt;
+ int pucch_consecutive_dtx_cnt;
+ int ul_failure;
struct CSI_Report CSI_report[MAX_CSI_REPORTS];
/// information about every HARQ process
NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
@@ -559,6 +563,7 @@ typedef struct {
int dlsch_current_bytes;
int ulsch_rounds[8];
int ulsch_errors;
+ int ulsch_DTX;
int ulsch_total_bytes_scheduled;
int ulsch_total_bytes_rx;
int ulsch_current_bytes;
@@ -614,6 +619,10 @@ typedef struct gNB_MAC_INST_s {
int pusch_target_snrx10;
/// Pucch target SNR
int pucch_target_snrx10;
+ /// PUCCH Failure threshold (compared to consecutive PUCCH DTX)
+ int pucch_failure_thres;
+ /// PUSCH Failure threshold (compared to consecutive PUSCH DTX)
+ int pusch_failure_thres;
/// Subcarrier Offset
int ssb_SubcarrierOffset;
/// SIB1 Time domain allocation
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
index ee2711c6ef..e516217ff1 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
@@ -61,6 +61,7 @@
# include "gtpv1u_eNB_task.h"
# include "gtpv1u.h"
+#include
#include "ENB_APP/enb_config.h"
@@ -83,9 +84,57 @@ hash_table_t *pdcp_coll_p = NULL;
static int mbms_socket = -1;
#endif
+uint32_t Pdcp_stats_tx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB];
+uint32_t Pdcp_stats_tx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_throughput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_tx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB];
+uint32_t Pdcp_stats_rx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_goodput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+uint32_t Pdcp_stats_rx_outoforder[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+int pdcp_pc5_sockfd;
+struct sockaddr_in prose_ctrl_addr;
+struct sockaddr_in prose_pdcp_addr;
+struct sockaddr_in pdcp_sin;
/* pdcp module parameters and related functions*/
static pdcp_params_t pdcp_params= {0,NULL};
+rnti_t pdcp_UE_UE_module_id_to_rnti[MAX_MOBILES_PER_ENB];
+rnti_t pdcp_eNB_UE_instance_to_rnti[MAX_MOBILES_PER_ENB]; // for noS1 mode
+unsigned int pdcp_eNB_UE_instance_to_rnti_index;
+
+signed int pdcp_2_nas_irq;
+pdcp_stats_t UE_pdcp_stats[MAX_MOBILES_PER_ENB];
+pdcp_stats_t eNB_pdcp_stats[NUMBER_OF_eNB_MAX];
+
+static pdcp_mbms_t pdcp_mbms_array_ue[MAX_MOBILES_PER_ENB][LTE_maxServiceCount][LTE_maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h
+static pdcp_mbms_t pdcp_mbms_array_eNB[NUMBER_OF_eNB_MAX][LTE_maxServiceCount][LTE_maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h
+static sdu_size_t pdcp_input_sdu_remaining_size_to_read;
+static sdu_size_t pdcp_output_header_bytes_to_write;
+static sdu_size_t pdcp_output_sdu_bytes_to_write;
+notifiedFIFO_t pdcp_sdu_list;
+
+pdcp_enb_t pdcp_enb[MAX_NUM_CCs];
+
uint64_t get_pdcp_optmask(void) {
return pdcp_params.optmask;
@@ -937,7 +986,7 @@ pdcp_data_ind(
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).offset = GTPU_HEADER_OVERHEAD_MAX;
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rnti = ctxt_pP->rnti;
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rab_id = rb_id + 4;
- itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p);
+ itti_send_msg_to_task(TASK_VARIABLE, INSTANCE_DEFAULT, message_p);
packet_forwarded = TRUE;
}
} else {
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
index c8ab4499ee..0c3dd2f04f 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
@@ -91,34 +91,34 @@ extern int pdcp_instance_cnt;
int init_pdcp_thread(void);
void cleanup_pdcp_thread(void);
-uint32_t Pdcp_stats_tx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB];
-uint32_t Pdcp_stats_tx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_tx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_tx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_tx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_tx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_tx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_tx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_tx_throughput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_tx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_tx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_tx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_tx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_tx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB];
+extern uint32_t Pdcp_stats_tx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_tx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_tx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_tx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_tx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_tx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_tx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_tx_throughput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_tx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_tx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_tx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_tx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB];
-uint32_t Pdcp_stats_rx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_goodput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
-uint32_t Pdcp_stats_rx_outoforder[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB];
+extern uint32_t Pdcp_stats_rx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_goodput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
+extern uint32_t Pdcp_stats_rx_outoforder[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX];
void pdcp_update_perioidical_stats(const protocol_ctxt_t *const ctxt_pP);
@@ -138,7 +138,7 @@ typedef struct pdcp_enb_s {
} pdcp_enb_t;
-pdcp_enb_t pdcp_enb[MAX_NUM_CCs];
+extern pdcp_enb_t pdcp_enb[MAX_NUM_CCs];
typedef struct pdcp_stats_s {
time_stats_t pdcp_run;
@@ -242,17 +242,18 @@ typedef struct pdcp_mbms_s {
* \note None
* @ingroup _pdcp
*/
+
boolean_t pdcp_data_req(
protocol_ctxt_t *ctxt_pP,
const srb_flag_t srb_flagP,
const rb_id_t rb_id,
const mui_t muiP,
- const confirm_t confirmP, \
+ const confirm_t confirmP,
const sdu_size_t sdu_buffer_size,
unsigned char *const sdu_buffer,
const pdcp_transmission_mode_t mode,
- const uint32_t *const sourceL2Id,
- const uint32_t *const destinationL2Id
+ const uint32_t * sourceL2Id,
+ const uint32_t * destinationL2Id
);
/*! \fn boolean_t pdcp_data_ind(const protocol_ctxt_t* const, srb_flag_t, MBMS_flag_t, rb_id_t, sdu_size_t, mem_block_t*, boolean_t)
@@ -455,10 +456,10 @@ struct pdcp_netlink_element_s {
//TTN for D2D (PC5S)
#define PDCP_SOCKET_PORT_NO 9999 //temporary value
#define PC5_SIGNALLING_PAYLOAD_SIZE 100 //should be updated with a correct value
-int pdcp_pc5_sockfd;
-struct sockaddr_in prose_ctrl_addr;
-struct sockaddr_in prose_pdcp_addr;
-struct sockaddr_in pdcp_sin;
+extern int pdcp_pc5_sockfd;
+extern struct sockaddr_in prose_ctrl_addr;
+extern struct sockaddr_in prose_pdcp_addr;
+extern struct sockaddr_in pdcp_sin;
void pdcp_pc5_socket_init(void);
typedef struct {
@@ -500,28 +501,18 @@ typedef struct {
#define REORDERING_WINDOW_SN_7BIT 64
#define REORDERING_WINDOW_SN_12BIT 2048
-signed int pdcp_2_nas_irq;
-pdcp_stats_t UE_pdcp_stats[MAX_MOBILES_PER_ENB];
-pdcp_stats_t eNB_pdcp_stats[NUMBER_OF_eNB_MAX];
+extern signed int pdcp_2_nas_irq;
+extern pdcp_stats_t UE_pdcp_stats[MAX_MOBILES_PER_ENB];
+extern pdcp_stats_t eNB_pdcp_stats[NUMBER_OF_eNB_MAX];
// for UE code conly
-rnti_t pdcp_UE_UE_module_id_to_rnti[MAX_MOBILES_PER_ENB];
-rnti_t pdcp_eNB_UE_instance_to_rnti[MAX_MOBILES_PER_ENB]; // for noS1 mode
-unsigned int pdcp_eNB_UE_instance_to_rnti_index;
+extern rnti_t pdcp_UE_UE_module_id_to_rnti[MAX_MOBILES_PER_ENB];
+extern rnti_t pdcp_eNB_UE_instance_to_rnti[MAX_MOBILES_PER_ENB]; // for noS1 mode
+extern unsigned int pdcp_eNB_UE_instance_to_rnti_index;
-pdcp_mbms_t pdcp_mbms_array_ue[MAX_MOBILES_PER_ENB][LTE_maxServiceCount][LTE_maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h
-pdcp_mbms_t pdcp_mbms_array_eNB[NUMBER_OF_eNB_MAX][LTE_maxServiceCount][LTE_maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h
-sdu_size_t pdcp_output_sdu_bytes_to_write;
-sdu_size_t pdcp_output_header_bytes_to_write;
-notifiedFIFO_t pdcp_sdu_list;
-int pdcp_sent_a_sdu;
-pdcp_data_req_header_t pdcp_input_header;
-unsigned char pdcp_input_sdu_buffer[MAX_IP_PACKET_SIZE];
-sdu_size_t pdcp_input_index_header;
-sdu_size_t pdcp_input_sdu_size_read;
-sdu_size_t pdcp_input_sdu_remaining_size_to_read;
+extern notifiedFIFO_t pdcp_sdu_list;
#define PDCP_COLL_KEY_VALUE(mODULE_iD, rNTI, iS_eNB, rB_iD, iS_sRB) \
((hash_key_t)mODULE_iD | \
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
index 687d7b1bfe..8ff3c06cd4 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
@@ -78,9 +78,6 @@ extern int nas_sock_fd[MAX_MOBILES_PER_ENB];
extern int nas_sock_mbms_fd;
-extern int mbms_rab_id;
-
-
extern struct msghdr nas_msg_tx;
extern struct msghdr nas_msg_rx;
@@ -113,8 +110,6 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) {
* PDCP packet to pick the right socket below */
int rb_id = pdcpHead->rb_id;
- int sizeToWrite= sizeof (pdcp_data_ind_header_t) +
- pdcpHead->data_size;
void * pdcpData=(void*)(pdcpHead+1);
if (rb_id == 10) { //hardcoded for PC5-Signaling
if( LOG_DEBUGFLAG(DEBUG_PDCP) ) {
@@ -128,24 +123,25 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) {
} else if (UE_NAS_USE_TUN) {
//ret = write(nas_sock_fd[pdcpHead->inst], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),sizeToWrite );
if(rb_id == mbms_rab_id){
- ret = write(nas_sock_mbms_fd, pdcpData,sizeToWrite );
+ ret = write(nas_sock_mbms_fd, pdcpData, pdcpHead->data_size );
LOG_I(PDCP,"[PDCP_FIFOS] ret %d TRIED TO PUSH MBMS DATA TO rb_id %d handle %d sizeToWrite %d\n",
- ret,rb_id,nas_sock_fd[pdcpHead->inst],sizeToWrite);
+ ret,rb_id,nas_sock_fd[pdcpHead->inst],pdcpHead->data_size);
}
else
{
if( LOG_DEBUGFLAG(DEBUG_PDCP) )
- log_dump(PDCP, pdcpData, sizeToWrite, LOG_DUMP_CHAR,"PDCP output to be sent to TUN interface: \n");
- ret = write(nas_sock_fd[pdcpHead->inst], pdcpData,sizeToWrite );
+ log_dump(PDCP, pdcpData, pdcpHead->data_size, LOG_DUMP_CHAR,"PDCP output to be sent to TUN interface: \n");
+ ret = write(nas_sock_fd[pdcpHead->inst], pdcpData,pdcpHead->data_size );
LOG_T(PDCP,"[UE PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d sizeToWrite %d\n",
- ret,rb_id,nas_sock_fd[pdcpHead->inst],sizeToWrite);
+ ret,rb_id,nas_sock_fd[pdcpHead->inst],pdcpHead->data_size);
}
} else if (ENB_NAS_USE_TUN) {
if( LOG_DEBUGFLAG(DEBUG_PDCP) )
- log_dump(PDCP, pdcpData, sizeToWrite, LOG_DUMP_CHAR,"PDCP output to be sent to TUN interface: \n");
- ret = write(nas_sock_fd[0], pdcpData, sizeToWrite);
- LOG_T(PDCP,"[NB PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d sizeToWrite %d\n",ret,rb_id,nas_sock_fd[0],sizeToWrite);
+ log_dump(PDCP, pdcpData, pdcpHead->data_size, LOG_DUMP_CHAR,"PDCP output to be sent to TUN interface: \n");
+ ret = write(nas_sock_fd[0], pdcpData, pdcpHead->data_size);
+ LOG_T(PDCP,"[NB PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d sizeToWrite %d\n",ret,rb_id,nas_sock_fd[0],pdcpHead->data_size);
} else if (PDCP_USE_NETLINK) {
+ int sizeToWrite= sizeof (pdcp_data_ind_header_t) + pdcpHead->data_size;
memcpy(NLMSG_DATA(nas_nlh_tx), (uint8_t *) pdcpHead, sizeToWrite);
nas_nlh_tx->nlmsg_len = sizeToWrite;
ret = sendmsg(nas_sock_fd[0],&nas_msg_tx,0);
@@ -154,7 +150,7 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) {
AssertFatal(ret >= 0,"[PDCP_FIFOS] pdcp_fifo_flush_sdus (errno: %d %s), nas_sock_fd[0]: %d\n", errno, strerror(errno), nas_sock_fd[0]);
if( LOG_DEBUGFLAG(DEBUG_PDCP) )
- log_dump(PDCP, pdcpData, min(sizeToWrite,30) , LOG_DUMP_CHAR,
+ log_dump(PDCP, pdcpData, min(pdcpHead->data_size,30) , LOG_DUMP_CHAR,
"Printing first bytes of PDCP SDU before removing it from the list: \n");
delNotifiedFIFO_elt (sdu_p);
pdcp_nb_sdu_sent ++;
@@ -377,7 +373,6 @@ int pdcp_fifo_read_input_sdus_fromnetlinksock (const protocol_ctxt_t *const ctx
protocol_ctxt_t ctxt;
hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE;
hashtable_rc_t h_rc;
- module_id_t ue_id = 0;
pdcp_t *pdcp_p = NULL;
static unsigned char pdcp_read_state_g =0;
rb_id_t rab_id = 0;
@@ -471,30 +466,7 @@ int pdcp_fifo_read_input_sdus_fromnetlinksock (const protocol_ctxt_t *const ctx
} else { // rb_id =0, thus interpreated as broadcast and transported as multiple unicast
// is a broadcast packet, we have to send this packet on all default RABS of all connected UEs
//#warning CODE TO BE REVIEWED, ONLY WORK FOR SIMPLE TOPOLOGY CASES
- for (ue_id = 0; ue_id < NB_UE_INST; ue_id++) {
- if (oai_emulation.info.eNB_ue_module_id_to_rnti[ctxt_cpy.module_id][ue_id] != NOT_A_RNTI) {
- ctxt.rnti = oai_emulation.info.eNB_ue_module_id_to_rnti[ctxt_cpy.module_id][ue_id];
- LOG_D(PDCP, "[FRAME %5u][eNB][IP][INSTANCE %u][RB %ld][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %u][UE %u][RB DEFAULT_RAB_ID %u]\n",
- ctxt.frame,
- pdcp_read_header_g.inst,
- pdcp_read_header_g.rb_id,
- pdcp_read_header_g.data_size,
- ctxt.module_id,
- ctxt.rnti,
- DEFAULT_RAB_ID);
- pdcp_data_req (
- &ctxt,
- SRB_FLAG_NO,
- DEFAULT_RAB_ID,
- RLC_MUI_UNDEFINED,
- RLC_SDU_CONFIRM_NO,
- pdcp_read_header_g.data_size,
- (unsigned char *)NLMSG_DATA(nas_nlh_rx),
- PDCP_TRANSMISSION_MODE_DATA
- ,NULL, NULL
- );
- }
- }
+ // never finished code, dropped
}
} else { // ctxt.enb_flag => UE
if (NFAPI_MODE == NFAPI_UE_STUB_PNF) {
diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_common.c b/openair2/LAYER2/PROTO_AGENT/proto_agent_common.c
index 74ae8bab4d..36500c3d16 100644
--- a/openair2/LAYER2/PROTO_AGENT/proto_agent_common.c
+++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_common.c
@@ -319,13 +319,15 @@ error:
}
int proto_agent_get_ack_result(mod_id_t mod_id, const void *params, Protocol__FlexsplitMessage **msg) {
+/* code useless in this status: return 0 anyways
rlc_op_status_t result = 0;
- //printf("PROTO_AGENT: handling the data_req_ack message\n");
+ printf("PROTO_AGENT: handling the data_req_ack message\n");
Protocol__FlexsplitMessage *input = (Protocol__FlexsplitMessage *)params;
Protocol__FspRlcDataReqAck *data_ack = input->data_req_ack;
result = data_ack->result;
- //printf("PROTO_AGENT: ACK RESULT IS %u\n", result);
+ printf("PROTO_AGENT: ACK RESULT IS %u\n", result);
ack_result = result;
+*/
return 0;
}
diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_common.h b/openair2/LAYER2/PROTO_AGENT/proto_agent_common.h
index c805b81543..8f553e05e1 100644
--- a/openair2/LAYER2/PROTO_AGENT/proto_agent_common.h
+++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_common.h
@@ -62,7 +62,6 @@ typedef int (*proto_agent_message_destruction_callback)(
);
-uint32_t ack_result;
/**********************************
* progRAN protocol messages helper
diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.c b/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.c
index 9a63427ed5..925c11c8f8 100644
--- a/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.c
+++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.c
@@ -30,7 +30,7 @@
#include "common/utils/LOG/log.h"
proto_agent_channel_t *proto_channel[NUMBER_OF_eNB_MAX][ENB_AGENT_MAX];
-proto_agent_channel_instance_t channel_instance;
+static proto_agent_channel_instance_t channel_instance;
int proto_agent_channel_id = 0;
int proto_agent_register_channel(mod_id_t mod_id, proto_agent_channel_t *channel, proto_agent_id_t agent_id) {
diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c
index fda84879be..cf77f9ec37 100644
--- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c
+++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c
@@ -80,6 +80,8 @@ static int g_send_id_read_index[2];
static struct mac_data_ind g_tx_delayed_indications[MAX_TIME_DELAYED_PDU_DUE_TO_HARQ];
static struct mac_data_ind g_rx_delayed_indications[MAX_TIME_DELAYED_PDU_DUE_TO_HARQ];
+static rlc_um_entity_t um_tx;
+static rlc_um_entity_t um_rx;
static int8_t *g_sdus[] = {"En dépit de son volontarisme affiché, le premier ministre est de plus en plus décrié pour son incompétence. La tension politique et dans l'opinion publique est encore montée d'un cran au Japon, sur fond d'inquiétantes nouvelles, avec du plutonium détecté dans le sol autour de la centrale de Fukushima. Le premier ministre Naoto Kan a solennellement déclaré que son gouvernement était «en état d'alerte maximum». Tout en reconnaissant que la situation restait «imprévisible». Ce volontarisme affiché par le premier ministre - que Nicolas Sarkozy rencontrera demain lors d'une visite au Japon - ne l'a pas empêché d'être la cible de violentes critiques de la part de parlementaires sur sa gestion de la crise. Attaqué sur le manque de transparence, il a assuré qu'il rendait publiques toutes les informations en sa possession. Un député de l'opposition, Yosuke Isozaki, a aussi reproché à Naoto Kan de ne pas avoir ordonné l'évacuation des populations dans la zone comprise entre 20 et 30 km autour de la centrale. «Peut-il y avoir quelque chose de plus irresponsable que cela ?», a-t-il lancé. Pour l'heure, la zone d'évacuation est limitée à un rayon de 20 km, seul le confinement étant recommandé pour les 10 km suivants. Sur ce sujet, les autorités japonaises ont été fragilisées mardi par les déclarations de Greenpeace, affirmant que ses experts avaient détecté une radioactivité dangereuse à 40 km de la centrale. L'organisation écologiste a appelé à une extension de la zone d'évacuation, exhortant Tokyo à «cesser de privilégier la politique aux dépens de la science». L'Agence japonaise de sûreté nucléaire a balayé ces critiques.",
diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h
index 6da464aa28..bfde1b31f3 100644
--- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h
+++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h
@@ -21,8 +21,6 @@
# ifndef __RLC_UM_TEST_H__
# define __RLC_UM_TEST_H__
-rlc_um_entity_t um_tx;
-rlc_um_entity_t um_rx;
void rlc_um_v9_3_0_test_windows_5(void);
void rlc_um_v9_3_0_test_windows_10(void);
diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c
index 98c8c3e252..b9dcf0414b 100644
--- a/openair2/LAYER2/RLC/rlc.c
+++ b/openair2/LAYER2/RLC/rlc.c
@@ -36,6 +36,7 @@
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "targets/COMMON/openairinterface5g_limits.h"
#include "assertions.h"
+#include
#include "common/ran_context.h"
extern RAN_CONTEXT_t RC;
@@ -51,7 +52,27 @@ extern boolean_t pdcp_data_ind(
#define DEBUG_RLC_PDCP_INTERFACE 1
//#define TRACE_RLC_PAYLOAD 1
#define DEBUG_RLC_DATA_REQ 1
+void (*rlc_rrc_data_conf)(
+ const protocol_ctxt_t *const ctxtP,
+ const rb_id_t rb_idP,
+ const mui_t muiP,
+ const rlc_tx_status_t statusP) __attribute__ ((aligned(32)));
+void (*rlc_rrc_data_ind)(
+ const protocol_ctxt_t *const ctxtP,
+ const rb_id_t rb_idP,
+ const sdu_size_t sdu_sizeP,
+ const uint8_t *const sduP) __attribute__ ((aligned(32)));
+
+logical_chan_id_t rlc_mbms_rbid2lcid_ue [MAX_MOBILES_PER_ENB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */
+logical_chan_id_t rlc_mbms_rbid2lcid_eNB[MAX_eNB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */
+rlc_mbms_id_t rlc_mbms_lcid2service_session_id_ue[MAX_MOBILES_PER_ENB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h
+rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h
+hash_table_t *rlc_coll_p __attribute__ ((aligned(32)));
+
+
+logical_chan_id_t rlc_mbms_rbid2lcid_ue [MAX_MOBILES_PER_ENB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */
+logical_chan_id_t rlc_mbms_rbid2lcid_eNB[MAX_eNB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */
//-----------------------------------------------------------------------------
void rlc_util_print_hex_octets(comp_name_t componentP, unsigned char *dataP, const signed long sizeP)
//-----------------------------------------------------------------------------
diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h
index a83193ac8b..1e5b7947d7 100644
--- a/openair2/LAYER2/RLC/rlc.h
+++ b/openair2/LAYER2/RLC/rlc.h
@@ -133,13 +133,13 @@ typedef struct {
#define RLC_MAX_MBMS_LC (LTE_maxSessionPerPMCH * LTE_maxServiceCount)
#define RLC_MAX_LC ((max_val_LTE_DRB_Identity+1)* MAX_MOBILES_PER_ENB)
-void (*rlc_rrc_data_ind)(
+extern void (*rlc_rrc_data_ind)(
const protocol_ctxt_t *const ctxtP,
const rb_id_t rb_idP,
const sdu_size_t sdu_sizeP,
const uint8_t *const sduP) __attribute__ ((aligned(32)));
-void (*rlc_rrc_data_conf)(
+extern void (*rlc_rrc_data_conf)(
const protocol_ctxt_t *const ctxtP,
const rb_id_t rb_idP,
const mui_t muiP,
@@ -184,8 +184,8 @@ typedef struct rlc_mbms_id_s {
//rlc_mbms_t rlc_mbms_array_ue[MAX_MOBILES_PER_ENB][maxServiceCount][maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h
//rlc_mbms_t rlc_mbms_array_eNB[NUMBER_OF_eNB_MAX][maxServiceCount][maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h
-rlc_mbms_id_t rlc_mbms_lcid2service_session_id_ue[MAX_MOBILES_PER_ENB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h
-rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h
+extern rlc_mbms_id_t rlc_mbms_lcid2service_session_id_ue[MAX_MOBILES_PER_ENB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h
+extern rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h
#define rlc_mbms_enb_get_lcid_by_rb_id(Enb_mOD,rB_iD) rlc_mbms_rbid2lcid_eNB[Enb_mOD][rB_iD]
;
@@ -201,8 +201,8 @@ rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_
rlc_mbms_rbid2lcid_ue[uE_mOD][rB_iD] = lOG_cH_iD; \
} while (0);
-logical_chan_id_t rlc_mbms_rbid2lcid_ue [MAX_MOBILES_PER_ENB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */
-logical_chan_id_t rlc_mbms_rbid2lcid_eNB[MAX_eNB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */
+extern logical_chan_id_t rlc_mbms_rbid2lcid_ue [MAX_MOBILES_PER_ENB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */
+extern logical_chan_id_t rlc_mbms_rbid2lcid_eNB[MAX_eNB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */
#define RLC_COLL_KEY_VALUE(eNB_iD, rNTI, iS_eNB, rB_iD, iS_sRB) \
@@ -250,7 +250,7 @@ logical_chan_id_t rlc_mbms_rbid2lcid_eNB[MAX_eNB][NB_RB_MBMS_MAX];
(((hash_key_t)(sESSION_ID)) << 37) | \
(((hash_key_t)(0x0000000000000001)) << 63))
-hash_table_t *rlc_coll_p __attribute__ ((aligned(32)));
+extern hash_table_t *rlc_coll_p __attribute__ ((aligned(32)));
/*! \fn tbs_size_t mac_rlc_serialize_tb (char* bufferP, list_t transport_blocksP)
* \brief Serialize a list of transport blocks coming from RLC in order to be processed by MAC.
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c
index d6b0980753..6898d4ff71 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c
@@ -65,8 +65,9 @@ static void nr_pdcp_entity_recv_pdu(nr_pdcp_entity_t *entity,
buffer[2];
header_size = 3;
}
-
- if (entity->has_integrity) {
+ /* SRBs always have MAC-I, even if integrity is not active */
+ if (entity->has_integrity
+ || entity->type == NR_PDCP_SRB) {
integrity_size = 4;
} else {
integrity_size = 0;
@@ -100,9 +101,8 @@ static void nr_pdcp_entity_recv_pdu(nr_pdcp_entity_t *entity,
entity->integrity(entity->integrity_context, integrity,
buffer, size - integrity_size,
entity->rb_id, rcvd_count, entity->is_gnb ? 0 : 1);
- if (memcmp(integrity, buffer, 4) != 0) {
+ if (memcmp(integrity, buffer + size - integrity_size, 4) != 0) {
LOG_E(PDCP, "discard NR PDU, integrity failed\n");
- return;
}
}
@@ -181,7 +181,9 @@ static void nr_pdcp_entity_recv_sdu(nr_pdcp_entity_t *entity,
header_size = 3;
}
- if (entity->has_integrity) {
+ /* SRBs always have MAC-I, even if integrity is not active */
+ if (entity->has_integrity
+ || entity->type == NR_PDCP_SRB) {
integrity_size = 4;
} else {
integrity_size = 0;
@@ -194,6 +196,9 @@ static void nr_pdcp_entity_recv_sdu(nr_pdcp_entity_t *entity,
(unsigned char *)buf + header_size + size,
(unsigned char *)buf, header_size + size,
entity->rb_id, count, entity->is_gnb ? 1 : 0);
+ else if (integrity_size == 4)
+ /* set MAC-I to 0 for SRBs with integrity not active */
+ memset(buf + header_size + size, 0, 4);
if (entity->has_ciphering)
entity->cipher(entity->security_context,
@@ -206,12 +211,61 @@ static void nr_pdcp_entity_recv_sdu(nr_pdcp_entity_t *entity,
header_size + size + integrity_size, sdu_id);
}
-static void nr_pdcp_entity_set_integrity_key(nr_pdcp_entity_t *entity,
- char *key)
+/* may be called several times, take care to clean previous settings */
+static void nr_pdcp_entity_set_security(nr_pdcp_entity_t *entity,
+ int integrity_algorithm,
+ char *integrity_key,
+ int ciphering_algorithm,
+ char *ciphering_key)
{
- LOG_E(PDCP, "%s: %d: %s: TODO? to remove?\n", __FILE__, __LINE__, __FUNCTION__);
- exit(1);
- //memcpy(entity->integrity_key, key, 16);
+ if (integrity_algorithm != -1)
+ entity->integrity_algorithm = integrity_algorithm;
+ if (ciphering_algorithm != -1)
+ entity->ciphering_algorithm = ciphering_algorithm;
+ if (integrity_key != NULL)
+ memcpy(entity->integrity_key, integrity_key, 16);
+ if (ciphering_key != NULL)
+ memcpy(entity->ciphering_key, ciphering_key, 16);
+
+ if (integrity_algorithm == 0) {
+ entity->has_integrity = 0;
+ if (entity->free_integrity != NULL)
+ entity->free_integrity(entity->integrity_context);
+ entity->free_integrity = NULL;
+ }
+
+ if (integrity_algorithm != 0 && integrity_algorithm != -1) {
+ if (integrity_algorithm != 2) {
+ LOG_E(PDCP, "FATAL: only nia2 supported for the moment\n");
+ exit(1);
+ }
+ entity->has_integrity = 1;
+ if (entity->free_integrity != NULL)
+ entity->free_integrity(entity->integrity_context);
+ entity->integrity_context = nr_pdcp_integrity_nia2_init(entity->integrity_key);
+ entity->integrity = nr_pdcp_integrity_nia2_integrity;
+ entity->free_integrity = nr_pdcp_integrity_nia2_free_integrity;
+ }
+
+ if (ciphering_algorithm == 0) {
+ entity->has_ciphering = 0;
+ if (entity->free_security != NULL)
+ entity->free_security(entity->security_context);
+ entity->free_security = NULL;
+ }
+
+ if (ciphering_algorithm != 0 && ciphering_algorithm != -1) {
+ if (ciphering_algorithm != 2) {
+ LOG_E(PDCP, "FATAL: only nea2 supported for the moment\n");
+ exit(1);
+ }
+ entity->has_ciphering = 1;
+ if (entity->free_security != NULL)
+ entity->free_security(entity->security_context);
+ entity->security_context = nr_pdcp_security_nea2_init(entity->ciphering_key);
+ entity->cipher = nr_pdcp_security_nea2_cipher;
+ entity->free_security = nr_pdcp_security_nea2_free_security;
+ }
}
static void check_t_reordering(nr_pdcp_entity_t *entity)
@@ -279,7 +333,8 @@ void nr_pdcp_entity_delete(nr_pdcp_entity_t *entity)
nr_pdcp_entity_t *new_nr_pdcp_entity(
nr_pdcp_entity_type_t type,
- int is_gnb, int rb_id,
+ int is_gnb, int rb_id, int pdusession_id,int has_sdap,
+ int has_sdapULheader, int has_sdapDLheader,
void (*deliver_sdu)(void *deliver_sdu_data, struct nr_pdcp_entity_t *entity,
char *buf, int size),
void *deliver_sdu_data,
@@ -304,10 +359,10 @@ nr_pdcp_entity_t *new_nr_pdcp_entity(
ret->type = type;
- ret->recv_pdu = nr_pdcp_entity_recv_pdu;
- ret->recv_sdu = nr_pdcp_entity_recv_sdu;
- ret->set_integrity_key = nr_pdcp_entity_set_integrity_key;
- ret->set_time = nr_pdcp_entity_set_time;
+ ret->recv_pdu = nr_pdcp_entity_recv_pdu;
+ ret->recv_sdu = nr_pdcp_entity_recv_sdu;
+ ret->set_security = nr_pdcp_entity_set_security;
+ ret->set_time = nr_pdcp_entity_set_time;
ret->delete = nr_pdcp_entity_delete;
@@ -318,6 +373,10 @@ nr_pdcp_entity_t *new_nr_pdcp_entity(
ret->deliver_pdu_data = deliver_pdu_data;
ret->rb_id = rb_id;
+ ret->pdusession_id = pdusession_id;
+ ret->has_sdap = has_sdap;
+ ret->has_sdapULheader = has_sdapULheader;
+ ret->has_sdapDLheader = has_sdapDLheader;
ret->sn_size = sn_size;
ret->t_reordering = t_reordering;
ret->discard_timer = discard_timer;
@@ -325,34 +384,11 @@ nr_pdcp_entity_t *new_nr_pdcp_entity(
ret->sn_max = (1 << sn_size) - 1;
ret->window_size = 1 << (sn_size - 1);
- if (ciphering_key != NULL && ciphering_algorithm != 0) {
- if (ciphering_algorithm != 2) {
- LOG_E(PDCP, "FATAL: only nea2 supported for the moment\n");
- exit(1);
- }
- ret->has_ciphering = 1;
- ret->ciphering_algorithm = ciphering_algorithm;
- memcpy(ret->ciphering_key, ciphering_key, 16);
-
- ret->security_context = nr_pdcp_security_nea2_init(ciphering_key);
- ret->cipher = nr_pdcp_security_nea2_cipher;
- ret->free_security = nr_pdcp_security_nea2_free_security;
- }
ret->is_gnb = is_gnb;
- if (integrity_key != NULL && integrity_algorithm != 0) {
- if (integrity_algorithm != 2) {
- LOG_E(PDCP, "FATAL: only nia2 supported for the moment\n");
- exit(1);
- }
- ret->has_integrity = 1;
- ret->integrity_algorithm = integrity_algorithm;
- memcpy(ret->integrity_key, integrity_key, 16);
-
- ret->integrity_context = nr_pdcp_integrity_nia2_init(integrity_key);
- ret->integrity = nr_pdcp_integrity_nia2_integrity;
- ret->free_integrity = nr_pdcp_integrity_nia2_free_integrity;
- }
+ nr_pdcp_entity_set_security(ret,
+ integrity_algorithm, (char *)integrity_key,
+ ciphering_algorithm, (char *)ciphering_key);
return ret;
}
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h
index 4ae7a45abb..5bdc6f7892 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h
@@ -40,7 +40,16 @@ typedef struct nr_pdcp_entity_t {
void (*recv_sdu)(struct nr_pdcp_entity_t *entity, char *buffer, int size,
int sdu_id);
void (*delete)(struct nr_pdcp_entity_t *entity);
- void (*set_integrity_key)(struct nr_pdcp_entity_t *entity, char *key);
+ /* set_security: pass -1 to integrity_algorithm / ciphering_algorithm
+ * to keep the current algorithm
+ * pass NULL to integrity_key / ciphering_key
+ * to keep the current key
+ */
+ void (*set_security)(struct nr_pdcp_entity_t *entity,
+ int integrity_algorithm,
+ char *integrity_key,
+ int ciphering_algorithm,
+ char *ciphering_key);
void (*set_time)(struct nr_pdcp_entity_t *entity, uint64_t now);
/* callbacks provided to the PDCP module */
@@ -53,7 +62,10 @@ typedef struct nr_pdcp_entity_t {
/* configuration variables */
int rb_id;
-
+ int pdusession_id;
+ int has_sdap;
+ int has_sdapULheader;
+ int has_sdapDLheader;
int sn_size; /* SN size, in bits */
int t_reordering; /* unit: ms */
int discard_timer; /* unit: ms */
@@ -104,7 +116,8 @@ typedef struct nr_pdcp_entity_t {
nr_pdcp_entity_t *new_nr_pdcp_entity(
nr_pdcp_entity_type_t type,
- int is_gnb, int rb_id,
+ int is_gnb, int rb_id, int pdusession_id,int has_sdap,
+ int has_sdapULheader,int has_sdapDLheader,
void (*deliver_sdu)(void *deliver_sdu_data, struct nr_pdcp_entity_t *entity,
char *buf, int size),
void *deliver_sdu_data,
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
index 5553662ac5..86f0558611 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
@@ -45,7 +45,7 @@ static void compute_t(unsigned char *t, uint32_t count, int bearer,
t[1] = (count >> 16) & 255;
t[2] = (count >> 8) & 255;
t[3] = (count ) & 255;
- t[4] = (bearer << 3) | (direction << 2);
+ t[4] = ((bearer-1) << 3) | (direction << 2);
memset(&t[5], 0, 8-5);
}
@@ -63,6 +63,7 @@ void nr_pdcp_integrity_nia2_integrity(void *integrity_context,
* (which is identical to 128-NIA2, see 33.501 D.3.1.3) */
compute_t(t, count, bearer, direction);
+ CMAC_Init(ctx, NULL, 0, NULL, NULL);
CMAC_Update(ctx, t, 8);
CMAC_Update(ctx, buffer, length);
CMAC_Final(ctx, mac, &maclen);
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index 5a1009841c..121652062a 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -35,6 +35,7 @@
/* from OAI */
#include "pdcp.h"
#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
+#include
#define TODO do { \
printf("%s:%d:%s: todo\n", __FILE__, __LINE__, __FUNCTION__); \
@@ -477,22 +478,25 @@ static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
exit(1);
rb_found:
- gtpu_buffer_p = itti_malloc(TASK_PDCP_ENB, TASK_GTPV1_U,
- size + GTPU_HEADER_OVERHEAD_MAX);
- AssertFatal(gtpu_buffer_p != NULL, "OUT OF MEMORY");
- memcpy(>pu_buffer_p[GTPU_HEADER_OVERHEAD_MAX], buf, size);
- message_p = itti_alloc_new_message(TASK_PDCP_ENB, 0, GTPV1U_ENB_TUNNEL_DATA_REQ);
- AssertFatal(message_p != NULL, "OUT OF MEMORY");
- GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).buffer = gtpu_buffer_p;
- GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).length = size;
- GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).offset = GTPU_HEADER_OVERHEAD_MAX;
- GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rnti = ue->rnti;
- GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rab_id = rb_id + 4;
- LOG_D(PDCP, "%s() (drb %d) sending message to gtp size %d\n", __func__, rb_id, size);
- //for (i = 0; i < size; i++) printf(" %2.2x", (unsigned char)buf[i]);
- //printf("\n");
- itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p);
+ {
+ int offset=0;
+ if (entity->has_sdap == 1 && entity->has_sdapULheader == 1) offset = 1; // this is the offset of the SDAP header in bytes
+ gtpu_buffer_p = itti_malloc(TASK_PDCP_ENB, TASK_GTPV1_U,
+ size + GTPU_HEADER_OVERHEAD_MAX - offset);
+ AssertFatal(gtpu_buffer_p != NULL, "OUT OF MEMORY");
+ memcpy(>pu_buffer_p[GTPU_HEADER_OVERHEAD_MAX], buf+offset, size-offset);
+ message_p = itti_alloc_new_message(TASK_PDCP_ENB, 0, GTPV1U_GNB_TUNNEL_DATA_REQ);
+ AssertFatal(message_p != NULL, "OUT OF MEMORY");
+ GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).buffer = gtpu_buffer_p;
+ GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).length = size-offset;
+ GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).offset = GTPU_HEADER_OVERHEAD_MAX;
+ GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).rnti = ue->rnti;
+ GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).pdusession_id = entity->pdusession_id;
+ if (offset==1) LOG_I(PDCP, "%s() (drb %d) SDAP header %2x\n",__func__, rb_id, buf[0]);
+ LOG_D(PDCP, "%s() (drb %d) sending message to gtp size %d\n", __func__, rb_id, size-offset);
+ itti_send_msg_to_task(TASK_VARIABLE, INSTANCE_DEFAULT, message_p);
+ }
}
}
@@ -531,7 +535,7 @@ rb_found:
memblock = get_free_mem_block(size, __FUNCTION__);
memcpy(memblock->data, buf, size);
- LOG_D(PDCP, "%s(): (srb %d) calling rlc_data_req size %d\n", __func__, rb_id, size);
+ LOG_I(PDCP, "%s(): (srb %d) calling rlc_data_req size %d\n", __func__, rb_id, size);
//for (i = 0; i < size; i++) printf(" %2.2x", (unsigned char)memblock->data[i]);
//printf("\n");
enqueue_rlc_data_req(&ctxt, 0, MBMS_FLAG_NO, rb_id, sdu_id, 0, size, memblock, NULL, NULL);
@@ -696,7 +700,17 @@ void pdcp_run(const protocol_ctxt_t *const ctxt_pP)
{
MessageDef *msg_p;
int result;
- protocol_ctxt_t ctxt;
+ protocol_ctxt_t ctxt={.module_id=0,
+ .enb_flag=1,
+ .instance=0,
+ .rnti=0,
+ .frame=-1,
+ .subframe=-1,
+ .eNB_index=0,
+ .configured=true,
+ .brOption=false
+ };
+
while (1) {
itti_poll_msg(ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, &msg_p);
@@ -753,7 +767,8 @@ static void add_srb(int is_gnb, int rnti, struct NR_SRB_ToAddMod *s)
LOG_D(PDCP, "%s:%d:%s: warning SRB %d already exist for ue %d, do nothing\n",
__FILE__, __LINE__, __FUNCTION__, srb_id, rnti);
} else {
- pdcp_srb = new_nr_pdcp_entity(NR_PDCP_SRB, is_gnb, srb_id,
+ pdcp_srb = new_nr_pdcp_entity(NR_PDCP_SRB, is_gnb, srb_id,
+ 0, 0, 0, 0, // sdap parameters
deliver_sdu_srb, ue, deliver_pdu_srb, ue,
12, t_Reordering, -1,
0, 0,
@@ -779,7 +794,31 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s,
int sn_size_ul = decode_sn_size_ul(*s->pdcp_Config->drb->pdcp_SN_SizeUL);
int sn_size_dl = decode_sn_size_dl(*s->pdcp_Config->drb->pdcp_SN_SizeDL);
int discard_timer = decode_discard_timer(*s->pdcp_Config->drb->discardTimer);
-
+ if ((!s->cnAssociation) || s->cnAssociation->present == NR_DRB_ToAddMod__cnAssociation_PR_NOTHING) {
+ LOG_E(PDCP,"%s:%d:%s: fatal, cnAssociation is missing or present is NR_DRB_ToAddMod__cnAssociation_PR_NOTHING\n",__FILE__,__LINE__,__FUNCTION__);
+ exit(-1);
+ }
+
+ int pdusession_id;
+ int has_sdap = 0;
+ int has_sdapULheader=0;
+ int has_sdapDLheader=0;
+ if (s->cnAssociation->present == NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
+ pdusession_id = s->cnAssociation->choice.eps_BearerIdentity;
+ else {
+ if (!s->cnAssociation->choice.sdap_Config) {
+ LOG_E(PDCP,"%s:%d:%s: fatal, sdap_Config is null",__FILE__,__LINE__,__FUNCTION__);
+ exit(-1);
+ }
+ pdusession_id = s->cnAssociation->choice.sdap_Config->pdu_Session;
+ has_sdap = 1;
+ has_sdapULheader = s->cnAssociation->choice.sdap_Config->sdap_HeaderUL == NR_SDAP_Config__sdap_HeaderUL_present ? 1 : 0;
+ has_sdapDLheader = s->cnAssociation->choice.sdap_Config->sdap_HeaderDL == NR_SDAP_Config__sdap_HeaderDL_present ? 1 : 0;
+ if (has_sdapDLheader==1) {
+ LOG_E(PDCP,"%s:%d:%s: fatal, no support for SDAP DL yet\n",__FILE__,__LINE__,__FUNCTION__);
+ exit(-1);
+ }
+ }
/* TODO(?): accept different UL and DL SN sizes? */
if (sn_size_ul != sn_size_dl) {
LOG_E(PDCP, "%s:%d:%s: fatal, bad SN sizes, must be same. ul=%d, dl=%d\n",
@@ -799,7 +838,8 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s,
LOG_D(PDCP, "%s:%d:%s: warning DRB %d already exist for ue %d, do nothing\n",
__FILE__, __LINE__, __FUNCTION__, drb_id, rnti);
} else {
- pdcp_drb = new_nr_pdcp_entity(NR_PDCP_SRB, is_gnb, drb_id,
+ pdcp_drb = new_nr_pdcp_entity(NR_PDCP_DRB_AM, is_gnb, drb_id,pdusession_id,has_sdap,
+ has_sdapULheader,has_sdapDLheader,
deliver_sdu_drb, ue, deliver_pdu_drb, ue,
sn_size_dl, t_reordering, discard_timer,
ciphering_algorithm, integrity_algorithm,
@@ -1043,35 +1083,38 @@ void pdcp_config_set_security(
uint8_t *const kRRCint_pP,
uint8_t *const kUPenc_pP)
{
- DevAssert(pdcp_pP != NULL);
+ nr_pdcp_ue_t *ue;
+ nr_pdcp_entity_t *rb;
+ int rnti = ctxt_pP->rnti;
+ int integrity_algorithm;
+ int ciphering_algorithm;
- if ((security_modeP >= 0) && (security_modeP <= 0x77)) {
- pdcp_pP->cipheringAlgorithm = security_modeP & 0x0f;
- pdcp_pP->integrityProtAlgorithm = (security_modeP>>4) & 0xf;
- LOG_D(PDCP, PROTOCOL_PDCP_CTXT_FMT" CONFIG_ACTION_SET_SECURITY_MODE: cipheringAlgorithm %d integrityProtAlgorithm %d\n",
- PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_pP),
- pdcp_pP->cipheringAlgorithm,
- pdcp_pP->integrityProtAlgorithm);
- pdcp_pP->kRRCenc = kRRCenc_pP;
- pdcp_pP->kRRCint = kRRCint_pP;
- pdcp_pP->kUPenc = kUPenc_pP;
- /* Activate security */
- pdcp_pP->security_activated = 1;
- MSC_LOG_EVENT(
- (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_PDCP_ENB:MSC_PDCP_UE,
- "0 Set security ciph %X integ %x UE %"PRIx16" ",
- pdcp_pP->cipheringAlgorithm,
- pdcp_pP->integrityProtAlgorithm,
- ctxt_pP->rnti);
+ nr_pdcp_manager_lock(nr_pdcp_ue_manager);
+
+ ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rnti);
+
+ /* TODO: proper handling of DRBs, for the moment only SRBs are handled */
+
+ if (rb_id >= 1 && rb_id <= 3) {
+ rb = ue->srb[rb_id - 1];
+
+ if (rb == NULL) {
+ LOG_E(PDCP, "%s:%d:%s: no SRB found (rnti %d, rb_id %ld)\n",
+ __FILE__, __LINE__, __FUNCTION__, rnti, rb_id);
+ nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
+ return;
+ }
+
+ integrity_algorithm = (security_modeP>>4) & 0xf;
+ ciphering_algorithm = security_modeP & 0x0f;
+ rb->set_security(rb, integrity_algorithm, (char *)kRRCint_pP,
+ ciphering_algorithm, (char *)kRRCenc_pP);
} else {
- MSC_LOG_EVENT(
- (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_PDCP_ENB:MSC_PDCP_UE,
- "0 Set security failed UE %"PRIx16" ",
- ctxt_pP->rnti);
- LOG_E(PDCP,PROTOCOL_PDCP_CTXT_FMT" bad security mode %d",
- PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_pP),
- security_modeP);
+ LOG_E(PDCP, "%s:%d:%s: TODO\n", __FILE__, __LINE__, __FUNCTION__);
+ exit(1);
}
+
+ nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
}
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index a67c3f460c..9373b03668 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -47,8 +47,8 @@ extern RAN_CONTEXT_t RC;
#include
+#include
static nr_rlc_ue_manager_t *nr_rlc_ue_manager;
-uint8_t ccch_flag = 1;
/* TODO: handle time a bit more properly */
static uint64_t nr_rlc_current_time;
@@ -337,7 +337,6 @@ rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind(
return ret;
}
-int oai_emulation;
rlc_op_status_t rlc_data_req (const protocol_ctxt_t *const ctxt_pP,
const srb_flag_t srb_flagP,
@@ -449,7 +448,7 @@ static void deliver_sdu(void *_ue, nr_rlc_entity_t *entity, char *buf, int size)
exit(1);
rb_found:
- LOG_D(RLC, "%s:%d:%s: delivering SDU (rnti %d is_srb %d rb_id %d) size %d",
+ LOG_I(RLC, "%s:%d:%s: delivering SDU (rnti %d is_srb %d rb_id %d) size %d\n",
__FILE__, __LINE__, __FUNCTION__, ue->rnti, is_srb, rb_id, size);
memblock = get_free_mem_block(size, __func__);
@@ -491,23 +490,6 @@ rb_found:
if (NODE_IS_DU(type) && is_srb == 1) {
MessageDef *msg;
- if (ccch_flag) {
- /* for rfsim, because UE send RRCSetupRequest in SRB1 */
- LOG_I(RLC, "[MSG] RRC Setup Request\n");
- msg = itti_alloc_new_message(TASK_RLC_ENB, 0, F1AP_INITIAL_UL_RRC_MESSAGE);
- F1AP_INITIAL_UL_RRC_MESSAGE(msg).gNB_DU_ue_id = 0;
- F1AP_INITIAL_UL_RRC_MESSAGE(msg).mcc = RC.nrrrc[0]->configuration.mcc[0];
- F1AP_INITIAL_UL_RRC_MESSAGE(msg).mnc = RC.nrrrc[0]->configuration.mnc[0];
- F1AP_INITIAL_UL_RRC_MESSAGE(msg).mnc_digit_length = RC.nrrrc[0]->configuration.mnc_digit_length[0];
- F1AP_INITIAL_UL_RRC_MESSAGE(msg).nr_cellid = RC.nrrrc[0]->nr_cellid;
- F1AP_INITIAL_UL_RRC_MESSAGE(msg).crnti = ue->rnti;
- F1AP_INITIAL_UL_RRC_MESSAGE(msg).rrc_container = (unsigned char *)buf;
- F1AP_INITIAL_UL_RRC_MESSAGE(msg).rrc_container_length = size;
- itti_send_msg_to_task(TASK_DU_F1, ENB_MODULE_ID_TO_INSTANCE(0), msg);
- ccch_flag = 0;
- return;
- }
-
msg = itti_alloc_new_message(TASK_RLC_ENB, 0, F1AP_UL_RRC_MESSAGE);
F1AP_UL_RRC_MESSAGE(msg).rnti = ue->rnti;
F1AP_UL_RRC_MESSAGE(msg).srb_id = rb_id;
@@ -658,6 +640,7 @@ static void add_rlc_srb(int rnti, struct NR_SRB_ToAddMod *s, NR_RLC_BearerConfig
int t_reassembly;
int sn_field_length;
+ LOG_I(RLC,"Trying to add SRB %d\n",srb_id);
if (srb_id != 1 && srb_id != 2) {
LOG_E(RLC, "%s:%d:%s: fatal, bad srb id %d\n",
__FILE__, __LINE__, __FUNCTION__, srb_id);
@@ -765,7 +748,7 @@ static void add_drb_am(int rnti, struct NR_DRB_ToAddMod *s, NR_RLC_BearerConfig_
/* TODO: accept other values? */
if (logical_channel_group != 1) {
LOG_E(RLC, "%s:%d:%s: fatal error\n", __FILE__, __LINE__, __FUNCTION__);
- exit(1);
+ //exit(1);
}
switch (r->present) {
diff --git a/openair2/LAYER2/rlc_v2/rlc_oai_api.c b/openair2/LAYER2/rlc_v2/rlc_oai_api.c
index 2e133c7126..9f04cdce50 100644
--- a/openair2/LAYER2/rlc_v2/rlc_oai_api.c
+++ b/openair2/LAYER2/rlc_v2/rlc_oai_api.c
@@ -265,7 +265,6 @@ rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind(
return ret;
}
-int oai_emulation;
rlc_op_status_t rlc_data_req (const protocol_ctxt_t *const ctxt_pP,
const srb_flag_t srb_flagP,
diff --git a/openair2/NETWORK_DRIVER/UE_IP/netlink.c b/openair2/NETWORK_DRIVER/UE_IP/netlink.c
index 658ae19aba..b3829c51d1 100644
--- a/openair2/NETWORK_DRIVER/UE_IP/netlink.c
+++ b/openair2/NETWORK_DRIVER/UE_IP/netlink.c
@@ -39,6 +39,7 @@
#include "local.h"
#include "proto_extern.h"
+MODULE_LICENSE("OAI");
#define OAI_IP_DRIVER_NETLINK_ID 31
#define NL_DEST_PID 1
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
index 8572441241..321e1d638f 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
@@ -41,8 +41,8 @@
#define MAX_IF_MODULES 100
//#define UL_HARQ_PRINT
-NR_IF_Module_t *if_inst[MAX_IF_MODULES];
-NR_Sched_Rsp_t Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs];
+static NR_IF_Module_t *nr_if_inst[MAX_IF_MODULES];
+static NR_Sched_Rsp_t NR_Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs];
extern int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind);
extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind);
extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind);
@@ -179,8 +179,8 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
#endif
module_id_t module_id = UL_info->module_id;
int CC_id = UL_info->CC_id;
- NR_Sched_Rsp_t *sched_info = &Sched_INFO[module_id][CC_id];
- NR_IF_Module_t *ifi = if_inst[module_id];
+ NR_Sched_Rsp_t *sched_info = &NR_Sched_INFO[module_id][CC_id];
+ NR_IF_Module_t *ifi = nr_if_inst[module_id];
gNB_MAC_INST *mac = RC.nrmac[module_id];
LOG_D(PHY,"SFN/SF:%d%d module_id:%d CC_id:%d UL_info[rach_pdus:%d rx_ind:%d crcs:%d]\n",
UL_info->frame,UL_info->slot,
@@ -254,17 +254,17 @@ NR_IF_Module_t *NR_IF_Module_init(int Mod_id) {
AssertFatal(Mod_id %d\n",Mod_id,MAX_IF_MODULES);
LOG_I(PHY,"Installing callbacks for IF_Module - UL_indication\n");
- if (if_inst[Mod_id]==NULL) {
- if_inst[Mod_id] = (NR_IF_Module_t*)malloc(sizeof(NR_IF_Module_t));
- memset((void*)if_inst[Mod_id],0,sizeof(NR_IF_Module_t));
+ if (nr_if_inst[Mod_id]==NULL) {
+ nr_if_inst[Mod_id] = (NR_IF_Module_t*)malloc(sizeof(NR_IF_Module_t));
+ memset((void*)nr_if_inst[Mod_id],0,sizeof(NR_IF_Module_t));
- LOG_I(MAC,"Allocating shared L1/L2 interface structure for instance %d @ %p\n",Mod_id,if_inst[Mod_id]);
+ LOG_I(MAC,"Allocating shared L1/L2 interface structure for instance %d @ %p\n",Mod_id,nr_if_inst[Mod_id]);
- if_inst[Mod_id]->CC_mask=0;
- if_inst[Mod_id]->NR_UL_indication = NR_UL_indication;
- AssertFatal(pthread_mutex_init(&if_inst[Mod_id]->if_mutex,NULL)==0,
- "allocation of if_inst[%d]->if_mutex fails\n",Mod_id);
+ nr_if_inst[Mod_id]->CC_mask=0;
+ nr_if_inst[Mod_id]->NR_UL_indication = NR_UL_indication;
+ AssertFatal(pthread_mutex_init(&nr_if_inst[Mod_id]->if_mutex,NULL)==0,
+ "allocation of nr_if_inst[%d]->if_mutex fails\n",Mod_id);
}
- return if_inst[Mod_id];
+ return nr_if_inst[Mod_id];
}
diff --git a/openair2/PHY_INTERFACE/IF_Module.c b/openair2/PHY_INTERFACE/IF_Module.c
index d98c603d78..38a742bf74 100644
--- a/openair2/PHY_INTERFACE/IF_Module.c
+++ b/openair2/PHY_INTERFACE/IF_Module.c
@@ -7,8 +7,8 @@
#include "nfapi/oai_integration/vendor_ext.h"
#define MAX_IF_MODULES 100
-IF_Module_t *if_inst[MAX_IF_MODULES];
-Sched_Rsp_t Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs];
+static IF_Module_t *if_inst[MAX_IF_MODULES];
+static Sched_Rsp_t Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs];
extern int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind);
extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind);
diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.c b/openair2/PHY_INTERFACE/phy_stub_UE.c
index 21740016b1..c212075934 100644
--- a/openair2/PHY_INTERFACE/phy_stub_UE.c
+++ b/openair2/PHY_INTERFACE/phy_stub_UE.c
@@ -54,6 +54,7 @@ extern nfapi_tx_request_pdu_t* tx_request_pdu[1023][10][10];
extern uint16_t sf_ahead;
+static eth_params_t stub_eth_params;
void Msg1_transmitted(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id);
void Msg3_transmitted(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id);
diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.h b/openair2/PHY_INTERFACE/phy_stub_UE.h
index 547fc2dfc4..bdf8872371 100644
--- a/openair2/PHY_INTERFACE/phy_stub_UE.h
+++ b/openair2/PHY_INTERFACE/phy_stub_UE.h
@@ -26,16 +26,7 @@ extern nfapi_tx_request_pdu_t* tx_request_pdu_list;
extern nfapi_dl_config_request_t* dl_config_req;
extern nfapi_ul_config_request_t* ul_config_req;
extern nfapi_hi_dci0_request_t* hi_dci0_req;
-
-int tx_req_num_elems;
-
-//below 2 difinitions move to lte-ue.c to add initialization when difinition.
-//int next_ra_frame;
-//module_id_t next_Mod_id;
-eth_params_t stub_eth_params;
-
-
-
+extern int tx_req_num_elems;
// This function should return all the sched_response config messages which concern a specific UE. Inside this
// function we should somehow make the translation of config message's rnti to Mod_ID.
diff --git a/openair2/RRC/LTE/plmn_data.h b/openair2/RRC/LTE/plmn_data.h
index 97dc94343b..701bcaf764 100644
--- a/openair2/RRC/LTE/plmn_data.h
+++ b/openair2/RRC/LTE/plmn_data.h
@@ -2231,7 +2231,8 @@ static const plmn_data_t plmn_data[] = {
/*
310 900 Mid-Rivers Communications Mid-Rivers Wireless Operational
*/
- {310, 910, "Verizon Wireless", "Verizon USA"}
+ {310, 910, "Verizon Wireless", "Verizon USA"},
+ {0,0,"",""}
/*
310 920 Get Mobile Inactive
310 930 Copper Valley Wireless Inactive
diff --git a/openair2/RRC/LTE/rrc_UE.c b/openair2/RRC/LTE/rrc_UE.c
index c57cec6ba5..e3d28d8a0f 100644
--- a/openair2/RRC/LTE/rrc_UE.c
+++ b/openair2/RRC/LTE/rrc_UE.c
@@ -330,7 +330,7 @@ void init_SL_preconfig(UE_RRC_INST *UE, const uint8_t eNB_index ) {
preconfigpool->data_TF_ResourceConfig_r12.offsetIndicator_r12.choice.small_r12 = 0;
// 40 ms SL Period
preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.present = LTE_SubframeBitmapSL_r12_PR_bs40_r12;
- preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf = CALLOC(1,5);
+ preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf = CALLOC(5,1);
preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.size = 5;
preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.bits_unused = 0;
// last 36 subframes for PSCCH
@@ -338,7 +338,7 @@ void init_SL_preconfig(UE_RRC_INST *UE, const uint8_t eNB_index ) {
preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf[1] = 0xFF;
preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf[2] = 0xFF;
preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf[3] = 0xFF;
- preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf[5] = 0xFF;
+ preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf[4] = 0xFF;
preconfigpool->dataHoppingConfig_r12.hoppingParameter_r12 = 0;
preconfigpool->dataHoppingConfig_r12.numSubbands_r12 = LTE_SL_HoppingConfigComm_r12__numSubbands_r12_ns1;
preconfigpool->dataHoppingConfig_r12.rb_Offset_r12 = 0;
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index 7cffab09a4..881e5b8ad1 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -87,6 +87,7 @@
#include "pdcp.h"
#include "gtpv1u_eNB_task.h"
+#include
#include "intertask_interface.h"
@@ -4968,7 +4969,7 @@ void rrc_eNB_handover_ue_context_release(
ue_context_p->ue_context.enb_gtp_ebi[e_rab] = 0;
}
- itti_send_msg_to_task(TASK_GTPV1_U, ctxt_pP->module_id, msg_delete_tunnels_p);
+ itti_send_msg_to_task(TASK_VARIABLE, ctxt_pP->module_id, msg_delete_tunnels_p);
struct rrc_ue_s1ap_ids_s *rrc_ue_s1ap_ids = NULL;
rrc_ue_s1ap_ids = rrc_eNB_S1AP_get_ue_ids(RC.rrc[ctxt_pP->module_id], 0, eNB_ue_s1ap_id);
@@ -6557,10 +6558,9 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
(int)DRB_configList->list.array[i]->drb_Identity,
(int)*DRB_configList->list.array[i]->logicalChannelIdentity);
/* For pre-ci tests */
- LOG_I(RRC, "[eNB %d] Frame %d : Logical Channel UL-DCCH, Received LTE_RRCConnectionReconfigurationComplete from UE %u, reconfiguring DRB %d/LCID %d\n",
+ LOG_I(RRC, "[eNB %d] Frame %d : Logical Channel UL-DCCH, Received LTE_RRCConnectionReconfigurationComplete, reconfiguring DRB %d/LCID %d\n",
ctxt_pP->module_id,
ctxt_pP->frame,
- oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[ctxt_pP->module_id][ue_context_pP->local_uid],
(int)DRB_configList->list.array[i]->drb_Identity,
(int)*DRB_configList->list.array[i]->logicalChannelIdentity);
@@ -6585,7 +6585,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
"[eNB %d] Config the oai%d to send/receive pkt on DRB %ld to/from the protocol stack\n",
ctxt_pP->module_id, ctxt_pP->module_id,
(long int)((ue_context_pP->local_uid * LTE_maxDRB) + DRB_configList->list.array[i]->drb_Identity));
- ue_module_id = oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[ctxt_pP->module_id][ue_context_pP->local_uid];
+ ue_module_id = 0; // Was oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[ctxt_pP->module_id][ue_context_pP->local_uid];
rb_conf_ipv4(0, //add
ue_module_id, //cx
ctxt_pP->module_id, //inst
diff --git a/openair2/RRC/LTE/rrc_eNB_GTPV1U.c b/openair2/RRC/LTE/rrc_eNB_GTPV1U.c
index e974a28f68..6683d91556 100644
--- a/openair2/RRC/LTE/rrc_eNB_GTPV1U.c
+++ b/openair2/RRC/LTE/rrc_eNB_GTPV1U.c
@@ -40,6 +40,7 @@
# include "common/ran_context.h"
+#include
extern RAN_CONTEXT_t RC;
@@ -92,7 +93,6 @@ rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP(
}
}
-
//------------------------------------------------------------------------------
boolean_t
gtpv_data_req(
@@ -113,64 +113,152 @@ gtpv_data_req(
return FALSE;
}
LOG_D(GTPU,"gtpv_data_req ue rnti %x sdu_sizeP %d rb id %ld", ctxt_pP->rnti, sdu_sizeP, rb_idP);
- {
- MessageDef *message_p;
- // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
- uint8_t *message_buffer;
-
- if(task_id == TASK_DATA_FORWARDING){
-
- LOG_I(GTPU,"gtpv_data_req task_id = TASK_DATA_FORWARDING\n");
-
- message_buffer = itti_malloc (TASK_GTPV1_U, TASK_DATA_FORWARDING, sdu_sizeP);
-
- memcpy (message_buffer, buffer_pP, sdu_sizeP);
-
- message_p = itti_alloc_new_message (TASK_GTPV1_U, 0, GTPV1U_ENB_DATA_FORWARDING_IND);
- GTPV1U_ENB_DATA_FORWARDING_IND (message_p).frame = ctxt_pP->frame;
- GTPV1U_ENB_DATA_FORWARDING_IND (message_p).enb_flag = ctxt_pP->enb_flag;
- GTPV1U_ENB_DATA_FORWARDING_IND (message_p).rb_id = rb_idP;
- GTPV1U_ENB_DATA_FORWARDING_IND (message_p).muip = muiP;
- GTPV1U_ENB_DATA_FORWARDING_IND (message_p).confirmp = confirmP;
- GTPV1U_ENB_DATA_FORWARDING_IND (message_p).sdu_size = sdu_sizeP;
- GTPV1U_ENB_DATA_FORWARDING_IND (message_p).sdu_p = message_buffer;
- GTPV1U_ENB_DATA_FORWARDING_IND (message_p).mode = modeP;
- GTPV1U_ENB_DATA_FORWARDING_IND (message_p).module_id = ctxt_pP->module_id;
- GTPV1U_ENB_DATA_FORWARDING_IND (message_p).rnti = ctxt_pP->rnti;
- GTPV1U_ENB_DATA_FORWARDING_IND (message_p).eNB_index = ctxt_pP->eNB_index;
-
- itti_send_msg_to_task (TASK_DATA_FORWARDING, ctxt_pP->instance, message_p);
- return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
- }else if(task_id == TASK_END_MARKER){
-
- LOG_I(GTPU,"gtpv_data_req task_id = TASK_END_MARKER\n");
-
- message_buffer = itti_malloc (TASK_GTPV1_U, TASK_END_MARKER, sdu_sizeP);
-
- memcpy (message_buffer, buffer_pP, sdu_sizeP);
-
- message_p = itti_alloc_new_message (TASK_GTPV1_U, 0, GTPV1U_ENB_END_MARKER_IND);
- GTPV1U_ENB_END_MARKER_IND (message_p).frame = ctxt_pP->frame;
- GTPV1U_ENB_END_MARKER_IND (message_p).enb_flag = ctxt_pP->enb_flag;
- GTPV1U_ENB_END_MARKER_IND (message_p).rb_id = rb_idP;
- GTPV1U_ENB_END_MARKER_IND (message_p).muip = muiP;
- GTPV1U_ENB_END_MARKER_IND (message_p).confirmp = confirmP;
- GTPV1U_ENB_END_MARKER_IND (message_p).sdu_size = sdu_sizeP;
- GTPV1U_ENB_END_MARKER_IND (message_p).sdu_p = message_buffer;
- GTPV1U_ENB_END_MARKER_IND (message_p).mode = modeP;
- GTPV1U_ENB_END_MARKER_IND (message_p).module_id = ctxt_pP->module_id;
- GTPV1U_ENB_END_MARKER_IND (message_p).rnti = ctxt_pP->rnti;
- GTPV1U_ENB_END_MARKER_IND (message_p).eNB_index = ctxt_pP->eNB_index;
-
- itti_send_msg_to_task (TASK_END_MARKER, ctxt_pP->instance, message_p);
- return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
- }
+ MessageDef *message_p;
+ // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
+ uint8_t *message_buffer;
+
+ if(task_id == TASK_DATA_FORWARDING){
+
+ LOG_I(GTPU,"gtpv_data_req task_id = TASK_DATA_FORWARDING\n");
+
+ message_buffer = itti_malloc (TASK_GTPV1_U, TASK_DATA_FORWARDING, sdu_sizeP);
+
+ memcpy (message_buffer, buffer_pP, sdu_sizeP);
+
+ message_p = itti_alloc_new_message (TASK_GTPV1_U, 0, GTPV1U_ENB_DATA_FORWARDING_IND);
+ GTPV1U_ENB_DATA_FORWARDING_IND (message_p).frame = ctxt_pP->frame;
+ GTPV1U_ENB_DATA_FORWARDING_IND (message_p).enb_flag = ctxt_pP->enb_flag;
+ GTPV1U_ENB_DATA_FORWARDING_IND (message_p).rb_id = rb_idP;
+ GTPV1U_ENB_DATA_FORWARDING_IND (message_p).muip = muiP;
+ GTPV1U_ENB_DATA_FORWARDING_IND (message_p).confirmp = confirmP;
+ GTPV1U_ENB_DATA_FORWARDING_IND (message_p).sdu_size = sdu_sizeP;
+ GTPV1U_ENB_DATA_FORWARDING_IND (message_p).sdu_p = message_buffer;
+ GTPV1U_ENB_DATA_FORWARDING_IND (message_p).mode = modeP;
+ GTPV1U_ENB_DATA_FORWARDING_IND (message_p).module_id = ctxt_pP->module_id;
+ GTPV1U_ENB_DATA_FORWARDING_IND (message_p).rnti = ctxt_pP->rnti;
+ GTPV1U_ENB_DATA_FORWARDING_IND (message_p).eNB_index = ctxt_pP->eNB_index;
+
+ itti_send_msg_to_task (TASK_DATA_FORWARDING, ctxt_pP->instance, message_p);
+ return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
+ } else if (task_id == TASK_END_MARKER){
+
+ LOG_I(GTPU,"gtpv_data_req task_id = TASK_END_MARKER\n");
+
+ message_buffer = itti_malloc (TASK_GTPV1_U, TASK_END_MARKER, sdu_sizeP);
+
+ memcpy (message_buffer, buffer_pP, sdu_sizeP);
+
+ message_p = itti_alloc_new_message (TASK_GTPV1_U, 0, GTPV1U_ENB_END_MARKER_IND);
+ GTPV1U_ENB_END_MARKER_IND (message_p).frame = ctxt_pP->frame;
+ GTPV1U_ENB_END_MARKER_IND (message_p).enb_flag = ctxt_pP->enb_flag;
+ GTPV1U_ENB_END_MARKER_IND (message_p).rb_id = rb_idP;
+ GTPV1U_ENB_END_MARKER_IND (message_p).muip = muiP;
+ GTPV1U_ENB_END_MARKER_IND (message_p).confirmp = confirmP;
+ GTPV1U_ENB_END_MARKER_IND (message_p).sdu_size = sdu_sizeP;
+ GTPV1U_ENB_END_MARKER_IND (message_p).sdu_p = message_buffer;
+ GTPV1U_ENB_END_MARKER_IND (message_p).mode = modeP;
+ GTPV1U_ENB_END_MARKER_IND (message_p).module_id = ctxt_pP->module_id;
+ GTPV1U_ENB_END_MARKER_IND (message_p).rnti = ctxt_pP->rnti;
+ GTPV1U_ENB_END_MARKER_IND (message_p).eNB_index = ctxt_pP->eNB_index;
+
+ itti_send_msg_to_task (TASK_END_MARKER, ctxt_pP->instance, message_p);
+ return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
}
- return TRUE;
-
+ LOG_E(RRC, "Impossible state\n");
+ return FALSE;
}
-//#endif
+boolean_t gtpv_data_req_new (
+ protocol_ctxt_t *ctxt,
+ const srb_flag_t srb_flagP,
+ const rb_id_t rb_idP,
+ const mui_t muiP,
+ const confirm_t confirmP,
+ const sdu_size_t sdu_buffer_sizeP,
+ unsigned char *const sdu_buffer_pP,
+ const pdcp_transmission_mode_t modeP,
+ const uint32_t *sourceL2Id,
+ const uint32_t *destinationL2Id) {
+ int task;
+
+ if (sdu_buffer_sizeP==0)
+ task=TASK_END_MARKER;
+ else
+ task=TASK_DATA_FORWARDING;
+
+ struct rrc_eNB_ue_context_s *ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt->module_id], ctxt->rnti);
+ if(ue_context_p == NULL || ue_context_p->ue_context.handover_info == NULL ||
+ ue_context_p->ue_context.Status != RRC_HO_EXECUTION) {
+ LOG_E(RRC,"incoming GTP-U for X2 in non HO context\n");
+ return false;
+ }
+
+ /* in the source enb, UE in RRC_HO_EXECUTION mode */
+ // We have 2*2=4 cases (data or end marker) * (from slave, from EPC)
+ if (ue_context_p->ue_context.handover_info->state == HO_COMPLETE) {
+ LOG_I(GTPU, "source receive END MARKER\n");
+ /* set handover state */
+ //ue_context_p->ue_context.handover_info->state = HO_END_MARKER;
+ MessageDef *msg;
+ // Configure end marker
+ msg = itti_alloc_new_message(TASK_GTPV1_U, 0, GTPV1U_ENB_END_MARKER_REQ);
+ GTPV1U_ENB_END_MARKER_REQ(msg).buffer = itti_malloc(TASK_GTPV1_U, TASK_GTPV1_U, GTPU_HEADER_OVERHEAD_MAX + sdu_buffer_sizeP);
+ memcpy(>PV1U_ENB_END_MARKER_REQ(msg).buffer[GTPU_HEADER_OVERHEAD_MAX], sdu_buffer_pP, sdu_buffer_sizeP);
+ GTPV1U_ENB_END_MARKER_REQ(msg).length = sdu_buffer_sizeP;
+ GTPV1U_ENB_END_MARKER_REQ(msg).rnti = ctxt->rnti;
+ GTPV1U_ENB_END_MARKER_REQ(msg).rab_id = rb_idP;
+ GTPV1U_ENB_END_MARKER_REQ(msg).offset = GTPU_HEADER_OVERHEAD_MAX;
+ LOG_I(GTPU, "Send End Marker to GTPV1-U at frame %d and subframe %d \n", ctxt->frame,ctxt->subframe);
+ itti_send_msg_to_task(TASK_GTPV1_U, ENB_MODULE_ID_TO_INSTANCE(ctxt->module_id), msg);
+ return NW_GTPV1U_OK;
+ }
+
+ /* target enb */
+ // We have 2*2=4 cases (data or end marker) * (from source, from EPC)
+ if (ue_context_p->ue_context.Status == RRC_RECONFIGURED) {
+ // It should come from remote eNB
+ // case end marker by EPC is not possible ?
+ if (task==TASK_END_MARKER) {
+ LOG_I(GTPU, "target end receive END MARKER\n");
+ // We close the HO, nothing to send to remote ?
+ ue_context_p->ue_context.handover_info->state = HO_END_MARKER;
+ gtpv1u_enb_delete_tunnel_req_t delete_tunnel_req;
+ memset(&delete_tunnel_req, 0, sizeof(delete_tunnel_req));
+ delete_tunnel_req.rnti = ctxt->rnti;
+ gtpv1u_delete_x2u_tunnel(ctxt->module_id, &delete_tunnel_req, GTPV1U_TARGET_ENB);
+ return true;
+ } else {
+ /* data packet */
+ LOG_I(GTPU, "Received a message data forwarding length %d\n", sdu_buffer_sizeP);
+ // Is it from remote ENB
+ // We have to push it to the UE ?
+ if(ue_context_p->ue_context.handover_info->state != HO_COMPLETE) {
+ int result = pdcp_data_req(
+ ctxt,
+ srb_flagP,
+ rb_idP,
+ muiP, // mui
+ confirmP, // confirm
+ sdu_buffer_sizeP,
+ sdu_buffer_pP,
+ modeP,
+ sourceL2Id,
+ destinationL2Id
+ );
+ ue_context_p->ue_context.handover_info->forwarding_state = FORWARDING_NO_EMPTY;
+ return result;
+ } else { /* It is from from epc message */
+ /* in the source enb, UE in RRC_HO_EXECUTION mode */
+ MessageDef *msg;
+ // ?????
+ return true;
+ }
+ }
+ }
+ LOG_E(RRC,"This function should return before the end\n");
+ return false;
+}
+
void rrc_eNB_send_GTPV1U_ENB_DELETE_TUNNEL_REQ(
module_id_t enb_mod_idP,
@@ -181,21 +269,16 @@ void rrc_eNB_send_GTPV1U_ENB_DELETE_TUNNEL_REQ(
LOG_W(RRC, "[eNB] In %s: invalid UE\n", __func__);
return;
}
+ gtpv1u_enb_delete_tunnel_req_t tmp={0};
- MSC_LOG_TX_MESSAGE(MSC_RRC_ENB, MSC_GTPU_ENB, NULL, 0,
- "0 GTPV1U_ENB_DELETE_TUNNEL_REQ rnti %x ",
- ue_context_pP->ue_context.eNB_ue_s1ap_id);
-
- MessageDef *msg = itti_alloc_new_message(TASK_RRC_ENB, 0, GTPV1U_ENB_DELETE_TUNNEL_REQ);
- memset(>PV1U_ENB_DELETE_TUNNEL_REQ(msg), 0, sizeof(GTPV1U_ENB_DELETE_TUNNEL_REQ(msg)));
- GTPV1U_ENB_DELETE_TUNNEL_REQ(msg).rnti = ue_context_pP->ue_context.rnti;
- GTPV1U_ENB_DELETE_TUNNEL_REQ(msg).from_gnb = 0;
- GTPV1U_ENB_DELETE_TUNNEL_REQ(msg).num_erab = ue_context_pP->ue_context.nb_of_e_rabs;
+ tmp.rnti = ue_context_pP->ue_context.rnti;
+ tmp.from_gnb = 0;
+ tmp.num_erab = ue_context_pP->ue_context.nb_of_e_rabs;
for (int e_rab = 0; e_rab < ue_context_pP->ue_context.nb_of_e_rabs; e_rab++) {
const rb_id_t gtp_ebi = ue_context_pP->ue_context.enb_gtp_ebi[e_rab];
- GTPV1U_ENB_DELETE_TUNNEL_REQ(msg).eps_bearer_id[e_rab] = gtp_ebi;
+ tmp.eps_bearer_id[e_rab] = gtp_ebi;
}
- itti_send_msg_to_task(TASK_GTPV1_U, ENB_MODULE_ID_TO_INSTANCE(enb_mod_idP), msg);
+ gtpv1u_delete_s1u_tunnel(enb_mod_idP,&tmp);
}
diff --git a/openair2/RRC/LTE/rrc_eNB_S1AP.c b/openair2/RRC/LTE/rrc_eNB_S1AP.c
index 0e6d5b580f..f64a109f75 100644
--- a/openair2/RRC/LTE/rrc_eNB_S1AP.c
+++ b/openair2/RRC/LTE/rrc_eNB_S1AP.c
@@ -48,11 +48,12 @@
#include "pdcp_primitives.h"
#include "UTIL/OSA/osa_defs.h"
-#include "msc.h"
+#include
#include "LTE_UERadioAccessCapabilityInformation.h"
#include "gtpv1u_eNB_task.h"
+#include
#include "RRC/LTE/rrc_eNB_GTPV1U.h"
#include "TLVDecoder.h"
@@ -1787,7 +1788,7 @@ int rrc_eNB_process_S1AP_E_RAB_RELEASE_COMMAND(MessageDef *msg_p, const char *ms
}
}
- itti_send_msg_to_task(TASK_GTPV1_U, instance, msg_delete_tunnels_p);
+ itti_send_msg_to_task(TASK_VARIABLE, instance, msg_delete_tunnels_p);
//S1AP_E_RAB_RELEASE_RESPONSE
rrc_eNB_send_S1AP_E_RAB_RELEASE_RESPONSE(&ctxt, ue_context_p, xid);
}
diff --git a/openair2/RRC/NR/L2_nr_interface.c b/openair2/RRC/NR/L2_nr_interface.c
index a67eef2a64..f8cb75c74d 100644
--- a/openair2/RRC/NR/L2_nr_interface.c
+++ b/openair2/RRC/NR/L2_nr_interface.c
@@ -43,6 +43,9 @@
#include "NR_MIB.h"
#include "NR_BCCH-BCH-Message.h"
#include "rrc_gNB_UE_context.h"
+#include
+#include
+
extern RAN_CONTEXT_t RC;
@@ -205,6 +208,7 @@ nr_rrc_data_req(
message_p);
LOG_I(NR_RRC,"send RRC_DCCH_DATA_REQ to PDCP\n");
+ //trace_NRpdu(DIRECTION_DOWNLINK, message_buffer, sdu_sizeP, 0, WS_M_RNTI, ctxt_pP->rnti, ctxt_pP->frame, ctxt_pP->subframe,0, 0);
/* Hack: only trigger PDCP if in CU, otherwise it is triggered by RU threads
* Ideally, PDCP would not neet to be triggered like this but react to ITTI
* messages automatically */
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
old mode 100644
new mode 100755
index 6e7ff2f421..286e756193
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -70,6 +70,7 @@
#include "NR_RRCReconfigurationComplete-IEs.h"
#include "NR_DLInformationTransfer.h"
#include "NR_RRCReestablishmentRequest.h"
+#include "NR_UE-CapabilityRequestFilterNR.h"
#include "PHY/defs_nr_common.h"
#if defined(NR_Rel16)
#include "NR_SCS-SpecificCarrier.h"
@@ -450,7 +451,7 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
ss1->nrofCandidates = calloc(1,sizeof(*ss1->nrofCandidates));
ss1->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
ss1->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
- ss1->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
+ ss1->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n4;
ss1->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
ss1->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
ss1->searchSpaceType = calloc(1,sizeof(*ss1->searchSpaceType));
@@ -1082,6 +1083,106 @@ void fill_initial_SpCellConfig(rnti_t rnti,
ASN_SEQUENCE_ADD(&bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list,
ss2);
+
+ SpCellConfig->spCellConfigDedicated->tag_Id=0;
+}
+
+void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup) {
+
+ NR_RLC_BearerConfig_t *rlc_BearerConfig = NULL;
+ NR_RLC_Config_t *rlc_Config = NULL;
+ NR_LogicalChannelConfig_t *logicalChannelConfig = NULL;
+
+ long *logicalChannelGroup = NULL;
+
+ cellGroupConfig->cellGroupId = 0;
+
+ /* Rlc Bearer Config */
+ /* TS38.331 9.2.1 Default SRB configurations */
+ cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+ rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t));
+ rlc_BearerConfig->logicalChannelIdentity = 2;
+ rlc_BearerConfig->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer));
+ rlc_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
+ rlc_BearerConfig->servedRadioBearer->choice.srb_Identity = 2;
+ rlc_BearerConfig->reestablishRLC = NULL;
+ //if (0) {
+ rlc_Config = calloc(1, sizeof(NR_RLC_Config_t));
+ rlc_Config->present = NR_RLC_Config_PR_am;
+ rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am));
+ rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
+ *(rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
+ rlc_Config->choice.am->dl_AM_RLC.t_Reassembly = NR_T_Reassembly_ms35;
+ rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms0;
+ rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
+ *(rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
+ rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms45;
+ rlc_Config->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_infinity;
+ rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_infinity;
+ rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t8;
+ //}
+ rlc_BearerConfig->rlc_Config = rlc_Config;
+
+ logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t));
+ logicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters));
+ logicalChannelConfig->ul_SpecificParameters->priority = 3;
+ logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
+ logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms5;
+ logicalChannelGroup = CALLOC(1, sizeof(long));
+ *logicalChannelGroup = 0;
+ logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup;
+ logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID));
+ *logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = 0;
+ logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0;
+ logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
+ //}
+ rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig;
+
+ ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
+ ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig);
+
+ /*DRB Configuration*/
+ rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t));
+ rlc_BearerConfig->logicalChannelIdentity = 4;
+ rlc_BearerConfig->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer));
+ rlc_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
+ rlc_BearerConfig->servedRadioBearer->choice.drb_Identity = 1;
+ rlc_BearerConfig->reestablishRLC = NULL;
+ //if (0) {
+ rlc_Config = calloc(1, sizeof(NR_RLC_Config_t));
+ rlc_Config->present = NR_RLC_Config_PR_am;
+ rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am));
+ rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
+ *(rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size18;
+ rlc_Config->choice.am->dl_AM_RLC.t_Reassembly = NR_T_Reassembly_ms80;
+ rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms10;
+ rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
+ *(rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size18;
+ rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms80;
+ rlc_Config->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_p64;
+ rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_kB125;
+ rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t4;
+ //}
+ rlc_BearerConfig->rlc_Config = rlc_Config;
+ logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t));
+ logicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters));
+ logicalChannelConfig->ul_SpecificParameters->priority = 13;
+ logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8;
+ logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms100;
+ logicalChannelGroup = CALLOC(1, sizeof(long));
+ *logicalChannelGroup = 1;
+ logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup;
+ logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID));
+ *logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = 0;
+ logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0;
+ logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
+
+ rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig;
+
+ ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
+ ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig);
+
+ cellGroupConfig->rlc_BearerToReleaseList = NULL;
}
@@ -1133,6 +1234,10 @@ void fill_initial_cellGroupConfig(rnti_t rnti,
logicalChannelGroup = CALLOC(1, sizeof(long));
*logicalChannelGroup = 0;
logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup;
+ logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID));
+ *logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = 0;
+ logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0;
+ logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
//}
rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig;
@@ -1141,11 +1246,27 @@ void fill_initial_cellGroupConfig(rnti_t rnti,
cellGroupConfig->rlc_BearerToReleaseList = NULL;
/* mac CellGroup Config */
- if (0) {
- mac_CellGroupConfig = calloc(1, sizeof(NR_MAC_CellGroupConfig_t));
+ if (1) {
+ mac_CellGroupConfig = calloc(1, sizeof(*mac_CellGroupConfig));
+ mac_CellGroupConfig->schedulingRequestConfig = calloc(1, sizeof(*mac_CellGroupConfig->schedulingRequestConfig));
+ mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = CALLOC(1,sizeof(*mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList));
+ struct NR_SchedulingRequestToAddMod *schedulingrequestlist;
+ schedulingrequestlist = CALLOC(1,sizeof(*schedulingrequestlist));
+ schedulingrequestlist->schedulingRequestId = 0;
+ schedulingrequestlist->sr_ProhibitTimer = CALLOC(1,sizeof(*schedulingrequestlist->sr_ProhibitTimer));
+ *(schedulingrequestlist->sr_ProhibitTimer) = 0;
+ schedulingrequestlist->sr_TransMax = 0;
+ ASN_SEQUENCE_ADD(&(mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list),schedulingrequestlist);
mac_CellGroupConfig->bsr_Config = calloc(1, sizeof(*mac_CellGroupConfig->bsr_Config));
mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10;
mac_CellGroupConfig->bsr_Config->retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf80;
+ mac_CellGroupConfig->tag_Config = calloc(1, sizeof(*mac_CellGroupConfig->tag_Config));
+ mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL;
+ mac_CellGroupConfig->tag_Config->tag_ToAddModList = calloc(1,sizeof(*mac_CellGroupConfig->tag_Config->tag_ToAddModList));
+ struct NR_TAG *tag=calloc(1,sizeof(*tag));
+ tag->tag_Id = 0;
+ tag->timeAlignmentTimer = NR_TimeAlignmentTimer_infinity;
+ ASN_SEQUENCE_ADD(&mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag);
mac_CellGroupConfig->phr_Config = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config));
mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup;
mac_CellGroupConfig->phr_Config->choice.setup = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config->choice.setup));
@@ -1157,7 +1278,7 @@ void fill_initial_cellGroupConfig(rnti_t rnti,
physicalCellGroupConfig = calloc(1,sizeof(*physicalCellGroupConfig));
physicalCellGroupConfig->p_NR_FR1 = calloc(1,sizeof(*physicalCellGroupConfig->p_NR_FR1));
- *physicalCellGroupConfig->p_NR_FR1 = 0;
+ *physicalCellGroupConfig->p_NR_FR1 = 20;
physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook = NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic;
cellGroupConfig->physicalCellGroupConfig = physicalCellGroupConfig;
@@ -1243,13 +1364,12 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
fill_initial_cellGroupConfig(ue_context_pP->ue_context.rnti,cellGroupConfig,scc);
- ue_p->masterCellGroup = cellGroupConfig;
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
NULL,
(void *)cellGroupConfig,
masterCellGroup_buf,
- 100);
+ 1000);
if(enc_rval.encoded == -1) {
LOG_E(NR_RRC, "ASN1 message CellGroupConfig encoding failed (%s, %lu)!\n",
@@ -1263,6 +1383,8 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
}
}
+ ue_p->masterCellGroup = cellGroupConfig;
+
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_NR_DL_CCCH_Message, (void *)&dl_ccch_msg);
}
@@ -1270,7 +1392,7 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
NULL,
(void *)&dl_ccch_msg,
buffer,
- 100);
+ 1000);
if(enc_rval.encoded == -1) {
LOG_E(NR_RRC, "[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
@@ -1352,6 +1474,11 @@ uint8_t do_NR_SA_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
const uint8_t Transaction_id)
//------------------------------------------------------------------------------
{
+ NR_UE_CapabilityRequestFilterNR_t *sa_band_filter;
+ NR_FreqBandList_t *sa_band_list;
+ NR_FreqBandInformation_t *sa_band_info;
+ NR_FreqBandInformationNR_t *sa_band_infoNR;
+
NR_DL_DCCH_Message_t dl_dcch_msg;
NR_UE_CapabilityRAT_Request_t *ue_capabilityrat_request;
@@ -1368,6 +1495,35 @@ uint8_t do_NR_SA_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
memset(ue_capabilityrat_request,0,sizeof(NR_UE_CapabilityRAT_Request_t));
ue_capabilityrat_request->rat_Type = NR_RAT_Type_nr;
+ sa_band_infoNR = (NR_FreqBandInformationNR_t*)calloc(1,sizeof(NR_FreqBandInformationNR_t));
+ sa_band_infoNR->bandNR = 78;
+ sa_band_info = (NR_FreqBandInformation_t*)calloc(1,sizeof(NR_FreqBandInformation_t));
+ sa_band_info->present = NR_FreqBandInformation_PR_bandInformationNR;
+ sa_band_info->choice.bandInformationNR = sa_band_infoNR;
+
+ sa_band_list = (NR_FreqBandList_t *)calloc(1, sizeof(NR_FreqBandList_t));
+ ASN_SEQUENCE_ADD(&sa_band_list->list, sa_band_info);
+
+ sa_band_filter = (NR_UE_CapabilityRequestFilterNR_t*)calloc(1,sizeof(NR_UE_CapabilityRequestFilterNR_t));
+ sa_band_filter->frequencyBandListFilter = sa_band_list;
+
+ OCTET_STRING_t req_freq;
+ unsigned char req_freq_buf[1024];
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UE_CapabilityRequestFilterNR,
+ NULL,
+ (void *)sa_band_filter,
+ req_freq_buf,
+ 1024);
+
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_UE_CapabilityRequestFilterNR, (void *)sa_band_filter);
+ }
+
+ req_freq.buf = req_freq_buf;
+ req_freq.size = (enc_rval.encoded+7)/8;
+
+ ue_capabilityrat_request->capabilityRequestFilter = &req_freq;
+
ASN_SEQUENCE_ADD(&dl_dcch_msg.message.choice.c1->choice.ueCapabilityEnquiry->criticalExtensions.choice.ueCapabilityEnquiry->ue_CapabilityRAT_RequestList.list,
ue_capabilityrat_request);
@@ -1453,12 +1609,14 @@ uint16_t do_RRCReconfiguration(
NR_MeasConfig_t *meas_config,
struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList
*dedicatedNAS_MessageList,
- NR_MAC_CellGroupConfig_t *mac_CellGroupConfig)
+ NR_MAC_CellGroupConfig_t *mac_CellGroupConfig,
+ NR_CellGroupConfig_t *cellGroupConfig)
//------------------------------------------------------------------------------
{
NR_DL_DCCH_Message_t dl_dcch_msg;
asn_enc_rval_t enc_rval;
NR_RRCReconfiguration_IEs_t *ie;
+ unsigned char masterCellGroup_buf[1000];
memset(&dl_dcch_msg, 0, sizeof(NR_DL_DCCH_Message_t));
dl_dcch_msg.message.present = NR_DL_DCCH_MessageType_PR_c1;
@@ -1479,13 +1637,14 @@ uint16_t do_RRCReconfiguration(
// *security_config->keyToUse = NR_SecurityConfig__keyToUse_master;
ie = calloc(1, sizeof(NR_RRCReconfiguration_IEs_t));
- ie->radioBearerConfig = calloc(1, sizeof(NR_RadioBearerConfig_t));
- ie->radioBearerConfig->srb_ToAddModList = SRB_configList;
- ie->radioBearerConfig->drb_ToAddModList = DRB_configList;
- ie->radioBearerConfig->securityConfig = security_config;
- ie->radioBearerConfig->srb3_ToRelease = NULL;
- ie->radioBearerConfig->drb_ToReleaseList = DRB_releaseList;
-
+ if (SRB_configList || DRB_configList) {
+ ie->radioBearerConfig = calloc(1, sizeof(NR_RadioBearerConfig_t));
+ ie->radioBearerConfig->srb_ToAddModList = SRB_configList;
+ ie->radioBearerConfig->drb_ToAddModList = DRB_configList;
+ ie->radioBearerConfig->securityConfig = security_config;
+ ie->radioBearerConfig->srb3_ToRelease = NULL;
+ ie->radioBearerConfig->drb_ToReleaseList = DRB_releaseList;
+ }
/******************** Secondary Cell Group ********************/
// rrc_gNB_carrier_data_t *carrier = &(gnb_rrc_inst->carrier);
// fill_default_secondaryCellGroup( carrier->servingcellconfigcommon,
@@ -1501,20 +1660,41 @@ uint16_t do_RRCReconfiguration(
// lateNonCriticalExtension
ie->lateNonCriticalExtension = NULL;
// nonCriticalExtension
- ie->nonCriticalExtension = calloc(1, sizeof(NR_RRCReconfiguration_v1530_IEs_t));
- ie->nonCriticalExtension->dedicatedNAS_MessageList = dedicatedNAS_MessageList;
+
+ if (cellGroupConfig || dedicatedNAS_MessageList)
+ ie->nonCriticalExtension = calloc(1, sizeof(NR_RRCReconfiguration_v1530_IEs_t));
+ if(cellGroupConfig!=NULL){
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
+ NULL,
+ (void *)cellGroupConfig,
+ masterCellGroup_buf,
+ 1000);
+ if(enc_rval.encoded == -1) {
+ LOG_E(NR_RRC, "ASN1 message CellGroupConfig encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ return -1;
+ }
+ xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
+ ie->nonCriticalExtension->masterCellGroup = calloc(1,sizeof(OCTET_STRING_t));
+
+ ie->nonCriticalExtension->masterCellGroup->buf = masterCellGroup_buf;
+ ie->nonCriticalExtension->masterCellGroup->size = (enc_rval.encoded+7)/8;
+ }
+
+ if (dedicatedNAS_MessageList)
+ ie->nonCriticalExtension->dedicatedNAS_MessageList = dedicatedNAS_MessageList;
dl_dcch_msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration = ie;
- if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ //if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
- }
+ //}
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
NULL,
(void *)&dl_dcch_msg,
buffer,
- 100);
+ 1000);
if(enc_rval.encoded == -1) {
LOG_I(NR_RRC, "[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
@@ -1713,7 +1893,8 @@ do_NR_DLInformationTransfer(
encoded = uper_encode_to_new_buffer (&asn_DEF_NR_DL_DCCH_Message, NULL, (void *) &dl_dcch_msg, (void **)buffer);
AssertFatal(encoded > 0,"ASN1 message encoding failed (%s, %ld)!\n",
"DLInformationTransfer", encoded);
- LOG_D(NR_RRC,"DLInformationTransfer Encoded %zd bytes\n", encoded);
+ LOG_I(NR_RRC,"DLInformationTransfer Encoded %zd bytes\n", encoded);
+ for (int i=0;imodule_id,
+ rrc->carrier.ssb_SubcarrierOffset,
+ rrc->carrier.pdsch_AntennaPorts,
+ rrc->carrier.pusch_AntennaPorts,
+ rrc->carrier.sib1_tda,
+ NULL,
+ 0,
+ ue_context_pP->ue_context.rnti,
+ ue_context_pP->ue_context.masterCellGroup
+ );
+
+ nr_rrc_rlc_config_asn1_req(ctxt_pP,
+ ue_context_pP->ue_context.SRB_configList,
+ NULL,
+ NULL,
+ NULL,
+ ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList,
+ NULL);
+}
+
+void apply_pdcp_config(rrc_gNB_ue_context_t *const ue_context_pP,
+ const protocol_ctxt_t *const ctxt_pP ) {
+
+ nr_rrc_pdcp_config_asn1_req(ctxt_pP,
+ ue_context_pP->ue_context.SRB_configList,
+ NULL,
+ NULL,
+ 0xff,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList);
+
+}
+
//-----------------------------------------------------------------------------
void
rrc_gNB_generate_RRCSetup(
@@ -491,35 +533,10 @@ rrc_gNB_generate_RRCSetup(
// ue_context_pP->ue_context.ue_rrc_inactivity_timer = 0;
// configure MAC
- rrc_mac_config_req_gNB(rrc->module_id,
- rrc->carrier.ssb_SubcarrierOffset,
- rrc->carrier.pdsch_AntennaPorts,
- rrc->carrier.pusch_AntennaPorts,
- rrc->carrier.sib1_tda,
- NULL,
- 0,
- ue_context_pP->ue_context.rnti,
- ue_context_pP->ue_context.masterCellGroup
- );
- nr_rrc_rlc_config_asn1_req(ctxt_pP,
- ue_context_pP->ue_context.SRB_configList,
- NULL,
- NULL,
- NULL,
- ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList,
- NULL);
- nr_rrc_pdcp_config_asn1_req(ctxt_pP,
- ue_context_pP->ue_context.SRB_configList,
- NULL,
- NULL,
- 0xff,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList);
+
+ apply_macrlc_config(rrc,ue_context_pP,ctxt_pP);
+
+ apply_pdcp_config(ue_context_pP,ctxt_pP);
#endif
}
break;
@@ -695,6 +712,7 @@ rrc_gNB_process_RRCSetupComplete(
LOG_I(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel UL-DCCH, " "processing NR_RRCSetupComplete from UE (SRB1 Active)\n",
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
ue_context_pP->ue_context.Srb1.Active = 1;
+ ue_context_pP->ue_context.Srb1.Srb_info.Srb_id = 1;
ue_context_pP->ue_context.Status = NR_RRC_CONNECTED;
if (AMF_MODE_ENABLED) {
@@ -714,13 +732,13 @@ rrc_gNB_generate_defaultRRCReconfiguration(
{
uint8_t buffer[RRC_BUF_SIZE];
uint16_t size;
- NR_SRB_ToAddModList_t **SRB_configList2 = NULL;
+ /*NR_SRB_ToAddModList_t **SRB_configList2 = NULL;
NR_SRB_ToAddModList_t *SRB_configList = ue_context_pP->ue_context.SRB_configList;
NR_DRB_ToAddModList_t **DRB_configList = NULL;
NR_DRB_ToAddModList_t **DRB_configList2 = NULL;
NR_SRB_ToAddMod_t *SRB2_config = NULL;
NR_DRB_ToAddMod_t *DRB_config = NULL;
- NR_SDAP_Config_t *sdap_config = NULL;
+ NR_SDAP_Config_t *sdap_config = NULL;*/
struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList
*dedicatedNAS_MessageList = NULL;
NR_DedicatedNAS_Message_t *dedicatedNAS_Message = NULL;
@@ -729,7 +747,7 @@ rrc_gNB_generate_defaultRRCReconfiguration(
/******************** Radio Bearer Config ********************/
/* Configure SRB2 */
- SRB_configList2 = &ue_context_pP->ue_context.SRB_configList2[xid];
+ /*SRB_configList2 = &ue_context_pP->ue_context.SRB_configList2[xid];
if (*SRB_configList2) {
free(*SRB_configList2);
}
@@ -738,10 +756,10 @@ rrc_gNB_generate_defaultRRCReconfiguration(
SRB2_config = CALLOC(1, sizeof(*SRB2_config));
SRB2_config->srb_Identity = 2;
ASN_SEQUENCE_ADD(&(*SRB_configList2)->list, SRB2_config);
- ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config);
+ ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config);*/
/* Configure DRB */
- DRB_configList = &ue_context_pP->ue_context.DRB_configList;
+ /*DRB_configList = &ue_context_pP->ue_context.DRB_configList;
if (*DRB_configList) {
free(*DRB_configList);
}
@@ -787,10 +805,26 @@ rrc_gNB_generate_defaultRRCReconfiguration(
DRB_config->pdcp_Config->ext1 = NULL;
ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config);
- ASN_SEQUENCE_ADD(&(*DRB_configList2)->list, DRB_config);
+ ASN_SEQUENCE_ADD(&(*DRB_configList2)->list, DRB_config);*/
dedicatedNAS_MessageList = CALLOC(1, sizeof(struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList));
+ /* Add all NAS PDUs to the list */
+ for (int i = 0; i < ue_context_pP->ue_context.nb_of_pdusessions; i++) {
+ if (ue_context_pP->ue_context.pdusession[i].param.nas_pdu.buffer != NULL) {
+ dedicatedNAS_Message = CALLOC(1, sizeof(NR_DedicatedNAS_Message_t));
+ memset(dedicatedNAS_Message, 0, sizeof(OCTET_STRING_t));
+ OCTET_STRING_fromBuf(dedicatedNAS_Message,
+ (char *)ue_context_pP->ue_context.pdusession[i].param.nas_pdu.buffer,
+ ue_context_pP->ue_context.pdusession[i].param.nas_pdu.length);
+ ASN_SEQUENCE_ADD(&dedicatedNAS_MessageList->list, dedicatedNAS_Message);
+ }
+
+ ue_context_pP->ue_context.pdusession[i].status = PDU_SESSION_STATUS_DONE;
+ LOG_D(NR_RRC, "setting the status for the default DRB (index %d) to (%d,%s)\n",
+ i, ue_context_pP->ue_context.pdusession[i].status, "PDU_SESSION_STATUS_DONE");
+ }
+
if (ue_context_pP->ue_context.nas_pdu_flag == 1) {
dedicatedNAS_Message = CALLOC(1, sizeof(NR_DedicatedNAS_Message_t));
memset(dedicatedNAS_Message, 0, sizeof(OCTET_STRING_t));
@@ -809,18 +843,28 @@ rrc_gNB_generate_defaultRRCReconfiguration(
memset(buffer, 0, RRC_BUF_SIZE);
size = do_RRCReconfiguration(ctxt_pP, buffer,
xid,
- *SRB_configList2,
- *DRB_configList,
+ NULL,//*SRB_configList2,
+ NULL,//*DRB_configList,
NULL,
NULL,
NULL,
NULL,
dedicatedNAS_MessageList,
+ NULL,
NULL);
free(ue_context_pP->ue_context.nas_pdu.buffer);
LOG_DUMPMSG(NR_RRC, DEBUG_RRC,(char *)buffer, size, "[MSG] RRC Reconfiguration\n");
+
+ /* Free all NAS PDUs */
+ for (int i = 0; i < ue_context_pP->ue_context.nb_of_pdusessions; i++) {
+ if (ue_context_pP->ue_context.pdusession[i].param.nas_pdu.buffer != NULL) {
+ free(ue_context_pP->ue_context.pdusession[i].param.nas_pdu.buffer);
+ ue_context_pP->ue_context.pdusession[i].param.nas_pdu.buffer = NULL;
+ }
+ }
+
LOG_I(NR_RRC, "[gNB %d] Frame %d, Logical Channel DL-DCCH, Generate NR_RRCReconfiguration (bytes %d, UE id %x)\n",
ctxt_pP->module_id,
ctxt_pP->frame,
@@ -892,6 +936,230 @@ rrc_gNB_generate_defaultRRCReconfiguration(
}
}
+//-----------------------------------------------------------------------------
+void
+rrc_gNB_generate_dedicatedRRCReconfiguration(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *ue_context_pP
+)
+//-----------------------------------------------------------------------------
+{
+ NR_DRB_ToAddMod_t *DRB_config = NULL;
+ NR_SRB_ToAddMod_t *SRB2_config = NULL;
+ NR_SDAP_Config_t *sdap_config = NULL;
+ NR_DRB_ToAddModList_t **DRB_configList = NULL;
+ NR_DRB_ToAddModList_t **DRB_configList2 = NULL;
+ NR_SRB_ToAddModList_t **SRB_configList2 = NULL;
+ NR_SRB_ToAddModList_t *SRB_configList = ue_context_pP->ue_context.SRB_configList;
+ struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList
+ *dedicatedNAS_MessageList = NULL;
+ NR_DedicatedNAS_Message_t *dedicatedNAS_Message = NULL;
+ uint8_t buffer[RRC_BUF_SIZE];
+ uint16_t size;
+ int qos_flow_index = 0;
+ NR_QFI_t qfi = 0;
+ int pdu_sessions_done = 0;
+ int i;
+ NR_CellGroupConfig_t *cellGroupConfig;
+
+ uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id);
+
+ /* Configure SRB2 */
+ SRB_configList2 = &ue_context_pP->ue_context.SRB_configList2[xid];
+ if (*SRB_configList2 == NULL) {
+ *SRB_configList2 = CALLOC(1, sizeof(**SRB_configList2));
+ memset(*SRB_configList2, 0, sizeof(**SRB_configList2));
+ SRB2_config = CALLOC(1, sizeof(*SRB2_config));
+ SRB2_config->srb_Identity = 2;
+ ASN_SEQUENCE_ADD(&(*SRB_configList2)->list, SRB2_config);
+ ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config);
+ }
+
+ DRB_configList = &ue_context_pP->ue_context.DRB_configList;
+ if (*DRB_configList) {
+ free(*DRB_configList);
+ }
+ *DRB_configList = CALLOC(1, sizeof(**DRB_configList));
+ memset(*DRB_configList, 0, sizeof(**DRB_configList));
+
+ DRB_configList2 = &ue_context_pP->ue_context.DRB_configList2[xid];
+ if (*DRB_configList2) {
+ free(*DRB_configList2);
+ }
+ *DRB_configList2 = CALLOC(1, sizeof(**DRB_configList2));
+ memset(*DRB_configList2, 0, sizeof(**DRB_configList2));
+
+ dedicatedNAS_MessageList = CALLOC(1, sizeof(struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList));
+
+ for (i = 0; i < ue_context_pP->ue_context.setup_pdu_sessions; i++) {
+ if (pdu_sessions_done >= ue_context_pP->ue_context.nb_of_pdusessions) {
+ break;
+ }
+
+ if (ue_context_pP->ue_context.pdusession[i].status >= PDU_SESSION_STATUS_DONE) {
+ continue;
+ }
+
+ DRB_config = CALLOC(1, sizeof(*DRB_config));
+ DRB_config->drb_Identity = i+1;
+ DRB_config->cnAssociation = CALLOC(1, sizeof(*DRB_config->cnAssociation));
+ DRB_config->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_sdap_Config;
+ // sdap_Config
+ sdap_config = CALLOC(1, sizeof(NR_SDAP_Config_t));
+ memset(sdap_config, 0, sizeof(NR_SDAP_Config_t));
+ sdap_config->pdu_Session = ue_context_pP->ue_context.pdusession[i].param.pdusession_id;
+ sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_absent;
+ sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_present;
+ sdap_config->defaultDRB = TRUE;
+ sdap_config->mappedQoS_FlowsToAdd = calloc(1, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
+ memset(sdap_config->mappedQoS_FlowsToAdd, 0, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
+
+ for (qos_flow_index = 0; qos_flow_index < ue_context_pP->ue_context.pdusession[i].param.nb_qos; qos_flow_index++) {
+ qfi = ue_context_pP->ue_context.pdusession[i].param.qos[qos_flow_index].qfi;
+ ASN_SEQUENCE_ADD(&sdap_config->mappedQoS_FlowsToAdd->list, &qfi);
+ }
+ sdap_config->mappedQoS_FlowsToRelease = NULL;
+ DRB_config->cnAssociation->choice.sdap_Config = sdap_config;
+
+ // pdcp_Config
+ DRB_config->reestablishPDCP = NULL;
+ DRB_config->recoverPDCP = NULL;
+ DRB_config->pdcp_Config = calloc(1, sizeof(*DRB_config->pdcp_Config));
+ DRB_config->pdcp_Config->drb = calloc(1,sizeof(*DRB_config->pdcp_Config->drb));
+ DRB_config->pdcp_Config->drb->discardTimer = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->discardTimer));
+ *DRB_config->pdcp_Config->drb->discardTimer = NR_PDCP_Config__drb__discardTimer_infinity;
+ DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL));
+ *DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits;
+ DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL));
+ *DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL = NR_PDCP_Config__drb__pdcp_SN_SizeDL_len18bits;
+ DRB_config->pdcp_Config->drb->headerCompression.present = NR_PDCP_Config__drb__headerCompression_PR_notUsed;
+ DRB_config->pdcp_Config->drb->headerCompression.choice.notUsed = 0;
+
+ DRB_config->pdcp_Config->drb->integrityProtection = NULL;
+ DRB_config->pdcp_Config->drb->statusReportRequired = NULL;
+ DRB_config->pdcp_Config->drb->outOfOrderDelivery = NULL;
+ DRB_config->pdcp_Config->moreThanOneRLC = NULL;
+
+ DRB_config->pdcp_Config->t_Reordering = calloc(1, sizeof(*DRB_config->pdcp_Config->t_Reordering));
+ *DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms750;
+ DRB_config->pdcp_Config->ext1 = NULL;
+
+ // Reference TS23501 Table 5.7.4-1: Standardized 5QI to QoS characteristics mapping
+ for (qos_flow_index = 0; qos_flow_index < ue_context_pP->ue_context.pdusession[i].param.nb_qos; qos_flow_index++) {
+ switch (ue_context_pP->ue_context.pdusession[i].param.qos[qos_flow_index].fiveQI) {
+ case 1: //100ms
+ case 2: //150ms
+ case 3: //50ms
+ case 4: //300ms
+ case 5: //100ms
+ case 6: //300ms
+ case 7: //100ms
+ case 8: //300ms
+ case 9: //300ms Video (Buffered Streaming)TCP-based (e.g., www, e-mail, chat, ftp, p2p file sharing, progressive video, etc.)
+ // TODO
+ break;
+
+ default:
+ LOG_E(NR_RRC,"not supported 5qi %lu\n", ue_context_pP->ue_context.pdusession[i].param.qos[qos_flow_index].fiveQI);
+ ue_context_pP->ue_context.pdusession[i].status = PDU_SESSION_STATUS_FAILED;
+ ue_context_pP->ue_context.pdusession[i].xid = xid;
+ pdu_sessions_done++;
+ free(DRB_config);
+ continue;
+ }
+ }
+
+ ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config);
+ ASN_SEQUENCE_ADD(&(*DRB_configList2)->list, DRB_config);
+
+ ue_context_pP->ue_context.pdusession[i].status = PDU_SESSION_STATUS_DONE;
+ ue_context_pP->ue_context.pdusession[i].xid = xid;
+
+ if (ue_context_pP->ue_context.pdusession[i].param.nas_pdu.buffer != NULL) {
+ dedicatedNAS_Message = CALLOC(1, sizeof(NR_DedicatedNAS_Message_t));
+ memset(dedicatedNAS_Message, 0, sizeof(OCTET_STRING_t));
+ OCTET_STRING_fromBuf(dedicatedNAS_Message,
+ (char *)ue_context_pP->ue_context.pdusession[i].param.nas_pdu.buffer,
+ ue_context_pP->ue_context.pdusession[i].param.nas_pdu.length);
+ ASN_SEQUENCE_ADD(&dedicatedNAS_MessageList->list, dedicatedNAS_Message);
+
+ LOG_I(NR_RRC,"add NAS info with size %d (pdusession id %d)\n",ue_context_pP->ue_context.pdusession[i].param.nas_pdu.length, i);
+ } else {
+ // TODO
+ LOG_E(NR_RRC,"no NAS info (pdusession id %d)\n", i);
+ }
+ }
+
+ /* If list is empty free the list and reset the address */
+ if (dedicatedNAS_MessageList->list.count == 0) {
+ free(dedicatedNAS_MessageList);
+ dedicatedNAS_MessageList = NULL;
+ }
+
+ memset(buffer, 0, RRC_BUF_SIZE);
+ cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
+ fill_mastercellGroupConfig(cellGroupConfig, ue_context_pP->ue_context.masterCellGroup);
+ size = do_RRCReconfiguration(ctxt_pP, buffer,
+ xid,
+ *SRB_configList2,
+ *DRB_configList,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ dedicatedNAS_MessageList,
+ NULL,
+ cellGroupConfig);
+ LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,"[MSG] RRC Reconfiguration\n");
+
+ /* Free all NAS PDUs */
+ for (i = 0; i < ue_context_pP->ue_context.nb_of_pdusessions; i++) {
+ if (ue_context_pP->ue_context.pdusession[i].param.nas_pdu.buffer != NULL) {
+ /* Free the NAS PDU buffer and invalidate it */
+ free(ue_context_pP->ue_context.pdusession[i].param.nas_pdu.buffer);
+ ue_context_pP->ue_context.pdusession[i].param.nas_pdu.buffer = NULL;
+ }
+ }
+
+ LOG_I(NR_RRC,
+ "[gNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCReconfiguration (bytes %d, UE RNTI %x)\n",
+ ctxt_pP->module_id, ctxt_pP->frame, size, ue_context_pP->ue_context.rnti);
+ LOG_D(NR_RRC,
+ "[FRAME %05d][RRC_gNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n",
+ ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_gNB_mui, ctxt_pP->module_id, DCCH);
+ MSC_LOG_TX_MESSAGE(
+ MSC_RRC_GNB,
+ MSC_RRC_UE,
+ buffer,
+ size,
+ MSC_AS_TIME_FMT" dedicated RRCReconfiguration UE %x MUI %d size %u",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_pP->ue_context.rnti,
+ rrc_gNB_mui,
+ size);
+
+#ifdef ITTI_SIM
+ MessageDef *message_p;
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (TASK_RRC_GNB_SIM, TASK_RRC_UE_SIM, size);
+ memcpy (message_buffer, buffer, size);
+ message_p = itti_alloc_new_message (TASK_RRC_GNB_SIM, 0, GNB_RRC_DCCH_DATA_IND);
+ GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
+ GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
+ GNB_RRC_DCCH_DATA_IND (message_p).size = size;
+ itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
+#else
+ nr_rrc_data_req(
+ ctxt_pP,
+ DCCH,
+ rrc_gNB_mui++,
+ SDU_CONFIRM_NO,
+ size,
+ buffer,
+ PDCP_TRANSMISSION_MODE_CONTROL);
+#endif
+}
+
//-----------------------------------------------------------------------------
void
rrc_gNB_generate_dedicatedRRCReconfiguration_release(
@@ -948,6 +1216,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
NULL,
NULL,
dedicatedNAS_MessageList,
+ NULL,
NULL);
ue_context_pP->ue_context.pdu_session_release_command_flag = 1;
@@ -1042,26 +1311,29 @@ rrc_gNB_process_RRCReconfigurationComplete(
ue_context_pP->ue_context.rnti);
#ifndef ITTI_SIM
+ LOG_I(NR_RRC,"Configuring PDCP DRBs/SRBs for UE %x\n",ue_context_pP->ue_context.rnti);
+
nr_rrc_pdcp_config_asn1_req(ctxt_pP,
SRB_configList, // NULL,
DRB_configList,
DRB_Release_configList2,
- 0xff, // already configured during the securitymodecommand
+ 0, // already configured during the securitymodecommand
kRRCenc,
kRRCint,
kUPenc,
NULL,
NULL,
NULL,
- NULL);
+ ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList);
/* Refresh SRBs/DRBs */
if (!NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
+ LOG_I(NR_RRC,"Configuring RLC DRBs/SRBs for UE %x\n",ue_context_pP->ue_context.rnti);
nr_rrc_rlc_config_asn1_req(ctxt_pP,
SRB_configList, // NULL,
DRB_configList,
DRB_Release_configList2,
NULL,
- NULL,
+ ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList,
NULL);
}
#endif
@@ -1071,6 +1343,7 @@ rrc_gNB_process_RRCReconfigurationComplete(
for (int i = 0; (i < SRB_configList->list.count) && (i < 3); i++) {
if (SRB_configList->list.array[i]->srb_Identity == 1) {
ue_context_pP->ue_context.Srb1.Active = 1;
+ ue_context_pP->ue_context.Srb1.Srb_info.Srb_id = 1;
} else if (SRB_configList->list.array[i]->srb_Identity == 2) {
ue_context_pP->ue_context.Srb2.Active = 1;
ue_context_pP->ue_context.Srb2.Srb_info.Srb_id = 2;
@@ -1452,6 +1725,7 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete(
NULL,
NULL, // MeasObj_list,
NULL,
+ NULL,
NULL);
LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,
"[MSG] RRC Reconfiguration\n");
@@ -2050,13 +2324,14 @@ rrc_gNB_decode_dcch(
itti_send_msg_to_task(TASK_GTPV1_U, ctxt_pP->instance, msg_delete_tunnels_p);
//NGAP_PDUSESSION_RELEASE_RESPONSE
rrc_gNB_send_NGAP_PDUSESSION_RELEASE_RESPONSE(ctxt_pP, ue_context_p, xid);
- } else {
- rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(ctxt_pP,
- ue_context_p,
- ul_dcch_msg->message.choice.c1->choice.rrcReconfigurationComplete->rrc_TransactionIdentifier);
+ } else if (ue_context_p->ue_context.established_pdu_sessions_flag != 1) {
+ if (ue_context_p->ue_context.setup_pdu_sessions > 0) {
+ rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(ctxt_pP,
+ ue_context_p,
+ ul_dcch_msg->message.choice.c1->choice.rrcReconfigurationComplete->rrc_TransactionIdentifier);
+ }
}
}
-
if (first_rrcreconfiguration == 0){
first_rrcreconfiguration = 1;
rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(ctxt_pP, ue_context_p);
@@ -2337,7 +2612,13 @@ rrc_gNB_decode_dcch(
ue_context_p,
ul_dcch_msg);
}
- rrc_gNB_generate_defaultRRCReconfiguration(ctxt_pP, ue_context_p);
+
+ if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) {
+ rrc_gNB_generate_dedicatedRRCReconfiguration(ctxt_pP, ue_context_p);
+ } else {
+ rrc_gNB_generate_defaultRRCReconfiguration(ctxt_pP, ue_context_p);
+ }
+
break;
case NR_UL_DCCH_MessageType__c1_PR_rrcReestablishmentComplete:
@@ -2564,7 +2845,16 @@ void *rrc_gnb_task(void *args_p) {
int result;
//SRB_INFO *srb_info_p;
//int CC_id;
- protocol_ctxt_t ctxt;
+ protocol_ctxt_t ctxt={.module_id=0,
+ .enb_flag=1,
+ .instance=0,
+ .rnti=0,
+ .frame=-1,
+ .subframe=-1,
+ .eNB_index=0,
+ .configured=true,
+ .brOption=false
+ };
itti_mark_task_ready(TASK_RRC_GNB);
LOG_I(NR_RRC,"Entering main loop of NR_RRC message task\n");
@@ -3005,7 +3295,7 @@ rrc_gNB_generate_RRCRelease(
GNB_RRC_DCCH_DATA_IND (message_p).size = size;
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
#else
- if (NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
+ if (NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
MessageDef *m = itti_alloc_new_message(TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_RELEASE_CMD);
F1AP_UE_CONTEXT_RELEASE_CMD(m).rnti = ctxt_pP->rnti;
F1AP_UE_CONTEXT_RELEASE_CMD(m).cause = F1AP_CAUSE_RADIO_NETWORK;
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c
index 4b9f507f59..5595f87d14 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.c
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.c
@@ -57,6 +57,8 @@
#include "RRC/NR/MESSAGES/asn1_msg.h"
#include "NR_UERadioAccessCapabilityInformation.h"
#include "NR_UE-CapabilityRAT-ContainerList.h"
+#include "NGAP_Cause.h"
+#include "NGAP_CauseRadioNetwork.h"
#include "f1ap_messages_types.h"
extern RAN_CONTEXT_t RC;
@@ -304,25 +306,45 @@ nr_rrc_pdcp_config_security(
uint8_t *kRRCenc = NULL;
uint8_t *kRRCint = NULL;
uint8_t *kUPenc = NULL;
+ uint8_t *k_kdf = NULL;
pdcp_t *pdcp_p = NULL;
static int print_keys= 1;
hashtable_rc_t h_rc;
hash_key_t key;
#ifndef PHYSIM
- /* Derive the keys from kgnb */
- if (SRB_configList != NULL) {
- nr_derive_key_up_enc(ue_context_pP->ue_context.ciphering_algorithm,
- ue_context_pP->ue_context.kgnb,
- &kUPenc);
- }
+ /* Derive the keys from kgnb */
+ if (SRB_configList != NULL) {
+ k_kdf = NULL;
+ nr_derive_key_up_enc(ue_context_pP->ue_context.ciphering_algorithm,
+ ue_context_pP->ue_context.kgnb,
+ &k_kdf);
+ /* kUPenc: last 128 bits of key derivation function which returns 256 bits */
+ kUPenc = malloc(16);
+ if (kUPenc == NULL) exit(1);
+ memcpy(kUPenc, k_kdf+16, 16);
+ free(k_kdf);
+ }
- nr_derive_key_rrc_enc(ue_context_pP->ue_context.ciphering_algorithm,
- ue_context_pP->ue_context.kgnb,
- &kRRCenc);
- nr_derive_key_rrc_int(ue_context_pP->ue_context.integrity_algorithm,
- ue_context_pP->ue_context.kgnb,
- &kRRCint);
+ k_kdf = NULL;
+ nr_derive_key_rrc_enc(ue_context_pP->ue_context.ciphering_algorithm,
+ ue_context_pP->ue_context.kgnb,
+ &k_kdf);
+ /* kRRCenc: last 128 bits of key derivation function which returns 256 bits */
+ kRRCenc = malloc(16);
+ if (kRRCenc == NULL) exit(1);
+ memcpy(kRRCenc, k_kdf+16, 16);
+ free(k_kdf);
+
+ k_kdf = NULL;
+ nr_derive_key_rrc_int(ue_context_pP->ue_context.integrity_algorithm,
+ ue_context_pP->ue_context.kgnb,
+ &k_kdf);
+ /* kRRCint: last 128 bits of key derivation function which returns 256 bits */
+ kRRCint = malloc(16);
+ if (kRRCint == NULL) exit(1);
+ memcpy(kRRCint, k_kdf+16, 16);
+ free(k_kdf);
#endif
if (!IS_SOFTMODEM_IQPLAYER) {
SET_LOG_DUMP(DEBUG_SECURITY) ;
@@ -333,33 +355,23 @@ nr_rrc_pdcp_config_security(
if (print_keys == 1 ) {
print_keys =0;
LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, ue_context_pP->ue_context.kgnb, 32,"\nKgNB:" );
- LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, kRRCenc, 32,"\nKRRCenc:" );
- LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, kRRCint, 32,"\nKRRCint:" );
+ LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, kRRCenc, 16,"\nKRRCenc:" );
+ LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, kRRCint, 16,"\nKRRCint:" );
}
}
- key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, DCCH, SRB_FLAG_YES);
- h_rc = hashtable_get(pdcp_coll_p, key, (void **)&pdcp_p);
-
- if (h_rc == HASH_TABLE_OK) {
- pdcp_config_set_security(
- ctxt_pP,
- pdcp_p,
- DCCH,
- DCCH+2,
- (send_security_mode_command == TRUE) ?
- 0 | (ue_context_pP->ue_context.integrity_algorithm << 4) :
- (ue_context_pP->ue_context.ciphering_algorithm ) |
- (ue_context_pP->ue_context.integrity_algorithm << 4),
- kRRCenc,
- kRRCint,
- kUPenc);
- } else {
- LOG_E(NR_RRC,
- PROTOCOL_NR_RRC_CTXT_UE_FMT"Could not get PDCP instance for SRB DCCH %u\n",
- PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
- DCCH);
- }
+ pdcp_config_set_security(
+ ctxt_pP,
+ NULL, /* pdcp_pP not used anymore in NR */
+ DCCH,
+ DCCH+2,
+ (send_security_mode_command == TRUE) ?
+ 0 | (ue_context_pP->ue_context.integrity_algorithm << 4) :
+ (ue_context_pP->ue_context.ciphering_algorithm ) |
+ (ue_context_pP->ue_context.integrity_algorithm << 4),
+ kRRCenc,
+ kRRCint,
+ kUPenc);
}
//------------------------------------------------------------------------------
@@ -496,6 +508,10 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(
rrc_gNB_ue_context_t *ue_context_p = NULL;
protocol_ctxt_t ctxt;
uint8_t pdu_sessions_done = 0;
+ gtpv1u_gnb_create_tunnel_req_t create_tunnel_req;
+ gtpv1u_gnb_create_tunnel_resp_t create_tunnel_resp;
+ uint8_t inde_list[NR_NB_RB_MAX - 3]= {0};
+ int ret = 0;
ue_initial_id = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).ue_initial_id;
gNB_ue_ngap_id = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).gNB_ue_ngap_id;
@@ -519,28 +535,64 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(
ue_context_p->ue_context.amf_ue_ngap_id = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).amf_ue_ngap_id;
ue_context_p->ue_context.nas_pdu_flag = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nas_pdu_flag;
- if (NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).nb_of_pdusessions != 0) {
- ue_context_p->ue_context.nb_of_pdusessions = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).nb_of_pdusessions;
+ uint8_t nb_pdusessions_tosetup = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_pdusessions;
+ if (nb_pdusessions_tosetup != 0) {
+ memset(&create_tunnel_req, 0, sizeof(gtpv1u_gnb_create_tunnel_req_t));
for (int i = 0; i < NR_NB_RB_MAX - 3; i++) {
if(ue_context_p->ue_context.pdusession[i].status >= PDU_SESSION_STATUS_DONE)
- continue;
- ue_context_p->ue_context.pdusession[i].status = PDU_SESSION_STATUS_NEW;
- ue_context_p->ue_context.pdusession[i].param = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done];
- pdu_sessions_done++;
+ continue;
+ ue_context_p->ue_context.pdusession[i].status = PDU_SESSION_STATUS_NEW;
+ ue_context_p->ue_context.pdusession[i].param = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done];
+ create_tunnel_req.pdusession_id[pdu_sessions_done] = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].pdusession_id;
+ create_tunnel_req.upf_NGu_teid[pdu_sessions_done] = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].gtp_teid;
+ create_tunnel_req.upf_addr[pdu_sessions_done].length = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[i].upf_addr.length;
+ memcpy(create_tunnel_req.upf_addr[pdu_sessions_done].buffer,
+ NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[i].upf_addr.buffer,
+ sizeof(uint8_t)*20);
+ LOG_I(NR_RRC, "PDUSESSION SETUP: local index %d teid %u, pdusession id %d \n",
+ i,
+ create_tunnel_req.upf_NGu_teid[i],
+ create_tunnel_req.pdusession_id[i]);
+ inde_list[pdu_sessions_done] = i;
+ pdu_sessions_done++;
- // TODO establish PDU SESSION
-
- if(pdu_sessions_done >= NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).nb_of_pdusessions) {
- break;
- }
+ if(pdu_sessions_done >= nb_pdusessions_tosetup) {
+ break;
+ }
}
+
+ ue_context_p->ue_context.nb_of_pdusessions = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_pdusessions;
+ create_tunnel_req.rnti = ue_context_p->ue_context.rnti;
+ create_tunnel_req.num_tunnels = pdu_sessions_done;
+
+ ret = gtpv1u_create_ngu_tunnel(
+ instance,
+ &create_tunnel_req,
+ &create_tunnel_resp);
+ if (ret != 0) {
+ LOG_E(NR_RRC,"rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ : gtpv1u_create_ngu_tunnel failed,start to release UE %x\n",ue_context_p->ue_context.rnti);
+ ue_context_p->ue_context.ue_release_timer_ng = 1;
+ ue_context_p->ue_context.ue_release_timer_thres_ng = 100;
+ ue_context_p->ue_context.ue_release_timer = 0;
+ ue_context_p->ue_context.ue_reestablishment_timer = 0;
+ ue_context_p->ue_context.ul_failure_timer = 20000;
+ ue_context_p->ue_context.ul_failure_timer = 0;
+ return (0);
+ }
+
+ nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(
+ &ctxt,
+ &create_tunnel_resp,
+ &inde_list[0]);
+ ue_context_p->ue_context.setup_pdu_sessions += nb_pdusessions_tosetup;
+ ue_context_p->ue_context.established_pdu_sessions_flag = 1;
}
/* NAS PDU */
- ue_context_p->ue_context.nas_pdu_flag = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).nas_pdu_flag;
- if (ue_context_p->ue_context.nas_pdu_flag == 1) {
- ue_context_p->ue_context.nas_pdu.length = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).nas_pdu.length;
- ue_context_p->ue_context.nas_pdu.buffer = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).nas_pdu.buffer;
+ if (NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).nas_pdu_flag == 1) {
+ ue_context_p->ue_context.nas_pdu_flag = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).nas_pdu_flag;
+ ue_context_p->ue_context.nas_pdu.length = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).nas_pdu.length;
+ ue_context_p->ue_context.nas_pdu.buffer = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).nas_pdu.buffer;
}
/* security */
@@ -590,25 +642,34 @@ rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(
{
MessageDef *msg_p = NULL;
int pdusession;
- int e_rabs_done = 0;
- int e_rabs_failed = 0;
+ int pdu_sessions_done = 0;
+ int pdu_sessions_failed = 0;
+ int qos_flow_index = 0;
msg_p = itti_alloc_new_message (TASK_RRC_ENB, 0, NGAP_INITIAL_CONTEXT_SETUP_RESP);
NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).gNB_ue_ngap_id = ue_context_pP->ue_context.gNB_ue_ngap_id;
for (pdusession = 0; pdusession < ue_context_pP->ue_context.nb_of_pdusessions; pdusession++) {
- if (ue_context_pP->ue_context.pdusession[pdusession].status == E_RAB_STATUS_DONE) {
- e_rabs_done++;
+ if (ue_context_pP->ue_context.pdusession[pdusession].status == PDU_SESSION_STATUS_DONE) {
+ pdu_sessions_done++;
NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions[pdusession].pdusession_id = ue_context_pP->ue_context.pdusession[pdusession].param.pdusession_id;
// TODO add other information from S1-U when it will be integrated
NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions[pdusession].gtp_teid = ue_context_pP->ue_context.gnb_gtp_teid[pdusession];
memcpy(NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions[pdusession].gNB_addr.buffer , ue_context_pP->ue_context.gnb_gtp_addrs[pdusession].buffer, 20);
NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions[pdusession].gNB_addr.length = 4;
- ue_context_pP->ue_context.pdusession[pdusession].status = E_RAB_STATUS_ESTABLISHED;
+ ue_context_pP->ue_context.pdusession[pdusession].status = PDU_SESSION_STATUS_ESTABLISHED;
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions[pdusession].nb_of_qos_flow = ue_context_pP->ue_context.pdusession[pdusession].param.nb_qos;
+ for (qos_flow_index = 0; qos_flow_index < ue_context_pP->ue_context.pdusession[pdusession].param.nb_qos; qos_flow_index++) {
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions[pdusession].associated_qos_flows[qos_flow_index].qfi =
+ ue_context_pP->ue_context.pdusession[pdusession].param.qos[qos_flow_index].qfi;
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions[pdusession].associated_qos_flows[qos_flow_index].qos_flow_mapping_ind = QOSFLOW_MAPPING_INDICATION_DL;
+ }
} else {
- e_rabs_failed++;
- ue_context_pP->ue_context.pdusession[pdusession].status = E_RAB_STATUS_FAILED;
+ pdu_sessions_failed++;
+ ue_context_pP->ue_context.pdusession[pdusession].status = PDU_SESSION_STATUS_FAILED;
NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions_failed[pdusession].pdusession_id = ue_context_pP->ue_context.pdusession[pdusession].param.pdusession_id;
// TODO add cause when it will be integrated
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions_failed[pdusession].cause = NGAP_Cause_PR_radioNetwork;
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions_failed[pdusession].cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID;
}
}
@@ -621,13 +682,17 @@ rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(
MSC_AS_TIME_ARGS(ctxt_pP),
ue_context_pP->ue_id_rnti,
NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).gNB_ue_ngap_id,
- e_rabs_done, e_rabs_failed);
- NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).nb_of_pdusessions = e_rabs_done;
- NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).nb_of_pdusessions_failed = e_rabs_failed;
+ pdu_sessions_done, pdu_sessions_failed);
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).nb_of_pdusessions = pdu_sessions_done;
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).nb_of_pdusessions_failed = pdu_sessions_failed;
itti_send_msg_to_task (TASK_NGAP, ctxt_pP->instance, msg_p);
}
static NR_CipheringAlgorithm_t rrc_gNB_select_ciphering(uint16_t algorithms) {
+
+ return NR_CipheringAlgorithm_nea0;
+
+
if (algorithms & NGAP_ENCRYPTION_NEA3_MASK) {
return NR_CipheringAlgorithm_nea3;
}
@@ -640,10 +705,13 @@ static NR_CipheringAlgorithm_t rrc_gNB_select_ciphering(uint16_t algorithms) {
return NR_CipheringAlgorithm_nea1;
}
- return NR_CipheringAlgorithm_nea0;
}
static e_NR_IntegrityProtAlgorithm rrc_gNB_select_integrity(uint16_t algorithms) {
+
+ //only NIA2 supported for now
+ return NR_IntegrityProtAlgorithm_nia2;
+
if (algorithms & NGAP_INTEGRITY_NIA3_MASK) {
return NR_IntegrityProtAlgorithm_nia3;
}
@@ -671,7 +739,7 @@ rrc_gNB_process_security(
/* Save security parameters */
ue_context_pP->ue_context.security_capabilities = *security_capabilities_pP;
// translation
- LOG_D(NR_RRC,
+ LOG_I(NR_RRC,
"[gNB %d] NAS security_capabilities.encryption_algorithms %u AS ciphering_algorithm %lu NAS security_capabilities.integrity_algorithms %u AS integrity_algorithm %u\n",
ctxt_pP->module_id,
ue_context_pP->ue_context.security_capabilities.nRencryption_algorithms,
@@ -793,7 +861,7 @@ rrc_gNB_process_NGAP_DOWNLINK_NAS(
/* Transfer data to PDCP */
nr_rrc_data_req (
&ctxt,
- DCCH, // ue_context_p->ue_context.Srb2.Srb_info.Srb_id,
+ ue_context_p->ue_context.Srb2.Active == 1 ? ue_context_p->ue_context.Srb2.Srb_info.Srb_id : ue_context_p->ue_context.Srb1.Srb_info.Srb_id,
(*rrc_gNB_mui)++,
SDU_CONFIRM_NO,
length,
@@ -823,7 +891,7 @@ rrc_gNB_process_NGAP_DOWNLINK_NAS(
/* Transfer data to PDCP */
nr_rrc_data_req (
&ctxt,
- DCCH,
+ ue_context_p->ue_context.Srb2.Active == 1 ? ue_context_p->ue_context.Srb2.Srb_info.Srb_id : ue_context_p->ue_context.Srb1.Srb_info.Srb_id,
(*rrc_gNB_mui)++,
SDU_CONFIRM_NO,
length,
@@ -1045,8 +1113,9 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
ue_context_p->ue_context.setup_pdu_sessions += nb_pdusessions_tosetup;
// TEST
- ue_context_p->ue_context.pdusession[0].status = PDU_SESSION_STATUS_DONE;
- rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(&ctxt, ue_context_p, 0);
+ // ue_context_p->ue_context.pdusession[0].status = PDU_SESSION_STATUS_DONE;
+ // rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(&ctxt, ue_context_p, 0);
+ rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p);
return(0);
}
}
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index fd5f42294a..da7e3b1867 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -39,6 +39,7 @@
#include "openair2/RRC/LTE/rrc_eNB_GTPV1U.h"
#include "executables/softmodem-common.h"
#include
+#include
#include "UTIL/OSA/osa_defs.h"
extern boolean_t nr_rrc_pdcp_config_asn1_req(
@@ -438,7 +439,7 @@ void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) {
ue_context->ue_context.gnb_gtp_ebi[e_rab] = 0;
}
- itti_send_msg_to_task(TASK_GTPV1_U, rrc->module_id, msg_delete_tunnels_p);
+ itti_send_msg_to_task(TASK_VARIABLE, rrc->module_id, msg_delete_tunnels_p);
/* remove context */
rrc_gNB_remove_ue_context(&ctxt, rrc, ue_context);
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index ad67f9f156..63cef7ffc0 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -49,7 +49,6 @@
#define false 0
#define true 1
-
void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
NR_ServingCellConfig_t *servingcellconfigdedicated,
NR_CellGroupConfig_t *secondaryCellGroup,
@@ -390,7 +389,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
coreset->frequencyDomainResources.buf[0] = 0xf0;
else
coreset->frequencyDomainResources.buf[0] = 0xff;
- if (curr_bwp < 96 || get_softmodem_params()->sa==1)
+ if (curr_bwp < 96)
coreset->frequencyDomainResources.buf[1] = 0;
else
coreset->frequencyDomainResources.buf[1] = 0xff;
@@ -401,17 +400,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
coreset->frequencyDomainResources.size = 6;
coreset->frequencyDomainResources.bits_unused = 3;
coreset->duration=1;
-
- if(get_softmodem_params()->sa) {
- coreset->cce_REG_MappingType.present=NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved;
- coreset->cce_REG_MappingType.choice.interleaved=calloc(1,sizeof(*coreset->cce_REG_MappingType.choice.interleaved));
- coreset->cce_REG_MappingType.choice.interleaved->reg_BundleSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6;
- coreset->cce_REG_MappingType.choice.interleaved->interleaverSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n2;
- coreset->cce_REG_MappingType.choice.interleaved->shiftIndex = servingcellconfigcommon->physCellId;
- } else {
- coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
- }
-
+ coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
coreset->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
coreset->tci_StatesPDCCH_ToAddList=calloc(1,sizeof(*coreset->tci_StatesPDCCH_ToAddList));
@@ -459,7 +448,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list,ss);
-
+
bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1));
*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=0;
diff --git a/openair2/RRC/NR_UE/L2_interface_ue.c b/openair2/RRC/NR_UE/L2_interface_ue.c
index be952d10d1..1be3fb6225 100644
--- a/openair2/RRC/NR_UE/L2_interface_ue.c
+++ b/openair2/RRC/NR_UE/L2_interface_ue.c
@@ -167,7 +167,7 @@ rrc_data_req_ue(
TASK_RRC_UE,
TASK_PDCP_UE,
sdu_sizeP);
- LOG_I(RRC,"Sending RRC message for SRB %ld, sdu_size %d\n",rb_idP,sdu_sizeP);
+ LOG_I(RRC,"Sending RRC message for SRB %ld, sdu_size %d\n",rb_idP,sdu_sizeP);
memcpy (message_buffer, buffer_pP, sdu_sizeP);
message_p = itti_alloc_new_message ( TASK_RRC_UE, 0, RRC_DCCH_DATA_REQ);
RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame;
diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c
index 3afde73f43..ad96dd39ce 100644
--- a/openair2/RRC/NR_UE/rrc_UE.c
+++ b/openair2/RRC/NR_UE/rrc_UE.c
@@ -73,6 +73,7 @@
#include "nr_nas_msg_sim.h"
#endif
+NR_UE_RRC_INST_t *NR_UE_rrc_inst;
/* NAS Attach request with IMSI */
static const char nr_nas_attach_req_imsi[] = {
0x07, 0x41,
diff --git a/openair2/RRC/NR_UE/rrc_vars.h b/openair2/RRC/NR_UE/rrc_vars.h
index 5c74e5b5a8..30c74debdd 100644
--- a/openair2/RRC/NR_UE/rrc_vars.h
+++ b/openair2/RRC/NR_UE/rrc_vars.h
@@ -36,6 +36,6 @@
#include "rrc_defs.h"
-NR_UE_RRC_INST_t *NR_UE_rrc_inst;
+extern NR_UE_RRC_INST_t *NR_UE_rrc_inst;
#endif
diff --git a/openair2/SIMULATION/NR_RRC/itti_sim.c b/openair2/SIMULATION/NR_RRC/itti_sim.c
index ee1eda4267..01b3fbfa35 100644
--- a/openair2/SIMULATION/NR_RRC/itti_sim.c
+++ b/openair2/SIMULATION/NR_RRC/itti_sim.c
@@ -89,9 +89,7 @@ pthread_cond_t nfapi_sync_cond;
pthread_mutex_t nfapi_sync_mutex;
int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
-//uint8_t nfapi_mode = 0; // Default to monolithic mode
-uint32_t target_dl_mcs = 28;
-uint32_t target_ul_mcs = 20;
+uint8_t nfapi_mode = 0; // Default to monolithic mode
uint32_t timing_advance = 0;
uint64_t num_missed_slots=0;
@@ -123,7 +121,6 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
//Temp fix for inexistent NR upper layer
unsigned char NB_gNB_INST = 1;
-static char *itti_dump_file = NULL;
int UE_scan = 1;
int UE_scan_carrier = 0;
@@ -151,7 +148,6 @@ extern void *udp_eNB_task(void *args_p);
int transmission_mode=1;
int emulate_rf = 0;
int numerology = 0;
-int usrp_tx_thread = 0;
double cpuf;
diff --git a/openair2/UTIL/OCG/OCG.h b/openair2/UTIL/OCG/OCG.h
index 34190f7d15..58cc7184e7 100644
--- a/openair2/UTIL/OCG/OCG.h
+++ b/openair2/UTIL/OCG/OCG.h
@@ -667,7 +667,6 @@ typedef struct {
unsigned char omv_enabled; // openair mobility visulizer
unsigned char opp_enabled; // openair performance profiler
unsigned char oeh_enabled; // openair event handler, with CLI this could provide a remote event management
- char *itti_dump_file;
unsigned char vcd_enabled;
char *vcd_file;
unsigned char eMBMS_active_state;
@@ -717,12 +716,6 @@ typedef struct {
*/
unsigned char slot_isr;
int slot_sfd;
- rnti_t eNB_ue_module_id_to_rnti[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];/*!< \brief used by eNB, this array can be filled:
- by local virtualization: set directly by UE, or by remote UEs: TODO add signalisation on ethernet emulation link from UE to eNB*/
-
- module_id_t eNB_ue_local_uid_to_ue_module_id[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];/*!< \brief used by eNB, this array can be filled:
- by local virtualization: set directly by UE, or by remote UEs: TODO add signalisation on ethernet emulation link from UE to eNB*/
-
} Info;
/* @}*/
diff --git a/openair2/UTIL/OPT/README.txt b/openair2/UTIL/OPT/README.txt
index 2ac68f83fd..13ec727fd5 100644
--- a/openair2/UTIL/OPT/README.txt
+++ b/openair2/UTIL/OPT/README.txt
@@ -1,13 +1,14 @@
-How to configure wireshark for dissecting LTE protocols:
+How to configure wireshark for dissecting LTE/NR protocols:
- start the wireshark as a sudoers
- goto analyze->enabled prototols
- => enable mac_lte_udp and rlc_lte_udp
+ => enable mac_xxx_udp and rlc_xxx_udp (xxx is lte or nr)
- goto edit/preferences and expand Protocols
- select UDP and check "try heuristic sub-dissectors first"
- - select MAC-LTE, and check all the options (checkboxes), and set the "which layer info to show in info column" to "MAC info"
- - select RLC-LTE, and check all the options except the "May see RLC headers only", and
+ - select MAC-LTE (or MAC-NR), and check all the options (checkboxes), and set the "which layer info to show in info column" to "MAC info"
+ - select RLC-LTE (or NR), and check all the options except the "May see RLC headers only", and
set the "call PDCP dissector for DRB PDUs" to "12-bit SN". Optionally you may select the sequence analysis for RLC AM/UM.
+ - select PDCP-LTE (or NR)
How to use
- start eNB or UE with option --opt.type wireshark
diff --git a/openair2/UTIL/OPT/opt.h b/openair2/UTIL/OPT/opt.h
index ab591d3a65..a3a790cf97 100644
--- a/openair2/UTIL/OPT/opt.h
+++ b/openair2/UTIL/OPT/opt.h
@@ -60,6 +60,12 @@ typedef uint32_t guint32;
typedef guint8 gboolean;
#include "packet-mac-lte.h"
+#include "packet-rlc-lte.h"
+#include "packet-pdcp-lte.h"
+#include "packet-mac-nr.h"
+#include "packet-rlc-nr.h"
+#include "packet-pdcp-nr.h"
+
#include "mac_pcap.h"
/* OPT parameters definitions */
@@ -107,9 +113,10 @@ typedef enum radio_type_e {
*/
extern int opt_enabled;
-#define trace_pdu(x...) if (opt_enabled) trace_pdu_implementation(x)
+#define trace_pdu(x...) if (opt_enabled) trace_pdu_implementation(0, x)
+#define trace_NRpdu(x...) if (opt_enabled) trace_pdu_implementation(1, x)
-void trace_pdu_implementation(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
+void trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
int ueid, int rntiType, int rnti, uint16_t sysFrame, uint8_t subframe,
int oob_event, int oob_event_value);
diff --git a/openair2/UTIL/OPT/packet-mac-lte.h b/openair2/UTIL/OPT/packet-mac-lte.h
index 2d36e02df4..33e987c4ab 100644
--- a/openair2/UTIL/OPT/packet-mac-lte.h
+++ b/openair2/UTIL/OPT/packet-mac-lte.h
@@ -15,7 +15,7 @@
*
* SPDX-License-Identifier: BSD-2-Clause
*/
-
+
/*
this is wireshark, commit: commit eda834b6e29c36e05a63a6056afa98390ff79357
Date: Wed Aug 22 14:36:20 2018 +0200
@@ -114,6 +114,7 @@ typedef struct mac_lte_info
/* Timing info */
guint16 sysframeNumber;
guint16 subframeNumber;
+ gboolean sfnSfInfoPresent;
/* Optional field. More interesting for TDD (FDD is always -4 subframeNumber) */
gboolean subframeNumberOfGrantPresent;
@@ -197,49 +198,27 @@ typedef struct mac_lte_info
guint16 oob_rnti[MAX_SRs];
} mac_lte_info;
-
-typedef struct mac_lte_tap_info {
- /* Info from context */
- guint16 rnti;
- guint16 ueid;
- guint8 rntiType;
- guint8 isPredefinedData;
- gboolean crcStatusValid;
- mac_lte_crc_status crcStatus;
- guint8 direction;
-
- guint8 isPHYRetx;
- guint16 ueInTTI;
-
- nstime_t mac_lte_time;
-
- /* Number of bytes (which part is used depends upon context settings) */
- guint32 single_number_of_bytes;
- guint32 bytes_for_lcid[11];
- guint32 sdus_for_lcid[11];
- guint8 number_of_rars;
- guint8 number_of_paging_ids;
-
- /* Number of padding bytes includes padding subheaders and trailing padding */
- guint16 padding_bytes;
- guint16 raw_length;
-} mac_lte_tap_info;
+ /* 0 to 10 and 32 to 38 */
+#define MAC_LTE_DATA_LCID_COUNT_MAX 18
-/*****************************************************************/
-/* UDP framing format */
-/* ----------------------- */
-/* Several people have asked about dissecting MAC by framing */
-/* PDUs over IP. A suggested format over UDP has been created */
-/* and implemented by this dissector, using the definitions */
-/* below. A link to an example program showing you how to encode */
-/* these headers and send LTE MAC PDUs on a UDP socket is */
-/* provided at https://wiki.wireshark.org/MAC-LTE */
-/* */
-/* A heuristic dissector (enabled by a preference) will */
-/* recognise a signature at the beginning of these frames. */
-/*****************************************************************/
+
+/* Accessor function to check if a frame was considered to be ReTx */
+
+/**********************************************************************/
+/* UDP framing format */
+/* ----------------------- */
+/* Several people have asked about dissecting MAC by framing */
+/* PDUs over IP. A suggested format over UDP has been created */
+/* and implemented by this dissector, using the definitions */
+/* below. A link to an example program showing you how to encode */
+/* these headers and send LTE MAC PDUs on a UDP socket is */
+/* provided at https://gitlab.com/wireshark/wireshark/-/wikis/MAC-LTE */
+/* */
+/* A heuristic dissector (enabled by a preference) will */
+/* recognise a signature at the beginning of these frames. */
+/**********************************************************************/
/* Signature. Rather than try to define a port for this, or make the
@@ -317,66 +296,4 @@ typedef struct mac_lte_tap_info {
continues until the end of the frame) */
#define MAC_LTE_PAYLOAD_TAG 0x01
-
-/* Type to store parameters for configuring LCID->RLC channel settings for DRB */
-/* Some are optional, and may not be seen (e.g. on reestablishment) */
-typedef struct drb_mapping_t
-{
- guint16 ueid; /* Mandatory */
- guint8 drbid; /* Mandatory */
- gboolean lcid_present;
- guint8 lcid; /* Part of LogicalChannelConfig - optional */
- gboolean rlcMode_present;
- guint8 rlcMode; /* Part of RLC config - optional */
- gboolean rlc_ul_ext_li_field; /* Part of RLC config - optional */
- gboolean rlc_dl_ext_li_field; /* Part of RLC config - optional */
- gboolean rlc_ul_ext_am_sn; /* Part of RLC config - optional */
- gboolean rlc_dl_ext_am_sn; /* Part of RLC config - optional */
- gboolean um_sn_length_present;
- guint8 um_sn_length; /* Part of RLC config - optional */
- gboolean ul_priority_present;
- guint8 ul_priority; /* Part of LogicalChannelConfig - optional */
- gboolean pdcp_sn_size_present;
- guint8 pdcp_sn_size; /* Part of pdcp-Config - optional */
-} drb_mapping_t;
-
-
-
-/* Dedicated DRX config. Used to verify that a sensible config is given.
- Also, beginning to configure MAC with this config and (optionally) show
- DRX config and state (cycles/timers) attached to each UL/DL PDU! */
-typedef struct drx_config_t {
- gboolean configured;
- guint32 frameNum;
- guint32 previousFrameNum;
-
- guint32 onDurationTimer;
- guint32 inactivityTimer;
- guint32 retransmissionTimer;
- guint32 longCycle;
- guint32 cycleOffset;
- /* Optional Short cycle */
- gboolean shortCycleConfigured;
- guint32 shortCycle;
- guint32 shortCycleTimer;
-} drx_config_t;
-
-/* RRC can indicate whether simultaneous PUCCH/PUSCH is used */
-typedef enum {
- SIMULT_PUCCH_PUSCH_PCELL = 0,
- SIMULT_PUCCH_PUSCH_PSCELL
-} simult_pucch_pusch_cell_type;
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
-
#endif
diff --git a/openair2/UTIL/OPT/packet-mac-nr.h b/openair2/UTIL/OPT/packet-mac-nr.h
new file mode 100644
index 0000000000..8a1627a8ef
--- /dev/null
+++ b/openair2/UTIL/OPT/packet-mac-nr.h
@@ -0,0 +1,142 @@
+/* packet-mac-nr.h
+ *
+ * Martin Mathieson
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+/* radioType */
+#define FDD_RADIO 1
+#define TDD_RADIO 2
+
+/* Direction */
+#define DIRECTION_UPLINK 0
+#define DIRECTION_DOWNLINK 1
+
+/* rntiType */
+#define WS_NO_RNTI 0
+#define WS_P_RNTI 1
+#define WS_RA_RNTI 2
+#define WS_C_RNTI 3
+#define WS_SI_RNTI 4
+#define WS_CS_RNTI 5
+
+/* Context info attached to each NR MAC frame */
+typedef struct mac_nr_info
+{
+ /* Needed for decode */
+ guint8 radioType;
+ guint8 direction;
+ guint8 rntiType;
+
+ /* Extra info to display */
+ guint16 rnti;
+ guint16 ueid;
+ guint8 harqid;
+
+ /* Will these be included in the ME PHR report? */
+ guint8 phr_type2_othercell;
+
+ /* Timing info */
+ gboolean sfnSlotInfoPresent;
+ guint16 sysframeNumber;
+ guint16 slotNumber;
+
+ /* Length of DL PDU or UL grant size in bytes */
+ guint16 length;
+
+} mac_nr_info;
+
+
+/*****************************************************************/
+/* UDP framing format */
+/* ----------------------- */
+/* Several people have asked about dissecting MAC by framing */
+/* PDUs over IP. A suggested format over UDP has been created */
+/* and implemented by this dissector, using the definitions */
+/* below. */
+/* */
+/* A heuristic dissector (enabled by a preference) will */
+/* recognise a signature at the beginning of these frames. */
+/*****************************************************************/
+
+
+/* Signature. Rather than try to define a port for this, or make the
+ port number a preference, frames will start with this string (with no
+ terminating NULL */
+#define MAC_NR_START_STRING "mac-nr"
+
+/* Fixed fields. This is followed by the following 3 mandatory fields:
+ - radioType (1 byte)
+ - direction (1 byte)
+ - rntiType (1 byte)
+ (where the allowed values are defined above */
+
+/* Optional fields. Attaching this info to frames will allow you
+ to show you display/filter/plot/add-custom-columns on these fields, so should
+ be added if available.
+ The format is to have the tag, followed by the value (there is no length field,
+ it's implicit from the tag) */
+
+#define MAC_NR_RNTI_TAG 0x02
+/* 2 bytes, network order */
+
+#define MAC_NR_UEID_TAG 0x03
+/* 2 bytes, network order */
+
+#define MAC_NR_FRAME_SUBFRAME_TAG 0x04
+/* 2 bytes, deprecated, do not use it */
+
+#define MAC_NR_PHR_TYPE2_OTHERCELL_TAG 0x05
+/* 1 byte, TRUE/FALSE */
+
+#define MAC_NR_HARQID 0x06
+/* 1 byte */
+
+#define MAC_NR_FRAME_SLOT_TAG 0x07
+/* 4 bytes, network order, SFN is stored in the 2 first bytes and slot number in the 2 last bytes */
+
+/* MAC PDU. Following this tag comes the actual MAC PDU (there is no length, the PDU
+ continues until the end of the frame) */
+#define MAC_NR_PAYLOAD_TAG 0x01
+
+
+/* Type to store parameters for configuring LCID->RLC channel settings for DRB */
+/* Some are optional, and may not be seen (e.g. on reestablishment) */
+typedef struct nr_drb_mac_rlc_mapping_t
+{
+ gboolean active;
+ guint16 ueid; /* Mandatory */
+ guint8 drbid; /* Mandatory */
+
+ gboolean lcid_present;
+ guint8 lcid; /* Part of LogicalChannelConfig - optional */
+ gboolean rlcMode_present;
+ guint8 rlcMode; /* Part of RLC config - optional */
+
+ guint8 tempDirection; /* So know direction of next SN length... */
+
+ gboolean rlcUlSnLength_present;
+ guint8 rlcUlSnLength; /* Part of RLC config - optional */
+ gboolean rlcDlSnLength_present;
+ guint8 rlcDlSnLength; /* Part of RLC config - optional */
+} nr_drb_mac_rlc_mapping_t;
+
+
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/openair2/UTIL/OPT/packet-pdcp-lte.h b/openair2/UTIL/OPT/packet-pdcp-lte.h
new file mode 100644
index 0000000000..19a371011b
--- /dev/null
+++ b/openair2/UTIL/OPT/packet-pdcp-lte.h
@@ -0,0 +1,172 @@
+/* packet-pdcp-lte.h
+ *
+ * Martin Mathieson
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+
+
+/* Direction */
+#define DIRECTION_UPLINK 0
+#define DIRECTION_DOWNLINK 1
+
+enum pdcp_plane
+{
+ SIGNALING_PLANE = 1,
+ USER_PLANE = 2
+};
+
+typedef enum LogicalChannelType
+{
+ Channel_DCCH=1,
+ Channel_BCCH=2,
+ Channel_CCCH=3,
+ Channel_PCCH=4,
+ Channel_DCCH_NB=5,
+ Channel_BCCH_NB=6,
+ Channel_CCCH_NB=7,
+ Channel_PCCH_NB=8
+} LogicalChannelType;
+
+typedef enum
+{
+ BCH_TRANSPORT=1,
+ DLSCH_TRANSPORT=2
+} BCCHTransportType;
+
+#define PDCP_SN_LENGTH_5_BITS 5
+#define PDCP_SN_LENGTH_7_BITS 7
+#define PDCP_SN_LENGTH_12_BITS 12
+#define PDCP_SN_LENGTH_15_BITS 15
+#define PDCP_SN_LENGTH_18_BITS 18
+
+enum lte_security_integrity_algorithm_e { eia0, eia1, eia2, eia3 };
+enum lte_security_ciphering_algorithm_e { eea0, eea1, eea2, eea3 };
+
+typedef struct pdcp_lte_security_info_t
+{
+ guint32 configuration_frame;
+ gboolean seen_next_ul_pdu; /* i.e. have we seen SecurityModeResponse */
+ enum lte_security_integrity_algorithm_e integrity;
+ enum lte_security_ciphering_algorithm_e ciphering;
+
+ /* Store previous settings so can revert if get SecurityModeFailure */
+ guint32 previous_configuration_frame;
+ enum lte_security_integrity_algorithm_e previous_integrity;
+ enum lte_security_ciphering_algorithm_e previous_ciphering;
+} pdcp_lte_security_info_t;
+
+
+/***********************************************************************/
+/* UDP framing format */
+/* ----------------------- */
+/* Several people have asked about dissecting PDCP by framing */
+/* PDUs over IP. A suggested format over UDP has been defined */
+/* and implemented by this dissector, using the definitions */
+/* below. A link to an example program showing you how to encode */
+/* these headers and send LTE PDCP PDUs on a UDP socket is */
+/* provided at https://gitlab.com/wireshark/wireshark/-/wikis/PDCP-LTE */
+/* */
+/* A heuristic dissecter (enabled by a preference) will */
+/* recognise a signature at the beginning of these frames. */
+/* Until someone is using this format, suggestions for changes */
+/* are welcome. */
+/***********************************************************************/
+
+
+/* Signature. Rather than try to define a port for this, or make the
+ port number a preference, frames will start with this string (with no
+ terminating NULL */
+#define PDCP_LTE_START_STRING "pdcp-lte"
+
+/* Fixed fields. This is followed by the following 3 mandatory fields:
+ - no_header_pdu (1 byte)
+ - plane (1 byte)
+ - rohc_compression ( byte)
+ (where the allowed values are defined above) */
+
+/* Conditional field. This field is mandatory in case of User Plane PDCP PDU.
+ The format is to have the tag, followed by the value (there is no length field,
+ it's implicit from the tag). The allowed values are defined above. */
+
+#define PDCP_LTE_SEQNUM_LENGTH_TAG 0x02
+/* 1 byte */
+
+/* Optional fields. Attaching this info to frames will allow you
+ to show you display/filter/plot/add-custom-columns on these fields, so should
+ be added if available.
+ The format is to have the tag, followed by the value (there is no length field,
+ it's implicit from the tag) */
+
+#define PDCP_LTE_DIRECTION_TAG 0x03
+/* 1 byte */
+
+#define PDCP_LTE_LOG_CHAN_TYPE_TAG 0x04
+/* 1 byte */
+
+#define PDCP_LTE_BCCH_TRANSPORT_TYPE_TAG 0x05
+/* 1 byte */
+
+#define PDCP_LTE_ROHC_IP_VERSION_TAG 0x06
+/* 2 bytes, network order */
+
+#define PDCP_LTE_ROHC_CID_INC_INFO_TAG 0x07
+/* 1 byte */
+
+#define PDCP_LTE_ROHC_LARGE_CID_PRES_TAG 0x08
+/* 1 byte */
+
+#define PDCP_LTE_ROHC_MODE_TAG 0x09
+/* 1 byte */
+
+#define PDCP_LTE_ROHC_RND_TAG 0x0A
+/* 1 byte */
+
+#define PDCP_LTE_ROHC_UDP_CHECKSUM_PRES_TAG 0x0B
+/* 1 byte */
+
+#define PDCP_LTE_ROHC_PROFILE_TAG 0x0C
+/* 2 bytes, network order */
+
+#define PDCP_LTE_CHANNEL_ID_TAG 0x0D
+/* 2 bytes, network order */
+
+#define PDCP_LTE_UEID_TAG 0x0E
+/* 2 bytes, network order */
+
+/* PDCP PDU. Following this tag comes the actual PDCP PDU (there is no length, the PDU
+ continues until the end of the frame) */
+#define PDCP_LTE_PAYLOAD_TAG 0x01
+
+
+
+/* Called by RRC, or other configuration protocols */
+
+/* Function to configure ciphering & integrity algorithms */
+void set_pdcp_lte_security_algorithms(guint16 ueid, pdcp_lte_security_info_t *security_info);
+
+/* Function to indicate securityModeCommand did not complete */
+void set_pdcp_lte_security_algorithms_failed(guint16 ueid);
+
+
+/* Called by external dissectors */
+void set_pdcp_lte_rrc_ciphering_key(guint16 ueid, const char *key);
+void set_pdcp_lte_rrc_integrity_key(guint16 ueid, const char *key);
+void set_pdcp_lte_up_ciphering_key(guint16 ueid, const char *key);
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/openair2/UTIL/OPT/packet-pdcp-nr.h b/openair2/UTIL/OPT/packet-pdcp-nr.h
new file mode 100644
index 0000000000..79f784c1c3
--- /dev/null
+++ b/openair2/UTIL/OPT/packet-pdcp-nr.h
@@ -0,0 +1,168 @@
+/* packet-pdcp-nr.h
+ *
+ * Martin Mathieson
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+
+/* Direction */
+#define PDCP_NR_DIRECTION_UPLINK 0
+#define PDCP_NR_DIRECTION_DOWNLINK 1
+
+enum pdcp_nr_plane
+{
+ NR_SIGNALING_PLANE = 1,
+ NR_USER_PLANE = 2
+};
+
+typedef enum NRBearerType
+{
+ Bearer_DCCH=1,
+ Bearer_BCCH_BCH=2,
+ Bearer_BCCH_DL_SCH=3,
+ Bearer_CCCH=4,
+ Bearer_PCCH=5,
+} NRBearerType;
+
+
+#define PDCP_NR_SN_LENGTH_12_BITS 12
+#define PDCP_NR_SN_LENGTH_18_BITS 18
+
+#define PDCP_NR_UL_SDAP_HEADER_PRESENT 0x01
+#define PDCP_NR_DL_SDAP_HEADER_PRESENT 0x02
+
+enum nr_security_integrity_algorithm_e { nia0, nia1, nia2, nia3 };
+enum nr_security_ciphering_algorithm_e { nea0, nea1, nea2, nea3, nea_disabled=999};
+
+typedef struct pdcp_nr_security_info_t
+{
+ guint32 configuration_frame;
+ gboolean seen_next_ul_pdu; /* i.e. have we seen SecurityModeResponse */
+ enum nr_security_integrity_algorithm_e integrity;
+ enum nr_security_ciphering_algorithm_e ciphering;
+
+ /* Store previous settings so can revert if get SecurityModeFailure */
+ guint32 previous_configuration_frame;
+ enum nr_security_integrity_algorithm_e previous_integrity;
+ enum nr_security_ciphering_algorithm_e previous_ciphering;
+} pdcp_nr_security_info_t;
+
+
+/*****************************************************************/
+/* UDP framing format */
+/* ----------------------- */
+/* Several people have asked about dissecting PDCP by framing */
+/* PDUs over IP. A suggested format over UDP has been defined */
+/* and implemented by this dissector, using the definitions */
+/* below. */
+/* */
+/* A heuristic dissector (enabled by a preference) will */
+/* recognise a signature at the beginning of these frames. */
+/* Until someone is using this format, suggestions for changes */
+/* are welcome. */
+/*****************************************************************/
+
+
+/* Signature. Rather than try to define a port for this, or make the
+ port number a preference, frames will start with this string (with no
+ terminating NULL */
+#define PDCP_NR_START_STRING "pdcp-nr"
+
+/* Fixed fields:
+ - plane (1 byte) */
+
+/* Conditional field. This field is mandatory in case of User Plane PDCP PDU.
+ The format is to have the tag, followed by the value (there is no length field,
+ it's implicit from the tag). The allowed values are defined above. */
+
+#define PDCP_NR_SEQNUM_LENGTH_TAG 0x02
+/* 1 byte */
+
+/* Optional fields. Attaching this info should be added if available.
+ The format is to have the tag, followed by the value (there is no length field,
+ it's implicit from the tag) */
+
+#define PDCP_NR_DIRECTION_TAG 0x03
+/* 1 byte */
+
+#define PDCP_NR_BEARER_TYPE_TAG 0x04
+/* 1 byte */
+
+#define PDCP_NR_BEARER_ID_TAG 0x05
+/* 1 byte */
+
+#define PDCP_NR_UEID_TAG 0x06
+/* 2 bytes, network order */
+
+#define PDCP_NR_ROHC_COMPRESSION_TAG 0x07
+/* 0 byte */
+
+/* N.B. The following ROHC values only have significance if rohc_compression
+ is in use for the current channel */
+
+#define PDCP_NR_ROHC_IP_VERSION_TAG 0x08
+/* 1 byte */
+
+#define PDCP_NR_ROHC_CID_INC_INFO_TAG 0x09
+/* 0 byte */
+
+#define PDCP_NR_ROHC_LARGE_CID_PRES_TAG 0x0A
+/* 0 byte */
+
+#define PDCP_NR_ROHC_MODE_TAG 0x0B
+/* 1 byte */
+
+#define PDCP_NR_ROHC_RND_TAG 0x0C
+/* 0 byte */
+
+#define PDCP_NR_ROHC_UDP_CHECKSUM_PRES_TAG 0x0D
+/* 0 byte */
+
+#define PDCP_NR_ROHC_PROFILE_TAG 0x0E
+/* 2 bytes, network order */
+
+#define PDCP_NR_MACI_PRES_TAG 0x0F
+/* 0 byte */
+
+#define PDCP_NR_SDAP_HEADER_TAG 0x10
+/* 1 byte, bitmask with PDCP_NR_UL_SDAP_HEADER_PRESENT and/or PDCP_NR_DL_SDAP_HEADER_PRESENT */
+
+#define PDCP_NR_CIPHER_DISABLED_TAG 0x11
+/* 0 byte */
+
+/* PDCP PDU. Following this tag comes the actual PDCP PDU (there is no length, the PDU
+ continues until the end of the frame) */
+#define PDCP_NR_PAYLOAD_TAG 0x01
+
+
+/* Called by RRC, or other configuration protocols */
+
+/* Function to configure ciphering & integrity algorithms */
+void set_pdcp_nr_security_algorithms(guint16 ueid, pdcp_nr_security_info_t *security_info);
+
+/* Function to indicate securityModeCommand did not complete */
+void set_pdcp_nr_security_algorithms_failed(guint16 ueid);
+
+
+/* Called by external dissectors */
+void set_pdcp_nr_rrc_ciphering_key(guint16 ueid, const char *key);
+void set_pdcp_nr_rrc_integrity_key(guint16 ueid, const char *key);
+void set_pdcp_nr_up_ciphering_key(guint16 ueid, const char *key);
+void set_pdcp_nr_up_integrity_key(guint16 ueid, const char *key);
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/openair2/UTIL/OPT/packet-rlc-lte.h b/openair2/UTIL/OPT/packet-rlc-lte.h
new file mode 100644
index 0000000000..e5b03d5f8e
--- /dev/null
+++ b/openair2/UTIL/OPT/packet-rlc-lte.h
@@ -0,0 +1,151 @@
+/* packet-rlc-lte.h
+ *
+ * Martin Mathieson
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef PACKET_RLC_LTE_H
+#define PACKET_RLC_LTE_H
+
+/* rlcMode */
+#define RLC_TM_MODE 1
+#define RLC_UM_MODE 2
+#define RLC_AM_MODE 4
+#define RLC_PREDEF 8
+
+/* direction */
+#define DIRECTION_UPLINK 0
+#define DIRECTION_DOWNLINK 1
+
+/* priority ? */
+
+/* channelType */
+#define CHANNEL_TYPE_CCCH 1
+#define CHANNEL_TYPE_BCCH_BCH 2
+#define CHANNEL_TYPE_PCCH 3
+#define CHANNEL_TYPE_SRB 4
+#define CHANNEL_TYPE_DRB 5
+#define CHANNEL_TYPE_BCCH_DL_SCH 6
+#define CHANNEL_TYPE_MCCH 7
+#define CHANNEL_TYPE_MTCH 8
+
+/* sequenceNumberLength */
+#define UM_SN_LENGTH_5_BITS 5
+#define UM_SN_LENGTH_10_BITS 10
+#define AM_SN_LENGTH_10_BITS 10
+#define AM_SN_LENGTH_16_BITS 16
+
+
+typedef enum rlc_lte_nb_mode {
+ rlc_no_nb_mode = 0,
+ rlc_nb_mode = 1
+} rlc_lte_nb_mode;
+
+
+/* Info attached to each LTE RLC frame */
+typedef struct rlc_lte_info
+{
+ guint8 rlcMode;
+ guint8 direction;
+ guint8 priority;
+ guint8 sequenceNumberLength;
+ guint16 ueid;
+ guint16 channelType;
+ guint16 channelId; /* for SRB: 1=SRB1, 2=SRB2, 3=SRB1bis; for DRB: DRB ID */
+ guint16 pduLength;
+ gboolean extendedLiField;
+ rlc_lte_nb_mode nbMode;
+} rlc_lte_info;
+
+
+typedef struct rlc_lte_tap_info {
+ /* Info from context */
+ guint8 rlcMode;
+ guint8 direction;
+ guint8 priority;
+ guint16 ueid;
+ guint16 channelType;
+ guint16 channelId;
+ guint16 pduLength;
+ guint8 sequenceNumberLength;
+
+ nstime_t rlc_lte_time;
+ guint8 loggedInMACFrame;
+ guint16 sequenceNumber;
+ guint8 isResegmented;
+ guint8 isControlPDU;
+ guint16 ACKNo;
+ #define MAX_NACKs 128
+ guint16 noOfNACKs;
+ guint16 NACKs[MAX_NACKs];
+
+ guint16 missingSNs;
+} rlc_lte_tap_info;
+
+
+/* Signature. Rather than try to define a port for this, or make the
+ port number a preference, frames will start with this string (with no
+ terminating NULL */
+#define RLC_LTE_START_STRING "rlc-lte"
+
+/* Fixed field. This is followed by the following 1 mandatory field:
+ - rlcMode (1 byte)
+ (where the allowed values are defined above */
+
+/* Conditional field. This field is mandatory in case of RLC Unacknowledged mode.
+ In case of RLC Acknowledged mode, the field is optional (assume 10 bits by default).
+ The format is to have the tag, followed by the value (there is no length field,
+ it's implicit from the tag). The allowed values are defined above. */
+
+#define RLC_LTE_SN_LENGTH_TAG 0x02
+/* 1 byte */
+
+/* Optional fields. Attaching this info to frames will allow you
+ to show you display/filter/plot/add-custom-columns on these fields, so should
+ be added if available.
+ The format is to have the tag, followed by the value (there is no length field,
+ it's implicit from the tag) */
+
+#define RLC_LTE_DIRECTION_TAG 0x03
+/* 1 byte */
+
+#define RLC_LTE_PRIORITY_TAG 0x04
+/* 1 byte */
+
+#define RLC_LTE_UEID_TAG 0x05
+/* 2 bytes, network order */
+
+#define RLC_LTE_CHANNEL_TYPE_TAG 0x06
+/* 2 bytes, network order */
+
+#define RLC_LTE_CHANNEL_ID_TAG 0x07
+/* 2 bytes, network order */
+
+#define RLC_LTE_EXT_LI_FIELD_TAG 0x08
+/* 0 byte, tag presence indicates that AM DRB PDU is using an extended LI field of 15 bits */
+
+#define RLC_LTE_NB_MODE_TAG 0x09
+/* 1 byte containing rlc_lte_nb_mode enum value */
+
+/* RLC PDU. Following this tag comes the actual RLC PDU (there is no length, the PDU
+ continues until the end of the frame) */
+#define RLC_LTE_PAYLOAD_TAG 0x01
+
+#endif
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/openair2/UTIL/OPT/packet-rlc-nr.h b/openair2/UTIL/OPT/packet-rlc-nr.h
new file mode 100644
index 0000000000..290eba1898
--- /dev/null
+++ b/openair2/UTIL/OPT/packet-rlc-nr.h
@@ -0,0 +1,136 @@
+/* packet-rlc-nr.h
+ *
+ * Pascal Quantin
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef PACKET_RLC_NR_H
+#define PACKET_RLC_NR_H
+
+/* rlcMode */
+#define RLC_TM_MODE 1
+#define RLC_UM_MODE 2
+#define RLC_AM_MODE 4
+
+/* direction */
+#define DIRECTION_UPLINK 0
+#define DIRECTION_DOWNLINK 1
+
+/* bearerType */
+#define BEARER_TYPE_CCCH 1
+#define BEARER_TYPE_BCCH_BCH 2
+#define BEARER_TYPE_PCCH 3
+#define BEARER_TYPE_SRB 4
+#define BEARER_TYPE_DRB 5
+#define BEARER_TYPE_BCCH_DL_SCH 6
+
+/* sequenceNumberLength */
+#define TM_SN_LENGTH_0_BITS 0
+#define UM_SN_LENGTH_6_BITS 6
+#define UM_SN_LENGTH_12_BITS 12
+#define AM_SN_LENGTH_12_BITS 12
+#define AM_SN_LENGTH_18_BITS 18
+
+/* Info attached to each NR RLC frame */
+typedef struct rlc_nr_info
+{
+ guint8 rlcMode;
+ guint8 direction;
+ guint8 sequenceNumberLength;
+ guint8 bearerType;
+ guint8 bearerId;
+ guint16 ueid;
+ guint16 pduLength;
+} rlc_nr_info;
+
+typedef struct nr_drb_rlc_pdcp_mapping_t
+{
+ gboolean active;
+ guint16 ueid; /* Mandatory */
+ guint8 drbid; /* Mandatory */
+
+ gboolean pdcpUlSnLength_present;
+ guint8 pdcpUlSnLength; /* Part of PDCP config - optional */
+ gboolean pdcpDlSnLength_present;
+ guint8 pdcpDlSnLength; /* Part of PDCP config - optional */
+ gboolean pdcpUlSdap;
+ gboolean pdcpDlSdap;
+ gboolean pdcpIntegrityProtection;
+ gboolean pdcpCipheringDisabled;
+
+} nr_drb_rlc_pdcp_mapping_t;
+
+/* TODO: could probably merge this struct with above */
+typedef struct pdcp_ue_parameters {
+ guint32 id;
+ guint8 pdcp_sn_bits_ul;
+ guint8 pdcp_sn_bits_dl;
+ gboolean pdcp_sdap_ul;
+ gboolean pdcp_sdap_dl;
+ gboolean pdcp_integrity;
+ gboolean pdcp_ciphering_disabled;
+} pdcp_bearer_parameters;
+
+/*****************************************************************/
+/* UDP framing format */
+/* ----------------------- */
+/* Several people have asked about dissecting RLC by framing */
+/* PDUs over IP. A suggested format over UDP has been defined */
+/* and implemented by this dissector, using the definitions */
+/* below. */
+/* */
+/* A heuristic dissector (enabled by a preference) will */
+/* recognise a signature at the beginning of these frames. */
+/*****************************************************************/
+
+
+/* Signature. Rather than try to define a port for this, or make the
+ port number a preference, frames will start with this string (with no
+ terminating NULL */
+#define RLC_NR_START_STRING "rlc-nr"
+
+/* Fixed field. This is followed by the following 2 mandatory field:
+ - rlcMode (1 byte)
+ - sequenceNumberLength (1 byte)
+ (where the allowed values are defined above) */
+
+/* Optional fields. Attaching this info to frames will allow you
+ to show you display/filter/plot/add-custom-columns on these fields, so should
+ be added if available.
+ The format is to have the tag, followed by the value (there is no length field,
+ it's implicit from the tag) */
+
+#define RLC_NR_DIRECTION_TAG 0x02
+/* 1 byte */
+
+#define RLC_NR_UEID_TAG 0x03
+/* 2 bytes, network order */
+
+#define RLC_NR_BEARER_TYPE_TAG 0x04
+/* 1 byte */
+
+#define RLC_NR_BEARER_ID_TAG 0x05
+/* 1 byte */
+
+/* RLC PDU. Following this tag comes the actual RLC PDU (there is no length, the PDU
+ continues until the end of the frame) */
+#define RLC_NR_PAYLOAD_TAG 0x01
+
+#endif
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/openair2/UTIL/OPT/packet-rohc.h b/openair2/UTIL/OPT/packet-rohc.h
new file mode 100644
index 0000000000..c6c807f687
--- /dev/null
+++ b/openair2/UTIL/OPT/packet-rohc.h
@@ -0,0 +1,72 @@
+/* packet-rohc.h
+ * Routines for RObust Header Compression (ROHC) dissection.
+ *
+ * Copyright 2011, Anders Broman
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Ref:
+ * http://www.ietf.org/rfc/rfc3095.txt RObust Header Compression (ROHC): Framework and four profiles: RTP, UDP, ESP, and uncompressed
+ * http://datatracker.ietf.org/doc/rfc4815/ RObust Header Compression (ROHC): Corrections and Clarifications to RFC 3095
+ * http://datatracker.ietf.org/doc/rfc5225/ RObust Header Compression Version 2 (ROHCv2): Profiles for RTP, UDP, IP, ESP and UDP-Lite
+ */
+
+#ifndef PACKET_ROHC_H
+#define PACKET_ROHC_H
+
+#define MAX_CID 15
+
+ /* ROHC Profiles */
+#define ROHC_PROFILE_UNCOMPRESSED 0
+#define ROHC_PROFILE_RTP 1
+#define ROHC_PROFILE_UDP 2
+#define ROHC_PROFILE_IP 4
+#define ROHC_PROFILE_UNKNOWN 0xFFFF
+
+enum rohc_mode
+{
+ MODE_NOT_SET = 0,
+ UNIDIRECTIONAL = 1,
+ OPTIMISTIC_BIDIRECTIONAL = 2,
+ RELIABLE_BIDIRECTIONAL = 3
+};
+
+enum rohc_d_mode
+{
+ NO_CONTEXT = 1,
+ STATIC_CONTEXT = 2,
+ FULL_CONTEXT = 3
+};
+typedef struct rohc_info
+{
+ gboolean rohc_compression;
+ guint8 rohc_ip_version;
+ gboolean cid_inclusion_info;
+ gboolean large_cid_present;
+ enum rohc_mode mode;
+ gboolean rnd;
+ gboolean udp_checksum_present;
+ guint16 profile;
+ proto_item *last_created_item;
+} rohc_info;
+
+
+typedef struct rohc_context
+{
+ guint8 rohc_ip_version[MAX_CID+1];
+ gboolean large_cid_present[MAX_CID+1];
+ enum rohc_mode mode[MAX_CID+1];
+ enum rohc_d_mode d_mode[MAX_CID+1];
+ gboolean rnd[MAX_CID+1];
+ gboolean udp_checkum_present[MAX_CID+1];
+ guint16 profile[MAX_CID+1];
+ gboolean rohc_context_init[MAX_CID+1];
+ gint ir_frame_number[MAX_CID+1]; /* The frame number of the last IR packet seen */
+
+} rohc_context;
+
+#endif /* PACKET_ROHC_H */
diff --git a/openair2/UTIL/OPT/probe.c b/openair2/UTIL/OPT/probe.c
index 3f416c9255..2966c4672c 100644
--- a/openair2/UTIL/OPT/probe.c
+++ b/openair2/UTIL/OPT/probe.c
@@ -128,12 +128,6 @@ typedef struct {
opt_listener_t opt_listener;
-static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType,
- guint16 rnti, guint16 ueid, guint16 sysframeNumber,
- guint8 isPredefinedData, guint8 retx, guint8 crcStatus,
- guint8 oob_event, guint8 oob_event_value,
- uint8_t *pdu_buffer, unsigned int pdu_buffer_size);
-
unsigned short checksum(unsigned short *ptr, int length) {
int sum = 0;
u_short answer = 0;
@@ -152,7 +146,7 @@ unsigned short checksum(unsigned short *ptr, int length) {
}
/* Write an individual PDU (PCAP packet header + mac-context + mac-pdu) */
-static int MAC_LTE_PCAP_WritePDU(const uint8_t *PDU,
+static int PCAP_WritePDU(const uint8_t *PDU,
unsigned int length) {
pcaprec_hdr_t packet_header;
// IPv4 header
@@ -288,7 +282,7 @@ int opt_create_listener_socket(char *ip_address, uint16_t port) {
*/
/* Add framing header to MAC PDU and send. */
static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType,
- guint16 rnti, guint16 ueid, guint16 sfnSf,
+ guint16 rnti, guint16 ueid, guint16 frame, guint16 subframe,
guint8 isPredefinedData, guint8 retx, guint8 crcStatus,
guint8 oob_event, guint8 oob_event_value,
uint8_t *pdu_buffer, unsigned int pdu_buffer_size) {
@@ -317,9 +311,9 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType,
tmp16 = htons(ueid);
memcpy(frameBuffer+frameOffset, &tmp16, 2);
frameOffset += 2;
- /* Subframe number */
+ /* Subframe number */
frameBuffer[frameOffset++] = MAC_LTE_FRAME_SUBFRAME_TAG;
- tmp16 = htons(sfnSf); // frame counter : this will give an expert info as wireshark expects SF and not F
+ tmp16 = htons((frame<<4)+subframe); // frame counter : this will give an expert info as wireshark expects SF and not F
memcpy(frameBuffer+frameOffset, &tmp16, 2);
frameOffset += 2;
frameBuffer[frameOffset++] = MAC_LTE_CRC_STATUS_TAG;
@@ -400,7 +394,72 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType,
bytesSent = sendto(g_socksd, frameBuffer, frameOffset, 0,
(const struct sockaddr *)&g_serv_addr, sizeof(g_serv_addr));
else
- bytesSent = MAC_LTE_PCAP_WritePDU(frameBuffer, frameOffset);
+ bytesSent = PCAP_WritePDU(frameBuffer, frameOffset);
+
+ if (bytesSent != frameOffset) {
+ LOG_W(OPT, "trace_pdu expected %d bytes, got %ld (errno=%d)\n",
+ frameOffset, bytesSent, errno);
+ //exit(1);
+ }
+}
+
+static void SendFrameNR(guint8 radioType, guint8 direction, guint8 rntiType,
+ guint16 rnti, guint16 ueid, guint16 frame, guint16 subframe,
+ guint8 isPredefinedData, guint8 retx, guint8 crcStatus,
+ guint8 oob_event, guint8 oob_event_value,
+ uint8_t *pdu_buffer, unsigned int pdu_buffer_size) {
+ unsigned char frameBuffer[9000];
+ unsigned int frameOffset;
+ ssize_t bytesSent;
+ frameOffset = 0;
+ uint16_t tmp16;
+ memcpy(frameBuffer+frameOffset, MAC_NR_START_STRING,
+ strlen(MAC_NR_START_STRING));
+ frameOffset += strlen(MAC_NR_START_STRING);
+ /******************************************************************************/
+ /* Now write out fixed fields (the mandatory elements of struct mac_lte_info) */
+ frameBuffer[frameOffset++] = radioType;
+ frameBuffer[frameOffset++] = direction;
+ frameBuffer[frameOffset++] = rntiType;
+ /*************************************/
+ /* Now optional fields */
+ /* RNTI */
+ frameBuffer[frameOffset++] = MAC_NR_RNTI_TAG;
+ tmp16 = htons(rnti);
+ memcpy(frameBuffer+frameOffset, &tmp16, 2);
+ frameOffset += 2;
+ /* UEId */
+ frameBuffer[frameOffset++] = MAC_NR_UEID_TAG;
+ tmp16 = htons(ueid);
+ memcpy(frameBuffer+frameOffset, &tmp16, 2);
+ frameOffset += 2;
+ /* Subframe number */
+ frameBuffer[frameOffset++] = MAC_NR_FRAME_SLOT_TAG;
+ tmp16 = htons(frame); // frame counter : this will give an expert info as wireshark expects SF and not F
+ memcpy(frameBuffer+frameOffset, &tmp16, 2);
+ frameOffset += 2;
+ tmp16 = htons(subframe); // frame counter : this will give an expert info as wireshark expects SF and not F
+ memcpy(frameBuffer+frameOffset, &tmp16, 2);
+ frameOffset += 2;
+
+ /***************************************/
+ /* Now write the MAC PDU */
+ frameBuffer[frameOffset++] = MAC_NR_PAYLOAD_TAG;
+
+ /* Append actual PDU */
+ //memcpy(frameBuffer+frameOffset, g_PDUBuffer, g_PDUOffset);
+ //frameOffset += g_PDUOffset;
+ if (pdu_buffer != NULL) {
+ memcpy(frameBuffer+frameOffset, (void *)pdu_buffer, pdu_buffer_size);
+ frameOffset += pdu_buffer_size;
+ }
+
+ if ( opt_type == OPT_WIRESHARK )
+ /* Send out the data over the UDP socket */
+ bytesSent = sendto(g_socksd, frameBuffer, frameOffset, 0,
+ (const struct sockaddr *)&g_serv_addr, sizeof(g_serv_addr));
+ else
+ bytesSent = PCAP_WritePDU(frameBuffer, frameOffset);
if (bytesSent != frameOffset) {
LOG_W(OPT, "trace_pdu expected %d bytes, got %ld (errno=%d)\n",
@@ -413,20 +472,23 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType,
extern RAN_CONTEXT_t RC;
#include
/* Remote serveraddress (where Wireshark is running) */
-void trace_pdu_implementation(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
+void trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
int ueid, int rntiType, int rnti, uint16_t sysFrameNumber, uint8_t subFrameNumber, int oob_event,
int oob_event_value) {
int radioType=FDD_RADIO;
LOG_D(OPT,"sending packet to wireshark: direction=%s, size: %d, ueid: %d, rnti: %x, frame/sf: %d.%d\n",
direction?"DL":"UL", pdu_buffer_size, ueid, rnti, sysFrameNumber,subFrameNumber);
- if (RC.eNB && RC.eNB[0][0]!=NULL)
- radioType=RC.eNB[0][0]->frame_parms.frame_type== FDD ? FDD_RADIO:TDD_RADIO;
- else if (PHY_vars_UE_g && PHY_vars_UE_g[0][0] != NULL)
- radioType=PHY_vars_UE_g[0][0]->frame_parms.frame_type== FDD ? FDD_RADIO:TDD_RADIO;
- else {
- LOG_E(OPT,"not a eNB neither a UE!!! \n");
- return;
+ if (nr) {
+ radioType=TDD_RADIO;
+ } else {
+ if (RC.eNB && RC.eNB[0][0]!=NULL)
+ radioType=RC.eNB[0][0]->frame_parms.frame_type== FDD ? FDD_RADIO:TDD_RADIO;
+ else if (PHY_vars_UE_g && PHY_vars_UE_g[0][0] != NULL)
+ radioType=PHY_vars_UE_g[0][0]->frame_parms.frame_type== FDD ? FDD_RADIO:TDD_RADIO;
+ else {
+ LOG_E(OPT,"not a 4G eNB neither a 4G UE!!! \n");
+ }
}
switch (opt_type) {
@@ -448,9 +510,17 @@ void trace_pdu_implementation(int direction, uint8_t *pdu_buffer, unsigned int p
break;
}
+ if (nr)
+ SendFrameNR( radioType,
+ (direction == DIRECTION_DOWNLINK) ? DIRECTION_DOWNLINK : DIRECTION_UPLINK,
+ rntiType, rnti, ueid, sysFrameNumber, subFrameNumber,
+ 1, 0, 1, //guint8 isPredefinedData, guint8 retx, guint8 crcStatus
+ oob_event,oob_event_value,
+ pdu_buffer, pdu_buffer_size);
+ else
SendFrame( radioType,
(direction == DIRECTION_DOWNLINK) ? DIRECTION_DOWNLINK : DIRECTION_UPLINK,
- rntiType, rnti, ueid, (sysFrameNumber<<4) + subFrameNumber,
+ rntiType, rnti, ueid, sysFrameNumber, subFrameNumber,
1, 0, 1, //guint8 isPredefinedData, guint8 retx, guint8 crcStatus
oob_event,oob_event_value,
pdu_buffer, pdu_buffer_size);
diff --git a/openair3/GTPV1-U/gtpv1u_eNB.c b/openair3/GTPV1-U/gtpv1u_eNB.c
index 847002ab44..e1ea5cb08e 100644
--- a/openair3/GTPV1-U/gtpv1u_eNB.c
+++ b/openair3/GTPV1-U/gtpv1u_eNB.c
@@ -51,6 +51,7 @@
#include "gtpv1u_eNB_defs.h"
#include "gtpv1u_eNB_task.h"
#include "rrc_eNB_GTPV1U.h"
+#include
#undef GTP_DUMP_SOCKET
@@ -308,7 +309,7 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req(
msgsrc != GTPV1U_MSG_FROM_SOURCE_ENB? "UDP DATA" :
msgType == NW_GTP_END_MARKER?"END MARKER":"DATA FORWARDING");
- /* target enb */
+ /* target enb */
if(msgType == NW_GTP_END_MARKER) {
LOG_I(GTPU, "target end receive END MARKER\n");
ue_context_p->ue_context.handover_info->state = HO_END_MARKER;
@@ -1497,15 +1498,15 @@ void *gtpv1u_eNB_process_itti_msg(void *notUsed) {
stack_req.apiInfo.sendtoInfo.teid = tenb_x2u_teid;
stack_req.apiInfo.sendtoInfo.ipAddr = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].tenb_ip_addr;// target enb ip
rc = nwGtpv1uGpduMsgNew(
- RC.gtpv1u_data_g->gtpv1u_stack,
- tenb_x2u_teid,
- NW_FALSE,
- RC.gtpv1u_data_g->seq_num++,
- data_req_p->buffer,
- data_req_p->length,
- data_req_p->offset,
- &(stack_req.apiInfo.sendtoInfo.hMsg));
-
+ RC.gtpv1u_data_g->gtpv1u_stack,
+ tenb_x2u_teid,
+ NW_FALSE,
+ RC.gtpv1u_data_g->seq_num++,
+ data_req_p->buffer,
+ data_req_p->length,
+ data_req_p->offset,
+ &(stack_req.apiInfo.sendtoInfo.hMsg));
+
if (rc != NW_GTPV1U_OK) {
LOG_E(GTPU, "nwGtpv1uGpduMsgNew failed: 0x%x\n", rc);
MSC_LOG_EVENT(MSC_GTPU_ENB,"0 Failed send G-PDU ltid %u rtid %u size %u",
@@ -1515,7 +1516,7 @@ void *gtpv1u_eNB_process_itti_msg(void *notUsed) {
pMsg = (NwGtpv1uMsgT *) stack_req.apiInfo.sendtoInfo.hMsg;
pMsg->msgType = NW_GTP_END_MARKER;
rc = nwGtpv1uProcessUlpReq(RC.gtpv1u_data_g->gtpv1u_stack, &stack_req);
-
+
if (rc != NW_GTPV1U_OK) {
LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: 0x%x\n", rc);
MSC_LOG_EVENT(MSC_GTPU_ENB,"0 Failed send G-PDU ltid %u rtid %u size %u",
@@ -1535,11 +1536,11 @@ void *gtpv1u_eNB_process_itti_msg(void *notUsed) {
rc = nwGtpv1uMsgDelete(RC.gtpv1u_data_g->gtpv1u_stack,
stack_req.apiInfo.sendtoInfo.hMsg);
-
+
if (rc != NW_GTPV1U_OK) {
LOG_E(GTPU, "nwGtpv1uMsgDelete failed: 0x%x\n", rc);
}
-
+
gtpv1u_enb_delete_tunnel_req_t delete_tunnel_req;
memset(&delete_tunnel_req, 0, sizeof(delete_tunnel_req));
delete_tunnel_req.rnti = data_req_p->rnti;
@@ -1547,7 +1548,7 @@ void *gtpv1u_eNB_process_itti_msg(void *notUsed) {
}
}
}
-
+
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_PROCESS_TUNNEL_DATA_REQ, VCD_FUNCTION_OUT);
}
break;
diff --git a/openair3/GTPV1-U/gtpv1u_gNB.c b/openair3/GTPV1-U/gtpv1u_gNB.c
index 956ab0a4b3..cc21b27ab5 100644
--- a/openair3/GTPV1-U/gtpv1u_gNB.c
+++ b/openair3/GTPV1-U/gtpv1u_gNB.c
@@ -52,6 +52,9 @@
#undef GTP_DUMP_SOCKET
+#undef GTPV1U_BEARER_OFFSET
+#define GTPV1U_BEARER_OFFSET 1
+
extern unsigned char NB_eNB_INST;
extern RAN_CONTEXT_t RC;
diff --git a/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c b/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c
index 0c7663921b..5479e176eb 100644
--- a/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c
+++ b/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c
@@ -59,6 +59,7 @@
extern "C" {
#endif
+#define LOG_GTPU 1
/*--------------------------------------------------------------------------*
* P R I V A T E F U N C T I O N S *
*--------------------------------------------------------------------------*/
diff --git a/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishRequest.c b/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishRequest.c
index bc4d34d650..1c9198b720 100644
--- a/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishRequest.c
+++ b/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishRequest.c
@@ -54,6 +54,8 @@ int encode_pdu_session_establishment_request(pdu_session_establishment_request_m
encoded++;
IES_ENCODE_U16(buffer, encoded, pdusessionestablishrequest->maxdatarate);
+ *(buffer + encoded) = pdusessionestablishrequest->pdusessiontype;
+ encoded++;
return encoded;
}
diff --git a/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishRequest.h b/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishRequest.h
index ac5b250f66..e2742ebc38 100644
--- a/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishRequest.h
+++ b/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishRequest.h
@@ -53,6 +53,7 @@ typedef struct pdu_session_establishment_request_msg_tag {
uint8_t pti;
MessageType pdusessionestblishmsgtype;
uint16_t maxdatarate;
+ uint8_t pdusessiontype;
/* Optional fields */
} pdu_session_establishment_request_msg;
diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.c b/openair3/NAS/NR_UE/nr_nas_msg_sim.c
index 008ecc8e36..d862091776 100644
--- a/openair3/NAS/NR_UE/nr_nas_msg_sim.c
+++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.c
@@ -40,12 +40,20 @@
#include "PduSessionEstablishRequest.h"
# include "intertask_interface.h"
-char netName[] = "5G:mnc093.mcc208.3gppnetwork.org";
+/*char netName[] = "5G:mnc093.mcc208.3gppnetwork.org";
char imsi[] = "2089300007487";
// USIM_API_K: 5122250214c33e723a5dd523fc145fc0
uint8_t k[16] = {0x51, 0x22, 0x25, 0x02, 0x14,0xc3, 0x3e, 0x72, 0x3a, 0x5d, 0xd5, 0x23, 0xfc, 0x14, 0x5f, 0xc0};
// OPC: 981d464c7c52eb6e5036234984ad0bcf
-const uint8_t opc[16] = {0x98, 0x1d, 0x46, 0x4c,0x7c,0x52,0xeb, 0x6e, 0x50, 0x36, 0x23, 0x49, 0x84, 0xad, 0x0b, 0xcf};
+const uint8_t opc[16] = {0x98, 0x1d, 0x46, 0x4c,0x7c,0x52,0xeb, 0x6e, 0x50, 0x36, 0x23, 0x49, 0x84, 0xad, 0x0b, 0xcf};*/
+
+
+char netName[] = "5G:mnc099.mcc208.3gppnetwork.org";
+char imsi[] = "2089900007487"; //"208990100001100";
+// USIM_API_K: fe c8 6b a6 eb 70 7e d0 89 05 75 7b 1b b4 4b 8f
+uint8_t k[16] = {0xfe, 0xc8, 0x6b, 0xa6, 0xeb, 0x70, 0x7e, 0xd0, 0x89, 0x05, 0x75, 0x7b, 0x1b, 0xb4, 0x4b, 0x8f};
+// OPC: c4 24 49 36 3b ba d0 2b 66 d1 6b c9 75 d7 7c c1
+const uint8_t opc[16] = {0xc4, 0x24, 0x49, 0x36, 0x3b, 0xba, 0xd0, 0x2b, 0x66, 0xd1, 0x6b, 0xc9, 0x75, 0xd7, 0x7c, 0xc1};
uint8_t *registration_request_buf;
uint32_t registration_request_len;
@@ -275,14 +283,14 @@ void generateRegistrationRequest(as_nas_info_t *initialNasMsg) {
mm_msg->registration_request.fgsregistrationtype = INITIAL_REGISTRATION;
mm_msg->registration_request.naskeysetidentifier.naskeysetidentifier = 1;
size += 1;
- if(1){
+ if(0){
mm_msg->registration_request.fgsmobileidentity.guti.typeofidentity = FGS_MOBILE_IDENTITY_5G_GUTI;
mm_msg->registration_request.fgsmobileidentity.guti.amfregionid = 0xca;
mm_msg->registration_request.fgsmobileidentity.guti.amfpointer = 0;
mm_msg->registration_request.fgsmobileidentity.guti.amfsetid = 1016;
mm_msg->registration_request.fgsmobileidentity.guti.tmsi = 10;
mm_msg->registration_request.fgsmobileidentity.guti.mncdigit1 = 9;
- mm_msg->registration_request.fgsmobileidentity.guti.mncdigit2 = 3;
+ mm_msg->registration_request.fgsmobileidentity.guti.mncdigit2 = 9;
mm_msg->registration_request.fgsmobileidentity.guti.mncdigit3 = 0xf;
mm_msg->registration_request.fgsmobileidentity.guti.mccdigit1 = 2;
mm_msg->registration_request.fgsmobileidentity.guti.mccdigit2 = 0;
@@ -293,7 +301,7 @@ void generateRegistrationRequest(as_nas_info_t *initialNasMsg) {
} else {
mm_msg->registration_request.fgsmobileidentity.suci.typeofidentity = FGS_MOBILE_IDENTITY_SUCI;
mm_msg->registration_request.fgsmobileidentity.suci.mncdigit1 = 9;
- mm_msg->registration_request.fgsmobileidentity.suci.mncdigit2 = 3;
+ mm_msg->registration_request.fgsmobileidentity.suci.mncdigit2 = 9;
mm_msg->registration_request.fgsmobileidentity.suci.mncdigit3 = 0xf;
mm_msg->registration_request.fgsmobileidentity.suci.mccdigit1 = 2;
mm_msg->registration_request.fgsmobileidentity.suci.mccdigit2 = 0;
@@ -350,7 +358,7 @@ void generateIdentityResponse(as_nas_info_t *initialNasMsg, uint8_t identitytype
if(identitytype == FGS_MOBILE_IDENTITY_SUCI){
mm_msg->fgs_identity_response.fgsmobileidentity.suci.typeofidentity = FGS_MOBILE_IDENTITY_SUCI;
mm_msg->fgs_identity_response.fgsmobileidentity.suci.mncdigit1 = 9;
- mm_msg->fgs_identity_response.fgsmobileidentity.suci.mncdigit2 = 3;
+ mm_msg->fgs_identity_response.fgsmobileidentity.suci.mncdigit2 = 9;
mm_msg->fgs_identity_response.fgsmobileidentity.suci.mncdigit3 = 0xf;
mm_msg->fgs_identity_response.fgsmobileidentity.suci.mccdigit1 = 2;
mm_msg->fgs_identity_response.fgsmobileidentity.suci.mccdigit2 = 0;
@@ -614,14 +622,15 @@ void generatePduSessionEstablishRequest(as_nas_info_t *initialNasMsg){
memset(&nas_msg, 0, sizeof(fgs_nas_message_t));
// setup pdu session establishment request
- uint16_t req_length = 6;
+ uint16_t req_length = 7;
uint8_t *req_buffer = malloc(req_length);
pdu_session_establishment_request_msg pdu_session_establish;
pdu_session_establish.protocoldiscriminator = FGS_SESSION_MANAGEMENT_MESSAGE;
pdu_session_establish.pdusessionid = 10;
- pdu_session_establish.pti = 0;
+ pdu_session_establish.pti = 1;
pdu_session_establish.pdusessionestblishmsgtype = FGS_PDU_SESSION_ESTABLISHMENT_REQ;
pdu_session_establish.maxdatarate = 0xffff;
+ pdu_session_establish.pdusessiontype = 0x91;
encode_pdu_session_establishment_request(&pdu_session_establish, req_buffer);
@@ -629,9 +638,8 @@ void generatePduSessionEstablishRequest(as_nas_info_t *initialNasMsg){
MM_msg *mm_msg;
nas_stream_cipher_t stream_cipher;
uint8_t mac[4];
- uint8_t nssai[]={1,1,2,3};
- uint8_t dnn[9]={0x8,0x69,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74};
- // set security protected header
+ uint8_t nssai[]={1,0,0,1}; //Corresponding to SST:1, SD:1
+ uint8_t dnn[4]={0x4,0x6f,0x61,0x69}; //Corresponding to dnn:"oai"
nas_msg.header.protocol_discriminator = FGS_MOBILITY_MANAGEMENT_MESSAGE;
nas_msg.header.security_header_type = INTEGRITY_PROTECTED_AND_CIPHERED_WITH_NEW_SECU_CTX;
size += 7;
@@ -663,9 +671,9 @@ void generatePduSessionEstablishRequest(as_nas_info_t *initialNasMsg){
mm_msg->uplink_nas_transport.snssai.length = 4;
mm_msg->uplink_nas_transport.snssai.value = nssai;
size += (1+1+4);
- mm_msg->uplink_nas_transport.dnn.length = 9;
+ mm_msg->uplink_nas_transport.dnn.length = 4;
mm_msg->uplink_nas_transport.dnn.value = dnn;
- size += (1+1+9);
+ size += (1+1+4);
// encode the message
initialNasMsg->data = (Byte_t *)malloc(size * sizeof(Byte_t));
diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c
index 178f21a44a..be887623bb 100644
--- a/openair3/NAS/UE/nas_ue_task.c
+++ b/openair3/NAS/UE/nas_ue_task.c
@@ -33,6 +33,7 @@
# include "memory.h"
#include "nas_user.h"
+#include
// FIXME make command line option for NAS_UE_AUTOSTART
# define NAS_UE_AUTOSTART 1
diff --git a/openair3/NGAP/ngap_common.h b/openair3/NGAP/ngap_common.h
index f0302a88c7..283dd2bffa 100644
--- a/openair3/NGAP/ngap_common.h
+++ b/openair3/NGAP/ngap_common.h
@@ -142,9 +142,12 @@ extern int asn1_xer_print;
} \
} \
if (ie == NULL ) { \
- NGAP_ERROR("NGAP_FIND_PROTOCOLIE_BY_ID: %s %d: ie is NULL\n",__FILE__,__LINE__);\
+ if (mandatory) {\
+ NGAP_ERROR("NGAP_FIND_PROTOCOLIE_BY_ID: %s %d: ie is NULL (searching for ie: %ld)\n",__FILE__,__LINE__, IE_ID);\
+ abort();\
+ }\
+ else NGAP_INFO("NGAP_FIND_PROTOCOLIE_BY_ID: %s %d: ie is NULL (searching for ie: %ld)\n",__FILE__,__LINE__, IE_ID);\
} \
- if (mandatory) DevAssert(ie != NULL); \
} while(0)
/** \brief Function callback prototype.
**/
diff --git a/openair3/NGAP/ngap_gNB_handlers.c b/openair3/NGAP/ngap_gNB_handlers.c
index f143002537..401695473c 100644
--- a/openair3/NGAP/ngap_gNB_handlers.c
+++ b/openair3/NGAP/ngap_gNB_handlers.c
@@ -657,6 +657,7 @@ int ngap_gNB_handle_error_indication(uint32_t assoc_id,
case NGAP_CauseRadioNetwork_up_integrity_protection_not_possible:
NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_up_integrity_protection_not_possible\n");
break;
+
case NGAP_CauseRadioNetwork_up_confidentiality_protection_not_possible:
NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_up_confidentiality_protection_not_possible\n");
break;
@@ -1030,6 +1031,12 @@ int ngap_gNB_handle_initial_context_request(uint32_t assoc_id,
/* Set the QOS informations */
NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].qos[qosIdx].qfi = (uint8_t)qosFlowItem_p->qosFlowIdentifier;
+ if(qosFlowItem_p->qosFlowLevelQosParameters.qosCharacteristics.present == NGAP_QosCharacteristics_PR_nonDynamic5QI){
+ if(qosFlowItem_p->qosFlowLevelQosParameters.qosCharacteristics.choice.nonDynamic5QI != NULL){
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].qos[qosIdx].fiveQI =
+ (uint64_t)qosFlowItem_p->qosFlowLevelQosParameters.qosCharacteristics.choice.nonDynamic5QI->fiveQI;
+ }
+ }
NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].qos[qosIdx].allocation_retention_priority.priority_level =
qosFlowItem_p->qosFlowLevelQosParameters.allocationAndRetentionPriority.priorityLevelARP;
@@ -1061,13 +1068,33 @@ int ngap_gNB_handle_initial_context_request(uint32_t assoc_id,
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
NGAP_ProtocolIE_ID_id_AllowedNSSAI, true);
- if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ //if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
NGAP_AllowedNSSAI_Item_t *allow_nssai_item_p = NULL;
-
- NGAP_DEBUG("AllowedNSSAI.list.count %d\n", ie->value.choice.AllowedNSSAI.list.count);
- DevAssert(ie->value.choice.AllowedNSSAI.list.count > 0);
- DevAssert(ie->value.choice.AllowedNSSAI.list.count <= NGAP_maxnoofAllowedS_NSSAIs);
+ //NGAP_DEBUG("AllowedNSSAI.list.count %d\n", ie->value.choice.AllowedNSSAI.list.count);
+ //DevAssert(ie->value.choice.AllowedNSSAI.list.count > 0);
+ //DevAssert(ie->value.choice.AllowedNSSAI.list.count <= NGAP_maxnoofAllowedS_NSSAIs);
+
+ if (ie == NULL) {
+ NGAP_WARN("AllowedNSSAI not present, forging 2 NSSAI\n");
+
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).nb_allowed_nssais = 2;
+
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[0].sST = 01;
+
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[0].sD_flag = 1;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[0].sD[0] = 01;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[0].sD[1] = 02;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[0].sD[2] = 03;
+
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[1].sST = 01;
+
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[1].sD_flag = 1;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[1].sD[0] = 00;//11;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[1].sD[1] = 00;//22;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[1].sD[2] = 01;//33;
+ } else {
+ NGAP_INFO("AllowedNSSAI.list.count %d\n", ie->value.choice.AllowedNSSAI.list.count);
NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).nb_allowed_nssais = ie->value.choice.AllowedNSSAI.list.count;
for(i = 0; i < ie->value.choice.AllowedNSSAI.list.count; i++) {
@@ -1082,9 +1109,10 @@ int ngap_gNB_handle_initial_context_request(uint32_t assoc_id,
NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[i].sD[2] = allow_nssai_item_p->s_NSSAI.sD->buf[2];
}
}
- } else {/* ie != NULL */
- return -1;
- }
+ }
+ //} else {/* ie != NULL */
+ // return -1;
+ //}
/* id-UESecurityCapabilities */
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
diff --git a/openair3/NGAP/ngap_gNB_nas_procedures.c b/openair3/NGAP/ngap_gNB_nas_procedures.c
index 3711072682..4e149d9e27 100644
--- a/openair3/NGAP/ngap_gNB_nas_procedures.c
+++ b/openair3/NGAP/ngap_gNB_nas_procedures.c
@@ -656,6 +656,7 @@ int ngap_gNB_initial_ctxt_resp(
NGAP_InitialContextSetupResponse_t *out;
NGAP_InitialContextSetupResponseIEs_t *ie;
uint8_t *buffer = NULL;
+ uint8_t pdusessionTransfer_buffer[1000];
uint32_t length;
int i;
asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
@@ -729,7 +730,8 @@ int ngap_gNB_initial_ctxt_resp(
pdusessionTransfer_p = (NGAP_PDUSessionResourceSetupResponseTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseTransfer_t));
pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.present = NGAP_UPTransportLayerInformation_PR_gTPTunnel;
-
+
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel = (NGAP_GTPTunnel_t *)calloc(1, sizeof(NGAP_GTPTunnel_t));
GTP_TEID_TO_ASN1(initial_ctxt_resp_p->pdusessions[i].gtp_teid, &pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->gTP_TEID);
pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf = malloc(initial_ctxt_resp_p->pdusessions[i].gNB_addr.length);
@@ -757,17 +759,27 @@ int ngap_gNB_initial_ctxt_resp(
ass_qos_item_p->qosFlowIdentifier = initial_ctxt_resp_p->pdusessions[i].associated_qos_flows[j].qfi;
/* qosFlowMappingIndication */
- if(initial_ctxt_resp_p->pdusessions[i].associated_qos_flows[j].qos_flow_mapping_ind != QOSFLOW_MAPPING_INDICATION_NON) {
- ass_qos_item_p->qosFlowMappingIndication = malloc(sizeof(*ass_qos_item_p->qosFlowMappingIndication));
- *ass_qos_item_p->qosFlowMappingIndication = initial_ctxt_resp_p->pdusessions[i].associated_qos_flows[j].qos_flow_mapping_ind;
- }
+ //if(initial_ctxt_resp_p->pdusessions[i].associated_qos_flows[j].qos_flow_mapping_ind != QOSFLOW_MAPPING_INDICATION_NON) {
+ // ass_qos_item_p->qosFlowMappingIndication = malloc(sizeof(*ass_qos_item_p->qosFlowMappingIndication));
+ // *ass_qos_item_p->qosFlowMappingIndication = initial_ctxt_resp_p->pdusessions[i].associated_qos_flows[j].qos_flow_mapping_ind;
+ // }
ASN_SEQUENCE_ADD(&pdusessionTransfer_p->dLQosFlowPerTNLInformation.associatedQosFlowList.list, ass_qos_item_p);
}
memset(&res, 0, sizeof(res));
- res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
- item->pDUSessionResourceSetupResponseTransfer.buf = res.buffer;
- item->pDUSessionResourceSetupResponseTransfer.size = res.result.encoded;
+ //res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
+ //item->pDUSessionResourceSetupResponseTransfer.buf = res.buffer;
+ //item->pDUSessionResourceSetupResponseTransfer.size = res.result.encoded;
+
+ xer_fprint(stdout, &asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
+ memset(pdusessionTransfer_buffer, 0, 1000);
+ asn_enc_rval_t enc_rval = aper_encode_to_buffer(&asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer,
+ NULL,
+ pdusessionTransfer_p,
+ pdusessionTransfer_buffer,1000);
+ AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded);
+ item->pDUSessionResourceSetupResponseTransfer.buf = pdusessionTransfer_buffer;
+ item->pDUSessionResourceSetupResponseTransfer.size = enc_rval.encoded;
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
@@ -846,6 +858,8 @@ int ngap_gNB_initial_ctxt_resp(
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
+ xer_fprint(stdout, &asn_DEF_NGAP_NGAP_PDU, &pdu);
+
if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
NGAP_ERROR("Failed to encode InitialContextSetupResponse\n");
/* Encode procedure has failed... */
@@ -932,7 +946,7 @@ int ngap_gNB_ue_capabilities(instance_t instance,
/* mandatory */
ie = (NGAP_UERadioCapabilityInfoIndicationIEs_t *)calloc(1, sizeof(NGAP_UERadioCapabilityInfoIndicationIEs_t));
ie->id = NGAP_ProtocolIE_ID_id_UERadioCapability;
- ie->criticality = NGAP_Criticality_reject;
+ ie->criticality = NGAP_Criticality_ignore;
ie->value.present = NGAP_UERadioCapabilityInfoIndicationIEs__value_PR_UERadioCapability;
ie->value.choice.UERadioCapability.buf = ue_cap_info_ind_p->ue_radio_cap.buffer;
ie->value.choice.UERadioCapability.size = ue_cap_info_ind_p->ue_radio_cap.length;
diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp
new file mode 100644
index 0000000000..2862a4d906
--- /dev/null
+++ b/openair3/ocp-gtpu/gtp_itf.cpp
@@ -0,0 +1,886 @@
+#include