diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py
index 63b707aa74..3e65f83e06 100644
--- a/ci-scripts/cls_containerize.py
+++ b/ci-scripts/cls_containerize.py
@@ -596,20 +596,6 @@ class Containerize():
else:
time.sleep(10)
- # HACK TO REMOVE LATER WHEN FIX
- res = re.search('oai-nr-ue', self.services[0])
- if res is not None:
- cmd = 'docker exec rfsim5g-oai-nr-ue /bin/bash -c "ip route del default"'
- logging.debug(cmd)
- deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
- cmd = 'docker exec rfsim5g-oai-nr-ue /bin/bash -c "ip route del 12.1.1.0/24"'
- logging.debug(cmd)
- deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
- cmd = 'docker exec rfsim5g-oai-nr-ue /bin/bash -c "ip route add default via 12.1.1.2 dev oaitun_ue1"'
- logging.debug(cmd)
- deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
- # END OF HACK TO REMOVE LATER WHEN FIX
-
if count == 100 and healthy == self.nb_healthy[0]:
HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK)
logging.info('\u001B[1m Deploying OAI Object(s) PASS\u001B[0m')
@@ -628,7 +614,7 @@ class Containerize():
logging.debug(cmd)
subprocess.run(cmd, shell=True)
-# if the containers are running, recover the logs!
+ # if the containers are running, recover the logs!
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps --all'
logging.debug(cmd)
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
@@ -831,7 +817,9 @@ class Containerize():
logging.debug('\u001B[1;34m Jitter : ' + jitter + '\u001B[0m')
self.IperfExit(HTML, iperfStatus, msg)
else:
+ iperfStatus = False
logging.error('problem?')
+ self.IperfExit(HTML, iperfStatus, 'problem?')
if iperfStatus:
logging.info('\u001B[1m Iperf Test PASS\u001B[0m')
diff --git a/ci-scripts/cls_oaicitest.py b/ci-scripts/cls_oaicitest.py
index 15b28cbe99..f1ab8c106f 100644
--- a/ci-scripts/cls_oaicitest.py
+++ b/ci-scripts/cls_oaicitest.py
@@ -2005,6 +2005,7 @@ class OaiCiTest():
curr_br = curr_br * 1000 * 1000
br_sum = curr_br + br_sum
ji_sum = float(ji[0]) + ji_sum
+
if (row_idx > 0):
br_sum = br_sum / row_idx
ji_sum = ji_sum / row_idx
@@ -2025,10 +2026,12 @@ class OaiCiTest():
pl = float(100 * pl_sum / ps_sum)
packetloss = '%2.1f ' % (pl)
packetloss += '%'
- else:
- packetloss = 'unknown'
+ if float(pl) > float(self.iperf_packetloss_threshold):
+ pal_too_high_msg = 'Packet Loss too high : actual = '+packetloss+', target = '+self.iperf_packetloss_threshold+'%\n'
+ else:
+ pal_too_high_msg=''
lock.acquire()
- if (br_loss < 90):
+ if (br_loss < 90) or (float(pl) > float(self.iperf_packetloss_threshold)):
statusQueue.put(1)
else:
statusQueue.put(0)
@@ -2039,13 +2042,14 @@ class OaiCiTest():
brl_msg = 'Bitrate Perf: ' + bitperf
jit_msg = 'Jitter : ' + jitter
pal_msg = 'Packet Loss : ' + packetloss
- statusQueue.put(req_msg + '\n' + bir_msg + '\n' + brl_msg + '\n' + jit_msg + '\n' + pal_msg + '\n')
+ statusQueue.put(req_msg + '\n' + bir_msg + '\n' + brl_msg + '\n' + jit_msg + '\n' + pal_msg + '\n' + pal_too_high_msg + '\n')
logging.debug('\u001B[1;37;45m iperf result (' + UE_IPAddress + ') \u001B[0m')
logging.debug('\u001B[1;35m ' + req_msg + '\u001B[0m')
logging.debug('\u001B[1;35m ' + bir_msg + '\u001B[0m')
logging.debug('\u001B[1;35m ' + brl_msg + '\u001B[0m')
logging.debug('\u001B[1;35m ' + jit_msg + '\u001B[0m')
logging.debug('\u001B[1;35m ' + pal_msg + '\u001B[0m')
+ logging.debug('\u001B[1;35m ' + pal_too_high_msg + '\u001B[0m')
lock.release()
else:
self.ping_iperf_wrong_exit(lock, UE_IPAddress, device_id, statusQueue, 'Could not analyze from server log')
@@ -2705,7 +2709,7 @@ class OaiCiTest():
if (status_queue.empty()):
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', CONST.ALL_PROCESSES_OK)
- self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfaUE)
+ self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
else:
iperf_status = True
iperf_noperf = False
diff --git a/ci-scripts/xml_files/container_4g_rfsim.xml b/ci-scripts/xml_files/container_4g_rfsim.xml
new file mode 100644
index 0000000000..5430b2b056
--- /dev/null
+++ b/ci-scripts/xml_files/container_4g_rfsim.xml
@@ -0,0 +1,129 @@
+
+
+ rfsim-4glte
+ Testing 4G LTE RF sim in containers
+ wrench
+
+ 100011
+ 000011
+ 000001
+ 000012
+ 000002
+ 000013
+ 000001
+ 000014
+ 000002
+ 020011
+ 020012
+ 030011
+ 030012
+ 100011
+
+
+
+
+ DeployGenObject
+ Deploy Cassandra Database
+ yaml_files/4g_rfsimulator
+ cassandra db_init
+ 1
+
+
+
+ IdleSleep
+ Sleep
+ 30
+
+
+
+ IdleSleep
+ Sleep
+ 10
+
+
+
+ DeployGenObject
+ Deploy OAI 4G CoreNetwork
+ yaml_files/4g_rfsimulator
+ oai_hss oai_mme oai_spgwc oai_spgwu trf_gen
+ 6
+
+
+
+ DeployGenObject
+ Deploy OAI 4G eNB RF sim
+ yaml_files/4g_rfsimulator
+ enb
+ 7
+
+
+
+ DeployGenObject
+ Deploy OAI 4G NR-UE RF sim
+ yaml_files/4g_rfsimulator
+ oai_ue0
+ 8
+
+
+
+ PingFromContainer
+ Ping Traffic-Gen from LTE-UE
+ rfsim4g-oai-lte-ue0
+ -I oaitun_ue1 -c 20 192.168.61.11
+ 5
+
+
+
+ PingFromContainer
+ Ping LTE-UE from Traffic-Gen
+ rfsim4g-trf-gen
+ -c 20 12.0.0.2
+ 5
+
+
+
+ IperfFromContainer
+ Iperf UDP Downlink
+ rfsim4g-oai-lte-ue0
+ rfsim4g-trf-gen
+ -B 12.0.0.2 -u -i 1 -s
+ -c 12.0.0.2 -u -i 1 -t 30 -b 2M
+
+
+
+ IperfFromContainer
+ Iperf UDP Uplink
+ rfsim4g-trf-gen
+ rfsim4g-oai-lte-ue0
+ -u -i 1 -s
+ -B 12.0.0.2 -c 192.168.61.11 -u -i 1 -t 30 -b 1M
+
+
+
+ UndeployGenObject
+ Undeploy all OAI 4G stack
+ yaml_files/4g_rfsimulator
+
+
+
diff --git a/ci-scripts/xml_files/container_4g_rfsim_down.xml b/ci-scripts/xml_files/container_4g_rfsim_down.xml
new file mode 100644
index 0000000000..dee516d924
--- /dev/null
+++ b/ci-scripts/xml_files/container_4g_rfsim_down.xml
@@ -0,0 +1,38 @@
+
+
+ rfsim-4glte-down
+ CleanUp 4G RF
+ trash
+
+ 100011
+
+
+
+
+ UndeployGenObject
+ Undeploy all OAI 4G stack
+ yaml_files/4g_rfsimulator
+
+
+
diff --git a/ci-scripts/xml_files/container_5g_rfsim.xml b/ci-scripts/xml_files/container_5g_rfsim.xml
index 8847c11894..660cd7cde8 100644
--- a/ci-scripts/xml_files/container_5g_rfsim.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim.xml
@@ -25,6 +25,7 @@
Testing 5G NR RF sim in containers
wrench
+ 100001
000001
000002
000003
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/README.md b/ci-scripts/yaml_files/5g_rfsimulator/README.md
index 807f1b47c5..1351d6742b 100644
--- a/ci-scripts/yaml_files/5g_rfsimulator/README.md
+++ b/ci-scripts/yaml_files/5g_rfsimulator/README.md
@@ -218,34 +218,6 @@ oaitun_ue1: flags=4305 mtu 1500
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
```
-**CAUTION: THESE NEXT FEW COMMANDS ARE A HACK. RAN developers SHALL FIX THIS!**
-
-```bash
-$ docker exec -it rfsim5g-oai-nr-ue /bin/bash
-
-# Check the current routes
-
-root@bb4d400a832d:/opt/oai-nr-ue# ip route
-default via 192.168.71.129 dev eth0
-12.1.1.0/24 dev oaitun_ue1 proto kernel scope link src 12.1.1.2
-192.168.71.128/26 dev eth0 proto kernel scope link src 192.168.71.137
-
-# Remove the default and PDN routes
-
-root@bb4d400a832d:/opt/oai-nr-ue# ip route del default
-root@bb4d400a832d:/opt/oai-nr-ue# ip route del 12.1.1.0/24
-
-# Force the default route through oaitun_ue1 tunnel
-
-root@bb4d400a832d:/opt/oai-nr-ue# ip route add default via 12.1.1.2 dev oaitun_ue1
-
-# Check the new routes
-
-root@bb4d400a832d:/opt/oai-nr-ue# ip route
-default via 12.1.1.2 dev oaitun_ue1
-192.168.71.128/26 dev eth0 proto kernel scope link src 192.168.71.137
-```
-
# 3. Check traffic #
## 3.1. Check your Internet connectivity ##
diff --git a/common/utils/system.c b/common/utils/system.c
index d8b66c51d3..38d1c1d7ad 100644
--- a/common/utils/system.c
+++ b/common/utils/system.c
@@ -209,6 +209,10 @@ int background_system(char *command) {
void start_background_system(void) {
int p[2];
pid_t son;
+
+ if (module_initialized == 1)
+ return;
+
module_initialized = 1;
if (pipe(p) == -1) {
diff --git a/docker/Dockerfile.lteUE.rhel8.2 b/docker/Dockerfile.lteUE.rhel8.2
index 2d540876e3..936780297a 100644
--- a/docker/Dockerfile.lteUE.rhel8.2
+++ b/docker/Dockerfile.lteUE.rhel8.2
@@ -37,9 +37,7 @@ RUN /bin/sh oaienv && \
mkdir -p log && \
./build_oai --UE --ninja -w USRP --verbose-ci
-RUN yum install -y python3-pip && \
- pip3 install --ignore-installed pyyaml && \
- python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
+RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_sim_parameters.yaml
#start from scratch for target executable
diff --git a/docker/Dockerfile.lteUE.ubuntu18 b/docker/Dockerfile.lteUE.ubuntu18
index c6a70a0b50..34cbe651ad 100644
--- a/docker/Dockerfile.lteUE.ubuntu18
+++ b/docker/Dockerfile.lteUE.ubuntu18
@@ -37,9 +37,7 @@ RUN /bin/sh oaienv && \
mkdir -p log && \
./build_oai --UE --ninja -w USRP --verbose-ci
-RUN apt-get install -y python3-pip && \
- pip3 install --ignore-installed pyyaml && \
- python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
+RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_sim_parameters.yaml
#start from scratch for target executable
diff --git a/docker/scripts/enb_entrypoint.sh b/docker/scripts/enb_entrypoint.sh
index 4ac86ef1b7..2e8886e855 100755
--- a/docker/scripts/enb_entrypoint.sh
+++ b/docker/scripts/enb_entrypoint.sh
@@ -6,6 +6,7 @@ PREFIX=/opt/oai-enb
RRC_INACTIVITY_THRESHOLD=${RRC_INACTIVITY_THRESHOLD:-0}
ENABLE_MEASUREMENT_REPORTS=${ENABLE_MEASUREMENT_REPORTS:-no}
ENABLE_X2=${ENABLE_X2:-no}
+THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD}
# Based another env var, pick one template to use
if [[ -v USE_FDD_CU ]]; then ln -s $PREFIX/etc/cu.fdd.conf $PREFIX/etc/enb.conf; fi
diff --git a/docker/scripts/enb_parameters.yaml b/docker/scripts/enb_parameters.yaml
index 58715a7152..07bba4479b 100644
--- a/docker/scripts/enb_parameters.yaml
+++ b/docker/scripts/enb_parameters.yaml
@@ -98,6 +98,8 @@
env: "@NID_CELL@"
- key: N_RB_DL
env: "@NB_PRB@"
+ - key: parallel_config
+ env: "@THREAD_PARALLEL_CONFIG@"
- filePrefix: rru.fdd
outputfilename: "rru.fdd.conf"
@@ -110,6 +112,8 @@
env: "@RRU_LOCAL_IP_ADDRESS@"
- key: bands
env: "@UTRA_BAND_ID@"
+ - key: parallel_config
+ env: "@THREAD_PARALLEL_CONFIG@"
- filePrefix: rru.tdd
outputfilename: "rru.tdd.conf"
@@ -122,6 +126,8 @@
env: "@RRU_LOCAL_IP_ADDRESS@"
- key: bands
env: "@UTRA_BAND_ID@"
+ - key: parallel_config
+ env: "@THREAD_PARALLEL_CONFIG@"
- filePrefix: enb.band7.tm1.fr1.25PRB.usrpb210.conf
outputfilename: "enb.fdd.conf"
@@ -171,6 +177,8 @@
env: "@FLEXRAN_INTERFACE_NAME@"
- key: FLEXRAN_IPV4_ADDRESS
env: "@FLEXRAN_IPV4_ADDRESS@"
+ - key: parallel_config
+ env: "@THREAD_PARALLEL_CONFIG@"
- filePrefix: enb.band40.tm1.25PRB.FairScheduler.usrpb210
outputfilename: "enb.tdd.conf"
@@ -208,6 +216,8 @@
env: "@F1_CU_IP_ADDRESS@"
- key: ENB_IPV4_ADDRESS_FOR_X2C
env: "@F1_CU_IP_ADDRESS@"
+ - key: parallel_config
+ env: "@THREAD_PARALLEL_CONFIG@"
- filePrefix: "rcc.band7.tm1.nfapi"
outputfilename: "rcc.nfapi.fdd.conf"
@@ -251,6 +261,8 @@
env: "@F1_CU_IP_ADDRESS@"
- key: ENB_IPV4_ADDRESS_FOR_X2C
env: "@F1_CU_IP_ADDRESS@"
+ - key: parallel_config
+ env: "@THREAD_PARALLEL_CONFIG@"
- filePrefix: "rcc.band7.tm1.if4p5.lo.25PRB"
outputfilename: "rcc.if4p5.fdd.conf"
@@ -294,6 +306,8 @@
env: "@IF4P5_RRU_IP_ADDRESS@"
- key: local_address
env: "@IF4P5_RCC_IP_ADDRESS@"
+ - key: parallel_config
+ env: "@THREAD_PARALLEL_CONFIG@"
- filePrefix: "rcc.band40.tm1.25PRB"
outputfilename: "rcc.if4p5.tdd.conf"
@@ -337,4 +351,6 @@
env: "@IF4P5_RRU_IP_ADDRESS@"
- key: local_address
env: "@IF4P5_RCC_IP_ADDRESS@"
+ - key: parallel_config
+ env: "@THREAD_PARALLEL_CONFIG@"
diff --git a/docker/scripts/gnb_entrypoint.sh b/docker/scripts/gnb_entrypoint.sh
index 6d3d63629f..678ec6cb1b 100755
--- a/docker/scripts/gnb_entrypoint.sh
+++ b/docker/scripts/gnb_entrypoint.sh
@@ -4,6 +4,7 @@ set -euo pipefail
PREFIX=/opt/oai-gnb
ENABLE_X2=${ENABLE_X2:-yes}
+THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD}
# Based another env var, pick one template to use
if [[ -v USE_NSA_TDD_MONO ]]; then ln -s $PREFIX/etc/gnb.nsa.tdd.conf $PREFIX/etc/gnb.conf; fi
diff --git a/docker/scripts/gnb_parameters.yaml b/docker/scripts/gnb_parameters.yaml
index a13d0d3677..ac5a6cb971 100644
--- a/docker/scripts/gnb_parameters.yaml
+++ b/docker/scripts/gnb_parameters.yaml
@@ -61,6 +61,8 @@
env: "@FLEXRAN_INTERFACE_NAME@"
- key: FLEXRAN_IPV4_ADDRESS
env: "@FLEXRAN_IPV4_ADDRESS@"
+ - key: parallel_config
+ env: "@THREAD_PARALLEL_CONFIG@"
- filePrefix: gnb.band78.sa.fr1.106PRB.usrpn310.conf
outputfilename: "gnb.sa.tdd.conf"
@@ -89,4 +91,6 @@
env: "@GNB_NGU_IF_NAME@"
- key: GNB_IPV4_ADDRESS_FOR_NGU
env: "@GNB_NGU_IP_ADDRESS@"
+ - key: parallel_config
+ env: "@THREAD_PARALLEL_CONFIG@"
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index b855418d64..1b33667b13 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -823,7 +823,8 @@ int main( int argc, char **argv ) {
}
printf("About to call end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
- end_configmodule();
+ // We have to set PARAMFLAG_NOFREE on right paramters before re-enabling end_configmodule()
+ //end_configmodule();
printf("Called end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
// wait for end of program
printf("TYPE TO TERMINATE\n");
diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h
index 245b9630f4..e9fc589c8c 100644
--- a/executables/nr-uesoftmodem.h
+++ b/executables/nr-uesoftmodem.h
@@ -62,6 +62,7 @@
{"r" , CONFIG_HLP_PRB_SA, 0, iptr:&(fp->N_RB_DL), defintval:106, TYPE_UINT, 0}, \
{"s" , CONFIG_HLP_SSC, 0, u16ptr:&(fp->ssb_start_subcarrier), defintval:516, TYPE_UINT16,0}, \
{"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0}, \
+ {"do-prb-interpolation", CONFIG_HLP_PRBINTER, PARAMFLAG_BOOL, iptr:&(UE->prb_interpolation), defintval:0, TYPE_INT, 0}, \
{"ue-timing-correction-disable", CONFIG_HLP_DISABLETIMECORR, PARAMFLAG_BOOL, iptr:&(UE->no_timing_correction), defintval:0, TYPE_INT, 0}, \
{"do-prb-interpolation", CONFIG_HLP_PRBINTER, PARAMFLAG_BOOL, iptr:&(UE->prb_interpolation), defintval:0, TYPE_INT, 0}, \
}
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index dee7353fa9..5e00a37266 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -213,7 +213,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
nr_pdsch_codeword_scrambling_optim(harq->f,
encoded_length,
q,
- rel15->dlDmrsScramblingId,
+ rel15->dataScramblingId,
rel15->rnti,
scrambled_output[q]);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 1ff71f102d..95b04435eb 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -155,7 +155,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
if (dlsch->harq_processes[i]) {
memset(dlsch->harq_processes[i],0,sizeof(NR_DL_UE_HARQ_t));
init_downlink_harq_status(dlsch->harq_processes[i]);
- dlsch->harq_processes[i]->first_tx=1;
+ dlsch->harq_processes[i]->first_rx=1;
dlsch->harq_processes[i]->b = (uint8_t *)malloc16(dlsch_bytes);
if (dlsch->harq_processes[i]->b)
@@ -360,7 +360,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
}
}
- if (harq_process->round == 0) {
+ if (harq_process->first_rx == 1) {
// This is a new packet, so compute quantities regarding segmentation
if (A > NR_MAX_PDSCH_TBS)
harq_process->B = A+24;
@@ -450,7 +450,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
harq_process->w[r],
harq_process->C,
harq_process->rvidx,
- (harq_process->round==0)?1:0,
+ (harq_process->first_rx==1)?1:0,
E,
harq_process->F,
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
@@ -773,7 +773,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
}
}
- if (harq_process->round == 0) {
+ if (harq_process->first_rx == 1) {
// This is a new packet, so compute quantities regarding segmentation
if (A > NR_MAX_PDSCH_TBS)
harq_process->B = A+24;
@@ -911,7 +911,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
harq_process->w[r],
harq_process->C,
harq_process->rvidx,
- (harq_process->round==0)?1:0,
+ (harq_process->first_rx==1)?1:0,
E,
harq_process->F,
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
@@ -1231,25 +1231,23 @@ void nr_dlsch_decoding_process(void *arg) {
}
}
- harq_process->round =0;
+ if (harq_process->first_rx == 1) {
+ // This is a new packet, so compute quantities regarding segmentation
+ if (A > NR_MAX_PDSCH_TBS)
+ harq_process->B = A+24;
+ else
+ harq_process->B = A+16;
- // if (harq_process->round == 0) {
- // This is a new packet, so compute quantities regarding segmentation
- if (A > NR_MAX_PDSCH_TBS)
- harq_process->B = A+24;
- else
- harq_process->B = A+16;
-
- nr_segmentation(NULL,
- NULL,
- harq_process->B,
- &harq_process->C,
- &harq_process->K,
- &harq_process->Z,
- &harq_process->F,
- p_decParams->BG);
- p_decParams->Z = harq_process->Z;
- // }
+ nr_segmentation(NULL,
+ NULL,
+ harq_process->B,
+ &harq_process->C,
+ &harq_process->K,
+ &harq_process->Z,
+ &harq_process->F,
+ p_decParams->BG);
+ p_decParams->Z = harq_process->Z;
+ }
LOG_D(PHY,"round %d Z %d K %d BG %d\n", harq_process->round, p_decParams->Z, harq_process->K, p_decParams->BG);
p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
p_decParams->outMode= 0;
@@ -1316,7 +1314,7 @@ void nr_dlsch_decoding_process(void *arg) {
harq_process->w[r],
harq_process->C,
harq_process->rvidx,
- (harq_process->round==0)?1:0,
+ (harq_process->first_rx==1)?1:0,
E,
harq_process->F,
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
index e8a9606255..b4ee4f5b41 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
@@ -206,8 +206,8 @@ typedef struct {
} NR_UE_ULSCH_t;
typedef struct {
- /// Indicator of first transmission
- uint8_t first_tx;
+ /// Indicator of first reception
+ uint8_t first_rx;
/// Last Ndi received for this process on DCI (used for C-RNTI only)
uint8_t DCINdi;
/// DLSCH status flag indicating
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index 5653e2a2f1..697f5b19d1 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -129,7 +129,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
}
dlsch0_harq->Nl = Nl;
dlsch0_harq->mcs_table=dlsch_config_pdu->mcs_table;
- downlink_harq_process(dlsch0_harq, dlsch0->current_harq_pid, dlsch_config_pdu->ndi, dlsch0->rnti_type);
+ downlink_harq_process(dlsch0_harq, dlsch0->current_harq_pid, dlsch_config_pdu->ndi, dlsch_config_pdu->rv, dlsch0->rnti_type);
if (dlsch0_harq->status != ACTIVE) {
// dlsch0_harq->status not ACTIVE may be due to false retransmission. Reset the
// following flag to skip PDSCH procedures in that case.
diff --git a/openair1/SCHED_NR_UE/harq_nr.c b/openair1/SCHED_NR_UE/harq_nr.c
index 3f528f02d4..7bc1f3053b 100644
--- a/openair1/SCHED_NR_UE/harq_nr.c
+++ b/openair1/SCHED_NR_UE/harq_nr.c
@@ -306,8 +306,9 @@ harq_result_t uplink_harq_process(NR_UE_ULSCH_t *ulsch, int harq_pid, int ndi, u
void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq)
{
dl_harq->status = SCH_IDLE;
- dl_harq->first_tx = 1;
+ dl_harq->first_rx = 1;
dl_harq->round = 0;
+ dl_harq->DCINdi = 1;
dl_harq->ack = DL_ACKNACK_NO_SET;
}
@@ -328,39 +329,66 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq)
*
*********************************************************************/
-void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, uint8_t rnti_type) {
+void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int rv, uint8_t rnti_type) {
- if (rnti_type == _CS_RNTI_) {
- LOG_E(PHY, "Fatal error in HARQ entity due to not supported CS_RNTI at line %d in function %s of file %s \n", __LINE__ , __func__, __FILE__);
- return;
- }
- else if ((rnti_type != _C_RNTI_) && (rnti_type != _TC_RNTI_)) {
- /* harq mechanism is not relevant for other rnti */
- return;
- }
- if (dl_harq->first_tx == 1) {
+ if (rnti_type == _SI_RNTI_ ||
+ rnti_type == _P_RNTI_ ||
+ rnti_type == _RA_RNTI_) {
dl_harq->round = 0;
dl_harq->status = ACTIVE;
- dl_harq->DCINdi = ndi;
- dl_harq->first_tx = 0;
-
- LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] first new reception \n", harq_pid);
+ dl_harq->first_rx = 1;
}
- else if (dl_harq->DCINdi != ndi) {
- dl_harq->round = 0;
- dl_harq->status = ACTIVE;
- dl_harq->DCINdi = ndi;
-
- LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] new reception due to toogle of ndi \n", harq_pid);
+ else{
+ switch(rv){
+ case 0:
+ dl_harq->round = 0;
+ dl_harq->status = ACTIVE;
+ dl_harq->first_rx = 1;
+ if (dl_harq->DCINdi == ndi)
+ LOG_E(PHY,"Warning! rv %d indicates new transmission but new ndi %d is the same as old ndi %d\n",rv,ndi,dl_harq->DCINdi);
+ dl_harq->DCINdi = ndi;
+ break;
+ case 1:
+ dl_harq->round = 2;
+ dl_harq->first_rx = 0;
+ if (dl_harq->DCINdi != ndi) {
+ LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
+ dl_harq->status = ACTIVE;
+ dl_harq->first_rx = 1;
+ dl_harq->DCINdi = ndi;
+ }
+ else if (dl_harq->ack)
+ dl_harq->status = SCH_IDLE;
+ break;
+ case 2:
+ dl_harq->round = 1;
+ dl_harq->first_rx = 0;
+ if (dl_harq->DCINdi != ndi) {
+ LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
+ dl_harq->status = ACTIVE;
+ dl_harq->first_rx = 1;
+ dl_harq->DCINdi = ndi;
+ }
+ else if (dl_harq->ack)
+ dl_harq->status = SCH_IDLE;
+ break;
+ case 3:
+ dl_harq->round = 3;
+ dl_harq->first_rx = 0;
+ if (dl_harq->DCINdi != ndi) {
+ LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
+ dl_harq->status = ACTIVE;
+ dl_harq->first_rx = 1;
+ dl_harq->DCINdi = ndi;
+ }
+ else if (dl_harq->ack)
+ dl_harq->status = SCH_IDLE;
+ break;
+ default:
+ AssertFatal(1==0,"Invalid value for rv %d\n",rv);
+ }
}
- else {
- dl_harq->round++;
-
- if (dl_harq->ack) dl_harq->status = SCH_IDLE;
-
- LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] reception of a retransmission \n", harq_pid);
- }
}
diff --git a/openair1/SCHED_NR_UE/harq_nr.h b/openair1/SCHED_NR_UE/harq_nr.h
index 47d1de8a11..5586518d7c 100644
--- a/openair1/SCHED_NR_UE/harq_nr.h
+++ b/openair1/SCHED_NR_UE/harq_nr.h
@@ -120,7 +120,7 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq);
@param rnti_type type of rnti
@returns retransmission or new transmission */
-void downlink_harq_process(NR_DL_UE_HARQ_t *dlsch, int harq_pid, int ndi, uint8_t rnti_type);
+void downlink_harq_process(NR_DL_UE_HARQ_t *dlsch, int harq_pid, int ndi, int rv, uint8_t rnti_type);
#undef EXTERN
#undef INIT_VARIABLES_HARQ_NR_H
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 0886f608a9..3bdd97c3bd 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -1010,9 +1010,10 @@ int main(int argc, char **argv)
UE_harq_process->ack = 0;
round = 0;
UE_harq_process->round = round;
- UE_harq_process->first_tx = 1;
+ UE_harq_process->first_rx = 1;
while ((roundack==0)) {
+
memset(RC.nrmac[0]->cce_list[1][0],0,MAX_NUM_CCE*sizeof(int));
memset(RC.nrmac[0]->cce_list[1][1],0,MAX_NUM_CCE*sizeof(int));
clear_nr_nfapi_information(RC.nrmac[0], 0, frame, slot);
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 941f615abc..5bf3c35f8d 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -135,7 +135,7 @@ const initial_pucch_resource_t initial_pucch_resource[16] = {
};
-void get_bwp_info(NR_UE_MAC_INST_t *mac,
+void get_bwp_info(NR_UE_MAC_INST_t *mac,
int dl_bwp_id,
int ul_bwp_id,
NR_BWP_DownlinkDedicated_t **bwpd,
@@ -152,10 +152,10 @@ void get_bwp_info(NR_UE_MAC_INST_t *mac,
else if (mac->scc) *bwpc = mac->scc->downlinkConfigCommon->initialDownlinkBWP;
AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
} else {
- if (mac->cg &&
+ if (mac->cg &&
mac->cg->spCellConfig &&
mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)
+ mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)
*bwpd = mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
if (mac->scc_SIB) *bwpc = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
else if (mac->scc) *bwpc = mac->scc->downlinkConfigCommon->initialDownlinkBWP;
@@ -181,7 +181,7 @@ void get_bwp_info(NR_UE_MAC_INST_t *mac,
*ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
else if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP;
- AssertFatal(*ubwpc!=NULL,"ubwpc shouldn't be null\n");
+ AssertFatal(*ubwpc!=NULL,"ubwpc shouldn't be null\n");
}
}
@@ -559,7 +559,9 @@ int nr_ue_process_dci_indication_pdu(module_id_t module_id,int cc_id, int gNB_in
dci->dci_format = NR_UL_DCI_FORMAT_0_0;
def_dci_pdu_rel15 = &mac->def_dci_pdu_rel15[dci->dci_format];
}
- return (nr_ue_process_dci(module_id, cc_id, gNB_index, frame, slot, def_dci_pdu_rel15, dci));
+ int8_t ret_proc = nr_ue_process_dci(module_id, cc_id, gNB_index, frame, slot, def_dci_pdu_rel15, dci);
+ memset(def_dci_pdu_rel15, 0, sizeof(dci_pdu_rel15_t));
+ return ret_proc;
}
int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, frame_t frame, int slot, dci_pdu_rel15_t *dci, fapi_nr_dci_indication_pdu_t *dci_ind) {
@@ -2165,8 +2167,8 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac,
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
}
- if(!pucch_Config ||
- !pucch_Config->schedulingRequestResourceToAddModList ||
+ if(!pucch_Config ||
+ !pucch_Config->schedulingRequestResourceToAddModList ||
pucch_Config->schedulingRequestResourceToAddModList->list.count==0)
return false; // SR not configured
@@ -3221,248 +3223,238 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
LOG_D(MAC, "In %s [%d.%d]: processing PDU %d (with length %d) of %d total number of PDUs...\n", __FUNCTION__, frameP, slot, pdu_id, pdu_len, dl_info->rx_ind->number_pdus);
- while (!done && pdu_len > 0){
- mac_ce_len = 0x0000;
- mac_subheader_len = 0x0001; // default to fixed-length subheader = 1-oct
- mac_sdu_len = 0x0000;
- rx_lcid = ((NR_MAC_SUBHEADER_FIXED *)pduP)->LCID;
+ while (!done && pdu_len > 0){
+ mac_ce_len = 0x0000;
+ mac_subheader_len = 0x0001; // default to fixed-length subheader = 1-oct
+ mac_sdu_len = 0x0000;
+ rx_lcid = ((NR_MAC_SUBHEADER_FIXED *)pduP)->LCID;
- LOG_D(MAC, "[UE] LCID %d, PDU length %d\n", rx_lcid, pdu_len);
- switch(rx_lcid){
- // MAC CE
+ LOG_D(MAC, "[UE] LCID %d, PDU length %d\n", rx_lcid, pdu_len);
+ switch(rx_lcid){
+ // MAC CE
+ case DL_SCH_LCID_CCCH:
+ // MSG4 RRC Setup 38.331
+ // variable length
+ if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+ mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8)
+ | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff);
+ mac_subheader_len = 3;
+ } else {
+ mac_sdu_len = ((NR_MAC_SUBHEADER_SHORT *) pduP)->L;
+ mac_subheader_len = 2;
+ }
- case DL_SCH_LCID_CCCH:
- // MSG4 RRC Setup 38.331
- // variable length
- if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
- mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8)
- | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff);
- mac_subheader_len = 3;
- } else {
- mac_sdu_len = ((NR_MAC_SUBHEADER_SHORT *) pduP)->L;
- mac_subheader_len = 2;
- }
+ // Check if it is a valid CCCH message, we get all 00's messages very often
+ int i = 0;
+ for(i=0; i<(mac_subheader_len+mac_sdu_len); i++) {
+ if(pduP[i] != 0) {
+ break;
+ }
+ }
+ if (i == (mac_subheader_len+mac_sdu_len)) {
+ LOG_D(NR_MAC, "%s() Invalid CCCH message!, pdu_len: %d\n", __func__, pdu_len);
+ done = 1;
+ break;
+ }
- // Check if it is a valid CCCH message, we get all 00's messages very often
- int i = 0;
- for(i=0; i<(mac_subheader_len+mac_sdu_len); i++) {
- if(pduP[i] != 0) {
- break;
- }
- }
- if (i == (mac_subheader_len+mac_sdu_len)) {
- LOG_D(NR_MAC, "%s() Invalid CCCH message!, pdu_len: %d\n", __func__, pdu_len);
- done = 1;
- break;
- }
+ if ( mac_sdu_len > 0 ) {
+ LOG_D(NR_MAC,"DL_SCH_LCID_CCCH (e.g. RRCSetup) with payload len %d\n", mac_sdu_len);
+ for (int i = 0; i < mac_subheader_len; i++) {
+ LOG_D(NR_MAC, "MAC header %d: 0x%x\n", i, pduP[i]);
+ }
+ for (int i = 0; i < mac_sdu_len; i++) {
+ LOG_D(NR_MAC, "%d: 0x%x\n", i, pduP[mac_subheader_len + i]);
+ }
+ nr_mac_rrc_data_ind_ue(module_idP, CC_id, gNB_index, frameP, 0, mac->crnti, CCCH, pduP+mac_subheader_len, mac_sdu_len);
+ }
+ break;
+ case DL_SCH_LCID_TCI_STATE_ACT_UE_SPEC_PDSCH:
- if ( mac_sdu_len > 0 ) {
- LOG_D(NR_MAC,"DL_SCH_LCID_CCCH (e.g. RRCSetup) with payload len %d\n", mac_sdu_len);
- for (int i = 0; i < mac_subheader_len; i++) {
- LOG_D(NR_MAC, "MAC header %d: 0x%x\n", i, pduP[i]);
- }
- for (int i = 0; i < mac_sdu_len; i++) {
- LOG_D(NR_MAC, "%d: 0x%x\n", i, pduP[mac_subheader_len + i]);
- }
- nr_mac_rrc_data_ind_ue(module_idP, CC_id, gNB_index, frameP, 0, mac->crnti, CCCH, pduP+mac_subheader_len, mac_sdu_len);
- }
- break;
+ // 38.321 Ch6.1.3.14
+ // varialbe length
+ mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
+ mac_subheader_len = 2;
+ if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+ mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
+ mac_subheader_len = 3;
+ }
+ break;
+ case DL_SCH_LCID_APERIODIC_CSI_TRI_STATE_SUBSEL:
+ // 38.321 Ch6.1.3.13
+ // varialbe length
+ mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
+ mac_subheader_len = 2;
+ if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+ mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
+ mac_subheader_len = 3;
+ }
+ break;
+ case DL_SCH_LCID_SP_CSI_RS_CSI_IM_RES_SET_ACT:
+ // 38.321 Ch6.1.3.12
+ // varialbe length
+ mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
+ mac_subheader_len = 2;
+ if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+ mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
+ mac_subheader_len = 3;
+ }
+ break;
+ case DL_SCH_LCID_SP_SRS_ACTIVATION:
+ // 38.321 Ch6.1.3.17
+ // varialbe length
+ mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
+ mac_subheader_len = 2;
+ if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+ mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
+ mac_subheader_len = 3;
+ }
+ break;
+ case DL_SCH_LCID_RECOMMENDED_BITRATE:
+ // 38.321 Ch6.1.3.20
+ mac_ce_len = 2;
+ break;
+ case DL_SCH_LCID_SP_ZP_CSI_RS_RES_SET_ACT:
+ // 38.321 Ch6.1.3.19
+ mac_ce_len = 2;
+ break;
+ case DL_SCH_LCID_PUCCH_SPATIAL_RELATION_ACT:
+ // 38.321 Ch6.1.3.18
+ mac_ce_len = 3;
+ break;
+ case DL_SCH_LCID_SP_CSI_REP_PUCCH_ACT:
+ // 38.321 Ch6.1.3.16
+ mac_ce_len = 2;
+ break;
+ case DL_SCH_LCID_TCI_STATE_IND_UE_SPEC_PDCCH:
+ // 38.321 Ch6.1.3.15
+ mac_ce_len = 2;
+ break;
+ case DL_SCH_LCID_DUPLICATION_ACT:
+ // 38.321 Ch6.1.3.11
+ mac_ce_len = 1;
+ break;
+ case DL_SCH_LCID_SCell_ACT_4_OCT:
+ // 38.321 Ch6.1.3.10
+ mac_ce_len = 4;
+ break;
+ case DL_SCH_LCID_SCell_ACT_1_OCT:
+ // 38.321 Ch6.1.3.10
+ mac_ce_len = 1;
+ break;
+ case DL_SCH_LCID_L_DRX:
+ // 38.321 Ch6.1.3.6
+ // fixed length but not yet specify.
+ mac_ce_len = 0;
+ break;
+ case DL_SCH_LCID_DRX:
+ // 38.321 Ch6.1.3.5
+ // fixed length but not yet specify.
+ mac_ce_len = 0;
+ break;
+ case DL_SCH_LCID_TA_COMMAND:
+ // 38.321 Ch6.1.3.4
+ mac_ce_len = 1;
- case DL_SCH_LCID_TCI_STATE_ACT_UE_SPEC_PDSCH:
+ /*uint8_t ta_command = ((NR_MAC_CE_TA *)pduP)[1].TA_COMMAND;
+ uint8_t tag_id = ((NR_MAC_CE_TA *)pduP)[1].TAGID;*/
- // 38.321 Ch6.1.3.14
- // varialbe length
- mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
- mac_subheader_len = 2;
- if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
- mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
- mac_subheader_len = 3;
- }
- break;
- case DL_SCH_LCID_APERIODIC_CSI_TRI_STATE_SUBSEL:
- // 38.321 Ch6.1.3.13
- // varialbe length
- mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
- mac_subheader_len = 2;
- if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
- mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
- mac_subheader_len = 3;
- }
- break;
- case DL_SCH_LCID_SP_CSI_RS_CSI_IM_RES_SET_ACT:
- // 38.321 Ch6.1.3.12
- // varialbe length
- mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
- mac_subheader_len = 2;
- if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
- mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
- mac_subheader_len = 3;
- }
- break;
- case DL_SCH_LCID_SP_SRS_ACTIVATION:
- // 38.321 Ch6.1.3.17
- // varialbe length
- mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
- mac_subheader_len = 2;
- if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
- mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
- mac_subheader_len = 3;
- }
- break;
-
- case DL_SCH_LCID_RECOMMENDED_BITRATE:
- // 38.321 Ch6.1.3.20
- mac_ce_len = 2;
- break;
- case DL_SCH_LCID_SP_ZP_CSI_RS_RES_SET_ACT:
- // 38.321 Ch6.1.3.19
- mac_ce_len = 2;
- break;
- case DL_SCH_LCID_PUCCH_SPATIAL_RELATION_ACT:
- // 38.321 Ch6.1.3.18
- mac_ce_len = 3;
- break;
- case DL_SCH_LCID_SP_CSI_REP_PUCCH_ACT:
- // 38.321 Ch6.1.3.16
- mac_ce_len = 2;
- break;
- case DL_SCH_LCID_TCI_STATE_IND_UE_SPEC_PDCCH:
- // 38.321 Ch6.1.3.15
- mac_ce_len = 2;
- break;
- case DL_SCH_LCID_DUPLICATION_ACT:
- // 38.321 Ch6.1.3.11
- mac_ce_len = 1;
- break;
- case DL_SCH_LCID_SCell_ACT_4_OCT:
- // 38.321 Ch6.1.3.10
- mac_ce_len = 4;
- break;
- case DL_SCH_LCID_SCell_ACT_1_OCT:
- // 38.321 Ch6.1.3.10
- mac_ce_len = 1;
- break;
- case DL_SCH_LCID_L_DRX:
- // 38.321 Ch6.1.3.6
- // fixed length but not yet specify.
- mac_ce_len = 0;
- break;
- case DL_SCH_LCID_DRX:
- // 38.321 Ch6.1.3.5
- // fixed length but not yet specify.
- mac_ce_len = 0;
- break;
- case DL_SCH_LCID_TA_COMMAND:
- // 38.321 Ch6.1.3.4
- mac_ce_len = 1;
+ ul_time_alignment->apply_ta = 1;
+ ul_time_alignment->ta_command = ((NR_MAC_CE_TA *)pduP)[1].TA_COMMAND;
+ ul_time_alignment->tag_id = ((NR_MAC_CE_TA *)pduP)[1].TAGID;
- /*uint8_t ta_command = ((NR_MAC_CE_TA *)pduP)[1].TA_COMMAND;
- uint8_t tag_id = ((NR_MAC_CE_TA *)pduP)[1].TAGID;*/
-
- ul_time_alignment->apply_ta = 1;
- ul_time_alignment->ta_command = ((NR_MAC_CE_TA *)pduP)[1].TA_COMMAND;
- ul_time_alignment->tag_id = ((NR_MAC_CE_TA *)pduP)[1].TAGID;
-
- /*
- #ifdef DEBUG_HEADER_PARSING
- LOG_D(MAC, "[UE] CE %d : UE Timing Advance : %d\n", i, pduP[1]);
- #endif
- */
+ /*
+ #ifdef DEBUG_HEADER_PARSING
+ LOG_D(MAC, "[UE] CE %d : UE Timing Advance : %d\n", i, pduP[1]);
+ #endif
+ */
LOG_I(NR_MAC, "[%d.%d] Received TA_COMMAND %u TAGID %u CC_id %d\n", frameP, slot, ul_time_alignment->ta_command, ul_time_alignment->tag_id, CC_id);
- break;
- case DL_SCH_LCID_CON_RES_ID:
- // Clause 5.1.5 and 6.1.3.3 of 3GPP TS 38.321 version 16.2.1 Release 16
- // MAC Header: 1 byte (R/R/LCID)
- // MAC SDU: 6 bytes (UE Contention Resolution Identity)
- mac_ce_len = 6;
+ break;
+ case DL_SCH_LCID_CON_RES_ID:
+ // Clause 5.1.5 and 6.1.3.3 of 3GPP TS 38.321 version 16.2.1 Release 16
+ // MAC Header: 1 byte (R/R/LCID)
+ // MAC SDU: 6 bytes (UE Contention Resolution Identity)
+ mac_ce_len = 6;
- if(ra->ra_state == WAIT_CONTENTION_RESOLUTION) {
- LOG_I(MAC, "[UE %d][RAPROC] Frame %d : received contention resolution identity: 0x%02x%02x%02x%02x%02x%02x Terminating RA procedure\n",
- module_idP, frameP, pduP[1], pduP[2], pduP[3], pduP[4], pduP[5], pduP[6]);
-
- bool ra_success = true;
- for(int i = 0; icont_res_id[i] != pduP[i+1]) {
- ra_success = false;
- break;
- }
- }
-
- if ( (ra->RA_active == 1) && ra_success) {
- nr_ra_succeeded(module_idP, frameP, slot);
- } else if (!ra_success){
- // TODO: Handle failure of RA procedure @ MAC layer
- // nr_ra_failed(module_idP, CC_id, prach_resources, frameP, slot); // prach_resources is a PHY structure
- ra->ra_state = RA_UE_IDLE;
- ra->RA_active = 0;
- }
- }
+ if(ra->ra_state == WAIT_CONTENTION_RESOLUTION) {
+ LOG_I(MAC, "[UE %d][RAPROC] Frame %d : received contention resolution identity: 0x%02x%02x%02x%02x%02x%02x Terminating RA procedure\n",
+ module_idP, frameP, pduP[1], pduP[2], pduP[3], pduP[4], pduP[5], pduP[6]);
+ bool ra_success = true;
+ for(int i = 0; icont_res_id[i] != pduP[i+1]) {
+ ra_success = false;
break;
- case DL_SCH_LCID_PADDING:
- done = 1;
- // end of MAC PDU, can ignore the rest.
- break;
+ }
+ }
- // MAC SDU
-
- case DL_SCH_LCID_DCCH:
- // check if LCID is valid at current time.
-
- case DL_SCH_LCID_DCCH1:
- // check if LCID is valid at current time.
-
- default:
- // check if LCID is valid at current time.
- if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
- //mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
- mac_subheader_len = 3;
- mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8)
- | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff);
-
- } else {
- mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
- mac_subheader_len = 2;
- }
-
- LOG_D(MAC, "[UE %d] Frame %d : DLSCH -> DL-DTCH %d (gNB %d, %d bytes)\n", module_idP, frameP, rx_lcid, gNB_index, mac_sdu_len);
-
- #if defined(ENABLE_MAC_PAYLOAD_DEBUG)
- LOG_T(MAC, "[UE %d] First 32 bytes of DLSCH : \n", module_idP);
-
- for (i = 0; i < 32; i++)
- LOG_T(MAC, "%x.", (pduP + mac_subheader_len)[i]);
-
- LOG_T(MAC, "\n");
- #endif
-
-// if (IS_SOFTMODEM_NOS1){
- if (rx_lcid < NB_RB_MAX && rx_lcid >= DL_SCH_LCID_DCCH) {
-
- mac_rlc_data_ind(module_idP,
- mac->crnti,
- gNB_index,
- frameP,
- ENB_FLAG_NO,
- MBMS_FLAG_NO,
- rx_lcid,
- (char *) (pduP + mac_subheader_len),
- mac_sdu_len,
- 1,
- NULL);
- } else {
- LOG_E(MAC, "[UE %d] Frame %d : unknown LCID %d (gNB %d)\n", module_idP, frameP, rx_lcid, gNB_index);
- }
-// }
-
- break;
+ if ( (ra->RA_active == 1) && ra_success) {
+ nr_ra_succeeded(module_idP, frameP, slot);
+ } else if (!ra_success){
+ // TODO: Handle failure of RA procedure @ MAC layer
+ // nr_ra_failed(module_idP, CC_id, prach_resources, frameP, slot); // prach_resources is a PHY structure
+ ra->ra_state = RA_UE_IDLE;
+ ra->RA_active = 0;
+ }
}
- pduP += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
- pdu_len -= ( mac_subheader_len + mac_ce_len + mac_sdu_len );
- if (pdu_len < 0)
- LOG_E(MAC, "[UE %d][%d.%d] nr_ue_process_mac_pdu, residual mac pdu length %d < 0!\n", module_idP, frameP, slot, pdu_len);
+ break;
+ case DL_SCH_LCID_PADDING:
+ done = 1;
+ // end of MAC PDU, can ignore the rest.
+ break;
+ // MAC SDU
+ case DL_SCH_LCID_DCCH:
+ // check if LCID is valid at current time.
+ case DL_SCH_LCID_DCCH1:
+ // check if LCID is valid at current time.
+ default:
+ // check if LCID is valid at current time.
+ if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+ //mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
+ mac_subheader_len = 3;
+ mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8)
+ | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff);
+
+ } else {
+ mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
+ mac_subheader_len = 2;
+ }
+
+ LOG_D(MAC, "[UE %d] Frame %d : DLSCH -> DL-DTCH %d (gNB %d, %d bytes)\n", module_idP, frameP, rx_lcid, gNB_index, mac_sdu_len);
+
+ #if defined(ENABLE_MAC_PAYLOAD_DEBUG)
+ LOG_T(MAC, "[UE %d] First 32 bytes of DLSCH : \n", module_idP);
+
+ for (i = 0; i < 32; i++)
+ LOG_T(MAC, "%x.", (pduP + mac_subheader_len)[i]);
+
+ LOG_T(MAC, "\n");
+ #endif
+
+ if (rx_lcid < NB_RB_MAX && rx_lcid >= DL_SCH_LCID_DCCH) {
+
+ mac_rlc_data_ind(module_idP,
+ mac->crnti,
+ gNB_index,
+ frameP,
+ ENB_FLAG_NO,
+ MBMS_FLAG_NO,
+ rx_lcid,
+ (char *) (pduP + mac_subheader_len),
+ mac_sdu_len,
+ 1,
+ NULL);
+ } else {
+ LOG_E(MAC, "[UE %d] Frame %d : unknown LCID %d (gNB %d)\n", module_idP, frameP, rx_lcid, gNB_index);
+ }
+
+ break;
+ }
+ pduP += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
+ pdu_len -= ( mac_subheader_len + mac_ce_len + mac_sdu_len );
+ if (pdu_len < 0)
+ LOG_E(MAC, "[UE %d][%d.%d] nr_ue_process_mac_pdu, residual mac pdu length %d < 0!\n", module_idP, frameP, slot, pdu_len);
}
}
@@ -3614,6 +3606,12 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
module_id_t mod_id = dl_info->module_id;
frame_t frame = dl_info->frame;
int slot = dl_info->slot;
+
+ if(dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack == 0) {
+ LOG_W(NR_MAC,"[UE %d][RAPROC][%d.%d] CRC check failed on RAR (NAK)\n", mod_id, frame, slot);
+ return 0;
+ }
+
int cc_id = dl_info->cc_id;
uint8_t gNB_id = dl_info->gNB_index;
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
@@ -3675,43 +3673,43 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
unsigned char csi_req;
#endif
- // TA command
- ul_time_alignment->apply_ta = 1;
- ul_time_alignment->ta_command = 31 + rar->TA2 + (rar->TA1 << 5);
+ // TA command
+ ul_time_alignment->apply_ta = 1;
+ ul_time_alignment->ta_command = 31 + rar->TA2 + (rar->TA1 << 5);
#ifdef DEBUG_RAR
- // CSI
- csi_req = (unsigned char) (rar->UL_GRANT_4 & 0x01);
+ // CSI
+ csi_req = (unsigned char) (rar->UL_GRANT_4 & 0x01);
#endif
- // TPC
- tpc_command = (unsigned char) ((rar->UL_GRANT_4 >> 1) & 0x07);
- switch (tpc_command){
- case 0:
- ra->Msg3_TPC = -6;
- break;
- case 1:
- ra->Msg3_TPC = -4;
- break;
- case 2:
- ra->Msg3_TPC = -2;
- break;
- case 3:
- ra->Msg3_TPC = 0;
- break;
- case 4:
- ra->Msg3_TPC = 2;
- break;
- case 5:
- ra->Msg3_TPC = 4;
- break;
- case 6:
- ra->Msg3_TPC = 6;
- break;
- case 7:
- ra->Msg3_TPC = 8;
- break;
- }
+ // TPC
+ tpc_command = (unsigned char) ((rar->UL_GRANT_4 >> 1) & 0x07);
+ switch (tpc_command){
+ case 0:
+ ra->Msg3_TPC = -6;
+ break;
+ case 1:
+ ra->Msg3_TPC = -4;
+ break;
+ case 2:
+ ra->Msg3_TPC = -2;
+ break;
+ case 3:
+ ra->Msg3_TPC = 0;
+ break;
+ case 4:
+ ra->Msg3_TPC = 2;
+ break;
+ case 5:
+ ra->Msg3_TPC = 4;
+ break;
+ case 6:
+ ra->Msg3_TPC = 6;
+ break;
+ case 7:
+ ra->Msg3_TPC = 8;
+ break;
+ }
// MCS
rar_grant.mcs = (unsigned char) (rar->UL_GRANT_4 >> 4);
// time alloc
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index 81306f44fa..f28ce31140 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -877,7 +877,6 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
nr_dcireq_t dcireq;
if(mac->cg != NULL){ // we have a cg
-
dcireq.module_id = mod_id;
dcireq.gNB_index = gNB_index;
dcireq.cc_id = cc_id;
@@ -894,8 +893,10 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
// this is for Msg2/Msg4
if (mac->ra.ra_state >= WAIT_RAR) {
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
- rel15->num_dci_options = 1;
+ rel15->num_dci_options = mac->ra.ra_state == WAIT_RAR ? 1 : 2;
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
+ if (mac->ra.ra_state == WAIT_CONTENTION_RESOLUTION)
+ rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_0; // msg3 retransmission
config_dci_pdu(mac, rel15, dl_config, mac->ra.ra_state == WAIT_RAR ? NR_RNTI_RA : NR_RNTI_TC , -1);
fill_dci_search_candidates(mac->ra.ss, rel15);
dl_config->number_pdus = 1;
@@ -950,12 +951,14 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
}
LOG_D(NR_MAC,"Flipping NDI for harq_id %d (Msg3)\n",ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator);
mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] = ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator;
- mac->first_ul_tx[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] = 0;
+ mac->first_ul_tx[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] = 0;
} else {
if ((mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] != ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator ||
mac->first_ul_tx[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id]==1) &&
- ((get_softmodem_params()->phy_test == 1) || (ra->ra_state == RA_SUCCEEDED))){
+ ((get_softmodem_params()->phy_test == 1) ||
+ (ra->ra_state == RA_SUCCEEDED) ||
+ (ra->ra_state == WAIT_RAR && ra->cfra))){
// Getting IP traffic to be transmitted
nr_ue_get_sdu(mod_id, frame_tx, slot_tx, gNB_index, ulsch_input_buffer, TBS_bytes);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index 788a0e482b..47c0f0e5c3 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -789,12 +789,18 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
NR_ControlResourceSet_t *coreset = NULL;
NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config = *ss->controlResourceSetId==0 ? &nr_mac->type0_PDCCH_CSS_config[ra->beam_id] : NULL;
+ NR_BWP_t *genericParameters = NULL;
if (ra->CellGroup &&
ra->CellGroup->spCellConfig &&
ra->CellGroup->spCellConfig->spCellConfigDedicated &&
ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList &&
- ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1])
+ ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]) {
bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1];
+ genericParameters = &bwp->bwp_Common->genericParameters;
+ }
+ else {
+ genericParameters= &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
+ }
if (*ss->controlResourceSetId == 0)
coreset = nr_mac->sched_ctrlCommon->coreset; // this is coreset 0
@@ -1446,11 +1452,15 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
BWPSize = type0_PDCCH_CSS_config->num_rbs;
}
+ /* get the PID of a HARQ process awaiting retrnasmission, or -1 otherwise */
+ int current_harq_pid = sched_ctrl->retrans_dl_harq.head;
// HARQ management
- AssertFatal(sched_ctrl->available_dl_harq.head >= 0,
- "UE context not initialized: no HARQ processes found\n");
- int current_harq_pid = sched_ctrl->available_dl_harq.head;
- remove_front_nr_list(&sched_ctrl->available_dl_harq);
+ if (current_harq_pid < 0) {
+ AssertFatal(sched_ctrl->available_dl_harq.head >= 0,
+ "UE context not initialized: no HARQ processes found\n");
+ current_harq_pid = sched_ctrl->available_dl_harq.head;
+ remove_front_nr_list(&sched_ctrl->available_dl_harq);
+ }
NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
DevAssert(!harq->is_waiting);
add_tail_nr_list(&sched_ctrl->feedback_dl_harq, current_harq_pid);
@@ -1484,18 +1494,19 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
harq->feedback_slot = pucch->ul_slot;
harq->feedback_frame = pucch->frame;
- // Bytes to be transmitted
uint8_t *buf = (uint8_t *) harq->tb;
- uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, buf, 255, ra->cont_res_id);
- LOG_D(NR_MAC,"Encoded contention resolution mac_pdu_length %d\n",mac_pdu_length);
- uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, &buf[mac_pdu_length+2]);
- ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->R = 0;
- ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->F = 0;
- ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH;
- ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length;
- mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_SHORT);
-
- LOG_D(NR_MAC,"Encoded RRCSetup Piggyback (%d + %d bytes), mac_pdu_length %d\n", mac_sdu_length, (int)sizeof(NR_MAC_SUBHEADER_SHORT), mac_pdu_length);
+ // Bytes to be transmitted
+ if (harq->round == 0) {
+ uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, buf, 255, ra->cont_res_id);
+ LOG_D(NR_MAC,"Encoded contention resolution mac_pdu_length %d\n",mac_pdu_length);
+ uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, &buf[mac_pdu_length+2]);
+ ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->R = 0;
+ ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->F = 0;
+ ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH;
+ ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length;
+ ra->mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_SHORT);
+ LOG_D(NR_MAC,"Encoded RRCSetup Piggyback (%d + %d bytes), mac_pdu_length %d\n", mac_sdu_length, (int)sizeof(NR_MAC_SUBHEADER_SHORT), ra->mac_pdu_length);
+ }
// Calculate number of symbols
int startSymbolIndex, nrOfSymbols;
@@ -1556,12 +1567,15 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
harq->tb_size = nr_compute_tbs(nr_get_Qm_dl(mcsIndex, mcsTableIdx),
nr_get_code_rate_dl(mcsIndex, mcsTableIdx),
rbSize, nrOfSymbols, N_PRB_DMRS * N_DMRS_SLOT, 0, tb_scaling,1) >> 3;
- } while (rbStart + rbSize < BWPSize && !vrb_map[rbStart + rbSize] && harq->tb_size < mac_pdu_length);
+ } while (rbSize < BWPSize && harq->tb_size < ra->mac_pdu_length);
- for (int i = 0; (i < rbSize) && (rbStart <= (BWPSize - rbSize)); i++) {
+ int i = 0;
+ while ((i < rbSize) && (rbStart + rbSize <= BWPSize)) {
if (vrb_map[rbStart + i]) {
- rbStart += i;
+ rbStart += i+1;
i = 0;
+ } else {
+ i++;
}
}
@@ -1708,11 +1722,11 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
bwpid);
// Add padding header and zero rest out if there is space left
- if (mac_pdu_length < harq->tb_size) {
- NR_MAC_SUBHEADER_FIXED *padding = (NR_MAC_SUBHEADER_FIXED *) &buf[mac_pdu_length];
+ if (ra->mac_pdu_length < harq->tb_size) {
+ NR_MAC_SUBHEADER_FIXED *padding = (NR_MAC_SUBHEADER_FIXED *) &buf[ra->mac_pdu_length];
padding->R = 0;
padding->LCID = DL_SCH_LCID_PADDING;
- for(int k = mac_pdu_length+1; ktb_size; k++) {
+ for(int k = ra->mac_pdu_length+1; ktb_size; k++) {
buf[k] = 0;
}
}
@@ -1763,29 +1777,34 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram
NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
NR_UE_harq_t *harq = &UE_info->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid];
+ NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
LOG_D(NR_MAC, "ue %d, rnti %d, harq is waiting %d, round %d, frame %d %d, harq id %d\n", UE_id, ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid);
- if (harq->is_waiting == 0)
- {
- if (harq->round == 0)
- {
- LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti);
- nr_clear_ra_proc(module_id, CC_id, frame, ra);
- UE_info->active[UE_id] = true;
- UE_info->Msg4_ACKed[UE_id] = true;
+ if (harq->is_waiting == 0) {
+ if (harq->round == 0) {
+ if (stats->dlsch_errors == 0) {
+ LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti);
+ nr_clear_ra_proc(module_id, CC_id, frame, ra);
+ UE_info->active[UE_id] = true;
+ UE_info->Msg4_ACKed[UE_id] = true;
+ }
+ else {
+ LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) RA Procedure failed at Msg4!\n", UE_id, ra->rnti);
+ nr_mac_remove_ra_rnti(module_id, ra->rnti);
+ nr_clear_ra_proc(module_id, CC_id, frame, ra);
+ mac_remove_nr_ue(module_id, ra->rnti);
+ }
}
- else
- {
-// ra->state = Msg4;
- LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Nak of RA-Msg4. CBRA procedure failed!\n", UE_id, ra->rnti);
- mac_remove_nr_ue(module_id,ra->rnti);
- nr_clear_ra_proc(module_id, CC_id, frame, ra);
+ else {
+ LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Nack of RA-Msg4. Preparing retransmission!\n", UE_id, ra->rnti);
+ ra->Msg4_frame = (frame + 1) % 1024;
+ ra->Msg4_slot = 1;
+ ra->state = Msg4;
UE_info->active[UE_id] = false;
UE_info->Msg4_ACKed[UE_id] = false;
}
}
-
}
void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, NR_RA_t *ra){
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index 4f4746f693..c17641b2fb 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -77,7 +77,7 @@ void nr_fill_nfapi_pucch(module_id_t mod_id,
NR_BWP_UplinkDedicated_t *ubwpd;
ubwpd = cg ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP:NULL;
-
+
LOG_D(NR_MAC,"pucch_acknak: %d.%d Calling nr_configure_pucch (ubwpd %p,r_pucch %d) pucch in %d.%d\n",frame,slot,ubwpd,pucch->r_pucch,pucch->frame,pucch->ul_slot);
nr_configure_pucch(pucch_pdu,
scc,
@@ -493,7 +493,7 @@ void nr_csi_meas_reporting(int Mod_idP,
// preparation is done in first slot of tdd period
if (frame % (period / n_slots_frame) != offset / n_slots_frame)
continue;
- LOG_D(NR_MAC, "CSI in frame %d slot %d\n", frame, sched_slot);
+ LOG_D(NR_MAC, "CSI reporting in frame %d slot %d\n", frame, sched_slot);
const NR_PUCCH_CSI_Resource_t *pucchcsires = csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.array[0];
const NR_PUCCH_ResourceSet_t *pucchresset = pucch_Config->resourceSetToAddModList->list.array[1]; // set with formats >1
@@ -992,7 +992,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
// verify if report with current id has been scheduled for this frame and slot
if ((n_slots_frame*frame + slot - offset)%period == 0) {
reportQuantity_type = UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type;
- LOG_I(MAC,"SFN/SF:%d/%d reportQuantity type = %d\n",frame,slot,reportQuantity_type);
+ LOG_D(MAC,"SFN/SF:%d/%d reportQuantity type = %d\n",frame,slot,reportQuantity_type);
switch(reportQuantity_type){
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP:
evaluate_rsrp_report(UE_info,sched_ctrl,UE_id,csi_report_id,payload,&cumul_bits,reportQuantity_type);
@@ -1245,9 +1245,9 @@ int nr_acknack_scheduling(int mod_id,
cg->spCellConfig &&
cg->spCellConfig->spCellConfigDedicated &&
cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
ubwpd = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
-
+
NR_SearchSpace__searchSpaceType_PR ss_type = (is_common==0 && (sched_ctrl->active_bwp || ubwpd)) ? NR_SearchSpace__searchSpaceType_PR_ue_Specific: NR_SearchSpace__searchSpaceType_PR_common;
uint8_t pdsch_to_harq_feedback[8];
int bwp_Id = 0;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 747903a3e9..61b5d6933d 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -822,10 +822,10 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6);
if (nr_process_mac_pdu(gnb_mod_idP, UE_id, CC_idP, frameP, slotP, sduP, sdu_lenP) == 0) {
- ra->state = Msg4;
- ra->Msg4_frame = ( frameP +2 ) % 1024;
- ra->Msg4_slot = 1;
- LOG_I(NR_MAC, "Scheduling RA-Msg4 for TC_RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot);
+ ra->state = Msg4;
+ ra->Msg4_frame = (frameP + 2) % 1024;
+ ra->Msg4_slot = 1;
+ LOG_I(NR_MAC, "Scheduling RA-Msg4 for TC_RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot);
}
else {
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
@@ -1543,8 +1543,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
pusch_pdu->mcs_index = sched_pusch->mcs;
pusch_pdu->mcs_table = ps->mcs_table;
pusch_pdu->transform_precoding = ps->transform_precoding;
- if (ps->pusch_Config &&
- ps->pusch_Config->dataScramblingIdentityPUSCH)
+ if (ps->pusch_Config && ps->pusch_Config->dataScramblingIdentityPUSCH)
pusch_pdu->data_scrambling_id = *ps->pusch_Config->dataScramblingIdentityPUSCH;
else
pusch_pdu->data_scrambling_id = *scc->physCellId;
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index a866527909..44a1cf50c6 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -157,6 +157,8 @@ typedef struct {
int msg4_TBsize;
/// MCS used for Msg4
int msg4_mcs;
+ /// MAC PDU length for Msg4
+ int mac_pdu_length;
/// RA search space
NR_SearchSpace_t *ra_ss;
// Beam index
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
index 435d7e8d30..b5c2f666a2 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
@@ -79,13 +79,13 @@ int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t
// L2 Abstraction Layer
// Note: sdu should always be processed because data and timing advance updates are transmitted by the UE
-int8_t handle_dlsch (nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
+int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
update_harq_status(dl_info, pdu_id);
- nr_ue_send_sdu(dl_info, ul_time_alignment, pdu_id);
+ if(dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack)
+ nr_ue_send_sdu(dl_info, ul_time_alignment, pdu_id);
return 0;
-
}
int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){
diff --git a/openair2/RRC/NAS/nas_config.c b/openair2/RRC/NAS/nas_config.c
index 2eb439b9e9..31ca8f9eb8 100644
--- a/openair2/RRC/NAS/nas_config.c
+++ b/openair2/RRC/NAS/nas_config.c
@@ -344,6 +344,24 @@ int nas_config(int interface_id, int thirdOctet, int fourthOctet, char *ifname)
LOG_E(OIP,"Interface %s couldn't be configured (ip address %s, mask %s broadcast address %s)\n",
interfaceName, ipAddress, netMask, broadcastAddress);
+ int res;
+ char command_line[500];
+ res = sprintf(command_line,
+ "ip rule add from %s/32 table %d && "
+ "ip rule add to %s/32 table %d && "
+ "ip route add default dev %s%d table %d",
+ ipAddress, interface_id - 1 + 10000,
+ ipAddress, interface_id - 1 + 10000,
+ UE_NAS_USE_TUN ? "oaitun_ue" : "oip",
+ interface_id, interface_id - 1 + 10000);
+
+ if (res < 0) {
+ LOG_E(OIP,"Could not create ip rule/route commands string\n");
+ return res;
+ }
+
+ background_system(command_line);
+
return returnValue;
}
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index f9ff03e422..a67b58d61a 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -525,6 +525,8 @@ int main ( int argc, char **argv )
int ru_id;
int node_type = ngran_eNB;
+ start_background_system();
+
if ( load_configmodule(argc,argv,0) == NULL) {
exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
}
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index 026e6d4a60..25bbef0bc6 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -757,6 +757,7 @@ int main( int argc, char **argv ) {
printf("sync sent\n");
/*
printf("About to call end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
+ We have to set properly PARAMFLAG_NOFREE
end_configmodule();
printf("Called end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
*/