Merge branch 'develop' into parallel-phy-test-EMUFH
Conflicts: openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c openair1/PHY/LTE_UE_TRANSPORT/get_pmi.c openair2/LAYER2/MAC/eNB_scheduler_phytest.c openair3/S1AP/MESSAGES/ASN1/R8/s1ap-8.10.0.asn1 targets/RT/USER/lte-enb.c targets/RT/USER/lte-ru.c targets/RT/USER/rfsim.h
This commit is contained in:
Executable
+153
@@ -0,0 +1,153 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function usage {
|
||||||
|
echo "OAI Local Build Check script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo " buildLocally.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo "--------"
|
||||||
|
echo " --workspace #### OR -ws ####"
|
||||||
|
echo " Specify the workspace"
|
||||||
|
echo ""
|
||||||
|
echo " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -ne 2 ] && [ $# -ne 1 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-ws|--workspace)
|
||||||
|
JENKINS_WKSP="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
cd $JENKINS_WKSP
|
||||||
|
STATUS=0
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
# Creating a tmp folder to store results and artifacts
|
||||||
|
############################################################
|
||||||
|
if [ ! -d $JENKINS_WKSP/archives ]
|
||||||
|
then
|
||||||
|
mkdir $JENKINS_WKSP/archives
|
||||||
|
fi
|
||||||
|
|
||||||
|
source oaienv
|
||||||
|
cd $JENKINS_WKSP/cmake_targets
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
# Building eNb with USRP option
|
||||||
|
############################################################
|
||||||
|
ARCHIVES_LOC=$JENKINS_WKSP/archives/enb_usrp
|
||||||
|
if [ ! -d $ARCHIVES_LOC ]
|
||||||
|
then
|
||||||
|
mkdir $ARCHIVES_LOC
|
||||||
|
fi
|
||||||
|
./build_oai --eNB -w USRP -c
|
||||||
|
|
||||||
|
# Generated log files:
|
||||||
|
if [ -f $JENKINS_WKSP/cmake_targets/log/lte-softmodem.Rel14.txt ]
|
||||||
|
then
|
||||||
|
LOCAL_STAT=`egrep -c "Built target lte-softmodem" $JENKINS_WKSP/cmake_targets/log/lte-softmodem.Rel14.txt`
|
||||||
|
if [ $LOCAL_STAT -eq 0 ]; then STATUS=-1; fi
|
||||||
|
cp $JENKINS_WKSP/cmake_targets/log/lte-softmodem.Rel14.txt $ARCHIVES_LOC
|
||||||
|
else
|
||||||
|
STATUS=-1
|
||||||
|
fi
|
||||||
|
if [ -f $JENKINS_WKSP/cmake_targets/log/params_libconfig.Rel14.txt ]
|
||||||
|
then
|
||||||
|
LOCAL_STAT=`egrep -c "Built target params_libconfig" $JENKINS_WKSP/cmake_targets/log/params_libconfig.Rel14.txt`
|
||||||
|
if [ $LOCAL_STAT -eq 0 ]; then STATUS=-1; fi
|
||||||
|
cp $JENKINS_WKSP/cmake_targets/log/params_libconfig.Rel14.txt $ARCHIVES_LOC
|
||||||
|
else
|
||||||
|
STATUS=-1
|
||||||
|
fi
|
||||||
|
if [ -f $JENKINS_WKSP/cmake_targets/log/coding.Rel14.txt ]
|
||||||
|
then
|
||||||
|
LOCAL_STAT=`egrep -c "Built target coding" $JENKINS_WKSP/cmake_targets/log/coding.Rel14.txt`
|
||||||
|
if [ $LOCAL_STAT -eq 0 ]; then STATUS=-1; fi
|
||||||
|
cp $JENKINS_WKSP/cmake_targets/log/coding.Rel14.txt $ARCHIVES_LOC
|
||||||
|
else
|
||||||
|
STATUS=-1
|
||||||
|
fi
|
||||||
|
if [ -f $JENKINS_WKSP/cmake_targets/log/oai_usrpdevif.Rel14.txt ]
|
||||||
|
then
|
||||||
|
LOCAL_STAT=`egrep -c "Built target oai_usrpdevif" $JENKINS_WKSP/cmake_targets/log/oai_usrpdevif.Rel14.txt`
|
||||||
|
if [ $LOCAL_STAT -eq 0 ]; then STATUS=-1; fi
|
||||||
|
cp $JENKINS_WKSP/cmake_targets/log/oai_usrpdevif.Rel14.txt $ARCHIVES_LOC
|
||||||
|
else
|
||||||
|
STATUS=-1
|
||||||
|
fi
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
# Building basic simulator
|
||||||
|
############################################################
|
||||||
|
ARCHIVES_LOC=$JENKINS_WKSP/archives/basic_sim
|
||||||
|
if [ ! -d $ARCHIVES_LOC ]
|
||||||
|
then
|
||||||
|
mkdir $ARCHIVES_LOC
|
||||||
|
fi
|
||||||
|
cd $JENKINS_WKSP/cmake_targets
|
||||||
|
./build_oai --basic-simulator -c
|
||||||
|
|
||||||
|
# Generated log files:
|
||||||
|
if [ -f $JENKINS_WKSP/cmake_targets/log/basic_simulator_enb.txt ]
|
||||||
|
then
|
||||||
|
LOCAL_STAT=`egrep -c "Built target lte-softmodem" $JENKINS_WKSP/cmake_targets/log/basic_simulator_enb.txt`
|
||||||
|
if [ $LOCAL_STAT -eq 0 ]; then STATUS=-1; fi
|
||||||
|
cp $JENKINS_WKSP/cmake_targets/log/basic_simulator_enb.txt $ARCHIVES_LOC
|
||||||
|
else
|
||||||
|
STATUS=-1
|
||||||
|
fi
|
||||||
|
if [ -f $JENKINS_WKSP/cmake_targets/log/basic_simulator_ue.txt ]
|
||||||
|
then
|
||||||
|
LOCAL_STAT=`egrep -c "Built target lte-uesoftmodem" $JENKINS_WKSP/cmake_targets/log/basic_simulator_ue.txt`
|
||||||
|
if [ $LOCAL_STAT -eq 0 ]; then STATUS=-1; fi
|
||||||
|
cp $JENKINS_WKSP/cmake_targets/log/basic_simulator_ue.txt $ARCHIVES_LOC
|
||||||
|
else
|
||||||
|
STATUS=-1
|
||||||
|
fi
|
||||||
|
if [ -f $JENKINS_WKSP/cmake_targets/log/conf2uedata.Rel14.txt ]
|
||||||
|
then
|
||||||
|
LOCAL_STAT=`egrep -c "Built target conf2uedata" $JENKINS_WKSP/cmake_targets/log/conf2uedata.Rel14.txt`
|
||||||
|
if [ $LOCAL_STAT -eq 0 ]; then STATUS=-1; fi
|
||||||
|
cp $JENKINS_WKSP/cmake_targets/log/conf2uedata.Rel14.txt $ARCHIVES_LOC
|
||||||
|
else
|
||||||
|
STATUS=-1
|
||||||
|
fi
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
# Creating a zip for Jenkins archiving
|
||||||
|
############################################################
|
||||||
|
cd $JENKINS_WKSP/archives/
|
||||||
|
zip -r local_build_logs.zip basic_sim enb_usrp
|
||||||
|
|
||||||
|
exit $STATUS
|
||||||
Executable
+370
@@ -0,0 +1,370 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function usage {
|
||||||
|
echo "OAI VM Build Check script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo " Requirements:"
|
||||||
|
echo " -- uvtool uvtool-libvirt apt-cacher"
|
||||||
|
echo " -- xenial image already synced"
|
||||||
|
echo " Default:"
|
||||||
|
echo " -- eNB with USRP"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo " buildOnVM.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo "--------"
|
||||||
|
echo " --job-name #### OR -jn ####"
|
||||||
|
echo " Specify the name of the Jenkins job."
|
||||||
|
echo ""
|
||||||
|
echo " --build-id #### OR -id ####"
|
||||||
|
echo " Specify the build ID of the Jenkins job."
|
||||||
|
echo ""
|
||||||
|
echo " --workspace #### OR -ws ####"
|
||||||
|
echo " Specify the workspace."
|
||||||
|
echo ""
|
||||||
|
echo " --variant enb-usrp OR -v1"
|
||||||
|
echo " --variant basic-sim OR -v2"
|
||||||
|
echo " --variant phy-sim OR -v3"
|
||||||
|
echo " --variant cppcheck OR -v4"
|
||||||
|
echo " --variant enb-ethernet OR -v7"
|
||||||
|
echo " --variant ue-ethernet OR -v8"
|
||||||
|
echo " Specify the variant to build."
|
||||||
|
echo ""
|
||||||
|
echo " --keep-vm-alive OR -k"
|
||||||
|
echo " Keep the VM alive after the build."
|
||||||
|
echo ""
|
||||||
|
echo " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
function variant_usage {
|
||||||
|
echo "OAI VM Build Check script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo " --variant enb-usrp OR -v1"
|
||||||
|
echo " --variant basic-sim OR -v2"
|
||||||
|
echo " --variant phy-sim OR -v3"
|
||||||
|
echo " --variant cppcheck OR -v4"
|
||||||
|
echo " --variant enb-ethernet OR -v7"
|
||||||
|
echo " --variant ue-ethernet OR -v8"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -lt 1 ] || [ $# -gt 9 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
JOB_NAME=XX
|
||||||
|
BUILD_ID=XX
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
ARCHIVES_LOC=enb_usrp
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=4
|
||||||
|
BUILD_OPTIONS="--eNB -w USRP"
|
||||||
|
KEEP_VM_ALIVE=0
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-jn|--job-name)
|
||||||
|
JOB_NAME="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-id|--build-id)
|
||||||
|
BUILD_ID="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-ws|--workspace)
|
||||||
|
JENKINS_WKSP="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-k|--keep-vm-alive)
|
||||||
|
KEEP_VM_ALIVE=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v1)
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
ARCHIVES_LOC=enb_usrp
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=4
|
||||||
|
BUILD_OPTIONS="--eNB -w USRP"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v2)
|
||||||
|
VM_NAME=ci-basic-sim
|
||||||
|
ARCHIVES_LOC=basic_sim
|
||||||
|
LOG_PATTERN=basic_simulator
|
||||||
|
NB_PATTERN_FILES=2
|
||||||
|
BUILD_OPTIONS="--basic-simulator"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v3)
|
||||||
|
VM_NAME=ci-phy-sim
|
||||||
|
ARCHIVES_LOC=phy_sim
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=3
|
||||||
|
BUILD_OPTIONS="--phy_simulators"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v4)
|
||||||
|
VM_NAME=ci-cppcheck
|
||||||
|
ARCHIVES_LOC=cppcheck
|
||||||
|
LOG_PATTERN=cppcheck.xml
|
||||||
|
NB_PATTERN_FILES=1
|
||||||
|
BUILD_OPTIONS="--enable=warning --force --xml --xml-version=2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v7)
|
||||||
|
VM_NAME=ci-enb-ethernet
|
||||||
|
ARCHIVES_LOC=enb_eth
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=6
|
||||||
|
BUILD_OPTIONS="--eNB -t ETHERNET --noS1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v8)
|
||||||
|
VM_NAME=ci-ue-ethernet
|
||||||
|
ARCHIVES_LOC=ue_eth
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=6
|
||||||
|
BUILD_OPTIONS="--UE -t ETHERNET --noS1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--variant)
|
||||||
|
variant="$2"
|
||||||
|
case $variant in
|
||||||
|
enb-usrp)
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
ARCHIVES_LOC=enb_usrp
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=4
|
||||||
|
BUILD_OPTIONS="--eNB -w USRP"
|
||||||
|
;;
|
||||||
|
basic-sim)
|
||||||
|
VM_NAME=ci-basic-sim
|
||||||
|
ARCHIVES_LOC=basic_sim
|
||||||
|
LOG_PATTERN=basic_simulator
|
||||||
|
NB_PATTERN_FILES=2
|
||||||
|
BUILD_OPTIONS="--basic-simulator"
|
||||||
|
;;
|
||||||
|
phy-sim)
|
||||||
|
VM_NAME=ci-phy-sim
|
||||||
|
ARCHIVES_LOC=phy_sim
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=3
|
||||||
|
BUILD_OPTIONS="--phy_simulators"
|
||||||
|
;;
|
||||||
|
cppcheck)
|
||||||
|
VM_NAME=ci-cppcheck
|
||||||
|
ARCHIVES_LOC=cppcheck
|
||||||
|
LOG_PATTERN=cppcheck.xml
|
||||||
|
NB_PATTERN_FILES=1
|
||||||
|
BUILD_OPTIONS="--enable=warning --force --xml --xml-version=2"
|
||||||
|
;;
|
||||||
|
enb-ethernet)
|
||||||
|
VM_NAME=ci-enb-ethernet
|
||||||
|
ARCHIVES_LOC=enb_eth
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=6
|
||||||
|
BUILD_OPTIONS="--eNB -t ETHERNET --noS1"
|
||||||
|
;;
|
||||||
|
ue-ethernet)
|
||||||
|
VM_NAME=ci-ue-ethernet
|
||||||
|
ARCHIVES_LOC=ue_eth
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=6
|
||||||
|
BUILD_OPTIONS="--UE -t ETHERNET --noS1"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: Invalid Variant option -> $variant"
|
||||||
|
echo ""
|
||||||
|
variant_usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ! -f $JENKINS_WKSP/localZip.zip ]
|
||||||
|
then
|
||||||
|
echo "Missing localZip.zip file!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ ! -f /etc/apt/apt.conf.d/01proxy ]
|
||||||
|
then
|
||||||
|
echo "Missing /etc/apt/apt.conf.d/01proxy file!"
|
||||||
|
echo "Is apt-cacher installed and configured?"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$JOB_NAME" == "XX" ] || [ "$BUILD_ID" == "XX" ]
|
||||||
|
then
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
else
|
||||||
|
VM_TEMPLATE=${JOB_NAME}-b${BUILD_ID}-
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_NAME=`echo $VM_NAME | sed -e "s#ci-#$VM_TEMPLATE#"`
|
||||||
|
VM_CMDS=${VM_NAME}_cmds.txt
|
||||||
|
ARCHIVES_LOC=${JENKINS_WKSP}/archives/${ARCHIVES_LOC}
|
||||||
|
|
||||||
|
echo "VM_NAME = $VM_NAME"
|
||||||
|
echo "VM_CMD_FILE = $VM_CMDS"
|
||||||
|
echo "JENKINS_WKSP = $JENKINS_WKSP"
|
||||||
|
echo "ARCHIVES_LOC = $ARCHIVES_LOC"
|
||||||
|
echo "BUILD_OPTIONS = $BUILD_OPTIONS"
|
||||||
|
|
||||||
|
IS_VM_ALIVE=`uvt-kvm list | grep -c $VM_NAME`
|
||||||
|
|
||||||
|
if [ $IS_VM_ALIVE -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Creating VM ($VM_NAME) on Ubuntu Cloud Image base"
|
||||||
|
echo "############################################################"
|
||||||
|
uvt-kvm create $VM_NAME release=xenial --memory 2048 --cpu 4 --unsafe-caching --template ci-scripts/template-host.xml
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Waiting for VM to be started"
|
||||||
|
uvt-kvm wait $VM_NAME --insecure
|
||||||
|
|
||||||
|
VM_IP_ADDR=`uvt-kvm ip $VM_NAME`
|
||||||
|
echo "$VM_NAME has for IP addr = $VM_IP_ADDR"
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Copying GIT repo into VM ($VM_NAME)"
|
||||||
|
echo "############################################################"
|
||||||
|
scp -o StrictHostKeyChecking=no localZip.zip ubuntu@$VM_IP_ADDR:/home/ubuntu
|
||||||
|
scp -o StrictHostKeyChecking=no /etc/apt/apt.conf.d/01proxy ubuntu@$VM_IP_ADDR:/home/ubuntu
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Running install and build script on VM ($VM_NAME)"
|
||||||
|
echo "############################################################"
|
||||||
|
echo "sudo cp 01proxy /etc/apt/apt.conf.d/" > $VM_CMDS
|
||||||
|
if [[ "$VM_NAME" == *"-cppcheck"* ]]
|
||||||
|
then
|
||||||
|
echo "echo \"sudo apt-get --yes --quiet install zip cppcheck \"" >> $VM_CMDS
|
||||||
|
echo "sudo apt-get update > zip-install.txt 2>&1" >> $VM_CMDS
|
||||||
|
echo "sudo apt-get --yes install zip cppcheck >> zip-install.txt 2>&1" >> $VM_CMDS
|
||||||
|
else
|
||||||
|
echo "echo \"sudo apt-get --yes --quiet install zip subversion libboost-dev \"" >> $VM_CMDS
|
||||||
|
echo "sudo apt-get update > zip-install.txt 2>&1" >> $VM_CMDS
|
||||||
|
echo "sudo apt-get --yes install zip subversion libboost-dev >> zip-install.txt 2>&1" >> $VM_CMDS
|
||||||
|
fi
|
||||||
|
echo "mkdir tmp" >> $VM_CMDS
|
||||||
|
echo "cd tmp" >> $VM_CMDS
|
||||||
|
echo "echo \"unzip -qq -DD ../localZip.zip\"" >> $VM_CMDS
|
||||||
|
echo "unzip -qq -DD ../localZip.zip" >> $VM_CMDS
|
||||||
|
if [[ "$VM_NAME" == *"-cppcheck"* ]]
|
||||||
|
then
|
||||||
|
echo "mkdir cmake_targets/log" >> $VM_CMDS
|
||||||
|
echo "cp /home/ubuntu/zip-install.txt cmake_targets/log" >> $VM_CMDS
|
||||||
|
echo "echo \"cppcheck $BUILD_OPTIONS . \"" >> $VM_CMDS
|
||||||
|
echo "cppcheck $BUILD_OPTIONS . 2> cmake_targets/log/cppcheck.xml 1> cmake_targets/log/cppcheck_build.txt" >> $VM_CMDS
|
||||||
|
else
|
||||||
|
echo "echo \"source oaienv\"" >> $VM_CMDS
|
||||||
|
echo "source oaienv" >> $VM_CMDS
|
||||||
|
echo "cd cmake_targets/" >> $VM_CMDS
|
||||||
|
echo "mkdir log" >> $VM_CMDS
|
||||||
|
echo "cp /home/ubuntu/zip-install.txt log" >> $VM_CMDS
|
||||||
|
echo "echo \"./build_oai -I $BUILD_OPTIONS \"" >> $VM_CMDS
|
||||||
|
echo "./build_oai -I $BUILD_OPTIONS > log/install-build.txt 2>&1" >> $VM_CMDS
|
||||||
|
fi
|
||||||
|
ssh -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR < $VM_CMDS
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Creating a tmp folder to store results and artifacts"
|
||||||
|
echo "############################################################"
|
||||||
|
if [ ! -d $JENKINS_WKSP/archives ]
|
||||||
|
then
|
||||||
|
mkdir $JENKINS_WKSP/archives
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $ARCHIVES_LOC ]
|
||||||
|
then
|
||||||
|
mkdir $ARCHIVES_LOC
|
||||||
|
fi
|
||||||
|
|
||||||
|
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/*.txt $ARCHIVES_LOC
|
||||||
|
if [[ "$VM_NAME" == *"-cppcheck"* ]]
|
||||||
|
then
|
||||||
|
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/*.xml $ARCHIVES_LOC
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $KEEP_VM_ALIVE -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Destroying VM"
|
||||||
|
echo "############################################################"
|
||||||
|
uvt-kvm destroy $VM_NAME
|
||||||
|
ssh-keygen -R $VM_IP_ADDR
|
||||||
|
fi
|
||||||
|
rm -f $VM_CMDS
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Checking build status"
|
||||||
|
echo "############################################################"
|
||||||
|
|
||||||
|
LOG_FILES=`ls $ARCHIVES_LOC/*.txt $ARCHIVES_LOC/*.xml`
|
||||||
|
STATUS=0
|
||||||
|
NB_FOUND_FILES=0
|
||||||
|
|
||||||
|
for FULLFILE in $LOG_FILES
|
||||||
|
do
|
||||||
|
if [[ $FULLFILE == *"$LOG_PATTERN"* ]]
|
||||||
|
then
|
||||||
|
filename=$(basename -- "$FULLFILE")
|
||||||
|
if [ "$LOG_PATTERN" == ".Rel14.txt" ]
|
||||||
|
then
|
||||||
|
PASS_PATTERN=`echo $filename | sed -e "s#$LOG_PATTERN##"`
|
||||||
|
fi
|
||||||
|
if [ "$LOG_PATTERN" == "basic_simulator" ]
|
||||||
|
then
|
||||||
|
PASS_PATTERN="lte-"
|
||||||
|
fi
|
||||||
|
if [ "$LOG_PATTERN" == "cppcheck.xml" ]
|
||||||
|
then
|
||||||
|
PASS_PATTERN="results version"
|
||||||
|
LOCAL_STAT=`egrep -c "$PASS_PATTERN" $FULLFILE`
|
||||||
|
else
|
||||||
|
LOCAL_STAT=`egrep -c "Built target $PASS_PATTERN" $FULLFILE`
|
||||||
|
fi
|
||||||
|
if [ $LOCAL_STAT -eq 0 ]; then STATUS=-1; fi
|
||||||
|
NB_FOUND_FILES=$((NB_FOUND_FILES + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $NB_PATTERN_FILES -ne $NB_FOUND_FILES ]; then STATUS=-1; fi
|
||||||
|
|
||||||
|
if [ $STATUS -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "STATUS seems OK"
|
||||||
|
else
|
||||||
|
echo "STATUS failed?"
|
||||||
|
fi
|
||||||
|
exit $STATUS
|
||||||
Executable
+167
@@ -0,0 +1,167 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function usage {
|
||||||
|
echo "OAI VM Creation script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo " Requirements:"
|
||||||
|
echo " -- uvtool uvtool-libvirt apt-cacher"
|
||||||
|
echo " -- xenial image already synced"
|
||||||
|
echo " Default:"
|
||||||
|
echo " -- eNB with USRP"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo " createVM.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo "--------"
|
||||||
|
echo " --job-name #### OR -jn ####"
|
||||||
|
echo " Specify the name of the Jenkins job."
|
||||||
|
echo ""
|
||||||
|
echo " --build-id #### OR -id ####"
|
||||||
|
echo " Specify the build ID of the Jenkins job."
|
||||||
|
echo ""
|
||||||
|
echo " --variant enb-usrp OR -v1"
|
||||||
|
echo " --variant basic-sim OR -v2"
|
||||||
|
echo " --variant phy-sim OR -v3"
|
||||||
|
echo " --variant cppcheck OR -v4"
|
||||||
|
echo " --variant enb-ethernet OR -v7"
|
||||||
|
echo " --variant ue-ethernet OR -v8"
|
||||||
|
echo " Specify the variant to build."
|
||||||
|
echo ""
|
||||||
|
echo " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
function variant_usage {
|
||||||
|
echo "OAI VM Build Check script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo " --variant enb-usrp OR -v1"
|
||||||
|
echo " --variant basic-sim OR -v2"
|
||||||
|
echo " --variant phy-sim OR -v3"
|
||||||
|
echo " --variant cppcheck OR -v4"
|
||||||
|
echo " --variant enb-ethernet OR -v7"
|
||||||
|
echo " --variant ue-ethernet OR -v8"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -lt 1 ] || [ $# -gt 6 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
JOB_NAME=XX
|
||||||
|
BUILD_ID=XX
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-jn|--job-name)
|
||||||
|
JOB_NAME="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-id|--build-id)
|
||||||
|
BUILD_ID="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v1)
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v2)
|
||||||
|
VM_NAME=ci-basic-sim
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v3)
|
||||||
|
VM_NAME=ci-phy-sim
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v4)
|
||||||
|
VM_NAME=ci-cppcheck
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v7)
|
||||||
|
VM_NAME=ci-enb-ethernet
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v8)
|
||||||
|
VM_NAME=ci-ue-ethernet
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--variant)
|
||||||
|
variant="$2"
|
||||||
|
case $variant in
|
||||||
|
enb-usrp)
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
;;
|
||||||
|
basic-sim)
|
||||||
|
VM_NAME=ci-basic-sim
|
||||||
|
;;
|
||||||
|
phy-sim)
|
||||||
|
VM_NAME=ci-phy-sim
|
||||||
|
;;
|
||||||
|
cppcheck)
|
||||||
|
VM_NAME=ci-cppcheck
|
||||||
|
;;
|
||||||
|
enb-ethernet)
|
||||||
|
VM_NAME=ci-enb-ethernet
|
||||||
|
;;
|
||||||
|
ue-ethernet)
|
||||||
|
VM_NAME=ci-ue-ethernet
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: Invalid Variant option -> $variant"
|
||||||
|
echo ""
|
||||||
|
variant_usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$JOB_NAME" == "XX" ] || [ "$BUILD_ID" == "XX" ]
|
||||||
|
then
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
else
|
||||||
|
VM_TEMPLATE=${JOB_NAME}-b${BUILD_ID}-
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_NAME=`echo $VM_NAME | sed -e "s#ci-#$VM_TEMPLATE#"`
|
||||||
|
VM_CMDS=${VM_NAME}_cmds.txt
|
||||||
|
|
||||||
|
echo "VM_NAME = $VM_NAME"
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Creating VM ($VM_NAME) on Ubuntu Cloud Image base"
|
||||||
|
echo "############################################################"
|
||||||
|
uvt-kvm create $VM_NAME release=xenial --memory 2048 --cpu 4 --unsafe-caching --template ci-scripts/template-host.xml
|
||||||
|
echo "Waiting for VM to be started"
|
||||||
|
uvt-kvm wait $VM_NAME --insecure
|
||||||
|
|
||||||
|
VM_IP_ADDR=`uvt-kvm ip $VM_NAME`
|
||||||
|
echo "$VM_NAME has for IP addr = $VM_IP_ADDR"
|
||||||
|
exit 0
|
||||||
Executable
+81
@@ -0,0 +1,81 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function usage {
|
||||||
|
echo "OAI VM Destroy script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo " destroyAllRunningVM.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo "--------"
|
||||||
|
echo " --job-name #### OR -jn ####"
|
||||||
|
echo " Specify the name of the Jenkins job."
|
||||||
|
echo ""
|
||||||
|
echo " --build-id #### OR -id ####"
|
||||||
|
echo " Specify the build ID of the Jenkins job."
|
||||||
|
echo ""
|
||||||
|
echo " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -gt 4 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
JOB_NAME=XX
|
||||||
|
BUILD_ID=XX
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-jn|--job-name)
|
||||||
|
JOB_NAME="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-id|--build-id)
|
||||||
|
BUILD_ID="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$JOB_NAME" == "XX" ] || [ "$BUILD_ID" == "XX" ]
|
||||||
|
then
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
else
|
||||||
|
VM_TEMPLATE=${JOB_NAME}-b${BUILD_ID}-
|
||||||
|
fi
|
||||||
|
|
||||||
|
LIST_CI_VM=`uvt-kvm list | grep $VM_TEMPLATE`
|
||||||
|
|
||||||
|
for CI_VM in $LIST_CI_VM
|
||||||
|
do
|
||||||
|
VM_IP_ADDR=`uvt-kvm ip $CI_VM`
|
||||||
|
echo "VM to destroy: $CI_VM -- IP $VM_IP_ADDR"
|
||||||
|
uvt-kvm destroy $CI_VM
|
||||||
|
ssh-keygen -R $VM_IP_ADDR
|
||||||
|
done
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
Executable
+557
@@ -0,0 +1,557 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function usage {
|
||||||
|
echo "OAI Local Build Report script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo ""
|
||||||
|
echo " reportBuildLocally.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo "--------"
|
||||||
|
echo ""
|
||||||
|
echo " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
echo "Job Options:"
|
||||||
|
echo "------------"
|
||||||
|
echo ""
|
||||||
|
echo " --git-url #### OR -gu ####"
|
||||||
|
echo " Specify the URL of the GIT Repository."
|
||||||
|
echo ""
|
||||||
|
echo " --job-name #### OR -jn ####"
|
||||||
|
echo " Specify the name of the Jenkins job."
|
||||||
|
echo ""
|
||||||
|
echo " --build-id #### OR -id ####"
|
||||||
|
echo " Specify the build ID of the Jenkins job."
|
||||||
|
echo ""
|
||||||
|
echo " --trigger merge-request OR -mr"
|
||||||
|
echo " --trigger push OR -pu"
|
||||||
|
echo " Specify trigger action of the Jenkins job. Either a merge-request event or a push event."
|
||||||
|
echo ""
|
||||||
|
echo "Merge-Request Options:"
|
||||||
|
echo "----------------------"
|
||||||
|
echo ""
|
||||||
|
echo " --src-branch #### OR -sb ####"
|
||||||
|
echo " Specify the source branch of the merge request."
|
||||||
|
echo ""
|
||||||
|
echo " --src-commit #### OR -sc ####"
|
||||||
|
echo " Specify the source commit ID (SHA-1) of the merge request."
|
||||||
|
echo ""
|
||||||
|
echo " --target-branch #### OR -tb ####"
|
||||||
|
echo " Specify the target branch of the merge request (usually develop)."
|
||||||
|
echo ""
|
||||||
|
echo " --target-commit #### OR -tc ####"
|
||||||
|
echo " Specify the target commit ID (SHA-1) of the merge request."
|
||||||
|
echo ""
|
||||||
|
echo "Push Options:"
|
||||||
|
echo "----------------------"
|
||||||
|
echo ""
|
||||||
|
echo " --branch #### OR -br ####"
|
||||||
|
echo " Specify the branch of the push event."
|
||||||
|
echo ""
|
||||||
|
echo " --commit #### OR -co ####"
|
||||||
|
echo " Specify the commit ID (SHA-1) of the push event."
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
function trigger_usage {
|
||||||
|
echo "OAI Local Build Report script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo " --trigger merge-request OR -mr"
|
||||||
|
echo " --trigger push OR -pu"
|
||||||
|
echo " Specify trigger action of the Jenkins job. Either a merge-request event or a push event."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
function details_table {
|
||||||
|
echo " <h4>$1</h4>" >> $3
|
||||||
|
|
||||||
|
echo " <table border = \"1\">" >> $3
|
||||||
|
echo " <tr bgcolor = \"#33CCFF\" >" >> $3
|
||||||
|
echo " <th>File</th>" >> $3
|
||||||
|
echo " <th>Line Number</th>" >> $3
|
||||||
|
echo " <th>Status</th>" >> $3
|
||||||
|
echo " <th>Message</th>" >> $3
|
||||||
|
echo " </tr>" >> $3
|
||||||
|
|
||||||
|
LIST_MESSAGES=`egrep "error:|warning:" $2 | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto"`
|
||||||
|
COMPLETE_MESSAGE="start"
|
||||||
|
for MESSAGE in $LIST_MESSAGES
|
||||||
|
do
|
||||||
|
if [[ $MESSAGE == *"/home/ubuntu/tmp"* ]]
|
||||||
|
then
|
||||||
|
FILENAME=`echo $MESSAGE | sed -e "s#^/home/ubuntu/tmp/##" | awk -F ":" '{print $1}'`
|
||||||
|
LINENB=`echo $MESSAGE | awk -F ":" '{print $2}'`
|
||||||
|
if [ "$COMPLETE_MESSAGE" != "start" ]
|
||||||
|
then
|
||||||
|
COMPLETE_MESSAGE=`echo $COMPLETE_MESSAGE | sed -e "s#‘#'#g" -e "s#’#'#g"`
|
||||||
|
echo " <td>$COMPLETE_MESSAGE</td>" >> $3
|
||||||
|
echo " </tr>" >> $3
|
||||||
|
fi
|
||||||
|
echo " <tr>" >> $3
|
||||||
|
echo " <td>$FILENAME</td>" >> $3
|
||||||
|
echo " <td>$LINENB</td>" >> $3
|
||||||
|
else
|
||||||
|
if [[ $MESSAGE == *"warning:"* ]] || [[ $MESSAGE == *"error:"* ]]
|
||||||
|
then
|
||||||
|
MSGTYPE=`echo $MESSAGE | sed -e "s#:##g"`
|
||||||
|
echo " <td>$MSGTYPE</td>" >> $3
|
||||||
|
COMPLETE_MESSAGE=""
|
||||||
|
else
|
||||||
|
COMPLETE_MESSAGE=$COMPLETE_MESSAGE" "$MESSAGE
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$COMPLETE_MESSAGE" != "start" ]
|
||||||
|
then
|
||||||
|
COMPLETE_MESSAGE=`echo $COMPLETE_MESSAGE | sed -e "s#‘#'#g" -e "s#’#'#g"`
|
||||||
|
echo " <td>$COMPLETE_MESSAGE</td>" >> $3
|
||||||
|
echo " </tr>" >> $3
|
||||||
|
fi
|
||||||
|
echo " </table>" >> $3
|
||||||
|
}
|
||||||
|
|
||||||
|
function summary_table_header {
|
||||||
|
echo " <h3>$1</h3>" >> ./build_results.html
|
||||||
|
echo " <table border = \"1\">" >> ./build_results.html
|
||||||
|
echo " <tr bgcolor = \"#33CCFF\" >" >> ./build_results.html
|
||||||
|
echo " <th>Element</th>" >> ./build_results.html
|
||||||
|
echo " <th>Status</th>" >> ./build_results.html
|
||||||
|
echo " <th>Nb Errors</th>" >> ./build_results.html
|
||||||
|
echo " <th>Nb Warnings</th>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
}
|
||||||
|
|
||||||
|
function summary_table_row {
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >$1</th>" >> ./build_results.html
|
||||||
|
if [ -f $2 ]
|
||||||
|
then
|
||||||
|
STATUS=`egrep -c "$3" $2`
|
||||||
|
if [ $STATUS -eq 1 ]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"green\" >OK</th>" >> ./build_results.html
|
||||||
|
else
|
||||||
|
echo " <td bgcolor = \"red\" >KO</th>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
NB_ERRORS=`egrep -c "error:" $2`
|
||||||
|
if [ $NB_ERRORS -eq 0 ]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"green\" >$NB_ERRORS</th>" >> ./build_results.html
|
||||||
|
else
|
||||||
|
echo " <td bgcolor = \"red\" >$NB_ERRORS</th>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
NB_WARNINGS=`egrep "warning:" $2 | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto" | egrep -c "warning:"`
|
||||||
|
if [ $NB_WARNINGS -eq 0 ]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"green\" >$NB_WARNINGS</th>" >> ./build_results.html
|
||||||
|
else
|
||||||
|
if [ $NB_WARNINGS -gt 20 ]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"red\" >$NB_WARNINGS</th>" >> ./build_results.html
|
||||||
|
else
|
||||||
|
echo " <td bgcolor = \"orange\" >$NB_WARNINGS</th>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ $NB_ERRORS -ne 0 ] || [ $NB_WARNINGS -ne 0 ]
|
||||||
|
then
|
||||||
|
details_table "$1" $2 $4
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " <td bgcolor = \"lightgray\" >Unknown</th>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightgray\" >--</th>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightgray\" >--</th>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
}
|
||||||
|
|
||||||
|
function summary_table_footer {
|
||||||
|
echo " </table>" >> ./build_results.html
|
||||||
|
}
|
||||||
|
|
||||||
|
function sca_summary_table_header {
|
||||||
|
echo " <h3>$1</h3>" >> ./build_results.html
|
||||||
|
echo " <table border = \"1\">" >> ./build_results.html
|
||||||
|
echo " <tr bgcolor = \"#33CCFF\" >" >> ./build_results.html
|
||||||
|
echo " <th>Error / Warning Type</th>" >> ./build_results.html
|
||||||
|
echo " <th>Nb Errors</th>" >> ./build_results.html
|
||||||
|
echo " <th>Nb Warnings</th>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo "0" > ccp_error_cnt.txt
|
||||||
|
}
|
||||||
|
|
||||||
|
function sca_summary_table_row {
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >$2</td>" >> ./build_results.html
|
||||||
|
if [ -f $1 ]
|
||||||
|
then
|
||||||
|
NB_ERRORS=`egrep "severity=\"error\"" $1 | egrep -c "id=\"$3\""`
|
||||||
|
echo " <td>$NB_ERRORS</td>" >> ./build_results.html
|
||||||
|
echo " <td>N/A</td>" >> ./build_results.html
|
||||||
|
if [ -f ccp_error_cnt.txt ]
|
||||||
|
then
|
||||||
|
TOTAL_ERRORS=`cat ccp_error_cnt.txt`
|
||||||
|
TOTAL_ERRORS=$((TOTAL_ERRORS + NB_ERRORS))
|
||||||
|
echo $TOTAL_ERRORS > ccp_error_cnt.txt
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " <td>Unknown</td>" >> ./build_results.html
|
||||||
|
echo " <td>Unknown</td>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
}
|
||||||
|
|
||||||
|
function sca_summary_table_footer {
|
||||||
|
if [ -f $1 ]
|
||||||
|
then
|
||||||
|
NB_ERRORS=`egrep -c "severity=\"error\"" $1`
|
||||||
|
NB_WARNINGS=`egrep -c "severity=\"warning\"" $1`
|
||||||
|
if [ -f ccp_error_cnt.txt ]
|
||||||
|
then
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Others</td>" >> ./build_results.html
|
||||||
|
TOTAL_ERRORS=`cat ccp_error_cnt.txt`
|
||||||
|
TOTAL_ERRORS=$((NB_ERRORS - TOTAL_ERRORS))
|
||||||
|
echo " <td>$TOTAL_ERRORS</td>" >> ./build_results.html
|
||||||
|
echo " <td>$NB_WARNINGS</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
rm -f ccp_error_cnt.txt
|
||||||
|
fi
|
||||||
|
echo " <tr bgcolor = \"#33CCFF\" >" >> ./build_results.html
|
||||||
|
echo " <th>Total</th>" >> ./build_results.html
|
||||||
|
echo " <th>$NB_ERRORS</th>" >> ./build_results.html
|
||||||
|
echo " <th>$NB_WARNINGS</th>" >> ./build_results.html
|
||||||
|
else
|
||||||
|
echo " <tr bgcolor = \"#33CCFF\" >" >> ./build_results.html
|
||||||
|
echo " <th>Total</th>" >> ./build_results.html
|
||||||
|
echo " <th>Unknown</th>" >> ./build_results.html
|
||||||
|
echo " <th>Unknown</th>" >> ./build_results.html
|
||||||
|
if [ -f ccp_error_cnt.txt ]
|
||||||
|
then
|
||||||
|
rm -f ccp_error_cnt.txt
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " </table>" >> ./build_results.html
|
||||||
|
echo " <p>Full details in zipped artifact (cppcheck/cppcheck.xml) </p>" >> ./build_results.html
|
||||||
|
echo " <p>Graphical Interface tool : <code>cppcheck-gui -l cppcheck/cppcheck.xml</code> </p>" >> ./build_results.html
|
||||||
|
}
|
||||||
|
|
||||||
|
jb_checker=0
|
||||||
|
mr_checker=0
|
||||||
|
pu_checker=0
|
||||||
|
MR_TRIG=0
|
||||||
|
PU_TRIG=0
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-gu|--git-url)
|
||||||
|
GIT_URL="$2"
|
||||||
|
let "jb_checker|=0x1"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-jn|--job-name)
|
||||||
|
JOB_NAME="$2"
|
||||||
|
let "jb_checker|=0x2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-id|--build-id)
|
||||||
|
BUILD_ID="$2"
|
||||||
|
let "jb_checker|=0x4"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--trigger)
|
||||||
|
TRIG="$2"
|
||||||
|
case $TRIG in
|
||||||
|
merge-request)
|
||||||
|
MR_TRIG=1
|
||||||
|
;;
|
||||||
|
push)
|
||||||
|
PU_TRIG=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: Invalid Trigger option -> $TRIG"
|
||||||
|
echo ""
|
||||||
|
trigger_usage
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
let "jb_checker|=0x8"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-mr)
|
||||||
|
MR_TRIG=1
|
||||||
|
let "jb_checker|=0x8"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-pu)
|
||||||
|
PU_TRIG=1
|
||||||
|
let "jb_checker|=0x8"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-sb|--src-branch)
|
||||||
|
SOURCE_BRANCH="$2"
|
||||||
|
let "mr_checker|=0x1"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-sc|--src-commit)
|
||||||
|
SOURCE_COMMIT_ID="$2"
|
||||||
|
let "mr_checker|=0x2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-tb|--target-branch)
|
||||||
|
TARGET_BRANCH="$2"
|
||||||
|
let "mr_checker|=0x4"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-tc|--target-commit)
|
||||||
|
TARGET_COMMIT_ID="$2"
|
||||||
|
let "mr_checker|=0x8"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-br|--branch)
|
||||||
|
SOURCE_BRANCH="$2"
|
||||||
|
let "pu_checker|=0x1"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-co|--commit)
|
||||||
|
SOURCE_COMMIT_ID="$2"
|
||||||
|
let "pu_checker|=0x2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $jb_checker -ne 15 ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: missing job information."
|
||||||
|
# TODO : list missing info
|
||||||
|
echo ""
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $PU_TRIG -eq 1 ] && [ $MR_TRIG -eq 1 ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: trigger action incoherent."
|
||||||
|
echo ""
|
||||||
|
trigger_usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $PU_TRIG -eq 1 ]
|
||||||
|
then
|
||||||
|
if [ $pu_checker -ne 3 ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: missing push information."
|
||||||
|
# TODO : list missing info
|
||||||
|
echo ""
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $MR_TRIG -eq 1 ]
|
||||||
|
then
|
||||||
|
if [ $mr_checker -ne 15 ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: missing merge-request information."
|
||||||
|
# TODO : list missing info
|
||||||
|
echo ""
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "<!DOCTYPE html>" > ./build_results.html
|
||||||
|
echo "<html class=\"no-js\" lang=\"en-US\">" >> ./build_results.html
|
||||||
|
echo "<head>" >> ./build_results.html
|
||||||
|
echo " <title>Build Results for $JOB_NAME job build #$BUILD_ID</title>" >> ./build_results.html
|
||||||
|
echo " <base href = \"http://www.openairinterface.org/\" />" >> ./build_results.html
|
||||||
|
echo "</head>" >> ./build_results.html
|
||||||
|
echo "<body>" >> ./build_results.html
|
||||||
|
echo " <table style=\"border-collapse: collapse; border: none;\">" >> ./build_results.html
|
||||||
|
echo " <tr style=\"border-collapse: collapse; border: none;\">" >> ./build_results.html
|
||||||
|
echo " <td style=\"border-collapse: collapse; border: none;\">" >> ./build_results.html
|
||||||
|
echo " <a href=\"http://www.openairinterface.org/\">" >> ./build_results.html
|
||||||
|
echo " <img src=\"/wp-content/uploads/2016/03/cropped-oai_final_logo2.png\" alt=\"\" border=\"none\" height=50 width=150>" >> ./build_results.html
|
||||||
|
echo " </img>" >> ./build_results.html
|
||||||
|
echo " </a>" >> ./build_results.html
|
||||||
|
echo " </td>" >> ./build_results.html
|
||||||
|
echo " <td style=\"border-collapse: collapse; border: none; vertical-align: center;\">" >> ./build_results.html
|
||||||
|
echo " <b><font size = \"6\">Job Summary -- Job: $JOB_NAME -- Build-ID: $BUILD_ID</font></b>" >> ./build_results.html
|
||||||
|
echo " </td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " </table>" >> ./build_results.html
|
||||||
|
echo " <br>" >> ./build_results.html
|
||||||
|
echo " <table border = \"1\">" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >GIT Repository</td>" >> ./build_results.html
|
||||||
|
echo " <td>$GIT_URL</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Job Trigger</td>" >> ./build_results.html
|
||||||
|
if [ $PU_TRIG -eq 1 ]; then echo " <td>Push Event</td>" >> ./build_results.html; fi
|
||||||
|
if [ $MR_TRIG -eq 1 ]; then echo " <td>Merge-Request</td>" >> ./build_results.html; fi
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
if [ $PU_TRIG -eq 1 ]
|
||||||
|
then
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Branch</td>" >> ./build_results.html
|
||||||
|
echo " <td>$SOURCE_BRANCH</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Commit ID</td>" >> ./build_results.html
|
||||||
|
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
if [ $MR_TRIG -eq 1 ]
|
||||||
|
then
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Source Branch</td>" >> ./build_results.html
|
||||||
|
echo " <td>$SOURCE_BRANCH</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Source Commit ID</td>" >> ./build_results.html
|
||||||
|
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Target Branch</td>" >> ./build_results.html
|
||||||
|
echo " <td>$TARGET_BRANCH</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Target Commit ID</td>" >> ./build_results.html
|
||||||
|
echo " <td>$TARGET_COMMIT_ID</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
echo " </table>" >> ./build_results.html
|
||||||
|
echo " <h2>Build Summary</h2>" >> ./build_results.html
|
||||||
|
|
||||||
|
if [ -f ./oai_rules_result.txt ]
|
||||||
|
then
|
||||||
|
echo " <h3>OAI Coding / Formatting Guidelines Check</h3>" >> ./build_results.html
|
||||||
|
echo " <table border = "1">" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Result:</td>" >> ./build_results.html
|
||||||
|
NB_FILES=`cat ./oai_rules_result.txt`
|
||||||
|
if [ $NB_FILES = "0" ]
|
||||||
|
then
|
||||||
|
if [ $PU_TRIG -eq 1 ]; then echo " <td bgcolor = \"green\">All files in repository follow OAI rules. </td>" >> ./build_results.html; fi
|
||||||
|
if [ $MR_TRIG -eq 1 ]; then echo " <td bgcolor = \"green\">All modified files in Merge-Request follow OAI rules.</td>" >> ./build_results.html; fi
|
||||||
|
else
|
||||||
|
if [ $PU_TRIG -eq 1 ]; then echo " <td bgcolor = \"orange\">$NB_FILES files in repository DO NOT follow OAI rules. </td>" >> ./build_results.html; fi
|
||||||
|
if [ $MR_TRIG -eq 1 ]; then echo " <td bgcolor = \"orange\">$NB_FILES modified files in Merge-Request DO NOT follow OAI rules.</td>" >> ./build_results.html; fi
|
||||||
|
fi
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " </table>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
|
||||||
|
sca_summary_table_header "OAI Static Code Analysis with CPPCHECK"
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Uninitialized variable" uninitvar
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Uninitialized struct member" uninitStructMember
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Memory leak" memleak
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Memory is freed twice" doubleFree
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Resource leak" resourceLeak
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Possible null pointer dereference" nullPointer
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Array access out of bounds" arrayIndexOutOfBounds
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Buffer is accessed out of bounds" bufferAccessOutOfBounds
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Expression depends on order of evaluation of side effects" unknownEvaluationOrder
|
||||||
|
sca_summary_table_footer ./archives/cppcheck/cppcheck.xml
|
||||||
|
|
||||||
|
summary_table_header "OAI Build eNB -- USRP option"
|
||||||
|
summary_table_row "LTE SoftModem - Release 14" ./archives/enb_usrp/lte-softmodem.Rel14.txt "Built target lte-softmodem" ./enb_usrp_row1.html
|
||||||
|
summary_table_row "Coding - Release 14" ./archives/enb_usrp/coding.Rel14.txt "Built target coding" ./enb_usrp_row2.html
|
||||||
|
summary_table_row "OAI USRP device if - Release 14" ./archives/enb_usrp/oai_usrpdevif.Rel14.txt "Built target oai_usrpdevif" ./enb_usrp_row3.html
|
||||||
|
summary_table_row "Parameters Lib Config - Release 14" ./archives/enb_usrp/params_libconfig.Rel14.txt "Built target params_libconfig" ./enb_usrp_row4.html
|
||||||
|
summary_table_footer
|
||||||
|
|
||||||
|
summary_table_header "OAI Build basic simulator option"
|
||||||
|
summary_table_row "Basic Simulator eNb - Release 14" ./archives/basic_sim/basic_simulator_enb.txt "Built target lte-softmodem" ./basic_sim_row1.html
|
||||||
|
summary_table_row "Basic Simulator UE - Release 14" ./archives/basic_sim/basic_simulator_ue.txt "Built target lte-uesoftmodem" ./basic_sim_row2.html
|
||||||
|
summary_table_row "Conf 2 UE data - Release 14" ./archives/basic_sim/conf2uedata.Rel14.txt "Built target conf2uedata" ./basic_sim_row3.html
|
||||||
|
summary_table_footer
|
||||||
|
|
||||||
|
summary_table_header "OAI Build Physical simulators option"
|
||||||
|
summary_table_row "DL Simulator - Release 14" ./archives/phy_sim/dlsim.Rel14.txt "Built target dlsim" ./phy_sim_row1.html
|
||||||
|
summary_table_row "UL Simulator - Release 14" ./archives/phy_sim/ulsim.Rel14.txt "Built target ulsim" ./phy_sim_row2.html
|
||||||
|
summary_table_row "Coding - Release 14" ./archives/phy_sim/coding.Rel14.txt "Built target coding" ./phy_sim_row3.html
|
||||||
|
summary_table_footer
|
||||||
|
|
||||||
|
summary_table_header "OAI Build eNB -- ETHERNET transport option"
|
||||||
|
summary_table_row "LTE SoftModem w/o S1 - Release 14" ./archives/enb_eth/lte-softmodem-nos1.Rel14.txt "Built target lte-softmodem" ./enb_eth_row1.html
|
||||||
|
summary_table_row "Coding - Release 14" ./archives/enb_eth/coding.Rel14.txt "Built target coding" ./enb_eth_row2.html
|
||||||
|
summary_table_row "OAI ETHERNET transport - Release 14" ./archives/enb_eth/oai_eth_transpro.Rel14.txt "Built target oai_eth_transpro" ./enb_eth_row3.html
|
||||||
|
summary_table_row "Parameters Lib Config - Release 14" ./archives/enb_eth/params_libconfig.Rel14.txt "Built target params_libconfig" ./enb_eth_row4.html
|
||||||
|
summary_table_row "RB Tools - Release 14" ./archives/enb_eth/rb_tool.Rel14.txt "Built target rb_tool" ./enb_eth_row5.html
|
||||||
|
summary_table_row "NAS Mesh - Release 14" ./archives/enb_eth/nasmesh.Rel14.txt "Built target nasmesh" ./enb_eth_row6.html
|
||||||
|
summary_table_footer
|
||||||
|
|
||||||
|
summary_table_header "OAI Build UE -- ETHERNET transport option"
|
||||||
|
summary_table_row "LTE UE SoftModem w/o S1 - Release 14" ./archives/ue_eth/lte-uesoftmodem-nos1.Rel14.txt "Built target lte-uesoftmodem" ./ue_eth_row1.html
|
||||||
|
summary_table_row "Coding - Release 14" ./archives/ue_eth/coding.Rel14.txt "Built target coding" ./ue_eth_row2.html
|
||||||
|
summary_table_row "OAI ETHERNET transport - Release 14" ./archives/ue_eth/oai_eth_transpro.Rel14.txt "Built target oai_eth_transpro" ./ue_eth_row3.html
|
||||||
|
summary_table_row "Parameters Lib Config - Release 14" ./archives/ue_eth/params_libconfig.Rel14.txt "Built target params_libconfig" ./ue_eth_row4.html
|
||||||
|
summary_table_row "RB Tools - Release 14" ./archives/ue_eth/rb_tool.Rel14.txt "Built target rb_tool" ./ue_eth_row5.html
|
||||||
|
summary_table_row "NAS Mesh - Release 14" ./archives/ue_eth/nasmesh.Rel14.txt "Built target nasmesh" ./ue_eth_row6.html
|
||||||
|
summary_table_footer
|
||||||
|
|
||||||
|
echo " <h3>Details</h3>" >> ./build_results.html
|
||||||
|
|
||||||
|
for DETAILS_TABLE in `ls ./enb_usrp_row*.html`
|
||||||
|
do
|
||||||
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
done
|
||||||
|
for DETAILS_TABLE in `ls ./basic_sim_row*.html`
|
||||||
|
do
|
||||||
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
done
|
||||||
|
for DETAILS_TABLE in `ls ./phy_sim_row*.html`
|
||||||
|
do
|
||||||
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
done
|
||||||
|
for DETAILS_TABLE in `ls ./enb_eth_row*.html`
|
||||||
|
do
|
||||||
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
done
|
||||||
|
for DETAILS_TABLE in `ls ./ue_eth_row*.html`
|
||||||
|
do
|
||||||
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
done
|
||||||
|
rm -f ./enb_usrp_row*.html ./basic_sim_row*.html ./phy_sim_row*.html ./enb_eth_row*.html ./ue_eth_row*.html
|
||||||
|
|
||||||
|
echo "</body>" >> ./build_results.html
|
||||||
|
echo "</html>" >> ./build_results.html
|
||||||
|
|
||||||
|
exit 0
|
||||||
Executable
+298
@@ -0,0 +1,298 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function usage {
|
||||||
|
echo "OAI VM Test Run script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo " Default:"
|
||||||
|
echo " -- eNB with USRP"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo " runTestOnVM.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo "--------"
|
||||||
|
echo " --job-name #### OR -jn ####"
|
||||||
|
echo " Specify the name of the Jenkins job."
|
||||||
|
echo ""
|
||||||
|
echo " --build-id #### OR -id ####"
|
||||||
|
echo " Specify the build ID of the Jenkins job."
|
||||||
|
echo ""
|
||||||
|
echo " --workspace #### OR -ws ####"
|
||||||
|
echo " Specify the workspace."
|
||||||
|
echo ""
|
||||||
|
echo " --variant enb-usrp OR -v1"
|
||||||
|
echo " --variant basic-sim OR -v2"
|
||||||
|
echo " --variant phy-sim OR -v3"
|
||||||
|
echo " --variant cppcheck OR -v4"
|
||||||
|
echo " --variant enb-ethernet OR -v7"
|
||||||
|
echo " --variant ue-ethernet OR -v8"
|
||||||
|
echo " Specify the variant to build."
|
||||||
|
echo ""
|
||||||
|
echo " --keep-vm-alive OR -k"
|
||||||
|
echo " Keep the VM alive after the build."
|
||||||
|
echo ""
|
||||||
|
echo " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
function variant_usage {
|
||||||
|
echo "OAI VM Test Run script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo " --variant enb-usrp OR -v1"
|
||||||
|
echo " --variant basic-sim OR -v2"
|
||||||
|
echo " --variant phy-sim OR -v3"
|
||||||
|
echo " --variant cppcheck OR -v4"
|
||||||
|
echo " --variant enb-ethernet OR -v7"
|
||||||
|
echo " --variant ue-ethernet OR -v8"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -lt 1 ] || [ $# -gt 9 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
JOB_NAME=XX
|
||||||
|
BUILD_ID=XX
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
ARCHIVES_LOC=enb_usrp/test
|
||||||
|
KEEP_VM_ALIVE=0
|
||||||
|
RUN_OPTIONS="none"
|
||||||
|
STATUS=0
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-jn|--job-name)
|
||||||
|
JOB_NAME="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-id|--build-id)
|
||||||
|
BUILD_ID="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-ws|--workspace)
|
||||||
|
JENKINS_WKSP="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-k|--keep-vm-alive)
|
||||||
|
KEEP_VM_ALIVE=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v1)
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v2)
|
||||||
|
VM_NAME=ci-basic-sim
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v3)
|
||||||
|
VM_NAME=ci-phy-sim
|
||||||
|
RUN_OPTIONS="./run_exec_autotests.bash -g \"01510*\" -q -np -b"
|
||||||
|
ARCHIVES_LOC=phy_sim/test
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v4)
|
||||||
|
VM_NAME=ci-cppcheck
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v7)
|
||||||
|
VM_NAME=ci-enb-ethernet
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v8)
|
||||||
|
VM_NAME=ci-ue-ethernet
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--variant)
|
||||||
|
variant="$2"
|
||||||
|
case $variant in
|
||||||
|
enb-usrp)
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
;;
|
||||||
|
basic-sim)
|
||||||
|
VM_NAME=ci-basic-sim
|
||||||
|
;;
|
||||||
|
phy-sim)
|
||||||
|
VM_NAME=ci-phy-sim
|
||||||
|
RUN_OPTIONS="./run_exec_autotests.bash -g \"01510*\" -q -np -b"
|
||||||
|
ARCHIVES_LOC=phy_sim/test
|
||||||
|
;;
|
||||||
|
cppcheck)
|
||||||
|
VM_NAME=ci-cppcheck
|
||||||
|
;;
|
||||||
|
enb-ethernet)
|
||||||
|
VM_NAME=ci-enb-ethernet
|
||||||
|
;;
|
||||||
|
ue-ethernet)
|
||||||
|
VM_NAME=ci-ue-ethernet
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: Invalid Variant option -> $variant"
|
||||||
|
echo ""
|
||||||
|
variant_usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$JOB_NAME" == "XX" ] || [ "$BUILD_ID" == "XX" ]
|
||||||
|
then
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
else
|
||||||
|
VM_TEMPLATE=${JOB_NAME}-b${BUILD_ID}-
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_NAME=`echo $VM_NAME | sed -e "s#ci-#$VM_TEMPLATE#"`
|
||||||
|
VM_CMDS=${VM_NAME}_cmds.txt
|
||||||
|
ARCHIVES_LOC=${JENKINS_WKSP}/archives/${ARCHIVES_LOC}
|
||||||
|
|
||||||
|
echo "VM_NAME = $VM_NAME"
|
||||||
|
echo "VM_CMD_FILE = $VM_CMDS"
|
||||||
|
echo "JENKINS_WKSP = $JENKINS_WKSP"
|
||||||
|
echo "ARCHIVES_LOC = $ARCHIVES_LOC"
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Waiting for VM to be started"
|
||||||
|
echo "############################################################"
|
||||||
|
uvt-kvm wait $VM_NAME --insecure
|
||||||
|
|
||||||
|
VM_IP_ADDR=`uvt-kvm ip $VM_NAME`
|
||||||
|
echo "$VM_NAME has for IP addr = $VM_IP_ADDR"
|
||||||
|
|
||||||
|
if [ "$RUN_OPTIONS" == "none" ]
|
||||||
|
then
|
||||||
|
echo "No run on VM testing for this variant currently"
|
||||||
|
else
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Running test script on VM ($VM_NAME)"
|
||||||
|
echo "############################################################"
|
||||||
|
echo "echo \"sudo apt-get --yes --quiet install bc \"" > $VM_CMDS
|
||||||
|
echo "sudo apt-get update > bc-install.txt 2>&1" >> $VM_CMDS
|
||||||
|
echo "sudo apt-get --yes install bc >> bc-install.txt 2>&1" >> $VM_CMDS
|
||||||
|
echo "cd tmp" >> $VM_CMDS
|
||||||
|
echo "echo \"source oaienv\"" >> $VM_CMDS
|
||||||
|
echo "source oaienv" >> $VM_CMDS
|
||||||
|
echo "echo \"cd cmake_targets/autotests\"" >> $VM_CMDS
|
||||||
|
echo "cd cmake_targets/autotests" >> $VM_CMDS
|
||||||
|
echo "echo \"rm -Rf log\"" >> $VM_CMDS
|
||||||
|
echo "rm -Rf log" >> $VM_CMDS
|
||||||
|
echo "$RUN_OPTIONS" | sed -e 's@"@\\"@g' -e 's@^@echo "@' -e 's@$@"@' >> $VM_CMDS
|
||||||
|
echo "$RUN_OPTIONS" >> $VM_CMDS
|
||||||
|
echo "cp /home/ubuntu/bc-install.txt log" >> $VM_CMDS
|
||||||
|
echo "cd log" >> $VM_CMDS
|
||||||
|
echo "zip -r -qq tmp.zip *.* 0*" >> $VM_CMDS
|
||||||
|
|
||||||
|
ssh -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR < $VM_CMDS
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Creating a tmp folder to store results and artifacts"
|
||||||
|
echo "############################################################"
|
||||||
|
|
||||||
|
if [ -d $ARCHIVES_LOC ]
|
||||||
|
then
|
||||||
|
rm -Rf $ARCHIVES_LOC
|
||||||
|
fi
|
||||||
|
mkdir --parents $ARCHIVES_LOC
|
||||||
|
|
||||||
|
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/autotests/log/tmp.zip $ARCHIVES_LOC
|
||||||
|
pushd $ARCHIVES_LOC
|
||||||
|
unzip -qq -DD tmp.zip
|
||||||
|
rm tmp.zip
|
||||||
|
if [ -f results_autotests.xml ]
|
||||||
|
then
|
||||||
|
FUNCTION=`echo $VM_NAME | sed -e "s@$VM_TEMPLATE@@"`
|
||||||
|
NEW_NAME=`echo "results_autotests.xml" | sed -e "s@results_autotests@results_autotests-$FUNCTION@"`
|
||||||
|
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > $NEW_NAME
|
||||||
|
echo "<?xml-stylesheet type=\"text/xsl\" href=\"$FUNCTION.xsl\" ?>" >> $NEW_NAME
|
||||||
|
cat results_autotests.xml >> $NEW_NAME
|
||||||
|
sed -e "s@TEMPLATE@$FUNCTION@" $JENKINS_WKSP/ci-scripts/template.xsl > $FUNCTION.xsl
|
||||||
|
#mv results_autotests.xml $NEW_NAME
|
||||||
|
rm results_autotests.xml
|
||||||
|
fi
|
||||||
|
popd
|
||||||
|
|
||||||
|
if [ $KEEP_VM_ALIVE -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Destroying VM"
|
||||||
|
echo "############################################################"
|
||||||
|
uvt-kvm destroy $VM_NAME
|
||||||
|
ssh-keygen -R $VM_IP_ADDR
|
||||||
|
fi
|
||||||
|
rm -f $VM_CMDS
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Checking build status"
|
||||||
|
echo "############################################################"
|
||||||
|
|
||||||
|
LOG_FILES=`ls $ARCHIVES_LOC/results_autotests*.xml`
|
||||||
|
NB_FOUND_FILES=0
|
||||||
|
NB_RUNS=0
|
||||||
|
NB_FAILURES=0
|
||||||
|
|
||||||
|
for FULLFILE in $LOG_FILES
|
||||||
|
do
|
||||||
|
TESTSUITES=`egrep "testsuite errors" $FULLFILE`
|
||||||
|
for TESTSUITE in $TESTSUITES
|
||||||
|
do
|
||||||
|
if [[ "$TESTSUITE" == *"tests="* ]]
|
||||||
|
then
|
||||||
|
RUNS=`echo $TESTSUITE | awk 'BEGIN{FS="="}{print $2}END{}' | sed -e "s@'@@g" `
|
||||||
|
NB_RUNS=$((NB_RUNS + RUNS))
|
||||||
|
fi
|
||||||
|
if [[ "$TESTSUITE" == *"failures="* ]]
|
||||||
|
then
|
||||||
|
FAILS=`echo $TESTSUITE | awk 'BEGIN{FS="="}{print $2}END{}' | sed -e "s@'@@g" `
|
||||||
|
NB_FAILURES=$((NB_FAILURES + FAILS))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
NB_FOUND_FILES=$((NB_FOUND_FILES + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "NB_FOUND_FILES = $NB_FOUND_FILES"
|
||||||
|
echo "NB_RUNS = $NB_RUNS"
|
||||||
|
echo "NB_FAILURES = $NB_FAILURES"
|
||||||
|
|
||||||
|
if [ $NB_FOUND_FILES -eq 0 ]; then STATUS=-1; fi
|
||||||
|
if [ $NB_RUNS -eq 0 ]; then STATUS=-1; fi
|
||||||
|
if [ $NB_FAILURES -ne 0 ]; then STATUS=-1; fi
|
||||||
|
|
||||||
|
if [ $STATUS -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "STATUS seems OK"
|
||||||
|
else
|
||||||
|
echo "STATUS failed?"
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $STATUS
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<domain type='kvm'>
|
||||||
|
<os>
|
||||||
|
<type>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<features>
|
||||||
|
<acpi/>
|
||||||
|
<apic/>
|
||||||
|
<pae/>
|
||||||
|
</features>
|
||||||
|
<cpu mode='host-passthrough'>
|
||||||
|
</cpu>
|
||||||
|
<devices>
|
||||||
|
<interface type='network'>
|
||||||
|
<source network='default'/>
|
||||||
|
<model type='virtio'/>
|
||||||
|
</interface>
|
||||||
|
<serial type='pty'>
|
||||||
|
<source path='/dev/pts/3'/>
|
||||||
|
<target port='0'/>
|
||||||
|
</serial>
|
||||||
|
<graphics type='vnc' autoport='yes' listen='127.0.0.1'>
|
||||||
|
<listen type='address' address='127.0.0.1'/>
|
||||||
|
</graphics>
|
||||||
|
<video/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||||
|
<xsl:output method="html" version="4" encoding="UTF-8" indent="no" omit-xml-declaration="yes"/>
|
||||||
|
<!-- main body -->
|
||||||
|
<xsl:template match="/">
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<h3>TEMPLATE Results Summary</h3>
|
||||||
|
<table border="1">
|
||||||
|
<tr bgcolor="lightcyan">
|
||||||
|
<!--Header only so select first row to get headers-->
|
||||||
|
<th>Hostname</th>
|
||||||
|
<th>Nb Tests</th>
|
||||||
|
<th>Failures</th>
|
||||||
|
<th>Timestamp</th>
|
||||||
|
</tr>
|
||||||
|
<!--Get all the other rows-->
|
||||||
|
<xsl:for-each select="testsuites/testsuite">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@hostname"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@tests"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@failures"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@timestamp"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</xsl:for-each>
|
||||||
|
</table>
|
||||||
|
<h4>Details</h4>
|
||||||
|
<table border="1">
|
||||||
|
<tr bgcolor="lightcyan">
|
||||||
|
<!--Header only so select first row to get headers-->
|
||||||
|
<th>Test Name</th>
|
||||||
|
<th>Result</th>
|
||||||
|
<th>Time</th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
<!--Get all the other rows-->
|
||||||
|
<xsl:for-each select="testsuites/testsuite/testcase">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@name"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@RESULT"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@time"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@description"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</xsl:for-each>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
</xsl:template>
|
||||||
|
</xsl:stylesheet>
|
||||||
@@ -2127,6 +2127,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
|
|||||||
int *);
|
int *);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int P1_SHIFT[13],P2_SHIFT[13];
|
int P1_SHIFT[13],P2_SHIFT[13];
|
||||||
int offset,nushiftmod3;
|
int offset,nushiftmod3;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "PHY/types.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Gold Sequence Generation defined in 3x.211
|
||||||
|
\param x1 x1 shift register
|
||||||
|
\param x2 x2 shift register / cinit if reset is set
|
||||||
|
\param reset Reset flag / reinitialize the generator
|
||||||
|
\return c 32 bits of gold output
|
||||||
|
*/
|
||||||
|
extern inline uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t reset)
|
||||||
|
{
|
||||||
|
int32_t n;
|
||||||
|
|
||||||
|
// 3GPP 3x.211
|
||||||
|
// Nc = 1600
|
||||||
|
// c(n) = [x1(n+Nc) + x2(n+Nc)]mod2
|
||||||
|
// x1(n+31) = [x1(n+3) + x1(n)]mod2
|
||||||
|
// x2(n+31) = [x2(n+3) + x2(n+2) + x2(n+1) + x2(n)]mod2
|
||||||
|
if (reset)
|
||||||
|
{
|
||||||
|
// Init value for x1: x1(0) = 1, x1(n) = 0, n=1,2,...,30
|
||||||
|
// x1(31) = [x1(3) + x1(0)]mod2 = 1
|
||||||
|
*x1 = 1 + (1<<31);
|
||||||
|
// Init value for x2: cinit = sum_{i=0}^30 x2*2^i
|
||||||
|
// x2(31) = [x2(3) + x2(2) + x2(1) + x2(0)]mod2
|
||||||
|
// = (*x2>>3) ^ (*x2>>2) + (*x2>>1) + *x2
|
||||||
|
*x2 = *x2 ^ ((*x2 ^ (*x2>>1) ^ (*x2>>2) ^ (*x2>>3))<<31);
|
||||||
|
|
||||||
|
// x1 and x2 contain bits n = 0,1,...,31
|
||||||
|
|
||||||
|
// Nc = 1600 bits are skipped at the beginning
|
||||||
|
// i.e., 1600 / 32 = 50 32bit words
|
||||||
|
|
||||||
|
for (n = 1; n < 50; n++)
|
||||||
|
{
|
||||||
|
// Compute x1(0),...,x1(27)
|
||||||
|
*x1 = (*x1>>1) ^ (*x1>>4);
|
||||||
|
// Compute x1(28),..,x1(31) and xor
|
||||||
|
*x1 = *x1 ^ (*x1<<31) ^ (*x1<<28);
|
||||||
|
// Compute x2(0),...,x2(27)
|
||||||
|
*x2 = (*x2>>1) ^ (*x2>>2) ^ (*x2>>3) ^ (*x2>>4);
|
||||||
|
// Compute x2(28),..,x2(31) and xor
|
||||||
|
*x2 = *x2 ^ (*x2<<31) ^ (*x2<<30) ^ (*x2<<29) ^ (*x2<<28);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*x1 = (*x1>>1) ^ (*x1>>4);
|
||||||
|
*x1 = *x1 ^ (*x1<<31) ^ (*x1<<28);
|
||||||
|
*x2 = (*x2>>1) ^ (*x2>>2) ^ (*x2>>3) ^ (*x2>>4);
|
||||||
|
*x2 = *x2 ^ (*x2<<31) ^ (*x2<<30) ^ (*x2<<29) ^ (*x2<<28);
|
||||||
|
|
||||||
|
// c(n) = [x1(n+Nc) + x2(n+Nc)]mod2
|
||||||
|
return(*x1^*x2);
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
||||||
|
|
||||||
|
uint8_t get_pmi(uint8_t N_RB_DL, MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
MIMO_mode_t mode = dlsch_harq->mimo_mode;
|
||||||
|
uint32_t pmi_alloc = dlsch_harq->pmi_alloc;
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch (N_RB_DL) {
|
||||||
|
case 6: // 1 PRB per subband
|
||||||
|
if (mode <= PUSCH_PRECODING1)
|
||||||
|
return((pmi_alloc>>(rb<<1))&3);
|
||||||
|
else
|
||||||
|
return((pmi_alloc>>rb)&1);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
case 25: // 4 PRBs per subband
|
||||||
|
if (mode <= PUSCH_PRECODING1)
|
||||||
|
return((pmi_alloc>>((rb>>2)<<1))&3);
|
||||||
|
else
|
||||||
|
return((pmi_alloc>>(rb>>2))&1);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 50: // 6 PRBs per subband
|
||||||
|
if (mode <= PUSCH_PRECODING1)
|
||||||
|
return((pmi_alloc>>((rb/6)<<1))&3);
|
||||||
|
else
|
||||||
|
return((pmi_alloc>>(rb/6))&1);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 100: // 8 PRBs per subband
|
||||||
|
if (mode <= PUSCH_PRECODING1)
|
||||||
|
return((pmi_alloc>>((rb>>3)<<1))&3);
|
||||||
|
else
|
||||||
|
return((pmi_alloc>>(rb>>3))&1);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,369 @@
|
|||||||
|
/* These functions compute linear preprocessing for
|
||||||
|
the UE using LAPACKE and CBLAS modules of
|
||||||
|
LAPACK libraries.
|
||||||
|
MMSE and MMSE whitening filters are available.
|
||||||
|
Functions are using RowMajor storage of the
|
||||||
|
matrices, like in conventional C. Traditional
|
||||||
|
Fortran functions of LAPACK employ ColumnMajor
|
||||||
|
data storage. */
|
||||||
|
|
||||||
|
#include<stdio.h>
|
||||||
|
#include<math.h>
|
||||||
|
#include<complex.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <cblas.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <lapacke_utils.h>
|
||||||
|
#include <lapacke.h>
|
||||||
|
|
||||||
|
//#define DEBUG_PREPROC
|
||||||
|
|
||||||
|
|
||||||
|
void transpose (int N, float complex *A, float complex *Result)
|
||||||
|
{
|
||||||
|
// COnputes C := alpha*op(A)*op(B) + beta*C,
|
||||||
|
enum CBLAS_TRANSPOSE transa = CblasTrans;
|
||||||
|
enum CBLAS_TRANSPOSE transb = CblasNoTrans;
|
||||||
|
int rows_opA = N; // number of rows in op(A) and in C
|
||||||
|
int col_opB = N; //number of columns of op(B) and in C
|
||||||
|
int col_opA = N; //number of columns in op(A) and rows in op(B)
|
||||||
|
int col_B; //number of columns in B
|
||||||
|
float complex alpha = 1.0+I*0;
|
||||||
|
int lda = rows_opA;
|
||||||
|
float complex beta = 0.0+I*0;
|
||||||
|
int ldc = rows_opA;
|
||||||
|
int i;
|
||||||
|
float complex* B;
|
||||||
|
|
||||||
|
int ldb = col_opB;
|
||||||
|
|
||||||
|
if (transb == CblasNoTrans) {
|
||||||
|
B = (float complex*)calloc(ldb*col_opB,sizeof(float complex));
|
||||||
|
col_B= col_opB;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
B = (float complex*)calloc(ldb*col_opA, sizeof(float complex));
|
||||||
|
col_B = col_opA;
|
||||||
|
}
|
||||||
|
float complex* C = (float complex*)malloc(ldc*col_opB*sizeof(float complex));
|
||||||
|
|
||||||
|
for (i=0; i<lda*col_B; i+=N+1)
|
||||||
|
B[i]=1.0+I*0;
|
||||||
|
|
||||||
|
cblas_cgemm(CblasRowMajor, transa, transb, rows_opA, col_opB, col_opA, &alpha, A, lda, B, ldb, &beta, C, ldc);
|
||||||
|
|
||||||
|
memcpy(Result, C, N*N*sizeof(float complex));
|
||||||
|
|
||||||
|
free(B);
|
||||||
|
free(C);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void conjugate_transpose (int N, float complex *A, float complex *Result)
|
||||||
|
{
|
||||||
|
// Computes C := alpha*op(A)*op(B) + beta*C,
|
||||||
|
enum CBLAS_TRANSPOSE transa = CblasConjTrans;
|
||||||
|
enum CBLAS_TRANSPOSE transb = CblasNoTrans;
|
||||||
|
int rows_opA = N; // number of rows in op(A) and in C
|
||||||
|
int col_opB = N; //number of columns of op(B) and in C
|
||||||
|
int col_opA = N; //number of columns in op(A) and rows in op(B)
|
||||||
|
int col_B; //number of columns in B
|
||||||
|
float complex alpha = 1.0+I*0;
|
||||||
|
int lda = rows_opA;
|
||||||
|
float complex beta = 0.0+I*0;
|
||||||
|
int ldc = rows_opA;
|
||||||
|
int i;
|
||||||
|
float complex* B;
|
||||||
|
int ldb = col_opB;
|
||||||
|
|
||||||
|
if (transb == CblasNoTrans) {
|
||||||
|
B = (float complex*)calloc(ldb*col_opB,sizeof(float complex));
|
||||||
|
col_B= col_opB;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
B = (float complex*)calloc(ldb*col_opA, sizeof(float complex));
|
||||||
|
col_B = col_opA;
|
||||||
|
}
|
||||||
|
float complex* C = (float complex*)malloc(ldc*col_opB*sizeof(float complex));
|
||||||
|
|
||||||
|
for (i=0; i<lda*col_B; i+=N+1)
|
||||||
|
B[i]=1.0+I*0;
|
||||||
|
|
||||||
|
cblas_cgemm(CblasRowMajor, transa, transb, rows_opA, col_opB, col_opA, &alpha, A, lda, B, ldb, &beta, C, ldc);
|
||||||
|
|
||||||
|
memcpy(Result, C, N*N*sizeof(float complex));
|
||||||
|
|
||||||
|
free(B);
|
||||||
|
free(C);
|
||||||
|
}
|
||||||
|
|
||||||
|
void H_hermH_plus_sigma2I (int N, int M, float complex *A, float sigma2, float complex *Result)
|
||||||
|
{
|
||||||
|
//C := alpha*op(A)*op(B) + beta*C,
|
||||||
|
enum CBLAS_TRANSPOSE transa = CblasConjTrans;
|
||||||
|
enum CBLAS_TRANSPOSE transb = CblasNoTrans;
|
||||||
|
int rows_opA = N; // number of rows in op(A) and in C
|
||||||
|
int col_opB = N; //number of columns of op(B) and in C
|
||||||
|
int col_opA = N; //number of columns in op(A) and rows in op(B)
|
||||||
|
int col_C = N; //number of columns in B
|
||||||
|
float complex alpha = 1.0+I*0;
|
||||||
|
int lda = col_opA;
|
||||||
|
float complex beta = 1.0 + I*0;
|
||||||
|
int ldc = col_opA;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
float complex* C = (float complex*)calloc(ldc*col_opB, sizeof(float complex));
|
||||||
|
|
||||||
|
for (i=0; i<lda*col_C; i+=N+1)
|
||||||
|
C[i]=sigma2*(1.0+I*0);
|
||||||
|
|
||||||
|
cblas_cgemm(CblasRowMajor, transa, transb, rows_opA, col_opB, col_opA, &alpha, A, lda, A, lda, &beta, C, ldc);
|
||||||
|
|
||||||
|
memcpy(Result, C, N*M*sizeof(float complex));
|
||||||
|
free(C);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void HH_herm_plus_sigma2I (int M, int N, float complex *A, float sigma2, float complex *Result)
|
||||||
|
{
|
||||||
|
//C := alpha*op(A)*op(B) + beta*C,
|
||||||
|
enum CBLAS_TRANSPOSE transa = CblasNoTrans;
|
||||||
|
enum CBLAS_TRANSPOSE transb = CblasConjTrans;
|
||||||
|
int k = N; //number of columns in op(A) and rows in op(B),k
|
||||||
|
float complex alpha = 1.0+I*0;
|
||||||
|
int lda = N;
|
||||||
|
int ldb = N;
|
||||||
|
int ldc = M;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
float complex* C = (float complex*)calloc(M*M, sizeof(float complex));
|
||||||
|
|
||||||
|
for (i=0; i<M*M; i+=M+1)
|
||||||
|
C[i]=1.0+I*0;
|
||||||
|
|
||||||
|
cblas_cgemm(CblasRowMajor, transa, transb, M, M, k, &alpha, A, lda, A, ldb, &sigma2, C, ldc);
|
||||||
|
|
||||||
|
memcpy(Result, C, M*M*sizeof(float complex));
|
||||||
|
free(C);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void eigen_vectors_values (int N, float complex *A, float complex *Vectors, float *Values_Matrix)
|
||||||
|
{
|
||||||
|
// This function computes ORTHONORMAL eigenvectors and eigenvalues of matrix A,
|
||||||
|
// where Values_Matrix is a diagonal matrix of eigenvalues.
|
||||||
|
// A=Vectors*Values_Matrix*Vectors'
|
||||||
|
char jobz = 'V';
|
||||||
|
char uplo = 'U';
|
||||||
|
int order_A = N;
|
||||||
|
int lda = N;
|
||||||
|
int i;
|
||||||
|
float* Values = (float*)malloc(sizeof(float)*1*N);
|
||||||
|
|
||||||
|
LAPACKE_cheev(LAPACK_ROW_MAJOR, jobz, uplo, order_A, A, lda, Values);
|
||||||
|
|
||||||
|
memcpy(Vectors, A, N*N*sizeof(float complex));
|
||||||
|
|
||||||
|
for (i=0; i<lda; i+=1)
|
||||||
|
Values_Matrix[i*(lda+1)]=Values[i];
|
||||||
|
|
||||||
|
free(Values);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lin_eq_solver (int N, float complex* A, float complex* B, float complex* Result)
|
||||||
|
{
|
||||||
|
int n = N;
|
||||||
|
int lda = N;
|
||||||
|
int ldb = N;
|
||||||
|
int nrhs = N;
|
||||||
|
|
||||||
|
char transa = 'N';
|
||||||
|
int* IPIV = malloc(N*N*sizeof(int));
|
||||||
|
|
||||||
|
// Compute LU-factorization
|
||||||
|
LAPACKE_cgetrf(LAPACK_ROW_MAJOR, n, nrhs, A, lda, IPIV);
|
||||||
|
|
||||||
|
// Solve AX=B
|
||||||
|
LAPACKE_cgetrs(LAPACK_ROW_MAJOR, transa, n, nrhs, A, lda, IPIV, B, ldb);
|
||||||
|
|
||||||
|
// cgetrs( "N", N, 4, A, lda, IPIV, B, ldb, INFO )
|
||||||
|
|
||||||
|
memcpy(Result, B, N*N*sizeof(float complex));
|
||||||
|
|
||||||
|
free(IPIV);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void mutl_matrix_matrix_row_based(float complex* M0, float complex* M1, int rows_M0, int col_M0, int rows_M1, int col_M1, float complex* Result ){
|
||||||
|
enum CBLAS_TRANSPOSE transa = CblasNoTrans;
|
||||||
|
enum CBLAS_TRANSPOSE transb = CblasNoTrans;
|
||||||
|
int rows_opA = rows_M0; // number of rows in op(A) and in C
|
||||||
|
int col_opB = col_M1; //number of columns of op(B) and in C
|
||||||
|
int col_opA = col_M0; //number of columns in op(A) and rows in op(B)
|
||||||
|
float complex alpha =1.0;
|
||||||
|
int lda = col_M0;
|
||||||
|
float complex beta = 0.0;
|
||||||
|
int ldc = col_M1;
|
||||||
|
int ldb = col_M1;
|
||||||
|
|
||||||
|
#ifdef DEBUG_PREPROC
|
||||||
|
int i=0;
|
||||||
|
printf("rows_M0 %d, col_M0 %d, rows_M1 %d, col_M1 %d\n", rows_M0, col_M0, rows_M1, col_M1);
|
||||||
|
|
||||||
|
for(i=0; i<rows_M0*col_M0; ++i)
|
||||||
|
printf(" rows_opA = %d, col_opB = %d, W_MMSE[%d] = (%f + i%f)\n", rows_opA, col_opB, i , creal(M0[i]), cimag(M0[i]));
|
||||||
|
|
||||||
|
for(i=0; i<rows_M1*col_M1; ++i)
|
||||||
|
printf(" M1[%d] = (%f + i%f)\n", i , creal(M1[i]), cimag(M1[i]));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
cblas_cgemm(CblasRowMajor, transa, transb, rows_opA, col_opB, col_opA, &alpha, M0, lda, M1, ldb, &beta, Result, ldc);
|
||||||
|
|
||||||
|
#ifdef DEBUG_PREPROC
|
||||||
|
for(i=0; i<rows_opA*col_opB; ++i)
|
||||||
|
printf(" result[%d] = (%f + i%f)\n", i , creal(Result[i]), cimag(Result[i]));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
void mutl_matrix_matrix_col_based(float complex* M0, float complex* M1, int rows_M0, int col_M0, int rows_M1, int col_M1, float complex* Result ){
|
||||||
|
enum CBLAS_TRANSPOSE transa = CblasNoTrans;
|
||||||
|
enum CBLAS_TRANSPOSE transb = CblasNoTrans;
|
||||||
|
int rows_opA = rows_M0; // number of rows in op(A) and in C
|
||||||
|
int col_opB = col_M1; //number of columns of op(B) and in C
|
||||||
|
int col_opA = col_M0; //number of columns in op(A) and rows in op(B)
|
||||||
|
float complex alpha =1.0;
|
||||||
|
int lda = col_M0;
|
||||||
|
float complex beta = 0.0;
|
||||||
|
int ldc = rows_M1;
|
||||||
|
int ldb = rows_M1;
|
||||||
|
|
||||||
|
#ifdef DEBUG_PREPROC
|
||||||
|
int i = 0;
|
||||||
|
printf("rows_M0 %d, col_M0 %d, rows_M1 %d, col_M1 %d\n", rows_M0, col_M0, rows_M1, col_M1);
|
||||||
|
|
||||||
|
for(i=0; i<rows_M0*col_M0; ++i)
|
||||||
|
printf(" rows_opA = %d, col_opB = %d, W_MMSE[%d] = (%f + i%f)\n", rows_opA, col_opB, i , creal(M0[i]), cimag(M0[i]));
|
||||||
|
|
||||||
|
|
||||||
|
for(i=0; i<rows_M1*col_M1; ++i)
|
||||||
|
printf(" M1[%d] = (%f + i%f)\n", i , creal(M1[i]), cimag(M1[i]));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
cblas_cgemm(CblasColMajor, transa, transb, rows_opA, col_opB, col_opA, &alpha, M0, lda, M1, ldb, &beta, Result, ldc);
|
||||||
|
|
||||||
|
#ifdef DEBUG_PREPROC
|
||||||
|
for(i=0; i<rows_opA*col_opB; ++i)
|
||||||
|
printf(" result[%d] = (%f + i%f)\n", i , creal(Result[i]), cimag(Result[i]));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*FILTERS */
|
||||||
|
void compute_MMSE(float complex* H, int order_H, float sigma2, float complex* W_MMSE)
|
||||||
|
{
|
||||||
|
int N = order_H;
|
||||||
|
float complex* H_hermH_sigmaI = malloc(N*N*sizeof(float complex));
|
||||||
|
float complex* H_herm = malloc(N*N*sizeof(float complex));
|
||||||
|
|
||||||
|
H_hermH_plus_sigma2I(N, N, H, sigma2, H_hermH_sigmaI);
|
||||||
|
|
||||||
|
#ifdef DEBUG_PREPROC
|
||||||
|
int i =0;
|
||||||
|
for(i=0;i<N*N;i++)
|
||||||
|
printf(" H_hermH_sigmaI[%d] = (%f + i%f)\n", i , creal(H_hermH_sigmaI[i]), cimag(H_hermH_sigmaI[i]));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
conjugate_transpose (N, H, H_herm); //equals H_herm
|
||||||
|
|
||||||
|
#ifdef DEBUG_PREPROC
|
||||||
|
for(i=0;i<N*N;i++)
|
||||||
|
printf(" H_herm[%d] = (%f + i%f)\n", i , creal(H_herm[i]), cimag(H_herm[i]));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
lin_eq_solver(N, H_hermH_sigmaI, H_herm, W_MMSE);
|
||||||
|
|
||||||
|
#ifdef DEBUG_PREPROC
|
||||||
|
for(i=0;i<N*N;i++)
|
||||||
|
printf(" W_MMSE[%d] = (%f + i%f)\n", i , creal(W_MMSE[i]), cimag(W_MMSE[i]));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
free(H_hermH_sigmaI);
|
||||||
|
free(H_herm);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
void compute_white_filter(float complex* H_re,
|
||||||
|
int order_H,
|
||||||
|
float sigma2,
|
||||||
|
float complex* W_Wh_0_re,
|
||||||
|
float complex* W_Wh_1_re){
|
||||||
|
|
||||||
|
int aatx, aarx, re;
|
||||||
|
int i,j;
|
||||||
|
int M =n_rx;
|
||||||
|
int N = n_tx;
|
||||||
|
int sigma2=noise_power;
|
||||||
|
|
||||||
|
float complex *H0_re = malloc(n_rx*(n_tx>>2)*sizeof(float complex));
|
||||||
|
float complex *H1_re = malloc(n_rx*(n_tx>>2)*sizeof(float complex));
|
||||||
|
float complex *R_corr_col_n_0_re = malloc(n_rx*n_tx*sizeof(float complex));
|
||||||
|
float complex *R_corr_col_n_1_re = malloc(n_rx*n_tx*sizeof(float complex));
|
||||||
|
float complex *U_0_re = malloc(n_rx*n_tx*sizeof(float complex));
|
||||||
|
float complex *U_1_re = malloc(n_rx*n_tx*sizeof(float complex));
|
||||||
|
float complex *U_0_herm_re = malloc(n_rx*n_tx*sizeof(float complex));
|
||||||
|
float complex *U_1_herm_re = malloc(n_rx*n_tx*sizeof(float complex));
|
||||||
|
float complex *D_0_re = malloc(n_rx*n_tx*sizeof(float complex));
|
||||||
|
float complex *D_1_re = malloc(n_rx*n_tx*sizeof(float complex));
|
||||||
|
float complex *W_Wh_0_re = malloc(n_rx*n_tx*sizeof(float complex));
|
||||||
|
float complex *W_Wh_1_re = malloc(n_rx*n_tx*sizeof(float complex));
|
||||||
|
|
||||||
|
for (aatx=0; aatx<n_tx/2; aatx++){
|
||||||
|
for (aarx=0; aarx<n_rx; aarx++) {
|
||||||
|
H0_re[aatx*n_rx + aarx] = H_re[aatx*n_rx + aarx][re]; // H0 gets [0 1 2 3; 4,5,6,7].' coefficients of H
|
||||||
|
H1_re[aatx*n_rx + aarx] = H_re[aatx*n_rx + aarx + 8][re]; // H1 gets [8 9 10 11; 12, 13, 14, 15].' coefficients of H
|
||||||
|
if (re == 0)
|
||||||
|
printf("ant %d, H_re = (%f + i%f) \n", aatx*n_rx + aarx, creal(H[aatx*n_rx + aarx][re]), cimag(H[aatx*n_rx + aarx][re]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//HH_herm_plus_sigma2I(n_rx, (n_tx>>2), H1_re, sigma2, R_corr_col_n_0_re);
|
||||||
|
HH_herm_plus_sigma2I(n_rx, (n_tx>>2), H0_re, sigma2, R_corr_col_n_1_re);
|
||||||
|
|
||||||
|
eigen_vectors_values(n_rx, R_corr_col_n_0_re, U_0_re, D_0_re);
|
||||||
|
eigen_vectors_values(n_rx, R_corr_col_n_1_re, U_1_re, D_1_re);
|
||||||
|
|
||||||
|
transpose (n_rx, U_0_re, U_0_herm_re);
|
||||||
|
transpose (n_rx, U_1_re, U_1_herm_re);
|
||||||
|
|
||||||
|
sigma = (float)(sqrt((double)(sigma2)));
|
||||||
|
|
||||||
|
/*The inverse of a diagonal matrix is obtained by replacing each element in the diagonal with its reciprocal.
|
||||||
|
A square root of a diagonal matrix is given by the diagonal matrix, whose diagonal entries are just the square
|
||||||
|
roots of the original matrix.*/
|
||||||
|
|
||||||
|
|
||||||
|
D_0_re_inv_sqrt[0] = sqrt_float(1/D_0_re_inv[0]);
|
||||||
|
D_0_re_inv_sqrt[5] = sqrt_float(1/D_0_re_inv[5]);
|
||||||
|
D_0_re_inv_sqrt[10] = sqrt_float(1/D_0_re_inv[10]);
|
||||||
|
D_0_re_inv_sqrt[15] = sqrt_float(1/D_0_re_inv[15]);
|
||||||
|
|
||||||
|
D_1_re_inv[0] = sqrt_float(1/D_1_re_inv[0]);
|
||||||
|
D_1_re_inv[5] = sqrt_float(1/D_1_re_inv[5]);
|
||||||
|
D_1_re_inv[10] = sqrt_float(1/D_1_re_inv[10]);
|
||||||
|
D_1_re_inv[15] = sqrt_float(1/D_1_re_inv[15]);
|
||||||
|
|
||||||
|
now only to multiply
|
||||||
|
|
||||||
|
free(H0);
|
||||||
|
free(H1);
|
||||||
|
free(R_corr_col_n_0);
|
||||||
|
free(R_corr_col_n_1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
float sqrt_float(float x, float sqrt_x)
|
||||||
|
{
|
||||||
|
sqrt_x = (float)(sqrt((double)(x)));
|
||||||
|
return sqrt_x;
|
||||||
|
}
|
||||||
+121
@@ -0,0 +1,121 @@
|
|||||||
|
|
||||||
|
#include<stdio.h>
|
||||||
|
#include<math.h>
|
||||||
|
#include<complex.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "PHY/defs_UE.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* FUNCTIONS FOR LINEAR PREPROCESSING: MMSE, WHITENNING, etc*/
|
||||||
|
void transpose(int N, float complex *A, float complex *Result);
|
||||||
|
|
||||||
|
void conjugate_transpose(int N, float complex *A, float complex *Result);
|
||||||
|
|
||||||
|
void H_hermH_plus_sigma2I(int N, int M, float complex *A, float sigma2, float complex *Result);
|
||||||
|
|
||||||
|
void HH_herm_plus_sigma2I(int M, int N, float complex *A, float sigma2, float complex *Result);
|
||||||
|
|
||||||
|
void eigen_vectors_values(int N, float complex *A, float complex *Vectors, float *Values_Matrix);
|
||||||
|
|
||||||
|
void lin_eq_solver(int N, float complex *A, float complex* B);
|
||||||
|
//float complex* lin_eq_solver (int N, float complex* A, float complex* B);
|
||||||
|
|
||||||
|
/* mutl_matrix_matrix_row_based performs multiplications when matrix is row-oriented H[0], H[1]; H[2], H[3]*/
|
||||||
|
void mutl_matrix_matrix_row_based(float complex* M0, float complex* M1, int rows_M0, int col_M0, int rows_M1, int col_M1, float complex* Result );
|
||||||
|
|
||||||
|
/* mutl_matrix_matrix_col_based performs multiplications matrix is column-oriented H[0], H[2]; H[1], H[3]*/
|
||||||
|
void mutl_matrix_matrix_col_based(float complex* M0, float complex* M1, int rows_M0, int col_M0, int rows_M1, int col_M1, float complex* Result );
|
||||||
|
|
||||||
|
void compute_MMSE(float complex* H, int order_H, float sigma2, float complex* W_MMSE);
|
||||||
|
|
||||||
|
void compute_white_filter(float complex* H, int order_H, float sigma2, float complex* U_1, float complex* D_1);
|
||||||
|
|
||||||
|
void mmse_processing_oai(LTE_UE_PDSCH *pdsch_vars,
|
||||||
|
LTE_DL_FRAME_PARMS *frame_parms,
|
||||||
|
PHY_MEASUREMENTS *measurements,
|
||||||
|
unsigned char first_symbol_flag,
|
||||||
|
MIMO_mode_t mimo_mode,
|
||||||
|
unsigned short mmse_flag,
|
||||||
|
int noise_power,
|
||||||
|
unsigned char symbol,
|
||||||
|
unsigned short nb_rb);
|
||||||
|
|
||||||
|
|
||||||
|
void precode_channel_est(int32_t **dl_ch_estimates_ext,
|
||||||
|
LTE_DL_FRAME_PARMS *frame_parms,
|
||||||
|
LTE_UE_PDSCH *pdsch_vars,
|
||||||
|
unsigned char symbol,
|
||||||
|
unsigned short nb_rb,
|
||||||
|
MIMO_mode_t mimo_mode);
|
||||||
|
|
||||||
|
|
||||||
|
void rxdataF_to_float(int32_t **rxdataF_ext,
|
||||||
|
float complex **rxdataF_f,
|
||||||
|
int n_rx,
|
||||||
|
int length,
|
||||||
|
int start_point);
|
||||||
|
|
||||||
|
void chan_est_to_float(int32_t **dl_ch_estimates_ext,
|
||||||
|
float complex **dl_ch_estimates_ext_f,
|
||||||
|
int n_tx,
|
||||||
|
int n_rx,
|
||||||
|
int length,
|
||||||
|
int start_point);
|
||||||
|
|
||||||
|
void float_to_chan_est(int32_t **dl_ch_estimates_ext,
|
||||||
|
float complex **dl_ch_estimates_ext_f,
|
||||||
|
int n_tx,
|
||||||
|
int n_rx,
|
||||||
|
int length,
|
||||||
|
int start_point);
|
||||||
|
|
||||||
|
void float_to_rxdataF(int32_t **rxdataF_ext,
|
||||||
|
float complex **rxdataF_f,
|
||||||
|
int n_tx,
|
||||||
|
int n_rx,
|
||||||
|
int length,
|
||||||
|
int start_point);
|
||||||
|
|
||||||
|
void mult_mmse_rxdataF(float complex** Wmmse,
|
||||||
|
float complex** rxdataF_ext_f,
|
||||||
|
int n_tx,
|
||||||
|
int n_rx,
|
||||||
|
int length,
|
||||||
|
int start_point);
|
||||||
|
|
||||||
|
void mult_mmse_chan_est(float complex** Wmmse,
|
||||||
|
float complex** dl_ch_estimates_ext_f,
|
||||||
|
int n_tx,
|
||||||
|
int n_rx,
|
||||||
|
int length,
|
||||||
|
int start_point);
|
||||||
|
|
||||||
|
void mmse_processing_core(int32_t **rxdataF_ext,
|
||||||
|
int32_t **dl_ch_estimates_ext,
|
||||||
|
int sigma2,
|
||||||
|
int n_tx,
|
||||||
|
int n_rx,
|
||||||
|
int length,
|
||||||
|
int start_point);
|
||||||
|
|
||||||
|
void mmse_processing_core_flp(float complex** rxdataF_ext_flcpx,
|
||||||
|
float complex **H,
|
||||||
|
int32_t **rxdataF_ext,
|
||||||
|
int32_t **dl_ch_estimates_ext,
|
||||||
|
float sigma2,
|
||||||
|
int n_tx,
|
||||||
|
int n_rx,
|
||||||
|
int length,
|
||||||
|
int start_point);
|
||||||
|
|
||||||
|
void whitening_processing_core_flp(float complex** rxdataF_ext_flcpx,
|
||||||
|
float complex **H,
|
||||||
|
int32_t **rxdataF_ext,
|
||||||
|
int32_t **dl_ch_estimates_ext,
|
||||||
|
float sigma2,
|
||||||
|
int n_tx,
|
||||||
|
int n_rx,
|
||||||
|
int length,
|
||||||
|
int start_point);
|
||||||
|
|
||||||
|
float sqrt_float(float x, float sqrt_x);
|
||||||
@@ -0,0 +1,487 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "SIMULATION/TOOLS/sim.h"
|
||||||
|
#include "SIMULATION/RF/rf.h"
|
||||||
|
#include "PHY/types.h"
|
||||||
|
#include "PHY/defs_eNB.h"
|
||||||
|
#include "PHY/phy_extern.h"
|
||||||
|
#include "PHY/phy_extern_ue.h"
|
||||||
|
|
||||||
|
#include "LAYER2/MAC/mac.h"
|
||||||
|
#include "LAYER2/MAC/mac_extern.h"
|
||||||
|
#include "UTIL/LOG/log_if.h"
|
||||||
|
#include "UTIL/LOG/log_extern.h"
|
||||||
|
#include "RRC/LTE/rrc_extern.h"
|
||||||
|
#include "PHY_INTERFACE/phy_interface_extern.h"
|
||||||
|
#include "UTIL/OCG/OCG.h"
|
||||||
|
#include "UTIL/OPT/opt.h" // to test OPT
|
||||||
|
|
||||||
|
#include "UTIL/FIFO/types.h"
|
||||||
|
|
||||||
|
#define RF
|
||||||
|
//#define DEBUG_SIM
|
||||||
|
|
||||||
|
//#undef LOG_D
|
||||||
|
//#define LOG_D(A,B,C...) printf(B,C)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void do_DL_sig(sim_t *sim,
|
||||||
|
uint16_t subframe,
|
||||||
|
uint32_t offset,
|
||||||
|
uint32_t length,
|
||||||
|
uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *ue_frame_parms,
|
||||||
|
uint8_t UE_id,
|
||||||
|
int CC_id)
|
||||||
|
{
|
||||||
|
|
||||||
|
int32_t **txdata,**rxdata;
|
||||||
|
|
||||||
|
uint32_t ru_id=0;
|
||||||
|
double tx_pwr;
|
||||||
|
double rx_pwr;
|
||||||
|
int32_t rx_pwr2;
|
||||||
|
uint32_t i,aa;
|
||||||
|
uint32_t sf_offset;
|
||||||
|
|
||||||
|
uint8_t hold_channel=0;
|
||||||
|
uint8_t nb_antennas_rx = sim->RU2UE[0][0][CC_id]->nb_rx; // number of rx antennas at UE
|
||||||
|
uint8_t nb_antennas_tx = sim->RU2UE[0][0][CC_id]->nb_tx; // number of tx antennas at eNB
|
||||||
|
|
||||||
|
double s_re0[30720];
|
||||||
|
double s_re1[30720];
|
||||||
|
double *s_re[2];
|
||||||
|
double s_im0[30720];
|
||||||
|
double s_im1[30720];
|
||||||
|
double *s_im[2];
|
||||||
|
double r_re00[30720];
|
||||||
|
double r_re01[30720];
|
||||||
|
double *r_re0[2];
|
||||||
|
double r_im00[30720];
|
||||||
|
double r_im01[30720];
|
||||||
|
double *r_im0[2];
|
||||||
|
LTE_DL_FRAME_PARMS *frame_parms;
|
||||||
|
|
||||||
|
s_re[0] = s_re0;
|
||||||
|
s_im[0] = s_im0;
|
||||||
|
s_re[1] = s_re1;
|
||||||
|
s_im[1] = s_im1;
|
||||||
|
|
||||||
|
r_re0[0] = r_re00;
|
||||||
|
r_im0[0] = r_im00;
|
||||||
|
r_re0[1] = r_re01;
|
||||||
|
r_im0[1] = r_im01;
|
||||||
|
|
||||||
|
if (subframe==0)
|
||||||
|
hold_channel = 0;
|
||||||
|
else
|
||||||
|
hold_channel = 1;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&sim->RU_output_mutex[UE_id]);
|
||||||
|
|
||||||
|
if (sim->RU_output_mask[UE_id] == 0) { // This is the first eNodeB for this UE, clear the buffer
|
||||||
|
for (aa=0; aa<nb_antennas_rx; aa++) {
|
||||||
|
memset((void*)sim->r_re_DL[UE_id][aa],0,(RC.ru[0]->frame_parms.samples_per_tti)*sizeof(double));
|
||||||
|
memset((void*)sim->r_im_DL[UE_id][aa],0,(RC.ru[0]->frame_parms.samples_per_tti)*sizeof(double));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&sim->RU_output_mutex[UE_id]);
|
||||||
|
|
||||||
|
for (ru_id=0; ru_id<RC.nb_RU; ru_id++) {
|
||||||
|
txdata = RC.ru[ru_id]->common.txdata;
|
||||||
|
frame_parms = &RC.ru[ru_id]->frame_parms;
|
||||||
|
|
||||||
|
// sf_offset = (subframe*frame_parms->samples_per_tti) + offset;
|
||||||
|
sf_offset = (subframe*frame_parms->samples_per_tti);
|
||||||
|
LOG_D(OCM,">>>>>>>>>>>>>>>>>TXPATH: RU %d : DL_sig reading TX for subframe %d (sf_offset %d, length %d) from %p\n",ru_id,subframe,sf_offset,length,txdata[0]+sf_offset);
|
||||||
|
int length_meas = frame_parms->ofdm_symbol_size;
|
||||||
|
if (sf_offset+length <= frame_parms->samples_per_tti*10) {
|
||||||
|
|
||||||
|
tx_pwr = dac_fixed_gain(s_re,
|
||||||
|
s_im,
|
||||||
|
txdata,
|
||||||
|
sf_offset+offset,
|
||||||
|
nb_antennas_tx,
|
||||||
|
length,
|
||||||
|
sf_offset,
|
||||||
|
length_meas,
|
||||||
|
14,
|
||||||
|
frame_parms->pdsch_config_common.referenceSignalPower, // dBm/RE
|
||||||
|
0,
|
||||||
|
&sim->ru_amp[ru_id],
|
||||||
|
frame_parms->N_RB_DL*12);
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tx_pwr = dac_fixed_gain(s_re,
|
||||||
|
s_im,
|
||||||
|
txdata,
|
||||||
|
sf_offset,
|
||||||
|
nb_antennas_tx,
|
||||||
|
(frame_parms->samples_per_tti*10)-sf_offset,
|
||||||
|
sf_offset,
|
||||||
|
length_meas,
|
||||||
|
14,
|
||||||
|
frame_parms->pdsch_config_common.referenceSignalPower, // dBm/RE
|
||||||
|
0,
|
||||||
|
&sim->ru_amp[ru_id],
|
||||||
|
frame_parms->N_RB_DL*12);
|
||||||
|
|
||||||
|
tx_pwr = dac_fixed_gain(s_re,
|
||||||
|
s_im,
|
||||||
|
txdata,
|
||||||
|
sf_offset,
|
||||||
|
nb_antennas_tx,
|
||||||
|
length+sf_offset-(frame_parms->samples_per_tti*10),
|
||||||
|
sf_offset,
|
||||||
|
length_meas,
|
||||||
|
14,
|
||||||
|
frame_parms->pdsch_config_common.referenceSignalPower, // dBm/RE
|
||||||
|
0,
|
||||||
|
&sim->ru_amp[ru_id],
|
||||||
|
frame_parms->N_RB_DL*12);
|
||||||
|
}
|
||||||
|
#ifdef DEBUG_SIM
|
||||||
|
LOG_D(OCM,"[SIM][DL] subframe %d: txp (time) %d dB\n",
|
||||||
|
subframe,dB_fixed(signal_energy(&txdata[0][sf_offset],length_meas)));
|
||||||
|
|
||||||
|
LOG_D(OCM,"[SIM][DL] RU %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for subframe %d\n",
|
||||||
|
ru_id,CC_id,
|
||||||
|
10*log10(tx_pwr),
|
||||||
|
frame_parms->pdsch_config_common.referenceSignalPower,
|
||||||
|
subframe);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
tx_pwr = signal_energy_fp(s_re,s_im,nb_antennas_tx,
|
||||||
|
length<length_meas?length:length_meas,
|
||||||
|
0)/(12.0*frame_parms->N_RB_DL);
|
||||||
|
|
||||||
|
//RU2UE[eNB_id][UE_id]->path_loss_dB = 0;
|
||||||
|
multipath_channel(sim->RU2UE[ru_id][UE_id][CC_id],s_re,s_im,r_re0,r_im0,
|
||||||
|
length,hold_channel);
|
||||||
|
#ifdef DEBUG_SIM
|
||||||
|
rx_pwr = signal_energy_fp2(sim->RU2UE[ru_id][UE_id][CC_id]->ch[0],
|
||||||
|
sim->RU2UE[ru_id][UE_id][CC_id]->channel_length)*sim->RU2UE[ru_id][UE_id][CC_id]->channel_length;
|
||||||
|
LOG_D(OCM,"[SIM][DL] Channel RU %d => UE %d (CCid %d): Channel gain %f dB (%f)\n",ru_id,UE_id,CC_id,10*log10(rx_pwr),rx_pwr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG_SIM
|
||||||
|
|
||||||
|
for (i=0; i<sim->RU2UE[ru_id][UE_id][CC_id]->channel_length; i++)
|
||||||
|
LOG_D(OCM,"channel(%d,%d)[%d] : (%f,%f)\n",ru_id,UE_id,i,sim->RU2UE[ru_id][UE_id][CC_id]->ch[0][i].x,sim->RU2UE[ru_id][UE_id][CC_id]->ch[0][i].y);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LOG_D(OCM,"[SIM][DL] Channel RU %d => UE %d (CCid %d): tx_power %.1f dBm/RE, path_loss %1.f dB\n",
|
||||||
|
ru_id,UE_id,CC_id,
|
||||||
|
(double)frame_parms->pdsch_config_common.referenceSignalPower,
|
||||||
|
sim->RU2UE[ru_id][UE_id][CC_id]->path_loss_dB);
|
||||||
|
|
||||||
|
#ifdef DEBUG_SIM
|
||||||
|
rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,
|
||||||
|
length<length_meas?length:length_meas,
|
||||||
|
0)/(12.0*frame_parms->N_RB_DL);
|
||||||
|
LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI,tx %f dB)for subframe %d (length %d)\n",UE_id,
|
||||||
|
10*log10(rx_pwr),
|
||||||
|
10*log10(rx_pwr*(double)frame_parms->N_RB_DL*12),
|
||||||
|
10*log10(tx_pwr),subframe,
|
||||||
|
length<length_meas?length:length_meas);
|
||||||
|
|
||||||
|
|
||||||
|
LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (noise) -132 dBm/RE (N0fs = %.1f dBm, N0B = %.1f dBm) for subframe %d\n",
|
||||||
|
UE_id,
|
||||||
|
10*log10(sim->RU2UE[ru_id][UE_id][CC_id]->sampling_rate*1e6)-174,
|
||||||
|
10*log10(sim->RU2UE[ru_id][UE_id][CC_id]->sampling_rate*1e6*12*frame_parms->N_RB_DL/(double)frame_parms->ofdm_symbol_size)-174,
|
||||||
|
subframe);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (sim->RU2UE[ru_id][UE_id][CC_id]->first_run == 1)
|
||||||
|
sim->RU2UE[ru_id][UE_id][CC_id]->first_run = 0;
|
||||||
|
|
||||||
|
|
||||||
|
// RF model
|
||||||
|
#ifdef DEBUG_SIM
|
||||||
|
LOG_D(OCM,"[SIM][DL] UE %d (CCid %d): rx_gain %d dB (-ADC %f) for subframe %d\n",UE_id,CC_id,PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB,
|
||||||
|
PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB-66.227,subframe);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rf_rx_simple(r_re0,
|
||||||
|
r_im0,
|
||||||
|
nb_antennas_rx,
|
||||||
|
length,
|
||||||
|
1e3/sim->RU2UE[ru_id][UE_id][CC_id]->sampling_rate, // sampling time (ns)
|
||||||
|
(double)PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
|
||||||
|
|
||||||
|
#ifdef DEBUG_SIM
|
||||||
|
rx_pwr = signal_energy_fp(r_re0,r_im0,
|
||||||
|
nb_antennas_rx,
|
||||||
|
length<length_meas?length:length_meas,
|
||||||
|
0)/(12.0*frame_parms->N_RB_DL);
|
||||||
|
LOG_D(OCM,"[SIM][DL] UE %d : ADC in (RU %d) %f dBm/RE for subframe %d\n",
|
||||||
|
UE_id,ru_id,
|
||||||
|
10*log10(rx_pwr),subframe);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
pthread_mutex_lock(&sim->RU_output_mutex[UE_id]);
|
||||||
|
for (i=0; i<frame_parms->samples_per_tti; i++) {
|
||||||
|
for (aa=0; aa<nb_antennas_rx; aa++) {
|
||||||
|
sim->r_re_DL[UE_id][aa][i]+=r_re0[aa][i];
|
||||||
|
sim->r_im_DL[UE_id][aa][i]+=r_im0[aa][i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sim->RU_output_mask[UE_id] |= (1<<ru_id);
|
||||||
|
if (sim->RU_output_mask[UE_id] == (1<<RC.nb_RU)-1) {
|
||||||
|
sim->RU_output_mask[UE_id]=0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
double *r_re_p[2] = {sim->r_re_DL[UE_id][0],sim->r_re_DL[UE_id][1]};
|
||||||
|
double *r_im_p[2] = {sim->r_im_DL[UE_id][0],sim->r_im_DL[UE_id][1]};
|
||||||
|
|
||||||
|
#ifdef DEBUG_SIM
|
||||||
|
rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,length<length_meas?length:length_meas,0)/(12.0*frame_parms->N_RB_DL);
|
||||||
|
LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm/RE for subframe %d\n",UE_id,10*log10(rx_pwr),subframe);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rxdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.rxdata;
|
||||||
|
sf_offset = (subframe*frame_parms->samples_per_tti)+offset;
|
||||||
|
|
||||||
|
|
||||||
|
adc(r_re_p,
|
||||||
|
r_im_p,
|
||||||
|
0,
|
||||||
|
sf_offset,
|
||||||
|
rxdata,
|
||||||
|
nb_antennas_rx,
|
||||||
|
length,
|
||||||
|
12);
|
||||||
|
|
||||||
|
#ifdef DEBUG_SIM
|
||||||
|
rx_pwr2 = signal_energy(rxdata[0]+sf_offset,length<length_meas?length:length_meas)/(12.0*frame_parms->N_RB_DL);
|
||||||
|
LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB/RE (%d) for subframe %d, writing to %p, length %d\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,subframe,rxdata,length<length_meas?length:length_meas);
|
||||||
|
LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB for subframe %d\n",UE_id,10*log10((double)rx_pwr2*12*frame_parms->N_RB_DL) ,subframe);
|
||||||
|
#else
|
||||||
|
UNUSED_VARIABLE(rx_pwr2);
|
||||||
|
UNUSED_VARIABLE(tx_pwr);
|
||||||
|
UNUSED_VARIABLE(rx_pwr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // RU_output_mask
|
||||||
|
pthread_mutex_unlock(&sim->RU_output_mutex[UE_id]);
|
||||||
|
} // ru_id
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void do_UL_sig(sim_t *sim,
|
||||||
|
uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,
|
||||||
|
uint32_t frame,int ru_id,uint8_t CC_id)
|
||||||
|
{
|
||||||
|
|
||||||
|
int32_t **txdata,**rxdata;
|
||||||
|
uint8_t UE_id=0;
|
||||||
|
|
||||||
|
uint8_t nb_antennas_rx = sim->UE2RU[0][0][CC_id]->nb_rx; // number of rx antennas at eNB
|
||||||
|
uint8_t nb_antennas_tx = sim->UE2RU[0][0][CC_id]->nb_tx; // number of tx antennas at UE
|
||||||
|
|
||||||
|
double tx_pwr, rx_pwr;
|
||||||
|
int32_t rx_pwr2;
|
||||||
|
uint32_t i,aa;
|
||||||
|
uint32_t sf_offset,sf_offset_tdd;
|
||||||
|
|
||||||
|
uint8_t hold_channel=0;
|
||||||
|
|
||||||
|
double s_re0[30720];
|
||||||
|
double s_re1[30720];
|
||||||
|
double *s_re[2];
|
||||||
|
double s_im0[30720];
|
||||||
|
double s_im1[30720];
|
||||||
|
double *s_im[2];
|
||||||
|
double r_re00[30720];
|
||||||
|
double r_re01[30720];
|
||||||
|
double *r_re0[2];
|
||||||
|
double r_im00[30720];
|
||||||
|
double r_im01[30720];
|
||||||
|
double *r_im0[2];
|
||||||
|
|
||||||
|
s_re[0] = s_re0;
|
||||||
|
s_im[0] = s_im0;
|
||||||
|
s_re[1] = s_re1;
|
||||||
|
s_im[1] = s_im1;
|
||||||
|
|
||||||
|
r_re0[0] = r_re00;
|
||||||
|
r_im0[0] = r_im00;
|
||||||
|
r_re0[1] = r_re01;
|
||||||
|
r_im0[1] = r_im01;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&sim->UE_output_mutex[ru_id]);
|
||||||
|
// Clear RX signal for eNB = eNB_id
|
||||||
|
for (i=0; i<frame_parms->samples_per_tti; i++) {
|
||||||
|
for (aa=0; aa<nb_antennas_rx; aa++) {
|
||||||
|
sim->r_re_UL[ru_id][aa][i]=0.0;
|
||||||
|
sim->r_im_UL[ru_id][aa][i]=0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&sim->UE_output_mutex[ru_id]);
|
||||||
|
|
||||||
|
// Compute RX signal for eNB = eNB_id
|
||||||
|
for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
|
||||||
|
|
||||||
|
txdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.txdata;
|
||||||
|
AssertFatal(txdata != NULL,"txdata is null\n");
|
||||||
|
|
||||||
|
sf_offset = subframe*frame_parms->samples_per_tti;
|
||||||
|
if (subframe>0) sf_offset_tdd = sf_offset - PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset;
|
||||||
|
else sf_offset_tdd = sf_offset;
|
||||||
|
|
||||||
|
LOG_D(OCM,"txdata for subframe %d (%d), power %d\n",subframe,sf_offset_tdd,dB_fixed(signal_energy(&txdata[0][sf_offset_tdd],frame_parms->samples_per_tti)));
|
||||||
|
|
||||||
|
if (((double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe] +
|
||||||
|
sim->UE2RU[UE_id][ru_id][CC_id]->path_loss_dB) <= -125.0) {
|
||||||
|
// don't simulate a UE that is too weak
|
||||||
|
LOG_D(OCM,"[SIM][UL] ULPOWERS UE %d tx_pwr %d dBm (num_RE %d) for subframe %d (sf_offset %d,sf_offset_tdd %d)\n",
|
||||||
|
UE_id,
|
||||||
|
PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe],
|
||||||
|
PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe],
|
||||||
|
subframe,sf_offset,sf_offset_tdd);
|
||||||
|
} else {
|
||||||
|
tx_pwr = dac_fixed_gain((double**)s_re,
|
||||||
|
(double**)s_im,
|
||||||
|
txdata,
|
||||||
|
sf_offset_tdd,
|
||||||
|
nb_antennas_tx,
|
||||||
|
frame_parms->samples_per_tti,
|
||||||
|
sf_offset_tdd,
|
||||||
|
frame_parms->ofdm_symbol_size,
|
||||||
|
14,
|
||||||
|
(double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe]-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]),
|
||||||
|
1,
|
||||||
|
NULL,
|
||||||
|
PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]); // This make the previous argument the total power
|
||||||
|
LOG_D(OCM,"[SIM][UL] ULPOWERS UE %d tx_pwr %f dBm (target %d dBm, num_RE %d) for subframe %d (sf_offset %d,sf_offset_tdd %d)\n",
|
||||||
|
UE_id,
|
||||||
|
10*log10(tx_pwr*PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]),
|
||||||
|
PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe],
|
||||||
|
PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe],
|
||||||
|
subframe,sf_offset,sf_offset_tdd);
|
||||||
|
|
||||||
|
|
||||||
|
multipath_channel(sim->UE2RU[UE_id][ru_id][CC_id],s_re,s_im,r_re0,r_im0,
|
||||||
|
frame_parms->samples_per_tti,hold_channel);
|
||||||
|
|
||||||
|
|
||||||
|
rx_pwr = signal_energy_fp2(sim->UE2RU[UE_id][ru_id][CC_id]->ch[0],
|
||||||
|
sim->UE2RU[UE_id][ru_id][CC_id]->channel_length)*sim->UE2RU[UE_id][ru_id][CC_id]->channel_length;
|
||||||
|
|
||||||
|
LOG_D(OCM,"[SIM][UL] subframe %d Channel UE %d => RU %d : %f dB (hold %d,length %d, PL %f)\n",subframe,UE_id,ru_id,10*log10(rx_pwr),
|
||||||
|
hold_channel,sim->UE2RU[UE_id][ru_id][CC_id]->channel_length,
|
||||||
|
sim->UE2RU[UE_id][ru_id][CC_id]->path_loss_dB);
|
||||||
|
|
||||||
|
rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->samples_per_tti,0);
|
||||||
|
LOG_D(OCM,"[SIM][UL] RU %d (%d/%d rx antennas) : rx_pwr %f dBm (tx_pwr - PL %f) for subframe %d, sptti %d\n",
|
||||||
|
ru_id,nb_antennas_rx,sim->UE2RU[UE_id][ru_id][CC_id]->nb_rx,10*log10(rx_pwr),10*log10(tx_pwr*PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe])+sim->UE2RU[UE_id][ru_id][CC_id]->path_loss_dB,subframe,frame_parms->samples_per_tti);
|
||||||
|
/*
|
||||||
|
if (abs(10*log10(rx_pwr)-10*log10(tx_pwr*PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe])-UE2RU[UE_id][ru_id][CC_id]->path_loss_dB)>3) {
|
||||||
|
write_output("txsig_re.m","s_re",s_re[0],frame_parms->samples_per_tti,1,7);
|
||||||
|
write_output("txsig_im.m","s_im",s_im[0],frame_parms->samples_per_tti,1,7);
|
||||||
|
write_output("rxsig_re.m","r_re",r_re0[0],frame_parms->samples_per_tti,1,7);
|
||||||
|
write_output("rxsig_im.m","r_im",r_im0[0],frame_parms->samples_per_tti,1,7);
|
||||||
|
exit(-1);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
if (sim->UE2RU[UE_id][ru_id][CC_id]->first_run == 1)
|
||||||
|
sim->UE2RU[UE_id][ru_id][CC_id]->first_run = 0;
|
||||||
|
|
||||||
|
|
||||||
|
pthread_mutex_lock(&sim->UE_output_mutex[ru_id]);
|
||||||
|
for (aa=0; aa<nb_antennas_rx; aa++) {
|
||||||
|
for (i=0; i<frame_parms->samples_per_tti; i++) {
|
||||||
|
sim->r_re_UL[ru_id][aa][i]+=r_re0[aa][i];
|
||||||
|
sim->r_im_UL[ru_id][aa][i]+=r_im0[aa][i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&sim->UE_output_mutex[ru_id]);
|
||||||
|
}
|
||||||
|
} //UE_id
|
||||||
|
|
||||||
|
double *r_re_p[2] = {sim->r_re_UL[ru_id][0],sim->r_re_UL[ru_id][1]};
|
||||||
|
double *r_im_p[2] = {sim->r_im_UL[ru_id][0],sim->r_im_UL[ru_id][1]};
|
||||||
|
|
||||||
|
rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->samples_per_tti,0);
|
||||||
|
LOG_D(OCM,"[SIM][UL] RU %d (%d/%d rx antennas) : rx_pwr %f dBm (before RF) for subframe %d, gain %f\n",
|
||||||
|
ru_id,nb_antennas_rx,nb_antennas_rx,10*log10(rx_pwr),subframe,
|
||||||
|
(double)RC.ru[ru_id]->max_rxgain-(double)RC.ru[ru_id]->att_rx - 66.227);
|
||||||
|
rf_rx_simple(r_re_p,
|
||||||
|
r_im_p,
|
||||||
|
nb_antennas_rx,
|
||||||
|
frame_parms->samples_per_tti,
|
||||||
|
1e3/sim->UE2RU[0][ru_id][CC_id]->sampling_rate, // sampling time (ns)
|
||||||
|
(double)RC.ru[ru_id]->max_rxgain-(double)RC.ru[ru_id]->att_rx - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
|
||||||
|
|
||||||
|
#ifdef DEBUG_SIM
|
||||||
|
rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->samples_per_tti,0);//*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL;
|
||||||
|
LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for subframe %d (rx_gain %f)\n",10*log10(rx_pwr),subframe,
|
||||||
|
(double)RC.ru[ru_id]->max_rxgain-(double)RC.ru[ru_id]->att_rx);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rxdata = RC.ru[ru_id]->common.rxdata;
|
||||||
|
sf_offset = subframe*frame_parms->samples_per_tti;
|
||||||
|
if (subframe>0) sf_offset_tdd = sf_offset - RC.ru[ru_id]->N_TA_offset;
|
||||||
|
else sf_offset_tdd = sf_offset;
|
||||||
|
|
||||||
|
|
||||||
|
adc(r_re_p,
|
||||||
|
r_im_p,
|
||||||
|
0,
|
||||||
|
sf_offset_tdd,
|
||||||
|
rxdata,
|
||||||
|
nb_antennas_rx,
|
||||||
|
frame_parms->samples_per_tti,
|
||||||
|
12);
|
||||||
|
|
||||||
|
#ifdef DEBUG_SIM
|
||||||
|
rx_pwr2 = signal_energy(rxdata[0]+sf_offset_tdd,frame_parms->samples_per_tti)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL);
|
||||||
|
LOG_D(OCM,"[SIM][UL] RU %d rx_pwr (ADC out) %f dB (%d) for subframe %d (offset %d) = %p\n",ru_id,10*log10((double)rx_pwr2),rx_pwr2,subframe,sf_offset,rxdata[0]+sf_offset_tdd);
|
||||||
|
#else
|
||||||
|
UNUSED_VARIABLE(tx_pwr);
|
||||||
|
UNUSED_VARIABLE(rx_pwr);
|
||||||
|
UNUSED_VARIABLE(rx_pwr2);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! \file eNB_scheduler_fairRR.h
|
||||||
|
* \brief eNB scheduler fair round robin header
|
||||||
|
* \author Masayuki Harada
|
||||||
|
* \date 2018
|
||||||
|
* \email masayuki.harada@jp.fujitsu.com
|
||||||
|
* \version 1.0
|
||||||
|
* @ingroup _mac
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __LAYER2_MAC_ENB_SCHEDULER_FAIRRR_H__
|
||||||
|
#define __LAYER2_MAC_ENB_SCHEDULER_FAIRRR_H__
|
||||||
|
|
||||||
|
/* define */
|
||||||
|
enum SCH_UE_PRIORITY {
|
||||||
|
SCH_PRIORITY_NONE,
|
||||||
|
SCH_DL_SI,
|
||||||
|
SCH_DL_PAGING,
|
||||||
|
SCH_DL_MSG2,
|
||||||
|
SCH_DL_MSG4,
|
||||||
|
SCH_UL_PRACH,
|
||||||
|
SCH_UL_MSG3,
|
||||||
|
SCH_DL_RETRANS,
|
||||||
|
SCH_UL_RETRANS,
|
||||||
|
SCH_DL_FIRST,
|
||||||
|
SCH_UL_FIRST,
|
||||||
|
SCH_UL_INACTIVE
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int UE_id;
|
||||||
|
enum SCH_UE_PRIORITY ue_priority;
|
||||||
|
rnti_t rnti;
|
||||||
|
uint16_t nb_rb;
|
||||||
|
} DLSCH_UE_INFO;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t ue_num;
|
||||||
|
DLSCH_UE_INFO list[20];
|
||||||
|
} DLSCH_UE_SELECT;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int UE_id;
|
||||||
|
enum SCH_UE_PRIORITY ue_priority;
|
||||||
|
uint8_t start_rb;
|
||||||
|
uint8_t nb_rb;
|
||||||
|
uint16_t ul_total_buffer;
|
||||||
|
} ULSCH_UE_INFO;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t ue_num;
|
||||||
|
ULSCH_UE_INFO list[20];
|
||||||
|
} ULSCH_UE_SELECT;
|
||||||
|
|
||||||
|
/* proto */
|
||||||
|
void set_dl_ue_select_msg2(int CC_idP, uint16_t nb_rb, int UE_id, rnti_t rnti);
|
||||||
|
void set_dl_ue_select_msg4(int CC_idP, uint16_t nb_rb, int UE_id, rnti_t rnti);
|
||||||
|
|
||||||
|
void dlsch_scheduler_pre_ue_select_fairRR(
|
||||||
|
module_id_t module_idP,
|
||||||
|
frame_t frameP,
|
||||||
|
sub_frame_t subframeP,
|
||||||
|
int* mbsfn_flag,
|
||||||
|
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||||
|
DLSCH_UE_SELECT dlsch_ue_select[MAX_NUM_CCs]);
|
||||||
|
|
||||||
|
void dlsch_scheduler_pre_processor_fairRR (module_id_t Mod_id,
|
||||||
|
frame_t frameP,
|
||||||
|
sub_frame_t subframeP,
|
||||||
|
int N_RBG[MAX_NUM_CCs],
|
||||||
|
int *mbsfn_flag);
|
||||||
|
|
||||||
|
void fill_DLSCH_dci_fairRR(
|
||||||
|
module_id_t module_idP,
|
||||||
|
frame_t frameP,
|
||||||
|
sub_frame_t subframeP,
|
||||||
|
int* mbsfn_flagP);
|
||||||
|
|
||||||
|
void schedule_ue_spec_fairRR(module_id_t module_idP,
|
||||||
|
frame_t frameP, sub_frame_t subframeP, int *mbsfn_flag);
|
||||||
|
|
||||||
|
void ulsch_scheduler_pre_ue_select_fairRR(
|
||||||
|
module_id_t module_idP,
|
||||||
|
frame_t frameP,
|
||||||
|
sub_frame_t subframeP,
|
||||||
|
sub_frame_t sched_subframeP,
|
||||||
|
ULSCH_UE_SELECT ulsch_ue_select[MAX_NUM_CCs]);
|
||||||
|
|
||||||
|
void ulsch_scheduler_pre_processor_fairRR(module_id_t module_idP,
|
||||||
|
frame_t frameP,
|
||||||
|
sub_frame_t subframeP,
|
||||||
|
sub_frame_t sched_subframeP,
|
||||||
|
ULSCH_UE_SELECT ulsch_ue_select[MAX_NUM_CCs]);
|
||||||
|
|
||||||
|
void schedule_ulsch_fairRR(module_id_t module_idP, frame_t frameP,
|
||||||
|
sub_frame_t subframeP);
|
||||||
|
|
||||||
|
void schedule_ulsch_rnti_fairRR(module_id_t module_idP,
|
||||||
|
frame_t frameP,
|
||||||
|
sub_frame_t subframeP,
|
||||||
|
unsigned char sched_subframeP,
|
||||||
|
ULSCH_UE_SELECT ulsch_ue_select[MAX_NUM_CCs]);
|
||||||
|
|
||||||
|
|
||||||
|
/* extern */
|
||||||
|
extern DLSCH_UE_SELECT dlsch_ue_select[MAX_NUM_CCs];
|
||||||
|
extern int last_dlsch_ue_id[MAX_NUM_CCs];
|
||||||
|
extern int last_ulsch_ue_id[MAX_NUM_CCs];
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -223,7 +223,7 @@ void schedule_ulsch_phy_test(module_id_t module_idP,frame_t frameP,sub_frame_t s
|
|||||||
nfapi_ul_config_request_body_t *ul_req = &mac->UL_req[CC_id].ul_config_request_body;
|
nfapi_ul_config_request_body_t *ul_req = &mac->UL_req[CC_id].ul_config_request_body;
|
||||||
|
|
||||||
|
|
||||||
//mac->UL_req[CC_id].sfn_sf = (sched_frame<<4) + sched_subframe;
|
mac->UL_req[CC_id].sfn_sf = (sched_frame<<4) + sched_subframe;
|
||||||
hi_dci0_req->sfn_sf = (frameP << 4) + subframeP;
|
hi_dci0_req->sfn_sf = (frameP << 4) + subframeP;
|
||||||
|
|
||||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
|
|||||||
+4978
File diff suppressed because it is too large
Load Diff
+5979
File diff suppressed because it is too large
Load Diff
+7775
File diff suppressed because it is too large
Load Diff
+11905
File diff suppressed because it is too large
Load Diff
+14042
File diff suppressed because it is too large
Load Diff
+14278
File diff suppressed because it is too large
Load Diff
+14414
File diff suppressed because it is too large
Load Diff
+14695
File diff suppressed because it is too large
Load Diff
+14828
File diff suppressed because it is too large
Load Diff
+14834
File diff suppressed because it is too large
Load Diff
+2905
File diff suppressed because it is too large
Load Diff
+3787
File diff suppressed because it is too large
Load Diff
+2866
File diff suppressed because it is too large
Load Diff
+3096
File diff suppressed because it is too large
Load Diff
+4358
File diff suppressed because it is too large
Load Diff
+4942
File diff suppressed because it is too large
Load Diff
+5064
File diff suppressed because it is too large
Load Diff
+7222
File diff suppressed because it is too large
Load Diff
+7862
File diff suppressed because it is too large
Load Diff
+2201
File diff suppressed because it is too large
Load Diff
+2579
File diff suppressed because it is too large
Load Diff
+5097
File diff suppressed because it is too large
Load Diff
+5422
File diff suppressed because it is too large
Load Diff
+5947
File diff suppressed because it is too large
Load Diff
+6679
File diff suppressed because it is too large
Load Diff
+6986
File diff suppressed because it is too large
Load Diff
+6985
File diff suppressed because it is too large
Load Diff
+7240
File diff suppressed because it is too large
Load Diff
+6883
File diff suppressed because it is too large
Load Diff
+4293
File diff suppressed because it is too large
Load Diff
+4698
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,273 @@
|
|||||||
|
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
eNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
eNB_ID = 0xe00;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_ENB";
|
||||||
|
|
||||||
|
eNB_name = "eNB-Eurecom-LTEBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = "1";
|
||||||
|
|
||||||
|
mobile_country_code = "208";
|
||||||
|
|
||||||
|
mobile_network_code = "92";
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "3GPP_eNODEB";
|
||||||
|
node_timing = "synch_to_ext_device";
|
||||||
|
node_synch_ref = 0;
|
||||||
|
frame_type = "FDD";
|
||||||
|
tdd_config = 3;
|
||||||
|
tdd_config_s = 0;
|
||||||
|
prefix_type = "NORMAL";
|
||||||
|
eutra_band = 7;
|
||||||
|
downlink_frequency = 2685000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 25;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antenna_ports = 1;
|
||||||
|
nb_antennas_tx = 1;
|
||||||
|
nb_antennas_rx = 1;
|
||||||
|
tx_gain = 90;
|
||||||
|
rx_gain = 115;
|
||||||
|
pbch_repetition = "FALSE";
|
||||||
|
prach_root = 0;
|
||||||
|
prach_config_index = 0;
|
||||||
|
prach_high_speed = "DISABLE";
|
||||||
|
prach_zero_correlation = 1;
|
||||||
|
prach_freq_offset = 2;
|
||||||
|
pucch_delta_shift = 1;
|
||||||
|
pucch_nRB_CQI = 0;
|
||||||
|
pucch_nCS_AN = 0;
|
||||||
|
pucch_n1_AN = 0;
|
||||||
|
pdsch_referenceSignalPower = -27;
|
||||||
|
pdsch_p_b = 0;
|
||||||
|
pusch_n_SB = 1;
|
||||||
|
pusch_enable64QAM = "DISABLE";
|
||||||
|
pusch_hoppingMode = "interSubFrame";
|
||||||
|
pusch_hoppingOffset = 0;
|
||||||
|
pusch_groupHoppingEnabled = "ENABLE";
|
||||||
|
pusch_groupAssignment = 0;
|
||||||
|
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||||
|
pusch_nDMRS1 = 1;
|
||||||
|
phich_duration = "NORMAL";
|
||||||
|
phich_resource = "ONESIXTH";
|
||||||
|
srs_enable = "DISABLE";
|
||||||
|
/* srs_BandwidthConfig =;
|
||||||
|
srs_SubframeConfig =;
|
||||||
|
srs_ackNackST =;
|
||||||
|
srs_MaxUpPts =;*/
|
||||||
|
|
||||||
|
pusch_p0_Nominal = -96;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -104;
|
||||||
|
msg3_delta_Preamble = 6;
|
||||||
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
|
||||||
|
rach_numberOfRA_Preambles = 64;
|
||||||
|
rach_preamblesGroupAConfig = "DISABLE";
|
||||||
|
/*
|
||||||
|
rach_sizeOfRA_PreamblesGroupA = ;
|
||||||
|
rach_messageSizeGroupA = ;
|
||||||
|
rach_messagePowerOffsetGroupB = ;
|
||||||
|
*/
|
||||||
|
rach_powerRampingStep = 4;
|
||||||
|
rach_preambleInitialReceivedTargetPower = -108;
|
||||||
|
rach_preambleTransMax = 10;
|
||||||
|
rach_raResponseWindowSize = 10;
|
||||||
|
rach_macContentionResolutionTimer = 48;
|
||||||
|
rach_maxHARQ_Msg3Tx = 4;
|
||||||
|
|
||||||
|
pcch_default_PagingCycle = 128;
|
||||||
|
pcch_nB = "oneT";
|
||||||
|
bcch_modificationPeriodCoeff = 2;
|
||||||
|
ue_TimersAndConstants_t300 = 1000;
|
||||||
|
ue_TimersAndConstants_t301 = 1000;
|
||||||
|
ue_TimersAndConstants_t310 = 1000;
|
||||||
|
ue_TimersAndConstants_t311 = 10000;
|
||||||
|
ue_TimersAndConstants_n310 = 20;
|
||||||
|
ue_TimersAndConstants_n311 = 1;
|
||||||
|
ue_TransmissionMode = 1;
|
||||||
|
|
||||||
|
//Parameters for SIB18
|
||||||
|
rxPool_sc_CP_Len = "normal";
|
||||||
|
rxPool_sc_Period = "sf40";
|
||||||
|
rxPool_data_CP_Len = "normal";
|
||||||
|
rxPool_ResourceConfig_prb_Num = 20;
|
||||||
|
rxPool_ResourceConfig_prb_Start = 5;
|
||||||
|
rxPool_ResourceConfig_prb_End = 44;
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
/* rxPool_dataHoppingConfig_hoppingParameter = 0;
|
||||||
|
rxPool_dataHoppingConfig_numSubbands = "ns1";
|
||||||
|
rxPool_dataHoppingConfig_rbOffset = 0;
|
||||||
|
rxPool_commTxResourceUC-ReqAllowed = "TRUE";
|
||||||
|
*/
|
||||||
|
// Parameters for SIB19
|
||||||
|
discRxPool_cp_Len = "normal"
|
||||||
|
discRxPool_discPeriod = "rf32"
|
||||||
|
discRxPool_numRetx = 1;
|
||||||
|
discRxPool_numRepetition = 2;
|
||||||
|
discRxPool_ResourceConfig_prb_Num = 5;
|
||||||
|
discRxPool_ResourceConfig_prb_Start = 3;
|
||||||
|
discRxPool_ResourceConfig_prb_End = 21;
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
srb1_parameters :
|
||||||
|
{
|
||||||
|
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||||
|
timer_poll_retransmit = 80;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||||
|
timer_reordering = 35;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||||
|
timer_status_prohibit = 0;
|
||||||
|
|
||||||
|
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||||
|
poll_pdu = 4;
|
||||||
|
|
||||||
|
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||||
|
poll_byte = 99999;
|
||||||
|
|
||||||
|
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||||
|
max_retx_threshold = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// MME parameters:
|
||||||
|
mme_ip_address = ( { ipv4 = "192.168.13.11";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "lo";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24";
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "lo";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
phy_test_mode = 0;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 1
|
||||||
|
nb_rx = 1
|
||||||
|
att_tx = 0
|
||||||
|
att_rx = 0;
|
||||||
|
bands = [7];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 125;
|
||||||
|
eNB_instances = [0];
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_CONTROLLER :
|
||||||
|
{
|
||||||
|
FLEXRAN_ENABLED = "no";
|
||||||
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
|
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
||||||
|
FLEXRAN_PORT = 2210;
|
||||||
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="crit";
|
||||||
|
global_log_verbosity ="crit";
|
||||||
|
hw_log_level ="crit";
|
||||||
|
hw_log_verbosity ="crit";
|
||||||
|
phy_log_level ="crit";
|
||||||
|
phy_log_verbosity ="crit";
|
||||||
|
mac_log_level ="crit";
|
||||||
|
mac_log_verbosity ="crit";
|
||||||
|
rlc_log_level ="crit";
|
||||||
|
rlc_log_verbosity ="crit";
|
||||||
|
pdcp_log_level ="crit";
|
||||||
|
pdcp_log_verbosity ="crit";
|
||||||
|
rrc_log_level ="crit";
|
||||||
|
rrc_log_verbosity ="crit";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,210 @@
|
|||||||
|
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
eNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
eNB_ID = 0xe00;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_ENB";
|
||||||
|
|
||||||
|
eNB_name = "eNB_Eurecom_LTEBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = "1";
|
||||||
|
|
||||||
|
mobile_country_code = "208";
|
||||||
|
|
||||||
|
mobile_network_code = "93";
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "3GPP_eNODEB";
|
||||||
|
node_timing = "synch_to_ext_device";
|
||||||
|
node_synch_ref = 0;
|
||||||
|
frame_type = "FDD";
|
||||||
|
tdd_config = 3;
|
||||||
|
tdd_config_s = 0;
|
||||||
|
prefix_type = "NORMAL";
|
||||||
|
eutra_band = 7;
|
||||||
|
downlink_frequency = 2685000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 50;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antenna_ports = 1;
|
||||||
|
nb_antennas_tx = 1;
|
||||||
|
nb_antennas_rx = 1;
|
||||||
|
tx_gain = 90;
|
||||||
|
rx_gain = 125;
|
||||||
|
pbch_repetition = "FALSE";
|
||||||
|
prach_root = 0;
|
||||||
|
prach_config_index = 0;
|
||||||
|
prach_high_speed = "DISABLE";
|
||||||
|
prach_zero_correlation = 1;
|
||||||
|
prach_freq_offset = 2;
|
||||||
|
pucch_delta_shift = 1;
|
||||||
|
pucch_nRB_CQI = 0;
|
||||||
|
pucch_nCS_AN = 0;
|
||||||
|
pucch_n1_AN = 0;
|
||||||
|
pdsch_referenceSignalPower = -27;
|
||||||
|
pdsch_p_b = 0;
|
||||||
|
pusch_n_SB = 1;
|
||||||
|
pusch_enable64QAM = "DISABLE";
|
||||||
|
pusch_hoppingMode = "interSubFrame";
|
||||||
|
pusch_hoppingOffset = 0;
|
||||||
|
pusch_groupHoppingEnabled = "ENABLE";
|
||||||
|
pusch_groupAssignment = 0;
|
||||||
|
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||||
|
pusch_nDMRS1 = 1;
|
||||||
|
phich_duration = "NORMAL";
|
||||||
|
phich_resource = "ONE";
|
||||||
|
srs_enable = "DISABLE";
|
||||||
|
/* srs_BandwidthConfig =;
|
||||||
|
srs_SubframeConfig =;
|
||||||
|
srs_ackNackST =;
|
||||||
|
srs_MaxUpPts =;*/
|
||||||
|
|
||||||
|
pusch_p0_Nominal = -96;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -104;
|
||||||
|
msg3_delta_Preamble = 6;
|
||||||
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
|
||||||
|
rach_numberOfRA_Preambles = 64;
|
||||||
|
rach_preamblesGroupAConfig = "DISABLE";
|
||||||
|
/*
|
||||||
|
rach_sizeOfRA_PreamblesGroupA = ;
|
||||||
|
rach_messageSizeGroupA = ;
|
||||||
|
rach_messagePowerOffsetGroupB = ;
|
||||||
|
*/
|
||||||
|
rach_powerRampingStep = 4;
|
||||||
|
rach_preambleInitialReceivedTargetPower = -108;
|
||||||
|
rach_preambleTransMax = 10;
|
||||||
|
rach_raResponseWindowSize = 10;
|
||||||
|
rach_macContentionResolutionTimer = 48;
|
||||||
|
rach_maxHARQ_Msg3Tx = 4;
|
||||||
|
|
||||||
|
pcch_default_PagingCycle = 128;
|
||||||
|
pcch_nB = "oneT";
|
||||||
|
bcch_modificationPeriodCoeff = 2;
|
||||||
|
ue_TimersAndConstants_t300 = 1000;
|
||||||
|
ue_TimersAndConstants_t301 = 1000;
|
||||||
|
ue_TimersAndConstants_t310 = 1000;
|
||||||
|
ue_TimersAndConstants_t311 = 10000;
|
||||||
|
ue_TimersAndConstants_n310 = 20;
|
||||||
|
ue_TimersAndConstants_n311 = 1;
|
||||||
|
ue_TransmissionMode = 1;
|
||||||
|
ue_multiple_max = 20;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
srb1_parameters :
|
||||||
|
{
|
||||||
|
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||||
|
timer_poll_retransmit = 80;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||||
|
timer_reordering = 35;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||||
|
timer_status_prohibit = 0;
|
||||||
|
|
||||||
|
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||||
|
poll_pdu = 4;
|
||||||
|
|
||||||
|
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||||
|
poll_byte = 99999;
|
||||||
|
|
||||||
|
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||||
|
max_retx_threshold = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// MME parameters:
|
||||||
|
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24";
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 1
|
||||||
|
nb_rx = 1
|
||||||
|
att_tx = 0
|
||||||
|
att_rx = 0;
|
||||||
|
bands = [7];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 125;
|
||||||
|
eNB_instances = [0];
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,215 @@
|
|||||||
|
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
eNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
# real_time choice in {hard, rt-preempt, no}
|
||||||
|
real_time = "no";
|
||||||
|
|
||||||
|
////////// Identification parameters:
|
||||||
|
eNB_ID = 0xe00;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_ENB";
|
||||||
|
|
||||||
|
eNB_name = "eNB-Eurecom-LTEBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = "1";
|
||||||
|
|
||||||
|
mobile_country_code = "208";
|
||||||
|
|
||||||
|
mobile_network_code = "93";
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "NGFI_RCC_IF4p5";
|
||||||
|
node_timing = "synch_to_ext_device";
|
||||||
|
node_synch_ref = 0;
|
||||||
|
frame_type = "TDD";
|
||||||
|
tdd_config = 1;
|
||||||
|
tdd_config_s = 0;
|
||||||
|
prefix_type = "NORMAL";
|
||||||
|
eutra_band = 38;
|
||||||
|
downlink_frequency = 2580000000L;
|
||||||
|
uplink_frequency_offset = 0;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 50;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antenna_ports = 1;
|
||||||
|
nb_antennas_tx = 1;
|
||||||
|
nb_antennas_rx = 1;
|
||||||
|
tx_gain = 90;
|
||||||
|
rx_gain = 125;
|
||||||
|
pbch_repetition = "FALSE";
|
||||||
|
prach_root = 0;
|
||||||
|
prach_config_index = 0;
|
||||||
|
prach_high_speed = "DISABLE";
|
||||||
|
prach_zero_correlation = 1;
|
||||||
|
prach_freq_offset = 2;
|
||||||
|
pucch_delta_shift = 1;
|
||||||
|
pucch_nRB_CQI = 0;
|
||||||
|
pucch_nCS_AN = 0;
|
||||||
|
pucch_n1_AN = 32;
|
||||||
|
pdsch_referenceSignalPower = -27;
|
||||||
|
pdsch_p_b = 0;
|
||||||
|
pusch_n_SB = 1;
|
||||||
|
pusch_enable64QAM = "DISABLE";
|
||||||
|
pusch_hoppingMode = "interSubFrame";
|
||||||
|
pusch_hoppingOffset = 0;
|
||||||
|
pusch_groupHoppingEnabled = "ENABLE";
|
||||||
|
pusch_groupAssignment = 0;
|
||||||
|
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||||
|
pusch_nDMRS1 = 1;
|
||||||
|
phich_duration = "NORMAL";
|
||||||
|
phich_resource = "ONESIXTH";
|
||||||
|
srs_enable = "DISABLE";
|
||||||
|
/* srs_BandwidthConfig =;
|
||||||
|
srs_SubframeConfig =;
|
||||||
|
srs_ackNackST =;
|
||||||
|
srs_MaxUpPts =;*/
|
||||||
|
|
||||||
|
pusch_p0_Nominal = -104;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -96;
|
||||||
|
msg3_delta_Preamble = 6;
|
||||||
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
|
||||||
|
rach_numberOfRA_Preambles = 64;
|
||||||
|
rach_preamblesGroupAConfig = "DISABLE";
|
||||||
|
/*
|
||||||
|
rach_sizeOfRA_PreamblesGroupA = ;
|
||||||
|
rach_messageSizeGroupA = ;
|
||||||
|
rach_messagePowerOffsetGroupB = ;
|
||||||
|
*/
|
||||||
|
rach_powerRampingStep = 4;
|
||||||
|
rach_preambleInitialReceivedTargetPower = -108;
|
||||||
|
rach_preambleTransMax = 10;
|
||||||
|
rach_raResponseWindowSize = 10;
|
||||||
|
rach_macContentionResolutionTimer = 48;
|
||||||
|
rach_maxHARQ_Msg3Tx = 4;
|
||||||
|
|
||||||
|
pcch_default_PagingCycle = 128;
|
||||||
|
pcch_nB = "oneT";
|
||||||
|
bcch_modificationPeriodCoeff = 2;
|
||||||
|
ue_TimersAndConstants_t300 = 1000;
|
||||||
|
ue_TimersAndConstants_t301 = 1000;
|
||||||
|
ue_TimersAndConstants_t310 = 1000;
|
||||||
|
ue_TimersAndConstants_t311 = 10000;
|
||||||
|
ue_TimersAndConstants_n310 = 20;
|
||||||
|
ue_TimersAndConstants_n311 = 1;
|
||||||
|
ue_TransmissionMode = 1;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
srb1_parameters :
|
||||||
|
{
|
||||||
|
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||||
|
timer_poll_retransmit = 80;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||||
|
timer_reordering = 35;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||||
|
timer_status_prohibit = 0;
|
||||||
|
|
||||||
|
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||||
|
poll_pdu = 4;
|
||||||
|
|
||||||
|
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||||
|
poll_byte = 99999;
|
||||||
|
|
||||||
|
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||||
|
max_retx_threshold = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// MME parameters:
|
||||||
|
mme_ip_address = ( { ipv4 = "127.0.0.3";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "lo";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24";
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "lo";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_if_name = "lo";
|
||||||
|
remote_address = "127.0.0.2";
|
||||||
|
local_address = "127.0.0.1";
|
||||||
|
local_portc = 50000;
|
||||||
|
remote_portc = 50000;
|
||||||
|
local_portd = 50001;
|
||||||
|
remote_portd = 50001;
|
||||||
|
local_rf = "no"
|
||||||
|
tr_preference = "udp_if4p5"
|
||||||
|
nb_tx = 2
|
||||||
|
nb_rx = 2
|
||||||
|
att_tx = 0
|
||||||
|
att_rx = 0;
|
||||||
|
eNB_instances = [0];
|
||||||
|
is_slave = "no";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
log_config = {
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
};
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_if_name = "lo";
|
||||||
|
remote_address = "127.0.0.1"
|
||||||
|
local_address = "127.0.0.2";
|
||||||
|
local_portc = 50000;
|
||||||
|
remote_portc = 50000;
|
||||||
|
local_portd = 50001;
|
||||||
|
remote_portd = 50001;
|
||||||
|
local_rf = "yes"
|
||||||
|
tr_preference = "udp_if4p5";
|
||||||
|
nb_tx = 1;
|
||||||
|
nb_rx = 1;
|
||||||
|
max_pdschReferenceSignalPower = -29;
|
||||||
|
max_rxgain = 120;
|
||||||
|
bands = [38];
|
||||||
|
is_slave = "no";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
log_config = {
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -1729,7 +1729,6 @@ static void* ru_thread( void* param ) {
|
|||||||
ru->do_prach,
|
ru->do_prach,
|
||||||
is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx),
|
is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx),
|
||||||
proc->frame_rx,proc->subframe_rx);
|
proc->frame_rx,proc->subframe_rx);
|
||||||
|
|
||||||
if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)==1)) {
|
if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)==1)) {
|
||||||
wakeup_prach_ru(ru);
|
wakeup_prach_ru(ru);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,541 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! \file rfsim.c
|
||||||
|
* \brief function for simulated RF device
|
||||||
|
* \author R. Knopp
|
||||||
|
* \date 2018
|
||||||
|
* \version 1.0
|
||||||
|
* \company Eurecom
|
||||||
|
* \email: openair_tech@eurecom.fr
|
||||||
|
* \note
|
||||||
|
* \warning
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <execinfo.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <mcheck.h>
|
||||||
|
#include <sys/timerfd.h>
|
||||||
|
|
||||||
|
#include "assertions.h"
|
||||||
|
#include "rfsim.h"
|
||||||
|
#include "openair1/SIMULATION/TOOLS/sim.h"
|
||||||
|
#include "enb_config.h"
|
||||||
|
#include "enb_paramdef.h"
|
||||||
|
#include "platform_constants.h"
|
||||||
|
#include "common/config/config_paramdesc.h"
|
||||||
|
#include "common/config/config_userapi.h"
|
||||||
|
#include "common/ran_context.h"
|
||||||
|
#include "PHY/defs_UE.h"
|
||||||
|
#include "PHY/defs_eNB.h"
|
||||||
|
#include "vcd_signal_dumper.h"
|
||||||
|
|
||||||
|
RAN_CONTEXT_t RC;
|
||||||
|
extern PHY_VARS_UE ***PHY_vars_UE_g;
|
||||||
|
|
||||||
|
|
||||||
|
// put all of these in a common structure after
|
||||||
|
sim_t sim;
|
||||||
|
|
||||||
|
|
||||||
|
void init_ru_devices(void);
|
||||||
|
void init_RU(const char*);
|
||||||
|
void *rfsim_top(void *n_frames);
|
||||||
|
|
||||||
|
void wait_RUs(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// wait for all RUs to be configured over fronthaul
|
||||||
|
pthread_mutex_lock(&RC.ru_mutex);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
while (RC.ru_mask>0) {
|
||||||
|
pthread_cond_wait(&RC.ru_cond,&RC.ru_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy frame parameters from RU to UEs
|
||||||
|
for (i=0;i<NB_UE_INST;i++) {
|
||||||
|
sim.current_UE_rx_timestamp[i][0] = RC.ru[0]->frame_parms.samples_per_tti + RC.ru[0]->frame_parms.ofdm_symbol_size + RC.ru[0]->frame_parms.nb_prefix_samples0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int ru_id=0;ru_id<RC.nb_RU;ru_id++) sim.current_ru_rx_timestamp[ru_id][0] = RC.ru[ru_id]->frame_parms.samples_per_tti;
|
||||||
|
|
||||||
|
printf("RUs are ready, let's go\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void wait_eNBs(void)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RCConfig_sim(void) {
|
||||||
|
|
||||||
|
paramlist_def_t RUParamList = {CONFIG_STRING_RU_LIST,NULL,0};
|
||||||
|
|
||||||
|
// AssertFatal(RC.config_file_name!=NULL,"configuration file is undefined\n");
|
||||||
|
|
||||||
|
// Get num RU instances
|
||||||
|
config_getlist( &RUParamList,NULL,0, NULL);
|
||||||
|
RC.nb_RU = RUParamList.numelt;
|
||||||
|
|
||||||
|
printf("returned with %d rus\n",RC.nb_RU);
|
||||||
|
|
||||||
|
init_RU(NULL);
|
||||||
|
|
||||||
|
printf("Waiting for RUs to get set up\n");
|
||||||
|
wait_RUs();
|
||||||
|
|
||||||
|
init_ru_devices();
|
||||||
|
|
||||||
|
static int nframes = 100000;
|
||||||
|
|
||||||
|
AssertFatal(0 == pthread_create(&sim.rfsim_thread,
|
||||||
|
NULL,
|
||||||
|
rfsim_top,
|
||||||
|
(void*)&nframes), "");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int ru_trx_start(openair0_device *device) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ru_trx_end(openair0_device *device) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ru_trx_stop(openair0_device *device) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
int UE_trx_start(openair0_device *device) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
void UE_trx_end(openair0_device *device) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int UE_trx_stop(openair0_device *device) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
int ru_trx_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dummy) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
int ru_trx_set_gains(openair0_device *device, openair0_config_t *openair0_cfg) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
int UE_trx_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dummy) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
int UE_trx_set_gains(openair0_device *device, openair0_config_t *openair0_cfg) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern pthread_mutex_t subframe_mutex;
|
||||||
|
extern int subframe_ru_mask,subframe_UE_mask;
|
||||||
|
|
||||||
|
|
||||||
|
int ru_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) {
|
||||||
|
|
||||||
|
int ru_id = device->Mod_id;
|
||||||
|
int CC_id = device->CC_id;
|
||||||
|
|
||||||
|
int subframe;
|
||||||
|
int sample_count=0;
|
||||||
|
|
||||||
|
*ptimestamp = sim.last_ru_rx_timestamp[ru_id][CC_id];
|
||||||
|
|
||||||
|
|
||||||
|
LOG_D(SIM,"RU_trx_read nsamps %d TS(%llu,%llu) => subframe %d\n",nsamps,
|
||||||
|
(unsigned long long)sim.current_ru_rx_timestamp[ru_id][CC_id],
|
||||||
|
(unsigned long long)sim.last_ru_rx_timestamp[ru_id][CC_id],
|
||||||
|
(int)((*ptimestamp/RC.ru[ru_id]->frame_parms.samples_per_tti)%10));
|
||||||
|
// if we're at a subframe boundary generate UL signals for this ru
|
||||||
|
|
||||||
|
while (sample_count<nsamps) {
|
||||||
|
while (sim.current_ru_rx_timestamp[ru_id][CC_id]<
|
||||||
|
(nsamps+sim.last_ru_rx_timestamp[ru_id][CC_id])) {
|
||||||
|
LOG_D(SIM,"RU: current TS %"PRIi64", last TS %"PRIi64", sleeping\n",sim.current_ru_rx_timestamp[ru_id][CC_id],sim.last_ru_rx_timestamp[ru_id][CC_id]);
|
||||||
|
usleep(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
subframe = (sim.last_ru_rx_timestamp[ru_id][CC_id]/RC.ru[ru_id]->frame_parms.samples_per_tti)%10;
|
||||||
|
if (subframe_select(&RC.ru[ru_id]->frame_parms,subframe) != SF_DL || RC.ru[ru_id]->frame_parms.frame_type == FDD) {
|
||||||
|
LOG_D(SIM,"RU_trx_read generating UL subframe %d (Ts %llu, current TS %llu)\n",
|
||||||
|
subframe,(unsigned long long)*ptimestamp,
|
||||||
|
(unsigned long long)sim.current_ru_rx_timestamp[ru_id][CC_id]);
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SIM_DO_UL_SIGNAL,1);
|
||||||
|
do_UL_sig(&sim,
|
||||||
|
subframe,
|
||||||
|
0, // abstraction_flag
|
||||||
|
&RC.ru[ru_id]->frame_parms,
|
||||||
|
0, // frame is only used for abstraction
|
||||||
|
ru_id,
|
||||||
|
CC_id);
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SIM_DO_UL_SIGNAL,0);
|
||||||
|
}
|
||||||
|
sim.last_ru_rx_timestamp[ru_id][CC_id] += RC.ru[ru_id]->frame_parms.samples_per_tti;
|
||||||
|
sample_count += RC.ru[ru_id]->frame_parms.samples_per_tti;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return(nsamps);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc)
|
||||||
|
{
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SIM_UE_TRX_READ,1);
|
||||||
|
int UE_id = device->Mod_id;
|
||||||
|
int CC_id = device->CC_id;
|
||||||
|
|
||||||
|
int subframe;
|
||||||
|
int sample_count=0;
|
||||||
|
int read_size;
|
||||||
|
int sptti = PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti;
|
||||||
|
|
||||||
|
*ptimestamp = sim.last_UE_rx_timestamp[UE_id][CC_id];
|
||||||
|
|
||||||
|
LOG_D(PHY,"UE %d DL simulation 0: UE_trx_read nsamps %d TS %llu (%llu, offset %d) antenna %d\n",
|
||||||
|
UE_id,
|
||||||
|
nsamps,
|
||||||
|
(unsigned long long)sim.current_UE_rx_timestamp[UE_id][CC_id],
|
||||||
|
(unsigned long long)sim.last_UE_rx_timestamp[UE_id][CC_id],
|
||||||
|
(int)(sim.last_UE_rx_timestamp[UE_id][CC_id]%sptti),
|
||||||
|
cc);
|
||||||
|
|
||||||
|
|
||||||
|
if (nsamps < sptti)
|
||||||
|
read_size = nsamps;
|
||||||
|
else
|
||||||
|
read_size = sptti;
|
||||||
|
|
||||||
|
while (sample_count<nsamps) {
|
||||||
|
LOG_D(SIM,"UE %d: DL simulation 1: UE_trx_read : current TS now %"PRIi64", last TS %"PRIi64"\n",UE_id,sim.current_UE_rx_timestamp[UE_id][CC_id],sim.last_UE_rx_timestamp[UE_id][CC_id]);
|
||||||
|
while (sim.current_UE_rx_timestamp[UE_id][CC_id] <
|
||||||
|
(sim.last_UE_rx_timestamp[UE_id][CC_id]+read_size)) {
|
||||||
|
LOG_D(SIM,"UE %d: DL simulation 2: UE_trx_read : current TS %"PRIi64", last TS %"PRIi64", sleeping\n",UE_id,sim.current_UE_rx_timestamp[UE_id][CC_id],sim.last_UE_rx_timestamp[UE_id][CC_id]);
|
||||||
|
usleep(500);
|
||||||
|
}
|
||||||
|
LOG_D(SIM,"UE %d: DL simulation 3: UE_trx_read : current TS now %"PRIi64", last TS %"PRIi64"\n",UE_id,sim.current_UE_rx_timestamp[UE_id][CC_id],sim.last_UE_rx_timestamp[UE_id][CC_id]);
|
||||||
|
|
||||||
|
// if we cross a subframe-boundary
|
||||||
|
subframe = (sim.last_UE_rx_timestamp[UE_id][CC_id]/sptti)%10;
|
||||||
|
|
||||||
|
// tell top-level we are busy
|
||||||
|
pthread_mutex_lock(&sim.subframe_mutex);
|
||||||
|
sim.subframe_UE_mask|=(1<<UE_id);
|
||||||
|
LOG_D(SIM,"Setting UE_id %d mask to busy (%d)\n",UE_id,sim.subframe_UE_mask);
|
||||||
|
pthread_mutex_unlock(&sim.subframe_mutex);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LOG_D(PHY,"UE %d: DL simulation 4: UE_trx_read generating DL subframe %d (Ts %llu, current TS %llu,nsamps %d)\n",
|
||||||
|
UE_id,subframe,(unsigned long long)*ptimestamp,
|
||||||
|
(unsigned long long)sim.current_UE_rx_timestamp[UE_id][CC_id],
|
||||||
|
nsamps);
|
||||||
|
|
||||||
|
LOG_D(SIM,"UE %d: DL simulation 5: Doing DL simulation for %d samples starting in subframe %d at offset %d\n",
|
||||||
|
UE_id,nsamps,subframe,
|
||||||
|
(int)(sim.last_UE_rx_timestamp[UE_id][CC_id]%sptti));
|
||||||
|
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SIM_DO_DL_SIGNAL,1);
|
||||||
|
do_DL_sig(&sim,
|
||||||
|
subframe,
|
||||||
|
sim.last_UE_rx_timestamp[UE_id][CC_id]%sptti,
|
||||||
|
sptti,
|
||||||
|
0, //abstraction_flag,
|
||||||
|
&PHY_vars_UE_g[UE_id][CC_id]->frame_parms,
|
||||||
|
UE_id,
|
||||||
|
CC_id);
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SIM_DO_DL_SIGNAL,0);
|
||||||
|
LOG_D(PHY,"UE %d: DL simulation 6: UE_trx_read @ TS %"PRIi64" (%"PRIi64")=> frame %d, subframe %d\n",
|
||||||
|
UE_id, sim.current_UE_rx_timestamp[UE_id][CC_id],
|
||||||
|
sim.last_UE_rx_timestamp[UE_id][CC_id],
|
||||||
|
(int)((sim.last_UE_rx_timestamp[UE_id][CC_id]/(sptti*10))&1023),
|
||||||
|
subframe);
|
||||||
|
|
||||||
|
sim.last_UE_rx_timestamp[UE_id][CC_id] += read_size;
|
||||||
|
sample_count += read_size;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SIM_UE_TRX_READ,0);
|
||||||
|
return(nsamps);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ru_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
|
||||||
|
|
||||||
|
int ru_id = device->Mod_id;
|
||||||
|
|
||||||
|
LTE_DL_FRAME_PARMS *frame_parms = &RC.ru[ru_id]->frame_parms;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&sim.subframe_mutex);
|
||||||
|
LOG_D(SIM,"[TXPATH] ru_trx_write: RU %d mask %d\n",ru_id,sim.subframe_ru_mask);
|
||||||
|
pthread_mutex_unlock(&sim.subframe_mutex);
|
||||||
|
|
||||||
|
// compute amplitude of TX signal from first symbol in subframe
|
||||||
|
// note: assumes that the packet is an entire subframe
|
||||||
|
|
||||||
|
sim.ru_amp[ru_id] = 0;
|
||||||
|
for (int aa=0; aa<RC.ru[ru_id]->nb_tx; aa++) {
|
||||||
|
sim.ru_amp[ru_id] += (double)signal_energy((int32_t*)buff[aa],frame_parms->ofdm_symbol_size)/(12*frame_parms->N_RB_DL);
|
||||||
|
}
|
||||||
|
sim.ru_amp[ru_id] = sqrt(sim.ru_amp[ru_id]);
|
||||||
|
|
||||||
|
LOG_D(PHY,"Setting amp for RU %d to %f (%d)\n",ru_id,sim.ru_amp[ru_id], dB_fixed((double)signal_energy((int32_t*)buff[0],frame_parms->ofdm_symbol_size)));
|
||||||
|
// tell top-level we are done
|
||||||
|
pthread_mutex_lock(&sim.subframe_mutex);
|
||||||
|
sim.subframe_ru_mask|=(1<<ru_id);
|
||||||
|
LOG_D(SIM,"Setting RU %d to busy\n",ru_id);
|
||||||
|
pthread_mutex_unlock(&sim.subframe_mutex);
|
||||||
|
|
||||||
|
return(nsamps);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UE_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
|
||||||
|
|
||||||
|
return(nsamps);
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_ru_devices(){
|
||||||
|
|
||||||
|
|
||||||
|
module_id_t ru_id;
|
||||||
|
RU_t *ru;
|
||||||
|
|
||||||
|
// allocate memory for RU if not already done
|
||||||
|
if (RC.ru==NULL) RC.ru = (RU_t**)malloc(RC.nb_RU*sizeof(RU_t*));
|
||||||
|
|
||||||
|
for (ru_id=0;ru_id<RC.nb_RU;ru_id++) {
|
||||||
|
LOG_D(SIM,"Initiaizing rfdevice for RU %d\n",ru_id);
|
||||||
|
if (RC.ru[ru_id]==NULL) RC.ru[ru_id] = (RU_t*)malloc(sizeof(RU_t));
|
||||||
|
ru = RC.ru[ru_id];
|
||||||
|
ru->rfdevice.Mod_id = ru_id;
|
||||||
|
ru->rfdevice.CC_id = 0;
|
||||||
|
ru->rfdevice.trx_start_func = ru_trx_start;
|
||||||
|
ru->rfdevice.trx_read_func = ru_trx_read;
|
||||||
|
ru->rfdevice.trx_write_func = ru_trx_write;
|
||||||
|
ru->rfdevice.trx_end_func = ru_trx_end;
|
||||||
|
ru->rfdevice.trx_stop_func = ru_trx_stop;
|
||||||
|
ru->rfdevice.trx_set_freq_func = ru_trx_set_freq;
|
||||||
|
ru->rfdevice.trx_set_gains_func = ru_trx_set_gains;
|
||||||
|
sim.last_ru_rx_timestamp[ru_id][0] = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_ue_devices(PHY_VARS_UE *UE) {
|
||||||
|
|
||||||
|
AssertFatal(UE!=NULL,"UE context is not allocated\n");
|
||||||
|
printf("Initializing UE %d.%d\n",UE->Mod_id,UE->CC_id);
|
||||||
|
UE->rfdevice.Mod_id = UE->Mod_id;
|
||||||
|
UE->rfdevice.CC_id = UE->CC_id;
|
||||||
|
UE->rfdevice.trx_start_func = UE_trx_start;
|
||||||
|
UE->rfdevice.trx_read_func = UE_trx_read;
|
||||||
|
UE->rfdevice.trx_write_func = UE_trx_write;
|
||||||
|
UE->rfdevice.trx_end_func = UE_trx_end;
|
||||||
|
UE->rfdevice.trx_stop_func = UE_trx_stop;
|
||||||
|
UE->rfdevice.trx_set_freq_func = UE_trx_set_freq;
|
||||||
|
UE->rfdevice.trx_set_gains_func = UE_trx_set_gains;
|
||||||
|
sim.last_UE_rx_timestamp[UE->Mod_id][UE->CC_id] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_ocm(double snr_dB,double sinr_dB)
|
||||||
|
{
|
||||||
|
module_id_t UE_id, ru_id;
|
||||||
|
int CC_id;
|
||||||
|
|
||||||
|
randominit(0);
|
||||||
|
set_taus_seed(0);
|
||||||
|
|
||||||
|
|
||||||
|
init_channel_vars ();//fp, &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
|
||||||
|
|
||||||
|
// initialize channel descriptors
|
||||||
|
LOG_I(PHY,"Initializing channel descriptors (nb_RU %d, nb_UE %d)\n",RC.nb_RU,NB_UE_INST);
|
||||||
|
for (ru_id = 0; ru_id < RC.nb_RU; ru_id++) {
|
||||||
|
for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
|
||||||
|
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
|
|
||||||
|
LOG_I(PHY,"Initializing channel descriptors (RU %d, UE %d) for N_RB_DL %d\n",ru_id,UE_id,
|
||||||
|
RC.ru[ru_id]->frame_parms.N_RB_DL);
|
||||||
|
sim.RU2UE[ru_id][UE_id][CC_id] =
|
||||||
|
new_channel_desc_scm(RC.ru[ru_id]->nb_tx,
|
||||||
|
PHY_vars_UE_g[UE_id][CC_id]->frame_parms.nb_antennas_rx,
|
||||||
|
AWGN,
|
||||||
|
N_RB2sampling_rate(RC.ru[ru_id]->frame_parms.N_RB_DL),
|
||||||
|
N_RB2channel_bandwidth(RC.ru[ru_id]->frame_parms.N_RB_DL),
|
||||||
|
0.0,
|
||||||
|
0,
|
||||||
|
0);
|
||||||
|
random_channel(sim.RU2UE[ru_id][UE_id][CC_id],0);
|
||||||
|
LOG_D(OCM,"[SIM] Initializing channel (%s) from UE %d to ru %d\n", "AWGN",UE_id, ru_id);
|
||||||
|
|
||||||
|
|
||||||
|
sim.UE2RU[UE_id][ru_id][CC_id] =
|
||||||
|
new_channel_desc_scm(PHY_vars_UE_g[UE_id][CC_id]->frame_parms.nb_antennas_tx,
|
||||||
|
RC.ru[ru_id]->nb_rx,
|
||||||
|
AWGN,
|
||||||
|
N_RB2sampling_rate(RC.ru[ru_id]->frame_parms.N_RB_UL),
|
||||||
|
N_RB2channel_bandwidth(RC.ru[ru_id]->frame_parms.N_RB_UL),
|
||||||
|
0.0,
|
||||||
|
0,
|
||||||
|
0);
|
||||||
|
|
||||||
|
random_channel(sim.UE2RU[UE_id][ru_id][CC_id],0);
|
||||||
|
|
||||||
|
// to make channel reciprocal uncomment following line instead of previous. However this only works for SISO at the moment. For MIMO the channel would need to be transposed.
|
||||||
|
//UE2RU[UE_id][ru_id] = RU2UE[ru_id][UE_id];
|
||||||
|
|
||||||
|
AssertFatal(sim.RU2UE[ru_id][UE_id][CC_id]!=NULL,"RU2UE[%d][%d][%d] is null\n",ru_id,UE_id,CC_id);
|
||||||
|
AssertFatal(sim.UE2RU[UE_id][ru_id][CC_id]!=NULL,"UE2RU[%d][%d][%d] is null\n",UE_id,ru_id,CC_id);
|
||||||
|
//pathloss: -132.24 dBm/15kHz RE + target SNR - eNB TX power per RE
|
||||||
|
if (ru_id == (UE_id % RC.nb_RU)) {
|
||||||
|
sim.RU2UE[ru_id][UE_id][CC_id]->path_loss_dB = -132.24 + snr_dB - RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower;
|
||||||
|
sim.UE2RU[UE_id][ru_id][CC_id]->path_loss_dB = -132.24 + snr_dB - RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower;
|
||||||
|
} else {
|
||||||
|
sim.RU2UE[ru_id][UE_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower;
|
||||||
|
sim.UE2RU[UE_id][ru_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_I(OCM,"Path loss from eNB %d to UE %d (CCid %d)=> %f dB (eNB TX %d, SNR %f)\n",ru_id,UE_id,CC_id,
|
||||||
|
sim.RU2UE[ru_id][UE_id][CC_id]->path_loss_dB,
|
||||||
|
RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower,snr_dB);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void update_ocm(double snr_dB,double sinr_dB)
|
||||||
|
{
|
||||||
|
module_id_t UE_id, ru_id;
|
||||||
|
int CC_id;
|
||||||
|
|
||||||
|
|
||||||
|
for (ru_id = 0; ru_id < RC.nb_RU; ru_id++) {
|
||||||
|
for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
|
||||||
|
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
|
|
||||||
|
AssertFatal(sim.RU2UE[ru_id][UE_id][CC_id]!=NULL,"RU2UE[%d][%d][%d] is null\n",ru_id,UE_id,CC_id);
|
||||||
|
AssertFatal(sim.UE2RU[UE_id][ru_id][CC_id]!=NULL,"UE2RU[%d][%d][%d] is null\n",UE_id,ru_id,CC_id);
|
||||||
|
//pathloss: -132.24 dBm/15kHz RE + target SNR - eNB TX power per RE
|
||||||
|
if (ru_id == (UE_id % RC.nb_RU)) {
|
||||||
|
sim.RU2UE[ru_id][UE_id][CC_id]->path_loss_dB = -132.24 + snr_dB - RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower;
|
||||||
|
sim.UE2RU[UE_id][ru_id][CC_id]->path_loss_dB = -132.24 + snr_dB - RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower;
|
||||||
|
} else {
|
||||||
|
sim.RU2UE[ru_id][UE_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower;
|
||||||
|
sim.UE2RU[UE_id][ru_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_D(OCM,"Path loss from eNB %d to UE %d (CCid %d)=> %f dB (eNB TX %d, SNR %f)\n",ru_id,UE_id,CC_id,
|
||||||
|
sim.RU2UE[ru_id][UE_id][CC_id]->path_loss_dB,
|
||||||
|
RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower,snr_dB);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void init_channel_vars(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
memset(sim.RU_output_mask,0,sizeof(int)*NUMBER_OF_UE_MAX);
|
||||||
|
for (i=0;i<NB_UE_INST;i++)
|
||||||
|
pthread_mutex_init(&sim.RU_output_mutex[i],NULL);
|
||||||
|
|
||||||
|
memset(sim.UE_output_mask,0,sizeof(int)*NUMBER_OF_RU_MAX);
|
||||||
|
for (i=0;i<RC.nb_RU;i++)
|
||||||
|
pthread_mutex_init(&sim.UE_output_mutex[i],NULL);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void *rfsim_top(void *n_frames) {
|
||||||
|
|
||||||
|
|
||||||
|
wait_sync("rfsim_top");
|
||||||
|
|
||||||
|
|
||||||
|
printf("Running rfsim with %d frames\n",*(int*)n_frames);
|
||||||
|
for (int frame = 0;
|
||||||
|
frame < *(int*)n_frames;
|
||||||
|
frame++) {
|
||||||
|
|
||||||
|
for (int sf = 0; sf < 10; sf++) {
|
||||||
|
int CC_id=0;
|
||||||
|
int all_done=0;
|
||||||
|
while (all_done==0) {
|
||||||
|
|
||||||
|
pthread_mutex_lock(&sim.subframe_mutex);
|
||||||
|
|
||||||
|
int subframe_ru_mask_local = (subframe_select(&RC.ru[0]->frame_parms,(sf+4)%10)!=SF_UL) ? sim.subframe_ru_mask : ((1<<RC.nb_RU)-1);
|
||||||
|
int subframe_UE_mask_local = (RC.ru[0]->frame_parms.frame_type == FDD || subframe_select(&RC.ru[0]->frame_parms,(sf+4)%10)!=SF_DL) ? sim.subframe_UE_mask : ((1<<NB_UE_INST)-1);
|
||||||
|
pthread_mutex_unlock(&sim.subframe_mutex);
|
||||||
|
LOG_D(SIM,"Frame %d, Subframe %d, NB_RU %d, NB_UE %d: Checking masks %x,%x\n",frame,sf,RC.nb_RU,NB_UE_INST,subframe_ru_mask_local,subframe_UE_mask_local);
|
||||||
|
if ((subframe_ru_mask_local == ((1<<RC.nb_RU)-1)) &&
|
||||||
|
(subframe_UE_mask_local == ((1<<NB_UE_INST)-1))) all_done=1;
|
||||||
|
else usleep(1500);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//clear subframe masks for next round
|
||||||
|
pthread_mutex_lock(&sim.subframe_mutex);
|
||||||
|
sim.subframe_ru_mask=0;
|
||||||
|
sim.subframe_UE_mask=0;
|
||||||
|
pthread_mutex_unlock(&sim.subframe_mutex);
|
||||||
|
|
||||||
|
// increment timestamps
|
||||||
|
for (int ru_id=0;ru_id<RC.nb_RU;ru_id++) {
|
||||||
|
sim.current_ru_rx_timestamp[ru_id][CC_id] += RC.ru[ru_id]->frame_parms.samples_per_tti;
|
||||||
|
LOG_D(SIM,"RU %d/%d: TS %"PRIi64"\n",ru_id,CC_id,sim.current_ru_rx_timestamp[ru_id][CC_id]);
|
||||||
|
}
|
||||||
|
for (int UE_inst = 0; UE_inst<NB_UE_INST;UE_inst++) {
|
||||||
|
sim.current_UE_rx_timestamp[UE_inst][CC_id] += PHY_vars_UE_g[UE_inst][CC_id]->frame_parms.samples_per_tti;
|
||||||
|
LOG_D(SIM,"UE %d/%d: TS %"PRIi64"\n",UE_inst,CC_id,sim.current_UE_rx_timestamp[UE_inst][CC_id]);
|
||||||
|
}
|
||||||
|
if (oai_exit == 1) return((void*)NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return((void*)NULL);
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
#ifndef __RFSIM__H__
|
||||||
|
#define __RFSIM__H__
|
||||||
|
#include "lte-softmodem.h"
|
||||||
|
#include "openair1/SIMULATION/TOOLS/sim.h"
|
||||||
|
#include "platform_constants.h"
|
||||||
|
#include "common/ran_context.h"
|
||||||
|
#include "PHY/defs_UE.h"
|
||||||
|
#include "PHY/defs_eNB.h"
|
||||||
|
|
||||||
|
void init_ocm(double snr_dB,double sinr_dB);
|
||||||
|
|
||||||
|
void update_ocm(double snr_dB,double sinr_dB);
|
||||||
|
|
||||||
|
void init_channel_vars(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
[*]
|
||||||
|
[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI
|
||||||
|
[*] Tue Jun 5 12:44:02 2018
|
||||||
|
[*]
|
||||||
|
[dumpfile] "/tmp/openair_dump_UE.vcd"
|
||||||
|
[dumpfile_mtime] "Tue Jun 5 12:38:07 2018"
|
||||||
|
[dumpfile_size] 21826387
|
||||||
|
[savefile] "/home/knopp/oai/openairinterface5g/targets/RT/USER/rru_if4p5_simulator.gtkw"
|
||||||
|
[timestart] 6591570000
|
||||||
|
[size] 1301 716
|
||||||
|
[pos] 309 0
|
||||||
|
*-22.793451 29983948856 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
|
||||||
|
[sst_width] 312
|
||||||
|
[signals_width] 262
|
||||||
|
[sst_expanded] 1
|
||||||
|
[sst_vpaned_height] 294
|
||||||
|
@29
|
||||||
|
functions.UE_trx_read
|
||||||
|
@28
|
||||||
|
functions.trx_read
|
||||||
|
functions.trx_write
|
||||||
|
@24
|
||||||
|
variables.trx_write_flags[63:0]
|
||||||
|
@28
|
||||||
|
functions.trx_write_if
|
||||||
|
functions.send_if4
|
||||||
|
functions.trx_read_if
|
||||||
|
functions.recv_if4
|
||||||
|
@24
|
||||||
|
variables.trx_ts[63:0]
|
||||||
|
variables.trx_tst[63:0]
|
||||||
|
variables.frame_number_RX0_RU[63:0]
|
||||||
|
variables.subframe_number_RX0_RU[63:0]
|
||||||
|
variables.frame_number_TX0_RU[63:0]
|
||||||
|
variables.subframe_number_TX0_RU[63:0]
|
||||||
|
@28
|
||||||
|
functions.do_DL_sig
|
||||||
|
functions.do_UL_sig
|
||||||
|
functions.phy_procedures_ru_feprx0
|
||||||
|
functions.phy_procedures_ru_feptx_ofdm0
|
||||||
|
[pattern_trace] 1
|
||||||
|
[pattern_trace] 0
|
||||||
Reference in New Issue
Block a user