Merge branch 'integration_2024_w27' into 'develop'
Integration: `2024.w27` See merge request oai/openairinterface5g!2839 * !2781 Fix several ASN.1 message related memory leaks in NR * !2790 docker compose override files for testing with locally modified executables. * !2835 Demote logs for NR band and duplex spacing * !2822 security in re-establishment * !2834 Fix CN tutorial SD value * !2843 Delete assertion for PLMN in RRCSetupComplete * !2771 NR UE PDSCH-CSI overlap * !2721 T2 card: LDPC encoder/decoder TB processing * !2828 Bugfix to TX_DATA.request PDU_Length computation, change input parameter to uint32_t * !2841 Reduce number of LOG prints in NR UE log * !2844 phy-test mode ULSCH schdeuler hotfix * !2765 Fix issues blocking multiple UE in one process * !2826 NR gNB ULSCH fixes * !2845 Another phy-test ULSCH fix (missing TDA assignment) * !2840 chore(build): removing dependency to libatlas3
This commit is contained in:
@@ -44,7 +44,7 @@
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 5, 106 PRBs, 1 layer</desc>
|
||||
<physim_run>nr_ulsim</physim_run>
|
||||
<physim_time_threshold>100</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -m5 -r106 -R106 -o -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -m5 -r106 -R106 -o -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010121">
|
||||
@@ -60,7 +60,7 @@
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 15, 106 PRBs, 1 layer</desc>
|
||||
<physim_run>nr_ulsim</physim_run>
|
||||
<physim_time_threshold>150</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -m15 -r106 -R106 -o -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -m15 -r106 -R106 -o -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010131">
|
||||
@@ -76,7 +76,7 @@
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 25, 106 PRBs, 1 layer</desc>
|
||||
<physim_run>nr_ulsim</physim_run>
|
||||
<physim_time_threshold>250</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -m25 -r106 -R106 -o -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -m25 -r106 -R106 -o -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010211">
|
||||
@@ -92,7 +92,7 @@
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 1 layer</desc>
|
||||
<physim_run>nr_ulsim</physim_run>
|
||||
<physim_time_threshold>150</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -m5 -r273 -R273 -o -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -m5 -r273 -R273 -o -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010221">
|
||||
@@ -108,7 +108,7 @@
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 1 layer</desc>
|
||||
<physim_run>nr_ulsim</physim_run>
|
||||
<physim_time_threshold>350</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -m15 -r273 -R273 -o -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -m15 -r273 -R273 -o -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010231">
|
||||
@@ -124,7 +124,7 @@
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 1 layer</desc>
|
||||
<physim_run>nr_ulsim</physim_run>
|
||||
<physim_time_threshold>550</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -m25 -r273 -R273 -o -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -m25 -r273 -R273 -o -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010311">
|
||||
@@ -140,7 +140,7 @@
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 2 layers</desc>
|
||||
<physim_run>nr_ulsim</physim_run>
|
||||
<physim_time_threshold>250</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -m5 -r273 -R273 -o -W2 -z2 -y2 -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -m5 -r273 -R273 -o -W2 -z2 -y2 -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010321">
|
||||
@@ -156,7 +156,7 @@
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 2 layers</desc>
|
||||
<physim_run>nr_ulsim</physim_run>
|
||||
<physim_time_threshold>650</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -m15 -r273 -R273 -o -W2 -z2 -y2 -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -m15 -r273 -R273 -o -W2 -z2 -y2 -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010331">
|
||||
@@ -172,7 +172,7 @@
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 2 layers</desc>
|
||||
<physim_run>nr_ulsim</physim_run>
|
||||
<physim_time_threshold>1100</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -m25 -r273 -R273 -o -W2 -z2 -y2 -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -m25 -r273 -R273 -o -W2 -z2 -y2 -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 106 PRBs, 1 layer</desc>
|
||||
<physim_run>nr_dlsim</physim_run>
|
||||
<physim_time_threshold>100</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -e5 -b106 -R106 -c -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -e5 -b106 -R106 -c -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000121">
|
||||
@@ -60,7 +60,7 @@
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 15, 106 PRBs, 1 layer</desc>
|
||||
<physim_run>nr_dlsim</physim_run>
|
||||
<physim_time_threshold>100</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -e15 -b106 -R106 -c -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -e15 -b106 -R106 -c -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000131">
|
||||
@@ -76,7 +76,7 @@
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 25, 106 PRBs, 1 layer</desc>
|
||||
<physim_run>nr_dlsim</physim_run>
|
||||
<physim_time_threshold>200</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -e25 -b106 -R106 -c -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -e25 -b106 -R106 -c -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000211">
|
||||
@@ -92,7 +92,7 @@
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 1 layer</desc>
|
||||
<physim_run>nr_dlsim</physim_run>
|
||||
<physim_time_threshold>150</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -e5 -b273 -R273 -c -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -e5 -b273 -R273 -c -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000221">
|
||||
@@ -108,7 +108,7 @@
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 1 layer</desc>
|
||||
<physim_run>nr_dlsim</physim_run>
|
||||
<physim_time_threshold>250</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -e15 -b273 -R273 -c -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -e15 -b273 -R273 -c -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000231">
|
||||
@@ -124,7 +124,7 @@
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 1 layer</desc>
|
||||
<physim_run>nr_dlsim</physim_run>
|
||||
<physim_time_threshold>400</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -e25 -b273 -R273 -c -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -e25 -b273 -R273 -c -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000311">
|
||||
@@ -140,7 +140,7 @@
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 2 layers</desc>
|
||||
<physim_run>nr_dlsim</physim_run>
|
||||
<physim_time_threshold>200</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -e5 -b273 -R273 -c -x2 -z2 -y2 -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -e5 -b273 -R273 -c -x2 -z2 -y2 -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000321">
|
||||
@@ -156,7 +156,7 @@
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 2 layers</desc>
|
||||
<physim_run>nr_dlsim</physim_run>
|
||||
<physim_time_threshold>500</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -e15 -b273 -R273 -c -x2 -z2 -y2 -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -e15 -b273 -R273 -c -x2 -z2 -y2 -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000331">
|
||||
@@ -172,7 +172,7 @@
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 2 layers</desc>
|
||||
<physim_run>nr_dlsim</physim_run>
|
||||
<physim_time_threshold>800</physim_time_threshold>
|
||||
<physim_run_args>-n100 -s30 -e25 -b273 -R273 -c -x2 -z2 -y2 -P</physim_run_args>
|
||||
<physim_run_args>-n100 -s30 -e25 -b273 -R273 -c -x2 -z2 -y2 -P --ldpc_offload.dpdk_dev d8:00.0</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -113,7 +113,7 @@ services:
|
||||
--log_config.global_log_options level,nocolor,time
|
||||
--rfsimulator.options chanmod
|
||||
--telnetsrv --telnetsrv.listenaddr 192.168.71.171
|
||||
ASAN_OPTIONS: detect_leaks=0
|
||||
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
|
||||
depends_on:
|
||||
- oai-cu
|
||||
networks:
|
||||
@@ -143,6 +143,7 @@ services:
|
||||
--rfsimulator.serveraddr 192.168.71.171
|
||||
--rfsimulator.options chanmod
|
||||
--telnetsrv --telnetsrv.shrmod ciUE --telnetsrv.listenaddr 192.168.71.181 --telnetsrv.listenport 8091
|
||||
ASAN_OPTIONS: detect_odr_violation=0
|
||||
depends_on:
|
||||
- oai-du
|
||||
networks:
|
||||
|
||||
@@ -535,3 +535,40 @@ snssais:
|
||||
```
|
||||
|
||||
The `ST` and `SD` values shall also match.
|
||||
|
||||
|
||||
# 6. Running with local changes
|
||||
|
||||
You can run the testcase with local changes by substituting the binaries in
|
||||
execution images. `local-override.yaml` file provides a way to substitute the
|
||||
gNB and nrUE executables as well as librfsimulator.so. Refer to the `-volumes`
|
||||
section in the file for details. This includes an image build service as well as
|
||||
code compilation service. This is necessary as the executable has to be linked
|
||||
against the same libraries that are present in the executing image. This might
|
||||
take a while the first time but other that that is very fast. Here is a list of
|
||||
commands (wait between each command). Tested with `docker compose` v2.27.0
|
||||
|
||||
|
||||
This command deploys OAI 5G Core Network
|
||||
```bash
|
||||
docker compose -f docker-compose.yaml -f local-override.yaml up -d mysql oai-amf oai-smf oai-upf oai-ext-dn
|
||||
```
|
||||
This command builds base images locally, builds local gNB & nrUE executable and
|
||||
runs the gnb service with modified gNB executable.
|
||||
```bash
|
||||
docker compose -f docker-compose.yaml -f local-override.yaml up -d oai-gnb
|
||||
```
|
||||
This command rebuilds both the gNB & nrUE and runs the oai-nr-ue container with
|
||||
modified nrUE executable.
|
||||
```bash
|
||||
docker compose -f docker-compose.yaml -f local-override.yaml up -d oai-nr-ue
|
||||
```
|
||||
|
||||
## 6.1 Running nrUE in gdb
|
||||
`local-override-ue-gdb.yaml` is an additional override file which can be used
|
||||
to run the UE executable in gdb. Replace the last command above with the
|
||||
following:
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.yaml -f local-override.yaml -f local-override-ue-gdb.yaml run oai-nr-ue
|
||||
```
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
services:
|
||||
oai-nr-ue:
|
||||
privileged: true
|
||||
stdin_open: true
|
||||
tty: true
|
||||
command: gdb --args /opt/oai-nr-ue/bin/nr-uesoftmodem -O /opt/oai-nr-ue/etc/nr-ue.conf -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001100 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
@@ -0,0 +1,27 @@
|
||||
include:
|
||||
- ../local_common_overrides/build_images.yaml
|
||||
- ../local_common_overrides/rebuild_nr_softmodems.yaml
|
||||
services:
|
||||
oai-gnb:
|
||||
privileged: true
|
||||
depends_on:
|
||||
rebuild-nr-softmodems:
|
||||
condition: service_completed_successfully
|
||||
volumes:
|
||||
- ../../../cmake_targets/ran_build/build/nr-softmodem:/opt/oai-gnb/bin/nr-softmodem
|
||||
- ../../../cmake_targets/ran_build/build/librfsimulator.so:/usr/local/lib/librfsimulator.so
|
||||
oai-nr-ue:
|
||||
privileged: true
|
||||
image: ue-local
|
||||
depends_on:
|
||||
build-ran-build:
|
||||
condition: service_completed_successfully
|
||||
restart: true
|
||||
oai-gnb:
|
||||
condition: service_started
|
||||
rebuild-nr-softmodems:
|
||||
condition: service_completed_successfully
|
||||
volumes:
|
||||
- ../../../cmake_targets/ran_build/build/nr-uesoftmodem:/opt/oai-nr-ue/bin/nr-uesoftmodem
|
||||
- ../../../cmake_targets/ran_build/build/librfsimulator.so:/usr/local/lib/librfsimulator.so
|
||||
- ../../../crashdumps/:/cores/
|
||||
@@ -0,0 +1,27 @@
|
||||
include:
|
||||
- ../local_common_overrides/build_images.yaml
|
||||
- ../local_common_overrides/rebuild_nr_softmodems.yaml
|
||||
services:
|
||||
oai-gnb:
|
||||
privileged: true
|
||||
depends_on:
|
||||
rebuild-nr-softmodems:
|
||||
condition: service_completed_successfully
|
||||
# volumes:
|
||||
# replace the gnb executable here
|
||||
oai-nr-ue:
|
||||
privileged: true
|
||||
image: ue-local
|
||||
depends_on:
|
||||
build-ran-build:
|
||||
condition: service_completed_successfully
|
||||
restart: true
|
||||
oai-gnb:
|
||||
condition: service_started
|
||||
rebuild-nr-softmodems:
|
||||
condition: service_completed_successfully
|
||||
container_name: local-oai-nr-ue
|
||||
volumes:
|
||||
- ../../../cmake_targets/ran_build/build/nr-uesoftmodem:/opt/oai-nr-ue/bin/nr-uesoftmodem
|
||||
- ../../../cmake_targets/ran_build/build/librfsimulator.so:/usr/local/lib/librfsimulator.so
|
||||
- ../../../crashdumps/:/cores/
|
||||
@@ -0,0 +1,45 @@
|
||||
services:
|
||||
build-ran-base:
|
||||
image: ran-base
|
||||
build:
|
||||
context: ../../../
|
||||
dockerfile: docker/Dockerfile.base.ubuntu22
|
||||
tags:
|
||||
- ran-base
|
||||
|
||||
build-ran-build:
|
||||
image: ran-build
|
||||
build:
|
||||
context: ../../../
|
||||
dockerfile: docker/Dockerfile.build.ubuntu22
|
||||
tags:
|
||||
- ran-build
|
||||
depends_on:
|
||||
build-ran-base:
|
||||
condition: service_completed_successfully
|
||||
|
||||
build-gnb-image:
|
||||
image: gnb-local
|
||||
build:
|
||||
context: ../../../
|
||||
dockerfile: docker/Dockerfile.gNB.ubuntu22
|
||||
tags:
|
||||
- gnb-local
|
||||
depends_on:
|
||||
build-ran-build:
|
||||
condition: service_completed_successfully
|
||||
entrypoint: ""
|
||||
command: echo "gnb-image built"
|
||||
|
||||
build-ue-image:
|
||||
image: ue-local
|
||||
build:
|
||||
context: ../../../
|
||||
dockerfile: docker/Dockerfile.nrUE.ubuntu22
|
||||
tags:
|
||||
- ue-local
|
||||
depends_on:
|
||||
build-ran-build:
|
||||
condition: service_completed_successfully
|
||||
entrypoint: ""
|
||||
command: echo "ue-image built"
|
||||
@@ -0,0 +1,13 @@
|
||||
services:
|
||||
rebuild-nr-softmodems:
|
||||
image: ran-build
|
||||
volumes:
|
||||
- ../../../:/oai-dir/
|
||||
command:
|
||||
bash -c "cd /oai-dir/ && mkdir -p cmake_targets/ran_build/build && cd cmake_targets/ran_build/build && cmake ../../../ -GNinja && cmake --build . --target nr-uesoftmodem rfsimulator nr-softmodem"
|
||||
entrypoint: ""
|
||||
depends_on:
|
||||
build-gnb-image:
|
||||
condition: service_completed_successfully
|
||||
build-ue-image:
|
||||
condition: service_completed_successfully
|
||||
@@ -614,7 +614,6 @@ check_install_oai_software() {
|
||||
gcc \
|
||||
gcc-c++ \
|
||||
git \
|
||||
atlas-devel \
|
||||
pkgconfig \
|
||||
libconfig-devel \
|
||||
libffi-devel \
|
||||
|
||||
@@ -644,16 +644,9 @@ int get_dmrs_port(int nl, uint16_t dmrs_ports)
|
||||
|
||||
frame_type_t get_frame_type(uint16_t current_band, uint8_t scs_index)
|
||||
{
|
||||
frame_type_t current_type;
|
||||
int32_t delta_duplex = get_delta_duplex(current_band, scs_index);
|
||||
|
||||
if (delta_duplex == 0)
|
||||
current_type = TDD;
|
||||
else
|
||||
current_type = FDD;
|
||||
|
||||
LOG_I(NR_MAC, "NR band %d, duplex mode %s, duplex spacing = %d KHz\n", current_band, duplex_mode[current_type], delta_duplex);
|
||||
|
||||
frame_type_t current_type = delta_duplex == 0 ? TDD : FDD;
|
||||
LOG_D(NR_MAC, "NR band %d, duplex mode %s, duplex spacing = %d KHz\n", current_band, duplex_mode[current_type], delta_duplex);
|
||||
return current_type;
|
||||
}
|
||||
|
||||
@@ -664,7 +657,7 @@ int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index)
|
||||
|
||||
int32_t delta_duplex = (nr_bandtable[nr_table_idx].ul_min - nr_bandtable[nr_table_idx].dl_min);
|
||||
|
||||
LOG_I(NR_MAC, "NR band duplex spacing is %d KHz (nr_bandtable[%d].band = %d)\n", delta_duplex, nr_table_idx, nr_bandtable[nr_table_idx].band);
|
||||
LOG_D(NR_MAC, "NR band duplex spacing is %d KHz (nr_bandtable[%d].band = %d)\n", delta_duplex, nr_table_idx, nr_bandtable[nr_table_idx].band);
|
||||
|
||||
return delta_duplex;
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
if (eL == TARGET->list.array[iJ]->FIELD) \
|
||||
break; \
|
||||
} \
|
||||
if (iJ == TARGET->list.count) \
|
||||
if (iJ < TARGET->list.count) \
|
||||
asn_sequence_del(&TARGET->list, iJ, 1); \
|
||||
else \
|
||||
LOG_E(NR_MAC, "Element not present in the list, impossible to release\n"); \
|
||||
|
||||
@@ -74,16 +74,11 @@ If DPDK library was installed into custom path, you have to point to the right d
|
||||
```
|
||||
export PKG_CONFIG_PATH=/opt/dpdk-t2/lib64/pkgconfig/:$PKG_CONFIG_PATH
|
||||
```
|
||||
## T2 card DPDK initialization
|
||||
Following lines in `openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c` file has to be
|
||||
modified based on your system requirements. By default, PCI address of the T2 card is set to 41:00.0 and cores 14 and 15 are assigned to the DPDK.
|
||||
```
|
||||
char *dpdk_dev = "41:00.0"; //PCI address of the card
|
||||
char *argv_re[] = {"bbdev", "-a", dpdk_dev, "-l", "14-15", "--file-prefix=b6", "--"};
|
||||
```
|
||||
For the DPDK EAL initialization, device is specified by `-a` option and list
|
||||
of cores to run the DPDK application on is selected by `-l` option. PCI adress of
|
||||
the T2 card can be detected by `lspci | grep "Xilinx"` command.
|
||||
## Setup of T2-related DPDK EAL parameters
|
||||
To configure T2-related DPDK Environment Abstraction Layer (EAL) parameters, you can set the following parameters via the command line:
|
||||
- `ldpc_offload.dpdk_dev` - **mandatory** parameter, specifies PCI address of the T2 card. PCI address of the T2 card can be detected by `lspci | grep "Xilinx"` command.
|
||||
- `ldpc_offload.dpdk_cores_list` - CPU cores assigned to DPDK for T2 processing, by default set to *11-12*. Ensure that the CPU cores specified in *ldpc_offload.dpdk_cores_list* are available and not used by other processes to avoid conflicts.
|
||||
- `ldpc_offload.dpdk_prefix` - DPDK shared data file prefix, by default set to *b6*
|
||||
|
||||
# OAI Build
|
||||
OTA deployment is precisely described in the following tutorial:
|
||||
@@ -118,7 +113,7 @@ Offload of the channel decoding to the T2 card is in nr_ulsim specified by *-o*
|
||||
cd ~/openairinterface5g
|
||||
source oaienv
|
||||
cd cmake_targets/ran_build/build
|
||||
sudo ./nr_ulsim -n100 -s20 -m20 -r273 -R273 -o
|
||||
sudo ./nr_ulsim -n100 -s20 -m20 -r273 -R273 -o --ldpc_offload.dpdk_dev 01:00.0
|
||||
```
|
||||
## nr_dlsim test
|
||||
Offload of the channel encoding to the AMD Xilinx T2 card is in nr_dlsim specified by *-c* option. Example command for running nr_dlsim with LDPC encoding offload to the T2 card:
|
||||
@@ -126,7 +121,7 @@ Offload of the channel encoding to the AMD Xilinx T2 card is in nr_dlsim specifi
|
||||
cd ~/openairinterface5g
|
||||
source oaienv
|
||||
cd cmake_targets/ran_build/build
|
||||
sudo ./nr_dlsim -n300 -s30 -R 106 -e 27 -c
|
||||
sudo ./nr_dlsim -n300 -s30 -R 106 -e 27 -c --ldpc_offload.dpdk_dev 01:00.0
|
||||
```
|
||||
|
||||
# OTA test
|
||||
@@ -137,7 +132,7 @@ Offload of the channel encoding and decoding to the AMD Xilinx T2 card is enable
|
||||
cd ~/openairinterface5g
|
||||
source oaienv
|
||||
cd cmake_targets/ran_build/build
|
||||
sudo ./nr-softmodem --sa -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --ldpc-offload-enable
|
||||
sudo ./nr-softmodem --sa -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --ldpc-offload-enable --ldpc_offload.dpdk_dev 01:00.0
|
||||
```
|
||||
|
||||
# Limitations
|
||||
|
||||
@@ -211,13 +211,13 @@ CREATE TABLE `SessionManagementSubscriptionData` (
|
||||
--
|
||||
|
||||
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
||||
('001010000000001', '00101', '{\"sst\": 1, \"sd\": \"16777215\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.101\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
('001010000000001', '00101', '{\"sst\": 1, \"sd\": \"FFFFFF\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"10.0.0.2\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
||||
('001010000000002', '00101', '{\"sst\": 1, \"sd\": \"16777215\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.102\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
('001010000000002', '00101', '{\"sst\": 1, \"sd\": \"FFFFFF\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"10.0.0.3\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
||||
('001010000000003', '00101', '{\"sst\": 1, \"sd\": \"16777215\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.103\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
('001010000000003', '00101', '{\"sst\": 1, \"sd\": \"FFFFFF\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"10.0.0.4\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
||||
('001010000000004', '00101', '{\"sst\": 1, \"sd\": \"16777215\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.104\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
('001010000000004', '00101', '{\"sst\": 1, \"sd\": \"FFFFFF\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"10.0.0.5\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
|
||||
@@ -56,7 +56,6 @@ RUN apt-get update && \
|
||||
tzdata \
|
||||
xxd \
|
||||
# ARM64 packages
|
||||
libatlas-base-dev:arm64 \
|
||||
libblas-dev:arm64 \
|
||||
liblapack-dev:arm64 \
|
||||
liblapacke-dev:arm64 \
|
||||
|
||||
@@ -39,4 +39,8 @@ RUN /bin/sh oaienv && \
|
||||
--eNB --gNB --RU --UE --nrUE \
|
||||
--build-lib "telnetsrv enbscope uescope nrscope" \
|
||||
-w USRP -t Ethernet \
|
||||
--noavx512
|
||||
--noavx512 && \
|
||||
echo "---- ldd on executables ----" && \
|
||||
ldd ran_build/build/*softmodem* ran_build/build/nr-cuup ran_build/build/oairu && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd ran_build/build/*.so
|
||||
|
||||
@@ -44,4 +44,7 @@ RUN /bin/sh oaienv && \
|
||||
--noavx512 \
|
||||
--cmake-opt -DCMAKE_C_FLAGS="-Werror" --cmake-opt -DCMAKE_CXX_FLAGS="-Werror" $BUILD_OPTION && \
|
||||
# Mainly to see if the sanitize option was perfectly executed
|
||||
ldd ran_build/build/nr-softmodem
|
||||
echo "---- ldd on executables ----" && \
|
||||
ldd ran_build/build/*softmodem* ran_build/build/nr-cuup ran_build/build/oairu && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd ran_build/build/*.so
|
||||
|
||||
@@ -39,8 +39,8 @@ RUN dnf update -y && \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
procps-ng \
|
||||
atlas \
|
||||
gdb \
|
||||
libusbx \
|
||||
python3 \
|
||||
python3-pip \
|
||||
net-tools \
|
||||
@@ -71,10 +71,6 @@ COPY --from=enb-build \
|
||||
|
||||
COPY --from=enb-base \
|
||||
/lib64/libconfig.so.11 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/libcblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/libboost_chrono.so.1.75.0 \
|
||||
/lib64/libboost_date_time.so.1.75.0 \
|
||||
/lib64/libboost_filesystem.so.1.75.0 \
|
||||
@@ -102,8 +98,20 @@ COPY --from=enb-base /usr/local/share/uhd/rfnoc/ .
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
/bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so /usr/local/lib/liboai_transpro.so" && \
|
||||
ldconfig
|
||||
|
||||
ldconfig && \
|
||||
echo "---- ldd on executable lte-softmodem ----" && \
|
||||
ldd /opt/oai-enb/bin/lte-softmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/liboai_iqplayer.so \
|
||||
/usr/local/lib/libtelnetsrv.so \
|
||||
/usr/local/lib/libtelnetsrv_enb.so \
|
||||
/usr/local/lib64/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-enb
|
||||
|
||||
|
||||
+14
-15
@@ -40,8 +40,8 @@ RUN dnf update -y && \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
procps-ng \
|
||||
atlas \
|
||||
gdb \
|
||||
libusbx \
|
||||
python3 \
|
||||
python3-pip \
|
||||
net-tools \
|
||||
@@ -72,10 +72,6 @@ COPY --from=enb-build \
|
||||
|
||||
COPY --from=enb-base \
|
||||
/lib64/libconfig.so.11 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/libcblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/libboost_chrono.so.1.75.0 \
|
||||
/lib64/libboost_date_time.so.1.75.0 \
|
||||
/lib64/libboost_filesystem.so.1.75.0 \
|
||||
@@ -104,16 +100,19 @@ COPY --from=enb-base /usr/local/share/uhd/rfnoc/ .
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
/bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so /usr/local/lib/liboai_transpro.so" && \
|
||||
ldconfig && \
|
||||
echo "ldd on lte-softmodem" && ldd /opt/oai-enb/bin/lte-softmodem && \
|
||||
echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
||||
echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
|
||||
echo "ldd on liboai_usrpdevif.so" && ldd /usr/local/lib/liboai_usrpdevif.so && \
|
||||
echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
|
||||
echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
|
||||
echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
|
||||
echo "ldd on liboai_iqplayer.so" && ldd /usr/local/lib/liboai_iqplayer.so && \
|
||||
echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so && \
|
||||
echo "ldd on libtelnetsrv_enb.so" && ldd /usr/local/lib/libtelnetsrv_enb.so
|
||||
echo "---- ldd on executable lte-softmodem ----" && \
|
||||
ldd /opt/oai-enb/bin/lte-softmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/liboai_iqplayer.so \
|
||||
/usr/local/lib/libtelnetsrv.so \
|
||||
/usr/local/lib/libtelnetsrv_enb.so \
|
||||
/usr/local/lib64/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-enb
|
||||
|
||||
|
||||
@@ -52,7 +52,6 @@ RUN apt-get update && \
|
||||
libboost-program-options1.74.0 \
|
||||
tzdata \
|
||||
libblas3 \
|
||||
libatlas3-base \
|
||||
libconfig9 \
|
||||
openssl \
|
||||
net-tools \
|
||||
@@ -111,7 +110,18 @@ COPY --from=enb-base /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
/bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so /usr/local/lib/liboai_transpro.so" && \
|
||||
ldconfig && \
|
||||
ldd /opt/oai-enb/bin/lte-softmodem
|
||||
echo "---- ldd on lte-softmodem ----" && \
|
||||
ldd /opt/oai-enb/bin/lte-softmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/liboai_iqplayer.so \
|
||||
/usr/local/lib/libtelnetsrv.so \
|
||||
/usr/local/lib/libtelnetsrv_enb.so \
|
||||
/usr/local/lib/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-enb
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ RUN apt-get update && \
|
||||
procps \
|
||||
libsctp1 \
|
||||
tzdata \
|
||||
libatlas3-base \
|
||||
libblas3 \
|
||||
libconfig9 \
|
||||
openssl \
|
||||
net-tools \
|
||||
@@ -95,6 +95,14 @@ COPY --from=ran-build \
|
||||
/usr/local/lib/libnvipc.so \
|
||||
/usr/local/lib/
|
||||
|
||||
RUN ldconfig && \
|
||||
echo "---- ldd on nr-softmodem ----" && \
|
||||
ldd /opt/oai-gnb/bin/nr-softmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libfmtlog-shared.so \
|
||||
/usr/local/lib/libnvlog.so \
|
||||
/usr/local/lib/libnvipc.so
|
||||
|
||||
WORKDIR /opt/oai-gnb
|
||||
COPY --from=ran-build /tini /tini
|
||||
|
||||
@@ -69,7 +69,7 @@ RUN apt-get update && \
|
||||
procps \
|
||||
libsctp1 \
|
||||
tzdata \
|
||||
libatlas3-base \
|
||||
libblas3 \
|
||||
libconfig9 \
|
||||
openssl \
|
||||
net-tools \
|
||||
@@ -77,6 +77,7 @@ RUN apt-get update && \
|
||||
iproute2 \
|
||||
iputils-ping \
|
||||
gdb \
|
||||
moreutils \
|
||||
libusb-1.0-0 && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
@@ -100,6 +101,14 @@ COPY --from=ran-build \
|
||||
/usr/local/lib/libnvipc.so \
|
||||
/usr/local/lib/
|
||||
|
||||
RUN ldconfig && \
|
||||
echo "---- ldd on nr-softmodem ----" && \
|
||||
ldd /opt/oai-gnb/bin/nr-softmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libfmtlog-shared.so \
|
||||
/usr/local/lib/libnvlog.so \
|
||||
/usr/local/lib/libnvipc.so
|
||||
|
||||
WORKDIR /opt/oai-gnb
|
||||
COPY --from=ran-build /tini /tini
|
||||
|
||||
@@ -46,7 +46,6 @@ RUN dnf update -y && \
|
||||
procps-ng \
|
||||
libXpm \
|
||||
libX11 \
|
||||
atlas \
|
||||
gdb \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
@@ -75,15 +74,22 @@ COPY --from=gnb-build \
|
||||
COPY --from=gnb-base \
|
||||
/lib64/libconfig.so.11 \
|
||||
/lib64/libforms.so.2 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/libcblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/
|
||||
|
||||
RUN ln -s /usr/local/lib/libaw2sori_transpro.so /usr/local/lib/libthirdparty_transpro.so && \
|
||||
ln -s /usr/local/lib/liboai_eth_transpro.so /usr/local/lib/liboai_transpro.so && \
|
||||
ldconfig
|
||||
ldconfig && \
|
||||
echo "---- ldd on executable nr-softmodem ----" && \
|
||||
ldd /opt/oai-gnb-aw2s/bin/nr-softmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/libaw2sori_transpro.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libldpc*.so \
|
||||
/usr/local/lib/libtelnetsrv.so
|
||||
|
||||
WORKDIR /opt/oai-gnb-aw2s
|
||||
|
||||
|
||||
@@ -47,7 +47,6 @@ RUN dnf update -y && \
|
||||
procps-ng \
|
||||
libXpm \
|
||||
libX11 \
|
||||
atlas \
|
||||
gdb \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
@@ -76,23 +75,22 @@ COPY --from=gnb-build \
|
||||
COPY --from=gnb-base \
|
||||
/lib64/libconfig.so.11 \
|
||||
/lib64/libforms.so.2 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/libcblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/
|
||||
|
||||
RUN ln -s /usr/local/lib/libaw2sori_transpro.so /usr/local/lib/libthirdparty_transpro.so && \
|
||||
ln -s /usr/local/lib/liboai_eth_transpro.so /usr/local/lib/liboai_transpro.so && \
|
||||
ldconfig && \
|
||||
echo "ldd on nr-softmodem" && ldd /opt/oai-gnb-aw2s/bin/nr-softmodem && \
|
||||
echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
||||
echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
|
||||
echo "ldd on libthirdparty_transpro.so" && ldd /usr/local/lib/libthirdparty_transpro.so && \
|
||||
echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
|
||||
echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
|
||||
echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
|
||||
echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so
|
||||
echo "---- ldd on executable nr-softmodem ----" && \
|
||||
ldd /opt/oai-gnb-aw2s/bin/nr-softmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/libaw2sori_transpro.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libldpc*.so \
|
||||
/usr/local/lib/libtelnetsrv.so
|
||||
|
||||
WORKDIR /opt/oai-gnb-aw2s
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ RUN apt-get update && \
|
||||
libsctp1 \
|
||||
tzdata \
|
||||
libblas3 \
|
||||
libatlas3-base \
|
||||
libc6 \
|
||||
libconfig9 \
|
||||
gdb \
|
||||
openssl \
|
||||
@@ -78,7 +78,18 @@ COPY --from=gnb-build \
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/libaw2sori_transpro.so /usr/local/lib/libthirdparty_transpro.so" && \
|
||||
/bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so /usr/local/lib/liboai_transpro.so" && \
|
||||
ldconfig
|
||||
ldconfig && \
|
||||
echo "---- ldd on nr-softmodem ----" && \
|
||||
ldd /opt/oai-gnb-aw2s/bin/nr-softmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/libaw2sori_transpro.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libldpc*.so \
|
||||
/usr/local/lib/libtelnetsrv.so
|
||||
|
||||
WORKDIR /opt/oai-gnb-aw2s
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ RUN dnf update -y && \
|
||||
procps-ng \
|
||||
libXpm \
|
||||
libX11 \
|
||||
atlas \
|
||||
libusbx \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
gdb \
|
||||
@@ -72,10 +72,6 @@ COPY --from=gnb-build \
|
||||
COPY --from=gnb-base \
|
||||
/lib64/libconfig.so.11 \
|
||||
/lib64/libforms.so.2 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/libcblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/libboost_chrono.so.1.75.0 \
|
||||
/lib64/libboost_date_time.so.1.75.0 \
|
||||
/lib64/libboost_filesystem.so.1.75.0 \
|
||||
@@ -101,7 +97,20 @@ WORKDIR /usr/local/share/uhd/rfnoc
|
||||
COPY --from=gnb-base /usr/local/share/uhd/rfnoc/ .
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig
|
||||
ldconfig && \
|
||||
echo "---- ldd on executable nr-softmodem ----" && \
|
||||
ldd /opt/oai-gnb/bin/nr-softmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libldpc*.so \
|
||||
/usr/local/lib/libtelnetsrv.so \
|
||||
/usr/local/lib/libtelnetsrv_ci.so \
|
||||
/usr/local/lib64/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-gnb
|
||||
#EXPOSE 2152/udp # S1U, GTP/UDP
|
||||
|
||||
+14
-14
@@ -40,7 +40,7 @@ RUN dnf update -y && \
|
||||
procps-ng \
|
||||
libXpm \
|
||||
libX11 \
|
||||
atlas \
|
||||
libusbx \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
gdb \
|
||||
@@ -73,10 +73,6 @@ COPY --from=gnb-build \
|
||||
COPY --from=gnb-base \
|
||||
/lib64/libconfig.so.11 \
|
||||
/lib64/libforms.so.2 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/libcblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/libboost_chrono.so.1.75.0 \
|
||||
/lib64/libboost_date_time.so.1.75.0 \
|
||||
/lib64/libboost_filesystem.so.1.75.0 \
|
||||
@@ -103,15 +99,19 @@ COPY --from=gnb-base /usr/local/share/uhd/rfnoc/ .
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig && \
|
||||
echo "ldd on nr-softmodem" && ldd /opt/oai-gnb/bin/nr-softmodem && \
|
||||
echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
||||
echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
|
||||
echo "ldd on liboai_usrpdevif.so" && ldd /usr/local/lib/liboai_usrpdevif.so && \
|
||||
echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
|
||||
echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
|
||||
echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
|
||||
echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so && \
|
||||
echo "ldd on libtelnetsrv_ci.so" && ldd /usr/local/lib/libtelnetsrv_ci.so
|
||||
echo "---- ldd on executable nr-softmodem ----" && \
|
||||
ldd /opt/oai-gnb/bin/nr-softmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libldpc*.so \
|
||||
/usr/local/lib/libtelnetsrv.so \
|
||||
/usr/local/lib/libtelnetsrv_ci.so \
|
||||
/usr/local/lib64/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-gnb
|
||||
#EXPOSE 2152/udp # S1U, GTP/UDP
|
||||
|
||||
@@ -52,7 +52,6 @@ RUN apt-get update && \
|
||||
libboost-program-options1.74.0 \
|
||||
tzdata \
|
||||
libblas3 \
|
||||
libatlas3-base \
|
||||
libconfig9 \
|
||||
openssl \
|
||||
net-tools \
|
||||
@@ -103,7 +102,19 @@ COPY --from=gnb-base /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig && \
|
||||
ldd /opt/oai-gnb/bin/nr-softmodem
|
||||
echo "---- ldd on nr-softmodem ----" && \
|
||||
ldd /opt/oai-gnb/bin/nr-softmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libldpc*.so \
|
||||
/usr/local/lib/libtelnetsrv.so \
|
||||
/usr/local/lib/libtelnetsrv_ci.so \
|
||||
/usr/local/lib/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-gnb
|
||||
#EXPOSE 2152/udp # S1U, GTP/UDP
|
||||
|
||||
@@ -38,7 +38,7 @@ RUN dnf update -y && \
|
||||
dnf install -y \
|
||||
tzdata \
|
||||
procps-ng \
|
||||
atlas \
|
||||
libusbx \
|
||||
gdb \
|
||||
python3 \
|
||||
python3-pip \
|
||||
@@ -65,10 +65,6 @@ COPY --from=ru-build \
|
||||
|
||||
COPY --from=ru-base \
|
||||
/lib64/libconfig.so.11 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/libcblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/libboost_chrono.so.1.75.0 \
|
||||
/lib64/libboost_date_time.so.1.75.0 \
|
||||
/lib64/libboost_filesystem.so.1.75.0 \
|
||||
@@ -91,7 +87,16 @@ WORKDIR /usr/local/share/uhd/rfnoc
|
||||
COPY --from=ru-base /usr/local/share/uhd/rfnoc/ .
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig
|
||||
ldconfig && \
|
||||
echo "---- ldd on executable oairu ----" && \
|
||||
ldd /opt/oai-lte-ru/bin/oairu && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib64/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-lte-ru
|
||||
|
||||
|
||||
@@ -42,7 +42,6 @@ RUN apt-get update && \
|
||||
procps \
|
||||
software-properties-common \
|
||||
libblas3 \
|
||||
libatlas3-base \
|
||||
libconfig9 \
|
||||
net-tools \
|
||||
gdb \
|
||||
@@ -83,7 +82,16 @@ COPY --from=ru-base \
|
||||
/usr/lib/x86_64-linux-gnu/
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig
|
||||
ldconfig && \
|
||||
echo "---- ldd on oairu ----" && \
|
||||
ldd /opt/oai-lte-ru/bin/oairu && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-lte-ru
|
||||
|
||||
|
||||
@@ -39,7 +39,8 @@ RUN dnf update -y && \
|
||||
lksctp-tools \
|
||||
procps-ng \
|
||||
tzdata \
|
||||
atlas \
|
||||
libusbx \
|
||||
libgfortran \
|
||||
gdb \
|
||||
python3 \
|
||||
python3-pip \
|
||||
@@ -101,7 +102,18 @@ WORKDIR /usr/local/share/uhd/rfnoc
|
||||
COPY --from=lte-ue-base /usr/local/share/uhd/rfnoc/ .
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig
|
||||
ldconfig && \
|
||||
echo "---- ldd on executable lte-uesoftmodem ----" && \
|
||||
ldd /opt/oai-lte-ue/bin/lte-uesoftmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libtelnetsrv.so \
|
||||
/usr/local/lib64/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-lte-ue
|
||||
COPY --from=lte-ue-base /tini /tini
|
||||
|
||||
@@ -40,7 +40,8 @@ RUN dnf update -y && \
|
||||
lksctp-tools \
|
||||
procps-ng \
|
||||
tzdata \
|
||||
atlas \
|
||||
libusbx \
|
||||
libgfortran \
|
||||
gdb \
|
||||
python3 \
|
||||
python3-pip \
|
||||
@@ -103,17 +104,17 @@ COPY --from=lte-ue-base /usr/local/share/uhd/rfnoc/ .
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig && \
|
||||
echo "ldd on lte-uesoftmodem" && ldd /opt/oai-lte-ue/bin/lte-uesoftmodem && \
|
||||
echo "ldd on conf2uedata" && ldd /opt/oai-lte-ue/bin/conf2uedata && \
|
||||
echo "ldd on nvram" && ldd /opt/oai-lte-ue/bin/nvram && \
|
||||
echo "ldd on usim" && ldd /opt/oai-lte-ue/bin/usim && \
|
||||
echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
||||
echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
|
||||
echo "ldd on liboai_usrpdevif.so" && ldd /usr/local/lib/liboai_usrpdevif.so && \
|
||||
echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
|
||||
echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
|
||||
echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
|
||||
echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so
|
||||
echo "---- ldd on executable lte-uesoftmodem ----" && \
|
||||
ldd /opt/oai-lte-ue/bin/lte-uesoftmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libtelnetsrv.so \
|
||||
/usr/local/lib64/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-lte-ue
|
||||
COPY --from=lte-ue-base /tini /tini
|
||||
|
||||
@@ -52,7 +52,7 @@ RUN apt-get update && \
|
||||
libboost-program-options1.74.0 \
|
||||
tzdata \
|
||||
liblapacke \
|
||||
libatlas3-base \
|
||||
libblas3 \
|
||||
libconfig9 \
|
||||
openssl \
|
||||
net-tools \
|
||||
@@ -112,7 +112,17 @@ COPY --from=lte-ue-base /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/o
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig && \
|
||||
ldd /opt/oai-lte-ue/bin/lte-uesoftmodem
|
||||
echo "---- ldd on lte-uesoftmodem ----" && \
|
||||
ldd /opt/oai-lte-ue/bin/lte-uesoftmodem && \
|
||||
echo "---- ldd on shared librarues ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libtelnetsrv.so \
|
||||
/usr/local/lib/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-lte-ue
|
||||
COPY --from=lte-ue-base /tini /tini
|
||||
|
||||
@@ -41,7 +41,6 @@ RUN yum repolist --disablerepo=* && \
|
||||
procps-ng \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
atlas \
|
||||
net-tools \
|
||||
iputils && \
|
||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||
@@ -60,10 +59,6 @@ COPY --from=gnb-build \
|
||||
|
||||
COPY --from=gnb-base \
|
||||
/lib64/libconfig.so.11 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/libcblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/
|
||||
|
||||
RUN ldconfig && \
|
||||
|
||||
@@ -42,7 +42,6 @@ RUN yum repolist --disablerepo=* && \
|
||||
procps-ng \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
atlas \
|
||||
net-tools \
|
||||
iputils && \
|
||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||
@@ -61,10 +60,6 @@ COPY --from=gnb-build \
|
||||
|
||||
COPY --from=gnb-base \
|
||||
/lib64/libconfig.so.11 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/libcblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/
|
||||
|
||||
RUN ldconfig && \
|
||||
|
||||
@@ -42,7 +42,7 @@ RUN dnf update -y && \
|
||||
net-tools \
|
||||
iputils \
|
||||
iproute \
|
||||
atlas \
|
||||
libusbx \
|
||||
gdb \
|
||||
python3 \
|
||||
python3-pip \
|
||||
@@ -74,10 +74,6 @@ COPY --from=nr-ue-build \
|
||||
|
||||
COPY --from=nr-ue-base \
|
||||
/lib64/libconfig.so.11 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/libcblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/libforms.so.2 \
|
||||
/lib64/libboost_chrono.so.1.75.0 \
|
||||
/lib64/libboost_date_time.so.1.75.0 \
|
||||
@@ -104,8 +100,20 @@ WORKDIR /usr/local/share/uhd/rfnoc
|
||||
COPY --from=nr-ue-base /usr/local/share/uhd/rfnoc/ .
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig
|
||||
|
||||
ldconfig && \
|
||||
echo "---- ldd on executable nr-uesoftmodem ----" && \
|
||||
ldd /opt/oai-nr-ue/bin/nr-uesoftmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libldpc*.so \
|
||||
/usr/local/lib/libtelnetsrv.so \
|
||||
/usr/local/lib/libtelnetsrv_5Gue.so \
|
||||
/usr/local/lib64/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-nr-ue
|
||||
COPY --from=nr-ue-base /tini /tini
|
||||
|
||||
@@ -43,7 +43,7 @@ RUN dnf update -y && \
|
||||
net-tools \
|
||||
iputils \
|
||||
iproute \
|
||||
atlas \
|
||||
libusbx \
|
||||
gdb \
|
||||
python3 \
|
||||
python3-pip \
|
||||
@@ -75,10 +75,6 @@ COPY --from=nr-ue-build \
|
||||
|
||||
COPY --from=nr-ue-base \
|
||||
/lib64/libconfig.so.11 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/libcblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/libforms.so.2 \
|
||||
/lib64/libboost_chrono.so.1.75.0 \
|
||||
/lib64/libboost_date_time.so.1.75.0 \
|
||||
@@ -106,15 +102,19 @@ COPY --from=nr-ue-base /usr/local/share/uhd/rfnoc/ .
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig && \
|
||||
echo "ldd on nr-uesoftmodem" && ldd /opt/oai-nr-ue/bin/nr-uesoftmodem && \
|
||||
echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
||||
echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
|
||||
echo "ldd on liboai_usrpdevif.so" && ldd /usr/local/lib/liboai_usrpdevif.so && \
|
||||
echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
|
||||
echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
|
||||
echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
|
||||
echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so && \
|
||||
echo "ldd on libtelnetsrv_5Gue.so" && ldd /usr/local/lib/libtelnetsrv_5Gue.so
|
||||
echo "---- ldd on executable nr-uesoftmodem ----" && \
|
||||
ldd /opt/oai-nr-ue/bin/nr-uesoftmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libldpc*.so \
|
||||
/usr/local/lib/libtelnetsrv.so \
|
||||
/usr/local/lib/libtelnetsrv_5Gue.so \
|
||||
/usr/local/lib64/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-nr-ue
|
||||
COPY --from=nr-ue-base /tini /tini
|
||||
|
||||
@@ -52,7 +52,7 @@ RUN apt-get update && \
|
||||
libboost-program-options1.74.0 \
|
||||
tzdata \
|
||||
liblapacke \
|
||||
libatlas3-base \
|
||||
libblas3 \
|
||||
libconfig9 \
|
||||
openssl \
|
||||
net-tools \
|
||||
@@ -106,7 +106,20 @@ COPY --from=nr-ue-base /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oa
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig && \
|
||||
ldd /opt/oai-nr-ue/bin/nr-uesoftmodem
|
||||
echo "---- ldd on nr-uesoftmodem ----" && \
|
||||
ldd /opt/oai-nr-ue/bin/nr-uesoftmodem && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||
/usr/local/lib/librfsimulator.so \
|
||||
/usr/local/lib/liboai_usrpdevif.so \
|
||||
/usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libparams_libconfig.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libldpc*.so \
|
||||
/usr/local/lib/libtelnetsrv.so \
|
||||
/usr/local/lib/libtelnetsrv_ciUE.so \
|
||||
/usr/local/lib/libtelnetsrv_5Gue.so \
|
||||
/usr/local/lib/libuhd.so.4.4.0
|
||||
|
||||
WORKDIR /opt/oai-nr-ue
|
||||
COPY --from=nr-ue-base /tini /tini
|
||||
|
||||
@@ -47,7 +47,7 @@ RUN dnf update -y && \
|
||||
dnf install -y \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
atlas \
|
||||
libgfortran \
|
||||
hostname \
|
||||
sudo \
|
||||
procps-ng \
|
||||
@@ -94,7 +94,25 @@ COPY --from=phy-sim-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc*.so \
|
||||
/usr/local/lib/
|
||||
|
||||
RUN ldconfig
|
||||
RUN ldconfig && \
|
||||
echo "---- ldd on physim executables ----" && \
|
||||
ldd /opt/oai-physim/bin/dlsim \
|
||||
/opt/oai-physim/bin/nr_dlsim \
|
||||
/opt/oai-physim/bin/nr_prachsim \
|
||||
/opt/oai-physim/bin/nr_ulschsim \
|
||||
/opt/oai-physim/bin/polartest \
|
||||
/opt/oai-physim/bin/ulsim \
|
||||
/opt/oai-physim/bin/ldpctest \
|
||||
/opt/oai-physim/bin/nr_dlschsim \
|
||||
/opt/oai-physim/bin/nr_pbchsim \
|
||||
/opt/oai-physim/bin/nr_psbchsim \
|
||||
/opt/oai-physim/bin/nr_pucchsim \
|
||||
/opt/oai-physim/bin/nr_ulsim \
|
||||
/opt/oai-physim/bin/smallblocktest && \
|
||||
echo "---- ldd on shared libraries ----" && \
|
||||
ldd /usr/local/lib/libcoding.so \
|
||||
/usr/local/lib/libdfts.so \
|
||||
/usr/local/lib/libldpc*.so
|
||||
|
||||
# Copy some executables
|
||||
WORKDIR /usr/bin/
|
||||
|
||||
+14
-19
@@ -146,7 +146,7 @@ void init_nr_ue_vars(PHY_VARS_NR_UE *ue,
|
||||
int nb_connected_gNB = 1;
|
||||
|
||||
ue->Mod_id = UE_id;
|
||||
ue->if_inst = nr_ue_if_module_init(0);
|
||||
ue->if_inst = nr_ue_if_module_init(UE_id);
|
||||
ue->dci_thres = 0;
|
||||
ue->target_Nid_cell = -1;
|
||||
|
||||
@@ -416,7 +416,7 @@ static void RU_write(nr_rxtx_thread_data_t *rxtxD, bool sl_tx_action)
|
||||
|
||||
radio_tx_burst_flag_t flags = TX_BURST_INVALID;
|
||||
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(UE->Mod_id);
|
||||
if (mac->phy_config_request_sent &&
|
||||
openair0_cfg[0].duplex_mode == duplex_mode_TDD &&
|
||||
!get_softmodem_params()->continuous_tx) {
|
||||
@@ -769,7 +769,7 @@ void *UE_thread(void *arg)
|
||||
initNotifiedFIFO_nothreadSafe(&freeBlocks);
|
||||
|
||||
int timing_advance = UE->timing_advance;
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(UE->Mod_id);
|
||||
|
||||
bool syncRunning = false;
|
||||
const int nb_slot_frame = fp->slots_per_frame;
|
||||
@@ -998,27 +998,22 @@ void init_NR_UE(int nb_inst, char *uecap_file, char *reconfig_file, char *rbconf
|
||||
mac->if_module = nr_ue_if_module_init(i);
|
||||
AssertFatal(mac->if_module, "can not initialize IF module\n");
|
||||
if (!get_softmodem_params()->sa || !get_softmodem_params()->sl_mode) {
|
||||
init_nsa_message(rrc_inst, reconfig_file, rbconfig_file);
|
||||
nr_rlc_activate_srb0(mac_inst->crnti, NULL, send_srb0_rrc);
|
||||
init_nsa_message(&rrc_inst[i], reconfig_file, rbconfig_file);
|
||||
nr_rlc_activate_srb0(mac_inst[i].crnti, NULL, send_srb0_rrc);
|
||||
}
|
||||
//TODO: Move this call to RRC
|
||||
start_sidelink((&rrc_inst[i])->ue_id);
|
||||
}
|
||||
}
|
||||
|
||||
void init_NR_UE_threads(int nb_inst) {
|
||||
int inst;
|
||||
|
||||
pthread_t threads[nb_inst];
|
||||
|
||||
for (inst=0; inst < nb_inst; inst++) {
|
||||
PHY_VARS_NR_UE *UE = PHY_vars_UE_g[inst][0];
|
||||
|
||||
LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]);
|
||||
threadCreate(&threads[inst], UE_thread, (void *)UE, "UEthread", -1, OAI_PRIORITY_RT_MAX);
|
||||
if (!IS_SOFTMODEM_NOSTATS_BIT) {
|
||||
pthread_t stat_pthread;
|
||||
threadCreate(&stat_pthread, nrL1_UE_stats_thread, UE, "L1_UE_stats", -1, OAI_PRIORITY_RT_LOW);
|
||||
}
|
||||
void init_NR_UE_threads(PHY_VARS_NR_UE *UE) {
|
||||
pthread_t thread;
|
||||
char thread_name[16];
|
||||
sprintf(thread_name, "UEthread_%d", UE->Mod_id);
|
||||
threadCreate(&thread, UE_thread, (void *)UE, thread_name, -1, OAI_PRIORITY_RT_MAX);
|
||||
if (!IS_SOFTMODEM_NOSTATS_BIT) {
|
||||
pthread_t stat_pthread;
|
||||
sprintf(thread_name, "L1_UE_stats_%d", UE->Mod_id);
|
||||
threadCreate(&stat_pthread, nrL1_UE_stats_thread, UE, thread_name, -1, OAI_PRIORITY_RT_LOW);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -286,6 +286,7 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
|
||||
UE->rf_map.card = card_offset;
|
||||
UE->rf_map.chain = CC_id + chain_offset;
|
||||
UE->max_ldpc_iterations = nrUE_params.max_ldpc_iterations;
|
||||
UE->ldpc_offload_enable = nrUE_params.ldpc_offload_flag;
|
||||
UE->UE_scan_carrier = nrUE_params.UE_scan_carrier;
|
||||
UE->UE_fo_compensation = nrUE_params.UE_fo_compensation;
|
||||
UE->if_freq = nrUE_params.if_freq;
|
||||
@@ -490,7 +491,11 @@ int main(int argc, char **argv)
|
||||
cpuf=get_cpu_freq_GHz();
|
||||
itti_init(TASK_MAX, tasks_info);
|
||||
|
||||
init_opt() ;
|
||||
init_opt();
|
||||
|
||||
if (nrUE_params.ldpc_offload_flag)
|
||||
load_LDPClib("_t2", &ldpc_interface_offload);
|
||||
|
||||
load_LDPClib(NULL, &ldpc_interface);
|
||||
|
||||
if (ouput_vcd) {
|
||||
@@ -502,11 +507,13 @@ int main(int argc, char **argv)
|
||||
// strdup to put the sring in the core file for post mortem identification
|
||||
LOG_I(HW, "Version: %s\n", strdup(PACKAGE_VERSION));
|
||||
|
||||
PHY_vars_UE_g = malloc(sizeof(*PHY_vars_UE_g));
|
||||
PHY_vars_UE_g[0] = malloc(sizeof(*PHY_vars_UE_g[0]) * MAX_NUM_CCs);
|
||||
for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||
PHY_vars_UE_g[0][CC_id] = malloc(sizeof(*PHY_vars_UE_g[0][CC_id]));
|
||||
memset(PHY_vars_UE_g[0][CC_id], 0, sizeof(*PHY_vars_UE_g[0][CC_id]));
|
||||
PHY_vars_UE_g = malloc(sizeof(*PHY_vars_UE_g) * NB_UE_INST);
|
||||
for (int inst = 0; inst < NB_UE_INST; inst++) {
|
||||
PHY_vars_UE_g[inst] = malloc(sizeof(*PHY_vars_UE_g[inst]) * MAX_NUM_CCs);
|
||||
for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||
PHY_vars_UE_g[inst][CC_id] = malloc(sizeof(*PHY_vars_UE_g[inst][CC_id]));
|
||||
memset(PHY_vars_UE_g[inst][CC_id], 0, sizeof(*PHY_vars_UE_g[inst][CC_id]));
|
||||
}
|
||||
}
|
||||
|
||||
int mode_offset = get_softmodem_params()->nsa ? NUMBER_OF_UE_MAX : 1;
|
||||
@@ -536,49 +543,51 @@ int main(int argc, char **argv)
|
||||
start_oai_nrue_threads();
|
||||
|
||||
if (!get_softmodem_params()->emulate_l1) {
|
||||
PHY_VARS_NR_UE *UE[MAX_NUM_CCs];
|
||||
for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||
UE[CC_id] = PHY_vars_UE_g[0][CC_id];
|
||||
for (int inst = 0; inst < NB_UE_INST; inst++) {
|
||||
PHY_VARS_NR_UE *UE[MAX_NUM_CCs];
|
||||
for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||
UE[CC_id] = PHY_vars_UE_g[inst][CC_id];
|
||||
|
||||
set_options(CC_id, UE[CC_id]);
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||
set_options(CC_id, UE[CC_id]);
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(inst);
|
||||
|
||||
if (get_softmodem_params()->sa || get_softmodem_params()->sl_mode) { // set frame config to initial values from command line
|
||||
// and assume that the SSB is centered on the grid
|
||||
uint16_t nr_band = get_softmodem_params()->band;
|
||||
mac->nr_band = nr_band;
|
||||
mac->ssb_start_subcarrier = UE[CC_id]->frame_parms.ssb_start_subcarrier;
|
||||
nr_init_frame_parms_ue_sa(&UE[CC_id]->frame_parms,
|
||||
downlink_frequency[CC_id][0],
|
||||
uplink_frequency_offset[CC_id][0],
|
||||
get_softmodem_params()->numerology,
|
||||
nr_band);
|
||||
} else {
|
||||
DevAssert(mac->if_module != NULL && mac->if_module->phy_config_request != NULL);
|
||||
mac->if_module->phy_config_request(&mac->phy_config);
|
||||
mac->phy_config_request_sent = true;
|
||||
fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config;
|
||||
if (get_softmodem_params()->sa || get_softmodem_params()->sl_mode) { // set frame config to initial values from command line
|
||||
// and assume that the SSB is centered on the grid
|
||||
uint16_t nr_band = get_softmodem_params()->band;
|
||||
mac->nr_band = nr_band;
|
||||
mac->ssb_start_subcarrier = UE[CC_id]->frame_parms.ssb_start_subcarrier;
|
||||
nr_init_frame_parms_ue_sa(&UE[CC_id]->frame_parms,
|
||||
downlink_frequency[CC_id][0],
|
||||
uplink_frequency_offset[CC_id][0],
|
||||
get_softmodem_params()->numerology,
|
||||
nr_band);
|
||||
} else {
|
||||
DevAssert(mac->if_module != NULL && mac->if_module->phy_config_request != NULL);
|
||||
mac->if_module->phy_config_request(&mac->phy_config);
|
||||
mac->phy_config_request_sent = true;
|
||||
fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config;
|
||||
|
||||
nr_init_frame_parms_ue(&UE[CC_id]->frame_parms, nrUE_config, mac->nr_band);
|
||||
}
|
||||
nr_init_frame_parms_ue(&UE[CC_id]->frame_parms, nrUE_config, mac->nr_band);
|
||||
}
|
||||
|
||||
UE[CC_id]->sl_mode = get_softmodem_params()->sl_mode;
|
||||
init_nr_ue_vars(UE[CC_id], 0, abstraction_flag);
|
||||
UE[CC_id]->sl_mode = get_softmodem_params()->sl_mode;
|
||||
init_nr_ue_vars(UE[CC_id], inst, abstraction_flag);
|
||||
|
||||
if (UE[CC_id]->sl_mode) {
|
||||
AssertFatal(UE[CC_id]->sl_mode == 2, "Only Sidelink mode 2 supported. Mode 1 not yet supported\n");
|
||||
DevAssert(mac->if_module != NULL && mac->if_module->sl_phy_config_request != NULL);
|
||||
nr_sl_phy_config_t *phycfg = &mac->SL_MAC_PARAMS->sl_phy_config;
|
||||
phycfg->sl_config_req.sl_carrier_config.sl_num_rx_ant = get_nrUE_params()->nb_antennas_rx;
|
||||
phycfg->sl_config_req.sl_carrier_config.sl_num_tx_ant = get_nrUE_params()->nb_antennas_tx;
|
||||
mac->if_module->sl_phy_config_request(phycfg);
|
||||
mac->phy_config_request_sent = true;
|
||||
sl_nr_ue_phy_params_t *sl_phy = &UE[CC_id]->SL_UE_PHY_PARAMS;
|
||||
nr_init_frame_parms_ue_sl(&sl_phy->sl_frame_params,
|
||||
&sl_phy->sl_config,
|
||||
get_softmodem_params()->threequarter_fs,
|
||||
get_nrUE_params()->ofdm_offset_divisor);
|
||||
sl_ue_phy_init(UE[CC_id]);
|
||||
if (UE[CC_id]->sl_mode) {
|
||||
AssertFatal(UE[CC_id]->sl_mode == 2, "Only Sidelink mode 2 supported. Mode 1 not yet supported\n");
|
||||
DevAssert(mac->if_module != NULL && mac->if_module->sl_phy_config_request != NULL);
|
||||
nr_sl_phy_config_t *phycfg = &mac->SL_MAC_PARAMS->sl_phy_config;
|
||||
phycfg->sl_config_req.sl_carrier_config.sl_num_rx_ant = get_nrUE_params()->nb_antennas_rx;
|
||||
phycfg->sl_config_req.sl_carrier_config.sl_num_tx_ant = get_nrUE_params()->nb_antennas_tx;
|
||||
mac->if_module->sl_phy_config_request(phycfg);
|
||||
mac->phy_config_request_sent = true;
|
||||
sl_nr_ue_phy_params_t *sl_phy = &UE[CC_id]->SL_UE_PHY_PARAMS;
|
||||
nr_init_frame_parms_ue_sl(&sl_phy->sl_frame_params,
|
||||
&sl_phy->sl_config,
|
||||
get_softmodem_params()->threequarter_fs,
|
||||
get_nrUE_params()->ofdm_offset_divisor);
|
||||
sl_ue_phy_init(UE[CC_id]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -593,7 +602,10 @@ int main(int argc, char **argv)
|
||||
load_softscope("nr",PHY_vars_UE_g[0][0]);
|
||||
}
|
||||
|
||||
init_NR_UE_threads(1);
|
||||
for (int inst = 0; inst < NB_UE_INST; inst++) {
|
||||
LOG_I(PHY,"Intializing UE Threads for instance %d ...\n", inst);
|
||||
init_NR_UE_threads(PHY_vars_UE_g[inst][0]);
|
||||
}
|
||||
printf("UE threads created by %ld\n", gettid());
|
||||
}
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
{"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, .u8ptr=NULL, .defintval=0, TYPE_UINT8, 0}, \
|
||||
{"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, .uptr=&nrUE_params.ofdm_offset_divisor, .defuintval=8, TYPE_UINT32, 0}, \
|
||||
{"max-ldpc-iterations", CONFIG_HLP_MAX_LDPC_ITERATIONS, 0, .iptr=&nrUE_params.max_ldpc_iterations, .defuintval=8, TYPE_UINT8, 0}, \
|
||||
{"ldpc-offload-enable", CONFIG_HLP_LDPC_OFFLOAD, PARAMFLAG_BOOL, .iptr=&(nrUE_params.ldpc_offload_flag), .defintval=0, TYPE_INT, 0}, \
|
||||
{"nr-dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, .iptr=(int32_t *)&nr_dlsch_demod_shift, .defintval=0, TYPE_INT, 0}, \
|
||||
{"V" , CONFIG_HLP_VCD, PARAMFLAG_BOOL, .iptr=&vcdflag, .defintval=0, TYPE_INT, 0}, \
|
||||
{"uecap_file", CONFIG_HLP_UECAP_FILE, 0, .strptr=&uecap_file, .defstrval="./uecap_ports1.xml", TYPE_STRING, 0}, \
|
||||
@@ -62,6 +63,7 @@
|
||||
{"chest-time", CONFIG_HLP_CHESTTIME, 0, .iptr=&(nrUE_params.chest_time), .defintval=0, TYPE_INT, 0}, \
|
||||
{"ue-timing-correction-disable", CONFIG_HLP_DISABLETIMECORR, PARAMFLAG_BOOL, .iptr=&(nrUE_params.no_timing_correction), .defintval=0, TYPE_INT, 0}, \
|
||||
{"SLC", CONFIG_HLP_SLF, 0, .u64ptr=&(sidelink_frequency[0][0]), .defuintval=2600000000,TYPE_UINT64,0}, \
|
||||
{"num-ues", NULL, 0, .iptr=&(NB_UE_INST), .defuintval=1, TYPE_INT,0}, \
|
||||
}
|
||||
// clang-format on
|
||||
|
||||
@@ -81,6 +83,7 @@ typedef struct {
|
||||
int nb_antennas_tx;
|
||||
int N_RB_DL;
|
||||
int ssb_start_subcarrier;
|
||||
int ldpc_offload_flag;
|
||||
} nrUE_params_t;
|
||||
extern uint64_t get_nrUE_optmask(void);
|
||||
extern uint64_t set_nrUE_optmask(uint64_t bitmask);
|
||||
@@ -91,7 +94,7 @@ extern nrUE_params_t *get_nrUE_params(void);
|
||||
extern int setup_nr_ue_buffers(PHY_VARS_NR_UE **phy_vars_ue, openair0_config_t *openair0_cfg);
|
||||
extern void fill_ue_band_info(void);
|
||||
extern void init_NR_UE(int, char *, char *, char *);
|
||||
extern void init_NR_UE_threads(int);
|
||||
extern void init_NR_UE_threads(PHY_VARS_NR_UE *ue);
|
||||
extern void reset_opp_meas(void);
|
||||
extern void print_opp_meas(void);
|
||||
void start_oai_nrue_threads(void);
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
#define NFAPI_UE_MAX_NUM_CB 8
|
||||
#define NFAPI_MAX_NUM_UL_PDU 255
|
||||
#define NFAPI_MAX_NUM_CSI_RATEMATCH 4
|
||||
|
||||
/*
|
||||
typedef unsigned int uint32_t;
|
||||
@@ -437,6 +438,24 @@ typedef struct {
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t dci_config_rel15;
|
||||
} fapi_nr_dl_config_dci_pdu;
|
||||
|
||||
typedef struct {
|
||||
uint8_t subcarrier_spacing; // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4
|
||||
uint8_t cyclic_prefix; // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended
|
||||
uint16_t start_rb; // PRB where this CSI resource starts related to common resource block #0 (CRB#0). Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSIFrequencyOccupation], Value: 0 ->274
|
||||
uint16_t nr_of_rbs; // Number of PRBs across which this CSI resource spans. Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSI-FrequencyOccupation], Value: 24 -> 276
|
||||
uint8_t csi_type; // CSI Type [3GPP TS 38.211, sec 7.4.1.5], Value: 0:TRS; 1:CSI-RS NZP; 2:CSI-RS ZP
|
||||
uint8_t row; // Row entry into the CSI Resource location table. [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 1-18
|
||||
uint16_t freq_domain; // Bitmap defining the frequencyDomainAllocation [3GPP TS 38.211, sec 7.4.1.5.3] [3GPP TS 38.331 CSIResourceMapping], Value: Up to the 12 LSBs, actual size is determined by the Row parameter
|
||||
uint8_t symb_l0; // The time domain location l0 and firstOFDMSymbolInTimeDomain [3GPP TS 38.211, sec 7.4.1.5.3], Value: 0->13
|
||||
uint8_t symb_l1; // The time domain location l1 and firstOFDMSymbolInTimeDomain2 [3GPP TS 38.211, sec 7.4.1.5.3], Value: 2->12
|
||||
uint8_t cdm_type; // The cdm-Type field [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: noCDM; 1: fd-CDM2; 2: cdm4-FD2-TD2; 3: cdm8-FD2-TD4
|
||||
uint8_t freq_density; // The density field, p and comb offset (for dot5). [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: dot5 (even RB); 1: dot5 (odd RB); 2: one; 3: three
|
||||
uint16_t scramb_id; // ScramblingID of the CSI-RS [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->1023
|
||||
uint8_t power_control_offset; // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS
|
||||
uint8_t power_control_offset_ss; // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS
|
||||
uint8_t measurement_bitmap; // bit 0 RSRP, bit 1 RI, bit 2 LI, bit 3 PMI, bit 4 CQI, bit 5 i1
|
||||
} fapi_nr_dl_config_csirs_pdu_rel15_t;
|
||||
|
||||
typedef enum{vrb_to_prb_mapping_non_interleaved = 0, vrb_to_prb_mapping_interleaved = 1} vrb_to_prb_mapping_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -481,7 +500,7 @@ typedef struct {
|
||||
// to be check the fields needed to L1 with NR_DL_UE_HARQ_t and NR_UE_DLSCH_t
|
||||
// PTRS [TS38.214, sec 5.1.6.3]
|
||||
/// PT-RS antenna ports [TS38.214, sec 5.1.6.3] [TS38.211, table 7.4.1.2.2-1] Bitmap occupying the 6 LSBs with: bit 0: antenna port 1000 bit 5: antenna port 1005 and for each bit 0: PTRS port not used 1: PTRS port used
|
||||
uint8_t PTRSPortIndex ;
|
||||
uint8_t PTRSPortIndex;
|
||||
/// PT-RS time density [TS38.214, table 5.1.6.3-1] 0: 1 1: 2 2: 4
|
||||
uint8_t PTRSTimeDensity;
|
||||
/// PT-RS frequency density [TS38.214, table 5.1.6.3-2] 0: 2 1: 4
|
||||
@@ -499,6 +518,8 @@ typedef struct {
|
||||
uint16_t pduBitmap;
|
||||
uint32_t k1_feedback;
|
||||
uint8_t ldpcBaseGraph;
|
||||
uint8_t numCsiRsForRateMatching;
|
||||
fapi_nr_dl_config_csirs_pdu_rel15_t csiRsForRateMatching[NFAPI_MAX_NUM_CSI_RATEMATCH];
|
||||
} fapi_nr_dl_config_dlsch_pdu_rel15_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -506,26 +527,6 @@ typedef struct {
|
||||
fapi_nr_dl_config_dlsch_pdu_rel15_t dlsch_config_rel15;
|
||||
} fapi_nr_dl_config_dlsch_pdu;
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint8_t subcarrier_spacing; // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4
|
||||
uint8_t cyclic_prefix; // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended
|
||||
uint16_t start_rb; // PRB where this CSI resource starts related to common resource block #0 (CRB#0). Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSIFrequencyOccupation], Value: 0 ->274
|
||||
uint16_t nr_of_rbs; // Number of PRBs across which this CSI resource spans. Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSI-FrequencyOccupation], Value: 24 -> 276
|
||||
uint8_t csi_type; // CSI Type [3GPP TS 38.211, sec 7.4.1.5], Value: 0:TRS; 1:CSI-RS NZP; 2:CSI-RS ZP
|
||||
uint8_t row; // Row entry into the CSI Resource location table. [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 1-18
|
||||
uint16_t freq_domain; // Bitmap defining the frequencyDomainAllocation [3GPP TS 38.211, sec 7.4.1.5.3] [3GPP TS 38.331 CSIResourceMapping], Value: Up to the 12 LSBs, actual size is determined by the Row parameter
|
||||
uint8_t symb_l0; // The time domain location l0 and firstOFDMSymbolInTimeDomain [3GPP TS 38.211, sec 7.4.1.5.3], Value: 0->13
|
||||
uint8_t symb_l1; // The time domain location l1 and firstOFDMSymbolInTimeDomain2 [3GPP TS 38.211, sec 7.4.1.5.3], Value: 2->12
|
||||
uint8_t cdm_type; // The cdm-Type field [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: noCDM; 1: fd-CDM2; 2: cdm4-FD2-TD2; 3: cdm8-FD2-TD4
|
||||
uint8_t freq_density; // The density field, p and comb offset (for dot5). [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: dot5 (even RB); 1: dot5 (odd RB); 2: one; 3: three
|
||||
uint16_t scramb_id; // ScramblingID of the CSI-RS [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->1023
|
||||
uint8_t power_control_offset; // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS
|
||||
uint8_t power_control_offset_ss; // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS
|
||||
uint8_t measurement_bitmap; // bit 0 RSRP, bit 1 RI, bit 2 LI, bit 3 PMI, bit 4 CQI, bit 5 i1
|
||||
} fapi_nr_dl_config_csirs_pdu_rel15_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint16_t bwp_size;
|
||||
uint16_t bwp_start;
|
||||
|
||||
@@ -259,7 +259,7 @@ one_measurement_t test_ldpc(short max_iterations,
|
||||
printf("To: %d\n", (Kb + nrows - no_punctured_columns) * Zc - removed_bit);
|
||||
printf("number of undecoded bits: %d\n", (Kb + nrows - no_punctured_columns - 2) * Zc - removed_bit);
|
||||
|
||||
encoder_implemparams_t impp = {.Zc = Zc, .Kb = Kb, .E = block_length, .BG = BG, .Kr = block_length, .K = block_length};
|
||||
encoder_implemparams_t impp = {.Zc = Zc, .Kb = Kb, .BG = BG, .Kr = block_length, .K = block_length};
|
||||
impp.gen_code = 2;
|
||||
|
||||
if (ntrials==0)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -12,14 +12,7 @@
|
||||
#include <rte_hexdump.h>
|
||||
#include <rte_log.h>
|
||||
|
||||
#define TEST_SUCCESS 0
|
||||
#define TEST_FAILED -1
|
||||
#define TEST_SKIPPED 1
|
||||
|
||||
#define MAX_BURST 512U
|
||||
#define DEFAULT_BURST 32U
|
||||
#define DEFAULT_OPS 64U
|
||||
#define DEFAULT_ITER 6U
|
||||
|
||||
enum op_data_type {
|
||||
DATA_INPUT = 0,
|
||||
@@ -30,106 +23,4 @@ enum op_data_type {
|
||||
DATA_NUM_TYPES,
|
||||
};
|
||||
|
||||
#define TEST_ASSERT(cond, msg, ...) do { \
|
||||
if (!(cond)) { \
|
||||
printf("TestCase %s() line %d failed: " \
|
||||
msg "\n", __func__, __LINE__, ##__VA_ARGS__); \
|
||||
return TEST_FAILED; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* Compare two buffers (length in bytes) */
|
||||
#define TEST_ASSERT_BUFFERS_ARE_EQUAL(a, b, len, msg, ...) do { \
|
||||
if (memcmp((a), (b), len)) { \
|
||||
printf("TestCase %s() line %d failed: " \
|
||||
msg "\n", __func__, __LINE__, ##__VA_ARGS__); \
|
||||
rte_memdump(stdout, "Buffer A", (a), len); \
|
||||
rte_memdump(stdout, "Buffer B", (b), len); \
|
||||
return TEST_FAILED; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define TEST_ASSERT_SUCCESS(val, msg, ...) do { \
|
||||
typeof(val) _val = (val); \
|
||||
if (!(_val == 0)) { \
|
||||
printf("TestCase %s() line %d failed (err %d): " \
|
||||
msg "\n", __func__, __LINE__, _val, \
|
||||
##__VA_ARGS__); \
|
||||
return TEST_FAILED; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define TEST_ASSERT_FAIL(val, msg, ...) \
|
||||
TEST_ASSERT_SUCCESS(!(val), msg, ##__VA_ARGS__)
|
||||
|
||||
#define TEST_ASSERT_NOT_NULL(val, msg, ...) do { \
|
||||
if ((val) == NULL) { \
|
||||
printf("TestCase %s() line %d failed (null): " \
|
||||
msg "\n", __func__, __LINE__, ##__VA_ARGS__); \
|
||||
return TEST_FAILED; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
struct unit_test_case {
|
||||
int (*setup)(void);
|
||||
void (*teardown)(void);
|
||||
int (*testcase)(void);
|
||||
const char *name;
|
||||
};
|
||||
|
||||
#define TEST_CASE(testcase) {NULL, NULL, testcase, #testcase}
|
||||
|
||||
#define TEST_CASE_ST(setup, teardown, testcase) \
|
||||
{setup, teardown, testcase, #testcase}
|
||||
|
||||
#define TEST_CASES_END() {NULL, NULL, NULL, NULL}
|
||||
|
||||
struct unit_test_suite {
|
||||
const char *suite_name;
|
||||
int (*setup)(void);
|
||||
void (*teardown)(void);
|
||||
struct unit_test_case unit_test_cases[];
|
||||
};
|
||||
|
||||
int unit_test_suite_runner(struct unit_test_suite *suite);
|
||||
|
||||
typedef int (test_callback)(void);
|
||||
TAILQ_HEAD(test_commands_list, test_command);
|
||||
struct test_command {
|
||||
TAILQ_ENTRY(test_command) next;
|
||||
const char *command;
|
||||
test_callback *callback;
|
||||
};
|
||||
|
||||
void add_test_command(struct test_command *t);
|
||||
|
||||
/* Register a test function */
|
||||
#define REGISTER_TEST_COMMAND(name, testsuite) \
|
||||
static int test_func_##name(void) \
|
||||
{ \
|
||||
return unit_test_suite_runner(&testsuite); \
|
||||
} \
|
||||
static struct test_command test_struct_##name = { \
|
||||
.command = RTE_STR(name), \
|
||||
.callback = test_func_##name, \
|
||||
}; \
|
||||
RTE_INIT(test_register_##name) \
|
||||
{ \
|
||||
add_test_command(&test_struct_##name); \
|
||||
}
|
||||
|
||||
const char *get_vector_filename(void);
|
||||
|
||||
unsigned int get_num_ops(void);
|
||||
|
||||
unsigned int get_burst_sz(void);
|
||||
|
||||
unsigned int get_num_lcores(void);
|
||||
|
||||
double get_snr(void);
|
||||
|
||||
unsigned int get_iter_max(void);
|
||||
|
||||
bool get_init_device(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -78,6 +78,15 @@ typedef enum nrLDPC_outMode {
|
||||
nrLDPC_outMode_LLRINT8 /**< Single LLR value per int8_t output */
|
||||
} e_nrLDPC_outMode;
|
||||
|
||||
/**
|
||||
Structure containing LDPC parameters per CB
|
||||
*/
|
||||
typedef struct nrLDPC_params_per_cb {
|
||||
uint32_t E_cb;
|
||||
uint8_t status_cb;
|
||||
uint8_t* p_status_cb;
|
||||
} nrLDPC_params_per_cb_t;
|
||||
|
||||
/**
|
||||
Structure containing LDPC decoder parameters.
|
||||
*/
|
||||
@@ -94,18 +103,24 @@ typedef struct nrLDPC_dec_params {
|
||||
int crc_type;
|
||||
int (*check_crc)(uint8_t* decoded_bytes, uint32_t n, uint8_t crc_type);
|
||||
uint8_t setCombIn;
|
||||
nrLDPC_params_per_cb_t perCB[NR_LDPC_MAX_NUM_CB];
|
||||
} t_nrLDPC_dec_params;
|
||||
|
||||
/**
|
||||
Structure containing LDPC offload parameters.
|
||||
*/
|
||||
typedef struct nrLDPCoffload_params {
|
||||
uint8_t BG; /**< Base graph */
|
||||
uint16_t Z;
|
||||
uint16_t Kr;
|
||||
uint8_t rv;
|
||||
uint32_t E;
|
||||
uint16_t n_cb;
|
||||
uint16_t F; /**< Filler bits */
|
||||
uint8_t Qm; /**< Modulation */
|
||||
uint8_t C;
|
||||
uint8_t numMaxIter;
|
||||
uint8_t setCombIn;
|
||||
nrLDPC_params_per_cb_t perCB[NR_LDPC_MAX_NUM_CB];
|
||||
} t_nrLDPCoffload_params;
|
||||
|
||||
/**
|
||||
|
||||
@@ -99,6 +99,8 @@
|
||||
/** Maximum number of possible input LLR = NR_LDPC_NCOL_BG1*NR_LDPC_ZMAX */
|
||||
#define NR_LDPC_MAX_NUM_LLR 27000
|
||||
|
||||
#define NR_LDPC_MAX_NUM_CB 72
|
||||
|
||||
// ==============================================================================
|
||||
// GLOBAL CONSTANT VARIABLES
|
||||
|
||||
|
||||
@@ -59,8 +59,9 @@ typedef struct {
|
||||
uint32_t F;
|
||||
/// Modulation order
|
||||
uint8_t Qm;
|
||||
uint32_t E;
|
||||
uint32_t Tbslbrm;
|
||||
unsigned int G;
|
||||
nrLDPC_params_per_cb_t perCB[NR_LDPC_MAX_NUM_CB];
|
||||
// Redundancy version index
|
||||
uint8_t rv;
|
||||
} encoder_implemparams_t;
|
||||
|
||||
@@ -137,6 +137,9 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
|
||||
if (gNB->ldpc_offload_flag)
|
||||
load_LDPClib("_t2", &ldpc_interface_offload);
|
||||
else
|
||||
load_LDPClib(NULL, &ldpc_interface);
|
||||
|
||||
gNB->max_nb_pdsch = MAX_MOBILES_PER_GNB;
|
||||
init_delay_table(fp->ofdm_symbol_size, MAX_DELAY_COMP, NR_MAX_OFDM_SYMBOL_SIZE, fp->delay_table);
|
||||
|
||||
|
||||
@@ -61,6 +61,21 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
|
||||
uint32_t re_offset,
|
||||
uint8_t dmrs_type);
|
||||
|
||||
void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **dataF,
|
||||
const int16_t amp,
|
||||
nr_csi_info_t *nr_csi_info,
|
||||
const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params,
|
||||
const int slot,
|
||||
uint8_t *N_cdm_groups,
|
||||
uint8_t *CDM_group_size,
|
||||
uint8_t *k_prime,
|
||||
uint8_t *l_prime,
|
||||
uint8_t *N_ports,
|
||||
uint8_t *j_cdm,
|
||||
uint8_t *k_overline,
|
||||
uint8_t *l_overline);
|
||||
|
||||
void init_scrambling_luts(void);
|
||||
void nr_generate_modulation_table(void);
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -360,6 +360,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
||||
impp.harq = harq;
|
||||
if (gNB->ldpc_offload_flag) {
|
||||
impp.Qm = rel15->qamModOrder[0];
|
||||
impp.Tbslbrm = rel15->maintenance_parms_v3.tbSizeLbrmBytes;
|
||||
impp.rv = rel15->rvIndex[0];
|
||||
int nb_re_dmrs =
|
||||
(rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1) ? (6 * rel15->numDmrsCdmGrpsNoData) : (4 * rel15->numDmrsCdmGrpsNoData);
|
||||
@@ -370,13 +371,10 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
||||
harq->unav_res,
|
||||
rel15->qamModOrder[0],
|
||||
rel15->nrOfLayers);
|
||||
int r_offset = 0;
|
||||
for (int r = 0; r < impp.n_segments; r++) {
|
||||
impp.E = nr_get_E(impp.G, impp.n_segments, impp.Qm, rel15->nrOfLayers, r);
|
||||
uint8_t *f = impp.output + r_offset;
|
||||
ldpc_interface_offload.LDPCencoder(&harq->c[r], &f, &impp);
|
||||
r_offset += impp.E;
|
||||
impp.perCB[r].E_cb = nr_get_E(impp.G, impp.n_segments, impp.Qm, rel15->nrOfLayers, r);
|
||||
}
|
||||
ldpc_interface_offload.LDPCencoder(harq->c, &impp.output, &impp);
|
||||
} else {
|
||||
notifiedFIFO_t nf;
|
||||
initNotifiedFIFO(&nf);
|
||||
|
||||
@@ -310,21 +310,6 @@ void init_prach_ru_list(RU_t *ru);
|
||||
void free_nr_ru_prach_entry(RU_t *ru, int prach_id);
|
||||
uint8_t get_nr_prach_duration(uint8_t prach_format);
|
||||
|
||||
void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **dataF,
|
||||
const int16_t amp,
|
||||
nr_csi_info_t *nr_csi_info,
|
||||
const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params,
|
||||
const int slot,
|
||||
uint8_t *N_cdm_groups,
|
||||
uint8_t *CDM_group_size,
|
||||
uint8_t *k_prime,
|
||||
uint8_t *l_prime,
|
||||
uint8_t *N_ports,
|
||||
uint8_t *j_cdm,
|
||||
uint8_t *k_overline,
|
||||
uint8_t *l_overline);
|
||||
|
||||
void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id);
|
||||
|
||||
void nr_decode_pucch1(c16_t **rxdataF,
|
||||
|
||||
@@ -180,6 +180,7 @@ static void nr_processULSegment(void *arg)
|
||||
|
||||
LOG_E(PHY, "ulsch_decoding.c: Problem in rate_matching\n");
|
||||
rdata->decodeIterations = max_ldpc_iterations + 1;
|
||||
set_abort(&ulsch_harq->abort_decode, true);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -232,64 +233,60 @@ int decode_offload(PHY_VARS_gNB *phy_vars_gNB,
|
||||
{
|
||||
NR_gNB_ULSCH_t *ulsch = &phy_vars_gNB->ulsch[ULSCH_id];
|
||||
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_process;
|
||||
int16_t z_ol[LDPC_MAX_CB_SIZE] __attribute__((aligned(16)));
|
||||
int8_t l_ol[LDPC_MAX_CB_SIZE] __attribute__((aligned(16)));
|
||||
uint8_t Qm = pusch_pdu->qam_mod_order;
|
||||
uint8_t n_layers = pusch_pdu->nrOfLayers;
|
||||
int16_t z_ol[NR_LDPC_MAX_NUM_CB * LDPC_MAX_CB_SIZE] __attribute__((aligned(16)));
|
||||
int8_t l_ol[NR_LDPC_MAX_NUM_CB * LDPC_MAX_CB_SIZE] __attribute__((aligned(16)));
|
||||
const int kc = decParams->BG == 2 ? 52 : 68;
|
||||
uint32_t A = (harq_process->TBS) << 3;
|
||||
const int Kr = harq_process->K;
|
||||
const int Kr_bytes = Kr >> 3;
|
||||
uint32_t A = (harq_process->TBS) << 3;
|
||||
const int kc = decParams->BG == 2 ? 52 : 68;
|
||||
ulsch->max_ldpc_iterations = 20;
|
||||
int decodeIterations = 2;
|
||||
int r_offset = 0, offset = 0;
|
||||
for (int r = 0; r < harq_process->C; r++) {
|
||||
int E = nr_get_E(G, harq_process->C, Qm, n_layers, r);
|
||||
memset(harq_process->c[r], 0, Kr_bytes);
|
||||
decParams->R = nr_get_R_ldpc_decoder(pusch_pdu->pusch_data.rv_index,
|
||||
E,
|
||||
decParams->BG,
|
||||
decParams->Z,
|
||||
&harq_process->llrLen,
|
||||
harq_process->round);
|
||||
int8_t decodeIterations = 0;
|
||||
int r_offset = 0;
|
||||
int offset = 0;
|
||||
// new data received, set processedSegments to 0
|
||||
if (!decParams->setCombIn)
|
||||
harq_process->processedSegments = 0;
|
||||
|
||||
memcpy(z_ol, ulsch_llr + r_offset, E * sizeof(short));
|
||||
simde__m128i *pv_ol128 = (simde__m128i *)&z_ol;
|
||||
simde__m128i *pl_ol128 = (simde__m128i *)&l_ol;
|
||||
for (int r = 0; r < harq_process->C; r++) {
|
||||
decParams->perCB[r].E_cb = nr_get_E(G, harq_process->C, decParams->Qm, pusch_pdu->nrOfLayers, r);
|
||||
memcpy(&z_ol[offset], ulsch_llr + r_offset, decParams->perCB[r].E_cb * sizeof(*z_ol));
|
||||
simde__m128i *pv_ol128 = (simde__m128i *)&z_ol[offset];
|
||||
simde__m128i *pl_ol128 = (simde__m128i *)&l_ol[offset];
|
||||
for (int i = 0, j = 0; j < ((kc * harq_process->Z) >> 4) + 1; i += 2, j++) {
|
||||
pl_ol128[j] = simde_mm_packs_epi16(pv_ol128[i], pv_ol128[i + 1]);
|
||||
}
|
||||
decParams->E = E;
|
||||
decParams->rv = pusch_pdu->pusch_data.rv_index;
|
||||
decParams->F = harq_process->F;
|
||||
decParams->Qm = Qm;
|
||||
decodeIterations =
|
||||
ldpc_interface_offload
|
||||
.LDPCdecoder(decParams, harq_pid, ULSCH_id, r, (int8_t *)&pl_ol128[0], (int8_t *)harq_process->c[r], NULL, NULL);
|
||||
if (decodeIterations < 0) {
|
||||
LOG_E(PHY, "ulsch_decoding.c: Problem in LDPC decoder offload\n");
|
||||
return -1;
|
||||
}
|
||||
bool decodeSuccess = check_crc((uint8_t *)harq_process->c[r], lenWithCrc(harq_process->C, A), crcType(harq_process->C, A));
|
||||
if (decodeSuccess) {
|
||||
memcpy(harq_process->b + offset, harq_process->c[r], Kr_bytes - (harq_process->F >> 3) - ((harq_process->C > 1) ? 3 : 0));
|
||||
offset += (Kr_bytes - (harq_process->F >> 3) - ((harq_process->C > 1) ? 3 : 0));
|
||||
r_offset += decParams->perCB[r].E_cb;
|
||||
offset += LDPC_MAX_CB_SIZE;
|
||||
}
|
||||
|
||||
int8_t p_outDec[harq_process->C * Kr_bytes];
|
||||
memset(p_outDec, 0, sizeof(p_outDec));
|
||||
decodeIterations =
|
||||
ldpc_interface_offload.LDPCdecoder(decParams, harq_pid, ULSCH_id, harq_process->C, (int8_t *)l_ol, p_outDec, NULL, NULL);
|
||||
|
||||
if (decodeIterations < 0) {
|
||||
LOG_E(PHY, "ulsch_decoding.c: Problem in LDPC decoder offload\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int offset_b = 0;
|
||||
for (int r = 0; r < harq_process->C; r++) {
|
||||
if (decParams->perCB[r].status_cb == 0 || harq_process->C == 1) {
|
||||
memcpy(harq_process->b + offset_b, &p_outDec[offset_b], Kr_bytes - (harq_process->F >> 3) - ((harq_process->C > 1) ? 3 : 0));
|
||||
harq_process->processedSegments++;
|
||||
} else {
|
||||
LOG_D(PHY, "uplink segment error %d/%d\n", r, harq_process->C);
|
||||
LOG_D(PHY, "ULSCH %d in error\n", ULSCH_id);
|
||||
}
|
||||
r_offset += E;
|
||||
offset_b += (Kr_bytes - (harq_process->F >> 3) - ((harq_process->C > 1) ? 3 : 0));
|
||||
}
|
||||
|
||||
bool crc_valid = false;
|
||||
// CRC check made by the T2, no need to perform CRC check for a single code block twice
|
||||
if (harq_process->processedSegments == harq_process->C) {
|
||||
// When the number of code blocks is 1 (C = 1) and ulsch_harq->processedSegments = 1, we can assume a good TB because of the
|
||||
// CRC check made by the LDPC for early termination, so, no need to perform CRC check twice for a single code block
|
||||
crc_valid = true;
|
||||
if (harq_process->C > 1) {
|
||||
crc_valid = check_crc(harq_process->b, lenWithCrc(1, A), crcType(1, A));
|
||||
crc_valid = check_crc(harq_process->b, lenWithCrc(1, A), crcType(1, A));
|
||||
if (harq_process->C == 1 && !crc_valid) {
|
||||
harq_process->processedSegments--;
|
||||
}
|
||||
}
|
||||
|
||||
if (crc_valid) {
|
||||
LOG_D(PHY, "ULSCH: Setting ACK for slot %d TBS %d\n", ulsch->slot, harq_process->TBS);
|
||||
nr_fill_indication(phy_vars_gNB, ulsch->frame, ulsch->slot, ULSCH_id, harq_pid, 0, 0);
|
||||
@@ -349,7 +346,6 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
||||
const uint8_t n_layers = pusch_pdu->nrOfLayers;
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
harq_process->processedSegments = 0;
|
||||
harq_process->TBS = pusch_pdu->pusch_data.tb_size;
|
||||
|
||||
t_nrLDPC_dec_params decParams = {.check_crc = check_crc};
|
||||
@@ -418,6 +414,8 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
||||
|
||||
decParams.Z = harq_process->Z;
|
||||
decParams.numMaxIter = ulsch->max_ldpc_iterations;
|
||||
decParams.Qm = Qm;
|
||||
decParams.rv = pusch_pdu->pusch_data.rv_index;
|
||||
decParams.outMode = 0;
|
||||
decParams.setCombIn = !harq_process->harq_to_be_cleared;
|
||||
if (harq_process->harq_to_be_cleared) {
|
||||
@@ -428,7 +426,7 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
||||
|
||||
if (phy_vars_gNB->ldpc_offload_flag)
|
||||
return decode_offload(phy_vars_gNB, ULSCH_id, ulsch_llr, pusch_pdu, &decParams, harq_pid, G);
|
||||
|
||||
harq_process->processedSegments = 0;
|
||||
uint32_t offset = 0, r_offset = 0;
|
||||
set_abort(&harq_process->abort_decode, false);
|
||||
for (int r = 0; r < harq_process->C; r++) {
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#include "PHY/NR_REFSIG/ptrs_nr.h"
|
||||
#include "PHY/NR_REFSIG/nr_mod_table.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||
#include "nr_phy_common.h"
|
||||
#include "filt16a_32.h"
|
||||
#include "T.h"
|
||||
|
||||
@@ -36,8 +36,8 @@
|
||||
#include "executables/nr-softmodem-common.h"
|
||||
#include "nr_transport_proto_ue.h"
|
||||
#include "PHY/phy_extern_nr_ue.h"
|
||||
#include "PHY/NR_REFSIG/nr_refsig.h"
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||
#include "PHY/NR_UE_ESTIMATION/filt16a_32.h"
|
||||
|
||||
// Additional memory allocation, because of applying the filter and the memory offset to ensure memory alignment
|
||||
@@ -191,13 +191,13 @@ int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue,
|
||||
int32_t csi_rs_received_signal[][ue->frame_parms.samples_per_slot_wCP],
|
||||
uint32_t *rsrp,
|
||||
int *rsrp_dBm,
|
||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
|
||||
|
||||
const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
||||
{
|
||||
const NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
|
||||
uint16_t meas_count = 0;
|
||||
uint32_t rsrp_sum = 0;
|
||||
|
||||
for (int ant_rx = 0; ant_rx < frame_parms->nb_antennas_rx; ant_rx++) {
|
||||
for (int ant_rx = 0; ant_rx < fp->nb_antennas_rx; ant_rx++) {
|
||||
|
||||
for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
|
||||
|
||||
@@ -212,12 +212,12 @@ int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue,
|
||||
// loop over frequency resource elements within a group
|
||||
for (int kp = 0; kp <= k_prime; kp++) {
|
||||
|
||||
uint16_t k = (frame_parms->first_carrier_offset + (rb*NR_NB_SC_PER_RB)+k_overline[cdm_id] + kp) % frame_parms->ofdm_symbol_size;
|
||||
uint16_t k = (fp->first_carrier_offset + (rb * NR_NB_SC_PER_RB) + k_overline[cdm_id] + kp) % fp->ofdm_symbol_size;
|
||||
|
||||
// loop over time resource elements within a group
|
||||
for (int lp = 0; lp <= l_prime; lp++) {
|
||||
uint16_t symb = lp + l_overline[cdm_id];
|
||||
uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size;
|
||||
uint64_t symbol_offset = symb * fp->ofdm_symbol_size;
|
||||
c16_t *rx_signal = &rxdataF[ant_rx][symbol_offset];
|
||||
c16_t *rx_csi_rs_signal = (c16_t*)&csi_rs_received_signal[ant_rx][symbol_offset];
|
||||
rx_csi_rs_signal[k].r = rx_signal[k].r;
|
||||
@@ -229,10 +229,11 @@ int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue,
|
||||
meas_count++;
|
||||
|
||||
#ifdef NR_CSIRS_DEBUG
|
||||
int dataF_offset = proc->nr_slot_rx*ue->frame_parms.samples_per_slot_wCP;
|
||||
int dataF_offset = proc->nr_slot_rx * fp->samples_per_slot_wCP;
|
||||
uint16_t port_tx = s+j_cdm[cdm_id]*CDM_group_size;
|
||||
c16_t *tx_csi_rs_signal = (c16_t*)&nr_csi_info->csi_rs_generated_signal[port_tx][symbol_offset+dataF_offset];
|
||||
LOG_I(NR_PHY, "l,k (%2d,%4d) |\tport_tx %d (%4d,%4d)\tant_rx %d (%4d,%4d)\n",
|
||||
c16_t *tx_csi_rs_signal = (c16_t*)&nr_csi_info->csi_rs_generated_signal[port_tx][symbol_offset + dataF_offset];
|
||||
LOG_I(NR_PHY,
|
||||
"l,k (%2d,%4d) |\tport_tx %d (%4d,%4d)\tant_rx %d (%4d,%4d)\n",
|
||||
symb,
|
||||
k,
|
||||
port_tx+3000,
|
||||
@@ -728,12 +729,12 @@ int nr_csi_rs_cqi_estimation(const uint32_t precoded_sinr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu,
|
||||
uint32_t *interference_plus_noise_power,
|
||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
|
||||
|
||||
static void nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu,
|
||||
uint32_t *interference_plus_noise_power,
|
||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
||||
{
|
||||
const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
|
||||
const uint16_t end_rb = csiim_config_pdu->start_rb + csiim_config_pdu->nr_of_rbs > csiim_config_pdu->bwp_size ?
|
||||
@@ -772,7 +773,7 @@ int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue,
|
||||
|
||||
uint16_t sc0_offset = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
|
||||
|
||||
for (int sc_idx = 0; sc_idx<4; sc_idx++) {
|
||||
for (int sc_idx = 0; sc_idx < 4; sc_idx++) {
|
||||
|
||||
uint16_t sc = sc0_offset + csiim_config_pdu->k_csiim[sc_idx];
|
||||
if (sc >= frame_parms->ofdm_symbol_size) {
|
||||
@@ -785,34 +786,31 @@ int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue,
|
||||
|
||||
sum_re += rx_signal[sc].r;
|
||||
sum_im += rx_signal[sc].i;
|
||||
sum2_re += rx_signal[sc].r*rx_signal[sc].r;
|
||||
sum2_im += rx_signal[sc].i*rx_signal[sc].i;
|
||||
sum2_re += rx_signal[sc].r * rx_signal[sc].r;
|
||||
sum2_im += rx_signal[sc].i * rx_signal[sc].i;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int32_t power_re = sum2_re/count - (sum_re/count)*(sum_re/count);
|
||||
int32_t power_im = sum2_im/count - (sum_im/count)*(sum_im/count);
|
||||
int32_t power_re = sum2_re / count - (sum_re / count) * (sum_re / count);
|
||||
int32_t power_im = sum2_im / count - (sum_im / count) * (sum_im / count);
|
||||
|
||||
*interference_plus_noise_power = power_re + power_im;
|
||||
|
||||
#ifdef NR_CSIIM_DEBUG
|
||||
LOG_I(NR_PHY, "interference_plus_noise_power based on CSI-IM = %i\n", *interference_plus_noise_power);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
||||
void nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
||||
{
|
||||
int gNB_id = proc->gNB_id;
|
||||
if(!ue->csiim_vars[gNB_id]->active) {
|
||||
return -1;
|
||||
}
|
||||
if(!ue->csiim_vars[gNB_id]->active)
|
||||
LOG_E(NR_PHY, "Scheduling reception of CSI-IM that is not active\n");
|
||||
|
||||
const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu = (fapi_nr_dl_config_csiim_pdu_rel15_t*)&ue->csiim_vars[gNB_id]->csiim_config_pdu;
|
||||
|
||||
@@ -828,8 +826,6 @@ int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue,
|
||||
|
||||
nr_csi_im_power_estimation(ue, proc, csiim_config_pdu, &ue->nr_csi_info->interference_plus_noise_power, rxdataF);
|
||||
ue->nr_csi_info->csi_im_meas_computed = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static nfapi_nr_dl_tti_csi_rs_pdu_rel15_t convert_csirs_pdu(const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu)
|
||||
@@ -1004,7 +1000,7 @@ void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue,
|
||||
|
||||
switch (csirs_config_pdu->measurement_bitmap) {
|
||||
case 1 :
|
||||
LOG_I(NR_PHY, "RSRP = %i dBm\n", rsrp_dBm);
|
||||
LOG_I(NR_PHY, "[UE %d] RSRP = %i dBm\n", ue->Mod_id, rsrp_dBm);
|
||||
break;
|
||||
case 26 :
|
||||
LOG_I(NR_PHY, "RI = %i i1 = %i.%i.%i, i2 = %i, SINR = %i dB, CQI = %i\n",
|
||||
|
||||
@@ -119,7 +119,7 @@ static bool nr_ue_postDecode(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
LOG_D(PHY, "DLSCH received nok \n");
|
||||
return true; //stop
|
||||
}
|
||||
const int sz=A/8;
|
||||
const int sz=A / 8;
|
||||
if (b[sz] == 0 && b[sz + 1] == 0) { // We search only a reccuring OAI error that propagates all 0 packets with a 0 CRC, so we
|
||||
// do the check only if the 2 first bytes of the CRC are 0 (it can be CRC16 or CRC24)
|
||||
int i = 0;
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
*/
|
||||
#include "PHY/defs_nr_UE.h"
|
||||
#include "PHY/phy_extern.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||
#include "nr_transport_proto_ue.h"
|
||||
#include "PHY/sse_intrin.h"
|
||||
#include "T.h"
|
||||
@@ -159,6 +158,7 @@ static void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
|
||||
uint8_t Nl,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint16_t dlDmrsSymbPos,
|
||||
uint32_t csi_res_bitmap,
|
||||
int chest_time_type);
|
||||
|
||||
static void nr_dlsch_channel_level_median(uint32_t rx_size_symbol,
|
||||
@@ -239,6 +239,82 @@ void nr_dlsch_detection_mrc(uint32_t rx_size_symbol,
|
||||
unsigned short nb_rb,
|
||||
int length);
|
||||
|
||||
static bool overlap_csi_symbol(fapi_nr_dl_config_csirs_pdu_rel15_t *csi_pdu, int symbol)
|
||||
{
|
||||
int num_l0 [18] = {1, 1, 1, 1, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 4, 2, 2, 4};
|
||||
for (int s = 0; s < num_l0[csi_pdu->row - 1]; s++) {
|
||||
if (symbol == csi_pdu->symb_l0 + s)
|
||||
return true;
|
||||
}
|
||||
// check also l1 if relevant
|
||||
if (csi_pdu->row == 13 || csi_pdu->row == 14 || csi_pdu->row == 16 || csi_pdu->row == 17) {
|
||||
for (int s = 0; s < 2; s++) { // two consecutive symbols including l1
|
||||
if (symbol == csi_pdu->symb_l1 + s)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static uint32_t build_csi_overlap_bitmap(fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config, int symbol)
|
||||
{
|
||||
// LS 16 bits for even RBs, MS 16 bits for odd RBs
|
||||
uint32_t csi_res_bitmap = 0;
|
||||
int num_k[18] = {1, 1, 1, 1, 1, 4, 2, 2, 6, 3, 4, 4, 3, 3, 3, 4, 4, 4};
|
||||
for (int i = 0; i < dlsch_config->numCsiRsForRateMatching; i++) {
|
||||
fapi_nr_dl_config_csirs_pdu_rel15_t *csi_pdu = &dlsch_config->csiRsForRateMatching[i];
|
||||
|
||||
if (!overlap_csi_symbol(csi_pdu, symbol))
|
||||
continue;
|
||||
|
||||
int num_kp = 1;
|
||||
int mult = 1;
|
||||
int k0_step = 0;
|
||||
int num_k0 = 1;
|
||||
switch (csi_pdu->row) {
|
||||
case 1:
|
||||
k0_step = 4;
|
||||
num_k0 = 3;
|
||||
break;
|
||||
case 2:
|
||||
break;
|
||||
case 4:
|
||||
num_kp = 2;
|
||||
mult = 4;
|
||||
k0_step = 2;
|
||||
num_k0 = 2;
|
||||
break;
|
||||
default:
|
||||
num_kp = 2;
|
||||
mult = 2;
|
||||
}
|
||||
int found = 0;
|
||||
int bit = 0;
|
||||
uint32_t temp_res_map = 0;
|
||||
while (found < num_k[csi_pdu->row - 1]) {
|
||||
if ((csi_pdu->freq_domain >> bit) & 0x01) {
|
||||
for (int k0 = 0; k0 < num_k0; k0++) {
|
||||
for (int kp = 0; kp < num_kp; kp++) {
|
||||
int re = (bit * mult) + (k0 * k0_step) + kp;
|
||||
temp_res_map |= (1 << re);
|
||||
}
|
||||
}
|
||||
found++;
|
||||
}
|
||||
bit++;
|
||||
AssertFatal(bit < 13,
|
||||
"Couldn't find %d positive bits in bitmap %d for CSI freq. domain\n",
|
||||
num_k[csi_pdu->row - 1],
|
||||
csi_pdu->freq_domain);
|
||||
}
|
||||
if (csi_pdu->freq_density < 2)
|
||||
csi_res_bitmap |= (temp_res_map << (16 * csi_pdu->freq_density));
|
||||
else
|
||||
csi_res_bitmap |= (temp_res_map + (temp_res_map << 16));
|
||||
}
|
||||
return csi_res_bitmap;
|
||||
}
|
||||
|
||||
/* Main Function */
|
||||
int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
@@ -360,10 +436,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
return(-1);
|
||||
}
|
||||
|
||||
if(symbol > ue->frame_parms.symbols_per_slot>>1)
|
||||
{
|
||||
slot = 1;
|
||||
}
|
||||
if(symbol > ue->frame_parms.symbols_per_slot >> 1)
|
||||
slot = 1;
|
||||
|
||||
uint8_t pilots = (dlsch_config->dlDmrsSymbPos >> symbol) & 1;
|
||||
uint8_t config_type = dlsch_config->dmrsConfigType;
|
||||
@@ -380,6 +454,10 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
__attribute__((aligned(32))) c16_t rxdataF_ext[nbRx][rx_size_symbol];
|
||||
memset(rxdataF_ext, 0, sizeof(rxdataF_ext));
|
||||
|
||||
uint32_t csi_res_bitmap = build_csi_overlap_bitmap(dlsch_config, symbol);
|
||||
|
||||
LOG_D(PHY, "%d.%d symbol %d csi overlap bitmap %d\n", frame, nr_slot_rx, symbol, csi_res_bitmap);
|
||||
|
||||
nr_dlsch_extract_rbs(ue->frame_parms.samples_per_slot_wCP,
|
||||
rxdataF,
|
||||
rx_size_symbol,
|
||||
@@ -396,6 +474,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
nl,
|
||||
frame_parms,
|
||||
dlsch_config->dlDmrsSymbPos,
|
||||
csi_res_bitmap,
|
||||
ue->chest_time);
|
||||
if (meas_enabled) {
|
||||
stop_meas(&meas);
|
||||
@@ -576,9 +655,22 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
|
||||
/* Check for PTRS bitmap and process it respectively */
|
||||
if((pduBitmap & 0x1) && (dlsch[0].rnti_type == TYPE_C_RNTI_)) {
|
||||
nr_pdsch_ptrs_processing(
|
||||
ue, nbRx, ptrs_phase_per_slot, ptrs_re_per_slot, rx_size_symbol, rxdataF_comp, frame_parms, dlsch0_harq, dlsch1_harq, gNB_id, nr_slot_rx, symbol, (nb_rb_pdsch * 12), dlsch[0].rnti, dlsch);
|
||||
dl_valid_re[symbol-1] -= ptrs_re_per_slot[0][symbol];
|
||||
nr_pdsch_ptrs_processing(ue,
|
||||
nbRx,
|
||||
ptrs_phase_per_slot,
|
||||
ptrs_re_per_slot,
|
||||
rx_size_symbol,
|
||||
rxdataF_comp,
|
||||
frame_parms,
|
||||
dlsch0_harq,
|
||||
dlsch1_harq,
|
||||
gNB_id,
|
||||
nr_slot_rx,
|
||||
symbol,
|
||||
(nb_rb_pdsch * 12),
|
||||
dlsch[0].rnti,
|
||||
dlsch);
|
||||
dl_valid_re[symbol - 1] -= ptrs_re_per_slot[0][symbol];
|
||||
}
|
||||
/* at last symbol in a slot calculate LLR's for whole slot */
|
||||
if(symbol == (startSymbIdx + nbSymb -1)) {
|
||||
@@ -1099,15 +1191,30 @@ static void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
|
||||
uint8_t Nl,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint16_t dlDmrsSymbPos,
|
||||
uint32_t csi_res_bitmap,
|
||||
int chest_time_type)
|
||||
{
|
||||
if (config_type == NFAPI_NR_DMRS_TYPE1) {
|
||||
AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2,
|
||||
"n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
|
||||
} else {
|
||||
if (config_type == NFAPI_NR_DMRS_TYPE1)
|
||||
AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2, "n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
|
||||
else
|
||||
AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2 || n_dmrs_cdm_groups == 3,
|
||||
"n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
|
||||
}
|
||||
|
||||
uint32_t dmrs_rb_bitmap = 0xfff; // all REs taken by dmrs
|
||||
if (config_type == NFAPI_NR_DMRS_TYPE1 && n_dmrs_cdm_groups == 1)
|
||||
dmrs_rb_bitmap = 0x555; // alternating REs starting from 0
|
||||
if (config_type == NFAPI_NR_DMRS_TYPE2 && n_dmrs_cdm_groups == 1)
|
||||
dmrs_rb_bitmap = 0xc3; // REs 0,1 and 6,7
|
||||
if (config_type == NFAPI_NR_DMRS_TYPE2 && n_dmrs_cdm_groups == 2)
|
||||
dmrs_rb_bitmap = 0x3cf; // REs 0,1,2,3 and 6,7,8,9
|
||||
|
||||
// csi_res_bitmap LS 16 bits for even RBs, MS 16 bits for odd RBs
|
||||
uint32_t csi_res_even = csi_res_bitmap & 0xfff;
|
||||
uint32_t csi_res_odd = (csi_res_bitmap >> 16) & 0xfff;
|
||||
AssertFatal((dmrs_rb_bitmap & csi_res_even) == 0, "DMRS RE overlapping with CSI RE, it shouldn't happen\n");
|
||||
AssertFatal((dmrs_rb_bitmap & csi_res_odd) == 0, "DMRS RE overlapping with CSI RE, it shouldn't happen\n");
|
||||
uint32_t dmrs_csi_overlap_even = csi_res_even + dmrs_rb_bitmap;
|
||||
uint32_t dmrs_csi_overlap_odd = csi_res_odd + dmrs_rb_bitmap;
|
||||
|
||||
const unsigned short start_re = (frame_parms->first_carrier_offset + start_rb * NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
|
||||
int8_t validDmrsEst;
|
||||
@@ -1126,7 +1233,7 @@ static void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
|
||||
int32_t *dl_ch0 = &dl_ch_estimates[(l * frame_parms->nb_antennas_rx) + aarx][validDmrsEst * frame_parms->ofdm_symbol_size];
|
||||
int32_t *dl_ch0_ext = dl_ch_estimates_ext[(l * frame_parms->nb_antennas_rx) + aarx];
|
||||
|
||||
if (pilots == 0) { //data symbol only
|
||||
if (pilots == 0 && csi_res_bitmap == 0) { // data symbol only
|
||||
if (l == 0) {
|
||||
if (start_re + nb_rb_pdsch * NR_NB_SC_PER_RB <= frame_parms->ofdm_symbol_size) {
|
||||
memcpy(rxF_ext, &rxF[start_re], nb_rb_pdsch * NR_NB_SC_PER_RB * sizeof(int32_t));
|
||||
@@ -1139,65 +1246,24 @@ static void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
|
||||
}
|
||||
memcpy(dl_ch0_ext, dl_ch0, nb_rb_pdsch * NR_NB_SC_PER_RB * sizeof(int32_t));
|
||||
}
|
||||
else if (config_type == NFAPI_NR_DMRS_TYPE1){
|
||||
if (n_dmrs_cdm_groups == 1) { //data is multiplexed
|
||||
if (l == 0) {
|
||||
unsigned short k = start_re;
|
||||
for (unsigned short j = 0; j < 6*nb_rb_pdsch; j += 3) {
|
||||
rxF_ext[j] = rxF[k+1];
|
||||
rxF_ext[j+1] = rxF[k+3];
|
||||
rxF_ext[j+2] = rxF[k+5];
|
||||
k += 6;
|
||||
if (k >= frame_parms->ofdm_symbol_size)
|
||||
k -= frame_parms->ofdm_symbol_size;
|
||||
else {
|
||||
int j = 0;
|
||||
int k = start_re;
|
||||
for (int rb = 0; rb < nb_rb_pdsch; rb++) {
|
||||
uint32_t overlap_map = rb % 2 ? dmrs_csi_overlap_odd : dmrs_csi_overlap_even;
|
||||
for (int re = 0; re < 12; re++) {
|
||||
if (((overlap_map >> re) & 0x01) == 0) {
|
||||
// DATA RE
|
||||
if (l == 0)
|
||||
rxF_ext[j] = rxF[k];
|
||||
dl_ch0_ext[j] = dl_ch0[re];
|
||||
j++;
|
||||
}
|
||||
k++;
|
||||
if (k >= frame_parms->ofdm_symbol_size)
|
||||
k -= frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
for (unsigned short j = 0; j < 6*nb_rb_pdsch; j += 3) {
|
||||
dl_ch0_ext[j] = dl_ch0[1];
|
||||
dl_ch0_ext[j+1] = dl_ch0[3];
|
||||
dl_ch0_ext[j+2] = dl_ch0[5];
|
||||
dl_ch0 += 6;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {//NFAPI_NR_DMRS_TYPE2
|
||||
if (n_dmrs_cdm_groups == 1) { //data is multiplexed
|
||||
if (l == 0) {
|
||||
unsigned short k = start_re;
|
||||
for (unsigned short j = 0; j < 8*nb_rb_pdsch; j += 4) {
|
||||
rxF_ext[j] = rxF[k+2];
|
||||
rxF_ext[j+1] = rxF[k+3];
|
||||
rxF_ext[j+2] = rxF[k+4];
|
||||
rxF_ext[j+3] = rxF[k+5];
|
||||
k += 6;
|
||||
if (k >= frame_parms->ofdm_symbol_size)
|
||||
k -= frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
}
|
||||
for (unsigned short j = 0; j < 8*nb_rb_pdsch; j += 4) {
|
||||
dl_ch0_ext[j] = dl_ch0[2];
|
||||
dl_ch0_ext[j+1] = dl_ch0[3];
|
||||
dl_ch0_ext[j+2] = dl_ch0[4];
|
||||
dl_ch0_ext[j+3] = dl_ch0[5];
|
||||
dl_ch0 += 6;
|
||||
}
|
||||
}
|
||||
else if (n_dmrs_cdm_groups == 2) { //data is multiplexed
|
||||
if (l == 0) {
|
||||
unsigned short k = start_re;
|
||||
for (unsigned short j = 0; j < 4*nb_rb_pdsch; j += 2) {
|
||||
rxF_ext[j] = rxF[k+4];
|
||||
rxF_ext[j+1] = rxF[k+5];
|
||||
k += 6;
|
||||
if (k >= frame_parms->ofdm_symbol_size)
|
||||
k -= frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
}
|
||||
for (unsigned short j = 0; j < 4*nb_rb_pdsch; j += 2) {
|
||||
dl_ch0_ext[j] = dl_ch0[4];
|
||||
dl_ch0_ext[j+1] = dl_ch0[5];
|
||||
dl_ch0 += 6;
|
||||
}
|
||||
dl_ch0 += 12;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,16 +151,13 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
||||
start_meas(&ue->ulsch_ldpc_encoding_stats);
|
||||
if (ldpc_interface_offload.LDPCencoder) {
|
||||
for (int j = 0; j < impp.n_segments; j++) {
|
||||
impp.E = nr_get_E(G, impp.n_segments, impp.Qm, ulsch->pusch_pdu.nrOfLayers, j);
|
||||
uint8_t *f = harq_process->f + r_offset;
|
||||
ldpc_interface_offload.LDPCencoder(&harq_process->c[j], &f, &impp);
|
||||
r_offset += impp.E;
|
||||
impp.perCB[j].E_cb = nr_get_E(G, impp.n_segments, impp.Qm, ulsch->pusch_pdu.nrOfLayers, j);
|
||||
}
|
||||
ldpc_interface_offload.LDPCencoder(harq_process->c, &harq_process->f, &impp);
|
||||
} else {
|
||||
if (ulsch->pusch_pdu.pusch_data.new_data_indicator) {
|
||||
for (int j = 0; j < (impp.n_segments / 8 + 1); j++) {
|
||||
impp.macro_num = j;
|
||||
impp.E = nr_get_E(G, impp.n_segments, impp.Qm, ulsch->pusch_pdu.nrOfLayers, j);
|
||||
impp.Kr = impp.K;
|
||||
ldpc_interface.LDPCencoder(harq_process->c, harq_process->d, &impp);
|
||||
}
|
||||
@@ -191,7 +188,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
||||
ulsch->pusch_pdu.pusch_data.rv_index);
|
||||
|
||||
///////////////////////// d---->| Rate matching bit selection |---->e /////////////////////////
|
||||
impp.E = nr_get_E(G, impp.n_segments, impp.Qm, ulsch->pusch_pdu.nrOfLayers, r);
|
||||
impp.perCB[r].E_cb = nr_get_E(G, impp.n_segments, impp.Qm, ulsch->pusch_pdu.nrOfLayers, r);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RATE_MATCHING_LDPC, VCD_FUNCTION_IN);
|
||||
start_meas(&ue->ulsch_rate_matching_stats);
|
||||
@@ -204,7 +201,8 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
||||
impp.F,
|
||||
impp.Kr - impp.F - 2 * impp.Zc,
|
||||
impp.rv,
|
||||
impp.E) == -1)
|
||||
impp.perCB[r].E_cb)
|
||||
== -1)
|
||||
return -1;
|
||||
|
||||
stop_meas(&ue->ulsch_rate_matching_stats);
|
||||
@@ -218,10 +216,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
||||
///////////////////////// e---->| Rate matching bit interleaving |---->f /////////////////////////
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INTERLEAVING_LDPC, VCD_FUNCTION_IN);
|
||||
start_meas(&ue->ulsch_interleaving_stats);
|
||||
nr_interleaving_ldpc(impp.E,
|
||||
impp.Qm,
|
||||
harq_process->e + r_offset,
|
||||
harq_process->f + r_offset);
|
||||
nr_interleaving_ldpc(impp.perCB[r].E_cb, impp.Qm, harq_process->e + r_offset, harq_process->f + r_offset);
|
||||
stop_meas(&ue->ulsch_interleaving_stats);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INTERLEAVING_LDPC, VCD_FUNCTION_OUT);
|
||||
@@ -231,7 +226,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
||||
if (r == impp.n_segments - 1)
|
||||
write_output("enc_output.m","enc", harq_process->f, G, 1, 4);
|
||||
#endif
|
||||
r_offset += impp.E;
|
||||
r_offset += impp.perCB[r].E_cb;
|
||||
}
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -510,6 +510,7 @@ typedef struct PHY_VARS_NR_UE_s {
|
||||
|
||||
uint8_t max_ldpc_iterations;
|
||||
|
||||
int ldpc_offload_enable;
|
||||
/// SRS variables
|
||||
nr_srs_info_t *nr_srs_info;
|
||||
|
||||
|
||||
@@ -276,10 +276,12 @@ static void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req)
|
||||
bool decodeSuccess = (rdata->decodeIterations <= rdata->decoderParms.numMaxIter);
|
||||
ulsch_harq->processedSegments++;
|
||||
LOG_D(PHY,
|
||||
"processing result of segment: %d, processed %d/%d\n",
|
||||
"processing result of segment: %d, processed %d/%d, %s\n",
|
||||
rdata->segment_r,
|
||||
ulsch_harq->processedSegments,
|
||||
rdata->nbSegments);
|
||||
rdata->nbSegments,
|
||||
decodeSuccess ? "Decoded Successfully" : "Decoding Unsuccessful");
|
||||
|
||||
if (decodeSuccess) {
|
||||
memcpy(ulsch_harq->b + rdata->offset, ulsch_harq->c[r], rdata->Kr_bytes - (ulsch_harq->F >> 3) - ((ulsch_harq->C > 1) ? 3 : 0));
|
||||
|
||||
@@ -466,11 +468,16 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
||||
|
||||
// put timing advance command in 0..63 range
|
||||
timing_advance_update += 31;
|
||||
timing_advance_update = max(timing_advance_update, 0);
|
||||
timing_advance_update = min(timing_advance_update, 63);
|
||||
|
||||
if (timing_advance_update < 0) timing_advance_update = 0;
|
||||
if (timing_advance_update > 63) timing_advance_update = 63;
|
||||
|
||||
if (crc_flag == 0) LOG_D(PHY, "%d.%d : Received PUSCH : Estimated timing advance PUSCH is = %d, timing_advance_update is %d \n", frame,slot_rx,sync_pos,timing_advance_update);
|
||||
if (crc_flag == 0)
|
||||
LOG_D(PHY,
|
||||
"%d.%d : Received PUSCH : Estimated timing advance PUSCH is = %d, timing_advance_update is %d \n",
|
||||
frame,
|
||||
slot_rx,
|
||||
sync_pos,
|
||||
timing_advance_update);
|
||||
|
||||
// estimate UL_CQI for MAC
|
||||
int SNRtimes10 =
|
||||
|
||||
@@ -149,9 +149,9 @@ int nr_ue_pdcch_procedures(PHY_VARS_NR_UE *ue,
|
||||
int n_ss,
|
||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
|
||||
|
||||
int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
|
||||
void nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
|
||||
|
||||
void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
|
||||
@@ -637,6 +637,54 @@ static void send_dl_done_to_tx_thread(notifiedFIFO_t *nf, int rx_slot)
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t compute_csi_rm_unav_res(fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config)
|
||||
{
|
||||
uint32_t unav_res = 0;
|
||||
for (int i = 0; i < dlsch_config->numCsiRsForRateMatching; i++) {
|
||||
fapi_nr_dl_config_csirs_pdu_rel15_t *csi_pdu = &dlsch_config->csiRsForRateMatching[i];
|
||||
// check overlapping symbols
|
||||
int num_overlap_symb = 0;
|
||||
// num of consecutive csi symbols from l0 included
|
||||
int num_l0 [18] = {1, 1, 1, 1, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 4, 2, 2, 4};
|
||||
int num_symb = num_l0[csi_pdu->row - 1];
|
||||
for (int s = 0; s < num_symb; s++) {
|
||||
int l0_symb = csi_pdu->symb_l0 + s;
|
||||
if (l0_symb >= dlsch_config->start_symbol && l0_symb <= dlsch_config->start_symbol + dlsch_config->number_symbols)
|
||||
num_overlap_symb++;
|
||||
}
|
||||
// check also l1 if relevant
|
||||
if (csi_pdu->row == 13 || csi_pdu->row == 14 || csi_pdu->row == 16 || csi_pdu->row == 17) {
|
||||
num_symb += 2;
|
||||
for (int s = 0; s < 2; s++) { // two consecutive symbols including l1
|
||||
int l1_symb = csi_pdu->symb_l1 + s;
|
||||
if (l1_symb >= dlsch_config->start_symbol && l1_symb <= dlsch_config->start_symbol + dlsch_config->number_symbols)
|
||||
num_overlap_symb++;
|
||||
}
|
||||
}
|
||||
if (num_overlap_symb == 0)
|
||||
continue;
|
||||
// check number overlapping prbs
|
||||
// assuming CSI is spanning the whole BW
|
||||
AssertFatal(dlsch_config->BWPSize <= csi_pdu->nr_of_rbs, "Assuming CSI-RS is spanning the whold BWP this shouldn't happen\n");
|
||||
int dlsch_start = dlsch_config->start_rb + dlsch_config->BWPStart;
|
||||
int num_overlapping_prbs = dlsch_config->number_rbs;
|
||||
if (num_overlapping_prbs < 1)
|
||||
continue; // no overlapping prbs
|
||||
if (csi_pdu->freq_density < 2) { // 0.5 density
|
||||
num_overlapping_prbs /= 2;
|
||||
// odd number of prbs and the start PRB is even/odd when CSI is in even/odd PRBs
|
||||
if ((num_overlapping_prbs % 2) && ((dlsch_start % 2) == csi_pdu->freq_density))
|
||||
num_overlapping_prbs += 1;
|
||||
}
|
||||
// density is number or res per port per rb (over all symbols)
|
||||
int ports [18] = {1, 1, 2, 4, 4, 8, 8, 8, 12, 12, 16, 16, 24, 24, 24, 32, 32, 32};
|
||||
int num_csi_res_per_prb = csi_pdu->freq_density == 3 ? 3 : 1;
|
||||
num_csi_res_per_prb *= ports[csi_pdu->row - 1];
|
||||
unav_res += num_overlapping_prbs * num_csi_res_per_prb * num_overlap_symb / num_symb;
|
||||
}
|
||||
return unav_res;
|
||||
}
|
||||
|
||||
static bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
NR_UE_DLSCH_t dlsch[2],
|
||||
@@ -771,10 +819,10 @@ static bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
int ptrsSymbPerSlot = get_ptrs_symbols_in_slot(ptrsSymbPos, dlsch_config->start_symbol, dlsch_config->number_symbols);
|
||||
unav_res = n_ptrs * ptrsSymbPerSlot;
|
||||
}
|
||||
int G1 =
|
||||
nr_get_G(dlsch_config->number_rbs, nb_symb_sch, nb_re_dmrs, dmrs_len, unav_res, dlsch_config->qamModOrder, dlsch[1].Nl);
|
||||
unav_res += compute_csi_rm_unav_res(dlsch_config);
|
||||
G = nr_get_G(dlsch_config->number_rbs, nb_symb_sch, nb_re_dmrs, dmrs_len, unav_res, dlsch_config->qamModOrder, dlsch[1].Nl);
|
||||
start_meas(&ue->dlsch_unscrambling_stats);
|
||||
nr_dlsch_unscrambling(llr[1], G1, 0, dlsch[1].dlsch_config.dlDataScramblingId, dlsch[1].rnti);
|
||||
nr_dlsch_unscrambling(llr[1], G, 0, dlsch[1].dlsch_config.dlDataScramblingId, dlsch[1].rnti);
|
||||
stop_meas(&ue->dlsch_unscrambling_stats);
|
||||
|
||||
start_meas(&ue->dlsch_decoding_stats);
|
||||
@@ -797,12 +845,14 @@ static bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
|
||||
stop_meas(&ue->dlsch_decoding_stats);
|
||||
if (cpumeas(CPUMEAS_GETSTATE)) {
|
||||
LOG_D(PHY, " --> Unscrambling for CW1 %5.3f\n",
|
||||
(ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
|
||||
LOG_D(PHY, "AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
|
||||
frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats.p_time)/(cpuf*1000.0));
|
||||
}
|
||||
LOG_D(PHY, "harq_pid: %d, TBS expected dlsch1: %d \n", harq_pid, dlsch[1].dlsch_config.TBS);
|
||||
LOG_D(PHY, " --> Unscrambling for CW1 %5.3f\n", (ue->dlsch_unscrambling_stats.p_time) / (cpuf * 1000.0));
|
||||
LOG_D(PHY,
|
||||
"AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
|
||||
frame_rx % 1024,
|
||||
nr_slot_rx,
|
||||
(ue->dlsch_decoding_stats.p_time) / (cpuf * 1000.0));
|
||||
}
|
||||
LOG_D(PHY, "harq_pid: %d, TBS expected dlsch1: %d \n", harq_pid, dlsch[1].dlsch_config.TBS);
|
||||
}
|
||||
|
||||
// send to mac
|
||||
@@ -944,7 +994,7 @@ int pbch_pdcch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_
|
||||
char output[harq_output_len];
|
||||
char *p = output;
|
||||
const char *end = output + harq_output_len;
|
||||
p += snprintf(p, end - p, "Harq round stats for Downlink: %d", ue->dl_stats[0]);
|
||||
p += snprintf(p, end - p, "[UE %d] Harq round stats for Downlink: %d", ue->Mod_id, ue->dl_stats[0]);
|
||||
for (int round = 1; round < 16 && (round < 3 || ue->dl_stats[round] != 0); ++round)
|
||||
p += snprintf(p, end - p,"/%d", ue->dl_stats[round]);
|
||||
LOG_I(NR_PHY,"%s\n", output);
|
||||
@@ -1004,24 +1054,50 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_
|
||||
start_meas(&meas);
|
||||
// do procedures for C-RNTI
|
||||
|
||||
bool slot_fep_map[14] = {0};
|
||||
const uint32_t rxdataF_sz = ue->frame_parms.samples_per_slot_wCP;
|
||||
__attribute__ ((aligned(32))) c16_t rxdataF[ue->frame_parms.nb_antennas_rx][rxdataF_sz];
|
||||
|
||||
// do procedures for CSI-IM
|
||||
if ((ue->csiim_vars[gNB_id]) && (ue->csiim_vars[gNB_id]->active == 1)) {
|
||||
for(int symb_idx = 0; symb_idx < 4; symb_idx++) {
|
||||
int symb = ue->csiim_vars[gNB_id]->csiim_config_pdu.l_csiim[symb_idx];
|
||||
if (!slot_fep_map[symb]) {
|
||||
nr_slot_fep(ue, &ue->frame_parms, proc, symb, rxdataF, link_type_dl);
|
||||
slot_fep_map[symb] = true;
|
||||
}
|
||||
}
|
||||
nr_ue_csi_im_procedures(ue, proc, rxdataF);
|
||||
ue->csiim_vars[gNB_id]->active = 0;
|
||||
}
|
||||
|
||||
// do procedures for CSI-RS
|
||||
if ((ue->csirs_vars[gNB_id]) && (ue->csirs_vars[gNB_id]->active == 1)) {
|
||||
for(int symb = 0; symb < NR_SYMBOLS_PER_SLOT; symb++) {
|
||||
if(is_csi_rs_in_symbol(ue->csirs_vars[gNB_id]->csirs_config_pdu, symb)) {
|
||||
if (!slot_fep_map[symb]) {
|
||||
nr_slot_fep(ue, &ue->frame_parms, proc, symb, rxdataF, link_type_dl);
|
||||
slot_fep_map[symb] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
nr_ue_csi_rs_procedures(ue, proc, rxdataF);
|
||||
ue->csirs_vars[gNB_id]->active = 0;
|
||||
}
|
||||
|
||||
if (dlsch[0].active) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDSCH, VCD_FUNCTION_IN);
|
||||
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config = &dlsch[0].dlsch_config;
|
||||
uint16_t nb_symb_sch = dlsch_config->number_symbols;
|
||||
uint16_t start_symb_sch = dlsch_config->start_symbol;
|
||||
|
||||
LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
|
||||
//to update from pdsch config
|
||||
LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx % 1024, nr_slot_rx);
|
||||
|
||||
for (uint16_t m=start_symb_sch;m<(nb_symb_sch+start_symb_sch) ; m++){
|
||||
nr_slot_fep(ue,
|
||||
&ue->frame_parms,
|
||||
proc,
|
||||
m, // to be updated from higher layer
|
||||
rxdataF,
|
||||
link_type_dl);
|
||||
for (int m = start_symb_sch; m < (nb_symb_sch + start_symb_sch) ; m++) {
|
||||
if (!slot_fep_map[m]) {
|
||||
nr_slot_fep(ue, &ue->frame_parms, proc, m, rxdataF, link_type_dl);
|
||||
slot_fep_map[m] = true;
|
||||
}
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDSCH, VCD_FUNCTION_OUT);
|
||||
|
||||
@@ -1045,6 +1121,7 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_
|
||||
int ptrsSymbPerSlot = get_ptrs_symbols_in_slot(ptrsSymbPos, dlsch_config->start_symbol, dlsch_config->number_symbols);
|
||||
unav_res = n_ptrs * ptrsSymbPerSlot;
|
||||
}
|
||||
unav_res += compute_csi_rm_unav_res(dlsch_config);
|
||||
int G = nr_get_G(dlsch_config->number_rbs,
|
||||
dlsch_config->number_symbols,
|
||||
nb_re_dmrs,
|
||||
@@ -1097,36 +1174,6 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_
|
||||
free(llr[i]);
|
||||
}
|
||||
|
||||
// do procedures for CSI-IM
|
||||
if ((ue->csiim_vars[gNB_id]) && (ue->csiim_vars[gNB_id]->active == 1)) {
|
||||
int l_csiim[4] = {-1, -1, -1, -1};
|
||||
for(int symb_idx = 0; symb_idx < 4; symb_idx++) {
|
||||
bool nr_slot_fep_done = false;
|
||||
for (int symb_idx2 = 0; symb_idx2 < symb_idx; symb_idx2++) {
|
||||
if (l_csiim[symb_idx2] == ue->csiim_vars[gNB_id]->csiim_config_pdu.l_csiim[symb_idx]) {
|
||||
nr_slot_fep_done = true;
|
||||
}
|
||||
}
|
||||
l_csiim[symb_idx] = ue->csiim_vars[gNB_id]->csiim_config_pdu.l_csiim[symb_idx];
|
||||
if(nr_slot_fep_done == false) {
|
||||
nr_slot_fep(ue, &ue->frame_parms, proc, ue->csiim_vars[gNB_id]->csiim_config_pdu.l_csiim[symb_idx], rxdataF, link_type_dl);
|
||||
}
|
||||
}
|
||||
nr_ue_csi_im_procedures(ue, proc, rxdataF);
|
||||
ue->csiim_vars[gNB_id]->active = 0;
|
||||
}
|
||||
|
||||
// do procedures for CSI-RS
|
||||
if ((ue->csirs_vars[gNB_id]) && (ue->csirs_vars[gNB_id]->active == 1)) {
|
||||
for(int symb = 0; symb < NR_SYMBOLS_PER_SLOT; symb++) {
|
||||
if(is_csi_rs_in_symbol(ue->csirs_vars[gNB_id]->csirs_config_pdu,symb)) {
|
||||
nr_slot_fep(ue, &ue->frame_parms, proc, symb, rxdataF, link_type_dl);
|
||||
}
|
||||
}
|
||||
nr_ue_csi_rs_procedures(ue, proc, rxdataF);
|
||||
ue->csirs_vars[gNB_id]->active = 0;
|
||||
}
|
||||
|
||||
start_meas(&meas);
|
||||
|
||||
if (nr_slot_rx==9) {
|
||||
|
||||
@@ -5218,7 +5218,7 @@ bool supported_bw_comparison(int bw_mhz, NR_SupportedBandwidth_t *supported_BW,
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t compute_PDU_length(uint32_t num_TLV, uint16_t total_length)
|
||||
uint32_t compute_PDU_length(uint32_t num_TLV, uint32_t total_length)
|
||||
{
|
||||
uint32_t pdu_length = 8; // 2 bytes PDU_Length + 2 bytes PDU_Index + 4 bytes num_TLV
|
||||
// For each TLV, add 2 bytes tag + 2 bytes length + value size without padding
|
||||
|
||||
@@ -311,7 +311,7 @@ void compute_csi_bitlen(const NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report
|
||||
|
||||
uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report);
|
||||
|
||||
uint32_t compute_PDU_length(uint32_t num_TLV, uint16_t total_length);
|
||||
uint32_t compute_PDU_length(uint32_t num_TLV, uint32_t total_length);
|
||||
|
||||
rnti_t nr_get_ra_rnti(uint8_t s_id, uint8_t t_id, uint8_t f_id, uint8_t ul_carrier_id);
|
||||
|
||||
|
||||
@@ -250,7 +250,7 @@ static void config_common_ue(NR_UE_MAC_INST_t *mac,
|
||||
mac->phy_config.CC_id = cc_idP;
|
||||
|
||||
// carrier config
|
||||
LOG_D(MAC, "Entering UE Config Common\n");
|
||||
LOG_D(MAC, "[UE %d] Entering UE Config Common\n", mac->ue_id);
|
||||
|
||||
AssertFatal(scc->downlinkConfigCommon, "Not expecting downlinkConfigCommon to be NULL here\n");
|
||||
|
||||
@@ -965,6 +965,73 @@ static void setup_puschconfig(NR_PUSCH_Config_t *source, NR_PUSCH_Config_t *targ
|
||||
}
|
||||
}
|
||||
|
||||
static void configure_csi_resourcemapping(NR_CSI_RS_ResourceMapping_t *target, NR_CSI_RS_ResourceMapping_t *source)
|
||||
{
|
||||
if (target->frequencyDomainAllocation.present != source->frequencyDomainAllocation.present) {
|
||||
UPDATE_NP_IE(target->frequencyDomainAllocation,
|
||||
source->frequencyDomainAllocation,
|
||||
struct NR_CSI_RS_ResourceMapping__frequencyDomainAllocation);
|
||||
}
|
||||
else {
|
||||
switch (source->frequencyDomainAllocation.present) {
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1:
|
||||
target->frequencyDomainAllocation.choice.row1.size = source->frequencyDomainAllocation.choice.row1.size;
|
||||
target->frequencyDomainAllocation.choice.row1.bits_unused = source->frequencyDomainAllocation.choice.row1.bits_unused;
|
||||
if (!target->frequencyDomainAllocation.choice.row1.buf)
|
||||
target->frequencyDomainAllocation.choice.row1.buf =
|
||||
calloc(target->frequencyDomainAllocation.choice.row1.size, sizeof(uint8_t));
|
||||
for (int i = 0; i < target->frequencyDomainAllocation.choice.row1.size; i++)
|
||||
target->frequencyDomainAllocation.choice.row1.buf[i] = source->frequencyDomainAllocation.choice.row1.buf[i];
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2:
|
||||
target->frequencyDomainAllocation.choice.row2.size = source->frequencyDomainAllocation.choice.row2.size;
|
||||
target->frequencyDomainAllocation.choice.row2.bits_unused = source->frequencyDomainAllocation.choice.row2.bits_unused;
|
||||
if (!target->frequencyDomainAllocation.choice.row2.buf)
|
||||
target->frequencyDomainAllocation.choice.row2.buf =
|
||||
calloc(target->frequencyDomainAllocation.choice.row2.size, sizeof(uint8_t));
|
||||
for (int i = 0; i < target->frequencyDomainAllocation.choice.row2.size; i++)
|
||||
target->frequencyDomainAllocation.choice.row2.buf[i] = source->frequencyDomainAllocation.choice.row2.buf[i];
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row4:
|
||||
target->frequencyDomainAllocation.choice.row4.size = source->frequencyDomainAllocation.choice.row4.size;
|
||||
target->frequencyDomainAllocation.choice.row4.bits_unused = source->frequencyDomainAllocation.choice.row4.bits_unused;
|
||||
if (!target->frequencyDomainAllocation.choice.row4.buf)
|
||||
target->frequencyDomainAllocation.choice.row4.buf =
|
||||
calloc(target->frequencyDomainAllocation.choice.row4.size, sizeof(uint8_t));
|
||||
for (int i = 0; i < target->frequencyDomainAllocation.choice.row4.size; i++)
|
||||
target->frequencyDomainAllocation.choice.row4.buf[i] = source->frequencyDomainAllocation.choice.row4.buf[i];
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other:
|
||||
target->frequencyDomainAllocation.choice.other.size = source->frequencyDomainAllocation.choice.other.size;
|
||||
target->frequencyDomainAllocation.choice.other.bits_unused = source->frequencyDomainAllocation.choice.other.bits_unused;
|
||||
if (!target->frequencyDomainAllocation.choice.other.buf)
|
||||
target->frequencyDomainAllocation.choice.other.buf =
|
||||
calloc(target->frequencyDomainAllocation.choice.other.size, sizeof(uint8_t));
|
||||
for (int i = 0; i < target->frequencyDomainAllocation.choice.other.size; i++)
|
||||
target->frequencyDomainAllocation.choice.other.buf[i] = source->frequencyDomainAllocation.choice.other.buf[i];
|
||||
break;
|
||||
default:
|
||||
AssertFatal(false, "Invalid entry\n");
|
||||
}
|
||||
}
|
||||
target->nrofPorts = source->nrofPorts;
|
||||
target->firstOFDMSymbolInTimeDomain = source->firstOFDMSymbolInTimeDomain;
|
||||
UPDATE_IE(target->firstOFDMSymbolInTimeDomain2, source->firstOFDMSymbolInTimeDomain2, long);
|
||||
target->cdm_Type = source->cdm_Type;
|
||||
target->density = source->density;
|
||||
target->freqBand = source->freqBand;
|
||||
}
|
||||
|
||||
static void config_zp_CSI_RS_Resource(NR_ZP_CSI_RS_Resource_t *target, NR_ZP_CSI_RS_Resource_t *source)
|
||||
{
|
||||
target->zp_CSI_RS_ResourceId = source->zp_CSI_RS_ResourceId;
|
||||
configure_csi_resourcemapping(&target->resourceMapping, &source->resourceMapping);
|
||||
if (source->periodicityAndOffset)
|
||||
UPDATE_IE(target->periodicityAndOffset,
|
||||
source->periodicityAndOffset,
|
||||
NR_CSI_ResourcePeriodicityAndOffset_t);
|
||||
}
|
||||
|
||||
static void setup_pdschconfig(NR_PDSCH_Config_t *source, NR_PDSCH_Config_t *target)
|
||||
{
|
||||
UPDATE_IE(target->dataScramblingIdentityPDSCH, source->dataScramblingIdentityPDSCH, long);
|
||||
@@ -1022,7 +1089,25 @@ static void setup_pdschconfig(NR_PDSCH_Config_t *source, NR_PDSCH_Config_t *targ
|
||||
UPDATE_IE(target->mcs_Table, source->mcs_Table, long);
|
||||
UPDATE_IE(target->maxNrofCodeWordsScheduledByDCI, source->maxNrofCodeWordsScheduledByDCI, long);
|
||||
UPDATE_NP_IE(target->prb_BundlingType, source->prb_BundlingType, struct NR_PDSCH_Config__prb_BundlingType);
|
||||
AssertFatal(source->zp_CSI_RS_ResourceToAddModList == NULL, "Not handled\n");
|
||||
if (source->zp_CSI_RS_ResourceToAddModList) {
|
||||
if (!target->zp_CSI_RS_ResourceToAddModList)
|
||||
target->zp_CSI_RS_ResourceToAddModList = calloc(1, sizeof(*target->zp_CSI_RS_ResourceToAddModList));
|
||||
ADDMOD_IE_FROMLIST_WFUNCTION(source->zp_CSI_RS_ResourceToAddModList,
|
||||
target->zp_CSI_RS_ResourceToAddModList,
|
||||
zp_CSI_RS_ResourceId,
|
||||
NR_ZP_CSI_RS_Resource_t,
|
||||
config_zp_CSI_RS_Resource);
|
||||
}
|
||||
if (source->zp_CSI_RS_ResourceToReleaseList) {
|
||||
RELEASE_IE_FROMLIST(source->zp_CSI_RS_ResourceToReleaseList,
|
||||
target->zp_CSI_RS_ResourceToAddModList,
|
||||
zp_CSI_RS_ResourceId);
|
||||
}
|
||||
if (source->p_ZP_CSI_RS_ResourceSet)
|
||||
HANDLE_SETUPRELEASE_IE(target->p_ZP_CSI_RS_ResourceSet,
|
||||
source->p_ZP_CSI_RS_ResourceSet,
|
||||
NR_ZP_CSI_RS_ResourceSet_t,
|
||||
asn_DEF_NR_ZP_CSI_RS_ResourceSet);
|
||||
AssertFatal(source->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList == NULL, "Not handled\n");
|
||||
AssertFatal(source->sp_ZP_CSI_RS_ResourceSetsToAddModList == NULL, "Not handled\n");
|
||||
}
|
||||
@@ -1750,63 +1835,6 @@ static void configure_maccellgroup(NR_UE_MAC_INST_t *mac, const NR_MAC_CellGroup
|
||||
}
|
||||
}
|
||||
|
||||
static void configure_csi_resourcemapping(NR_CSI_RS_ResourceMapping_t *target, NR_CSI_RS_ResourceMapping_t *source)
|
||||
{
|
||||
if (target->frequencyDomainAllocation.present != source->frequencyDomainAllocation.present) {
|
||||
UPDATE_NP_IE(target->frequencyDomainAllocation,
|
||||
source->frequencyDomainAllocation,
|
||||
struct NR_CSI_RS_ResourceMapping__frequencyDomainAllocation);
|
||||
}
|
||||
else {
|
||||
switch (source->frequencyDomainAllocation.present) {
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1:
|
||||
target->frequencyDomainAllocation.choice.row1.size = source->frequencyDomainAllocation.choice.row1.size;
|
||||
target->frequencyDomainAllocation.choice.row1.bits_unused = source->frequencyDomainAllocation.choice.row1.bits_unused;
|
||||
if (!target->frequencyDomainAllocation.choice.row1.buf)
|
||||
target->frequencyDomainAllocation.choice.row1.buf =
|
||||
calloc(target->frequencyDomainAllocation.choice.row1.size, sizeof(uint8_t));
|
||||
for (int i = 0; i < target->frequencyDomainAllocation.choice.row1.size; i++)
|
||||
target->frequencyDomainAllocation.choice.row1.buf[i] = source->frequencyDomainAllocation.choice.row1.buf[i];
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2:
|
||||
target->frequencyDomainAllocation.choice.row2.size = source->frequencyDomainAllocation.choice.row2.size;
|
||||
target->frequencyDomainAllocation.choice.row2.bits_unused = source->frequencyDomainAllocation.choice.row2.bits_unused;
|
||||
if (!target->frequencyDomainAllocation.choice.row2.buf)
|
||||
target->frequencyDomainAllocation.choice.row2.buf =
|
||||
calloc(target->frequencyDomainAllocation.choice.row2.size, sizeof(uint8_t));
|
||||
for (int i = 0; i < target->frequencyDomainAllocation.choice.row2.size; i++)
|
||||
target->frequencyDomainAllocation.choice.row2.buf[i] = source->frequencyDomainAllocation.choice.row2.buf[i];
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row4:
|
||||
target->frequencyDomainAllocation.choice.row4.size = source->frequencyDomainAllocation.choice.row4.size;
|
||||
target->frequencyDomainAllocation.choice.row4.bits_unused = source->frequencyDomainAllocation.choice.row4.bits_unused;
|
||||
if (!target->frequencyDomainAllocation.choice.row4.buf)
|
||||
target->frequencyDomainAllocation.choice.row4.buf =
|
||||
calloc(target->frequencyDomainAllocation.choice.row4.size, sizeof(uint8_t));
|
||||
for (int i = 0; i < target->frequencyDomainAllocation.choice.row4.size; i++)
|
||||
target->frequencyDomainAllocation.choice.row4.buf[i] = source->frequencyDomainAllocation.choice.row4.buf[i];
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other:
|
||||
target->frequencyDomainAllocation.choice.other.size = source->frequencyDomainAllocation.choice.other.size;
|
||||
target->frequencyDomainAllocation.choice.other.bits_unused = source->frequencyDomainAllocation.choice.other.bits_unused;
|
||||
if (!target->frequencyDomainAllocation.choice.other.buf)
|
||||
target->frequencyDomainAllocation.choice.other.buf =
|
||||
calloc(target->frequencyDomainAllocation.choice.other.size, sizeof(uint8_t));
|
||||
for (int i = 0; i < target->frequencyDomainAllocation.choice.other.size; i++)
|
||||
target->frequencyDomainAllocation.choice.other.buf[i] = source->frequencyDomainAllocation.choice.other.buf[i];
|
||||
break;
|
||||
default:
|
||||
AssertFatal(false, "Invalid entry\n");
|
||||
}
|
||||
}
|
||||
target->nrofPorts = source->nrofPorts;
|
||||
target->firstOFDMSymbolInTimeDomain = source->firstOFDMSymbolInTimeDomain;
|
||||
UPDATE_IE(target->firstOFDMSymbolInTimeDomain2, source->firstOFDMSymbolInTimeDomain2, long);
|
||||
target->cdm_Type = source->cdm_Type;
|
||||
target->density = source->density;
|
||||
target->freqBand = source->freqBand;
|
||||
}
|
||||
|
||||
static void configure_csirs_resource(NR_NZP_CSI_RS_Resource_t *target, NR_NZP_CSI_RS_Resource_t *source)
|
||||
{
|
||||
configure_csi_resourcemapping(&target->resourceMapping, &source->resourceMapping);
|
||||
@@ -2224,7 +2252,7 @@ void nr_rrc_mac_config_req_cg(module_id_t module_id,
|
||||
NR_CellGroupConfig_t *cell_group_config,
|
||||
NR_UE_NR_Capability_t *ue_Capability)
|
||||
{
|
||||
LOG_I(MAC,"Applying CellGroupConfig from gNodeB\n");
|
||||
LOG_I(MAC,"[UE %d] Applying CellGroupConfig from gNodeB\n", module_id);
|
||||
AssertFatal(cell_group_config, "CellGroupConfig should not be NULL\n");
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
|
||||
|
||||
|
||||
@@ -243,6 +243,7 @@ int nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
|
||||
|
||||
float nr_get_Pcmax(int p_Max,
|
||||
uint16_t nr_band,
|
||||
frame_type_t frame_type,
|
||||
frequency_range_t frequency_range,
|
||||
int Qm,
|
||||
bool powerBoostPi2BPSK,
|
||||
@@ -268,6 +269,10 @@ and fills the PRACH PDU per each FD occasion.
|
||||
void nr_ue_pucch_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, int slotP);
|
||||
void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot);
|
||||
void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot);
|
||||
void configure_csi_resource_mapping(fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu,
|
||||
NR_CSI_RS_ResourceMapping_t *resourceMapping,
|
||||
uint32_t bwp_size,
|
||||
uint32_t bwp_start);
|
||||
|
||||
/* \brief This function schedules the Msg3 transmission
|
||||
@param
|
||||
|
||||
@@ -130,7 +130,7 @@ NR_UE_MAC_INST_t *nr_l2_init_ue(int nb_inst)
|
||||
AssertFatal(nr_ue_mac_inst, "Couldn't allocate %d instances of MAC module\n", nb_inst);
|
||||
|
||||
for (int j = 0; j < nb_inst; j++) {
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(j);
|
||||
NR_UE_MAC_INST_t *mac = &nr_ue_mac_inst[j];
|
||||
mac->ue_id = j;
|
||||
nr_ue_init_mac(mac);
|
||||
nr_ue_mac_default_configs(mac);
|
||||
|
||||
@@ -81,6 +81,7 @@ void init_RA(NR_UE_MAC_INST_t *mac,
|
||||
// PRACH shall be as specified for QPSK modulated DFT-s-OFDM of equivalent RB allocation (38.101-1)
|
||||
prach_resources->RA_PCMAX = nr_get_Pcmax(mac->p_Max,
|
||||
mac->nr_band,
|
||||
mac->frame_type,
|
||||
mac->frequency_range,
|
||||
2,
|
||||
false,
|
||||
|
||||
@@ -66,9 +66,8 @@ static int get_deltatf(uint16_t nb_of_prbs,
|
||||
int O_UCI);
|
||||
|
||||
// ∆MPR according to Table 6.2.2-3 38.101-1
|
||||
static float get_delta_mpr(uint16_t nr_band, int scs, int N_RB_UL, int n_prbs, int start_prb, int power_class)
|
||||
static float get_delta_mpr(uint16_t nr_band, frame_type_t frame_type, int scs, int N_RB_UL, int n_prbs, int start_prb, int power_class)
|
||||
{
|
||||
frame_type_t frame_type = get_frame_type(nr_band, scs);
|
||||
if (compare_relative_ul_channel_bw(nr_band, scs, N_RB_UL, frame_type)) {
|
||||
if (power_class == 3) {
|
||||
if ((nr_band == 28 || nr_band == 83) && get_supported_bw_mhz(nr_band > 256 ? FR2 : FR1, scs, N_RB_UL) == 30) {
|
||||
@@ -167,6 +166,7 @@ static float get_mpr(int Qm, int N_RB_UL, bool is_transform_precoding, int n_prb
|
||||
// -- no additional MPR (A_MPR_c)
|
||||
float nr_get_Pcmax(int p_Max,
|
||||
uint16_t nr_band,
|
||||
frame_type_t frame_type,
|
||||
frequency_range_t frequency_range,
|
||||
int Qm,
|
||||
bool powerBoostPi2BPSK,
|
||||
@@ -197,7 +197,7 @@ float nr_get_Pcmax(int p_Max,
|
||||
int delta_TC = 0;
|
||||
|
||||
float MPR = get_mpr(Qm, N_RB_UL, is_transform_precoding, n_prbs, start_prb, power_class);
|
||||
float delta_MPR = get_delta_mpr(nr_band, scs, N_RB_UL, n_prbs, start_prb, power_class);
|
||||
float delta_MPR = get_delta_mpr(nr_band, frame_type, scs, N_RB_UL, n_prbs, start_prb, power_class);
|
||||
int A_MPR = 0; // TODO too complicated to implement for now (see 6.2.3 in 38.101-1)
|
||||
int delta_rx_SRS = 0; // TODO for SRS
|
||||
int P_MPR = 0; // to ensure compliance with applicable electromagnetic energy absorption requirements
|
||||
@@ -339,6 +339,7 @@ int16_t get_pucch_tx_power_ue(NR_UE_MAC_INST_t *mac,
|
||||
// modulated CP-OFDM of equivalent RB allocation.
|
||||
int P_CMAX = nr_get_Pcmax(mac->p_Max,
|
||||
mac->nr_band,
|
||||
mac->frame_type,
|
||||
mac->frequency_range,
|
||||
2,
|
||||
false,
|
||||
@@ -519,6 +520,7 @@ int get_pusch_tx_power_ue(NR_UE_MAC_INST_t *mac,
|
||||
int M_pusch_component = 10 * log10((pow(2, mu)) * num_rb);
|
||||
int P_CMAX = nr_get_Pcmax(mac->p_Max,
|
||||
mac->nr_band,
|
||||
mac->frame_type,
|
||||
mac->frequency_range,
|
||||
2,
|
||||
false,
|
||||
|
||||
@@ -230,6 +230,57 @@ void nr_ue_decode_mib(NR_UE_MAC_INST_t *mac, int cc_id)
|
||||
mac->state = UE_SYNC;
|
||||
}
|
||||
|
||||
static void configure_ratematching_csi(fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_pdu,
|
||||
fapi_nr_dl_config_request_t *dl_config,
|
||||
int rnti_type,
|
||||
int frame,
|
||||
int slot,
|
||||
int mu,
|
||||
NR_PDSCH_Config_t *pdsch_config)
|
||||
{
|
||||
// only for C-RNTI, MCS-C-RNTI, CS-RNTI (and only C-RNTI is supported for now)
|
||||
if (rnti_type != TYPE_C_RNTI_)
|
||||
return;
|
||||
|
||||
if (pdsch_config && pdsch_config->zp_CSI_RS_ResourceToAddModList) {
|
||||
for (int i = 0; i < pdsch_config->zp_CSI_RS_ResourceToAddModList->list.count; i++) {
|
||||
NR_ZP_CSI_RS_Resource_t *zp_res = pdsch_config->zp_CSI_RS_ResourceToAddModList->list.array[i];
|
||||
NR_ZP_CSI_RS_ResourceId_t id = zp_res->zp_CSI_RS_ResourceId;
|
||||
NR_SetupRelease_ZP_CSI_RS_ResourceSet_t *zp_set = pdsch_config->p_ZP_CSI_RS_ResourceSet;
|
||||
AssertFatal(zp_set && zp_set->choice.setup, "Only periodic ZP resource set is implemented\n");
|
||||
bool found = false;
|
||||
for (int j = 0; j < zp_set->choice.setup->zp_CSI_RS_ResourceIdList.list.count; j++) {
|
||||
if (*zp_set->choice.setup->zp_CSI_RS_ResourceIdList.list.array[j] == id) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
AssertFatal(found, "Couldn't find periodic ZP resouce in set\n");
|
||||
AssertFatal(zp_res->periodicityAndOffset, "periodicityAndOffset cannot be null for periodic ZP resource\n");
|
||||
int period, offset;
|
||||
csi_period_offset(NULL, zp_res->periodicityAndOffset, &period, &offset);
|
||||
if((frame * nr_slots_per_frame[mu] + slot - offset) % period != 0)
|
||||
continue;
|
||||
AssertFatal(dlsch_pdu->numCsiRsForRateMatching < NFAPI_MAX_NUM_CSI_RATEMATCH, "csiRsForRateMatching out of bounds\n");
|
||||
fapi_nr_dl_config_csirs_pdu_rel15_t *csi_pdu = &dlsch_pdu->csiRsForRateMatching[dlsch_pdu->numCsiRsForRateMatching];
|
||||
csi_pdu->csi_type = 2; // ZP-CSI
|
||||
csi_pdu->subcarrier_spacing = mu;
|
||||
configure_csi_resource_mapping(csi_pdu, &zp_res->resourceMapping, dlsch_pdu->BWPSize, dlsch_pdu->BWPStart);
|
||||
dlsch_pdu->numCsiRsForRateMatching++;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < dl_config->number_pdus; i++) {
|
||||
// This assumes that CSI-RS are scheduled before this moment which is true in current implementation
|
||||
fapi_nr_dl_config_request_pdu_t *csi_req = &dl_config->dl_config_list[i];
|
||||
if (csi_req->pdu_type == FAPI_NR_DL_CONFIG_TYPE_CSI_RS) {
|
||||
AssertFatal(dlsch_pdu->numCsiRsForRateMatching < NFAPI_MAX_NUM_CSI_RATEMATCH, "csiRsForRateMatching out of bounds\n");
|
||||
dlsch_pdu->csiRsForRateMatching[dlsch_pdu->numCsiRsForRateMatching] = csi_req->csirs_config_pdu.csirs_config_rel15;
|
||||
dlsch_pdu->numCsiRsForRateMatching++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int8_t nr_ue_decode_BCCH_DL_SCH(NR_UE_MAC_INST_t *mac,
|
||||
int cc_id,
|
||||
unsigned int gNB_index,
|
||||
@@ -635,8 +686,11 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac,
|
||||
dlsch_pdu->BWPSize = current_DL_BWP->BWPSize;
|
||||
dlsch_pdu->BWPStart = current_DL_BWP->BWPStart;
|
||||
}
|
||||
|
||||
nr_rnti_type_t rnti_type = get_rnti_type(mac, dci_ind->rnti);
|
||||
|
||||
int mux_pattern = 1;
|
||||
if (dci_ind->rnti == SI_RNTI) {
|
||||
if (rnti_type == TYPE_SI_RNTI_) {
|
||||
NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config = mac->type0_PDCCH_CSS_config;
|
||||
mux_pattern = type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern;
|
||||
dl_conf_req->pdu_type = FAPI_NR_DL_CONFIG_TYPE_SI_DLSCH;
|
||||
@@ -646,13 +700,17 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac,
|
||||
dlsch_pdu->SubcarrierSpacing = mac->mib->subCarrierSpacingCommon + 2;
|
||||
} else {
|
||||
dlsch_pdu->SubcarrierSpacing = current_DL_BWP->scs;
|
||||
if (mac->ra.RA_window_cnt >= 0 && dci_ind->rnti == mac->ra.ra_rnti) {
|
||||
if (mac->ra.RA_window_cnt >= 0 && rnti_type == TYPE_RA_RNTI_) {
|
||||
dl_conf_req->pdu_type = FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH;
|
||||
} else {
|
||||
dl_conf_req->pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
|
||||
}
|
||||
}
|
||||
|
||||
dlsch_pdu->numCsiRsForRateMatching = 0;
|
||||
configure_ratematching_csi(dlsch_pdu, dl_config, rnti_type, frame, slot, dlsch_pdu->SubcarrierSpacing, pdsch_config);
|
||||
|
||||
|
||||
/* IDENTIFIER_DCI_FORMATS */
|
||||
/* FREQ_DOM_RESOURCE_ASSIGNMENT_DL */
|
||||
if (nr_ue_process_dci_freq_dom_resource_assignment(NULL,
|
||||
@@ -674,7 +732,7 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac,
|
||||
int dmrs_typeA_pos = mac->dmrs_TypeA_Position;
|
||||
const int coreset_type = dci_ind->coreset_type == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG; // 0 for coreset0, 1 otherwise;
|
||||
|
||||
nr_rnti_type_t rnti_type = get_rnti_type(mac, dci_ind->rnti);
|
||||
|
||||
NR_tda_info_t tda_info = get_dl_tda_info(current_DL_BWP,
|
||||
dci_ind->ss_type,
|
||||
dci->time_domain_assignment.val,
|
||||
@@ -845,7 +903,7 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (dci_ind->rnti != mac->ra.ra_rnti && dci_ind->rnti != SI_RNTI) {
|
||||
if (rnti_type != TYPE_RA_RNTI_ && rnti_type != TYPE_SI_RNTI_) {
|
||||
AssertFatal(1 + dci->pdsch_to_harq_feedback_timing_indicator.val > DURATION_RX_TO_TX,
|
||||
"PDSCH to HARQ feedback time (%d) needs to be higher than DURATION_RX_TO_TX (%d).\n",
|
||||
1 + dci->pdsch_to_harq_feedback_timing_indicator.val,
|
||||
@@ -966,6 +1024,10 @@ static int nr_ue_process_dci_dl_11(NR_UE_MAC_INST_t *mac,
|
||||
dlsch_pdu->BWPStart = current_DL_BWP->BWPStart;
|
||||
dlsch_pdu->SubcarrierSpacing = current_DL_BWP->scs;
|
||||
|
||||
nr_rnti_type_t rnti_type = get_rnti_type(mac, dci_ind->rnti);
|
||||
dlsch_pdu->numCsiRsForRateMatching = 0;
|
||||
configure_ratematching_csi(dlsch_pdu, dl_config, rnti_type, frame, slot, current_DL_BWP->scs, pdsch_Config);
|
||||
|
||||
/* IDENTIFIER_DCI_FORMATS */
|
||||
/* CARRIER_IND */
|
||||
/* BANDWIDTH_PART_IND */
|
||||
@@ -987,7 +1049,7 @@ static int nr_ue_process_dci_dl_11(NR_UE_MAC_INST_t *mac,
|
||||
int dmrs_typeA_pos = mac->dmrs_TypeA_Position;
|
||||
int mux_pattern = 1;
|
||||
const int coreset_type = dci_ind->coreset_type == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG; // 0 for coreset0, 1 otherwise;
|
||||
nr_rnti_type_t rnti_type = get_rnti_type(mac, dci_ind->rnti);
|
||||
|
||||
NR_tda_info_t tda_info = get_dl_tda_info(current_DL_BWP,
|
||||
dci_ind->ss_type,
|
||||
dci->time_domain_assignment.val,
|
||||
|
||||
@@ -1197,15 +1197,16 @@ void nr_ue_dl_scheduler(NR_UE_MAC_INST_t *mac, nr_downlink_indication_t *dl_info
|
||||
if (mac->state == UE_NOT_SYNC || mac->state == UE_DETACHING)
|
||||
return;
|
||||
|
||||
ue_dci_configuration(mac, dl_config, rx_frame, rx_slot);
|
||||
|
||||
if (mac->ul_time_alignment.ta_apply != no_ta)
|
||||
schedule_ta_command(dl_config, &mac->ul_time_alignment);
|
||||
if (mac->state == UE_CONNECTED) {
|
||||
nr_schedule_csirs_reception(mac, rx_frame, rx_slot);
|
||||
nr_schedule_csi_for_im(mac, rx_frame, rx_slot);
|
||||
}
|
||||
|
||||
ue_dci_configuration(mac, dl_config, rx_frame, rx_slot);
|
||||
|
||||
if (mac->ul_time_alignment.ta_apply != no_ta)
|
||||
schedule_ta_command(dl_config, &mac->ul_time_alignment);
|
||||
|
||||
nr_scheduled_response_t scheduled_response = {.dl_config = dl_config,
|
||||
.module_id = mac->ue_id,
|
||||
.CC_id = dl_info->cc_id,
|
||||
@@ -2418,6 +2419,113 @@ uint8_t set_csirs_measurement_bitmap(NR_CSI_MeasConfig_t *csi_measconfig, NR_CSI
|
||||
return meas_bitmap;
|
||||
}
|
||||
|
||||
void configure_csi_resource_mapping(fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu,
|
||||
NR_CSI_RS_ResourceMapping_t *resourceMapping,
|
||||
uint32_t bwp_size,
|
||||
uint32_t bwp_start)
|
||||
{
|
||||
// According to last paragraph of TS 38.214 5.2.2.3.1
|
||||
if (resourceMapping->freqBand.startingRB < bwp_start)
|
||||
csirs_config_pdu->start_rb = bwp_start;
|
||||
else
|
||||
csirs_config_pdu->start_rb = resourceMapping->freqBand.startingRB;
|
||||
if (resourceMapping->freqBand.nrofRBs > (bwp_start + bwp_size - csirs_config_pdu->start_rb))
|
||||
csirs_config_pdu->nr_of_rbs = bwp_start + bwp_size - csirs_config_pdu->start_rb;
|
||||
else
|
||||
csirs_config_pdu->nr_of_rbs = resourceMapping->freqBand.nrofRBs;
|
||||
AssertFatal(csirs_config_pdu->nr_of_rbs >= 24, "CSI-RS has %d RBs, but the minimum is 24\n", csirs_config_pdu->nr_of_rbs);
|
||||
|
||||
csirs_config_pdu->symb_l0 = resourceMapping->firstOFDMSymbolInTimeDomain;
|
||||
if (resourceMapping->firstOFDMSymbolInTimeDomain2)
|
||||
csirs_config_pdu->symb_l1 = *resourceMapping->firstOFDMSymbolInTimeDomain2;
|
||||
csirs_config_pdu->cdm_type = resourceMapping->cdm_Type;
|
||||
|
||||
csirs_config_pdu->freq_density = resourceMapping->density.present;
|
||||
if ((resourceMapping->density.present == NR_CSI_RS_ResourceMapping__density_PR_dot5)
|
||||
&& (resourceMapping->density.choice.dot5 == NR_CSI_RS_ResourceMapping__density__dot5_evenPRBs))
|
||||
csirs_config_pdu->freq_density--;
|
||||
|
||||
switch(resourceMapping->frequencyDomainAllocation.present){
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1:
|
||||
csirs_config_pdu->row = 1;
|
||||
csirs_config_pdu->freq_domain = ((resourceMapping->frequencyDomainAllocation.choice.row1.buf[0]) >> 4) & 0x0f;
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2:
|
||||
csirs_config_pdu->row = 2;
|
||||
csirs_config_pdu->freq_domain = (((resourceMapping->frequencyDomainAllocation.choice.row2.buf[1] >> 4) & 0x0f)
|
||||
| ((resourceMapping->frequencyDomainAllocation.choice.row2.buf[0] << 4) & 0xff0));
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row4:
|
||||
csirs_config_pdu->row = 4;
|
||||
csirs_config_pdu->freq_domain = ((resourceMapping->frequencyDomainAllocation.choice.row4.buf[0]) >> 5) & 0x07;
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other:
|
||||
csirs_config_pdu->freq_domain = ((resourceMapping->frequencyDomainAllocation.choice.other.buf[0]) >> 2) & 0x3f;
|
||||
// determining the row of table 7.4.1.5.3-1 in 38.211
|
||||
switch (resourceMapping->nrofPorts) {
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p1:
|
||||
AssertFatal(1 == 0, "Resource with 1 CSI port shouldn't be within other rows\n");
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p2:
|
||||
csirs_config_pdu->row = 3;
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p4:
|
||||
csirs_config_pdu->row = 5;
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p8:
|
||||
if (resourceMapping->cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2)
|
||||
csirs_config_pdu->row = 8;
|
||||
else {
|
||||
int num_k = 0;
|
||||
for (int k = 0; k < 6; k++)
|
||||
num_k += (((csirs_config_pdu->freq_domain) >> k) & 0x01);
|
||||
if (num_k == 4)
|
||||
csirs_config_pdu->row = 6;
|
||||
else
|
||||
csirs_config_pdu->row = 7;
|
||||
}
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p12:
|
||||
if (resourceMapping->cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2)
|
||||
csirs_config_pdu->row = 10;
|
||||
else
|
||||
csirs_config_pdu->row = 9;
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p16:
|
||||
if (resourceMapping->cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2)
|
||||
csirs_config_pdu->row = 12;
|
||||
else
|
||||
csirs_config_pdu->row = 11;
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p24:
|
||||
if (resourceMapping->cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2)
|
||||
csirs_config_pdu->row = 14;
|
||||
else {
|
||||
if (resourceMapping->cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4)
|
||||
csirs_config_pdu->row = 15;
|
||||
else
|
||||
csirs_config_pdu->row = 13;
|
||||
}
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p32:
|
||||
if (resourceMapping->cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2)
|
||||
csirs_config_pdu->row = 17;
|
||||
else {
|
||||
if (resourceMapping->cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4)
|
||||
csirs_config_pdu->row = 18;
|
||||
else
|
||||
csirs_config_pdu->row = 16;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
AssertFatal(false, "Invalid number of ports in CSI-RS resource\n");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
AssertFatal(false, "Invalid freqency domain allocation in CSI-RS resource\n");
|
||||
}
|
||||
}
|
||||
|
||||
void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot)
|
||||
{
|
||||
if (!mac->sc_info.csi_MeasConfig)
|
||||
@@ -2449,117 +2557,20 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot)
|
||||
LOG_D(MAC,"Scheduling reception of CSI-RS in frame %d slot %d\n", frame, slot);
|
||||
fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu = &dl_config->dl_config_list[dl_config->number_pdus].csirs_config_pdu.csirs_config_rel15;
|
||||
csirs_config_pdu->measurement_bitmap = set_csirs_measurement_bitmap(csi_measconfig, csi_res_id);
|
||||
NR_CSI_RS_ResourceMapping_t resourceMapping = nzpcsi->resourceMapping;
|
||||
csirs_config_pdu->subcarrier_spacing = mu;
|
||||
csirs_config_pdu->cyclic_prefix = current_DL_BWP->cyclicprefix ? *current_DL_BWP->cyclicprefix : 0;
|
||||
|
||||
// According to last paragraph of TS 38.214 5.2.2.3.1
|
||||
if (resourceMapping.freqBand.startingRB < bwp_start) {
|
||||
csirs_config_pdu->start_rb = bwp_start;
|
||||
} else {
|
||||
csirs_config_pdu->start_rb = resourceMapping.freqBand.startingRB;
|
||||
}
|
||||
if (resourceMapping.freqBand.nrofRBs > (bwp_start + bwp_size - csirs_config_pdu->start_rb)) {
|
||||
csirs_config_pdu->nr_of_rbs = bwp_start + bwp_size - csirs_config_pdu->start_rb;
|
||||
} else {
|
||||
csirs_config_pdu->nr_of_rbs = resourceMapping.freqBand.nrofRBs;
|
||||
}
|
||||
AssertFatal(csirs_config_pdu->nr_of_rbs >= 24, "CSI-RS has %d RBs, but the minimum is 24\n", csirs_config_pdu->nr_of_rbs);
|
||||
|
||||
csirs_config_pdu->csi_type = 1; // NZP-CSI-RS
|
||||
csirs_config_pdu->symb_l0 = resourceMapping.firstOFDMSymbolInTimeDomain;
|
||||
if (resourceMapping.firstOFDMSymbolInTimeDomain2)
|
||||
csirs_config_pdu->symb_l1 = *resourceMapping.firstOFDMSymbolInTimeDomain2;
|
||||
csirs_config_pdu->cdm_type = resourceMapping.cdm_Type;
|
||||
csirs_config_pdu->freq_density = resourceMapping.density.present;
|
||||
if ((resourceMapping.density.present == NR_CSI_RS_ResourceMapping__density_PR_dot5)
|
||||
&& (resourceMapping.density.choice.dot5 == NR_CSI_RS_ResourceMapping__density__dot5_evenPRBs))
|
||||
csirs_config_pdu->freq_density--;
|
||||
|
||||
csirs_config_pdu->scramb_id = nzpcsi->scramblingID;
|
||||
csirs_config_pdu->power_control_offset = nzpcsi->powerControlOffset + 8;
|
||||
if (nzpcsi->powerControlOffsetSS)
|
||||
csirs_config_pdu->power_control_offset_ss = *nzpcsi->powerControlOffsetSS;
|
||||
else
|
||||
csirs_config_pdu->power_control_offset_ss = 1; // 0 dB
|
||||
switch(resourceMapping.frequencyDomainAllocation.present){
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1:
|
||||
csirs_config_pdu->row = 1;
|
||||
csirs_config_pdu->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]) >> 4) & 0x0f;
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2:
|
||||
csirs_config_pdu->row = 2;
|
||||
csirs_config_pdu->freq_domain = (((resourceMapping.frequencyDomainAllocation.choice.row2.buf[1] >> 4) & 0x0f)
|
||||
| ((resourceMapping.frequencyDomainAllocation.choice.row2.buf[0] << 4) & 0xff0));
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row4:
|
||||
csirs_config_pdu->row = 4;
|
||||
csirs_config_pdu->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row4.buf[0]) >> 5) & 0x07;
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other:
|
||||
csirs_config_pdu->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.other.buf[0]) >> 2) & 0x3f;
|
||||
// determining the row of table 7.4.1.5.3-1 in 38.211
|
||||
switch (resourceMapping.nrofPorts) {
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p1:
|
||||
AssertFatal(1 == 0, "Resource with 1 CSI port shouldn't be within other rows\n");
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p2:
|
||||
csirs_config_pdu->row = 3;
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p4:
|
||||
csirs_config_pdu->row = 5;
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p8:
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2)
|
||||
csirs_config_pdu->row = 8;
|
||||
else {
|
||||
int num_k = 0;
|
||||
for (int k = 0; k < 6; k++)
|
||||
num_k += (((csirs_config_pdu->freq_domain) >> k) & 0x01);
|
||||
if (num_k == 4)
|
||||
csirs_config_pdu->row = 6;
|
||||
else
|
||||
csirs_config_pdu->row = 7;
|
||||
}
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p12:
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2)
|
||||
csirs_config_pdu->row = 10;
|
||||
else
|
||||
csirs_config_pdu->row = 9;
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p16:
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2)
|
||||
csirs_config_pdu->row = 12;
|
||||
else
|
||||
csirs_config_pdu->row = 11;
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p24:
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2)
|
||||
csirs_config_pdu->row = 14;
|
||||
else {
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4)
|
||||
csirs_config_pdu->row = 15;
|
||||
else
|
||||
csirs_config_pdu->row = 13;
|
||||
}
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p32:
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2)
|
||||
csirs_config_pdu->row = 17;
|
||||
else {
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4)
|
||||
csirs_config_pdu->row = 18;
|
||||
else
|
||||
csirs_config_pdu->row = 16;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1 == 0, "Invalid number of ports in CSI-RS resource\n");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1 == 0, "Invalid freqency domain allocation in CSI-RS resource\n");
|
||||
}
|
||||
|
||||
configure_csi_resource_mapping(csirs_config_pdu, &nzpcsi->resourceMapping, bwp_size, bwp_start);
|
||||
|
||||
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_CSI_RS;
|
||||
dl_config->number_pdus += 1;
|
||||
}
|
||||
|
||||
@@ -43,24 +43,25 @@ TEST(test_pcmax, test_mpr)
|
||||
int N_RB_UL = 51; // 10Mhz
|
||||
int nr_band = 20;
|
||||
float expected_power = 23 - (1.5 / 2);
|
||||
EXPECT_EQ(expected_power, nr_get_Pcmax(23, nr_band, FR1, 2, false, 1, N_RB_UL, false, 6, prb_start));
|
||||
frame_type_t frame_type = TDD;
|
||||
EXPECT_EQ(expected_power, nr_get_Pcmax(23, nr_band, frame_type, FR1, 2, false, 1, N_RB_UL, false, 6, prb_start));
|
||||
|
||||
// Outer PRB, MPR = 3, no delta MPR
|
||||
prb_start = 0;
|
||||
expected_power = 23 - (3.0 / 2);
|
||||
EXPECT_EQ(expected_power, nr_get_Pcmax(23, nr_band, FR1, 2, false, 1, N_RB_UL, false, 6, prb_start));
|
||||
EXPECT_EQ(expected_power, nr_get_Pcmax(23, nr_band, frame_type, FR1, 2, false, 1, N_RB_UL, false, 6, prb_start));
|
||||
|
||||
// Outer PRB on band 28, MPR = 3, delta MPR = 0.5 dB
|
||||
N_RB_UL = 78;
|
||||
nr_band = 28;
|
||||
expected_power = 23 - ((3.0 + 0.5) / 2);
|
||||
EXPECT_EQ(expected_power, nr_get_Pcmax(23, nr_band, FR1, 2, false, 1, N_RB_UL, false, 100, prb_start));
|
||||
EXPECT_EQ(expected_power, nr_get_Pcmax(23, nr_band, frame_type, FR1, 2, false, 1, N_RB_UL, false, 100, prb_start));
|
||||
}
|
||||
|
||||
TEST(test_pcmax, test_not_implemented)
|
||||
{
|
||||
int N_RB_UL = 51;
|
||||
EXPECT_DEATH(nr_get_Pcmax(23, 20, FR1, 1, false, 1, N_RB_UL, false, 6, 0), "MPR for Pi/2 BPSK not implemented yet");
|
||||
EXPECT_DEATH(nr_get_Pcmax(23, 20, TDD, FR1, 1, false, 1, N_RB_UL, false, 6, 0), "MPR for Pi/2 BPSK not implemented yet");
|
||||
}
|
||||
|
||||
TEST(test_pcmax, test_pucch_max_power)
|
||||
@@ -69,11 +70,11 @@ TEST(test_pcmax, test_pucch_max_power)
|
||||
int prb_start = 0;
|
||||
int N_RB_UL = 51; // 10Mhz
|
||||
float expected_power = 23 - (1.0 / 2);
|
||||
EXPECT_EQ(expected_power, nr_get_Pcmax(23, 20, FR1, 2, false, 1, N_RB_UL, true, 1, prb_start));
|
||||
EXPECT_EQ(expected_power, nr_get_Pcmax(23, 20, TDD, FR1, 2, false, 1, N_RB_UL, true, 1, prb_start));
|
||||
|
||||
// Other fromats, no transform precoding, MPR = 3
|
||||
expected_power = 23 - (3.0 / 2);
|
||||
EXPECT_EQ(expected_power, nr_get_Pcmax(23, 20, FR1, 2, false, 1, N_RB_UL, false, 1, prb_start));
|
||||
EXPECT_EQ(expected_power, nr_get_Pcmax(23, 20, TDD, FR1, 2, false, 1, N_RB_UL, false, 1, prb_start));
|
||||
}
|
||||
|
||||
TEST(test_pucch_power_state, test_accumulated_delta_pucch)
|
||||
@@ -91,6 +92,7 @@ TEST(test_pucch_power_state, test_accumulated_delta_pucch)
|
||||
pucch_Config.pucch_PowerControl = &power_config;
|
||||
mac.G_b_f_c = 0;
|
||||
mac.pucch_power_control_initialized = true;
|
||||
mac.frame_type = TDD;
|
||||
|
||||
int scs = 1;
|
||||
int sum_delta_pucch = 3;
|
||||
@@ -102,8 +104,17 @@ TEST(test_pucch_power_state, test_accumulated_delta_pucch)
|
||||
int subframe_number = 0;
|
||||
int O_uci = 2;
|
||||
uint16_t start_prb = 0;
|
||||
int P_CMAX =
|
||||
nr_get_Pcmax(23, mac.nr_band, FR1, 2, false, current_UL_BWP.scs, current_UL_BWP.BWPSize, false, nb_of_prbs, start_prb);
|
||||
int P_CMAX = nr_get_Pcmax(23,
|
||||
mac.nr_band,
|
||||
mac.frame_type,
|
||||
FR1,
|
||||
2,
|
||||
false,
|
||||
current_UL_BWP.scs,
|
||||
current_UL_BWP.BWPSize,
|
||||
false,
|
||||
nb_of_prbs,
|
||||
start_prb);
|
||||
int pucch_power_prev = get_pucch_tx_power_ue(&mac,
|
||||
scs,
|
||||
&pucch_Config,
|
||||
@@ -187,6 +198,7 @@ TEST(pusch_power_control, pusch_power_control_msg3)
|
||||
NR_PUSCH_PowerControl pusch_PowerControl = {0};
|
||||
pusch_Config.pusch_PowerControl = &pusch_PowerControl;
|
||||
pusch_PowerControl.tpc_Accumulation = (long*)1;
|
||||
mac.frame_type = TDD;
|
||||
|
||||
// msg3 cofiguration as in 5g_rfsimulator testcase
|
||||
int num_rb = 8;
|
||||
@@ -201,7 +213,17 @@ TEST(pusch_power_control, pusch_power_control_msg3)
|
||||
int delta_pusch = 0;
|
||||
bool is_rar_tx_retx = true;
|
||||
|
||||
int P_CMAX = nr_get_Pcmax(23, mac.nr_band, FR1, Qm, false, current_UL_BWP.scs, current_UL_BWP.BWPSize, false, num_rb, start_prb);
|
||||
int P_CMAX = nr_get_Pcmax(23,
|
||||
mac.nr_band,
|
||||
mac.frame_type,
|
||||
FR1,
|
||||
Qm,
|
||||
false,
|
||||
current_UL_BWP.scs,
|
||||
current_UL_BWP.BWPSize,
|
||||
false,
|
||||
num_rb,
|
||||
start_prb);
|
||||
|
||||
long preambleReceivedTargetPower = -96;
|
||||
nr_rach_ConfigCommon.rach_ConfigGeneric.preambleReceivedTargetPower = preambleReceivedTargetPower;
|
||||
@@ -236,26 +258,24 @@ TEST(pusch_power_control, pusch_power_control_msg3)
|
||||
delta_pusch,
|
||||
is_rar_tx_retx,
|
||||
false);
|
||||
EXPECT_EQ(std::min(P_CMAX, power - 2), reduced_power)
|
||||
<< "Incorrect handling of preambleReceivedTargetPower";
|
||||
EXPECT_EQ(std::min(P_CMAX, power - 2), reduced_power) << "Incorrect handling of preambleReceivedTargetPower";
|
||||
EXPECT_LT(reduced_power, P_CMAX) << "Power above P_CMAX";
|
||||
|
||||
delta_pusch = 4;
|
||||
int increased_power = get_pusch_tx_power_ue(&mac,
|
||||
num_rb,
|
||||
start_prb,
|
||||
nb_symb_sch,
|
||||
nb_dmrs_prb,
|
||||
nb_ptrs_prb,
|
||||
Qm,
|
||||
R,
|
||||
beta_offset_csi1,
|
||||
sum_bits_in_codeblocks,
|
||||
delta_pusch,
|
||||
is_rar_tx_retx,
|
||||
false);
|
||||
EXPECT_EQ(std::min(P_CMAX, reduced_power + delta_pusch), increased_power)
|
||||
<< "delta_pusch should increase tx power";
|
||||
num_rb,
|
||||
start_prb,
|
||||
nb_symb_sch,
|
||||
nb_dmrs_prb,
|
||||
nb_ptrs_prb,
|
||||
Qm,
|
||||
R,
|
||||
beta_offset_csi1,
|
||||
sum_bits_in_codeblocks,
|
||||
delta_pusch,
|
||||
is_rar_tx_retx,
|
||||
false);
|
||||
EXPECT_EQ(std::min(P_CMAX, reduced_power + delta_pusch), increased_power) << "delta_pusch should increase tx power";
|
||||
EXPECT_LT(increased_power, P_CMAX) << "Power above P_CMAX";
|
||||
}
|
||||
|
||||
@@ -269,6 +289,7 @@ TEST(pusch_power_control, pusch_power_data)
|
||||
NR_RACH_ConfigCommon_t nr_rach_ConfigCommon = {0};
|
||||
current_UL_BWP.rach_ConfigCommon = &nr_rach_ConfigCommon;
|
||||
mac.nr_band = 78;
|
||||
mac.frame_type = TDD;
|
||||
|
||||
bool is_rar_tx_retx = false;
|
||||
int num_rb = 5;
|
||||
@@ -291,7 +312,17 @@ TEST(pusch_power_control, pusch_power_data)
|
||||
current_UL_BWP.p0_NominalWithGrant = &p0_NominalWithGrant;
|
||||
pusch_PowerControl.deltaMCS = (long*)1;
|
||||
|
||||
int P_CMAX = nr_get_Pcmax(23, mac.nr_band, FR1, Qm, false, current_UL_BWP.scs, current_UL_BWP.BWPSize, transform_precoding, num_rb, start_prb);
|
||||
int P_CMAX = nr_get_Pcmax(23,
|
||||
mac.nr_band,
|
||||
mac.frame_type,
|
||||
FR1,
|
||||
Qm,
|
||||
false,
|
||||
current_UL_BWP.scs,
|
||||
current_UL_BWP.BWPSize,
|
||||
transform_precoding,
|
||||
num_rb,
|
||||
start_prb);
|
||||
|
||||
int power = get_pusch_tx_power_ue(&mac,
|
||||
num_rb,
|
||||
|
||||
@@ -242,7 +242,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
|
||||
temp_tda,
|
||||
tdaList->list.count);
|
||||
int K2 = get_K2(tdaList, temp_tda, mu, scc);
|
||||
const int sched_frame = frame + (slot + K2) / nr_slots_per_frame[mu];
|
||||
const int sched_frame = (frame + (slot + K2) / nr_slots_per_frame[mu]) % MAX_FRAME_NUMBER;
|
||||
const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
|
||||
const int tda = get_ul_tda(nr_mac, scc, sched_frame, sched_slot);
|
||||
if (tda < 0)
|
||||
@@ -276,7 +276,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
|
||||
if (!tda_info.valid_tda)
|
||||
return false;
|
||||
sched_ctrl->sched_pusch.tda_info = tda_info;
|
||||
|
||||
sched_ctrl->sched_pusch.time_domain_allocation = tda;
|
||||
const int buffer_index = ul_buffer_index(sched_frame, sched_slot, mu, nr_mac->vrb_map_UL_size);
|
||||
uint16_t *vrb_map_UL = &nr_mac->common_channels[CC_id].vrb_map_UL[buffer_index * MAX_BWP_SIZE];
|
||||
for (int i = rbStart; i < rbStart + rbSize; ++i) {
|
||||
|
||||
@@ -390,7 +390,7 @@ static int nr_process_mac_pdu(instance_t module_idP,
|
||||
// fixed length
|
||||
mac_subheader_len = 1;
|
||||
|
||||
if ( rx_lcid == UL_SCH_LCID_CCCH1 ) {
|
||||
if (rx_lcid == UL_SCH_LCID_CCCH1) {
|
||||
// RRCResumeRequest1 message includes the full I-RNTI and has a size of 8 bytes
|
||||
mac_len = 8;
|
||||
|
||||
@@ -615,6 +615,26 @@ void handle_nr_ul_harq(const int CC_idP,
|
||||
NR_SCHED_UNLOCK(&nrmac->sched_lock);
|
||||
}
|
||||
|
||||
static void handle_msg3_failed_rx(NR_RA_t *ra, int i, int harq_round_max)
|
||||
{
|
||||
// for CFRA (NSA) do not schedule retransmission of msg3
|
||||
if (ra->cfra) {
|
||||
LOG_D(NR_MAC, "Random Access %i failed at state %s (NSA msg3 reception failed)\n", i, nrra_text[ra->ra_state]);
|
||||
nr_clear_ra_proc(ra);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ra->msg3_round >= harq_round_max - 1) {
|
||||
LOG_W(NR_MAC, "Random Access %i failed at state %s (Reached msg3 max harq rounds)\n", i, nrra_text[ra->ra_state]);
|
||||
nr_clear_ra_proc(ra);
|
||||
return;
|
||||
}
|
||||
|
||||
LOG_D(NR_MAC, "Random Access %i Msg3 CRC did not pass\n", i);
|
||||
ra->msg3_round++;
|
||||
ra->ra_state = nrRA_Msg3_retransmission;
|
||||
}
|
||||
|
||||
/*
|
||||
* When data are received on PHY and transmitted to MAC
|
||||
*/
|
||||
@@ -714,7 +734,7 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
|
||||
|
||||
#endif
|
||||
|
||||
if (sduP != NULL){
|
||||
if (sduP != NULL) {
|
||||
LOG_D(NR_MAC, "Received PDU at MAC gNB \n");
|
||||
|
||||
UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt = 0;
|
||||
@@ -728,7 +748,7 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
|
||||
else {
|
||||
NR_UE_ul_harq_t *cur_harq = &UE_scheduling_control->ul_harq_processes[harq_pid];
|
||||
/* reduce sched_ul_bytes when cur_harq->round == 3 */
|
||||
if (cur_harq->round == 3){
|
||||
if (cur_harq->round == 3) {
|
||||
const uint32_t tb_size = UE_scheduling_control->ul_harq_processes[harq_pid].sched_pusch.tb_size;
|
||||
UE_scheduling_control->sched_ul_bytes -= tb_size;
|
||||
if (UE_scheduling_control->sched_ul_bytes < 0)
|
||||
@@ -747,20 +767,16 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
|
||||
nr_mac_trigger_ul_failure(&UE->UE_sched_ctrl, UE->current_UL_BWP.scs);
|
||||
}
|
||||
}
|
||||
} else if(sduP) {
|
||||
} else if (sduP) {
|
||||
|
||||
bool no_sig = true;
|
||||
for (int k = 0; k < sdu_lenP; k++) {
|
||||
if(sduP[k]!=0) {
|
||||
if(sduP[k] != 0) {
|
||||
no_sig = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(no_sig) {
|
||||
LOG_W(NR_MAC, "No signal\n");
|
||||
}
|
||||
|
||||
T(T_GNB_MAC_UL_PDU_WITH_DATA, T_INT(gnb_mod_idP), T_INT(CC_idP),
|
||||
T_INT(rntiP), T_INT(frameP), T_INT(slotP), T_INT(-1) /* harq_pid */,
|
||||
T_BUFFER(sduP, sdu_lenP));
|
||||
@@ -774,8 +790,8 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
|
||||
continue;
|
||||
|
||||
if (no_sig) {
|
||||
LOG_D(NR_MAC, "Random Access %i failed at state %s (no signal)\n", i, nrra_text[ra->ra_state]);
|
||||
nr_clear_ra_proc(ra);
|
||||
LOG_W(NR_MAC, "Random Access %i ULSCH with no signal\n", i);
|
||||
handle_msg3_failed_rx(ra, i, gNB_mac->ul_bler.harq_round_max);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -912,23 +928,7 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
|
||||
if( (frameP!=ra->Msg3_frame) || (slotP!=ra->Msg3_slot))
|
||||
continue;
|
||||
|
||||
// for CFRA (NSA) do not schedule retransmission of msg3
|
||||
if (ra->cfra) {
|
||||
LOG_D(NR_MAC, "Random Access %i failed at state %s (NSA msg3 reception failed)\n", i, nrra_text[ra->ra_state]);
|
||||
nr_clear_ra_proc(ra);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ra->msg3_round >= gNB_mac->ul_bler.harq_round_max - 1) {
|
||||
LOG_W(NR_MAC, "Random Access %i failed at state %s (Reached msg3 max harq rounds)\n", i, nrra_text[ra->ra_state]);
|
||||
nr_clear_ra_proc(ra);
|
||||
return;
|
||||
}
|
||||
|
||||
LOG_D(NR_MAC, "Random Access %i Msg3 CRC did not pass)\n", i);
|
||||
|
||||
ra->msg3_round++;
|
||||
ra->ra_state = nrRA_Msg3_retransmission;
|
||||
handle_msg3_failed_rx(ra, i, gNB_mac->ul_bler.harq_round_max);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1938,7 +1938,7 @@ static void pf_ul(module_id_t module_id,
|
||||
UEsched_t *iterator=UE_sched;
|
||||
|
||||
/* Loop UE_sched to find max coeff and allocate transmission */
|
||||
while (remainUEs> 0 && n_rb_sched >= min_rb && iterator->UE != NULL) {
|
||||
while (remainUEs > 0 && n_rb_sched >= min_rb && iterator->UE != NULL) {
|
||||
|
||||
NR_UE_sched_ctrl_t *sched_ctrl = &iterator->UE->UE_sched_ctrl;
|
||||
int CCEIndex = get_cce_index(nrmac,
|
||||
@@ -2332,7 +2332,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot, n
|
||||
const int index = ul_buffer_index(sched_pusch->frame, sched_pusch->slot, current_BWP->scs, nr_mac->UL_tti_req_ahead_size);
|
||||
nfapi_nr_ul_tti_request_t *future_ul_tti_req = &nr_mac->UL_tti_req_ahead[0][index];
|
||||
if (future_ul_tti_req->SFN != sched_pusch->frame || future_ul_tti_req->Slot != sched_pusch->slot)
|
||||
LOG_W(MAC,
|
||||
LOG_W(NR_MAC,
|
||||
"%d.%d future UL_tti_req's frame.slot %d.%d does not match PUSCH %d.%d\n",
|
||||
frame, slot,
|
||||
future_ul_tti_req->SFN,
|
||||
@@ -2349,8 +2349,14 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot, n
|
||||
memset(pusch_pdu, 0, sizeof(nfapi_nr_pusch_pdu_t));
|
||||
future_ul_tti_req->n_pdus += 1;
|
||||
|
||||
LOG_D(NR_MAC, "%4d.%2d Scheduling UE specific PUSCH for sched %d.%d, ul_tti_req %d.%d\n", frame, slot,
|
||||
sched_pusch->frame,sched_pusch->slot,future_ul_tti_req->SFN,future_ul_tti_req->Slot);
|
||||
LOG_D(NR_MAC,
|
||||
"%4d.%2d Scheduling UE specific PUSCH for sched %d.%d, ul_tti_req %d.%d\n",
|
||||
frame,
|
||||
slot,
|
||||
sched_pusch->frame,
|
||||
sched_pusch->slot,
|
||||
future_ul_tti_req->SFN,
|
||||
future_ul_tti_req->Slot);
|
||||
|
||||
pusch_pdu->pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA;
|
||||
pusch_pdu->rnti = rnti;
|
||||
|
||||
@@ -298,7 +298,8 @@ void mac_top_init_gNB(ngran_node_t node_type,
|
||||
* will output the packets at a local interface, which is in line with
|
||||
* the noS1 mode. Hence, below, we simply hardcode ENB_FLAG_NO */
|
||||
// setup PDCP, RLC
|
||||
nr_pdcp_add_drbs(ENB_FLAG_NO, 0x1234, rbconfig->drb_ToAddModList, 0, NULL, NULL);
|
||||
nr_pdcp_entity_security_keys_and_algos_t null_security_parameters = {0};
|
||||
nr_pdcp_add_drbs(ENB_FLAG_NO, 0x1234, rbconfig->drb_ToAddModList, &null_security_parameters);
|
||||
nr_rlc_add_drb(0x1234, rbconfig->drb_ToAddModList->list.array[0]->drb_Identity, rlc_rbconfig);
|
||||
|
||||
// free memory
|
||||
|
||||
@@ -187,13 +187,15 @@ void e1_bearer_context_setup(const e1ap_bearer_setup_req_t *req)
|
||||
// create PDCP bearers. This will also create SDAP bearers
|
||||
NR_DRB_ToAddModList_t DRB_configList = {0};
|
||||
fill_DRB_configList_e1(&DRB_configList, req_pdu);
|
||||
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||
security_parameters.ciphering_algorithm = req->cipheringAlgorithm;
|
||||
security_parameters.integrity_algorithm = req->integrityProtectionAlgorithm;
|
||||
memcpy(security_parameters.ciphering_key, req->encryptionKey, NR_K_KEY_SIZE);
|
||||
memcpy(security_parameters.integrity_key, req->integrityProtectionKey, NR_K_KEY_SIZE);
|
||||
nr_pdcp_add_drbs(true, // set this to notify PDCP that his not UE
|
||||
cu_up_ue_id,
|
||||
&DRB_configList,
|
||||
(req->integrityProtectionAlgorithm << 4) | req->cipheringAlgorithm,
|
||||
(uint8_t *)req->encryptionKey,
|
||||
(uint8_t *)req->integrityProtectionKey);
|
||||
|
||||
&security_parameters);
|
||||
if (f1inst >= 0) { /* we have F1(-U) */
|
||||
teid_t dummy_teid = 0xffff; // we will update later with answer from DU
|
||||
in_addr_t dummy_address = {0}; // IPv4, updated later with answer from DU
|
||||
@@ -255,7 +257,15 @@ void e1_bearer_context_modif(const e1ap_bearer_mod_req_t *req)
|
||||
modified->id = to_modif->id;
|
||||
|
||||
if (to_modif->pdcp_config.pDCP_Reestablishment) {
|
||||
nr_pdcp_reestablishment(req->gNB_cu_up_ue_id, to_modif->id, false);
|
||||
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||
security_parameters.ciphering_algorithm = req->cipheringAlgorithm;
|
||||
security_parameters.integrity_algorithm = req->integrityProtectionAlgorithm;
|
||||
memcpy(security_parameters.ciphering_key, req->encryptionKey, NR_K_KEY_SIZE);
|
||||
memcpy(security_parameters.integrity_key, req->integrityProtectionKey, NR_K_KEY_SIZE);
|
||||
nr_pdcp_reestablishment(req->gNB_cu_up_ue_id,
|
||||
to_modif->id,
|
||||
false,
|
||||
&security_parameters);
|
||||
}
|
||||
|
||||
if (f1inst < 0) // no F1-U?
|
||||
|
||||
@@ -328,38 +328,35 @@ static bool nr_pdcp_entity_check_integrity(struct nr_pdcp_entity_t *entity,
|
||||
}
|
||||
|
||||
/* may be called several times, take care to clean previous settings */
|
||||
static void nr_pdcp_entity_set_security(nr_pdcp_entity_t *entity,
|
||||
int integrity_algorithm,
|
||||
char *integrity_key,
|
||||
int ciphering_algorithm,
|
||||
char *ciphering_key)
|
||||
static void nr_pdcp_entity_set_security(struct nr_pdcp_entity_t *entity,
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *parameters)
|
||||
{
|
||||
if (integrity_algorithm != -1)
|
||||
entity->integrity_algorithm = integrity_algorithm;
|
||||
if (ciphering_algorithm != -1)
|
||||
entity->ciphering_algorithm = ciphering_algorithm;
|
||||
if (integrity_key != NULL)
|
||||
memcpy(entity->integrity_key, integrity_key, 16);
|
||||
if (ciphering_key != NULL)
|
||||
memcpy(entity->ciphering_key, ciphering_key, 16);
|
||||
if (parameters->integrity_algorithm != -1) {
|
||||
entity->security_keys_and_algos.integrity_algorithm = parameters->integrity_algorithm;
|
||||
memcpy(entity->security_keys_and_algos.integrity_key, parameters->integrity_key, NR_K_KEY_SIZE);
|
||||
}
|
||||
if (parameters->ciphering_algorithm != -1) {
|
||||
entity->security_keys_and_algos.ciphering_algorithm = parameters->ciphering_algorithm;
|
||||
memcpy(entity->security_keys_and_algos.ciphering_key, parameters->ciphering_key, NR_K_KEY_SIZE);
|
||||
}
|
||||
|
||||
if (integrity_algorithm == 0) {
|
||||
if (parameters->integrity_algorithm == 0) {
|
||||
entity->has_integrity = 0;
|
||||
if (entity->free_integrity != NULL)
|
||||
entity->free_integrity(entity->integrity_context);
|
||||
entity->free_integrity = NULL;
|
||||
}
|
||||
|
||||
if (integrity_algorithm != 0 && integrity_algorithm != -1) {
|
||||
if (parameters->integrity_algorithm != 0 && parameters->integrity_algorithm != -1) {
|
||||
entity->has_integrity = 1;
|
||||
if (entity->free_integrity != NULL)
|
||||
entity->free_integrity(entity->integrity_context);
|
||||
if (integrity_algorithm == 2) {
|
||||
entity->integrity_context = nr_pdcp_integrity_nia2_init(entity->integrity_key);
|
||||
if (parameters->integrity_algorithm == 2) {
|
||||
entity->integrity_context = nr_pdcp_integrity_nia2_init(entity->security_keys_and_algos.integrity_key);
|
||||
entity->integrity = nr_pdcp_integrity_nia2_integrity;
|
||||
entity->free_integrity = nr_pdcp_integrity_nia2_free_integrity;
|
||||
} else if (integrity_algorithm == 1) {
|
||||
entity->integrity_context = nr_pdcp_integrity_nia1_init(entity->integrity_key);
|
||||
} else if (parameters->integrity_algorithm == 1) {
|
||||
entity->integrity_context = nr_pdcp_integrity_nia1_init(entity->security_keys_and_algos.integrity_key);
|
||||
entity->integrity = nr_pdcp_integrity_nia1_integrity;
|
||||
entity->free_integrity = nr_pdcp_integrity_nia1_free_integrity;
|
||||
} else {
|
||||
@@ -368,22 +365,22 @@ static void nr_pdcp_entity_set_security(nr_pdcp_entity_t *entity,
|
||||
}
|
||||
}
|
||||
|
||||
if (ciphering_algorithm == 0) {
|
||||
if (parameters->ciphering_algorithm == 0) {
|
||||
entity->has_ciphering = 0;
|
||||
if (entity->free_security != NULL)
|
||||
entity->free_security(entity->security_context);
|
||||
entity->free_security = NULL;
|
||||
}
|
||||
|
||||
if (ciphering_algorithm != 0 && ciphering_algorithm != -1) {
|
||||
if (ciphering_algorithm != 2) {
|
||||
if (parameters->ciphering_algorithm != 0 && parameters->ciphering_algorithm != -1) {
|
||||
if (parameters->ciphering_algorithm != 2) {
|
||||
LOG_E(PDCP, "FATAL: only nea2 supported for the moment\n");
|
||||
exit(1);
|
||||
}
|
||||
entity->has_ciphering = 1;
|
||||
if (entity->free_security != NULL)
|
||||
entity->free_security(entity->security_context);
|
||||
entity->security_context = nr_pdcp_security_nea2_init(entity->ciphering_key);
|
||||
entity->security_context = nr_pdcp_security_nea2_init(entity->security_keys_and_algos.ciphering_key);
|
||||
entity->cipher = nr_pdcp_security_nea2_cipher;
|
||||
entity->free_security = nr_pdcp_security_nea2_free_security;
|
||||
}
|
||||
@@ -515,23 +512,27 @@ static void free_rx_list(nr_pdcp_entity_t *entity)
|
||||
* @brief PDCP entity re-establishment according to 5.1.2 of 3GPP TS 38.323
|
||||
* @todo deal with ciphering/integrity algos and keys for transmitting/receiving entity procedures
|
||||
*/
|
||||
static void nr_pdcp_entity_reestablish_drb_am(nr_pdcp_entity_t *entity)
|
||||
static void nr_pdcp_entity_reestablish_drb_am(nr_pdcp_entity_t *entity,
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||
{
|
||||
/* transmitting entity procedures */
|
||||
/* todo: deal with ciphering/integrity algos and keys */
|
||||
/* do nothing */
|
||||
|
||||
/* receiving entity procedures */
|
||||
/* todo: deal with ciphering/integrity algos and keys */
|
||||
/* do nothing */
|
||||
|
||||
/* ciphering and integrity: common for both tx and rx entities */
|
||||
entity->set_security(entity, security_parameters);
|
||||
|
||||
/* Flag PDCP entity as re-established */
|
||||
entity->entity_suspended = false;
|
||||
}
|
||||
|
||||
static void nr_pdcp_entity_reestablish_drb_um(nr_pdcp_entity_t *entity)
|
||||
static void nr_pdcp_entity_reestablish_drb_um(nr_pdcp_entity_t *entity,
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||
{
|
||||
/* transmitting entity procedures */
|
||||
entity->tx_next = 0;
|
||||
/* todo: deal with ciphering/integrity algos and keys */
|
||||
|
||||
/* receiving entity procedures */
|
||||
/* deliver all SDUs if t_reordering is running */
|
||||
@@ -542,17 +543,19 @@ static void nr_pdcp_entity_reestablish_drb_um(nr_pdcp_entity_t *entity)
|
||||
/* set rx_next and rx_deliv to the initial value */
|
||||
entity->rx_next = 0;
|
||||
entity->rx_deliv = 0;
|
||||
/* todo: deal with ciphering/integrity algos and keys */
|
||||
|
||||
/* ciphering and integrity: common for both tx and rx entities */
|
||||
entity->set_security(entity, security_parameters);
|
||||
|
||||
/* Flag PDCP entity as re-established */
|
||||
entity->entity_suspended = false;
|
||||
}
|
||||
|
||||
static void nr_pdcp_entity_reestablish_srb(nr_pdcp_entity_t *entity)
|
||||
static void nr_pdcp_entity_reestablish_srb(nr_pdcp_entity_t *entity,
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||
{
|
||||
/* transmitting entity procedures */
|
||||
entity->tx_next = 0;
|
||||
/* todo: deal with ciphering/integrity algos and keys */
|
||||
|
||||
/* receiving entity procedures */
|
||||
free_rx_list(entity);
|
||||
@@ -561,7 +564,9 @@ static void nr_pdcp_entity_reestablish_srb(nr_pdcp_entity_t *entity)
|
||||
/* set rx_next and rx_deliv to the initial value */
|
||||
entity->rx_next = 0;
|
||||
entity->rx_deliv = 0;
|
||||
/* todo: deal with ciphering/integrity algos and keys */
|
||||
|
||||
/* ciphering and integrity: common for both tx and rx entities */
|
||||
entity->set_security(entity, security_parameters);
|
||||
|
||||
/* Flag PDCP entity as re-established */
|
||||
entity->entity_suspended = false;
|
||||
@@ -606,10 +611,7 @@ nr_pdcp_entity_t *new_nr_pdcp_entity(
|
||||
int sn_size,
|
||||
int t_reordering,
|
||||
int discard_timer,
|
||||
int ciphering_algorithm,
|
||||
int integrity_algorithm,
|
||||
unsigned char *ciphering_key,
|
||||
unsigned char *integrity_key)
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||
{
|
||||
nr_pdcp_entity_t *ret;
|
||||
|
||||
@@ -663,9 +665,7 @@ nr_pdcp_entity_t *new_nr_pdcp_entity(
|
||||
|
||||
ret->is_gnb = is_gnb;
|
||||
|
||||
nr_pdcp_entity_set_security(ret,
|
||||
integrity_algorithm, (char *)integrity_key,
|
||||
ciphering_algorithm, (char *)ciphering_key);
|
||||
nr_pdcp_entity_set_security(ret, security_parameters);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -48,6 +48,13 @@ typedef enum {
|
||||
NR_PDCP_SRB
|
||||
} nr_pdcp_entity_type_t;
|
||||
|
||||
typedef struct {
|
||||
int integrity_algorithm;
|
||||
int ciphering_algorithm;
|
||||
uint8_t integrity_key[NR_K_KEY_SIZE];
|
||||
uint8_t ciphering_key[NR_K_KEY_SIZE];
|
||||
} nr_pdcp_entity_security_keys_and_algos_t;
|
||||
|
||||
typedef struct {
|
||||
//nr_pdcp_entity_type_t mode;
|
||||
/* PDU stats */
|
||||
@@ -91,19 +98,15 @@ typedef struct nr_pdcp_entity_t {
|
||||
void (*delete_entity)(struct nr_pdcp_entity_t *entity);
|
||||
void (*release_entity)(struct nr_pdcp_entity_t *entity);
|
||||
void (*suspend_entity)(struct nr_pdcp_entity_t *entity);
|
||||
void (*reestablish_entity)(struct nr_pdcp_entity_t *entity);
|
||||
void (*reestablish_entity)(struct nr_pdcp_entity_t *entity,
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *parameters);
|
||||
void (*get_stats)(struct nr_pdcp_entity_t *entity, nr_pdcp_statistics_t *out);
|
||||
|
||||
/* set_security: pass -1 to integrity_algorithm / ciphering_algorithm
|
||||
* to keep the current algorithm
|
||||
* pass NULL to integrity_key / ciphering_key
|
||||
* to keep the current key
|
||||
/* set_security: pass -1 to parameters->integrity_algorithm / parameters->ciphering_algorithm
|
||||
* to keep the corresponding current algorithm and key
|
||||
*/
|
||||
void (*set_security)(struct nr_pdcp_entity_t *entity,
|
||||
int integrity_algorithm,
|
||||
char *integrity_key,
|
||||
int ciphering_algorithm,
|
||||
char *ciphering_key);
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *parameters);
|
||||
|
||||
/* check_integrity is used by RRC */
|
||||
bool (*check_integrity)(struct nr_pdcp_entity_t *entity,
|
||||
@@ -148,10 +151,7 @@ typedef struct nr_pdcp_entity_t {
|
||||
/* security */
|
||||
int has_ciphering;
|
||||
int has_integrity;
|
||||
int ciphering_algorithm;
|
||||
int integrity_algorithm;
|
||||
unsigned char ciphering_key[16];
|
||||
unsigned char integrity_key[16];
|
||||
nr_pdcp_entity_security_keys_and_algos_t security_keys_and_algos;
|
||||
stream_security_context_t *security_context;
|
||||
void (*cipher)(stream_security_context_t *security_context,
|
||||
unsigned char *buffer, int length,
|
||||
@@ -196,10 +196,7 @@ nr_pdcp_entity_t *new_nr_pdcp_entity(
|
||||
int sn_size,
|
||||
int t_reordering,
|
||||
int discard_timer,
|
||||
int ciphering_algorithm,
|
||||
int integrity_algorithm,
|
||||
unsigned char *ciphering_key,
|
||||
unsigned char *integrity_key);
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters);
|
||||
|
||||
/* Get maximum PDCP PDU size */
|
||||
int nr_max_pdcp_pdu_size(sdu_size_t sdu_size);
|
||||
|
||||
@@ -798,10 +798,7 @@ void deliver_pdu_srb_rlc(void *deliver_pdu_data, ue_id_t ue_id, int srb_id,
|
||||
void add_srb(int is_gnb,
|
||||
ue_id_t UEid,
|
||||
struct NR_SRB_ToAddMod *s,
|
||||
int ciphering_algorithm,
|
||||
int integrity_algorithm,
|
||||
unsigned char *ciphering_key,
|
||||
unsigned char *integrity_key)
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||
{
|
||||
nr_pdcp_entity_t *pdcp_srb;
|
||||
nr_pdcp_ue_t *ue;
|
||||
@@ -829,10 +826,7 @@ void add_srb(int is_gnb,
|
||||
SHORT_SN_SIZE,
|
||||
t_Reordering,
|
||||
-1,
|
||||
ciphering_algorithm,
|
||||
integrity_algorithm,
|
||||
ciphering_key,
|
||||
integrity_key);
|
||||
security_parameters);
|
||||
nr_pdcp_ue_add_srb_pdcp_entity(ue, srb_id, pdcp_srb);
|
||||
|
||||
LOG_D(PDCP, "added srb %d to UE ID %ld\n", srb_id, UEid);
|
||||
@@ -843,10 +837,7 @@ void add_srb(int is_gnb,
|
||||
void add_drb(int is_gnb,
|
||||
ue_id_t UEid,
|
||||
struct NR_DRB_ToAddMod *s,
|
||||
int ciphering_algorithm,
|
||||
int integrity_algorithm,
|
||||
unsigned char *ciphering_key,
|
||||
unsigned char *integrity_key)
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||
{
|
||||
nr_pdcp_entity_t *pdcp_drb;
|
||||
nr_pdcp_ue_t *ue;
|
||||
@@ -910,6 +901,10 @@ void add_drb(int is_gnb,
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* get actual ciphering and integrity algorithm based on pdcp_Config */
|
||||
nr_pdcp_entity_security_keys_and_algos_t actual_security_parameters = *security_parameters;
|
||||
actual_security_parameters.ciphering_algorithm = has_ciphering ? security_parameters->ciphering_algorithm : 0;
|
||||
actual_security_parameters.integrity_algorithm = has_integrity ? security_parameters->integrity_algorithm : 0;
|
||||
|
||||
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, UEid);
|
||||
@@ -922,10 +917,7 @@ void add_drb(int is_gnb,
|
||||
deliver_pdu_drb_gnb : deliver_pdu_drb_ue,
|
||||
ue,
|
||||
sn_size_dl, t_reordering, discard_timer,
|
||||
has_ciphering ? ciphering_algorithm : 0,
|
||||
has_integrity ? integrity_algorithm : 0,
|
||||
has_ciphering ? ciphering_key : NULL,
|
||||
has_integrity ? integrity_key : NULL);
|
||||
&actual_security_parameters);
|
||||
nr_pdcp_ue_add_drb_pdcp_entity(ue, drb_id, pdcp_drb);
|
||||
|
||||
LOG_I(PDCP, "added drb %d to UE ID %ld\n", drb_id, UEid);
|
||||
@@ -946,13 +938,11 @@ void add_drb(int is_gnb,
|
||||
void nr_pdcp_add_srbs(eNB_flag_t enb_flag,
|
||||
ue_id_t UEid,
|
||||
NR_SRB_ToAddModList_t *const srb2add_list,
|
||||
const uint8_t security_modeP,
|
||||
uint8_t *const kRRCenc,
|
||||
uint8_t *const kRRCint)
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||
{
|
||||
if (srb2add_list != NULL) {
|
||||
for (int i = 0; i < srb2add_list->list.count; i++) {
|
||||
add_srb(enb_flag, UEid, srb2add_list->list.array[i], security_modeP & 0x0f, (security_modeP >> 4) & 0x0f, kRRCenc, kRRCint);
|
||||
add_srb(enb_flag, UEid, srb2add_list->list.array[i], security_parameters);
|
||||
}
|
||||
} else
|
||||
LOG_W(PDCP, "nr_pdcp_add_srbs() with void list\n");
|
||||
@@ -961,19 +951,14 @@ void nr_pdcp_add_srbs(eNB_flag_t enb_flag,
|
||||
void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
|
||||
ue_id_t UEid,
|
||||
NR_DRB_ToAddModList_t *const drb2add_list,
|
||||
const uint8_t security_modeP,
|
||||
uint8_t *const kUPenc,
|
||||
uint8_t *const kUPint)
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||
{
|
||||
if (drb2add_list != NULL) {
|
||||
for (int i = 0; i < drb2add_list->list.count; i++) {
|
||||
add_drb(enb_flag,
|
||||
UEid,
|
||||
drb2add_list->list.array[i],
|
||||
security_modeP & 0x0f,
|
||||
(security_modeP >> 4) & 0x0f,
|
||||
kUPenc,
|
||||
kUPint);
|
||||
security_parameters);
|
||||
}
|
||||
} else
|
||||
LOG_W(PDCP, "nr_pdcp_add_drbs() with void list\n");
|
||||
@@ -1026,35 +1011,26 @@ void pdcp_config_set_security(const protocol_ctxt_t *const ctxt_pP,
|
||||
}
|
||||
|
||||
void nr_pdcp_config_set_security(ue_id_t ue_id,
|
||||
const rb_id_t rb_id,
|
||||
const uint8_t security_modeP,
|
||||
uint8_t *const kRRCenc_pP,
|
||||
uint8_t *const kRRCint_pP,
|
||||
uint8_t *const kUPenc_pP)
|
||||
rb_id_t rb_id,
|
||||
bool is_srb,
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *parameters)
|
||||
{
|
||||
nr_pdcp_ue_t *ue;
|
||||
nr_pdcp_entity_t *rb;
|
||||
int integrity_algorithm;
|
||||
int ciphering_algorithm;
|
||||
|
||||
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||
|
||||
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id);
|
||||
|
||||
/* TODO: proper handling of DRBs, for the moment only SRBs are handled */
|
||||
|
||||
rb = nr_pdcp_get_rb(ue, rb_id, true);
|
||||
rb = nr_pdcp_get_rb(ue, rb_id, is_srb);
|
||||
|
||||
if (rb == NULL) {
|
||||
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
|
||||
LOG_E(PDCP, "no SRB found (ue_id %ld, rb_id %ld)\n", ue_id, rb_id);
|
||||
LOG_E(PDCP, "no %s found (ue_id %ld, rb_id %ld)\n", is_srb ? "SRB" : "DRB", ue_id, rb_id);
|
||||
return;
|
||||
}
|
||||
|
||||
integrity_algorithm = (security_modeP>>4) & 0xf;
|
||||
ciphering_algorithm = security_modeP & 0x0f;
|
||||
rb->set_security(rb, integrity_algorithm, (char *)kRRCint_pP,
|
||||
ciphering_algorithm, (char *)kRRCenc_pP);
|
||||
rb->set_security(rb, parameters);
|
||||
|
||||
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
|
||||
}
|
||||
@@ -1240,7 +1216,10 @@ void nr_pdcp_release_drb(ue_id_t ue_id, int drb_id)
|
||||
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
|
||||
}
|
||||
|
||||
void nr_pdcp_reestablishment(ue_id_t ue_id, int rb_id, bool srb_flag)
|
||||
void nr_pdcp_reestablishment(ue_id_t ue_id,
|
||||
int rb_id,
|
||||
bool srb_flag,
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||
{
|
||||
nr_pdcp_ue_t *ue;
|
||||
nr_pdcp_entity_t *rb;
|
||||
@@ -1251,7 +1230,7 @@ void nr_pdcp_reestablishment(ue_id_t ue_id, int rb_id, bool srb_flag)
|
||||
|
||||
if (rb != NULL) {
|
||||
LOG_D(PDCP, "UE %4.4lx re-establishment of %sRB %d\n", ue_id, srb_flag ? "S" : "D", rb_id);
|
||||
rb->reestablish_entity(rb);
|
||||
rb->reestablish_entity(rb, security_parameters);
|
||||
LOG_I(PDCP, "%s %d re-established\n", srb_flag ? "SRB" : "DRB" , rb_id);
|
||||
} else {
|
||||
LOG_W(PDCP, "UE %4.4lx cannot re-establish %sRB %d, RB not found\n", ue_id, srb_flag ? "S" : "D", rb_id);
|
||||
|
||||
@@ -49,20 +49,23 @@ bool pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
|
||||
void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
|
||||
ue_id_t UEid,
|
||||
NR_DRB_ToAddModList_t *const drb2add_list,
|
||||
const uint8_t security_modeP,
|
||||
uint8_t *const kUPenc,
|
||||
uint8_t *const kUPint);
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters);
|
||||
|
||||
void nr_pdcp_add_srbs(eNB_flag_t enb_flag,
|
||||
ue_id_t UEid,
|
||||
NR_SRB_ToAddModList_t *const srb2add_list,
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters);
|
||||
|
||||
void add_drb(int is_gnb,
|
||||
ue_id_t UEid,
|
||||
struct NR_DRB_ToAddMod *s,
|
||||
int ciphering_algorithm,
|
||||
int integrity_algorithm,
|
||||
unsigned char *ciphering_key,
|
||||
unsigned char *integrity_key);
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters);
|
||||
|
||||
void nr_pdcp_remove_UE(ue_id_t ue_id);
|
||||
void nr_pdcp_reestablishment(ue_id_t ue_id, int rb_id, bool srb_flag);
|
||||
void nr_pdcp_reestablishment(ue_id_t ue_id,
|
||||
int rb_id,
|
||||
bool srb_flag,
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters);
|
||||
|
||||
void nr_pdcp_suspend_srb(ue_id_t ue_id, int srb_id);
|
||||
void nr_pdcp_suspend_drb(ue_id_t ue_id, int drb_id);
|
||||
@@ -71,21 +74,15 @@ void nr_pdcp_reconfigure_drb(ue_id_t ue_id, int drb_id, NR_PDCP_Config_t *pdcp_c
|
||||
void nr_pdcp_release_srb(ue_id_t ue_id, int srb_id);
|
||||
void nr_pdcp_release_drb(ue_id_t ue_id, int drb_id);
|
||||
|
||||
|
||||
void add_srb(int is_gnb,
|
||||
ue_id_t UEid,
|
||||
struct NR_SRB_ToAddMod *s,
|
||||
int ciphering_algorithm,
|
||||
int integrity_algorithm,
|
||||
unsigned char *ciphering_key,
|
||||
unsigned char *integrity_key);
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters);
|
||||
|
||||
void nr_pdcp_config_set_security(ue_id_t ue_id,
|
||||
const rb_id_t rb_id,
|
||||
const uint8_t security_modeP,
|
||||
uint8_t *const kRRCenc_pP,
|
||||
uint8_t *const kRRCint_pP,
|
||||
uint8_t *const kUPenc_pP);
|
||||
rb_id_t rb_id,
|
||||
bool is_srb,
|
||||
const nr_pdcp_entity_security_keys_and_algos_t *parameters);
|
||||
|
||||
bool nr_pdcp_check_integrity_srb(ue_id_t ue_id,
|
||||
int srb_id,
|
||||
|
||||
@@ -147,7 +147,7 @@ void mac_rlc_data_ind(const module_id_t module_idP,
|
||||
num_tb_t num_tbP,
|
||||
crc_t *crcs_pP)
|
||||
{
|
||||
if (module_idP != 0 || eNB_index != 0 || /*enb_flagP != 1 ||*/ MBMS_flagP != 0) {
|
||||
if (eNB_index != 0 || /*enb_flagP != 1 ||*/ MBMS_flagP != 0) {
|
||||
LOG_E(RLC, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -36,3 +36,6 @@ target_link_libraries(asn1_nr_rrc PUBLIC asn1_nr_rrc_hdrs)
|
||||
target_compile_options(asn1_nr_rrc
|
||||
PRIVATE -DASN_DISABLE_OER_SUPPORT -w
|
||||
PUBLIC -DNR_RRC_VERSION=${NR_RRC_RELEASE})
|
||||
if (ENABLE_TESTS)
|
||||
add_subdirectory(tests)
|
||||
endif()
|
||||
|
||||
@@ -241,6 +241,7 @@ int do_SIB23_NR(rrc_gNB_carrier_data_t *carrier)
|
||||
100);
|
||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_BCCH_DL_SCH_Message, sib_message);
|
||||
return((enc_rval.encoded+7)/8);
|
||||
}
|
||||
|
||||
@@ -249,7 +250,6 @@ int do_RRCReject(uint8_t *const buffer)
|
||||
asn_enc_rval_t enc_rval;
|
||||
NR_DL_CCCH_Message_t dl_ccch_msg;
|
||||
NR_RRCReject_t *rrcReject;
|
||||
NR_RejectWaitTime_t waitTime = 1;
|
||||
|
||||
memset((void *)&dl_ccch_msg, 0, sizeof(NR_DL_CCCH_Message_t));
|
||||
dl_ccch_msg.message.present = NR_DL_CCCH_MessageType_PR_c1;
|
||||
@@ -261,9 +261,9 @@ int do_RRCReject(uint8_t *const buffer)
|
||||
|
||||
rrcReject->criticalExtensions.choice.rrcReject = CALLOC(1, sizeof(struct NR_RRCReject_IEs));
|
||||
rrcReject->criticalExtensions.choice.rrcReject->waitTime = CALLOC(1, sizeof(NR_RejectWaitTime_t));
|
||||
*rrcReject->criticalExtensions.choice.rrcReject->waitTime = 1;
|
||||
|
||||
rrcReject->criticalExtensions.present = NR_RRCReject__criticalExtensions_PR_rrcReject;
|
||||
rrcReject->criticalExtensions.choice.rrcReject->waitTime = &waitTime;
|
||||
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout, &asn_DEF_NR_DL_CCCH_Message, (void *)&dl_ccch_msg);
|
||||
@@ -277,6 +277,7 @@ int do_RRCReject(uint8_t *const buffer)
|
||||
|
||||
AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_DL_CCCH_Message, &dl_ccch_msg);
|
||||
|
||||
LOG_D(NR_RRC,"RRCReject Encoded %zd bits (%zd bytes)\n",
|
||||
enc_rval.encoded,(enc_rval.encoded+7)/8);
|
||||
@@ -608,6 +609,7 @@ int do_NR_SA_UECapabilityEnquiry(const protocol_ctxt_t *const ctxt_pP,
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout, &asn_DEF_NR_UE_CapabilityRequestFilterNR, (void *)sa_band_filter);
|
||||
}
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_UE_CapabilityRequestFilterNR, sa_band_filter);
|
||||
|
||||
ue_capabilityrat_request->capabilityRequestFilter = req_freq;
|
||||
|
||||
@@ -843,6 +845,7 @@ int do_NR_RRCReconfigurationComplete_for_nsa(
|
||||
buffer_size);
|
||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_RRCReconfigurationComplete, &rrc_complete_msg);
|
||||
LOG_A(NR_RRC, "rrcReconfigurationComplete Encoded %zd bits (%zd bytes)\n", enc_rval.encoded, (enc_rval.encoded+7)/8);
|
||||
return((enc_rval.encoded+7)/8);
|
||||
}
|
||||
@@ -962,6 +965,8 @@ int do_NR_ULInformationTransfer(uint8_t **buffer, uint32_t pdu_length, uint8_t *
|
||||
encoded = uper_encode_to_new_buffer (&asn_DEF_NR_UL_DCCH_Message, NULL, (void *) &ul_dcch_msg, (void **) buffer);
|
||||
AssertFatal(encoded > 0,"ASN1 message encoding failed (%s, %ld)!\n",
|
||||
"ULInformationTransfer",encoded);
|
||||
ulInformationTransfer->dedicatedNAS_Message->buf = NULL; // Let caller decide when to free it
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_UL_DCCH_Message, &ul_dcch_msg);
|
||||
LOG_D(NR_RRC,"ULInformationTransfer Encoded %zd bytes\n",encoded);
|
||||
|
||||
return encoded;
|
||||
@@ -1004,6 +1009,9 @@ int do_RRCReestablishmentRequest(uint8_t *buffer,
|
||||
buffer,
|
||||
100);
|
||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded);
|
||||
// shortMAC_I.buf is on the stack, cannot free useing ASN_STRUCT_FREE macro
|
||||
rrcReestablishmentRequest->rrcReestablishmentRequest.ue_Identity.shortMAC_I.buf = NULL;
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_UL_CCCH_Message, &ul_ccch_msg);
|
||||
LOG_D(NR_RRC,"[UE] RRCReestablishmentRequest Encoded %zd bits (%zd bytes)\n", enc_rval.encoded, (enc_rval.encoded+7)/8);
|
||||
return((enc_rval.encoded+7)/8);
|
||||
}
|
||||
@@ -1055,6 +1063,7 @@ int do_RRCReestablishment(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
|
||||
AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_DL_DCCH_Message, &dl_dcch_msg);
|
||||
|
||||
LOG_D(NR_RRC, "RRCReestablishment Encoded %u bits (%u bytes)\n", (uint32_t)enc_rval.encoded, (uint32_t)(enc_rval.encoded + 7) / 8);
|
||||
return ((enc_rval.encoded + 7) / 8);
|
||||
@@ -1090,6 +1099,7 @@ int do_RRCReestablishmentComplete(uint8_t *buffer, size_t buffer_size, int64_t r
|
||||
buffer_size);
|
||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded);
|
||||
LOG_D(NR_RRC,"[UE] RRCReestablishmentComplete Encoded %zd bits (%zd bytes)\n", enc_rval.encoded, (enc_rval.encoded+7)/8);
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_UL_DCCH_Message, &ul_dcch_msg);
|
||||
return((enc_rval.encoded+7)/8);
|
||||
}
|
||||
|
||||
@@ -1336,7 +1346,7 @@ void free_MeasConfig(NR_MeasConfig_t *mc)
|
||||
int do_NR_Paging(uint8_t Mod_id, uint8_t *buffer, uint32_t tmsi)
|
||||
{
|
||||
LOG_D(NR_RRC, "[gNB %d] do_NR_Paging start\n", Mod_id);
|
||||
NR_PCCH_Message_t pcch_msg;
|
||||
NR_PCCH_Message_t pcch_msg = {0};
|
||||
pcch_msg.message.present = NR_PCCH_MessageType_PR_c1;
|
||||
asn1cCalloc(pcch_msg.message.choice.c1, c1);
|
||||
c1->present = NR_PCCH_MessageType__c1_PR_paging;
|
||||
@@ -1359,6 +1369,10 @@ int do_NR_Paging(uint8_t Mod_id, uint8_t *buffer, uint32_t tmsi)
|
||||
Mod_id, c1->choice.paging->pagingRecordList->list.count);
|
||||
asn_enc_rval_t enc_rval = uper_encode_to_buffer(
|
||||
&asn_DEF_NR_PCCH_Message, NULL, (void *)&pcch_msg, buffer, RRC_BUF_SIZE);
|
||||
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout, &asn_DEF_NR_PCCH_Message, (void *)&pcch_msg);
|
||||
}
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_PCCH_Message, &pcch_msg);
|
||||
if(enc_rval.encoded == -1) {
|
||||
LOG_I(NR_RRC, "[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
|
||||
@@ -1366,9 +1380,5 @@ int do_NR_Paging(uint8_t Mod_id, uint8_t *buffer, uint32_t tmsi)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout, &asn_DEF_NR_PCCH_Message, (void *)&pcch_msg);
|
||||
}
|
||||
|
||||
return((enc_rval.encoded+7)/8);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
add_executable(test_asn1_msg test_asn1_msg.cpp)
|
||||
target_link_libraries(test_asn1_msg PRIVATE nr_rrc SECURITY minimal_lib GTest::gtest UTIL)
|
||||
add_dependencies(tests test_asn1_msg)
|
||||
add_test(NAME test_asn1_msg
|
||||
COMMAND ./test_asn1_msg)
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* 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 <gtest/gtest.h>
|
||||
extern "C" {
|
||||
#include "openair2/RRC/NR/MESSAGES/asn1_msg.h"
|
||||
#include "common/ran_context.h"
|
||||
#include <stdbool.h>
|
||||
#include "common/utils/assertions.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
RAN_CONTEXT_t RC;
|
||||
}
|
||||
|
||||
TEST(nr_asn1, rrc_reject)
|
||||
{
|
||||
unsigned char buf[1000];
|
||||
EXPECT_GT(do_RRCReject(buf), 0);
|
||||
}
|
||||
|
||||
TEST(nr_asn1, sa_capability_enquiry)
|
||||
{
|
||||
protocol_ctxt_t ctxt = {0};
|
||||
unsigned char buf[1000];
|
||||
EXPECT_GT(do_NR_SA_UECapabilityEnquiry(&ctxt, buf, 0), 0);
|
||||
}
|
||||
|
||||
TEST(nr_asn1, rrc_reconfiguration_complete_for_nsa)
|
||||
{
|
||||
unsigned char buf[1000];
|
||||
EXPECT_GT(do_NR_RRCReconfigurationComplete_for_nsa(buf, 1000, 0), 0);
|
||||
}
|
||||
|
||||
TEST(nr_asn1, ul_information_transfer)
|
||||
{
|
||||
unsigned char *buf = NULL;
|
||||
unsigned char pdu[20] = {0};
|
||||
EXPECT_GT(do_NR_ULInformationTransfer(&buf, 20, pdu), 0);
|
||||
EXPECT_NE(buf, nullptr);
|
||||
free(buf);
|
||||
}
|
||||
|
||||
TEST(nr_asn1, rrc_reestablishment_request)
|
||||
{
|
||||
unsigned char buf[1000];
|
||||
const uint16_t c_rnti = 1;
|
||||
const uint32_t cell_id = 177;
|
||||
EXPECT_GT(do_RRCReestablishmentRequest(buf, NR_ReestablishmentCause_reconfigurationFailure, cell_id, c_rnti), 0);
|
||||
}
|
||||
|
||||
TEST(nr_asn1, rrc_reestablishment)
|
||||
{
|
||||
rrc_gNB_ue_context_t ue_context_pP;
|
||||
memset(&ue_context_pP, 0, sizeof(ue_context_pP));
|
||||
unsigned char buf[1000];
|
||||
const uint32_t physical_cell_id = 177;
|
||||
NR_ARFCN_ValueNR_t absoluteFrequencySSB = 2700000;
|
||||
EXPECT_GT(do_RRCReestablishment(&ue_context_pP, buf, 1000, 0, physical_cell_id, absoluteFrequencySSB), 0);
|
||||
}
|
||||
|
||||
TEST(nr_asn1, paging)
|
||||
{
|
||||
unsigned char buf[1000];
|
||||
EXPECT_GT(do_NR_Paging(0, buf, 0), 0);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
logInit();
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
@@ -145,20 +145,6 @@ void ue_cxt_mod_direct(MessageDef *msg,
|
||||
|
||||
void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p,
|
||||
e1ap_bearer_setup_resp_t *e1ap_resp);
|
||||
void nr_pdcp_add_srbs(eNB_flag_t enb_flag,
|
||||
ue_id_t UEid,
|
||||
NR_SRB_ToAddModList_t *const srb2add_list,
|
||||
const uint8_t security_modeP,
|
||||
uint8_t *const kRRCenc,
|
||||
uint8_t *const kUPint);
|
||||
|
||||
void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
|
||||
ue_id_t rntiMaybeUEid,
|
||||
NR_DRB_ToAddModList_t *const drb2add_list,
|
||||
const uint8_t security_modeP,
|
||||
uint8_t *const kUPenc,
|
||||
uint8_t *const kUPint);
|
||||
|
||||
void trigger_bearer_setup(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, pdusession_t *sessions, uint64_t ueAggMaxBitRateDownlink);
|
||||
|
||||
int rrc_gNB_generate_pcch_msg(sctp_assoc_t assoc_id, const NR_SIB1_t *sib, uint32_t tmsi, uint8_t paging_drx);
|
||||
|
||||
+49
-25
@@ -389,19 +389,19 @@ static void activate_srb(gNB_RRC_UE_t *UE, int srb_id)
|
||||
srb->srb_Identity = srb_id;
|
||||
|
||||
if (srb_id == 1) {
|
||||
nr_pdcp_add_srbs(true, UE->rrc_ue_id, list, 0, NULL, NULL);
|
||||
nr_pdcp_entity_security_keys_and_algos_t null_security_parameters = {0};
|
||||
nr_pdcp_add_srbs(true, UE->rrc_ue_id, list, &null_security_parameters);
|
||||
} else {
|
||||
uint8_t kRRCenc[NR_K_KEY_SIZE] = {0};
|
||||
uint8_t kRRCint[NR_K_KEY_SIZE] = {0};
|
||||
nr_derive_key(RRC_ENC_ALG, UE->ciphering_algorithm, UE->kgnb, kRRCenc);
|
||||
nr_derive_key(RRC_INT_ALG, UE->integrity_algorithm, UE->kgnb, kRRCint);
|
||||
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||
security_parameters.ciphering_algorithm = UE->ciphering_algorithm;
|
||||
security_parameters.integrity_algorithm = UE->integrity_algorithm;
|
||||
nr_derive_key(RRC_ENC_ALG, UE->ciphering_algorithm, UE->kgnb, security_parameters.ciphering_key);
|
||||
nr_derive_key(RRC_INT_ALG, UE->integrity_algorithm, UE->kgnb, security_parameters.integrity_key);
|
||||
|
||||
nr_pdcp_add_srbs(true,
|
||||
UE->rrc_ue_id,
|
||||
list,
|
||||
(UE->integrity_algorithm << 4) | UE->ciphering_algorithm,
|
||||
kRRCenc,
|
||||
kRRCint);
|
||||
&security_parameters);
|
||||
}
|
||||
freeSRBlist(list);
|
||||
}
|
||||
@@ -850,6 +850,12 @@ static void cuup_notify_reestablishment(gNB_RRC_INST *rrc, gNB_RRC_UE_t *ue_p)
|
||||
/* increase DRB to modify counter */
|
||||
pdu_e1->numDRB2Modify += 1;
|
||||
}
|
||||
|
||||
req.cipheringAlgorithm = rrc->security.do_drb_ciphering ? ue_p->ciphering_algorithm : 0;
|
||||
req.integrityProtectionAlgorithm = rrc->security.do_drb_integrity ? ue_p->integrity_algorithm : 0;
|
||||
nr_derive_key(UP_ENC_ALG, req.cipheringAlgorithm, ue_p->kgnb, (uint8_t *)req.encryptionKey);
|
||||
nr_derive_key(UP_INT_ALG, req.integrityProtectionAlgorithm, ue_p->kgnb, (uint8_t *)req.integrityProtectionKey);
|
||||
|
||||
/* Send E1 Bearer Context Modification Request (3GPP TS 38.463) */
|
||||
sctp_assoc_t assoc_id = get_existing_cuup_for_ue(rrc, ue_p);
|
||||
rrc->cucp_cuup.bearer_context_mod(assoc_id, &req);
|
||||
@@ -866,7 +872,6 @@ static void rrc_gNB_generate_RRCReestablishment(rrc_gNB_ue_context_t *ue_context
|
||||
{
|
||||
module_id_t module_id = 0;
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[module_id];
|
||||
int enable_ciphering = 0;
|
||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||
uint8_t buffer[RRC_BUF_SIZE] = {0};
|
||||
uint8_t xid = rrc_gNB_get_next_transaction_identifier(module_id);
|
||||
@@ -878,30 +883,33 @@ static void rrc_gNB_generate_RRCReestablishment(rrc_gNB_ue_context_t *ue_context
|
||||
LOG_I(NR_RRC, "[RAPROC] UE %04x Logical Channel DL-DCCH, Generating NR_RRCReestablishment (bytes %d)\n", ue_p->rnti, size);
|
||||
|
||||
/* Ciphering and Integrity according to TS 33.501 */
|
||||
uint8_t kRRCenc[NR_K_KEY_SIZE] = {0};
|
||||
uint8_t kRRCint[NR_K_KEY_SIZE] = {0};
|
||||
uint8_t kUPenc[NR_K_KEY_SIZE] = {0};
|
||||
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||
/* Derive the keys from kgnb */
|
||||
if (ue_p->Srb[1].Active)
|
||||
nr_derive_key(UP_ENC_ALG, ue_p->ciphering_algorithm, ue_p->kgnb, kUPenc);
|
||||
nr_derive_key(RRC_ENC_ALG, ue_p->ciphering_algorithm, ue_p->kgnb, kRRCenc);
|
||||
nr_derive_key(RRC_INT_ALG, ue_p->integrity_algorithm, ue_p->kgnb, kRRCint);
|
||||
nr_derive_key(RRC_ENC_ALG, ue_p->ciphering_algorithm, ue_p->kgnb, security_parameters.ciphering_key);
|
||||
nr_derive_key(RRC_INT_ALG, ue_p->integrity_algorithm, ue_p->kgnb, security_parameters.integrity_key);
|
||||
LOG_I(NR_RRC,
|
||||
"Set PDCP security UE %d RNTI %04x nca %ld nia %d in RRCReestablishment\n",
|
||||
"Set PDCP security UE %d RNTI %04x nea %ld nia %d in RRCReestablishment\n",
|
||||
ue_p->rrc_ue_id,
|
||||
ue_p->rnti,
|
||||
ue_p->ciphering_algorithm,
|
||||
ue_p->integrity_algorithm);
|
||||
uint8_t security_mode =
|
||||
enable_ciphering ? ue_p->ciphering_algorithm | (ue_p->integrity_algorithm << 4) : 0 | (ue_p->integrity_algorithm << 4);
|
||||
/* RRCReestablishment is integrity protected but not ciphered,
|
||||
* so let's configure only integrity protection right now.
|
||||
* Ciphering is enabled below, after generating RRCReestablishment.
|
||||
*/
|
||||
security_parameters.integrity_algorithm = ue_p->integrity_algorithm;
|
||||
security_parameters.ciphering_algorithm = 0;
|
||||
|
||||
/* SRBs */
|
||||
for (int srb_id = 1; srb_id < NR_NUM_SRB; srb_id++) {
|
||||
if (ue_p->Srb[srb_id].Active)
|
||||
nr_pdcp_config_set_security(ue_p->rrc_ue_id, srb_id, security_mode, kRRCenc, kRRCint, kUPenc);
|
||||
nr_pdcp_config_set_security(ue_p->rrc_ue_id, srb_id, true, &security_parameters);
|
||||
}
|
||||
/* Re-establish PDCP for SRB1, according to 5.3.7.4 of 3GPP TS 38.331 */
|
||||
nr_pdcp_reestablishment(ue_p->rrc_ue_id, 1, true);
|
||||
nr_pdcp_reestablishment(ue_p->rrc_ue_id,
|
||||
1,
|
||||
true,
|
||||
&security_parameters);
|
||||
/* F1AP DL RRC Message Transfer */
|
||||
f1_ue_data_t ue_data = cu_get_f1_ue_data(ue_p->rrc_ue_id);
|
||||
RETURN_IF_INVALID_ASSOC_ID(ue_data);
|
||||
@@ -912,6 +920,14 @@ static void rrc_gNB_generate_RRCReestablishment(rrc_gNB_ue_context_t *ue_context
|
||||
.old_gNB_DU_ue_id = &old_gNB_DU_ue_id};
|
||||
deliver_dl_rrc_message_data_t data = {.rrc = rrc, .dl_rrc = &dl_rrc, .assoc_id = ue_data.du_assoc_id};
|
||||
nr_pdcp_data_req_srb(ue_p->rrc_ue_id, DCCH, rrc_gNB_mui++, size, (unsigned char *const)buffer, rrc_deliver_dl_rrc_message, &data);
|
||||
|
||||
/* RRCReestablishment has been generated, let's enable ciphering now. */
|
||||
security_parameters.ciphering_algorithm = ue_p->ciphering_algorithm;
|
||||
/* SRBs */
|
||||
for (int srb_id = 1; srb_id < NR_NUM_SRB; srb_id++) {
|
||||
if (ue_p->Srb[srb_id].Active)
|
||||
nr_pdcp_config_set_security(ue_p->rrc_ue_id, srb_id, true, &security_parameters);
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Function tha processes RRCReestablishmentComplete message sent by the UE, after RRCReestasblishment request.
|
||||
@@ -933,9 +949,6 @@ static void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *co
|
||||
|
||||
ue_p->Srb[1].Active = 1;
|
||||
|
||||
uint8_t send_security_mode_command = false;
|
||||
nr_rrc_pdcp_config_security(ctxt_pP, ue_context_pP, send_security_mode_command);
|
||||
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
|
||||
NR_CellGroupConfig_t *cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
|
||||
|
||||
@@ -966,7 +979,13 @@ static void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *co
|
||||
*/
|
||||
int srb_id = 2;
|
||||
if (ue_p->Srb[srb_id].Active) {
|
||||
nr_pdcp_reestablishment(ue_p->rrc_ue_id, srb_id, true);
|
||||
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||
security_parameters.ciphering_algorithm = ue_p->ciphering_algorithm;
|
||||
security_parameters.integrity_algorithm = ue_p->integrity_algorithm;
|
||||
nr_derive_key(RRC_ENC_ALG, ue_p->ciphering_algorithm, ue_p->kgnb, security_parameters.ciphering_key);
|
||||
nr_derive_key(RRC_INT_ALG, ue_p->integrity_algorithm, ue_p->kgnb, security_parameters.integrity_key);
|
||||
|
||||
nr_pdcp_reestablishment(ue_p->rrc_ue_id, srb_id, true, &security_parameters);
|
||||
}
|
||||
/* PDCP Reestablishment of DRBs according to 5.3.5.6.5 of 3GPP TS 38.331 (over E1) */
|
||||
cuup_notify_reestablishment(rrc, ue_p);
|
||||
@@ -1891,6 +1910,11 @@ static void e1_send_bearer_updates(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, f
|
||||
DevAssert(req.numPDUSessionsMod > 0);
|
||||
DevAssert(req.numPDUSessions == 0);
|
||||
|
||||
req.cipheringAlgorithm = rrc->security.do_drb_ciphering ? UE->ciphering_algorithm : 0;
|
||||
req.integrityProtectionAlgorithm = rrc->security.do_drb_integrity ? UE->integrity_algorithm : 0;
|
||||
nr_derive_key(UP_ENC_ALG, req.cipheringAlgorithm, UE->kgnb, (uint8_t *)req.encryptionKey);
|
||||
nr_derive_key(UP_INT_ALG, req.integrityProtectionAlgorithm, UE->kgnb, (uint8_t *)req.integrityProtectionKey);
|
||||
|
||||
// send the E1 bearer modification request message to update F1-U tunnel info
|
||||
sctp_assoc_t assoc_id = get_existing_cuup_for_ue(rrc, UE);
|
||||
rrc->cucp_cuup.bearer_context_mod(assoc_id, &req);
|
||||
|
||||
@@ -135,33 +135,29 @@ nr_rrc_pdcp_config_security(
|
||||
)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
uint8_t kRRCenc[NR_K_KEY_SIZE] = {0};
|
||||
uint8_t kRRCint[NR_K_KEY_SIZE] = {0};
|
||||
uint8_t kUPenc[NR_K_KEY_SIZE] = {0};
|
||||
//uint8_t *k_kdf = NULL;
|
||||
static int print_keys= 1;
|
||||
gNB_RRC_UE_t *UE = &ue_context_pP->ue_context;
|
||||
|
||||
/* Derive the keys from kgnb */
|
||||
if (UE->Srb[1].Active || UE->Srb[2].Active) {
|
||||
nr_derive_key(UP_ENC_ALG, UE->ciphering_algorithm, UE->kgnb, kUPenc);
|
||||
}
|
||||
|
||||
nr_derive_key(RRC_ENC_ALG, UE->ciphering_algorithm, UE->kgnb, kRRCenc);
|
||||
nr_derive_key(RRC_INT_ALG, UE->integrity_algorithm, UE->kgnb, kRRCint);
|
||||
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||
/* set ciphering algorithm depending on 'enable_ciphering' */
|
||||
security_parameters.ciphering_algorithm = enable_ciphering ? UE->ciphering_algorithm : 0;
|
||||
security_parameters.integrity_algorithm = UE->integrity_algorithm;
|
||||
/* use current ciphering algorithm, independently of 'enable_ciphering' to derive ciphering key */
|
||||
nr_derive_key(RRC_ENC_ALG, UE->ciphering_algorithm, UE->kgnb, security_parameters.ciphering_key);
|
||||
nr_derive_key(RRC_INT_ALG, UE->integrity_algorithm, UE->kgnb, security_parameters.integrity_key);
|
||||
|
||||
if ( LOG_DUMPFLAG( DEBUG_SECURITY ) ) {
|
||||
if (print_keys == 1 ) {
|
||||
print_keys =0;
|
||||
LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, UE->kgnb, 32, "\nKgNB:");
|
||||
LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, kRRCenc, 16,"\nKRRCenc:" );
|
||||
LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, kRRCint, 16,"\nKRRCint:" );
|
||||
LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, security_parameters.ciphering_key, 16,"\nKRRCenc:" );
|
||||
LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, security_parameters.integrity_key, 16,"\nKRRCint:" );
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t security_mode =
|
||||
enable_ciphering ? UE->ciphering_algorithm | (UE->integrity_algorithm << 4) : 0 | (UE->integrity_algorithm << 4);
|
||||
nr_pdcp_config_set_security(ctxt_pP->rntiMaybeUEid, DCCH, security_mode, kRRCenc, kRRCint, kUPenc);
|
||||
nr_pdcp_config_set_security(ctxt_pP->rntiMaybeUEid, DCCH, true, &security_parameters);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -199,6 +195,13 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ(
|
||||
// NGAP_NAS_FIRST_REQ (message_p).nas_pdu.length,
|
||||
// ue_context_pP);
|
||||
|
||||
/* selected_plmn_identity: IE is 1-based, convert to 0-based (C array) */
|
||||
int selected_plmn_identity = rrcSetupComplete->selectedPLMN_Identity - 1;
|
||||
if (selected_plmn_identity != 0)
|
||||
LOG_E(NGAP, "UE %u: sent selected PLMN identity %ld, but only one PLMN supported\n", req->gNB_ue_ngap_id, rrcSetupComplete->selectedPLMN_Identity);
|
||||
|
||||
req->selected_plmn_identity = 0; /* always zero because we only support one */
|
||||
|
||||
/* Fill UE identities with available information */
|
||||
if (UE->Initialue_identity_5g_s_TMSI.presence) {
|
||||
/* Fill s-TMSI */
|
||||
@@ -220,27 +223,6 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ(
|
||||
UE->ue_guami.amf_set_id = req->ue_identity.guami.amf_set_id;
|
||||
UE->ue_guami.amf_pointer = req->ue_identity.guami.amf_pointer;
|
||||
|
||||
if (r_amf->plmn_Identity != NULL) {
|
||||
AssertFatal(false, "At the moment, OAI RAN does not support multiple PLMN IDs. Therefore, this part has not been tested\n");
|
||||
/* selected_plmn_identity: IE is 1-based, convert to 0-based (C array) */
|
||||
int selected_plmn_identity = rrcSetupComplete->selectedPLMN_Identity - 1;
|
||||
req->selected_plmn_identity = selected_plmn_identity;
|
||||
|
||||
if ((r_amf->plmn_Identity->mcc != NULL) && (r_amf->plmn_Identity->mcc->list.count > 0)) {
|
||||
/* Use first indicated PLMN MCC if it is defined */
|
||||
req->ue_identity.guami.mcc = *r_amf->plmn_Identity->mcc->list.array[selected_plmn_identity];
|
||||
LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MCC %u ue %x\n", ctxt_pP->module_id, req->ue_identity.guami.mcc, UE->rnti);
|
||||
}
|
||||
|
||||
if (r_amf->plmn_Identity->mnc.list.count > 0) {
|
||||
/* Use first indicated PLMN MNC if it is defined */
|
||||
req->ue_identity.guami.mnc = *r_amf->plmn_Identity->mnc.list.array[selected_plmn_identity];
|
||||
LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MNC %u ue %x\n", ctxt_pP->module_id, req->ue_identity.guami.mnc, UE->rnti);
|
||||
}
|
||||
} else {
|
||||
/* TODO */
|
||||
}
|
||||
|
||||
LOG_I(NGAP,
|
||||
"[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUAMI amf_set_id %u amf_region_id %u ue %x\n",
|
||||
ctxt_pP->module_id,
|
||||
|
||||
@@ -126,8 +126,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p, x2a
|
||||
gtpv1u_enb_create_tunnel_req_t create_tunnel_req;
|
||||
gtpv1u_enb_create_tunnel_resp_t create_tunnel_resp;
|
||||
protocol_ctxt_t ctxt={0};
|
||||
uint8_t kUPenc[NR_K_KEY_SIZE] = {0};
|
||||
uint8_t kUPint[NR_K_KEY_SIZE] = {0};
|
||||
nr_pdcp_entity_security_keys_and_algos_t security_parameters = {0};
|
||||
int i;
|
||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||
|
||||
@@ -218,8 +217,10 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p, x2a
|
||||
LOG_I(RRC, "selecting integrity algorithm %d\n", UE->integrity_algorithm);
|
||||
|
||||
/* derive UP security key */
|
||||
nr_derive_key(UP_ENC_ALG, UE->ciphering_algorithm, UE->kgnb, kUPenc);
|
||||
nr_derive_key(UP_INT_ALG, UE->integrity_algorithm, UE->kgnb, kUPint);
|
||||
security_parameters.ciphering_algorithm = UE->ciphering_algorithm;
|
||||
security_parameters.integrity_algorithm = UE->integrity_algorithm;
|
||||
nr_derive_key(UP_ENC_ALG, UE->ciphering_algorithm, UE->kgnb, security_parameters.ciphering_key);
|
||||
nr_derive_key(UP_INT_ALG, UE->integrity_algorithm, UE->kgnb, security_parameters.integrity_key);
|
||||
|
||||
e_NR_CipheringAlgorithm cipher_algo;
|
||||
switch (UE->ciphering_algorithm) {
|
||||
@@ -388,9 +389,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p, x2a
|
||||
nr_pdcp_add_drbs(ctxt.enb_flag,
|
||||
rrc_ue_id,
|
||||
ue_context_p->ue_context.rb_config->drb_ToAddModList,
|
||||
(ue_context_p->ue_context.integrity_algorithm << 4) | ue_context_p->ue_context.ciphering_algorithm,
|
||||
kUPenc,
|
||||
kUPint);
|
||||
&security_parameters);
|
||||
|
||||
ctxt.rntiMaybeUEid = du_ue_id;
|
||||
// assume only a single bearer
|
||||
|
||||
+53
-54
@@ -225,7 +225,7 @@ static void nr_rrc_ue_process_rrcReconfiguration(NR_UE_RRC_INST_t *rrc,
|
||||
nr_rrc_cellgroup_configuration(rrc, cellGroupConfig);
|
||||
|
||||
AssertFatal(!get_softmodem_params()->sa, "secondaryCellGroup only used in NSA for now\n");
|
||||
nr_rrc_mac_config_req_cg(0, 0, cellGroupConfig, rrc->UECap.UE_NR_Capability);
|
||||
nr_rrc_mac_config_req_cg(rrc->ue_id, 0, cellGroupConfig, rrc->UECap.UE_NR_Capability);
|
||||
asn1cFreeStruc(asn_DEF_NR_CellGroupConfig, cellGroupConfig);
|
||||
}
|
||||
if (ie->measConfig != NULL) {
|
||||
@@ -631,14 +631,14 @@ static void nr_rrc_handle_msg3_indication(NR_UE_RRC_INST_t *rrc, rnti_t rnti)
|
||||
nr_timer_start(&tac->T301);
|
||||
int srb_id = 1;
|
||||
// re-establish PDCP for SRB1
|
||||
nr_pdcp_reestablishment(rrc->ue_id, srb_id, true);
|
||||
// (and suspend integrity protection and ciphering for SRB1)
|
||||
nr_pdcp_entity_security_keys_and_algos_t null_security_parameters = {0};
|
||||
nr_pdcp_reestablishment(rrc->ue_id, srb_id, true, &null_security_parameters);
|
||||
// re-establish RLC for SRB1
|
||||
int lc_id = nr_rlc_get_lcid_from_rb(rrc->ue_id, true, 1);
|
||||
nr_rlc_reestablish_entity(rrc->ue_id, lc_id);
|
||||
// apply the specified configuration defined in 9.2.1 for SRB1
|
||||
nr_rlc_reconfigure_entity(rrc->ue_id, lc_id, NULL);
|
||||
// suspend integrity protection and ciphering for SRB1
|
||||
nr_pdcp_config_set_security(rrc->ue_id, srb_id, 0, NULL, NULL, NULL);
|
||||
// resume SRB1
|
||||
rrc->Srb[srb_id] = RB_ESTABLISHED;
|
||||
break;
|
||||
@@ -1047,21 +1047,19 @@ static void nr_rrc_ue_process_securityModeCommand(NR_UE_RRC_INST_t *ue_rrc,
|
||||
ue_rrc->integrityProtAlgorithm = *securityConfigSMC->securityAlgorithmConfig.integrityProtAlgorithm;
|
||||
}
|
||||
|
||||
uint8_t kRRCenc[NR_K_KEY_SIZE] = {0};
|
||||
uint8_t kUPenc[NR_K_KEY_SIZE] = {0};
|
||||
uint8_t kRRCint[NR_K_KEY_SIZE] = {0};
|
||||
nr_derive_key(UP_ENC_ALG, ue_rrc->cipheringAlgorithm, ue_rrc->kgnb, kUPenc);
|
||||
nr_derive_key(RRC_ENC_ALG, ue_rrc->cipheringAlgorithm, ue_rrc->kgnb, kRRCenc);
|
||||
nr_derive_key(RRC_INT_ALG, ue_rrc->integrityProtAlgorithm, ue_rrc->kgnb, kRRCint);
|
||||
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||
nr_derive_key(RRC_ENC_ALG, ue_rrc->cipheringAlgorithm, ue_rrc->kgnb, security_parameters.ciphering_key);
|
||||
nr_derive_key(RRC_INT_ALG, ue_rrc->integrityProtAlgorithm, ue_rrc->kgnb, security_parameters.integrity_key);
|
||||
|
||||
log_dump(NR_RRC, ue_rrc->kgnb, 32, LOG_DUMP_CHAR, "deriving kRRCenc, kRRCint and kUPenc from KgNB=");
|
||||
log_dump(NR_RRC, ue_rrc->kgnb, 32, LOG_DUMP_CHAR, "deriving kRRCenc, kRRCint from KgNB=");
|
||||
|
||||
/* for SecurityModeComplete, ciphering is not activated yet, only integrity */
|
||||
uint8_t security_mode = ue_rrc->integrityProtAlgorithm << 4;
|
||||
security_parameters.ciphering_algorithm = 0;
|
||||
security_parameters.integrity_algorithm = ue_rrc->integrityProtAlgorithm;
|
||||
// configure lower layers to apply SRB integrity protection and ciphering
|
||||
for (int i = 1; i < NR_NUM_SRB; i++) {
|
||||
if (ue_rrc->Srb[i] == RB_ESTABLISHED)
|
||||
nr_pdcp_config_set_security(ue_rrc->ue_id, i, security_mode, kRRCenc, kRRCint, kUPenc);
|
||||
nr_pdcp_config_set_security(ue_rrc->ue_id, i, true, &security_parameters);
|
||||
}
|
||||
|
||||
NR_UL_DCCH_Message_t ul_dcch_msg = {0};
|
||||
@@ -1094,10 +1092,10 @@ static void nr_rrc_ue_process_securityModeCommand(NR_UE_RRC_INST_t *ue_rrc,
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_UL_DCCH_Message, &ul_dcch_msg);
|
||||
|
||||
/* disable both ciphering and integrity */
|
||||
security_mode = 0;
|
||||
nr_pdcp_entity_security_keys_and_algos_t null_security_parameters = {0};
|
||||
for (int i = 1; i < NR_NUM_SRB; i++) {
|
||||
if (ue_rrc->Srb[i] == RB_ESTABLISHED)
|
||||
nr_pdcp_config_set_security(ue_rrc->ue_id, i, security_mode, NULL, NULL, NULL);
|
||||
nr_pdcp_config_set_security(ue_rrc->ue_id, i, true, &null_security_parameters);
|
||||
}
|
||||
|
||||
srb_id = 1; // SecurityModeFailure in SRB1
|
||||
@@ -1139,12 +1137,11 @@ static void nr_rrc_ue_process_securityModeCommand(NR_UE_RRC_INST_t *ue_rrc,
|
||||
nr_pdcp_data_req_srb(ue_rrc->ue_id, srb_id, 0, (enc_rval.encoded + 7) / 8, buffer, deliver_pdu_srb_rlc, NULL);
|
||||
|
||||
/* after encoding SecurityModeComplete we activate both ciphering and integrity */
|
||||
security_mode = ue_rrc->cipheringAlgorithm | (ue_rrc->integrityProtAlgorithm << 4);
|
||||
security_parameters.ciphering_algorithm = ue_rrc->cipheringAlgorithm;
|
||||
// configure lower layers to apply SRB integrity protection and ciphering
|
||||
for (int i = 1; i < NR_NUM_SRB; i++) {
|
||||
if (ue_rrc->Srb[i] == RB_ESTABLISHED)
|
||||
/* pass NULL to keep current keys */
|
||||
nr_pdcp_config_set_security(ue_rrc->ue_id, i, security_mode, NULL, NULL, NULL);
|
||||
nr_pdcp_config_set_security(ue_rrc->ue_id, i, true, &security_parameters);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1416,10 +1413,8 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
|
||||
ue_rrc->Srb[3] = RB_NOT_PRESENT;
|
||||
}
|
||||
|
||||
uint8_t kRRCenc[NR_K_KEY_SIZE] = {0};
|
||||
uint8_t kRRCint[NR_K_KEY_SIZE] = {0};
|
||||
uint8_t kUPenc[NR_K_KEY_SIZE] = {0};
|
||||
uint8_t kUPint[NR_K_KEY_SIZE] = {0};
|
||||
nr_pdcp_entity_security_keys_and_algos_t security_rrc_parameters = {0};
|
||||
nr_pdcp_entity_security_keys_and_algos_t security_up_parameters = {0};
|
||||
|
||||
if (ue_rrc->as_security_activated) {
|
||||
if (radioBearerConfig->securityConfig != NULL) {
|
||||
@@ -1435,10 +1430,14 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
|
||||
ue_rrc->integrityProtAlgorithm = *radioBearerConfig->securityConfig->securityAlgorithmConfig->integrityProtAlgorithm;
|
||||
}
|
||||
}
|
||||
nr_derive_key(RRC_ENC_ALG, ue_rrc->cipheringAlgorithm, ue_rrc->kgnb, kRRCenc);
|
||||
nr_derive_key(RRC_INT_ALG, ue_rrc->integrityProtAlgorithm, ue_rrc->kgnb, kRRCint);
|
||||
nr_derive_key(UP_ENC_ALG, ue_rrc->cipheringAlgorithm, ue_rrc->kgnb, kUPenc);
|
||||
nr_derive_key(UP_INT_ALG, ue_rrc->integrityProtAlgorithm, ue_rrc->kgnb, kUPint);
|
||||
security_rrc_parameters.ciphering_algorithm = ue_rrc->cipheringAlgorithm;
|
||||
security_rrc_parameters.integrity_algorithm = ue_rrc->integrityProtAlgorithm;
|
||||
nr_derive_key(RRC_ENC_ALG, ue_rrc->cipheringAlgorithm, ue_rrc->kgnb, security_rrc_parameters.ciphering_key);
|
||||
nr_derive_key(RRC_INT_ALG, ue_rrc->integrityProtAlgorithm, ue_rrc->kgnb, security_rrc_parameters.integrity_key);
|
||||
security_up_parameters.ciphering_algorithm = ue_rrc->cipheringAlgorithm;
|
||||
security_up_parameters.integrity_algorithm = ue_rrc->integrityProtAlgorithm;
|
||||
nr_derive_key(UP_ENC_ALG, ue_rrc->cipheringAlgorithm, ue_rrc->kgnb, security_up_parameters.ciphering_key);
|
||||
nr_derive_key(UP_INT_ALG, ue_rrc->integrityProtAlgorithm, ue_rrc->kgnb, security_up_parameters.integrity_key);
|
||||
}
|
||||
|
||||
if (radioBearerConfig->srb_ToAddModList != NULL) {
|
||||
@@ -1449,18 +1448,16 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
|
||||
add_srb(false,
|
||||
ue_rrc->ue_id,
|
||||
radioBearerConfig->srb_ToAddModList->list.array[cnt],
|
||||
ue_rrc->cipheringAlgorithm,
|
||||
ue_rrc->integrityProtAlgorithm,
|
||||
kRRCenc,
|
||||
kRRCint);
|
||||
&security_rrc_parameters);
|
||||
}
|
||||
else {
|
||||
AssertFatal(srb->discardOnPDCP == NULL, "discardOnPDCP not yet implemented\n");
|
||||
if (srb->reestablishPDCP) {
|
||||
ue_rrc->Srb[srb->srb_Identity] = RB_ESTABLISHED;
|
||||
nr_pdcp_reestablishment(ue_rrc->ue_id, srb->srb_Identity, true);
|
||||
// TODO configure the PDCP entity to apply the integrity protection algorithm
|
||||
// TODO configure the PDCP entity to apply the ciphering algorithm
|
||||
nr_pdcp_reestablishment(ue_rrc->ue_id,
|
||||
srb->srb_Identity,
|
||||
true,
|
||||
&security_rrc_parameters);
|
||||
}
|
||||
if (srb->pdcp_Config && srb->pdcp_Config->t_Reordering)
|
||||
nr_pdcp_reconfigure_srb(ue_rrc->ue_id, srb->srb_Identity, *srb->pdcp_Config->t_Reordering);
|
||||
@@ -1489,9 +1486,20 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
|
||||
if (get_DRB_status(ue_rrc, DRB_id) != RB_NOT_PRESENT) {
|
||||
if (drb->reestablishPDCP) {
|
||||
set_DRB_status(ue_rrc, DRB_id, RB_ESTABLISHED);
|
||||
nr_pdcp_reestablishment(ue_rrc->ue_id, DRB_id, false);
|
||||
// TODO configure the PDCP entity to apply the integrity protection algorithm
|
||||
// TODO configure the PDCP entity to apply the ciphering algorithm
|
||||
/* get integrity and cipehring settings from radioBearerConfig */
|
||||
bool has_integrity = drb->pdcp_Config != NULL
|
||||
&& drb->pdcp_Config->drb != NULL
|
||||
&& drb->pdcp_Config->drb->integrityProtection != NULL;
|
||||
bool has_ciphering = !(drb->pdcp_Config != NULL
|
||||
&& drb->pdcp_Config->ext1 != NULL
|
||||
&& drb->pdcp_Config->ext1->cipheringDisabled != NULL);
|
||||
security_up_parameters.ciphering_algorithm = has_ciphering ? ue_rrc->cipheringAlgorithm : 0;
|
||||
security_up_parameters.integrity_algorithm = has_integrity ? ue_rrc->integrityProtAlgorithm : 0;
|
||||
/* re-establish */
|
||||
nr_pdcp_reestablishment(ue_rrc->ue_id,
|
||||
DRB_id,
|
||||
false,
|
||||
&security_up_parameters);
|
||||
}
|
||||
AssertFatal(drb->recoverPDCP == NULL, "recoverPDCP not yet implemented\n");
|
||||
/* sdap-Config is included (SA mode) */
|
||||
@@ -1507,10 +1515,7 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
|
||||
add_drb(false,
|
||||
ue_rrc->ue_id,
|
||||
radioBearerConfig->drb_ToAddModList->list.array[cnt],
|
||||
ue_rrc->cipheringAlgorithm,
|
||||
ue_rrc->integrityProtAlgorithm,
|
||||
kUPenc,
|
||||
kUPint);
|
||||
&security_up_parameters);
|
||||
}
|
||||
}
|
||||
} // drb_ToAddModList //
|
||||
@@ -1550,17 +1555,13 @@ static void nr_rrc_ue_process_rrcReestablishment(NR_UE_RRC_INST_t *rrc,
|
||||
// update the K gNB key based on the current K gNB key or the NH, using the stored nextHopChainingCount value
|
||||
nr_derive_key_ng_ran_star(rrc->phyCellID, rrc->arfcn_ssb, rrc->kgnb, rrc->kgnb);
|
||||
|
||||
// derive the K RRCenc and K UPenc keys associated with the previously configured cipheringAlgorithm
|
||||
// derive the K RRCint and K UPint keys associated with the previously configured integrityProtAlgorithm
|
||||
uint8_t kRRCenc[16] = {0};
|
||||
uint8_t kRRCint[16] = {0};
|
||||
uint8_t kUPenc[16] = {0};
|
||||
uint8_t kUPint[16] = {0};
|
||||
|
||||
nr_derive_key(UP_ENC_ALG, rrc->cipheringAlgorithm, rrc->kgnb, kUPenc);
|
||||
nr_derive_key(UP_INT_ALG, rrc->integrityProtAlgorithm, rrc->kgnb, kUPint);
|
||||
nr_derive_key(RRC_ENC_ALG, rrc->cipheringAlgorithm, rrc->kgnb, kRRCenc);
|
||||
nr_derive_key(RRC_INT_ALG, rrc->integrityProtAlgorithm, rrc->kgnb, kRRCint);
|
||||
// derive the K RRCenc key associated with the previously configured cipheringAlgorithm
|
||||
// derive the K RRCint key associated with the previously configured integrityProtAlgorithm
|
||||
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||
security_parameters.ciphering_algorithm = rrc->cipheringAlgorithm;
|
||||
security_parameters.integrity_algorithm = rrc->integrityProtAlgorithm;
|
||||
nr_derive_key(RRC_ENC_ALG, rrc->cipheringAlgorithm, rrc->kgnb, security_parameters.ciphering_key);
|
||||
nr_derive_key(RRC_INT_ALG, rrc->integrityProtAlgorithm, rrc->kgnb, security_parameters.integrity_key);
|
||||
|
||||
// TODO request lower layers to verify the integrity protection of the RRCReestablishment message
|
||||
// TODO if the integrity protection check of the RRCReestablishment message fails -> go to IDLE
|
||||
@@ -1568,9 +1569,7 @@ static void nr_rrc_ue_process_rrcReestablishment(NR_UE_RRC_INST_t *rrc,
|
||||
// configure lower layers to resume integrity protection for SRB1
|
||||
// configure lower layers to resume ciphering for SRB1
|
||||
int srb_id = 1;
|
||||
int security_mode = (rrc->integrityProtAlgorithm << 4)
|
||||
| rrc->cipheringAlgorithm;
|
||||
nr_pdcp_config_set_security(rrc->ue_id, srb_id, security_mode, kRRCenc, kRRCint, kUPenc);
|
||||
nr_pdcp_config_set_security(rrc->ue_id, srb_id, true, &security_parameters);
|
||||
|
||||
// release the measurement gap configuration indicated by the measGapConfig, if configured
|
||||
rrcPerNB_t *rrcNB = rrc->perNB + gNB_index;
|
||||
|
||||
Reference in New Issue
Block a user