Merge remote-tracking branch 'origin/develop-CSI' into develop-CSI-Measurements
# Conflicts: # openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c # openair1/PHY/NR_TRANSPORT/nr_dci.c # openair1/PHY/NR_TRANSPORT/pucch_rx.c # openair2/GNB_APP/gnb_config.c # openair2/GNB_APP/gnb_paramdef.h # openair2/LAYER2/NR_MAC_gNB/config.c # openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c # openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c # openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c # openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c # openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c # openair2/RRC/NR/MESSAGES/asn1_msg.c # targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp # targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf
This commit is contained in:
@@ -294,6 +294,9 @@ class Containerize():
|
|||||||
if image != 'ran-build':
|
if image != 'ran-build':
|
||||||
mySSH.command('sed -i -e "s#' + "ran-build" + ':latest#' + "ran-build" + ':' + imageTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5)
|
mySSH.command('sed -i -e "s#' + "ran-build" + ':latest#' + "ran-build" + ':' + imageTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5)
|
||||||
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200)
|
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200)
|
||||||
|
# Flatten Image
|
||||||
|
if image != 'ran-build':
|
||||||
|
mySSH.command('python3 ./ci-scripts/flatten_image.py --tag ' + image + ':' + imageTag, '\$', 300)
|
||||||
# split the log
|
# split the log
|
||||||
mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5)
|
mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5)
|
||||||
mySSH.command('python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/' + image + '.log', '\$', 5)
|
mySSH.command('python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/' + image + '.log', '\$', 5)
|
||||||
|
|||||||
@@ -0,0 +1,304 @@
|
|||||||
|
Active_gNBs = ( "gNB-OAI");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
gNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
gNB_CU_ID = 0xe00;
|
||||||
|
|
||||||
|
# cell_type = "CELL_MACRO_GNB";
|
||||||
|
|
||||||
|
gNB_name = "gNB-OAI";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
|
||||||
|
plmn_list = ({
|
||||||
|
mcc = 208;
|
||||||
|
mnc = 97;
|
||||||
|
mnc_length = 2;
|
||||||
|
snssaiList = (
|
||||||
|
{
|
||||||
|
sst = 1;
|
||||||
|
sd = 0x010203; // 0 false, else true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sst = 1;
|
||||||
|
sd = 0x112233; // 0 false, else true
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
# tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
ssb_SubcarrierOffset = 0;
|
||||||
|
pusch_AntennaPorts = 2;
|
||||||
|
ul_prbblacklist = "51,52,53,54"
|
||||||
|
do_SRS = 1;
|
||||||
|
|
||||||
|
pdcch_ConfigSIB1 = (
|
||||||
|
{
|
||||||
|
controlResourceSetZero = 11;
|
||||||
|
searchSpaceZero = 0;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
servingCellConfigCommon = (
|
||||||
|
{
|
||||||
|
#spCellConfigCommon
|
||||||
|
|
||||||
|
physCellId = 0;
|
||||||
|
|
||||||
|
# downlinkConfigCommon
|
||||||
|
#frequencyInfoDL
|
||||||
|
# this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6
|
||||||
|
#absoluteFrequencySSB = 620640;
|
||||||
|
# this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
|
||||||
|
absoluteFrequencySSB = 621312;
|
||||||
|
# this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2
|
||||||
|
#absoluteFrequencySSB = 634080;
|
||||||
|
# this is 3600.48 MHz
|
||||||
|
#absoluteFrequencySSB = 640032;
|
||||||
|
#dl_frequencyBand = 78;
|
||||||
|
# this is 3301.68 MHz
|
||||||
|
#dl_absoluteFrequencyPointA = 620112;
|
||||||
|
# this is 3300.60 MHz
|
||||||
|
dl_absoluteFrequencyPointA = 620040;
|
||||||
|
# this is 3502.56 MHz
|
||||||
|
#dl_absoluteFrequencyPointA = 633552;
|
||||||
|
# this is 3600.48 MHz
|
||||||
|
#dl_absoluteFrequencyPointA = 640032;
|
||||||
|
#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=0,L=106 (275*(L-1))+RBstart
|
||||||
|
initialDLBWPlocationAndBandwidth = 28875;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
|
#pdcch-ConfigCommon
|
||||||
|
initialDLBWPcontrolResourceSetZero = 11;
|
||||||
|
initialDLBWPsearchSpaceZero = 0;
|
||||||
|
|
||||||
|
#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 = 28875;
|
||||||
|
# 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 = 12;
|
||||||
|
preambleReceivedTargetPower = -104;
|
||||||
|
#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 = 4;
|
||||||
|
#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 = 3;
|
||||||
|
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 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,
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
# 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 = 5;
|
||||||
|
nrofDownlinkSlots = 2;
|
||||||
|
nrofDownlinkSymbols = 6;
|
||||||
|
nrofUplinkSlots = 2;
|
||||||
|
nrofUplinkSymbols = 4;
|
||||||
|
|
||||||
|
ssPBCH_BlockPower = -25;
|
||||||
|
}
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
////////// AMF parameters:
|
||||||
|
amf_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
GNB_INTERFACE_NAME_FOR_NG_AMF = "em1";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR";
|
||||||
|
GNB_INTERFACE_NAME_FOR_NGU = "em1";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR";
|
||||||
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
# pusch_TargetSNRx10 = 200;
|
||||||
|
# pucch_TargetSNRx10 = 150;
|
||||||
|
ulsch_max_frame_inactivity = 0;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
thread_pool_size = 8;
|
||||||
|
prach_dtx_threshold = 120;
|
||||||
|
# pucch0_dtx_threshold = 150;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 2
|
||||||
|
nb_rx = 2
|
||||||
|
att_tx = 0
|
||||||
|
att_rx = 0;
|
||||||
|
bands = [78];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 75;
|
||||||
|
eNB_instances = [0];
|
||||||
|
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||||
|
bf_weights = [0x00007fff, 0x0000];
|
||||||
|
##beamforming 1x4 matrix: 1 layer x 4 antennas
|
||||||
|
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
|
||||||
|
## beamforming 2x2 matrix:
|
||||||
|
# bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
|
||||||
|
## beamforming 4x4 matrix:
|
||||||
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
|
sf_extension = 0
|
||||||
|
sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
|
sl_ahead = 5;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||||
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
|
worker_config = "WORKER_ENABLE";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
security = {
|
||||||
|
# preferred ciphering algorithms
|
||||||
|
# the first one of the list that an UE supports in chosen
|
||||||
|
# valid values: nea0, nea1, nea2, nea3
|
||||||
|
ciphering_algorithms = ( "nea0" );
|
||||||
|
|
||||||
|
# preferred integrity algorithms
|
||||||
|
# the first one of the list that an UE supports in chosen
|
||||||
|
# valid values: nia0, nia1, nia2, nia3
|
||||||
|
integrity_algorithms = ( "nia2", "nia0" );
|
||||||
|
|
||||||
|
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||||
|
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||||
|
drb_ciphering = "yes";
|
||||||
|
drb_integrity = "no";
|
||||||
|
};
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
hw_log_level ="info";
|
||||||
|
phy_log_level ="info";
|
||||||
|
mac_log_level ="info";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
f1ap_log_level ="debug";
|
||||||
|
};
|
||||||
@@ -63,8 +63,8 @@ gNBs =
|
|||||||
dl_carrierBandwidth = 106;
|
dl_carrierBandwidth = 106;
|
||||||
#initialDownlinkBWP
|
#initialDownlinkBWP
|
||||||
#genericParameters
|
#genericParameters
|
||||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
# this is RBstart=0,L=106 (275*(L-1))+RBstart
|
||||||
initialDLBWPlocationAndBandwidth = 13475; # 6366 12925 12956 28875 12952
|
initialDLBWPlocationAndBandwidth = 28875;
|
||||||
# subcarrierSpacing
|
# subcarrierSpacing
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
initialDLBWPsubcarrierSpacing = 1;
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
@@ -85,7 +85,7 @@ gNBs =
|
|||||||
pMax = 20;
|
pMax = 20;
|
||||||
#initialUplinkBWP
|
#initialUplinkBWP
|
||||||
#genericParameters
|
#genericParameters
|
||||||
initialULBWPlocationAndBandwidth = 13475;
|
initialULBWPlocationAndBandwidth = 28875;
|
||||||
# subcarrierSpacing
|
# subcarrierSpacing
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
initialULBWPsubcarrierSpacing = 1;
|
initialULBWPsubcarrierSpacing = 1;
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
"""
|
||||||
|
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
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
args = _parse_args()
|
||||||
|
status = perform_flattening(args.tag)
|
||||||
|
sys.exit(status)
|
||||||
|
|
||||||
|
def _parse_args() -> argparse.Namespace:
|
||||||
|
parser = argparse.ArgumentParser(description='Flattening Image')
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'--tag', '-t',
|
||||||
|
action='store',
|
||||||
|
required=True,
|
||||||
|
help='Image Tag in image-name:image tag format',
|
||||||
|
)
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
def perform_flattening(tag):
|
||||||
|
# First detect which docker/podman command to use
|
||||||
|
cli = ''
|
||||||
|
image_prefix = ''
|
||||||
|
cmd = 'which podman || true'
|
||||||
|
podman_check = subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
||||||
|
if re.search('podman', podman_check.strip()):
|
||||||
|
cli = 'sudo podman'
|
||||||
|
image_prefix = 'localhost/'
|
||||||
|
if cli == '':
|
||||||
|
cmd = 'which docker || true'
|
||||||
|
docker_check = subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
||||||
|
if re.search('docker', docker_check.strip()):
|
||||||
|
cli = 'docker'
|
||||||
|
image_prefix = ''
|
||||||
|
if cli == '':
|
||||||
|
print ('No docker / podman installed: quitting')
|
||||||
|
return -1
|
||||||
|
print (f'Flattening {tag}')
|
||||||
|
|
||||||
|
# Creating a container
|
||||||
|
cmd = cli + ' run --name test-flatten --entrypoint /bin/true -d ' + tag
|
||||||
|
print (cmd)
|
||||||
|
subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
||||||
|
|
||||||
|
# Export / Import trick
|
||||||
|
cmd = cli + ' export test-flatten | ' + cli + ' import '
|
||||||
|
# Bizarro syntax issue with podman
|
||||||
|
if cli == 'docker':
|
||||||
|
cmd += ' --change "ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" '
|
||||||
|
else:
|
||||||
|
cmd += ' --change "ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" '
|
||||||
|
if re.search('oai-enb', tag):
|
||||||
|
cmd += ' --change "WORKDIR /opt/oai-enb" '
|
||||||
|
cmd += ' --change "EXPOSE 2152/udp" '
|
||||||
|
cmd += ' --change "EXPOSE 36412/udp" '
|
||||||
|
cmd += ' --change "EXPOSE 36422/udp" '
|
||||||
|
cmd += ' --change "CMD [\\"/opt/oai-enb/bin/lte-softmodem.Rel15\\", \\"-O\\", \\"/opt/oai-enb/etc/enb.conf\\"]" '
|
||||||
|
cmd += ' --change "ENTRYPOINT [\\"/opt/oai-enb/bin/entrypoint.sh\\"]" '
|
||||||
|
if re.search('oai-gnb', tag):
|
||||||
|
cmd += ' --change "WORKDIR /opt/oai-gnb" '
|
||||||
|
cmd += ' --change "EXPOSE 2152/udp" '
|
||||||
|
cmd += ' --change "EXPOSE 36422/udp" '
|
||||||
|
cmd += ' --change "CMD [\\"/opt/oai-gnb/bin/nr-softmodem.Rel15\\", \\"-O\\", \\"/opt/oai-gnb/etc/gnb.conf\\"]" '
|
||||||
|
cmd += ' --change "ENTRYPOINT [\\"/opt/oai-gnb/bin/entrypoint.sh\\"]" '
|
||||||
|
if re.search('oai-lte-ue', tag):
|
||||||
|
cmd += ' --change "WORKDIR /opt/oai-lte-ue" '
|
||||||
|
cmd += ' --change "CMD [\\"/opt/oai-lte-ue/bin/lte-uesoftmodem.Rel15\\"]" '
|
||||||
|
cmd += ' --change "ENTRYPOINT [\\"/opt/oai-lte-ue/bin/entrypoint.sh\\"]" '
|
||||||
|
if re.search('oai-nr-ue', tag):
|
||||||
|
cmd += ' --change "WORKDIR /opt/oai-nr-ue" '
|
||||||
|
cmd += ' --change "CMD [\\"/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15\\", \\"-O\\", \\"/opt/oai-nr-ue/etc/nr-ue.conf\\"]" '
|
||||||
|
cmd += ' --change "ENTRYPOINT [\\"/opt/oai-nr-ue/bin/entrypoint.sh\\"]" '
|
||||||
|
if re.search('oai-lte-ru', tag):
|
||||||
|
cmd += ' --change "WORKDIR /opt/oai-lte-ru" '
|
||||||
|
cmd += ' --change "CMD [\\"/opt/oai-lte-ru/bin/oairu.Rel15\\", \\"-O\\", \\"/opt/oai-lte-ru/etc/rru.conf\\"]" '
|
||||||
|
cmd += ' --change "ENTRYPOINT [\\"/opt/oai-lte-ru/bin/entrypoint.sh\\"]" '
|
||||||
|
if re.search('oai-physim', tag):
|
||||||
|
cmd += ' --change "WORKDIR /opt/oai-physim" '
|
||||||
|
cmd += ' - ' + image_prefix + tag
|
||||||
|
print (cmd)
|
||||||
|
subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
||||||
|
|
||||||
|
# Remove container
|
||||||
|
cmd = cli + ' rm -f test-flatten'
|
||||||
|
print (cmd)
|
||||||
|
subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
||||||
|
|
||||||
|
# At this point the original image is a dangling image.
|
||||||
|
# CI pipeline will clean up (`image prune --force`)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
+30
-42
@@ -372,36 +372,28 @@ class RANManagement():
|
|||||||
else:
|
else:
|
||||||
pcapfile_prefix="gnb_"
|
pcapfile_prefix="gnb_"
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('ip addr show | awk -f /tmp/active_net_interfaces.awk | egrep -v "lo|tun"', '\$', 5)
|
eth_interface = 'any'
|
||||||
result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
|
fltr = 'sctp'
|
||||||
if result is not None:
|
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||||
eth_interface = result.group('eth_interface')
|
pcapfile = pcapfile_prefix + self.testCase_id + '_log.pcap'
|
||||||
fltr = 'port 38412 or port 36412 or port 36422' # NGAP, S1AP, X2AP
|
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -f /tmp/' + pcapfile , '\$', 5)
|
||||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
mySSH.command('echo $USER; nohup sudo -E tshark -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + pcapfile + ' > /dev/null 2>&1 &','\$', 5)
|
||||||
pcapfile = pcapfile_prefix + self.testCase_id + '_log.pcap'
|
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -f /tmp/' + pcapfile , '\$', 5)
|
|
||||||
mySSH.command('echo $USER; nohup sudo -E tshark -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + pcapfile + ' > /dev/null 2>&1 &','\$', 5)
|
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB
|
# If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB
|
||||||
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
localEpcIpAddr = EPC.IPAddress
|
||||||
if (result is not None):
|
localEpcUserName = EPC.UserName
|
||||||
localEpcIpAddr = EPC.IPAddress
|
localEpcPassword = EPC.Password
|
||||||
localEpcUserName = EPC.UserName
|
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
||||||
localEpcPassword = EPC.Password
|
eth_interface = 'any'
|
||||||
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
fltr = 'sctp'
|
||||||
mySSH.command('ip addr show | awk -f /tmp/active_net_interfaces.awk | egrep -v "lo|tun"', '\$', 5)
|
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||||
result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
|
self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
|
||||||
if result is not None:
|
mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
|
||||||
eth_interface = result.group('eth_interface')
|
mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
|
||||||
fltr = 'port 38412 or port 36412 or port 36422' # NGAP, S1AP, X2AP
|
mySSH.close()
|
||||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
|
||||||
self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
|
|
||||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
|
|
||||||
mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
|
|
||||||
mySSH.close()
|
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
||||||
# Initialize_eNB_args usually start with -O and followed by the location in repository
|
# Initialize_eNB_args usually start with -O and followed by the location in repository
|
||||||
@@ -519,23 +511,19 @@ class RANManagement():
|
|||||||
logging.error('\u001B[1;37;41m eNB/gNB/ocp-eNB logging system did not show got sync! \u001B[0m')
|
logging.error('\u001B[1;37;41m eNB/gNB/ocp-eNB logging system did not show got sync! \u001B[0m')
|
||||||
HTML.CreateHtmlTestRow(self.air_interface[self.eNB_instance] + ' -O ' + config_file + extra_options, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.air_interface[self.eNB_instance] + ' -O ' + config_file + extra_options, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
# In case of T tracer recording, we need to kill tshark on EPC side
|
# In case of T tracer recording, we need to kill tshark on EPC side
|
||||||
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
localEpcIpAddr = EPC.IPAddress
|
||||||
if (result is not None):
|
localEpcUserName = EPC.UserName
|
||||||
localEpcIpAddr = EPC.IPAddress
|
localEpcPassword = EPC.Password
|
||||||
localEpcUserName = EPC.UserName
|
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
||||||
localEpcPassword = EPC.Password
|
logging.debug('\u001B[1m Stopping tshark \u001B[0m')
|
||||||
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
mySSH.command('echo ' + localEpcPassword + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
||||||
logging.debug('\u001B[1m Stopping tshark \u001B[0m')
|
if self.epcPcapFile != '':
|
||||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
mySSH.command('echo ' + localEpcPassword + ' | sudo -S chmod 666 /tmp/' + self.epcPcapFile, '\$', 5)
|
||||||
if self.epcPcapFile != '':
|
mySSH.close()
|
||||||
time.sleep(0.5)
|
if self.epcPcapFile != '':
|
||||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S chmod 666 /tmp/' + self.epcPcapFile, '\$', 5)
|
copyin_res = mySSH.copyin(localEpcIpAddr, localEpcUserName, localEpcPassword, '/tmp/' + self.epcPcapFile, '.')
|
||||||
mySSH.close()
|
if (copyin_res == 0):
|
||||||
time.sleep(1)
|
mySSH.copyout(lIpAddr, lUserName, lPassWord, self.epcPcapFile, lSourcePath + '/cmake_targets/.')
|
||||||
if self.epcPcapFile != '':
|
|
||||||
copyin_res = mySSH.copyin(localEpcIpAddr, localEpcUserName, localEpcPassword, '/tmp/' + self.epcPcapFile, '.')
|
|
||||||
if (copyin_res == 0):
|
|
||||||
mySSH.copyout(lIpAddr, lUserName, lPassWord, self.epcPcapFile, lSourcePath + '/cmake_targets/.')
|
|
||||||
self.prematureExit = True
|
self.prematureExit = True
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -33,12 +33,10 @@
|
|||||||
000013
|
000013
|
||||||
020011
|
020011
|
||||||
020012
|
020012
|
||||||
100011
|
|
||||||
</TestCaseRequestedList>
|
|
||||||
<!-- Not done yet because of code instability
|
|
||||||
030011
|
030011
|
||||||
030012
|
030012
|
||||||
-->
|
100011
|
||||||
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
<testCase id="000010">
|
<testCase id="000010">
|
||||||
@@ -104,7 +102,7 @@
|
|||||||
<server_container_name>rfsim5g-oai-ext-dn</server_container_name>
|
<server_container_name>rfsim5g-oai-ext-dn</server_container_name>
|
||||||
<client_container_name>rfsim5g-oai-nr-ue</client_container_name>
|
<client_container_name>rfsim5g-oai-nr-ue</client_container_name>
|
||||||
<server_options>-u -i 1 -s</server_options>
|
<server_options>-u -i 1 -s</server_options>
|
||||||
<client_options>-B 12.1.1.2 -c 192.168.72.135 -u -i 1 -t 30 -b 1M</client_options>
|
<client_options>-B 12.1.1.2 -c 192.168.72.135 -u -i 1 -t 30 -b 3M</client_options>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="100011">
|
<testCase id="100011">
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>TEST-SA-FR1-Tab1</htmlTabRef>
|
<htmlTabRef>TEST-SA-FR1-Tab1</htmlTabRef>
|
||||||
<htmlTabName>SA Ping DL UL with QUECTEL</htmlTabName>
|
<htmlTabName>SA Ping DL UL with Quectel, 2.5ms TDD</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
<testCase id="040000">
|
<testCase id="040000">
|
||||||
<class>Initialize_eNB</class>
|
<class>Initialize_eNB</class>
|
||||||
<desc>Initialize gNB</desc>
|
<desc>Initialize gNB</desc>
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --T_stdout 2 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --T_stdout 2 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||||
<eNB_instance>0</eNB_instance>
|
<eNB_instance>0</eNB_instance>
|
||||||
<eNB_serverId>0</eNB_serverId>
|
<eNB_serverId>0</eNB_serverId>
|
||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<ping_args>-c 40</ping_args>
|
<ping_args>-c 40</ping_args>
|
||||||
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
<ping_rttavg_threshold>20</ping_rttavg_threshold>
|
<ping_rttavg_threshold>10</ping_rttavg_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="050001">
|
<testCase id="050001">
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<ping_args>-c 100 -i 0,2</ping_args>
|
<ping_args>-c 100 -i 0,2</ping_args>
|
||||||
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
<ping_rttavg_threshold>20</ping_rttavg_threshold>
|
<ping_rttavg_threshold>10</ping_rttavg_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
|
|||||||
+2
-2
@@ -165,7 +165,7 @@ From the `cmake_targets/ran_build/build` folder:
|
|||||||
|
|
||||||
gNB on machine 1:
|
gNB on machine 1:
|
||||||
|
|
||||||
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --sa`
|
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --gNBs.[0].min_rxtxtime 6 --sa`
|
||||||
|
|
||||||
UE on machine 2:
|
UE on machine 2:
|
||||||
|
|
||||||
@@ -173,7 +173,7 @@ UE on machine 2:
|
|||||||
|
|
||||||
With the RF simulator (on the same machine):
|
With the RF simulator (on the same machine):
|
||||||
|
|
||||||
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --rfsim --sa`
|
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --gNBs.[0].min_rxtxtime 6 --rfsim --sa`
|
||||||
|
|
||||||
`sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 -s 516 --rfsim --sa`
|
`sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 -s 516 --rfsim --sa`
|
||||||
|
|
||||||
|
|||||||
@@ -423,7 +423,7 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (Foffset > E) {
|
if (Foffset > E) {
|
||||||
LOG_E(PHY,"nr_rate_matching: invalid parameters (Foffset %d > E %d)\n",Foffset,E);
|
LOG_E(PHY,"nr_rate_matching: invalid parameters (Foffset %d > E %d) F %d, k0 %d, Ncb %d, rvidx %d, Ilbrm %d\n",Foffset,E,F, ind, Ncb, rvidx, Ilbrm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (Foffset > Ncb) {
|
if (Foffset > Ncb) {
|
||||||
|
|||||||
@@ -366,8 +366,10 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
|
|||||||
|
|
||||||
uint8_t sco = 0;
|
uint8_t sco = 0;
|
||||||
if (((fp->freq_range == nr_FR1) && (config->ssb_table.ssb_subcarrier_offset<24)) ||
|
if (((fp->freq_range == nr_FR1) && (config->ssb_table.ssb_subcarrier_offset<24)) ||
|
||||||
((fp->freq_range == nr_FR2) && (config->ssb_table.ssb_subcarrier_offset<12)) )
|
((fp->freq_range == nr_FR2) && (config->ssb_table.ssb_subcarrier_offset<12)) ) {
|
||||||
sco = config->ssb_table.ssb_subcarrier_offset;
|
if (fp->freq_range == nr_FR1)
|
||||||
|
sco = config->ssb_table.ssb_subcarrier_offset>>config->ssb_config.scs_common;
|
||||||
|
}
|
||||||
|
|
||||||
fp->ssb_start_subcarrier = (12 * config->ssb_table.ssb_offset_point_a + sco);
|
fp->ssb_start_subcarrier = (12 * config->ssb_table.ssb_offset_point_a + sco);
|
||||||
set_Lmax(fp);
|
set_Lmax(fp);
|
||||||
|
|||||||
@@ -1052,7 +1052,7 @@ static inline int64_t clock_difftime_ns(struct timespec start, struct timespec e
|
|||||||
void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int tti, uint8_t *seqno, uint16_t packet_type) {
|
void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int tti, uint8_t *seqno, uint16_t packet_type) {
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *fp=ru->frame_parms;
|
LTE_DL_FRAME_PARMS *fp=ru->frame_parms;
|
||||||
int32_t *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx];
|
int32_t *txp[ru->nb_tx], *rxp[ru->nb_rx];
|
||||||
int32_t *tx_buffer=NULL;
|
int32_t *tx_buffer=NULL;
|
||||||
uint16_t packet_id=0, i=0;
|
uint16_t packet_id=0, i=0;
|
||||||
|
|
||||||
@@ -1131,6 +1131,7 @@ void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int tti, uint8_t *seq
|
|||||||
//VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id );
|
//VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id );
|
||||||
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF0, 1 );
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF0, 1 );
|
||||||
clock_gettime( CLOCK_MONOTONIC, &start_comp);
|
clock_gettime( CLOCK_MONOTONIC, &start_comp);
|
||||||
|
|
||||||
ru->ifdevice.trx_write_func2(&ru->ifdevice,
|
ru->ifdevice.trx_write_func2(&ru->ifdevice,
|
||||||
(proc_timestamp + packet_id*spp_eth-600)*factor,
|
(proc_timestamp + packet_id*spp_eth-600)*factor,
|
||||||
(void*)txp[aid],
|
(void*)txp[aid],
|
||||||
|
|||||||
@@ -106,15 +106,13 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
|||||||
cset_start_symb = pdcch_pdu_rel15->StartSymbolIndex;
|
cset_start_symb = pdcch_pdu_rel15->StartSymbolIndex;
|
||||||
cset_nsymb = pdcch_pdu_rel15->DurationSymbols;
|
cset_nsymb = pdcch_pdu_rel15->DurationSymbols;
|
||||||
dci_idx = 0;
|
dci_idx = 0;
|
||||||
if (dci_pdu->RNTI != 0xFFFF) {
|
LOG_D(PHY, "pdcch: Coreset rb_offset %d, nb_rb %d BWP Start %d\n",rb_offset,n_rb,pdcch_pdu_rel15->BWPStart);
|
||||||
LOG_D(PHY, "pdcch: Coreset rb_offset %d, nb_rb %d BWP Start %d\n",rb_offset,n_rb,pdcch_pdu_rel15->BWPStart);
|
LOG_D(PHY, "pdcch: Coreset starting subcarrier %d on symbol %d (%d symbols)\n", cset_start_sc, cset_start_symb, cset_nsymb);
|
||||||
LOG_D(PHY, "pdcch: Coreset starting subcarrier %d on symbol %d (%d symbols)\n", cset_start_sc, cset_start_symb, cset_nsymb);
|
|
||||||
}
|
|
||||||
// DMRS length is per OFDM symbol
|
// DMRS length is per OFDM symbol
|
||||||
uint32_t dmrs_length = n_rb*6; //2(QPSK)*3(per RB)*6(REG per CCE)
|
uint32_t dmrs_length = n_rb*6; //2(QPSK)*3(per RB)*6(REG per CCE)
|
||||||
uint32_t encoded_length = dci_pdu->AggregationLevel*108; //2(QPSK)*9(per RB)*6(REG per CCE)
|
uint32_t encoded_length = dci_pdu->AggregationLevel*108; //2(QPSK)*9(per RB)*6(REG per CCE)
|
||||||
if (dci_pdu->RNTI != 0xFFFF)
|
if (dci_pdu->RNTI != 0xFFFF)
|
||||||
LOG_D(PHY, "DL_DCI : rb_offset %d, nb_rb %d, DMRS length per symbol %d\t DCI encoded length %d (precoder_granularity %d,reg_mapping %d),Scrambling_Id %d,ScramblingRNTI %x,PayloadSizeBits %d\n",
|
LOG_D(PHY, "DL_DCI : rb_offset %d, nb_rb %d, DMRS length per symbol %d\t DCI encoded length %d (precoder_granularity %d, reg_mapping %d), Scrambling_Id %d, ScramblingRNTI %x, PayloadSizeBits %d\n",
|
||||||
rb_offset, n_rb,dmrs_length, encoded_length,pdcch_pdu_rel15->precoderGranularity,pdcch_pdu_rel15->CceRegMappingType,
|
rb_offset, n_rb,dmrs_length, encoded_length,pdcch_pdu_rel15->precoderGranularity,pdcch_pdu_rel15->CceRegMappingType,
|
||||||
dci_pdu->ScramblingId,dci_pdu->ScramblingRNTI,dci_pdu->PayloadSizeBits);
|
dci_pdu->ScramblingId,dci_pdu->ScramblingRNTI,dci_pdu->PayloadSizeBits);
|
||||||
dmrs_length += rb_offset*6; // To accommodate more DMRS symbols in case of rb offset
|
dmrs_length += rb_offset*6; // To accommodate more DMRS symbols in case of rb offset
|
||||||
@@ -128,7 +126,7 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
|||||||
if(dci_pdu->RNTI!=0xFFFF) {
|
if(dci_pdu->RNTI!=0xFFFF) {
|
||||||
for (int i=0; i<dmrs_length>>1; i++)
|
for (int i=0; i<dmrs_length>>1; i++)
|
||||||
printf("symb %d i %d %p gold seq 0x%08x mod_dmrs %d %d\n", symb, i,
|
printf("symb %d i %d %p gold seq 0x%08x mod_dmrs %d %d\n", symb, i,
|
||||||
&gold_pdcch_dmrs[symb][i>>5],gold_pdcch_dmrs[symb][i>>5], mod_dmrs[symb][i<<1], mod_dmrs[symb][(i<<1)+1] );
|
&gold_pdcch_dmrs[symb][i>>5],gold_pdcch_dmrs[symb][i>>5], mod_dmrs[symb][i<<1], mod_dmrs[symb][(i<<1)+1]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -232,14 +232,14 @@ void ldpc8blocks( void *p) {
|
|||||||
#endif
|
#endif
|
||||||
uint32_t E = nr_get_E(G, impp->n_segments, mod_order, rel15->nrOfLayers, rr);
|
uint32_t E = nr_get_E(G, impp->n_segments, mod_order, rel15->nrOfLayers, rr);
|
||||||
//#ifdef DEBUG_DLSCH_CODING
|
//#ifdef DEBUG_DLSCH_CODING
|
||||||
LOG_D(NR_PHY,"Rate Matching, Code segment %d/%d (coded bits (G) %u, E %d, Filler bits %d, Filler offset %d mod_order %d, nb_rb %d)...\n",
|
LOG_D(NR_PHY,"Rate Matching, Code segment %d/%d (coded bits (G) %u, E %d, Filler bits %d, Filler offset %d mod_order %d, nb_rb %d,nrOfLayer %d)...\n",
|
||||||
rr,
|
rr,
|
||||||
impp->n_segments,
|
impp->n_segments,
|
||||||
G,
|
G,
|
||||||
E,
|
E,
|
||||||
impp->F,
|
impp->F,
|
||||||
Kr-impp->F-2*(*impp->Zc),
|
Kr-impp->F-2*(*impp->Zc),
|
||||||
mod_order,nb_rb);
|
mod_order,nb_rb,rel15->nrOfLayers);
|
||||||
// for tbslbrm calculation according to 5.4.2.1 of 38.212
|
// for tbslbrm calculation according to 5.4.2.1 of 38.212
|
||||||
uint8_t Nl = 4;
|
uint8_t Nl = 4;
|
||||||
|
|
||||||
@@ -262,6 +262,20 @@ void ldpc8blocks( void *p) {
|
|||||||
Kr-impp->F-2*(*impp->Zc),
|
Kr-impp->F-2*(*impp->Zc),
|
||||||
rel15->rvIndex[0],
|
rel15->rvIndex[0],
|
||||||
E);
|
E);
|
||||||
|
if (Kr-impp->F-2*(*impp->Zc)> E) {
|
||||||
|
LOG_E(PHY,"dlsch coding A %d Kr %d G %d (nb_rb %d, nb_symb_sch %d, nb_re_dmrs %d, length_dmrs %d, mod_order %d)\n",
|
||||||
|
A,impp->K,G, nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs,(int)mod_order);
|
||||||
|
|
||||||
|
LOG_E(NR_PHY,"Rate Matching, Code segment %d/%d (coded bits (G) %u, E %d, Kr %d, Filler bits %d, Filler offset %d mod_order %d, nb_rb %d)...\n",
|
||||||
|
rr,
|
||||||
|
impp->n_segments,
|
||||||
|
G,
|
||||||
|
E,
|
||||||
|
Kr,
|
||||||
|
impp->F,
|
||||||
|
Kr-impp->F-2*(*impp->Zc),
|
||||||
|
mod_order,nb_rb);
|
||||||
|
}
|
||||||
#ifdef DEBUG_DLSCH_CODING
|
#ifdef DEBUG_DLSCH_CODING
|
||||||
|
|
||||||
for (int i =0; i<16; i++)
|
for (int i =0; i<16; i++)
|
||||||
|
|||||||
@@ -397,7 +397,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
uci_stats->pucch0_thres = gNB->pucch0_thres; /* + (10*max_n0);*/
|
uci_stats->pucch0_thres = gNB->pucch0_thres; /* + (10*max_n0);*/
|
||||||
bool no_conf=false;
|
bool no_conf=false;
|
||||||
if (nr_sequences>1) {
|
if (nr_sequences>1) {
|
||||||
if (xrtmag_dBtimes10 < (50+xrtmag_next_dBtimes10) || SNRtimes10 < gNB->pucch0_thres) {
|
if (/*xrtmag_dBtimes10 < (30+xrtmag_next_dBtimes10) ||*/ SNRtimes10 < uci_stats->pucch0_thres) {
|
||||||
no_conf=true;
|
no_conf=true;
|
||||||
LOG_D(PHY,"%d.%d PUCCH bad confidence: %d threshold, %d, %d, %d\n",
|
LOG_D(PHY,"%d.%d PUCCH bad confidence: %d threshold, %d, %d, %d\n",
|
||||||
frame, slot,
|
frame, slot,
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ extern const char *prachfmt[];
|
|||||||
// - idft for short sequence assumes we are transmitting starting in symbol 0 of a PRACH slot
|
// - idft for short sequence assumes we are transmitting starting in symbol 0 of a PRACH slot
|
||||||
// - Assumes that PRACH SCS is same as PUSCH SCS @ 30 kHz, take values for formats 0-2 and adjust for others below
|
// - Assumes that PRACH SCS is same as PUSCH SCS @ 30 kHz, take values for formats 0-2 and adjust for others below
|
||||||
// - Preamble index different from 0 is not detected by gNB
|
// - Preamble index different from 0 is not detected by gNB
|
||||||
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t slot){
|
||||||
|
|
||||||
NR_DL_FRAME_PARMS *fp=&ue->frame_parms;
|
NR_DL_FRAME_PARMS *fp=&ue->frame_parms;
|
||||||
fapi_nr_config_request_t *nrUE_config = &ue->nrUE_config;
|
fapi_nr_config_request_t *nrUE_config = &ue->nrUE_config;
|
||||||
@@ -190,8 +190,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
|||||||
// now generate PRACH signal
|
// now generate PRACH signal
|
||||||
#ifdef NR_PRACH_DEBUG
|
#ifdef NR_PRACH_DEBUG
|
||||||
if (NCS>0)
|
if (NCS>0)
|
||||||
LOG_I(PHY, "PRACH [UE %d] generate PRACH in slot %d for RootSeqIndex %d, Preamble Index %d, PRACH Format %s, NCS %d (N_ZC %d): Preamble_offset %d, Preamble_shift %d msg1 frequency start %d\n",
|
LOG_I(PHY, "PRACH [UE %d] generate PRACH in frame.slot %d.%d for RootSeqIndex %d, Preamble Index %d, PRACH Format %s, NCS %d (N_ZC %d): Preamble_offset %d, Preamble_shift %d msg1 frequency start %d\n",
|
||||||
Mod_id,
|
Mod_id,
|
||||||
|
frame,
|
||||||
slot,
|
slot,
|
||||||
rootSequenceIndex,
|
rootSequenceIndex,
|
||||||
preamble_index,
|
preamble_index,
|
||||||
@@ -221,7 +222,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
|||||||
k += kbar;
|
k += kbar;
|
||||||
k *= 2;
|
k *= 2;
|
||||||
|
|
||||||
LOG_I(PHY, "PRACH [UE %d] in slot %d, placing PRACH in position %d, msg1 frequency start %d (k1 %d), preamble_offset %d, first_nonzero_root_idx %d\n", Mod_id,
|
LOG_I(PHY, "PRACH [UE %d] in frame.slot %d.%d, placing PRACH in position %d, msg1 frequency start %d (k1 %d), preamble_offset %d, first_nonzero_root_idx %d\n",
|
||||||
|
Mod_id,
|
||||||
|
frame,
|
||||||
slot,
|
slot,
|
||||||
k,
|
k,
|
||||||
n_ra_prb,
|
n_ra_prb,
|
||||||
|
|||||||
@@ -1682,7 +1682,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
unsigned char i_mod,
|
unsigned char i_mod,
|
||||||
unsigned char harq_pid);
|
unsigned char harq_pid);
|
||||||
|
|
||||||
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t subframe);
|
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t slot);
|
||||||
|
|
||||||
void dump_nrdlsch(PHY_VARS_NR_UE *ue,uint8_t gNB_id,uint8_t nr_slot_rx,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid);
|
void dump_nrdlsch(PHY_VARS_NR_UE *ue,uint8_t gNB_id,uint8_t nr_slot_rx,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid);
|
||||||
/**@}*/
|
/**@}*/
|
||||||
|
|||||||
@@ -54,8 +54,10 @@ void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME
|
|||||||
|
|
||||||
uint8_t sco = 0;
|
uint8_t sco = 0;
|
||||||
if (((fp->freq_range == nr_FR1) && (cfg->ssb_table.ssb_subcarrier_offset.value<24)) ||
|
if (((fp->freq_range == nr_FR1) && (cfg->ssb_table.ssb_subcarrier_offset.value<24)) ||
|
||||||
((fp->freq_range == nr_FR2) && (cfg->ssb_table.ssb_subcarrier_offset.value<12)) )
|
((fp->freq_range == nr_FR2) && (cfg->ssb_table.ssb_subcarrier_offset.value<12)) ) {
|
||||||
sco = cfg->ssb_table.ssb_subcarrier_offset.value;
|
if (fp->freq_range == nr_FR1)
|
||||||
|
sco = cfg->ssb_table.ssb_subcarrier_offset.value>>cfg->ssb_config.scs_common.value;
|
||||||
|
}
|
||||||
|
|
||||||
fp->ssb_start_subcarrier = (12 * cfg->ssb_table.ssb_offset_point_a.value + sco);
|
fp->ssb_start_subcarrier = (12 * cfg->ssb_table.ssb_offset_point_a.value + sco);
|
||||||
LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,cfg->ssb_table.ssb_offset_point_a.value,sco);
|
LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,cfg->ssb_table.ssb_offset_point_a.value,sco);
|
||||||
|
|||||||
@@ -1843,7 +1843,7 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
|
|||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
prach_power = generate_nr_prach(ue, gNB_id, nr_slot_tx);
|
prach_power = generate_nr_prach(ue, gNB_id, frame_tx, nr_slot_tx);
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT);
|
||||||
|
|
||||||
|
|||||||
@@ -105,6 +105,10 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int newGtpuDeleteAllTunnels(instance_t instance, rnti_t rnti) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// dummy functions
|
// dummy functions
|
||||||
int dummy_nr_ue_ul_indication(nr_uplink_indication_t *ul_info) { return(0); }
|
int dummy_nr_ue_ul_indication(nr_uplink_indication_t *ul_info) { return(0); }
|
||||||
|
|
||||||
|
|||||||
@@ -97,6 +97,10 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int newGtpuDeleteAllTunnels(instance_t instance, rnti_t rnti) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rrc_data_ind(
|
rrc_data_ind(
|
||||||
const protocol_ctxt_t *const ctxt_pP,
|
const protocol_ctxt_t *const ctxt_pP,
|
||||||
|
|||||||
@@ -100,6 +100,11 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer
|
|||||||
transport_layer_addr_t remoteAddr, int port, gtpCallback callBack) {
|
transport_layer_addr_t remoteAddr, int port, gtpCallback callBack) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int newGtpuDeleteAllTunnels(instance_t instance, rnti_t rnti) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
extern void fix_scd(NR_ServingCellConfig_t *scd);// forward declaration
|
extern void fix_scd(NR_ServingCellConfig_t *scd);// forward declaration
|
||||||
|
|
||||||
int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id,
|
int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id,
|
||||||
|
|||||||
@@ -104,6 +104,11 @@ typedef enum {
|
|||||||
#define CONFIG_STRING_RU_NR_FLAG "nr_flag"
|
#define CONFIG_STRING_RU_NR_FLAG "nr_flag"
|
||||||
#define CONFIG_STRING_RU_NR_SCS_FOR_RASTER "nr_scs_for_raster"
|
#define CONFIG_STRING_RU_NR_SCS_FOR_RASTER "nr_scs_for_raster"
|
||||||
|
|
||||||
|
#define HLP_RU_SF_AHEAD "LTE TX processing advance"
|
||||||
|
#define HLP_RU_SL_AHEAD "NR TX processing advance"
|
||||||
|
#define HLP_RU_NR_FLAG "Use NR numerology (for AW2SORI)"
|
||||||
|
#define HLP_RU_NR_SCS_FOR_RASTER "NR SCS for raster (for AW2SORI)"
|
||||||
|
|
||||||
#define RU_LOCAL_IF_NAME_IDX 0
|
#define RU_LOCAL_IF_NAME_IDX 0
|
||||||
#define RU_LOCAL_ADDRESS_IDX 1
|
#define RU_LOCAL_ADDRESS_IDX 1
|
||||||
#define RU_REMOTE_ADDRESS_IDX 2
|
#define RU_REMOTE_ADDRESS_IDX 2
|
||||||
@@ -171,10 +176,10 @@ typedef enum {
|
|||||||
{CONFIG_STRING_RU_IF_FREQUENCY, NULL, 0, u64ptr:NULL, defuintval:0, TYPE_UINT64, 0}, \
|
{CONFIG_STRING_RU_IF_FREQUENCY, NULL, 0, u64ptr:NULL, defuintval:0, TYPE_UINT64, 0}, \
|
||||||
{CONFIG_STRING_RU_IF_FREQ_OFFSET, NULL, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \
|
{CONFIG_STRING_RU_IF_FREQ_OFFSET, NULL, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \
|
||||||
{CONFIG_STRING_RU_DO_PRECODING, NULL, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \
|
{CONFIG_STRING_RU_DO_PRECODING, NULL, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \
|
||||||
{CONFIG_STRING_RU_SF_AHEAD, NULL, 0, iptr:NULL, defintval:4, TYPE_INT, 0}, \
|
{CONFIG_STRING_RU_SF_AHEAD, HLP_RU_SF_AHEAD, 0, iptr:NULL, defintval:4, TYPE_INT, 0}, \
|
||||||
{CONFIG_STRING_RU_SL_AHEAD, NULL, 0, iptr:NULL, defintval:6, TYPE_INT, 0}, \
|
{CONFIG_STRING_RU_SL_AHEAD, HLP_RU_SL_AHEAD, 0, iptr:NULL, defintval:6, TYPE_INT, 0}, \
|
||||||
{CONFIG_STRING_RU_NR_FLAG, NULL, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \
|
{CONFIG_STRING_RU_NR_FLAG, HLP_RU_NR_FLAG, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \
|
||||||
{CONFIG_STRING_RU_NR_SCS_FOR_RASTER, NULL, 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \
|
{CONFIG_STRING_RU_NR_SCS_FOR_RASTER, HLP_RU_NR_SCS_FOR_RASTER, 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
|
|||||||
@@ -2065,7 +2065,7 @@ void configure_gnb_du_mac(int inst) {
|
|||||||
NULL,
|
NULL,
|
||||||
0,
|
0,
|
||||||
0, // rnti
|
0, // rnti
|
||||||
(NR_CellGroupConfig_t *)NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -128,7 +128,6 @@ typedef enum {
|
|||||||
#define GNB_CONFIG_STRING_FORCE256QAMOFF "force_256qam_off"
|
#define GNB_CONFIG_STRING_FORCE256QAMOFF "force_256qam_off"
|
||||||
#define GNB_CONFIG_STRING_ENABLE_SDAP "enable_sdap"
|
#define GNB_CONFIG_STRING_ENABLE_SDAP "enable_sdap"
|
||||||
#define GNB_CONFIG_HLP_STRING_ENABLE_SDAP "enable the SDAP layer\n"
|
#define GNB_CONFIG_HLP_STRING_ENABLE_SDAP "enable the SDAP layer\n"
|
||||||
|
|
||||||
#define GNB_CONFIG_HLP_FORCE256QAMOFF "suppress activation of 256 QAM despite UE support"
|
#define GNB_CONFIG_HLP_FORCE256QAMOFF "suppress activation of 256 QAM despite UE support"
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
|
|||||||
@@ -354,13 +354,18 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
|
|||||||
scs_ssb = get_softmodem_params()->numerology;
|
scs_ssb = get_softmodem_params()->numerology;
|
||||||
band = mac->nr_band;
|
band = mac->nr_band;
|
||||||
ssb_start_symbol = get_ssb_start_symbol(band,scs_ssb,ssb_index);
|
ssb_start_symbol = get_ssb_start_symbol(band,scs_ssb,ssb_index);
|
||||||
|
int ssb_sc_offset_norm;
|
||||||
|
if (ssb_subcarrier_offset<24 && mac->frequency_range == FR1)
|
||||||
|
ssb_sc_offset_norm = ssb_subcarrier_offset>>scs_ssb;
|
||||||
|
else
|
||||||
|
ssb_sc_offset_norm = ssb_subcarrier_offset;
|
||||||
|
|
||||||
if (mac->common_configuration_complete == 0)
|
if (mac->common_configuration_complete == 0)
|
||||||
nr_ue_sib1_scheduler(module_id,
|
nr_ue_sib1_scheduler(module_id,
|
||||||
cc_id,
|
cc_id,
|
||||||
ssb_start_symbol,
|
ssb_start_symbol,
|
||||||
frame,
|
frame,
|
||||||
ssb_subcarrier_offset,
|
ssb_sc_offset_norm,
|
||||||
ssb_index,
|
ssb_index,
|
||||||
ssb_start_subcarrier,
|
ssb_start_subcarrier,
|
||||||
mac->frequency_range,
|
mac->frequency_range,
|
||||||
|
|||||||
@@ -344,21 +344,24 @@ void config_common(int Mod_idP, int ssb_SubcarrierOffset, rrc_pdsch_AntennaPorts
|
|||||||
uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
|
uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
|
||||||
uint16_t sco = absolute_diff%(12*scs_scaling);
|
uint16_t sco = absolute_diff%(12*scs_scaling);
|
||||||
// values of subcarrier offset larger than the limit only indicates CORESET for Type0-PDCCH CSS set is not present
|
// values of subcarrier offset larger than the limit only indicates CORESET for Type0-PDCCH CSS set is not present
|
||||||
uint8_t ssb_SubcarrierOffset_limit = 0;
|
int ssb_SubcarrierOffset_limit = 0;
|
||||||
|
int offset_scaling = 0; //15kHz
|
||||||
if(frequency_range == FR1) {
|
if(frequency_range == FR1) {
|
||||||
ssb_SubcarrierOffset_limit = 24;
|
ssb_SubcarrierOffset_limit = 24;
|
||||||
} else {
|
if (ssb_SubcarrierOffset<ssb_SubcarrierOffset_limit)
|
||||||
|
offset_scaling = cfg->ssb_config.scs_common.value;
|
||||||
|
} else
|
||||||
ssb_SubcarrierOffset_limit = 12;
|
ssb_SubcarrierOffset_limit = 12;
|
||||||
}
|
|
||||||
if (ssb_SubcarrierOffset<ssb_SubcarrierOffset_limit)
|
if (ssb_SubcarrierOffset<ssb_SubcarrierOffset_limit)
|
||||||
AssertFatal(sco==(scs_scaling * (ssb_SubcarrierOffset>>(cfg->ssb_config.scs_common.value))),"absoluteFrequencySSB has a subcarrier offset of %d while it should be %d\n",sco/scs_scaling,ssb_SubcarrierOffset);
|
AssertFatal(sco==(scs_scaling * ssb_SubcarrierOffset),
|
||||||
|
"absoluteFrequencySSB has a subcarrier offset of %d while it should be %d\n",sco/scs_scaling,ssb_SubcarrierOffset);
|
||||||
cfg->ssb_table.ssb_offset_point_a.value = absolute_diff/(12*scs_scaling) - 10; //absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total
|
cfg->ssb_table.ssb_offset_point_a.value = absolute_diff/(12*scs_scaling) - 10; //absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total
|
||||||
cfg->ssb_table.ssb_offset_point_a.tl.tag = NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG;
|
cfg->ssb_table.ssb_offset_point_a.tl.tag = NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG;
|
||||||
cfg->num_tlv++;
|
cfg->num_tlv++;
|
||||||
cfg->ssb_table.ssb_period.value = *scc->ssb_periodicityServingCell;
|
cfg->ssb_table.ssb_period.value = *scc->ssb_periodicityServingCell;
|
||||||
cfg->ssb_table.ssb_period.tl.tag = NFAPI_NR_CONFIG_SSB_PERIOD_TAG;
|
cfg->ssb_table.ssb_period.tl.tag = NFAPI_NR_CONFIG_SSB_PERIOD_TAG;
|
||||||
cfg->num_tlv++;
|
cfg->num_tlv++;
|
||||||
cfg->ssb_table.ssb_subcarrier_offset.value = ssb_SubcarrierOffset>>(cfg->ssb_config.scs_common.value);
|
cfg->ssb_table.ssb_subcarrier_offset.value = ssb_SubcarrierOffset<<offset_scaling;
|
||||||
cfg->ssb_table.ssb_subcarrier_offset.tl.tag = NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG;
|
cfg->ssb_table.ssb_subcarrier_offset.tl.tag = NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG;
|
||||||
cfg->num_tlv++;
|
cfg->num_tlv++;
|
||||||
|
|
||||||
@@ -448,6 +451,26 @@ void config_common(int Mod_idP, int ssb_SubcarrierOffset, rrc_pdsch_AntennaPorts
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP, rnti_t rnti, NR_SubcarrierSpacing_t subcarrierSpacing, uint32_t rrc_reconfiguration_delay) {
|
||||||
|
|
||||||
|
if (rrc_reconfiguration_delay == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
const int UE_id = find_nr_UE_id(Mod_idP,rnti);
|
||||||
|
if (UE_id < 0) {
|
||||||
|
LOG_W(NR_MAC, "Could not find UE for RNTI 0x%04x\n", rnti);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
||||||
|
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
||||||
|
const uint16_t sf_ahead = 6/(0x01<<subcarrierSpacing) + ((6%(0x01<<subcarrierSpacing))>0);
|
||||||
|
const uint16_t sl_ahead = sf_ahead * (0x01<<subcarrierSpacing);
|
||||||
|
sched_ctrl->rrc_processing_timer = (rrc_reconfiguration_delay<<subcarrierSpacing) + sl_ahead;
|
||||||
|
LOG_I(NR_MAC, "Activating RRC processing timer for UE %d\n", UE_id);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int rrc_mac_config_req_gNB(module_id_t Mod_idP,
|
int rrc_mac_config_req_gNB(module_id_t Mod_idP,
|
||||||
int ssb_SubcarrierOffset,
|
int ssb_SubcarrierOffset,
|
||||||
@@ -650,8 +673,6 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
|
|||||||
LOG_I(NR_MAC,"Modified UE_id %d/%x with CellGroup\n",UE_id,rnti);
|
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]);
|
process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]);
|
||||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
||||||
sched_ctrl->update_pdsch_ps = true;
|
|
||||||
sched_ctrl->update_pusch_ps = true;
|
|
||||||
const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
|
const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
|
||||||
if (get_softmodem_params()->sa) {
|
if (get_softmodem_params()->sa) {
|
||||||
// add all available DL HARQ processes for this UE in SA
|
// add all available DL HARQ processes for this UE in SA
|
||||||
@@ -693,6 +714,5 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
|
|||||||
}
|
}
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT);
|
||||||
|
|
||||||
return(0);
|
return 0;
|
||||||
|
|
||||||
}// END rrc_mac_config_req_gNB
|
}// END rrc_mac_config_req_gNB
|
||||||
|
|||||||
@@ -346,6 +346,8 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
|
|||||||
LOG_I(NR_MAC,"Frame.Slot %d.%d\n%s\n",frame,slot,stats_output);
|
LOG_I(NR_MAC,"Frame.Slot %d.%d\n%s\n",frame,slot,stats_output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nr_mac_update_timers(module_idP, frame, slot);
|
||||||
|
|
||||||
// This schedules MIB
|
// This schedules MIB
|
||||||
schedule_nr_mib(module_idP, frame, slot);
|
schedule_nr_mib(module_idP, frame, slot);
|
||||||
|
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ void find_SSB_and_RO_available(module_id_t module_idP) {
|
|||||||
cc->total_prach_occasions = total_RA_occasions - unused_RA_occasion;
|
cc->total_prach_occasions = total_RA_occasions - unused_RA_occasion;
|
||||||
cc->num_active_ssb = num_active_ssb;
|
cc->num_active_ssb = num_active_ssb;
|
||||||
|
|
||||||
LOG_I(NR_MAC,
|
LOG_D(NR_MAC,
|
||||||
"Total available RO %d, num of active SSB %d: unused RO = %d association_period %u N_RA_sfn %u total_prach_occasions_per_config_period %u\n",
|
"Total available RO %d, num of active SSB %d: unused RO = %d association_period %u N_RA_sfn %u total_prach_occasions_per_config_period %u\n",
|
||||||
cc->total_prach_occasions,
|
cc->total_prach_occasions,
|
||||||
cc->num_active_ssb,
|
cc->num_active_ssb,
|
||||||
@@ -391,7 +391,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP
|
|||||||
const int16_t N_RA_RB = get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing.value, mu_pusch);
|
const int16_t N_RA_RB = get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing.value, mu_pusch);
|
||||||
uint16_t *vrb_map_UL = &cc->vrb_map_UL[slotP * MAX_BWP_SIZE];
|
uint16_t *vrb_map_UL = &cc->vrb_map_UL[slotP * MAX_BWP_SIZE];
|
||||||
for (int i = 0; i < N_RA_RB * fdm; ++i)
|
for (int i = 0; i < N_RA_RB * fdm; ++i)
|
||||||
vrb_map_UL[bwp_start + rach_ConfigGeneric->msg1_FrequencyStart + i] = SL_to_bitmap(start_symbol, N_t_slot*N_dur);
|
vrb_map_UL[bwp_start + rach_ConfigGeneric->msg1_FrequencyStart + i] |= SL_to_bitmap(start_symbol, N_t_slot*N_dur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -468,12 +468,12 @@ void nr_schedule_msg2(uint16_t rach_frame, uint16_t rach_slot,
|
|||||||
uint8_t start_next_period = (rach_slot-(rach_slot%tdd_period_slot)+tdd_period_slot)%nr_slots_per_frame[mu];
|
uint8_t start_next_period = (rach_slot-(rach_slot%tdd_period_slot)+tdd_period_slot)%nr_slots_per_frame[mu];
|
||||||
*msg2_slot = start_next_period + last_dl_slot_period; // initializing scheduling of slot to next mixed (or last dl) slot
|
*msg2_slot = start_next_period + last_dl_slot_period; // initializing scheduling of slot to next mixed (or last dl) slot
|
||||||
*msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024;
|
*msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024;
|
||||||
|
|
||||||
// we can't schedule msg2 before sl_ahead since prach
|
// we can't schedule msg2 before sl_ahead since prach
|
||||||
int eff_slot = *msg2_slot+(*msg2_frame-rach_frame)*nr_slots_per_frame[mu];
|
int eff_slot = *msg2_slot+(*msg2_frame-rach_frame)*nr_slots_per_frame[mu];
|
||||||
if ((eff_slot-rach_slot)<=sl_ahead) {
|
while ((eff_slot-rach_slot)<=sl_ahead) {
|
||||||
*msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu];
|
*msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu];
|
||||||
*msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024;
|
*msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024;
|
||||||
|
eff_slot = *msg2_slot+(*msg2_frame-rach_frame)*nr_slots_per_frame[mu];
|
||||||
}
|
}
|
||||||
if (FR==nr_FR2) {
|
if (FR==nr_FR2) {
|
||||||
int num_tdd_period = *msg2_slot/tdd_period_slot;
|
int num_tdd_period = *msg2_slot/tdd_period_slot;
|
||||||
@@ -961,7 +961,7 @@ void nr_get_Msg3alloc(module_id_t module_id,
|
|||||||
k2 = *pusch_TimeDomainAllocationList->list.array[i]->k2;
|
k2 = *pusch_TimeDomainAllocationList->list.array[i]->k2;
|
||||||
int start_symbol_index,nr_of_symbols;
|
int start_symbol_index,nr_of_symbols;
|
||||||
SLIV2SL(pusch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength, &start_symbol_index, &nr_of_symbols);
|
SLIV2SL(pusch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength, &start_symbol_index, &nr_of_symbols);
|
||||||
LOG_I(NR_MAC,"Checking Msg3 TDA %d : k2 %d, sliv %d,S %d L %d\n",i,(int)k2,(int)pusch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength,start_symbol_index,nr_of_symbols);
|
LOG_D(NR_MAC,"Checking Msg3 TDA %d : k2 %d, sliv %d,S %d L %d\n",i,(int)k2,(int)pusch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength,start_symbol_index,nr_of_symbols);
|
||||||
// we want to transmit in the uplink symbols of mixed slot AND assuming Msg2 was in the mixed slot
|
// we want to transmit in the uplink symbols of mixed slot AND assuming Msg2 was in the mixed slot
|
||||||
if ((k2 + DELTA[mu])%nb_slots_per_period == 0) {
|
if ((k2 + DELTA[mu])%nb_slots_per_period == 0) {
|
||||||
temp_slot = current_slot + k2 + DELTA[mu]; // msg3 slot according to 8.3 in 38.213
|
temp_slot = current_slot + k2 + DELTA[mu]; // msg3 slot according to 8.3 in 38.213
|
||||||
@@ -1004,7 +1004,7 @@ void nr_get_Msg3alloc(module_id_t module_id,
|
|||||||
tdd_beam_association[num_tdd_period] = ra->beam_id;
|
tdd_beam_association[num_tdd_period] = ra->beam_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_I(NR_MAC, "[RAPROC] Msg3 slot %d: current slot %u Msg3 frame %u k2 %u Msg3_tda_id %u\n", ra->Msg3_slot, current_slot, ra->Msg3_frame, k2,ra->Msg3_tda_id);
|
LOG_D(NR_MAC, "[RAPROC] Msg3 slot %d: current slot %u Msg3 frame %u k2 %u Msg3_tda_id %u\n", ra->Msg3_slot, current_slot, ra->Msg3_frame, k2,ra->Msg3_tda_id);
|
||||||
uint16_t *vrb_map_UL =
|
uint16_t *vrb_map_UL =
|
||||||
&RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE];
|
&RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE];
|
||||||
|
|
||||||
@@ -1174,7 +1174,7 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
|
|||||||
fh = ubwp->bwp_Dedicated->pusch_Config->choice.setup->frequencyHopping ? 1 : 0;
|
fh = ubwp->bwp_Dedicated->pusch_Config->choice.setup->frequencyHopping ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_I(NR_MAC, "Frame %d, Slot %d Adding Msg3 UL Config Request for (%d,%d) : (%d,%d,%d) for rnti: %d\n",
|
LOG_D(NR_MAC, "Frame %d, Slot %d Adding Msg3 UL Config Request for (%d,%d) : (%d,%d,%d) for rnti: %d\n",
|
||||||
frameP,
|
frameP,
|
||||||
slotP,
|
slotP,
|
||||||
ra->Msg3_frame,
|
ra->Msg3_frame,
|
||||||
@@ -1328,7 +1328,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
|
|||||||
dl_req->nPDUs+=1;
|
dl_req->nPDUs+=1;
|
||||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
|
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
|
||||||
|
|
||||||
LOG_A(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d, CoreSetType %d\n",
|
LOG_D(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d, CoreSetType %d\n",
|
||||||
module_idP, CC_id, frameP, slotP, ra->RA_rnti, ra->state,pdcch_pdu_rel15->CoreSetType);
|
module_idP, CC_id, frameP, slotP, ra->RA_rnti, ra->state,pdcch_pdu_rel15->CoreSetType);
|
||||||
|
|
||||||
// SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control
|
// SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control
|
||||||
@@ -1491,9 +1491,9 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
|
|||||||
nr_add_msg3(module_idP, CC_id, frameP, slotP, ra, (uint8_t *) &tx_req->TLVs[0].value.direct[0]);
|
nr_add_msg3(module_idP, CC_id, frameP, slotP, ra, (uint8_t *) &tx_req->TLVs[0].value.direct[0]);
|
||||||
|
|
||||||
if(ra->cfra) {
|
if(ra->cfra) {
|
||||||
LOG_I(NR_MAC, "Frame %d, Subframe %d: Setting RA-Msg3 reception (CFRA) for SFN.Slot %d.%d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot);
|
LOG_D(NR_MAC, "Frame %d, Subframe %d: Setting RA-Msg3 reception (CFRA) for SFN.Slot %d.%d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot);
|
||||||
}
|
}
|
||||||
else LOG_I(NR_MAC, "Frame %d, Subframe %d: Setting RA-Msg3 reception (CBRA) for SFN.Slot %d.%d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot);
|
else LOG_D(NR_MAC, "Frame %d, Subframe %d: Setting RA-Msg3 reception (CBRA) for SFN.Slot %d.%d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot);
|
||||||
|
|
||||||
T(T_GNB_MAC_DL_RAR_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(ra->RA_rnti), T_INT(frameP),
|
T(T_GNB_MAC_DL_RAR_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(ra->RA_rnti), T_INT(frameP),
|
||||||
T_INT(slotP), T_INT(0), T_BUFFER(&tx_req->TLVs[0].value.direct[0], tx_req->TLVs[0].length));
|
T_INT(slotP), T_INT(0), T_BUFFER(&tx_req->TLVs[0].value.direct[0], tx_req->TLVs[0].length));
|
||||||
@@ -1763,7 +1763,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
|
|||||||
dl_req->nPDUs+=1;
|
dl_req->nPDUs+=1;
|
||||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
|
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
|
||||||
|
|
||||||
LOG_A(NR_MAC, "[gNB %d] [RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg4 DCI, state %d\n", module_idP, CC_id, frameP, slotP, ra->state);
|
LOG_D(NR_MAC, "[gNB %d] [RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg4 DCI, state %d\n", module_idP, CC_id, frameP, slotP, ra->state);
|
||||||
|
|
||||||
// SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control
|
// SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control
|
||||||
// information to data and is reset every slot.
|
// information to data and is reset every slot.
|
||||||
@@ -1954,9 +1954,16 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram
|
|||||||
if (harq->is_waiting == 0) {
|
if (harq->is_waiting == 0) {
|
||||||
if (harq->round == 0) {
|
if (harq->round == 0) {
|
||||||
if (stats->dlsch_errors == 0) {
|
if (stats->dlsch_errors == 0) {
|
||||||
LOG_A(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti);
|
LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti);
|
||||||
UE_info->active[UE_id] = true;
|
UE_info->active[UE_id] = true;
|
||||||
UE_info->Msg4_ACKed[UE_id] = true;
|
UE_info->Msg4_ACKed[UE_id] = true;
|
||||||
|
|
||||||
|
const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
|
||||||
|
NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp,
|
||||||
|
RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon,
|
||||||
|
sib1);
|
||||||
|
// 3GPP TS 38.331 Section 12 Table 12.1-1: UE performance requirements for RRC procedures for UEs
|
||||||
|
sched_ctrl->rrc_processing_timer = (NR_RRC_SETUP_DELAY_MS << genericParameters->subcarrierSpacing); // RRCSetup 10 ms
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) RA Procedure failed at Msg4!\n", UE_id, ra->rnti);
|
LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) RA Procedure failed at Msg4!\n", UE_id, ra->rnti);
|
||||||
@@ -1968,7 +1975,7 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Nack of RA-Msg4. Preparing retransmission!\n", UE_id, ra->rnti);
|
LOG_D(NR_MAC, "(ue %i, rnti 0x%04x) Received Nack of RA-Msg4. Preparing retransmission!\n", UE_id, ra->rnti);
|
||||||
ra->Msg4_frame = (frame + 1) % 1024;
|
ra->Msg4_frame = (frame + 1) % 1024;
|
||||||
ra->Msg4_slot = 1;
|
ra->Msg4_slot = 1;
|
||||||
ra->state = Msg4;
|
ra->state = Msg4;
|
||||||
@@ -2025,7 +2032,7 @@ void nr_fill_rar(uint8_t Mod_idP,
|
|||||||
uint8_t * dlsch_buffer,
|
uint8_t * dlsch_buffer,
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu){
|
nfapi_nr_pusch_pdu_t *pusch_pdu){
|
||||||
|
|
||||||
LOG_I(NR_MAC, "[gNB] Generate RAR MAC PDU frame %d slot %d preamble index %u TA command %d \n", ra->Msg2_frame, ra-> Msg2_slot, ra->preamble_index, ra->timing_offset);
|
LOG_D(NR_MAC, "[gNB] Generate RAR MAC PDU frame %d slot %d preamble index %u TA command %d \n", ra->Msg2_frame, ra-> Msg2_slot, ra->preamble_index, ra->timing_offset);
|
||||||
NR_RA_HEADER_BI *rarbi = (NR_RA_HEADER_BI *) dlsch_buffer;
|
NR_RA_HEADER_BI *rarbi = (NR_RA_HEADER_BI *) dlsch_buffer;
|
||||||
NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) (dlsch_buffer + 1);
|
NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) (dlsch_buffer + 1);
|
||||||
NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 2);
|
NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 2);
|
||||||
|
|||||||
@@ -426,7 +426,7 @@ uint32_t schedule_control_sib1(module_id_t module_id,
|
|||||||
gNB_mac->sched_ctrlCommon->cce_index,
|
gNB_mac->sched_ctrlCommon->cce_index,
|
||||||
gNB_mac->sched_ctrlCommon->aggregation_level);
|
gNB_mac->sched_ctrlCommon->aggregation_level);
|
||||||
for (int rb = 0; rb < gNB_mac->sched_ctrlCommon->sched_pdsch.rbSize; rb++) {
|
for (int rb = 0; rb < gNB_mac->sched_ctrlCommon->sched_pdsch.rbSize; rb++) {
|
||||||
vrb_map[rb + rbStart] = SL_to_bitmap(startSymbolIndex, nrOfSymbols);
|
vrb_map[rb + rbStart] |= SL_to_bitmap(startSymbolIndex, nrOfSymbols);
|
||||||
}
|
}
|
||||||
return TBS;
|
return TBS;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -488,6 +488,11 @@ void nr_store_dlsch_buffer(module_id_t module_id,
|
|||||||
const int lcid = sched_ctrl->dl_lc_ids[i];
|
const int lcid = sched_ctrl->dl_lc_ids[i];
|
||||||
const uint16_t rnti = UE_info->rnti[UE_id];
|
const uint16_t rnti = UE_info->rnti[UE_id];
|
||||||
LOG_D(NR_MAC, "In %s: UE %d/%x: LCID %d\n", __FUNCTION__, UE_id, rnti, lcid);
|
LOG_D(NR_MAC, "In %s: UE %d/%x: LCID %d\n", __FUNCTION__, UE_id, rnti, lcid);
|
||||||
|
|
||||||
|
if (lcid == DL_SCH_LCID_DTCH && sched_ctrl->rrc_processing_timer > 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
start_meas(&RC.nrmac[module_id]->rlc_status_ind);
|
start_meas(&RC.nrmac[module_id]->rlc_status_ind);
|
||||||
sched_ctrl->rlc_status[lcid] = mac_rlc_status_ind(module_id,
|
sched_ctrl->rlc_status[lcid] = mac_rlc_status_ind(module_id,
|
||||||
rnti,
|
rnti,
|
||||||
@@ -571,8 +576,8 @@ bool allocate_dl_retransmission(module_id_t module_id,
|
|||||||
rbStart += rbSize; /* last iteration rbSize was not enough, skip it */
|
rbStart += rbSize; /* last iteration rbSize was not enough, skip it */
|
||||||
rbSize = 0;
|
rbSize = 0;
|
||||||
|
|
||||||
while (rbStart < bwpSize &&
|
const int slbitmap = SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols);
|
||||||
!(rballoc_mask[rbStart]&SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols)))
|
while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap)
|
||||||
rbStart++;
|
rbStart++;
|
||||||
|
|
||||||
if (rbStart >= bwpSize) {
|
if (rbStart >= bwpSize) {
|
||||||
@@ -581,14 +586,14 @@ bool allocate_dl_retransmission(module_id_t module_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (rbStart + rbSize < bwpSize &&
|
while (rbStart + rbSize < bwpSize &&
|
||||||
(rballoc_mask[rbStart + rbSize]&SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols)) &&
|
(rballoc_mask[rbStart + rbSize] & slbitmap) == slbitmap &&
|
||||||
rbSize < retInfo->rbSize)
|
rbSize < retInfo->rbSize)
|
||||||
rbSize++;
|
rbSize++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check whether we need to switch the TDA allocation since the last
|
/* check whether we need to switch the TDA allocation since the last
|
||||||
* (re-)transmission */
|
* (re-)transmission */
|
||||||
if (ps->time_domain_allocation != tda || sched_ctrl->update_pdsch_ps) {
|
if (ps->time_domain_allocation != tda) {
|
||||||
nr_set_pdsch_semi_static(sib1,
|
nr_set_pdsch_semi_static(sib1,
|
||||||
scc,
|
scc,
|
||||||
cg,
|
cg,
|
||||||
@@ -598,7 +603,6 @@ bool allocate_dl_retransmission(module_id_t module_id,
|
|||||||
ps->nrOfLayers,
|
ps->nrOfLayers,
|
||||||
sched_ctrl,
|
sched_ctrl,
|
||||||
ps);
|
ps);
|
||||||
sched_ctrl->update_pdsch_ps = false;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* the retransmission will use a different time domain allocation, check
|
/* the retransmission will use a different time domain allocation, check
|
||||||
@@ -614,12 +618,12 @@ bool allocate_dl_retransmission(module_id_t module_id,
|
|||||||
ps->nrOfLayers,
|
ps->nrOfLayers,
|
||||||
sched_ctrl,
|
sched_ctrl,
|
||||||
&temp_ps);
|
&temp_ps);
|
||||||
while (rbStart < bwpSize &&
|
|
||||||
!(rballoc_mask[rbStart]&SL_to_bitmap(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols)))
|
const uint16_t slbitmap = SL_to_bitmap(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols);
|
||||||
|
while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap)
|
||||||
rbStart++;
|
rbStart++;
|
||||||
|
|
||||||
while (rbStart + rbSize < bwpSize &&
|
while (rbStart + rbSize < bwpSize && (rballoc_mask[rbStart + rbSize] & slbitmap) == slbitmap)
|
||||||
(rballoc_mask[rbStart + rbSize]&SL_to_bitmap(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols)))
|
|
||||||
rbSize++;
|
rbSize++;
|
||||||
|
|
||||||
uint32_t new_tbs;
|
uint32_t new_tbs;
|
||||||
@@ -913,7 +917,7 @@ void pf_dl(module_id_t module_id,
|
|||||||
NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
|
NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
|
||||||
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
|
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
|
||||||
|
|
||||||
if (ps->nrOfLayers != layers[UE_id] || ps->time_domain_allocation != tda || sched_ctrl->update_pdsch_ps) {
|
if (ps->nrOfLayers != layers[UE_id] || ps->time_domain_allocation != tda) {
|
||||||
nr_set_pdsch_semi_static(sib1,
|
nr_set_pdsch_semi_static(sib1,
|
||||||
scc,
|
scc,
|
||||||
UE_info->CellGroup[UE_id],
|
UE_info->CellGroup[UE_id],
|
||||||
@@ -923,20 +927,17 @@ void pf_dl(module_id_t module_id,
|
|||||||
layers[UE_id],
|
layers[UE_id],
|
||||||
sched_ctrl,
|
sched_ctrl,
|
||||||
ps);
|
ps);
|
||||||
sched_ctrl->update_pdsch_ps = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint16_t slbitmap = SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols);
|
const uint16_t slbitmap = SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols);
|
||||||
|
|
||||||
// Freq-demain allocation
|
// Freq-demain allocation
|
||||||
while (rbStart < bwpSize &&
|
while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap)
|
||||||
!(rballoc_mask[rbStart]&slbitmap))
|
|
||||||
rbStart++;
|
rbStart++;
|
||||||
|
|
||||||
uint16_t max_rbSize = 1;
|
uint16_t max_rbSize = 1;
|
||||||
|
|
||||||
while (rbStart + max_rbSize < bwpSize &&
|
while (rbStart + max_rbSize < bwpSize && (rballoc_mask[rbStart + max_rbSize] & slbitmap) == slbitmap)
|
||||||
(rballoc_mask[rbStart + max_rbSize]&slbitmap))
|
|
||||||
max_rbSize++;
|
max_rbSize++;
|
||||||
|
|
||||||
sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
||||||
@@ -1444,28 +1445,11 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
lcid < 4 ? "DCCH" : "DTCH",
|
lcid < 4 ? "DCCH" : "DTCH",
|
||||||
lcid,
|
lcid,
|
||||||
ndata,
|
ndata,
|
||||||
bufEnd-buf-+sizeof(NR_MAC_SUBHEADER_LONG));
|
bufEnd-buf-sizeof(NR_MAC_SUBHEADER_LONG));
|
||||||
|
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (lcid>=4) {
|
|
||||||
struct timespec time_request;
|
|
||||||
clock_gettime(CLOCK_REALTIME, &time_request);
|
|
||||||
LOG_D(NR_MAC,
|
|
||||||
"%4d.%2d [UE %04x]: Time %lu.%lu: %d bytes %s %d -> DLSCH (ndata %lu, remaining size %lu)\n",
|
|
||||||
frame,
|
|
||||||
slot,
|
|
||||||
rnti,
|
|
||||||
time_request.tv_sec,
|
|
||||||
time_request.tv_nsec,
|
|
||||||
len,
|
|
||||||
lcid < 4 ? "DCCH" : "DTCH",
|
|
||||||
lcid,
|
|
||||||
(unsigned long)ndata,
|
|
||||||
(unsigned long)(bufEnd-buf-+sizeof(NR_MAC_SUBHEADER_LONG)));
|
|
||||||
}
|
|
||||||
|
|
||||||
header->R = 0;
|
header->R = 0;
|
||||||
header->F = 1;
|
header->F = 1;
|
||||||
header->LCID = lcid;
|
header->LCID = lcid;
|
||||||
@@ -1492,6 +1476,10 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
header->L = htons(bufEnd-buf);
|
header->L = htons(bufEnd-buf);
|
||||||
dlsch_total_bytes += bufEnd-buf;
|
dlsch_total_bytes += bufEnd-buf;
|
||||||
|
|
||||||
|
for (; buf < bufEnd - 3; buf += 4) {
|
||||||
|
uint32_t *buf32 = (uint32_t *)buf;
|
||||||
|
*buf32 = lrand48();
|
||||||
|
}
|
||||||
for (; buf < bufEnd; buf++)
|
for (; buf < bufEnd; buf++)
|
||||||
*buf = lrand48() & 0xff;
|
*buf = lrand48() & 0xff;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -578,16 +578,24 @@ void nr_set_pdsch_semi_static(const NR_SIB1_t *sib1,
|
|||||||
bwpd = (NR_BWP_DownlinkDedicated_t*)bwpd0;
|
bwpd = (NR_BWP_DownlinkDedicated_t*)bwpd0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bwpd &&
|
// Prevent gNB to enable 256QAM table while the RRCProcessing timer is running.
|
||||||
bwpd->pdsch_Config &&
|
// For example, after the RRC created RRC Reconfiguration message we need to prevent gNB to apply another MCS table
|
||||||
bwpd->pdsch_Config->choice.setup &&
|
// before the RRC Reconfiguration being received by the UE, otherwise UE will not be able to decode PDSCH
|
||||||
bwpd->pdsch_Config->choice.setup->mcs_Table) {
|
// and the connection will drop.
|
||||||
if (*bwpd->pdsch_Config->choice.setup->mcs_Table == 0)
|
if (sched_ctrl->rrc_processing_timer == 0) {
|
||||||
ps->mcsTableIdx = 1;
|
if (bwpd &&
|
||||||
else
|
bwpd->pdsch_Config &&
|
||||||
ps->mcsTableIdx = 2;
|
bwpd->pdsch_Config->choice.setup &&
|
||||||
|
bwpd->pdsch_Config->choice.setup->mcs_Table) {
|
||||||
|
if (*bwpd->pdsch_Config->choice.setup->mcs_Table == 0) {
|
||||||
|
ps->mcsTableIdx = 1;
|
||||||
|
} else {
|
||||||
|
ps->mcsTableIdx = 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ps->mcsTableIdx = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else ps->mcsTableIdx = 0;
|
|
||||||
LOG_D(NR_MAC,"MCS Table Index: %d\n",ps->mcsTableIdx);
|
LOG_D(NR_MAC,"MCS Table Index: %d\n",ps->mcsTableIdx);
|
||||||
|
|
||||||
NR_PDSCH_Config_t *pdsch_Config=NULL;
|
NR_PDSCH_Config_t *pdsch_Config=NULL;
|
||||||
@@ -735,7 +743,7 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1,
|
|||||||
void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu,
|
void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu,
|
||||||
nr_scs_e scs_common,
|
nr_scs_e scs_common,
|
||||||
nr_scs_e pdcch_scs,
|
nr_scs_e pdcch_scs,
|
||||||
nr_frequency_range_e freq_range,
|
frequency_range_t freq_range,
|
||||||
uint8_t rmsi_pdcch_config,
|
uint8_t rmsi_pdcch_config,
|
||||||
uint8_t ssb_idx,
|
uint8_t ssb_idx,
|
||||||
uint8_t k_ssb,
|
uint8_t k_ssb,
|
||||||
@@ -2133,7 +2141,16 @@ void remove_nr_list(NR_list_t *listP, int id)
|
|||||||
prev = cur;
|
prev = cur;
|
||||||
cur = &listP->next[*cur];
|
cur = &listP->next[*cur];
|
||||||
}
|
}
|
||||||
AssertFatal(*cur != -1, "ID %d not found in UE_list\n", id);
|
if (*cur == -1) {
|
||||||
|
cur = &listP->head;
|
||||||
|
prev=&listP->head;
|
||||||
|
while (*cur != -1 && *cur != id) {
|
||||||
|
LOG_I(NR_MAC,"remove_nr_list : id %d, *cur %d\n",id,*cur);
|
||||||
|
prev = cur;
|
||||||
|
cur = &listP->next[*cur];
|
||||||
|
}
|
||||||
|
AssertFatal(1==0, "ID %d not found in UE_list\n", id);
|
||||||
|
}
|
||||||
int *next = &listP->next[*cur];
|
int *next = &listP->next[*cur];
|
||||||
*cur = listP->next[*cur];
|
*cur = listP->next[*cur];
|
||||||
*next = -1;
|
*next = -1;
|
||||||
@@ -2597,6 +2614,11 @@ void nr_csirs_scheduling(int Mod_idP,
|
|||||||
for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
|
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];
|
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
||||||
|
|
||||||
|
if (sched_ctrl->rrc_processing_timer > 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
|
NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
|
||||||
|
|
||||||
if (!CellGroup || !CellGroup->spCellConfig || !CellGroup->spCellConfig->spCellConfigDedicated ||
|
if (!CellGroup || !CellGroup->spCellConfig || !CellGroup->spCellConfig->spCellConfigDedicated ||
|
||||||
@@ -2796,6 +2818,70 @@ void nr_csirs_scheduling(int Mod_idP,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nr_mac_update_timers(module_id_t module_id,
|
||||||
|
frame_t frame,
|
||||||
|
sub_frame_t slot) {
|
||||||
|
NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
|
||||||
|
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->rrc_processing_timer > 0) {
|
||||||
|
sched_ctrl->rrc_processing_timer--;
|
||||||
|
if (sched_ctrl->rrc_processing_timer == 0) {
|
||||||
|
LOG_I(NR_MAC, "(%d.%d) De-activating RRC processing timer for UE %d\n", frame, slot, UE_id);
|
||||||
|
|
||||||
|
const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
|
||||||
|
NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
|
||||||
|
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
|
||||||
|
|
||||||
|
NR_BWP_Downlink_t *bwp = sched_ctrl->active_bwp;
|
||||||
|
NR_BWP_DownlinkDedicated_t *bwpd = cg &&
|
||||||
|
cg->spCellConfig &&
|
||||||
|
cg->spCellConfig->spCellConfigDedicated ?
|
||||||
|
cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
|
||||||
|
int **preferred_dl_tda = RC.nrmac[module_id]->preferred_dl_tda;
|
||||||
|
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
|
||||||
|
|
||||||
|
const uint8_t layers = set_dl_nrOfLayers(sched_ctrl);
|
||||||
|
const int tda = bwp && preferred_dl_tda[bwp->bwp_Id][slot] >= 0 ?
|
||||||
|
preferred_dl_tda[bwp->bwp_Id][slot] : (ps->time_domain_allocation >= 0 ? ps->time_domain_allocation : 0);
|
||||||
|
|
||||||
|
nr_set_pdsch_semi_static(sib1,
|
||||||
|
scc,
|
||||||
|
cg,
|
||||||
|
bwp,
|
||||||
|
bwpd,
|
||||||
|
tda,
|
||||||
|
layers,
|
||||||
|
sched_ctrl,
|
||||||
|
ps);
|
||||||
|
|
||||||
|
NR_BWP_Uplink_t *ubwp = sched_ctrl->active_ubwp;
|
||||||
|
NR_BWP_UplinkDedicated_t *ubwpd = cg &&
|
||||||
|
cg->spCellConfig &&
|
||||||
|
cg->spCellConfig->spCellConfigDedicated &&
|
||||||
|
cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
|
||||||
|
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
|
||||||
|
int **preferred_ul_tda = RC.nrmac[module_id]->preferred_ul_tda;
|
||||||
|
NR_pusch_semi_static_t *ups = &sched_ctrl->pusch_semi_static;
|
||||||
|
|
||||||
|
int dci_format = get_dci_format(sched_ctrl);
|
||||||
|
const uint8_t num_dmrs_cdm_grps_no_data = (ubwp || ubwpd) ? 1 : 2;
|
||||||
|
const int utda = ubwp && preferred_ul_tda[ubwp->bwp_Id][slot] >= 0 ?
|
||||||
|
preferred_ul_tda[ubwp->bwp_Id][slot] : (ups->time_domain_allocation >= 0 ? ups->time_domain_allocation : 0);
|
||||||
|
|
||||||
|
nr_set_pusch_semi_static(sib1,
|
||||||
|
scc,
|
||||||
|
ubwp,
|
||||||
|
ubwpd,
|
||||||
|
dci_format,
|
||||||
|
utda,
|
||||||
|
num_dmrs_cdm_grps_no_data,
|
||||||
|
ups);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*void fill_nfapi_coresets_and_searchspaces(NR_CellGroupConfig_t *cg,
|
/*void fill_nfapi_coresets_and_searchspaces(NR_CellGroupConfig_t *cg,
|
||||||
nfapi_nr_coreset_t *coreset,
|
nfapi_nr_coreset_t *coreset,
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ void nr_schedule_srs(int module_id, frame_t frame) {
|
|||||||
sched_ctrl->sched_srs.slot = -1;
|
sched_ctrl->sched_srs.slot = -1;
|
||||||
sched_ctrl->sched_srs.srs_scheduled = false;
|
sched_ctrl->sched_srs.srs_scheduled = false;
|
||||||
|
|
||||||
if(!UE_info->Msg4_ACKed[UE_id]) {
|
if(!UE_info->Msg4_ACKed[UE_id] || sched_ctrl->rrc_processing_timer > 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -218,7 +218,9 @@ void nr_csi_meas_reporting(int Mod_idP,
|
|||||||
for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
|
for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
|
||||||
const NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
|
const NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
|
||||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
||||||
if (sched_ctrl->ul_failure==1 && get_softmodem_params()->phy_test==0) continue;
|
if ((sched_ctrl->rrc_processing_timer > 0) || (sched_ctrl->ul_failure==1 && get_softmodem_params()->phy_test==0)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (!CellGroup || !CellGroup->spCellConfig || !CellGroup->spCellConfig->spCellConfigDedicated ||
|
if (!CellGroup || !CellGroup->spCellConfig || !CellGroup->spCellConfig->spCellConfigDedicated ||
|
||||||
!CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig) continue;
|
!CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig) continue;
|
||||||
const NR_CSI_MeasConfig_t *csi_measconfig = CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
|
const NR_CSI_MeasConfig_t *csi_measconfig = CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
|
||||||
@@ -1126,18 +1128,10 @@ int nr_acknack_scheduling(int mod_id,
|
|||||||
const NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels[CC_id].ServingCellConfigCommon;
|
const NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels[CC_id].ServingCellConfigCommon;
|
||||||
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
||||||
const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
|
const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
|
||||||
// initializing the values for FDD
|
AssertFatal(tdd || RC.nrmac[mod_id]->common_channels[CC_id].frame_type == FDD, "Dynamic TDD not handled yet\n");
|
||||||
int nr_slots_period = n_slots_frame;
|
const int nr_slots_period = tdd ? n_slots_frame / get_nb_periods_per_frame(tdd->dl_UL_TransmissionPeriodicity) : n_slots_frame;
|
||||||
int first_ul_slot_tdd = slot + minfbtime;
|
const int next_ul_slot = tdd ? tdd->nrofDownlinkSlots + nr_slots_period * (slot / nr_slots_period) : slot + minfbtime;
|
||||||
int first_ul_slot_period = 0;
|
const int first_ul_slot_period = tdd ? tdd->nrofDownlinkSlots : 0;
|
||||||
if(tdd){
|
|
||||||
nr_slots_period /= get_nb_periods_per_frame(tdd->dl_UL_TransmissionPeriodicity);
|
|
||||||
first_ul_slot_tdd = tdd->nrofDownlinkSlots + nr_slots_period * (slot / nr_slots_period);
|
|
||||||
first_ul_slot_period = tdd->nrofDownlinkSlots;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
// if TDD configuration is not present and the band is not FDD, it means it is a dynamic TDD configuration
|
|
||||||
AssertFatal(RC.nrmac[mod_id]->common_channels[CC_id].frame_type == FDD,"Dynamic TDD not handled yet\n");
|
|
||||||
|
|
||||||
|
|
||||||
/* for the moment, we consider:
|
/* for the moment, we consider:
|
||||||
@@ -1257,7 +1251,8 @@ int nr_acknack_scheduling(int mod_id,
|
|||||||
if (!(csi_pucch &&
|
if (!(csi_pucch &&
|
||||||
csi_pucch->csi_bits > 0 &&
|
csi_pucch->csi_bits > 0 &&
|
||||||
csi_pucch->frame == f &&
|
csi_pucch->frame == f &&
|
||||||
csi_pucch->ul_slot == s)) nr_fill_nfapi_pucch(mod_id, frame, slot, pucch, UE_id);
|
csi_pucch->ul_slot == s))
|
||||||
|
nr_fill_nfapi_pucch(mod_id, frame, slot, pucch, UE_id);
|
||||||
memset(pucch, 0, sizeof(*pucch));
|
memset(pucch, 0, sizeof(*pucch));
|
||||||
pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f;
|
pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f;
|
||||||
if(((s + 1)%nr_slots_period) == 0)
|
if(((s + 1)%nr_slots_period) == 0)
|
||||||
@@ -1292,8 +1287,8 @@ int nr_acknack_scheduling(int mod_id,
|
|||||||
AssertFatal(pucch->sr_flag + pucch->dai_c == 0,
|
AssertFatal(pucch->sr_flag + pucch->dai_c == 0,
|
||||||
"expected no SR/AckNack for UE %d in %4d.%2d, but has %d/%d for %4d.%2d\n",
|
"expected no SR/AckNack for UE %d in %4d.%2d, but has %d/%d for %4d.%2d\n",
|
||||||
UE_id, frame, slot, pucch->sr_flag, pucch->dai_c, pucch->frame, pucch->ul_slot);
|
UE_id, frame, slot, pucch->sr_flag, pucch->dai_c, pucch->frame, pucch->ul_slot);
|
||||||
const int s = first_ul_slot_tdd;
|
const int s = next_ul_slot;
|
||||||
pucch->frame = (s < n_slots_frame - 1) ? frame : (frame + 1) % 1024;
|
pucch->frame = s < n_slots_frame ? frame : (frame + 1) % 1024;
|
||||||
pucch->ul_slot = s % n_slots_frame;
|
pucch->ul_slot = s % n_slots_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1487,8 +1482,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
|
|||||||
pdu->sr_flag = 1;
|
pdu->sr_flag = 1;
|
||||||
nfapi_allocated = true;
|
nfapi_allocated = true;
|
||||||
break;
|
break;
|
||||||
}
|
} else if (pdu->rnti == UE_info->rnti[UE_id]
|
||||||
else if (pdu->rnti == UE_info->rnti[UE_id]
|
|
||||||
&& pdu->format_type == 2 // does not use NR_PUCCH_Resource__format_PR_format0
|
&& pdu->format_type == 2 // does not use NR_PUCCH_Resource__format_PR_format0
|
||||||
&& pdu->nr_of_symbols == pucch_res->format.choice.format2->nrofSymbols
|
&& pdu->nr_of_symbols == pucch_res->format.choice.format2->nrofSymbols
|
||||||
&& pdu->start_symbol_index == pucch_res->format.choice.format2->startingSymbolIndex) {
|
&& pdu->start_symbol_index == pucch_res->format.choice.format2->startingSymbolIndex) {
|
||||||
@@ -1496,9 +1490,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
|
|||||||
pdu->sr_flag = 1;
|
pdu->sr_flag = 1;
|
||||||
nfapi_allocated = true;
|
nfapi_allocated = true;
|
||||||
break;
|
break;
|
||||||
|
} else if (pdu->rnti == UE_info->rnti[UE_id]
|
||||||
}
|
|
||||||
else if (pdu->rnti == UE_info->rnti[UE_id]
|
|
||||||
&& pdu->format_type == 1 // does not use NR_PUCCH_Resource__format_PR_format0
|
&& pdu->format_type == 1 // does not use NR_PUCCH_Resource__format_PR_format0
|
||||||
&& pdu->nr_of_symbols == pucch_res->format.choice.format1->nrofSymbols
|
&& pdu->nr_of_symbols == pucch_res->format.choice.format1->nrofSymbols
|
||||||
&& pdu->start_symbol_index == pucch_res->format.choice.format1->startingSymbolIndex) {
|
&& pdu->start_symbol_index == pucch_res->format.choice.format1->startingSymbolIndex) {
|
||||||
@@ -1506,9 +1498,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
|
|||||||
pdu->sr_flag = 1;
|
pdu->sr_flag = 1;
|
||||||
nfapi_allocated = true;
|
nfapi_allocated = true;
|
||||||
break;
|
break;
|
||||||
|
} else if (pdu->rnti == UE_info->rnti[UE_id]
|
||||||
}
|
|
||||||
else if (pdu->rnti == UE_info->rnti[UE_id]
|
|
||||||
&& pdu->format_type == 3 // does not use NR_PUCCH_Resource__format_PR_format0
|
&& pdu->format_type == 3 // does not use NR_PUCCH_Resource__format_PR_format0
|
||||||
&& pdu->nr_of_symbols == pucch_res->format.choice.format3->nrofSymbols
|
&& pdu->nr_of_symbols == pucch_res->format.choice.format3->nrofSymbols
|
||||||
&& pdu->start_symbol_index == pucch_res->format.choice.format3->startingSymbolIndex) {
|
&& pdu->start_symbol_index == pucch_res->format.choice.format3->startingSymbolIndex) {
|
||||||
@@ -1516,9 +1506,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
|
|||||||
pdu->sr_flag = 1;
|
pdu->sr_flag = 1;
|
||||||
nfapi_allocated = true;
|
nfapi_allocated = true;
|
||||||
break;
|
break;
|
||||||
|
} else if (pdu->rnti == UE_info->rnti[UE_id]
|
||||||
}
|
|
||||||
else if (pdu->rnti == UE_info->rnti[UE_id]
|
|
||||||
&& pdu->format_type == 4 // does not use NR_PUCCH_Resource__format_PR_format0
|
&& pdu->format_type == 4 // does not use NR_PUCCH_Resource__format_PR_format0
|
||||||
&& pdu->nr_of_symbols == pucch_res->format.choice.format4->nrofSymbols
|
&& pdu->nr_of_symbols == pucch_res->format.choice.format4->nrofSymbols
|
||||||
&& pdu->start_symbol_index == pucch_res->format.choice.format4->startingSymbolIndex) {
|
&& pdu->start_symbol_index == pucch_res->format.choice.format4->startingSymbolIndex) {
|
||||||
|
|||||||
@@ -457,19 +457,14 @@ int nr_process_mac_pdu(module_id_t module_idP,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct timespec time_request;
|
LOG_D(NR_MAC, "[UE %x] %d.%d: ULSCH -> UL-%s %d (gNB %d, %d bytes)\n",
|
||||||
clock_gettime(CLOCK_REALTIME, &time_request);
|
UE_info->rnti[UE_id],
|
||||||
LOG_D(NR_MAC, "In %s: [UE %d] %d.%d : Time %lu.%lu ULSCH -> UL-%s %d (gNB %d, %d bytes)\n",
|
frameP,
|
||||||
__func__,
|
slot,
|
||||||
module_idP,
|
rx_lcid<4?"DCCH":"DTCH",
|
||||||
frameP,
|
rx_lcid,
|
||||||
slot,
|
module_idP,
|
||||||
time_request.tv_sec,
|
mac_len);
|
||||||
time_request.tv_nsec,
|
|
||||||
rx_lcid<4?"DCCH":"DTCH",
|
|
||||||
rx_lcid,
|
|
||||||
module_idP,
|
|
||||||
mac_len);
|
|
||||||
UE_info->mac_stats[UE_id].lc_bytes_rx[rx_lcid] += mac_len;
|
UE_info->mac_stats[UE_id].lc_bytes_rx[rx_lcid] += mac_len;
|
||||||
|
|
||||||
mac_rlc_data_ind(module_idP,
|
mac_rlc_data_ind(module_idP,
|
||||||
@@ -666,11 +661,11 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
UE_scheduling_control->ta_update = timing_advance;
|
UE_scheduling_control->ta_update = timing_advance;
|
||||||
UE_scheduling_control->raw_rssi = rssi;
|
UE_scheduling_control->raw_rssi = rssi;
|
||||||
UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640;
|
UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640;
|
||||||
LOG_D(NR_MAC, "[UE %d] PUSCH TPC %d and TA %d\n",UE_id,UE_scheduling_control->tpc0,UE_scheduling_control->ta_update);
|
LOG_D(NR_MAC, "[UE %d] PUSCH TPC %d (SNRx10 %d) and TA %d\n",UE_id,UE_scheduling_control->tpc0,UE_scheduling_control->pusch_snrx10,UE_scheduling_control->ta_update);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
LOG_D(NR_MAC,"[UE %d] Detected DTX : increasing UE TX power\n",UE_id);
|
LOG_D(NR_MAC,"[UE %d] Detected DTX : increasing UE TX power\n",UE_id);
|
||||||
UE_scheduling_control->tpc0 = 3;
|
UE_scheduling_control->tpc0 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
|
#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
|
||||||
@@ -743,20 +738,20 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(no_sig) {
|
if(no_sig) {
|
||||||
LOG_W(NR_MAC, "Random Access %i failed at state %i (no signal)\n", i, ra->state);
|
LOG_D(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_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
||||||
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// random access pusch with TC-RNTI
|
// random access pusch with TC-RNTI
|
||||||
if (ra->rnti != current_rnti) {
|
if (ra->rnti != current_rnti) {
|
||||||
LOG_W(NR_MAC,
|
LOG_D(NR_MAC,
|
||||||
"expected TC_RNTI %04x to match current RNTI %04x\n",
|
"expected TC_RNTI %04x to match current RNTI %04x\n",
|
||||||
ra->rnti,
|
ra->rnti,
|
||||||
current_rnti);
|
current_rnti);
|
||||||
|
|
||||||
if( (frameP==ra->Msg3_frame) && (slotP==ra->Msg3_slot) ) {
|
if( (frameP==ra->Msg3_frame) && (slotP==ra->Msg3_slot) ) {
|
||||||
LOG_W(NR_MAC, "Random Access %i failed at state %i (TC_RNTI %04x RNTI %04x)\n", i, ra->state,ra->rnti,current_rnti);
|
LOG_D(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_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
||||||
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
||||||
}
|
}
|
||||||
@@ -768,7 +763,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
|
|
||||||
UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti, ra->CellGroup);
|
UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti, ra->CellGroup);
|
||||||
if (UE_id<0) {
|
if (UE_id<0) {
|
||||||
LOG_W(NR_MAC, "Random Access %i discarded at state %i (TC_RNTI %04x RNTI %04x): max number of users achieved!\n", i, ra->state,ra->rnti,current_rnti);
|
LOG_D(NR_MAC, "Random Access %i discarded at state %i (TC_RNTI %04x RNTI %04x): max number of users achieved!\n", i, ra->state,ra->rnti,current_rnti);
|
||||||
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
||||||
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
||||||
return;
|
return;
|
||||||
@@ -866,20 +861,20 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
|
|
||||||
// for CFRA (NSA) do not schedule retransmission of msg3
|
// for CFRA (NSA) do not schedule retransmission of msg3
|
||||||
if (ra->cfra) {
|
if (ra->cfra) {
|
||||||
LOG_W(NR_MAC, "Random Access %i failed at state %i (NSA msg3 reception failed)\n", i, ra->state);
|
LOG_D(NR_MAC, "Random Access %i failed at state %i (NSA msg3 reception failed)\n", i, ra->state);
|
||||||
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
||||||
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ra->msg3_round >= MAX_HARQ_ROUNDS - 1) {
|
if (ra->msg3_round >= MAX_HARQ_ROUNDS - 1) {
|
||||||
LOG_W(NR_MAC, "Random Access %i failed at state %i (Reached msg3 max harq rounds)\n", i, ra->state);
|
LOG_D(NR_MAC, "Random Access %i failed at state %i (Reached msg3 max harq rounds)\n", i, ra->state);
|
||||||
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
||||||
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_W(NR_MAC, "Random Access %i Msg3 CRC did not pass)\n", i);
|
LOG_D(NR_MAC, "Random Access %i Msg3 CRC did not pass)\n", i);
|
||||||
ra->msg3_round++;
|
ra->msg3_round++;
|
||||||
ra->state = Msg3_retransmission;
|
ra->state = Msg3_retransmission;
|
||||||
}
|
}
|
||||||
@@ -999,8 +994,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
|
|||||||
|
|
||||||
if (ps->time_domain_allocation != tda
|
if (ps->time_domain_allocation != tda
|
||||||
|| ps->dci_format != dci_format
|
|| ps->dci_format != dci_format
|
||||||
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data
|
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) {
|
||||||
|| sched_ctrl->update_pusch_ps) {
|
|
||||||
nr_set_pusch_semi_static(sib1,
|
nr_set_pusch_semi_static(sib1,
|
||||||
scc,
|
scc,
|
||||||
sched_ctrl->active_ubwp,
|
sched_ctrl->active_ubwp,
|
||||||
@@ -1009,12 +1003,11 @@ bool allocate_ul_retransmission(module_id_t module_id,
|
|||||||
tda,
|
tda,
|
||||||
num_dmrs_cdm_grps_no_data,
|
num_dmrs_cdm_grps_no_data,
|
||||||
ps);
|
ps);
|
||||||
sched_ctrl->update_pusch_ps = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check the resource is enough for retransmission */
|
/* Check the resource is enough for retransmission */
|
||||||
while (rbStart < bwpSize &&
|
const uint16_t slbitmap = SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols);
|
||||||
!(rballoc_mask[rbStart]&SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols)))
|
while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap)
|
||||||
rbStart++;
|
rbStart++;
|
||||||
if (rbStart + retInfo->rbSize > bwpSize) {
|
if (rbStart + retInfo->rbSize > bwpSize) {
|
||||||
LOG_W(NR_MAC, "cannot allocate retransmission of UE %d/RNTI %04x: no resources (rbStart %d, retInfo->rbSize %d, bwpSize %d\n", UE_id, UE_info->rnti[UE_id], rbStart, retInfo->rbSize, bwpSize);
|
LOG_W(NR_MAC, "cannot allocate retransmission of UE %d/RNTI %04x: no resources (rbStart %d, retInfo->rbSize %d, bwpSize %d\n", UE_id, UE_info->rnti[UE_id], rbStart, retInfo->rbSize, bwpSize);
|
||||||
@@ -1034,12 +1027,11 @@ bool allocate_ul_retransmission(module_id_t module_id,
|
|||||||
&temp_ps);
|
&temp_ps);
|
||||||
/* the retransmission will use a different time domain allocation, check
|
/* the retransmission will use a different time domain allocation, check
|
||||||
* that we have enough resources */
|
* that we have enough resources */
|
||||||
while (rbStart < bwpSize &&
|
const uint16_t slbitmap = SL_to_bitmap(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols);
|
||||||
!(rballoc_mask[rbStart]&SL_to_bitmap(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols)))
|
while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap)
|
||||||
rbStart++;
|
rbStart++;
|
||||||
int rbSize = 0;
|
int rbSize = 0;
|
||||||
while (rbStart + rbSize < bwpSize &&
|
while (rbStart + rbSize < bwpSize && (rballoc_mask[rbStart + rbSize] & slbitmap) == slbitmap)
|
||||||
(rballoc_mask[rbStart + rbSize]&SL_to_bitmap(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols)))
|
|
||||||
rbSize++;
|
rbSize++;
|
||||||
uint32_t new_tbs;
|
uint32_t new_tbs;
|
||||||
uint16_t new_rbSize;
|
uint16_t new_rbSize;
|
||||||
@@ -1212,8 +1204,9 @@ void pf_ul(module_id_t module_id,
|
|||||||
const bool do_sched = nr_UE_is_to_be_scheduled(module_id, 0, UE_id, sched_pusch->frame, sched_pusch->slot);
|
const bool do_sched = nr_UE_is_to_be_scheduled(module_id, 0, UE_id, sched_pusch->frame, sched_pusch->slot);
|
||||||
|
|
||||||
LOG_D(NR_MAC,"pf_ul: do_sched UE %d => %s\n",UE_id,do_sched ? "yes" : "no");
|
LOG_D(NR_MAC,"pf_ul: do_sched UE %d => %s\n",UE_id,do_sched ? "yes" : "no");
|
||||||
if (B == 0 && !do_sched)
|
if ((B == 0 && !do_sched) || (sched_ctrl->rrc_processing_timer > 0)) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* Schedule UE on SR or UL inactivity and no data (otherwise, will be scheduled
|
/* Schedule UE on SR or UL inactivity and no data (otherwise, will be scheduled
|
||||||
* based on data to transmit) */
|
* based on data to transmit) */
|
||||||
@@ -1257,8 +1250,7 @@ void pf_ul(module_id_t module_id,
|
|||||||
const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
|
const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
|
||||||
if (ps->time_domain_allocation != tda
|
if (ps->time_domain_allocation != tda
|
||||||
|| ps->dci_format != dci_format
|
|| ps->dci_format != dci_format
|
||||||
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data
|
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) {
|
||||||
|| sched_ctrl->update_pusch_ps) {
|
|
||||||
nr_set_pusch_semi_static(sib1,
|
nr_set_pusch_semi_static(sib1,
|
||||||
scc,
|
scc,
|
||||||
sched_ctrl->active_ubwp,
|
sched_ctrl->active_ubwp,
|
||||||
@@ -1267,12 +1259,11 @@ void pf_ul(module_id_t module_id,
|
|||||||
tda,
|
tda,
|
||||||
num_dmrs_cdm_grps_no_data,
|
num_dmrs_cdm_grps_no_data,
|
||||||
ps);
|
ps);
|
||||||
sched_ctrl->update_pusch_ps = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(NR_MAC,"Looking for min_rb %d RBs, starting at %d\n", min_rb, rbStart);
|
LOG_D(NR_MAC,"Looking for min_rb %d RBs, starting at %d\n", min_rb, rbStart);
|
||||||
while (rbStart < bwpSize &&
|
const uint16_t slbitmap = SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols);
|
||||||
!(rballoc_mask[rbStart]&SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols)))
|
while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap)
|
||||||
rbStart++;
|
rbStart++;
|
||||||
if (rbStart + min_rb >= bwpSize) {
|
if (rbStart + min_rb >= bwpSize) {
|
||||||
LOG_W(NR_MAC, "cannot allocate continuous UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n",
|
LOG_W(NR_MAC, "cannot allocate continuous UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n",
|
||||||
@@ -1305,7 +1296,7 @@ void pf_ul(module_id_t module_id,
|
|||||||
/* Mark the corresponding RBs as used */
|
/* Mark the corresponding RBs as used */
|
||||||
n_rb_sched -= sched_pusch->rbSize;
|
n_rb_sched -= sched_pusch->rbSize;
|
||||||
for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++)
|
for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++)
|
||||||
rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] ^= SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols);
|
rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] ^= slbitmap;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -1395,8 +1386,7 @@ void pf_ul(module_id_t module_id,
|
|||||||
const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
|
const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
|
||||||
if (ps->time_domain_allocation != tda
|
if (ps->time_domain_allocation != tda
|
||||||
|| ps->dci_format != dci_format
|
|| ps->dci_format != dci_format
|
||||||
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data
|
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) {
|
||||||
|| sched_ctrl->update_pusch_ps) {
|
|
||||||
nr_set_pusch_semi_static(sib1,
|
nr_set_pusch_semi_static(sib1,
|
||||||
scc,
|
scc,
|
||||||
sched_ctrl->active_ubwp,
|
sched_ctrl->active_ubwp,
|
||||||
@@ -1405,17 +1395,15 @@ void pf_ul(module_id_t module_id,
|
|||||||
tda,
|
tda,
|
||||||
num_dmrs_cdm_grps_no_data,
|
num_dmrs_cdm_grps_no_data,
|
||||||
ps);
|
ps);
|
||||||
sched_ctrl->update_pusch_ps = false;
|
|
||||||
}
|
}
|
||||||
update_ul_ue_R_Qm(sched_pusch, ps);
|
update_ul_ue_R_Qm(sched_pusch, ps);
|
||||||
|
|
||||||
while (rbStart < bwpSize &&
|
const uint16_t slbitmap = SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols);
|
||||||
!(rballoc_mask[rbStart]&SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols)))
|
while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap)
|
||||||
rbStart++;
|
rbStart++;
|
||||||
sched_pusch->rbStart = rbStart;
|
sched_pusch->rbStart = rbStart;
|
||||||
uint16_t max_rbSize = 1;
|
uint16_t max_rbSize = 1;
|
||||||
while (rbStart + max_rbSize < bwpSize &&
|
while (rbStart + max_rbSize < bwpSize && (rballoc_mask[rbStart + max_rbSize] & slbitmap) == slbitmap)
|
||||||
(rballoc_mask[rbStart + max_rbSize]&&SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols)))
|
|
||||||
max_rbSize++;
|
max_rbSize++;
|
||||||
|
|
||||||
if (rbStart + min_rb >= bwpSize) {
|
if (rbStart + min_rb >= bwpSize) {
|
||||||
@@ -1457,7 +1445,7 @@ void pf_ul(module_id_t module_id,
|
|||||||
|
|
||||||
n_rb_sched -= sched_pusch->rbSize;
|
n_rb_sched -= sched_pusch->rbSize;
|
||||||
for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++)
|
for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++)
|
||||||
rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] ^= SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols);
|
rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] ^= slbitmap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1491,7 +1479,7 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
|
|||||||
if (tda < 0)
|
if (tda < 0)
|
||||||
return false;
|
return false;
|
||||||
int K2 = get_K2(scc, scc_sib1, sched_ctrl->active_ubwp, tda, mu);
|
int K2 = get_K2(scc, scc_sib1, sched_ctrl->active_ubwp, tda, mu);
|
||||||
const int sched_frame = (frame + (slot + K2 >= nr_slots_per_frame[mu]))&1023;
|
const int sched_frame = (frame + (slot + K2 >= nr_slots_per_frame[mu])) & 1023;
|
||||||
const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
|
const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
|
||||||
|
|
||||||
if (!is_xlsch_in_slot(nr_mac->ulsch_slot_bitmap[sched_slot / 64], sched_slot))
|
if (!is_xlsch_in_slot(nr_mac->ulsch_slot_bitmap[sched_slot / 64], sched_slot))
|
||||||
|
|||||||
@@ -46,6 +46,11 @@ void config_common(int Mod_idP,
|
|||||||
int pusch_AntennaPorts,
|
int pusch_AntennaPorts,
|
||||||
NR_ServingCellConfigCommon_t *scc);
|
NR_ServingCellConfigCommon_t *scc);
|
||||||
|
|
||||||
|
int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP,
|
||||||
|
rnti_t rnti,
|
||||||
|
NR_SubcarrierSpacing_t subcarrierSpacing,
|
||||||
|
uint32_t rrc_reconfiguration_delay);
|
||||||
|
|
||||||
int rrc_mac_config_req_gNB(module_id_t Mod_idP,
|
int rrc_mac_config_req_gNB(module_id_t Mod_idP,
|
||||||
int ssb_SubcarrierOffset,
|
int ssb_SubcarrierOffset,
|
||||||
rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts,
|
rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts,
|
||||||
@@ -64,6 +69,10 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
|
|||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t subframeP);
|
sub_frame_t subframeP);
|
||||||
|
|
||||||
|
void nr_mac_update_timers(module_id_t module_id,
|
||||||
|
frame_t frame,
|
||||||
|
sub_frame_t slot);
|
||||||
|
|
||||||
void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
|
void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
|
||||||
frame_t frame_rxP, sub_frame_t slot_rxP);
|
frame_t frame_rxP, sub_frame_t slot_rxP);
|
||||||
|
|
||||||
@@ -222,7 +231,7 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
|
|||||||
void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu,
|
void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu,
|
||||||
nr_scs_e scs_common,
|
nr_scs_e scs_common,
|
||||||
nr_scs_e pdcch_scs,
|
nr_scs_e pdcch_scs,
|
||||||
nr_frequency_range_e freq_range,
|
frequency_range_t freq_range,
|
||||||
uint8_t rmsi_pdcch_config,
|
uint8_t rmsi_pdcch_config,
|
||||||
uint8_t ssb_idx,
|
uint8_t ssb_idx,
|
||||||
uint8_t k_ssb,
|
uint8_t k_ssb,
|
||||||
@@ -498,6 +507,7 @@ void set_dl_mcs(NR_sched_pdsch_t *sched_pdsch,
|
|||||||
|
|
||||||
uint8_t set_dl_nrOfLayers(NR_UE_sched_ctrl_t *sched_ctrl);
|
uint8_t set_dl_nrOfLayers(NR_UE_sched_ctrl_t *sched_ctrl);
|
||||||
|
|
||||||
|
int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl);
|
||||||
void calculate_preferred_dl_tda(module_id_t module_id, const NR_BWP_Downlink_t *bwp);
|
void calculate_preferred_dl_tda(module_id_t module_id, const NR_BWP_Downlink_t *bwp);
|
||||||
void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ubwp);
|
void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ubwp);
|
||||||
|
|
||||||
|
|||||||
@@ -597,8 +597,6 @@ typedef struct {
|
|||||||
int ul_failure;
|
int ul_failure;
|
||||||
struct CSI_Report CSI_report;
|
struct CSI_Report CSI_report;
|
||||||
bool SR;
|
bool SR;
|
||||||
bool update_pdsch_ps;
|
|
||||||
bool update_pusch_ps;
|
|
||||||
bool set_mcs;
|
bool set_mcs;
|
||||||
/// information about every HARQ process
|
/// information about every HARQ process
|
||||||
NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
|
NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
|
||||||
@@ -617,12 +615,13 @@ typedef struct {
|
|||||||
/// UL HARQ processes that await retransmission
|
/// UL HARQ processes that await retransmission
|
||||||
NR_list_t retrans_ul_harq;
|
NR_list_t retrans_ul_harq;
|
||||||
NR_UE_mac_ce_ctrl_t UE_mac_ce_ctrl;// MAC CE related information
|
NR_UE_mac_ce_ctrl_t UE_mac_ce_ctrl;// MAC CE related information
|
||||||
|
|
||||||
/// number of active DL LCs
|
/// number of active DL LCs
|
||||||
uint8_t dl_lc_num;
|
uint8_t dl_lc_num;
|
||||||
/// order in which DLSCH scheduler should allocate LCs
|
/// order in which DLSCH scheduler should allocate LCs
|
||||||
uint8_t dl_lc_ids[NR_MAX_NUM_LCID];
|
uint8_t dl_lc_ids[NR_MAX_NUM_LCID];
|
||||||
|
|
||||||
|
/// Timer for RRC processing procedures
|
||||||
|
uint32_t rrc_processing_timer;
|
||||||
} NR_UE_sched_ctrl_t;
|
} NR_UE_sched_ctrl_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ static void nr_pdcp_entity_recv_pdu(nr_pdcp_entity_t *entity,
|
|||||||
|
|
||||||
if (rcvd_count < entity->rx_deliv
|
if (rcvd_count < entity->rx_deliv
|
||||||
|| nr_pdcp_sdu_in_list(entity->rx_list, rcvd_count)) {
|
|| nr_pdcp_sdu_in_list(entity->rx_list, rcvd_count)) {
|
||||||
LOG_W(PDCP, "discard NR PDU rcvd_count=%d\n", rcvd_count);
|
LOG_W(PDCP, "discard NR PDU rcvd_count=%d, entity->rx_deliv %d,sdu_in_list %d\n", rcvd_count,entity->rx_deliv,nr_pdcp_sdu_in_list(entity->rx_list,rcvd_count));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -711,9 +711,7 @@ rb_found:
|
|||||||
|
|
||||||
memblock = get_free_mem_block(size, __FUNCTION__);
|
memblock = get_free_mem_block(size, __FUNCTION__);
|
||||||
memcpy(memblock->data, buf, size);
|
memcpy(memblock->data, buf, size);
|
||||||
struct timespec time_request;
|
LOG_D(PDCP, "%s(): (srb %d) calling rlc_data_req size %d\n", __func__, rb_id, size);
|
||||||
clock_gettime(CLOCK_REALTIME, &time_request);
|
|
||||||
LOG_D(PDCP, "%s(): (rb %d) calling enqueue_rlc_data_req size %d at time %lu.%lu\n", __func__, rb_id, size,time_request.tv_sec,time_request.tv_nsec);
|
|
||||||
//for (i = 0; i < size; i++) printf(" %2.2x", (unsigned char)memblock->data[i]);
|
//for (i = 0; i < size; i++) printf(" %2.2x", (unsigned char)memblock->data[i]);
|
||||||
//printf("\n");
|
//printf("\n");
|
||||||
enqueue_rlc_data_req(&ctxt, 0, MBMS_FLAG_NO, rb_id, sdu_id, 0, size, memblock);
|
enqueue_rlc_data_req(&ctxt, 0, MBMS_FLAG_NO, rb_id, sdu_id, 0, size, memblock);
|
||||||
@@ -968,7 +966,7 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s,
|
|||||||
has_sdapDLheader = s->cnAssociation->choice.sdap_Config->sdap_HeaderDL == NR_SDAP_Config__sdap_HeaderDL_present ? 1 : 0;
|
has_sdapDLheader = s->cnAssociation->choice.sdap_Config->sdap_HeaderDL == NR_SDAP_Config__sdap_HeaderDL_present ? 1 : 0;
|
||||||
has_sdap = has_sdapULheader | has_sdapDLheader;
|
has_sdap = has_sdapULheader | has_sdapDLheader;
|
||||||
is_sdap_DefaultDRB = s->cnAssociation->choice.sdap_Config->defaultDRB == true ? 1 : 0;
|
is_sdap_DefaultDRB = s->cnAssociation->choice.sdap_Config->defaultDRB == true ? 1 : 0;
|
||||||
mappedQFIs2Add = (NR_QFI_t*)s->cnAssociation->choice.sdap_Config->mappedQoS_FlowsToAdd->list.array[0];
|
mappedQFIs2Add = (NR_QFI_t*)s->cnAssociation->choice.sdap_Config->mappedQoS_FlowsToAdd->list.array[0];
|
||||||
mappedQFIs2AddCount = s->cnAssociation->choice.sdap_Config->mappedQoS_FlowsToAdd->list.count;
|
mappedQFIs2AddCount = s->cnAssociation->choice.sdap_Config->mappedQoS_FlowsToAdd->list.count;
|
||||||
LOG_D(SDAP, "Captured mappedQoS_FlowsToAdd from RRC: %ld \n", *mappedQFIs2Add);
|
LOG_D(SDAP, "Captured mappedQoS_FlowsToAdd from RRC: %ld \n", *mappedQFIs2Add);
|
||||||
}
|
}
|
||||||
@@ -1338,9 +1336,7 @@ static boolean_t pdcp_data_req_drb(
|
|||||||
const sdu_size_t sdu_buffer_size,
|
const sdu_size_t sdu_buffer_size,
|
||||||
unsigned char *const sdu_buffer)
|
unsigned char *const sdu_buffer)
|
||||||
{
|
{
|
||||||
struct timespec time_request;
|
LOG_D(PDCP, "%s() called, size %d\n", __func__, sdu_buffer_size);
|
||||||
clock_gettime(CLOCK_REALTIME, &time_request);
|
|
||||||
LOG_D(PDCP, "%s() called at time %lu.%lu, size %d\n", __func__, time_request.tv_sec,time_request.tv_nsec,sdu_buffer_size);
|
|
||||||
nr_pdcp_ue_t *ue;
|
nr_pdcp_ue_t *ue;
|
||||||
nr_pdcp_entity_t *rb;
|
nr_pdcp_entity_t *rb;
|
||||||
int rnti = ctxt_pP->rnti;
|
int rnti = ctxt_pP->rnti;
|
||||||
|
|||||||
@@ -385,7 +385,6 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t *const ctxt_pP,
|
|||||||
rb->recv_sdu(rb, (char *)sdu_pP->data, sdu_sizeP, muiP);
|
rb->recv_sdu(rb, (char *)sdu_pP->data, sdu_sizeP, muiP);
|
||||||
} else {
|
} else {
|
||||||
LOG_E(RLC, "%s:%d:%s: fatal: SDU sent to unknown RB\n", __FILE__, __LINE__, __FUNCTION__);
|
LOG_E(RLC, "%s:%d:%s: fatal: SDU sent to unknown RB\n", __FILE__, __LINE__, __FUNCTION__);
|
||||||
exit(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nr_rlc_manager_unlock(nr_rlc_ue_manager);
|
nr_rlc_manager_unlock(nr_rlc_ue_manager);
|
||||||
@@ -460,14 +459,9 @@ static void deliver_sdu(void *_ue, nr_rlc_entity_t *entity, char *buf, int size)
|
|||||||
exit(1);
|
exit(1);
|
||||||
|
|
||||||
rb_found:
|
rb_found:
|
||||||
if (is_srb==0) {
|
LOG_D(RLC, "%s:%d:%s: delivering SDU (rnti %d is_srb %d rb_id %d) size %d\n",
|
||||||
struct timespec time_request;
|
__FILE__, __LINE__, __FUNCTION__, ue->rnti, is_srb, rb_id, size);
|
||||||
clock_gettime(CLOCK_REALTIME, &time_request);
|
|
||||||
|
|
||||||
LOG_D(RLC, "%s:%d:%s: delivering SDU Time %lu.%lu (rnti %d is_srb %d rb_id %d) size %d\n",
|
|
||||||
__FILE__, __LINE__, __FUNCTION__, time_request.tv_sec,time_request.tv_nsec,
|
|
||||||
ue->rnti, is_srb, rb_id, size);
|
|
||||||
}
|
|
||||||
/* unused fields? */
|
/* unused fields? */
|
||||||
ctx.instance = 0;
|
ctx.instance = 0;
|
||||||
ctx.frame = 0;
|
ctx.frame = 0;
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ void handle_nr_rach(NR_UL_IND_t *UL_info)
|
|||||||
bool in_timewindow = frame_diff == 0 || (frame_diff == 1 && UL_info->slot < 7);
|
bool in_timewindow = frame_diff == 0 || (frame_diff == 1 && UL_info->slot < 7);
|
||||||
|
|
||||||
if (UL_info->rach_ind.number_of_pdus > 0 && in_timewindow) {
|
if (UL_info->rach_ind.number_of_pdus > 0 && in_timewindow) {
|
||||||
LOG_A(MAC,"UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n",
|
LOG_D(MAC,"UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n",
|
||||||
UL_info->frame, UL_info->slot, UL_info->rach_ind.sfn, UL_info->rach_ind.slot);
|
UL_info->frame, UL_info->slot, UL_info->rach_ind.sfn, UL_info->rach_ind.slot);
|
||||||
for (int i = 0; i < UL_info->rach_ind.number_of_pdus; i++) {
|
for (int i = 0; i < UL_info->rach_ind.number_of_pdus; i++) {
|
||||||
UL_info->rach_ind.number_of_pdus--;
|
UL_info->rach_ind.number_of_pdus--;
|
||||||
|
|||||||
@@ -222,7 +222,15 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) {
|
|||||||
mib->message.choice.mib->spare.size = 1;
|
mib->message.choice.mib->spare.size = 1;
|
||||||
mib->message.choice.mib->spare.bits_unused = 7; // This makes a spare of 1 bits
|
mib->message.choice.mib->spare.bits_unused = 7; // This makes a spare of 1 bits
|
||||||
|
|
||||||
mib->message.choice.mib->ssb_SubcarrierOffset = (configuration->ssb_SubcarrierOffset)&15;
|
AssertFatal(scc->ssbSubcarrierSpacing != NULL, "scc->ssbSubcarrierSpacing is null\n");
|
||||||
|
int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
|
||||||
|
frequency_range_t frequency_range = band<100?FR1:FR2;
|
||||||
|
int ssb_subcarrier_offset;
|
||||||
|
if(frequency_range == FR1)
|
||||||
|
ssb_subcarrier_offset = (configuration->ssb_SubcarrierOffset<24) ? (configuration->ssb_SubcarrierOffset<<*scc->ssbSubcarrierSpacing) : configuration->ssb_SubcarrierOffset;
|
||||||
|
else
|
||||||
|
ssb_subcarrier_offset = configuration->ssb_SubcarrierOffset;
|
||||||
|
mib->message.choice.mib->ssb_SubcarrierOffset = ssb_subcarrier_offset&15;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The SIB1 will be sent in this allocation (Type0-PDCCH) : 38.213, 13-4 Table and 38.213 13-11 to 13-14 tables
|
* The SIB1 will be sent in this allocation (Type0-PDCCH) : 38.213, 13-4 Table and 38.213 13-11 to 13-14 tables
|
||||||
@@ -236,7 +244,6 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) {
|
|||||||
mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = *scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceZero;
|
mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = *scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceZero;
|
||||||
}
|
}
|
||||||
|
|
||||||
AssertFatal(scc->ssbSubcarrierSpacing != NULL, "scc->ssbSubcarrierSpacing is null\n");
|
|
||||||
switch (*scc->ssbSubcarrierSpacing) {
|
switch (*scc->ssbSubcarrierSpacing) {
|
||||||
case NR_SubcarrierSpacing_kHz15:
|
case NR_SubcarrierSpacing_kHz15:
|
||||||
mib->message.choice.mib->subCarrierSpacingCommon = NR_MIB__subCarrierSpacingCommon_scs15or60;
|
mib->message.choice.mib->subCarrierSpacingCommon = NR_MIB__subCarrierSpacingCommon_scs15or60;
|
||||||
|
|||||||
@@ -96,6 +96,10 @@ typedef struct nr_uid_linear_allocator_s {
|
|||||||
#define PROTOCOL_NR_RRC_CTXT_FMT PROTOCOL_CTXT_FMT
|
#define PROTOCOL_NR_RRC_CTXT_FMT PROTOCOL_CTXT_FMT
|
||||||
#define PROTOCOL_NR_RRC_CTXT_ARGS(CTXT_Pp) PROTOCOL_NR_CTXT_ARGS(CTXT_Pp)
|
#define PROTOCOL_NR_RRC_CTXT_ARGS(CTXT_Pp) PROTOCOL_NR_CTXT_ARGS(CTXT_Pp)
|
||||||
|
|
||||||
|
// 3GPP TS 38.331 Section 12 Table 12.1-1: UE performance requirements for RRC procedures for UEs
|
||||||
|
#define NR_RRC_SETUP_DELAY_MS 10
|
||||||
|
#define NR_RRC_RECONFIGURATION_DELAY_MS 10
|
||||||
|
#define NR_RRC_BWP_SWITCHING_DELAY_MS 6
|
||||||
|
|
||||||
#define NR_UE_MODULE_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!!
|
#define NR_UE_MODULE_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!!
|
||||||
#define NR_UE_INDEX_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!! used to be -1
|
#define NR_UE_INDEX_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!! used to be -1
|
||||||
@@ -372,7 +376,7 @@ typedef struct gNB_RRC_UE_s {
|
|||||||
rb_id_t gnb_gtp_ebi[S1AP_MAX_E_RAB];
|
rb_id_t gnb_gtp_ebi[S1AP_MAX_E_RAB];
|
||||||
rb_id_t gnb_gtp_psi[S1AP_MAX_E_RAB];
|
rb_id_t gnb_gtp_psi[S1AP_MAX_E_RAB];
|
||||||
//GTPV1 F1-U TUNNELS
|
//GTPV1 F1-U TUNNELS
|
||||||
uint32_t incoming_teid[S1AP_MAX_E_RAB];
|
uint32_t incoming_teid[S1AP_MAX_E_RAB];
|
||||||
|
|
||||||
uint32_t ul_failure_timer;
|
uint32_t ul_failure_timer;
|
||||||
uint32_t ue_release_timer;
|
uint32_t ue_release_timer;
|
||||||
|
|||||||
@@ -797,6 +797,13 @@ rrc_gNB_generate_defaultRRCReconfiguration(
|
|||||||
default :
|
default :
|
||||||
LOG_W(NR_RRC, "Unknown node type %d\n", RC.nrrrc[ctxt_pP->module_id]->node_type);
|
LOG_W(NR_RRC, "Unknown node type %d\n", RC.nrrrc[ctxt_pP->module_id]->node_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) {
|
||||||
|
nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
|
||||||
|
ue_context_pP->ue_context.rnti,
|
||||||
|
*rrc->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
|
||||||
|
NR_RRC_RECONFIGURATION_DELAY_MS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -1032,6 +1039,13 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
|
|||||||
buffer,
|
buffer,
|
||||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) {
|
||||||
|
nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
|
||||||
|
ue_context_pP->ue_context.rnti,
|
||||||
|
*rrc->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
|
||||||
|
NR_RRC_RECONFIGURATION_DELAY_MS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -1205,6 +1219,13 @@ rrc_gNB_modify_dedicatedRRCReconfiguration(
|
|||||||
buffer,
|
buffer,
|
||||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
|
||||||
|
nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
|
||||||
|
ue_context_pP->ue_context.rnti,
|
||||||
|
*RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
|
||||||
|
NR_RRC_RECONFIGURATION_DELAY_MS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -1305,6 +1326,13 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
|
|||||||
buffer,
|
buffer,
|
||||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
|
||||||
|
nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
|
||||||
|
ue_context_pP->ue_context.rnti,
|
||||||
|
*RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
|
||||||
|
NR_RRC_RECONFIGURATION_DELAY_MS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -1863,6 +1891,13 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete(
|
|||||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
|
||||||
|
nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
|
||||||
|
ue_context_pP->ue_context.rnti,
|
||||||
|
*RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
|
||||||
|
NR_RRC_RECONFIGURATION_DELAY_MS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -3482,6 +3517,7 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
|
|||||||
mac_remove_nr_ue(ctxt_pP->module_id, ctxt_pP->rnti);
|
mac_remove_nr_ue(ctxt_pP->module_id, ctxt_pP->rnti);
|
||||||
rrc_rlc_remove_ue(ctxt_pP);
|
rrc_rlc_remove_ue(ctxt_pP);
|
||||||
pdcp_remove_UE(ctxt_pP);
|
pdcp_remove_UE(ctxt_pP);
|
||||||
|
newGtpuDeleteAllTunnels(ctxt_pP->instance, ctxt_pP->rnti);
|
||||||
|
|
||||||
/* remove RRC UE Context */
|
/* remove RRC UE Context */
|
||||||
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rnti);
|
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rnti);
|
||||||
|
|||||||
@@ -241,9 +241,8 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
|
|||||||
cipher_algo,
|
cipher_algo,
|
||||||
NR_SecurityConfig__keyToUse_secondary);
|
NR_SecurityConfig__keyToUse_secondary);
|
||||||
}
|
}
|
||||||
NR_ServingCellConfig_t *scc = ue_context_p->ue_context.spCellConfig
|
NR_ServingCellConfig_t *scc = ue_context_p->ue_context.spCellConfig ?
|
||||||
? ue_context_p->ue_context.spCellConfig->spCellConfigDedicated
|
ue_context_p->ue_context.spCellConfig->spCellConfigDedicated : NULL;
|
||||||
: NULL;
|
|
||||||
fill_default_reconfig(carrier->servingcellconfigcommon,
|
fill_default_reconfig(carrier->servingcellconfigcommon,
|
||||||
scc,
|
scc,
|
||||||
reconfig_ies,
|
reconfig_ies,
|
||||||
@@ -339,8 +338,6 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
|
|||||||
sizeof(X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).rrc_buffer));
|
sizeof(X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).rrc_buffer));
|
||||||
X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).rrc_buffer_size = (enc_rval.encoded+7)>>3;
|
X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).rrc_buffer_size = (enc_rval.encoded+7)>>3;
|
||||||
itti_send_msg_to_task(TASK_X2AP, ENB_MODULE_ID_TO_INSTANCE(0), msg); //Check right id instead of hardcoding
|
itti_send_msg_to_task(TASK_X2AP, ENB_MODULE_ID_TO_INSTANCE(0), msg); //Check right id instead of hardcoding
|
||||||
} else if (get_softmodem_params()->do_ra || get_softmodem_params()->sa) {
|
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, rrc->module_id, GNB_FLAG_YES, ue_context_p->ue_id_rnti, 0, 0,rrc->module_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rrc->Nb_ue++;
|
rrc->Nb_ue++;
|
||||||
@@ -373,14 +370,15 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
|
|||||||
ue_context_p->ue_context.secondaryCellGroup);
|
ue_context_p->ue_context.secondaryCellGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m == NULL){
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, rrc->module_id, GNB_FLAG_YES, ue_context_p->ue_id_rnti, 0, 0, rrc->module_id);
|
||||||
LOG_W(RRC, "Calling RRC PDCP/RLC ASN1 request functions for protocol context %p with module_id %d, rnti %x, frame %d, subframe %d eNB_index %d \n", &ctxt,
|
LOG_W(RRC,
|
||||||
ctxt.module_id,
|
"Calling RRC PDCP/RLC ASN1 request functions for protocol context %p with module_id %d, rnti %x, frame %d, subframe %d eNB_index %d \n",
|
||||||
ctxt.rnti,
|
&ctxt,
|
||||||
ctxt.frame,
|
ctxt.module_id,
|
||||||
ctxt.subframe,
|
ctxt.rnti,
|
||||||
ctxt.eNB_index);
|
ctxt.frame,
|
||||||
}
|
ctxt.subframe,
|
||||||
|
ctxt.eNB_index);
|
||||||
|
|
||||||
nr_rrc_pdcp_config_asn1_req(&ctxt,
|
nr_rrc_pdcp_config_asn1_req(&ctxt,
|
||||||
get_softmodem_params()->sa ? ue_context_p->ue_context.rb_config->srb_ToAddModList : (NR_SRB_ToAddModList_t *) NULL,
|
get_softmodem_params()->sa ? ue_context_p->ue_context.rb_config->srb_ToAddModList : (NR_SRB_ToAddModList_t *) NULL,
|
||||||
@@ -395,15 +393,14 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
|
|||||||
NULL,
|
NULL,
|
||||||
ue_context_p->ue_context.secondaryCellGroup->rlc_BearerToAddModList);
|
ue_context_p->ue_context.secondaryCellGroup->rlc_BearerToAddModList);
|
||||||
|
|
||||||
nr_rrc_rlc_config_asn1_req (&ctxt,
|
nr_rrc_rlc_config_asn1_req(&ctxt,
|
||||||
get_softmodem_params()->sa ? ue_context_p->ue_context.rb_config->srb_ToAddModList : (NR_SRB_ToAddModList_t *) NULL,
|
get_softmodem_params()->sa ? ue_context_p->ue_context.rb_config->srb_ToAddModList : (NR_SRB_ToAddModList_t *) NULL,
|
||||||
ue_context_p->ue_context.rb_config->drb_ToAddModList,
|
ue_context_p->ue_context.rb_config->drb_ToAddModList,
|
||||||
ue_context_p->ue_context.rb_config->drb_ToReleaseList,
|
ue_context_p->ue_context.rb_config->drb_ToReleaseList,
|
||||||
(LTE_PMCH_InfoList_r9_t *) NULL,
|
(LTE_PMCH_InfoList_r9_t *) NULL,
|
||||||
ue_context_p->ue_context.secondaryCellGroup->rlc_BearerToAddModList);
|
ue_context_p->ue_context.secondaryCellGroup->rlc_BearerToAddModList);
|
||||||
|
|
||||||
LOG_D(RRC, "%s:%d: done RRC PDCP/RLC ASN1 request for UE rnti %x\n", __FUNCTION__, __LINE__, ctxt.rnti);
|
LOG_D(RRC, "%s:%d: done RRC PDCP/RLC ASN1 request for UE rnti %x\n", __FUNCTION__, __LINE__, ctxt.rnti);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) {
|
void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) {
|
||||||
|
|||||||
@@ -359,7 +359,8 @@ void process_nsa_message(NR_UE_RRC_INST_t *rrc, nsa_message_t nsa_message_type,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
nr_rrc_ue_process_rrcReconfiguration(module_id,RRCReconfiguration);
|
nr_rrc_ue_process_rrcReconfiguration(module_id,RRCReconfiguration);
|
||||||
}
|
ASN_STRUCT_FREE(asn_DEF_NR_RRCReconfiguration, RRCReconfiguration);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case nr_RadioBearerConfigX_r15:
|
case nr_RadioBearerConfigX_r15:
|
||||||
@@ -392,6 +393,7 @@ void process_nsa_message(NR_UE_RRC_INST_t *rrc, nsa_message_t nsa_message_type,
|
|||||||
else if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
else if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||||
xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void *) RadioBearerConfig);
|
xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void *) RadioBearerConfig);
|
||||||
}
|
}
|
||||||
|
ASN_STRUCT_FREE(asn_DEF_NR_RadioBearerConfig, RadioBearerConfig);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -70,8 +70,7 @@ void x2ap_eNB_register_eNB(x2ap_eNB_instance_t *instance_p,
|
|||||||
net_ip_address_t *local_ip_addr,
|
net_ip_address_t *local_ip_addr,
|
||||||
uint16_t in_streams,
|
uint16_t in_streams,
|
||||||
uint16_t out_streams,
|
uint16_t out_streams,
|
||||||
uint32_t enb_port_for_X2C,
|
uint32_t enb_port_for_X2C);
|
||||||
int multi_sd);
|
|
||||||
|
|
||||||
static
|
static
|
||||||
void x2ap_eNB_handle_handover_req(instance_t instance,
|
void x2ap_eNB_handle_handover_req(instance_t instance,
|
||||||
@@ -249,20 +248,17 @@ static void x2ap_eNB_register_eNB(x2ap_eNB_instance_t *instance_p,
|
|||||||
net_ip_address_t *local_ip_addr,
|
net_ip_address_t *local_ip_addr,
|
||||||
uint16_t in_streams,
|
uint16_t in_streams,
|
||||||
uint16_t out_streams,
|
uint16_t out_streams,
|
||||||
uint32_t enb_port_for_X2C,
|
uint32_t enb_port_for_X2C) {
|
||||||
int multi_sd) {
|
|
||||||
MessageDef *message = NULL;
|
MessageDef *message = NULL;
|
||||||
sctp_new_association_req_multi_t *sctp_new_association_req = NULL;
|
|
||||||
x2ap_eNB_data_t *x2ap_enb_data = NULL;
|
x2ap_eNB_data_t *x2ap_enb_data = NULL;
|
||||||
DevAssert(instance_p != NULL);
|
DevAssert(instance_p != NULL);
|
||||||
DevAssert(target_eNB_ip_address != NULL);
|
DevAssert(target_eNB_ip_address != NULL);
|
||||||
message = itti_alloc_new_message(TASK_X2AP, 0, SCTP_NEW_ASSOCIATION_REQ_MULTI);
|
message = itti_alloc_new_message(TASK_X2AP, 0, SCTP_NEW_ASSOCIATION_REQ);
|
||||||
sctp_new_association_req = &message->ittiMsg.sctp_new_association_req_multi;
|
sctp_new_association_req_t *sctp_new_association_req = &message->ittiMsg.sctp_new_association_req;
|
||||||
sctp_new_association_req->port = enb_port_for_X2C;
|
sctp_new_association_req->port = enb_port_for_X2C;
|
||||||
sctp_new_association_req->ppid = X2AP_SCTP_PPID;
|
sctp_new_association_req->ppid = X2AP_SCTP_PPID;
|
||||||
sctp_new_association_req->in_streams = in_streams;
|
sctp_new_association_req->in_streams = in_streams;
|
||||||
sctp_new_association_req->out_streams = out_streams;
|
sctp_new_association_req->out_streams = out_streams;
|
||||||
sctp_new_association_req->multi_sd = multi_sd;
|
|
||||||
memcpy(&sctp_new_association_req->remote_address,
|
memcpy(&sctp_new_association_req->remote_address,
|
||||||
target_eNB_ip_address,
|
target_eNB_ip_address,
|
||||||
sizeof(*target_eNB_ip_address));
|
sizeof(*target_eNB_ip_address));
|
||||||
@@ -399,8 +395,7 @@ void x2ap_eNB_handle_sctp_init_msg_multi_cnf(
|
|||||||
&instance->enb_x2_ip_address,
|
&instance->enb_x2_ip_address,
|
||||||
instance->sctp_in_streams,
|
instance->sctp_in_streams,
|
||||||
instance->sctp_out_streams,
|
instance->sctp_out_streams,
|
||||||
instance->enb_port_for_X2C,
|
instance->enb_port_for_X2C);
|
||||||
instance->multi_sd);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -645,7 +640,8 @@ void *x2ap_task(void *arg) {
|
|||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
itti_receive_msg(TASK_X2AP, &received_msg);
|
itti_receive_msg(TASK_X2AP, &received_msg);
|
||||||
|
LOG_D(X2AP, "Received message %d:%s\n",
|
||||||
|
ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg));
|
||||||
switch (ITTI_MSG_ID(received_msg)) {
|
switch (ITTI_MSG_ID(received_msg)) {
|
||||||
case TERMINATE_MESSAGE:
|
case TERMINATE_MESSAGE:
|
||||||
X2AP_WARN(" *** Exiting X2AP thread\n");
|
X2AP_WARN(" *** Exiting X2AP thread\n");
|
||||||
@@ -684,7 +680,6 @@ void *x2ap_task(void *arg) {
|
|||||||
case X2AP_ENDC_SGNB_ADDITION_REQ_ACK:
|
case X2AP_ENDC_SGNB_ADDITION_REQ_ACK:
|
||||||
x2ap_gNB_trigger_sgNB_add_req_ack(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
x2ap_gNB_trigger_sgNB_add_req_ack(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||||
&X2AP_ENDC_SGNB_ADDITION_REQ_ACK(received_msg));
|
&X2AP_ENDC_SGNB_ADDITION_REQ_ACK(received_msg));
|
||||||
LOG_I(X2AP, "Received elements for X2AP_ENDC_SGNB_ADDITION_REQ_ACK \n");
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case X2AP_ENDC_SGNB_RECONF_COMPLETE:
|
case X2AP_ENDC_SGNB_RECONF_COMPLETE:
|
||||||
|
|||||||
@@ -178,12 +178,15 @@ int emm_proc_authentication_request(nas_user_t *user, int native_ksi, int ksi,
|
|||||||
OctetString ik = {AUTH_IK_SIZE, authentication_data->ik};
|
OctetString ik = {AUTH_IK_SIZE, authentication_data->ik};
|
||||||
OctetString res = {AUTH_RES_SIZE, authentication_data->res};
|
OctetString res = {AUTH_RES_SIZE, authentication_data->res};
|
||||||
|
|
||||||
if (memcmp(authentication_data->rand, rand->value, AUTH_CK_SIZE) != 0) {
|
if ((memcmp(authentication_data->rand, rand->value, AUTH_CK_SIZE) != 0) ||
|
||||||
|
(authentication_data->auth_process_started == FALSE)) {
|
||||||
/*
|
/*
|
||||||
* There is no valid stored RAND in the ME or the stored RAND is
|
* There is no valid stored RAND in the ME or the stored RAND is
|
||||||
* different from the new received value in the AUTHENTICATION
|
* different from the new received value in the AUTHENTICATION
|
||||||
* REQUEST message
|
* REQUEST message OR if this is first time UE starting the
|
||||||
|
* Authentication process
|
||||||
*/
|
*/
|
||||||
|
authentication_data->auth_process_started = TRUE;
|
||||||
OctetString auts;
|
OctetString auts;
|
||||||
auts.length = 0;
|
auts.length = 0;
|
||||||
auts.value = (uint8_t *)malloc(AUTH_AUTS_SIZE);
|
auts.value = (uint8_t *)malloc(AUTH_AUTS_SIZE);
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ typedef struct {
|
|||||||
unsigned char mac_count:2; /* MAC failure counter (#20) */
|
unsigned char mac_count:2; /* MAC failure counter (#20) */
|
||||||
unsigned char umts_count:2; /* UMTS challenge failure counter (#26) */
|
unsigned char umts_count:2; /* UMTS challenge failure counter (#26) */
|
||||||
unsigned char sync_count:2; /* Sync failure counter (#21) */
|
unsigned char sync_count:2; /* Sync failure counter (#21) */
|
||||||
|
unsigned char auth_process_started:1; /* Authentication started */
|
||||||
|
unsigned char reserve:1; /* For future use, byte aligned */
|
||||||
} authentication_data_t;
|
} authentication_data_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
#if defined(ENB_MODE)
|
#if defined(ENB_MODE)
|
||||||
# include "common/utils/LOG/log.h"
|
# include "common/utils/LOG/log.h"
|
||||||
# define SCTP_ERROR(x, args...) LOG_E(SCTP, x, ##args)
|
# define SCTP_ERROR(x, args...) LOG_E(SCTP, x, ##args)
|
||||||
# define SCTP_DEBUG(x, args...) LOG_I(SCTP, x, ##args)
|
# define SCTP_DEBUG(x, args...) LOG_D(SCTP, x, ##args)
|
||||||
# define SCTP_WARN(x, args...) LOG_W(SCTP, x, ##args)
|
# define SCTP_WARN(x, args...) LOG_W(SCTP, x, ##args)
|
||||||
#else
|
#else
|
||||||
# define SCTP_ERROR(x, args...) do { fprintf(stderr, "[SCTP][E]"x, ##args); } while(0)
|
# define SCTP_ERROR(x, args...) do { fprintf(stderr, "[SCTP][E]"x, ##args); } while(0)
|
||||||
|
|||||||
@@ -318,7 +318,8 @@ sctp_handle_new_association_req_multi(
|
|||||||
assoc_id, used_address);
|
assoc_id, used_address);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SCTP_DEBUG("sctp_connectx SUCCESS, used %d addresses assoc_id %d\n",
|
SCTP_DEBUG("sctp_connectx SUCCESS, socket %d used %d addresses assoc_id %d\n",
|
||||||
|
sd,
|
||||||
used_address,
|
used_address,
|
||||||
assoc_id);
|
assoc_id);
|
||||||
}
|
}
|
||||||
@@ -750,7 +751,7 @@ static int sctp_create_new_listener(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (server_type) {
|
if (server_type) {
|
||||||
if ((sd = socket(PF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) < 0) {
|
if ((sd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) < 0) {
|
||||||
SCTP_ERROR("socket: %s:%d\n", strerror(errno), errno);
|
SCTP_ERROR("socket: %s:%d\n", strerror(errno), errno);
|
||||||
free(addr);
|
free(addr);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -822,7 +823,7 @@ static int sctp_create_new_listener(
|
|||||||
sctp_cnx = NULL;
|
sctp_cnx = NULL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
SCTP_DEBUG("Created listen socket: %d\n", sd);
|
||||||
/* Insert new element at end of list */
|
/* Insert new element at end of list */
|
||||||
STAILQ_INSERT_TAIL(&sctp_cnx_list, sctp_cnx, entries);
|
STAILQ_INSERT_TAIL(&sctp_cnx_list, sctp_cnx, entries);
|
||||||
sctp_nb_cnx++;
|
sctp_nb_cnx++;
|
||||||
@@ -1110,11 +1111,10 @@ void *sctp_eNB_process_itti_msg(void *notUsed)
|
|||||||
|
|
||||||
/* Check if there is a packet to handle */
|
/* Check if there is a packet to handle */
|
||||||
if (received_msg != NULL) {
|
if (received_msg != NULL) {
|
||||||
|
LOG_D(SCTP,"Received message %d:%s\n",
|
||||||
|
ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg));
|
||||||
switch (ITTI_MSG_ID(received_msg)) {
|
switch (ITTI_MSG_ID(received_msg)) {
|
||||||
case SCTP_INIT_MSG: {
|
case SCTP_INIT_MSG: {
|
||||||
SCTP_DEBUG("Received SCTP_INIT_MSG\n");
|
|
||||||
|
|
||||||
/* We received a new connection request */
|
|
||||||
if (sctp_create_new_listener(
|
if (sctp_create_new_listener(
|
||||||
ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||||
ITTI_MSG_ORIGIN_ID(received_msg),
|
ITTI_MSG_ORIGIN_ID(received_msg),
|
||||||
@@ -1126,11 +1126,7 @@ void *sctp_eNB_process_itti_msg(void *notUsed)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SCTP_INIT_MSG_MULTI_REQ: {
|
case SCTP_INIT_MSG_MULTI_REQ: {
|
||||||
int multi_sd;
|
int multi_sd = sctp_create_new_listener(
|
||||||
|
|
||||||
SCTP_DEBUG("Received SCTP_INIT_MSG_MULTI_REQ\n");
|
|
||||||
|
|
||||||
multi_sd = sctp_create_new_listener(
|
|
||||||
ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||||
ITTI_MSG_ORIGIN_ID(received_msg),
|
ITTI_MSG_ORIGIN_ID(received_msg),
|
||||||
&received_msg->ittiMsg.sctp_init_multi,1);
|
&received_msg->ittiMsg.sctp_init_multi,1);
|
||||||
|
|||||||
@@ -1116,7 +1116,6 @@ extern "C" {
|
|||||||
if (device->type==USRP_X300_DEV) {
|
if (device->type==USRP_X300_DEV) {
|
||||||
openair0_cfg[0].rx_gain_calib_table = calib_table_x310;
|
openair0_cfg[0].rx_gain_calib_table = calib_table_x310;
|
||||||
std::cerr << "-- Using calibration table: calib_table_x310" << std::endl;
|
std::cerr << "-- Using calibration table: calib_table_x310" << std::endl;
|
||||||
s->usrp->set_rx_dc_offset(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (device->type==USRP_N300_DEV) {
|
if (device->type==USRP_N300_DEV) {
|
||||||
|
|||||||
@@ -45,10 +45,7 @@ gNBs =
|
|||||||
remote_s_portc = 500;
|
remote_s_portc = 500;
|
||||||
remote_s_portd = 2152;
|
remote_s_portd = 2152;
|
||||||
ssb_SubcarrierOffset = 0;
|
ssb_SubcarrierOffset = 0;
|
||||||
pdsch_AntennaPorts_N1 = 1;
|
|
||||||
pusch_AntennaPorts = 1;
|
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
sib1_tda = 1;
|
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ gNBs =
|
|||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
ssb_SubcarrierOffset = 0;
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
sib1_tda = 1;
|
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ gNBs =
|
|||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
ssb_SubcarrierOffset = 0;
|
||||||
sib1_tda = 1;
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
{
|
{
|
||||||
#spCellConfigCommon
|
#spCellConfigCommon
|
||||||
|
|||||||
@@ -19,10 +19,6 @@ gNBs =
|
|||||||
{
|
{
|
||||||
sst = 1;
|
sst = 1;
|
||||||
sd = 0x1; // 0 false, else true
|
sd = 0x1; // 0 false, else true
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -33,12 +29,9 @@ gNBs =
|
|||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
ssb_SubcarrierOffset = 0;
|
||||||
pdsch_AntennaPorts_N1 = 1;
|
|
||||||
pusch_AntennaPorts = 1;
|
|
||||||
min_rxtxtime = 2;
|
min_rxtxtime = 2;
|
||||||
sib1_tda = 1;
|
|
||||||
do_CSIRS = 1;
|
do_CSIRS = 1;
|
||||||
do_SRS = 0;
|
do_SRS = 1;
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
{
|
{
|
||||||
@@ -222,7 +215,7 @@ L1s = (
|
|||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_n_preference = "local_mac";
|
tr_n_preference = "local_mac";
|
||||||
prach_dtx_threshold = 120;
|
prach_dtx_threshold = 120;
|
||||||
pucch0_dtx_threshold = 150;
|
pucch0_dtx_threshold = 100;
|
||||||
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -232,12 +225,11 @@ RUs = (
|
|||||||
local_rf = "yes"
|
local_rf = "yes"
|
||||||
nb_tx = 1
|
nb_tx = 1
|
||||||
nb_rx = 1
|
nb_rx = 1
|
||||||
att_tx = 0
|
att_tx = 6;
|
||||||
att_rx = 0;
|
att_rx = 6;
|
||||||
bands = [41];
|
bands = [41];
|
||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 114;
|
max_rxgain = 114;
|
||||||
sf_extension = 0;
|
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
#beamforming 1x4 matrix:
|
#beamforming 1x4 matrix:
|
||||||
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ gNBs =
|
|||||||
pdsch_AntennaPorts_N1 = 1;
|
pdsch_AntennaPorts_N1 = 1;
|
||||||
pusch_AntennaPorts = 1;
|
pusch_AntennaPorts = 1;
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
sib1_tda = 1;
|
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,10 +19,6 @@ gNBs =
|
|||||||
{
|
{
|
||||||
sst = 1;
|
sst = 1;
|
||||||
sd = 0x1; // 0 false, else true
|
sd = 0x1; // 0 false, else true
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -35,15 +31,13 @@ gNBs =
|
|||||||
ssb_SubcarrierOffset = 0;
|
ssb_SubcarrierOffset = 0;
|
||||||
pdsch_AntennaPorts_N1 = 2;
|
pdsch_AntennaPorts_N1 = 2;
|
||||||
pusch_AntennaPorts = 2;
|
pusch_AntennaPorts = 2;
|
||||||
min_rxtxtime = 2;
|
|
||||||
sib1_tda = 1;
|
|
||||||
do_CSIRS = 1;
|
do_CSIRS = 1;
|
||||||
do_SRS = 0;
|
do_SRS = 1;
|
||||||
ul_prbblacklist = "51,52,53,54"
|
ul_prbblacklist = "51,52,53,54"
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
{
|
{
|
||||||
controlResourceSetZero = 11;
|
controlResourceSetZero = 12;
|
||||||
searchSpaceZero = 0;
|
searchSpaceZero = 0;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -237,7 +231,6 @@ RUs = (
|
|||||||
bands = [78];
|
bands = [78];
|
||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 75;
|
max_rxgain = 75;
|
||||||
sf_extension = 0;
|
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||||
bf_weights = [0x00007fff, 0x0000];
|
bf_weights = [0x00007fff, 0x0000];
|
||||||
|
|||||||
@@ -19,10 +19,6 @@ gNBs =
|
|||||||
{
|
{
|
||||||
sst = 1;
|
sst = 1;
|
||||||
sd = 0x1; // 0 false, else true
|
sd = 0x1; // 0 false, else true
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -33,12 +29,9 @@ gNBs =
|
|||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
ssb_SubcarrierOffset = 0;
|
||||||
pdsch_AntennaPorts_N1 = 1;
|
|
||||||
pusch_AntennaPorts = 1;
|
|
||||||
min_rxtxtime = 2;
|
min_rxtxtime = 2;
|
||||||
sib1_tda = 1;
|
|
||||||
do_CSIRS = 1;
|
do_CSIRS = 1;
|
||||||
do_SRS = 0;
|
do_SRS = 1;
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
{
|
{
|
||||||
@@ -222,7 +215,7 @@ L1s = (
|
|||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_n_preference = "local_mac";
|
tr_n_preference = "local_mac";
|
||||||
prach_dtx_threshold = 120;
|
prach_dtx_threshold = 120;
|
||||||
pucch0_dtx_threshold = 150;
|
pucch0_dtx_threshold = 100;
|
||||||
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -232,12 +225,11 @@ RUs = (
|
|||||||
local_rf = "yes"
|
local_rf = "yes"
|
||||||
nb_tx = 1
|
nb_tx = 1
|
||||||
nb_rx = 1
|
nb_rx = 1
|
||||||
att_tx = 0
|
att_tx = 6;
|
||||||
att_rx = 0;
|
att_rx = 6;
|
||||||
bands = [78];
|
bands = [78];
|
||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 114;
|
max_rxgain = 114;
|
||||||
sf_extension = 0;
|
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
#beamforming 1x4 matrix:
|
#beamforming 1x4 matrix:
|
||||||
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
||||||
|
|||||||
@@ -19,10 +19,6 @@ gNBs =
|
|||||||
{
|
{
|
||||||
sst = 1;
|
sst = 1;
|
||||||
sd = 0x1; // 0 false, else true
|
sd = 0x1; // 0 false, else true
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -33,7 +29,7 @@ gNBs =
|
|||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
ssb_SubcarrierOffset = 0;
|
||||||
pdsch_AntennaPorts_N1 = 2;
|
pdsch_AntennaPorts_N1 = 1;
|
||||||
pusch_AntennaPorts = 2;
|
pusch_AntennaPorts = 2;
|
||||||
min_rxtxtime = 2;
|
min_rxtxtime = 2;
|
||||||
sib1_tda = 1;
|
sib1_tda = 1;
|
||||||
@@ -43,7 +39,7 @@ gNBs =
|
|||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
{
|
{
|
||||||
controlResourceSetZero = 11;
|
controlResourceSetZero = 12;
|
||||||
searchSpaceZero = 10;
|
searchSpaceZero = 10;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -241,7 +237,7 @@ MACRLCs = (
|
|||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_s_preference = "local_L1";
|
tr_s_preference = "local_L1";
|
||||||
tr_n_preference = "local_RRC";
|
tr_n_preference = "local_RRC";
|
||||||
pusch_TargetSNRx10 = 200;
|
pusch_TargetSNRx10 = 150;
|
||||||
pucch_TargetSNRx10 = 200;
|
pucch_TargetSNRx10 = 200;
|
||||||
ulsch_max_frame_inactivity = 0;
|
ulsch_max_frame_inactivity = 0;
|
||||||
}
|
}
|
||||||
@@ -252,7 +248,7 @@ L1s = (
|
|||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_n_preference = "local_mac";
|
tr_n_preference = "local_mac";
|
||||||
prach_dtx_threshold = 120;
|
prach_dtx_threshold = 120;
|
||||||
pucch0_dtx_threshold = 120;
|
pucch0_dtx_threshold = 100;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -266,7 +262,6 @@ RUs = (
|
|||||||
bands = [78];
|
bands = [78];
|
||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 75;
|
max_rxgain = 75;
|
||||||
sf_extension = 0;
|
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||||
bf_weights = [0x00007fff, 0x0000];
|
bf_weights = [0x00007fff, 0x0000];
|
||||||
|
|||||||
Reference in New Issue
Block a user