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>
|
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 5, 106 PRBs, 1 layer</desc>
|
||||||
<physim_run>nr_ulsim</physim_run>
|
<physim_run>nr_ulsim</physim_run>
|
||||||
<physim_time_threshold>100</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="010121">
|
<testCase id="010121">
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 15, 106 PRBs, 1 layer</desc>
|
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 15, 106 PRBs, 1 layer</desc>
|
||||||
<physim_run>nr_ulsim</physim_run>
|
<physim_run>nr_ulsim</physim_run>
|
||||||
<physim_time_threshold>150</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="010131">
|
<testCase id="010131">
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 25, 106 PRBs, 1 layer</desc>
|
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 25, 106 PRBs, 1 layer</desc>
|
||||||
<physim_run>nr_ulsim</physim_run>
|
<physim_run>nr_ulsim</physim_run>
|
||||||
<physim_time_threshold>250</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="010211">
|
<testCase id="010211">
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 1 layer</desc>
|
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 1 layer</desc>
|
||||||
<physim_run>nr_ulsim</physim_run>
|
<physim_run>nr_ulsim</physim_run>
|
||||||
<physim_time_threshold>150</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="010221">
|
<testCase id="010221">
|
||||||
@@ -108,7 +108,7 @@
|
|||||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 1 layer</desc>
|
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 1 layer</desc>
|
||||||
<physim_run>nr_ulsim</physim_run>
|
<physim_run>nr_ulsim</physim_run>
|
||||||
<physim_time_threshold>350</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="010231">
|
<testCase id="010231">
|
||||||
@@ -124,7 +124,7 @@
|
|||||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 1 layer</desc>
|
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 1 layer</desc>
|
||||||
<physim_run>nr_ulsim</physim_run>
|
<physim_run>nr_ulsim</physim_run>
|
||||||
<physim_time_threshold>550</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="010311">
|
<testCase id="010311">
|
||||||
@@ -140,7 +140,7 @@
|
|||||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 2 layers</desc>
|
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 2 layers</desc>
|
||||||
<physim_run>nr_ulsim</physim_run>
|
<physim_run>nr_ulsim</physim_run>
|
||||||
<physim_time_threshold>250</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="010321">
|
<testCase id="010321">
|
||||||
@@ -156,7 +156,7 @@
|
|||||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 2 layers</desc>
|
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 2 layers</desc>
|
||||||
<physim_run>nr_ulsim</physim_run>
|
<physim_run>nr_ulsim</physim_run>
|
||||||
<physim_time_threshold>650</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="010331">
|
<testCase id="010331">
|
||||||
@@ -172,7 +172,7 @@
|
|||||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 2 layers</desc>
|
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 2 layers</desc>
|
||||||
<physim_run>nr_ulsim</physim_run>
|
<physim_run>nr_ulsim</physim_run>
|
||||||
<physim_time_threshold>1100</physim_time_threshold>
|
<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>
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 106 PRBs, 1 layer</desc>
|
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 106 PRBs, 1 layer</desc>
|
||||||
<physim_run>nr_dlsim</physim_run>
|
<physim_run>nr_dlsim</physim_run>
|
||||||
<physim_time_threshold>100</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="000121">
|
<testCase id="000121">
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 15, 106 PRBs, 1 layer</desc>
|
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 15, 106 PRBs, 1 layer</desc>
|
||||||
<physim_run>nr_dlsim</physim_run>
|
<physim_run>nr_dlsim</physim_run>
|
||||||
<physim_time_threshold>100</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="000131">
|
<testCase id="000131">
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 25, 106 PRBs, 1 layer</desc>
|
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 25, 106 PRBs, 1 layer</desc>
|
||||||
<physim_run>nr_dlsim</physim_run>
|
<physim_run>nr_dlsim</physim_run>
|
||||||
<physim_time_threshold>200</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="000211">
|
<testCase id="000211">
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 1 layer</desc>
|
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 1 layer</desc>
|
||||||
<physim_run>nr_dlsim</physim_run>
|
<physim_run>nr_dlsim</physim_run>
|
||||||
<physim_time_threshold>150</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="000221">
|
<testCase id="000221">
|
||||||
@@ -108,7 +108,7 @@
|
|||||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 1 layer</desc>
|
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 1 layer</desc>
|
||||||
<physim_run>nr_dlsim</physim_run>
|
<physim_run>nr_dlsim</physim_run>
|
||||||
<physim_time_threshold>250</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="000231">
|
<testCase id="000231">
|
||||||
@@ -124,7 +124,7 @@
|
|||||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 1 layer</desc>
|
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 1 layer</desc>
|
||||||
<physim_run>nr_dlsim</physim_run>
|
<physim_run>nr_dlsim</physim_run>
|
||||||
<physim_time_threshold>400</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="000311">
|
<testCase id="000311">
|
||||||
@@ -140,7 +140,7 @@
|
|||||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 2 layers</desc>
|
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 2 layers</desc>
|
||||||
<physim_run>nr_dlsim</physim_run>
|
<physim_run>nr_dlsim</physim_run>
|
||||||
<physim_time_threshold>200</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="000321">
|
<testCase id="000321">
|
||||||
@@ -156,7 +156,7 @@
|
|||||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 2 layers</desc>
|
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 2 layers</desc>
|
||||||
<physim_run>nr_dlsim</physim_run>
|
<physim_run>nr_dlsim</physim_run>
|
||||||
<physim_time_threshold>500</physim_time_threshold>
|
<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>
|
||||||
|
|
||||||
<testCase id="000331">
|
<testCase id="000331">
|
||||||
@@ -172,7 +172,7 @@
|
|||||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 2 layers</desc>
|
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 2 layers</desc>
|
||||||
<physim_run>nr_dlsim</physim_run>
|
<physim_run>nr_dlsim</physim_run>
|
||||||
<physim_time_threshold>800</physim_time_threshold>
|
<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>
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ services:
|
|||||||
--log_config.global_log_options level,nocolor,time
|
--log_config.global_log_options level,nocolor,time
|
||||||
--rfsimulator.options chanmod
|
--rfsimulator.options chanmod
|
||||||
--telnetsrv --telnetsrv.listenaddr 192.168.71.171
|
--telnetsrv --telnetsrv.listenaddr 192.168.71.171
|
||||||
ASAN_OPTIONS: detect_leaks=0
|
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-cu
|
- oai-cu
|
||||||
networks:
|
networks:
|
||||||
@@ -143,6 +143,7 @@ services:
|
|||||||
--rfsimulator.serveraddr 192.168.71.171
|
--rfsimulator.serveraddr 192.168.71.171
|
||||||
--rfsimulator.options chanmod
|
--rfsimulator.options chanmod
|
||||||
--telnetsrv --telnetsrv.shrmod ciUE --telnetsrv.listenaddr 192.168.71.181 --telnetsrv.listenport 8091
|
--telnetsrv --telnetsrv.shrmod ciUE --telnetsrv.listenaddr 192.168.71.181 --telnetsrv.listenport 8091
|
||||||
|
ASAN_OPTIONS: detect_odr_violation=0
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-du
|
- oai-du
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -535,3 +535,40 @@ snssais:
|
|||||||
```
|
```
|
||||||
|
|
||||||
The `ST` and `SD` values shall also match.
|
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 \
|
||||||
gcc-c++ \
|
gcc-c++ \
|
||||||
git \
|
git \
|
||||||
atlas-devel \
|
|
||||||
pkgconfig \
|
pkgconfig \
|
||||||
libconfig-devel \
|
libconfig-devel \
|
||||||
libffi-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 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);
|
int32_t delta_duplex = get_delta_duplex(current_band, scs_index);
|
||||||
|
frame_type_t current_type = delta_duplex == 0 ? TDD : FDD;
|
||||||
if (delta_duplex == 0)
|
LOG_D(NR_MAC, "NR band %d, duplex mode %s, duplex spacing = %d KHz\n", current_band, duplex_mode[current_type], delta_duplex);
|
||||||
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);
|
|
||||||
|
|
||||||
return current_type;
|
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);
|
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;
|
return delta_duplex;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@
|
|||||||
if (eL == TARGET->list.array[iJ]->FIELD) \
|
if (eL == TARGET->list.array[iJ]->FIELD) \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
if (iJ == TARGET->list.count) \
|
if (iJ < TARGET->list.count) \
|
||||||
asn_sequence_del(&TARGET->list, iJ, 1); \
|
asn_sequence_del(&TARGET->list, iJ, 1); \
|
||||||
else \
|
else \
|
||||||
LOG_E(NR_MAC, "Element not present in the list, impossible to release\n"); \
|
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
|
export PKG_CONFIG_PATH=/opt/dpdk-t2/lib64/pkgconfig/:$PKG_CONFIG_PATH
|
||||||
```
|
```
|
||||||
## T2 card DPDK initialization
|
## Setup of T2-related DPDK EAL parameters
|
||||||
Following lines in `openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c` file has to be
|
To configure T2-related DPDK Environment Abstraction Layer (EAL) parameters, you can set the following parameters via the command line:
|
||||||
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.
|
- `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.
|
||||||
char *dpdk_dev = "41:00.0"; //PCI address of the card
|
- `ldpc_offload.dpdk_prefix` - DPDK shared data file prefix, by default set to *b6*
|
||||||
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.
|
|
||||||
|
|
||||||
# OAI Build
|
# OAI Build
|
||||||
OTA deployment is precisely described in the following tutorial:
|
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
|
cd ~/openairinterface5g
|
||||||
source oaienv
|
source oaienv
|
||||||
cd cmake_targets/ran_build/build
|
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
|
## 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:
|
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
|
cd ~/openairinterface5g
|
||||||
source oaienv
|
source oaienv
|
||||||
cd cmake_targets/ran_build/build
|
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
|
# OTA test
|
||||||
@@ -137,7 +132,7 @@ Offload of the channel encoding and decoding to the AMD Xilinx T2 card is enable
|
|||||||
cd ~/openairinterface5g
|
cd ~/openairinterface5g
|
||||||
source oaienv
|
source oaienv
|
||||||
cd cmake_targets/ran_build/build
|
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
|
# Limitations
|
||||||
|
|||||||
@@ -211,13 +211,13 @@ CREATE TABLE `SessionManagementSubscriptionData` (
|
|||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
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
|
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
|
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
|
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 \
|
tzdata \
|
||||||
xxd \
|
xxd \
|
||||||
# ARM64 packages
|
# ARM64 packages
|
||||||
libatlas-base-dev:arm64 \
|
|
||||||
libblas-dev:arm64 \
|
libblas-dev:arm64 \
|
||||||
liblapack-dev:arm64 \
|
liblapack-dev:arm64 \
|
||||||
liblapacke-dev:arm64 \
|
liblapacke-dev:arm64 \
|
||||||
|
|||||||
@@ -39,4 +39,8 @@ RUN /bin/sh oaienv && \
|
|||||||
--eNB --gNB --RU --UE --nrUE \
|
--eNB --gNB --RU --UE --nrUE \
|
||||||
--build-lib "telnetsrv enbscope uescope nrscope" \
|
--build-lib "telnetsrv enbscope uescope nrscope" \
|
||||||
-w USRP -t Ethernet \
|
-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 \
|
--noavx512 \
|
||||||
--cmake-opt -DCMAKE_C_FLAGS="-Werror" --cmake-opt -DCMAKE_CXX_FLAGS="-Werror" $BUILD_OPTION && \
|
--cmake-opt -DCMAKE_C_FLAGS="-Werror" --cmake-opt -DCMAKE_CXX_FLAGS="-Werror" $BUILD_OPTION && \
|
||||||
# Mainly to see if the sanitize option was perfectly executed
|
# 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 \
|
lksctp-tools \
|
||||||
tzdata \
|
tzdata \
|
||||||
procps-ng \
|
procps-ng \
|
||||||
atlas \
|
|
||||||
gdb \
|
gdb \
|
||||||
|
libusbx \
|
||||||
python3 \
|
python3 \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
net-tools \
|
net-tools \
|
||||||
@@ -71,10 +71,6 @@ COPY --from=enb-build \
|
|||||||
|
|
||||||
COPY --from=enb-base \
|
COPY --from=enb-base \
|
||||||
/lib64/libconfig.so.11 \
|
/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_chrono.so.1.75.0 \
|
||||||
/lib64/libboost_date_time.so.1.75.0 \
|
/lib64/libboost_date_time.so.1.75.0 \
|
||||||
/lib64/libboost_filesystem.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" && \
|
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" && \
|
/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
|
WORKDIR /opt/oai-enb
|
||||||
|
|
||||||
|
|||||||
+14
-15
@@ -40,8 +40,8 @@ RUN dnf update -y && \
|
|||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
tzdata \
|
tzdata \
|
||||||
procps-ng \
|
procps-ng \
|
||||||
atlas \
|
|
||||||
gdb \
|
gdb \
|
||||||
|
libusbx \
|
||||||
python3 \
|
python3 \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
net-tools \
|
net-tools \
|
||||||
@@ -72,10 +72,6 @@ COPY --from=enb-build \
|
|||||||
|
|
||||||
COPY --from=enb-base \
|
COPY --from=enb-base \
|
||||||
/lib64/libconfig.so.11 \
|
/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_chrono.so.1.75.0 \
|
||||||
/lib64/libboost_date_time.so.1.75.0 \
|
/lib64/libboost_date_time.so.1.75.0 \
|
||||||
/lib64/libboost_filesystem.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" && \
|
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" && \
|
/bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so /usr/local/lib/liboai_transpro.so" && \
|
||||||
ldconfig && \
|
ldconfig && \
|
||||||
echo "ldd on lte-softmodem" && ldd /opt/oai-enb/bin/lte-softmodem && \
|
echo "---- ldd on executable lte-softmodem ----" && \
|
||||||
echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
ldd /opt/oai-enb/bin/lte-softmodem && \
|
||||||
echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
|
echo "---- ldd on shared libraries ----" && \
|
||||||
echo "ldd on liboai_usrpdevif.so" && ldd /usr/local/lib/liboai_usrpdevif.so && \
|
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||||
echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
|
/usr/local/lib/librfsimulator.so \
|
||||||
echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
|
/usr/local/lib/liboai_usrpdevif.so \
|
||||||
echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
|
/usr/local/lib/libcoding.so \
|
||||||
echo "ldd on liboai_iqplayer.so" && ldd /usr/local/lib/liboai_iqplayer.so && \
|
/usr/local/lib/libparams_libconfig.so \
|
||||||
echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so && \
|
/usr/local/lib/libdfts.so \
|
||||||
echo "ldd on libtelnetsrv_enb.so" && ldd /usr/local/lib/libtelnetsrv_enb.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
|
WORKDIR /opt/oai-enb
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,6 @@ RUN apt-get update && \
|
|||||||
libboost-program-options1.74.0 \
|
libboost-program-options1.74.0 \
|
||||||
tzdata \
|
tzdata \
|
||||||
libblas3 \
|
libblas3 \
|
||||||
libatlas3-base \
|
|
||||||
libconfig9 \
|
libconfig9 \
|
||||||
openssl \
|
openssl \
|
||||||
net-tools \
|
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" && \
|
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" && \
|
/bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so /usr/local/lib/liboai_transpro.so" && \
|
||||||
ldconfig && \
|
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
|
WORKDIR /opt/oai-enb
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ RUN apt-get update && \
|
|||||||
procps \
|
procps \
|
||||||
libsctp1 \
|
libsctp1 \
|
||||||
tzdata \
|
tzdata \
|
||||||
libatlas3-base \
|
libblas3 \
|
||||||
libconfig9 \
|
libconfig9 \
|
||||||
openssl \
|
openssl \
|
||||||
net-tools \
|
net-tools \
|
||||||
@@ -95,6 +95,14 @@ COPY --from=ran-build \
|
|||||||
/usr/local/lib/libnvipc.so \
|
/usr/local/lib/libnvipc.so \
|
||||||
/usr/local/lib/
|
/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
|
WORKDIR /opt/oai-gnb
|
||||||
COPY --from=ran-build /tini /tini
|
COPY --from=ran-build /tini /tini
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ RUN apt-get update && \
|
|||||||
procps \
|
procps \
|
||||||
libsctp1 \
|
libsctp1 \
|
||||||
tzdata \
|
tzdata \
|
||||||
libatlas3-base \
|
libblas3 \
|
||||||
libconfig9 \
|
libconfig9 \
|
||||||
openssl \
|
openssl \
|
||||||
net-tools \
|
net-tools \
|
||||||
@@ -77,6 +77,7 @@ RUN apt-get update && \
|
|||||||
iproute2 \
|
iproute2 \
|
||||||
iputils-ping \
|
iputils-ping \
|
||||||
gdb \
|
gdb \
|
||||||
|
moreutils \
|
||||||
libusb-1.0-0 && \
|
libusb-1.0-0 && \
|
||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
@@ -100,6 +101,14 @@ COPY --from=ran-build \
|
|||||||
/usr/local/lib/libnvipc.so \
|
/usr/local/lib/libnvipc.so \
|
||||||
/usr/local/lib/
|
/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
|
WORKDIR /opt/oai-gnb
|
||||||
COPY --from=ran-build /tini /tini
|
COPY --from=ran-build /tini /tini
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ RUN dnf update -y && \
|
|||||||
procps-ng \
|
procps-ng \
|
||||||
libXpm \
|
libXpm \
|
||||||
libX11 \
|
libX11 \
|
||||||
atlas \
|
|
||||||
gdb \
|
gdb \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
tzdata \
|
tzdata \
|
||||||
@@ -75,15 +74,22 @@ COPY --from=gnb-build \
|
|||||||
COPY --from=gnb-base \
|
COPY --from=gnb-base \
|
||||||
/lib64/libconfig.so.11 \
|
/lib64/libconfig.so.11 \
|
||||||
/lib64/libforms.so.2 \
|
/lib64/libforms.so.2 \
|
||||||
/lib64/libblas.so.3 \
|
|
||||||
/lib64/libcblas.so.3 \
|
|
||||||
/lib64/liblapack.so.3 \
|
|
||||||
/lib64/liblapacke.so.3 \
|
|
||||||
/lib64/
|
/lib64/
|
||||||
|
|
||||||
RUN ln -s /usr/local/lib/libaw2sori_transpro.so /usr/local/lib/libthirdparty_transpro.so && \
|
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 && \
|
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
|
WORKDIR /opt/oai-gnb-aw2s
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ RUN dnf update -y && \
|
|||||||
procps-ng \
|
procps-ng \
|
||||||
libXpm \
|
libXpm \
|
||||||
libX11 \
|
libX11 \
|
||||||
atlas \
|
|
||||||
gdb \
|
gdb \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
tzdata \
|
tzdata \
|
||||||
@@ -76,23 +75,22 @@ COPY --from=gnb-build \
|
|||||||
COPY --from=gnb-base \
|
COPY --from=gnb-base \
|
||||||
/lib64/libconfig.so.11 \
|
/lib64/libconfig.so.11 \
|
||||||
/lib64/libforms.so.2 \
|
/lib64/libforms.so.2 \
|
||||||
/lib64/libblas.so.3 \
|
|
||||||
/lib64/libcblas.so.3 \
|
|
||||||
/lib64/liblapack.so.3 \
|
|
||||||
/lib64/liblapacke.so.3 \
|
|
||||||
/lib64/
|
/lib64/
|
||||||
|
|
||||||
RUN ln -s /usr/local/lib/libaw2sori_transpro.so /usr/local/lib/libthirdparty_transpro.so && \
|
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 && \
|
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 executable nr-softmodem ----" && \
|
||||||
echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
ldd /opt/oai-gnb-aw2s/bin/nr-softmodem && \
|
||||||
echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
|
echo "---- ldd on shared libraries ----" && \
|
||||||
echo "ldd on libthirdparty_transpro.so" && ldd /usr/local/lib/libthirdparty_transpro.so && \
|
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||||
echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
|
/usr/local/lib/librfsimulator.so \
|
||||||
echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
|
/usr/local/lib/libaw2sori_transpro.so \
|
||||||
echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
|
/usr/local/lib/libcoding.so \
|
||||||
echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.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
|
WORKDIR /opt/oai-gnb-aw2s
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ RUN apt-get update && \
|
|||||||
libsctp1 \
|
libsctp1 \
|
||||||
tzdata \
|
tzdata \
|
||||||
libblas3 \
|
libblas3 \
|
||||||
libatlas3-base \
|
libc6 \
|
||||||
libconfig9 \
|
libconfig9 \
|
||||||
gdb \
|
gdb \
|
||||||
openssl \
|
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" && \
|
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" && \
|
/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
|
WORKDIR /opt/oai-gnb-aw2s
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ RUN dnf update -y && \
|
|||||||
procps-ng \
|
procps-ng \
|
||||||
libXpm \
|
libXpm \
|
||||||
libX11 \
|
libX11 \
|
||||||
atlas \
|
libusbx \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
tzdata \
|
tzdata \
|
||||||
gdb \
|
gdb \
|
||||||
@@ -72,10 +72,6 @@ COPY --from=gnb-build \
|
|||||||
COPY --from=gnb-base \
|
COPY --from=gnb-base \
|
||||||
/lib64/libconfig.so.11 \
|
/lib64/libconfig.so.11 \
|
||||||
/lib64/libforms.so.2 \
|
/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_chrono.so.1.75.0 \
|
||||||
/lib64/libboost_date_time.so.1.75.0 \
|
/lib64/libboost_date_time.so.1.75.0 \
|
||||||
/lib64/libboost_filesystem.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/ .
|
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" && \
|
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
|
WORKDIR /opt/oai-gnb
|
||||||
#EXPOSE 2152/udp # S1U, GTP/UDP
|
#EXPOSE 2152/udp # S1U, GTP/UDP
|
||||||
|
|||||||
+14
-14
@@ -40,7 +40,7 @@ RUN dnf update -y && \
|
|||||||
procps-ng \
|
procps-ng \
|
||||||
libXpm \
|
libXpm \
|
||||||
libX11 \
|
libX11 \
|
||||||
atlas \
|
libusbx \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
tzdata \
|
tzdata \
|
||||||
gdb \
|
gdb \
|
||||||
@@ -73,10 +73,6 @@ COPY --from=gnb-build \
|
|||||||
COPY --from=gnb-base \
|
COPY --from=gnb-base \
|
||||||
/lib64/libconfig.so.11 \
|
/lib64/libconfig.so.11 \
|
||||||
/lib64/libforms.so.2 \
|
/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_chrono.so.1.75.0 \
|
||||||
/lib64/libboost_date_time.so.1.75.0 \
|
/lib64/libboost_date_time.so.1.75.0 \
|
||||||
/lib64/libboost_filesystem.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" && \
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||||
ldconfig && \
|
ldconfig && \
|
||||||
echo "ldd on nr-softmodem" && ldd /opt/oai-gnb/bin/nr-softmodem && \
|
echo "---- ldd on executable nr-softmodem ----" && \
|
||||||
echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
ldd /opt/oai-gnb/bin/nr-softmodem && \
|
||||||
echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
|
echo "---- ldd on shared libraries ----" && \
|
||||||
echo "ldd on liboai_usrpdevif.so" && ldd /usr/local/lib/liboai_usrpdevif.so && \
|
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||||
echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
|
/usr/local/lib/librfsimulator.so \
|
||||||
echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
|
/usr/local/lib/liboai_usrpdevif.so \
|
||||||
echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
|
/usr/local/lib/libcoding.so \
|
||||||
echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so && \
|
/usr/local/lib/libparams_libconfig.so \
|
||||||
echo "ldd on libtelnetsrv_ci.so" && ldd /usr/local/lib/libtelnetsrv_ci.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
|
WORKDIR /opt/oai-gnb
|
||||||
#EXPOSE 2152/udp # S1U, GTP/UDP
|
#EXPOSE 2152/udp # S1U, GTP/UDP
|
||||||
|
|||||||
@@ -52,7 +52,6 @@ RUN apt-get update && \
|
|||||||
libboost-program-options1.74.0 \
|
libboost-program-options1.74.0 \
|
||||||
tzdata \
|
tzdata \
|
||||||
libblas3 \
|
libblas3 \
|
||||||
libatlas3-base \
|
|
||||||
libconfig9 \
|
libconfig9 \
|
||||||
openssl \
|
openssl \
|
||||||
net-tools \
|
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" && \
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||||
ldconfig && \
|
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
|
WORKDIR /opt/oai-gnb
|
||||||
#EXPOSE 2152/udp # S1U, GTP/UDP
|
#EXPOSE 2152/udp # S1U, GTP/UDP
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ RUN dnf update -y && \
|
|||||||
dnf install -y \
|
dnf install -y \
|
||||||
tzdata \
|
tzdata \
|
||||||
procps-ng \
|
procps-ng \
|
||||||
atlas \
|
libusbx \
|
||||||
gdb \
|
gdb \
|
||||||
python3 \
|
python3 \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
@@ -65,10 +65,6 @@ COPY --from=ru-build \
|
|||||||
|
|
||||||
COPY --from=ru-base \
|
COPY --from=ru-base \
|
||||||
/lib64/libconfig.so.11 \
|
/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_chrono.so.1.75.0 \
|
||||||
/lib64/libboost_date_time.so.1.75.0 \
|
/lib64/libboost_date_time.so.1.75.0 \
|
||||||
/lib64/libboost_filesystem.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/ .
|
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" && \
|
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
|
WORKDIR /opt/oai-lte-ru
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ RUN apt-get update && \
|
|||||||
procps \
|
procps \
|
||||||
software-properties-common \
|
software-properties-common \
|
||||||
libblas3 \
|
libblas3 \
|
||||||
libatlas3-base \
|
|
||||||
libconfig9 \
|
libconfig9 \
|
||||||
net-tools \
|
net-tools \
|
||||||
gdb \
|
gdb \
|
||||||
@@ -83,7 +82,16 @@ COPY --from=ru-base \
|
|||||||
/usr/lib/x86_64-linux-gnu/
|
/usr/lib/x86_64-linux-gnu/
|
||||||
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
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
|
WORKDIR /opt/oai-lte-ru
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ RUN dnf update -y && \
|
|||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
procps-ng \
|
procps-ng \
|
||||||
tzdata \
|
tzdata \
|
||||||
atlas \
|
libusbx \
|
||||||
|
libgfortran \
|
||||||
gdb \
|
gdb \
|
||||||
python3 \
|
python3 \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
@@ -101,7 +102,18 @@ WORKDIR /usr/local/share/uhd/rfnoc
|
|||||||
COPY --from=lte-ue-base /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" && \
|
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
|
WORKDIR /opt/oai-lte-ue
|
||||||
COPY --from=lte-ue-base /tini /tini
|
COPY --from=lte-ue-base /tini /tini
|
||||||
|
|||||||
@@ -40,7 +40,8 @@ RUN dnf update -y && \
|
|||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
procps-ng \
|
procps-ng \
|
||||||
tzdata \
|
tzdata \
|
||||||
atlas \
|
libusbx \
|
||||||
|
libgfortran \
|
||||||
gdb \
|
gdb \
|
||||||
python3 \
|
python3 \
|
||||||
python3-pip \
|
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" && \
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||||
ldconfig && \
|
ldconfig && \
|
||||||
echo "ldd on lte-uesoftmodem" && ldd /opt/oai-lte-ue/bin/lte-uesoftmodem && \
|
echo "---- ldd on executable lte-uesoftmodem ----" && \
|
||||||
echo "ldd on conf2uedata" && ldd /opt/oai-lte-ue/bin/conf2uedata && \
|
ldd /opt/oai-lte-ue/bin/lte-uesoftmodem && \
|
||||||
echo "ldd on nvram" && ldd /opt/oai-lte-ue/bin/nvram && \
|
echo "---- ldd on shared libraries ----" && \
|
||||||
echo "ldd on usim" && ldd /opt/oai-lte-ue/bin/usim && \
|
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||||
echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
/usr/local/lib/librfsimulator.so \
|
||||||
echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
|
/usr/local/lib/liboai_usrpdevif.so \
|
||||||
echo "ldd on liboai_usrpdevif.so" && ldd /usr/local/lib/liboai_usrpdevif.so && \
|
/usr/local/lib/libcoding.so \
|
||||||
echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
|
/usr/local/lib/libparams_libconfig.so \
|
||||||
echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
|
/usr/local/lib/libdfts.so \
|
||||||
echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
|
/usr/local/lib/libtelnetsrv.so \
|
||||||
echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so
|
/usr/local/lib64/libuhd.so.4.4.0
|
||||||
|
|
||||||
WORKDIR /opt/oai-lte-ue
|
WORKDIR /opt/oai-lte-ue
|
||||||
COPY --from=lte-ue-base /tini /tini
|
COPY --from=lte-ue-base /tini /tini
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ RUN apt-get update && \
|
|||||||
libboost-program-options1.74.0 \
|
libboost-program-options1.74.0 \
|
||||||
tzdata \
|
tzdata \
|
||||||
liblapacke \
|
liblapacke \
|
||||||
libatlas3-base \
|
libblas3 \
|
||||||
libconfig9 \
|
libconfig9 \
|
||||||
openssl \
|
openssl \
|
||||||
net-tools \
|
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" && \
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||||
ldconfig && \
|
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
|
WORKDIR /opt/oai-lte-ue
|
||||||
COPY --from=lte-ue-base /tini /tini
|
COPY --from=lte-ue-base /tini /tini
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ RUN yum repolist --disablerepo=* && \
|
|||||||
procps-ng \
|
procps-ng \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
tzdata \
|
tzdata \
|
||||||
atlas \
|
|
||||||
net-tools \
|
net-tools \
|
||||||
iputils && \
|
iputils && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
@@ -60,10 +59,6 @@ COPY --from=gnb-build \
|
|||||||
|
|
||||||
COPY --from=gnb-base \
|
COPY --from=gnb-base \
|
||||||
/lib64/libconfig.so.11 \
|
/lib64/libconfig.so.11 \
|
||||||
/lib64/libblas.so.3 \
|
|
||||||
/lib64/libcblas.so.3 \
|
|
||||||
/lib64/liblapack.so.3 \
|
|
||||||
/lib64/liblapacke.so.3 \
|
|
||||||
/lib64/
|
/lib64/
|
||||||
|
|
||||||
RUN ldconfig && \
|
RUN ldconfig && \
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ RUN yum repolist --disablerepo=* && \
|
|||||||
procps-ng \
|
procps-ng \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
tzdata \
|
tzdata \
|
||||||
atlas \
|
|
||||||
net-tools \
|
net-tools \
|
||||||
iputils && \
|
iputils && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
@@ -61,10 +60,6 @@ COPY --from=gnb-build \
|
|||||||
|
|
||||||
COPY --from=gnb-base \
|
COPY --from=gnb-base \
|
||||||
/lib64/libconfig.so.11 \
|
/lib64/libconfig.so.11 \
|
||||||
/lib64/libblas.so.3 \
|
|
||||||
/lib64/libcblas.so.3 \
|
|
||||||
/lib64/liblapack.so.3 \
|
|
||||||
/lib64/liblapacke.so.3 \
|
|
||||||
/lib64/
|
/lib64/
|
||||||
|
|
||||||
RUN ldconfig && \
|
RUN ldconfig && \
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ RUN dnf update -y && \
|
|||||||
net-tools \
|
net-tools \
|
||||||
iputils \
|
iputils \
|
||||||
iproute \
|
iproute \
|
||||||
atlas \
|
libusbx \
|
||||||
gdb \
|
gdb \
|
||||||
python3 \
|
python3 \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
@@ -74,10 +74,6 @@ COPY --from=nr-ue-build \
|
|||||||
|
|
||||||
COPY --from=nr-ue-base \
|
COPY --from=nr-ue-base \
|
||||||
/lib64/libconfig.so.11 \
|
/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/libforms.so.2 \
|
||||||
/lib64/libboost_chrono.so.1.75.0 \
|
/lib64/libboost_chrono.so.1.75.0 \
|
||||||
/lib64/libboost_date_time.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/ .
|
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" && \
|
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
|
WORKDIR /opt/oai-nr-ue
|
||||||
COPY --from=nr-ue-base /tini /tini
|
COPY --from=nr-ue-base /tini /tini
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ RUN dnf update -y && \
|
|||||||
net-tools \
|
net-tools \
|
||||||
iputils \
|
iputils \
|
||||||
iproute \
|
iproute \
|
||||||
atlas \
|
libusbx \
|
||||||
gdb \
|
gdb \
|
||||||
python3 \
|
python3 \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
@@ -75,10 +75,6 @@ COPY --from=nr-ue-build \
|
|||||||
|
|
||||||
COPY --from=nr-ue-base \
|
COPY --from=nr-ue-base \
|
||||||
/lib64/libconfig.so.11 \
|
/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/libforms.so.2 \
|
||||||
/lib64/libboost_chrono.so.1.75.0 \
|
/lib64/libboost_chrono.so.1.75.0 \
|
||||||
/lib64/libboost_date_time.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" && \
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||||
ldconfig && \
|
ldconfig && \
|
||||||
echo "ldd on nr-uesoftmodem" && ldd /opt/oai-nr-ue/bin/nr-uesoftmodem && \
|
echo "---- ldd on executable nr-uesoftmodem ----" && \
|
||||||
echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
ldd /opt/oai-nr-ue/bin/nr-uesoftmodem && \
|
||||||
echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
|
echo "---- ldd on shared libraries ----" && \
|
||||||
echo "ldd on liboai_usrpdevif.so" && ldd /usr/local/lib/liboai_usrpdevif.so && \
|
ldd /usr/local/lib/liboai_eth_transpro.so \
|
||||||
echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
|
/usr/local/lib/librfsimulator.so \
|
||||||
echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
|
/usr/local/lib/liboai_usrpdevif.so \
|
||||||
echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
|
/usr/local/lib/libcoding.so \
|
||||||
echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so && \
|
/usr/local/lib/libparams_libconfig.so \
|
||||||
echo "ldd on libtelnetsrv_5Gue.so" && ldd /usr/local/lib/libtelnetsrv_5Gue.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
|
WORKDIR /opt/oai-nr-ue
|
||||||
COPY --from=nr-ue-base /tini /tini
|
COPY --from=nr-ue-base /tini /tini
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ RUN apt-get update && \
|
|||||||
libboost-program-options1.74.0 \
|
libboost-program-options1.74.0 \
|
||||||
tzdata \
|
tzdata \
|
||||||
liblapacke \
|
liblapacke \
|
||||||
libatlas3-base \
|
libblas3 \
|
||||||
libconfig9 \
|
libconfig9 \
|
||||||
openssl \
|
openssl \
|
||||||
net-tools \
|
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" && \
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||||
ldconfig && \
|
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
|
WORKDIR /opt/oai-nr-ue
|
||||||
COPY --from=nr-ue-base /tini /tini
|
COPY --from=nr-ue-base /tini /tini
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ RUN dnf update -y && \
|
|||||||
dnf install -y \
|
dnf install -y \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
tzdata \
|
tzdata \
|
||||||
atlas \
|
libgfortran \
|
||||||
hostname \
|
hostname \
|
||||||
sudo \
|
sudo \
|
||||||
procps-ng \
|
procps-ng \
|
||||||
@@ -94,7 +94,25 @@ COPY --from=phy-sim-build \
|
|||||||
/oai-ran/cmake_targets/ran_build/build/libldpc*.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc*.so \
|
||||||
/usr/local/lib/
|
/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
|
# Copy some executables
|
||||||
WORKDIR /usr/bin/
|
WORKDIR /usr/bin/
|
||||||
|
|||||||
+14
-19
@@ -146,7 +146,7 @@ void init_nr_ue_vars(PHY_VARS_NR_UE *ue,
|
|||||||
int nb_connected_gNB = 1;
|
int nb_connected_gNB = 1;
|
||||||
|
|
||||||
ue->Mod_id = UE_id;
|
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->dci_thres = 0;
|
||||||
ue->target_Nid_cell = -1;
|
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;
|
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 &&
|
if (mac->phy_config_request_sent &&
|
||||||
openair0_cfg[0].duplex_mode == duplex_mode_TDD &&
|
openair0_cfg[0].duplex_mode == duplex_mode_TDD &&
|
||||||
!get_softmodem_params()->continuous_tx) {
|
!get_softmodem_params()->continuous_tx) {
|
||||||
@@ -769,7 +769,7 @@ void *UE_thread(void *arg)
|
|||||||
initNotifiedFIFO_nothreadSafe(&freeBlocks);
|
initNotifiedFIFO_nothreadSafe(&freeBlocks);
|
||||||
|
|
||||||
int timing_advance = UE->timing_advance;
|
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;
|
bool syncRunning = false;
|
||||||
const int nb_slot_frame = fp->slots_per_frame;
|
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);
|
mac->if_module = nr_ue_if_module_init(i);
|
||||||
AssertFatal(mac->if_module, "can not initialize IF module\n");
|
AssertFatal(mac->if_module, "can not initialize IF module\n");
|
||||||
if (!get_softmodem_params()->sa || !get_softmodem_params()->sl_mode) {
|
if (!get_softmodem_params()->sa || !get_softmodem_params()->sl_mode) {
|
||||||
init_nsa_message(rrc_inst, reconfig_file, rbconfig_file);
|
init_nsa_message(&rrc_inst[i], reconfig_file, rbconfig_file);
|
||||||
nr_rlc_activate_srb0(mac_inst->crnti, NULL, send_srb0_rrc);
|
nr_rlc_activate_srb0(mac_inst[i].crnti, NULL, send_srb0_rrc);
|
||||||
}
|
}
|
||||||
//TODO: Move this call to RRC
|
//TODO: Move this call to RRC
|
||||||
start_sidelink((&rrc_inst[i])->ue_id);
|
start_sidelink((&rrc_inst[i])->ue_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_NR_UE_threads(int nb_inst) {
|
void init_NR_UE_threads(PHY_VARS_NR_UE *UE) {
|
||||||
int inst;
|
pthread_t thread;
|
||||||
|
char thread_name[16];
|
||||||
pthread_t threads[nb_inst];
|
sprintf(thread_name, "UEthread_%d", UE->Mod_id);
|
||||||
|
threadCreate(&thread, UE_thread, (void *)UE, thread_name, -1, OAI_PRIORITY_RT_MAX);
|
||||||
for (inst=0; inst < nb_inst; inst++) {
|
if (!IS_SOFTMODEM_NOSTATS_BIT) {
|
||||||
PHY_VARS_NR_UE *UE = PHY_vars_UE_g[inst][0];
|
pthread_t stat_pthread;
|
||||||
|
sprintf(thread_name, "L1_UE_stats_%d", UE->Mod_id);
|
||||||
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(&stat_pthread, nrL1_UE_stats_thread, UE, thread_name, -1, OAI_PRIORITY_RT_LOW);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -286,6 +286,7 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
|
|||||||
UE->rf_map.card = card_offset;
|
UE->rf_map.card = card_offset;
|
||||||
UE->rf_map.chain = CC_id + chain_offset;
|
UE->rf_map.chain = CC_id + chain_offset;
|
||||||
UE->max_ldpc_iterations = nrUE_params.max_ldpc_iterations;
|
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_scan_carrier = nrUE_params.UE_scan_carrier;
|
||||||
UE->UE_fo_compensation = nrUE_params.UE_fo_compensation;
|
UE->UE_fo_compensation = nrUE_params.UE_fo_compensation;
|
||||||
UE->if_freq = nrUE_params.if_freq;
|
UE->if_freq = nrUE_params.if_freq;
|
||||||
@@ -490,7 +491,11 @@ int main(int argc, char **argv)
|
|||||||
cpuf=get_cpu_freq_GHz();
|
cpuf=get_cpu_freq_GHz();
|
||||||
itti_init(TASK_MAX, tasks_info);
|
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);
|
load_LDPClib(NULL, &ldpc_interface);
|
||||||
|
|
||||||
if (ouput_vcd) {
|
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
|
// strdup to put the sring in the core file for post mortem identification
|
||||||
LOG_I(HW, "Version: %s\n", strdup(PACKAGE_VERSION));
|
LOG_I(HW, "Version: %s\n", strdup(PACKAGE_VERSION));
|
||||||
|
|
||||||
PHY_vars_UE_g = malloc(sizeof(*PHY_vars_UE_g));
|
PHY_vars_UE_g = malloc(sizeof(*PHY_vars_UE_g) * NB_UE_INST);
|
||||||
PHY_vars_UE_g[0] = malloc(sizeof(*PHY_vars_UE_g[0]) * MAX_NUM_CCs);
|
for (int inst = 0; inst < NB_UE_INST; inst++) {
|
||||||
for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
PHY_vars_UE_g[inst] = malloc(sizeof(*PHY_vars_UE_g[inst]) * MAX_NUM_CCs);
|
||||||
PHY_vars_UE_g[0][CC_id] = malloc(sizeof(*PHY_vars_UE_g[0][CC_id]));
|
for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||||
memset(PHY_vars_UE_g[0][CC_id], 0, sizeof(*PHY_vars_UE_g[0][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;
|
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();
|
start_oai_nrue_threads();
|
||||||
|
|
||||||
if (!get_softmodem_params()->emulate_l1) {
|
if (!get_softmodem_params()->emulate_l1) {
|
||||||
PHY_VARS_NR_UE *UE[MAX_NUM_CCs];
|
for (int inst = 0; inst < NB_UE_INST; inst++) {
|
||||||
for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
PHY_VARS_NR_UE *UE[MAX_NUM_CCs];
|
||||||
UE[CC_id] = PHY_vars_UE_g[0][CC_id];
|
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]);
|
set_options(CC_id, UE[CC_id]);
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
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
|
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
|
// and assume that the SSB is centered on the grid
|
||||||
uint16_t nr_band = get_softmodem_params()->band;
|
uint16_t nr_band = get_softmodem_params()->band;
|
||||||
mac->nr_band = nr_band;
|
mac->nr_band = nr_band;
|
||||||
mac->ssb_start_subcarrier = UE[CC_id]->frame_parms.ssb_start_subcarrier;
|
mac->ssb_start_subcarrier = UE[CC_id]->frame_parms.ssb_start_subcarrier;
|
||||||
nr_init_frame_parms_ue_sa(&UE[CC_id]->frame_parms,
|
nr_init_frame_parms_ue_sa(&UE[CC_id]->frame_parms,
|
||||||
downlink_frequency[CC_id][0],
|
downlink_frequency[CC_id][0],
|
||||||
uplink_frequency_offset[CC_id][0],
|
uplink_frequency_offset[CC_id][0],
|
||||||
get_softmodem_params()->numerology,
|
get_softmodem_params()->numerology,
|
||||||
nr_band);
|
nr_band);
|
||||||
} else {
|
} else {
|
||||||
DevAssert(mac->if_module != NULL && mac->if_module->phy_config_request != NULL);
|
DevAssert(mac->if_module != NULL && mac->if_module->phy_config_request != NULL);
|
||||||
mac->if_module->phy_config_request(&mac->phy_config);
|
mac->if_module->phy_config_request(&mac->phy_config);
|
||||||
mac->phy_config_request_sent = true;
|
mac->phy_config_request_sent = true;
|
||||||
fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config;
|
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;
|
UE[CC_id]->sl_mode = get_softmodem_params()->sl_mode;
|
||||||
init_nr_ue_vars(UE[CC_id], 0, abstraction_flag);
|
init_nr_ue_vars(UE[CC_id], inst, abstraction_flag);
|
||||||
|
|
||||||
if (UE[CC_id]->sl_mode) {
|
if (UE[CC_id]->sl_mode) {
|
||||||
AssertFatal(UE[CC_id]->sl_mode == 2, "Only Sidelink mode 2 supported. Mode 1 not yet supported\n");
|
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);
|
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;
|
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_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;
|
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->if_module->sl_phy_config_request(phycfg);
|
||||||
mac->phy_config_request_sent = true;
|
mac->phy_config_request_sent = true;
|
||||||
sl_nr_ue_phy_params_t *sl_phy = &UE[CC_id]->SL_UE_PHY_PARAMS;
|
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,
|
nr_init_frame_parms_ue_sl(&sl_phy->sl_frame_params,
|
||||||
&sl_phy->sl_config,
|
&sl_phy->sl_config,
|
||||||
get_softmodem_params()->threequarter_fs,
|
get_softmodem_params()->threequarter_fs,
|
||||||
get_nrUE_params()->ofdm_offset_divisor);
|
get_nrUE_params()->ofdm_offset_divisor);
|
||||||
sl_ue_phy_init(UE[CC_id]);
|
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]);
|
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());
|
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}, \
|
{"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}, \
|
{"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}, \
|
{"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}, \
|
{"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}, \
|
{"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}, \
|
{"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}, \
|
{"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}, \
|
{"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}, \
|
{"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
|
// clang-format on
|
||||||
|
|
||||||
@@ -81,6 +83,7 @@ typedef struct {
|
|||||||
int nb_antennas_tx;
|
int nb_antennas_tx;
|
||||||
int N_RB_DL;
|
int N_RB_DL;
|
||||||
int ssb_start_subcarrier;
|
int ssb_start_subcarrier;
|
||||||
|
int ldpc_offload_flag;
|
||||||
} nrUE_params_t;
|
} nrUE_params_t;
|
||||||
extern uint64_t get_nrUE_optmask(void);
|
extern uint64_t get_nrUE_optmask(void);
|
||||||
extern uint64_t set_nrUE_optmask(uint64_t bitmask);
|
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 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 fill_ue_band_info(void);
|
||||||
extern void init_NR_UE(int, char *, char *, char *);
|
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 reset_opp_meas(void);
|
||||||
extern void print_opp_meas(void);
|
extern void print_opp_meas(void);
|
||||||
void start_oai_nrue_threads(void);
|
void start_oai_nrue_threads(void);
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#define NFAPI_UE_MAX_NUM_CB 8
|
#define NFAPI_UE_MAX_NUM_CB 8
|
||||||
#define NFAPI_MAX_NUM_UL_PDU 255
|
#define NFAPI_MAX_NUM_UL_PDU 255
|
||||||
|
#define NFAPI_MAX_NUM_CSI_RATEMATCH 4
|
||||||
|
|
||||||
/*
|
/*
|
||||||
typedef unsigned int uint32_t;
|
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_dl_pdu_rel15_t dci_config_rel15;
|
||||||
} fapi_nr_dl_config_dci_pdu;
|
} 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 enum{vrb_to_prb_mapping_non_interleaved = 0, vrb_to_prb_mapping_interleaved = 1} vrb_to_prb_mapping_t;
|
||||||
|
|
||||||
typedef struct {
|
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
|
// 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]
|
// 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
|
/// 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
|
/// PT-RS time density [TS38.214, table 5.1.6.3-1] 0: 1 1: 2 2: 4
|
||||||
uint8_t PTRSTimeDensity;
|
uint8_t PTRSTimeDensity;
|
||||||
/// PT-RS frequency density [TS38.214, table 5.1.6.3-2] 0: 2 1: 4
|
/// 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;
|
uint16_t pduBitmap;
|
||||||
uint32_t k1_feedback;
|
uint32_t k1_feedback;
|
||||||
uint8_t ldpcBaseGraph;
|
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;
|
} fapi_nr_dl_config_dlsch_pdu_rel15_t;
|
||||||
|
|
||||||
typedef struct {
|
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_rel15_t dlsch_config_rel15;
|
||||||
} fapi_nr_dl_config_dlsch_pdu;
|
} 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 {
|
typedef struct {
|
||||||
uint16_t bwp_size;
|
uint16_t bwp_size;
|
||||||
uint16_t bwp_start;
|
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("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);
|
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;
|
impp.gen_code = 2;
|
||||||
|
|
||||||
if (ntrials==0)
|
if (ntrials==0)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -12,14 +12,7 @@
|
|||||||
#include <rte_hexdump.h>
|
#include <rte_hexdump.h>
|
||||||
#include <rte_log.h>
|
#include <rte_log.h>
|
||||||
|
|
||||||
#define TEST_SUCCESS 0
|
|
||||||
#define TEST_FAILED -1
|
|
||||||
#define TEST_SKIPPED 1
|
|
||||||
|
|
||||||
#define MAX_BURST 512U
|
#define MAX_BURST 512U
|
||||||
#define DEFAULT_BURST 32U
|
|
||||||
#define DEFAULT_OPS 64U
|
|
||||||
#define DEFAULT_ITER 6U
|
|
||||||
|
|
||||||
enum op_data_type {
|
enum op_data_type {
|
||||||
DATA_INPUT = 0,
|
DATA_INPUT = 0,
|
||||||
@@ -30,106 +23,4 @@ enum op_data_type {
|
|||||||
DATA_NUM_TYPES,
|
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
|
#endif
|
||||||
|
|||||||
@@ -78,6 +78,15 @@ typedef enum nrLDPC_outMode {
|
|||||||
nrLDPC_outMode_LLRINT8 /**< Single LLR value per int8_t output */
|
nrLDPC_outMode_LLRINT8 /**< Single LLR value per int8_t output */
|
||||||
} e_nrLDPC_outMode;
|
} 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.
|
Structure containing LDPC decoder parameters.
|
||||||
*/
|
*/
|
||||||
@@ -94,18 +103,24 @@ typedef struct nrLDPC_dec_params {
|
|||||||
int crc_type;
|
int crc_type;
|
||||||
int (*check_crc)(uint8_t* decoded_bytes, uint32_t n, uint8_t crc_type);
|
int (*check_crc)(uint8_t* decoded_bytes, uint32_t n, uint8_t crc_type);
|
||||||
uint8_t setCombIn;
|
uint8_t setCombIn;
|
||||||
|
nrLDPC_params_per_cb_t perCB[NR_LDPC_MAX_NUM_CB];
|
||||||
} t_nrLDPC_dec_params;
|
} t_nrLDPC_dec_params;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Structure containing LDPC offload parameters.
|
||||||
|
*/
|
||||||
typedef struct nrLDPCoffload_params {
|
typedef struct nrLDPCoffload_params {
|
||||||
uint8_t BG; /**< Base graph */
|
uint8_t BG; /**< Base graph */
|
||||||
uint16_t Z;
|
uint16_t Z;
|
||||||
uint16_t Kr;
|
uint16_t Kr;
|
||||||
uint8_t rv;
|
uint8_t rv;
|
||||||
uint32_t E;
|
|
||||||
uint16_t n_cb;
|
uint16_t n_cb;
|
||||||
uint16_t F; /**< Filler bits */
|
uint16_t F; /**< Filler bits */
|
||||||
uint8_t Qm; /**< Modulation */
|
uint8_t Qm; /**< Modulation */
|
||||||
|
uint8_t C;
|
||||||
|
uint8_t numMaxIter;
|
||||||
uint8_t setCombIn;
|
uint8_t setCombIn;
|
||||||
|
nrLDPC_params_per_cb_t perCB[NR_LDPC_MAX_NUM_CB];
|
||||||
} t_nrLDPCoffload_params;
|
} t_nrLDPCoffload_params;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -99,6 +99,8 @@
|
|||||||
/** Maximum number of possible input LLR = NR_LDPC_NCOL_BG1*NR_LDPC_ZMAX */
|
/** 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_LLR 27000
|
||||||
|
|
||||||
|
#define NR_LDPC_MAX_NUM_CB 72
|
||||||
|
|
||||||
// ==============================================================================
|
// ==============================================================================
|
||||||
// GLOBAL CONSTANT VARIABLES
|
// GLOBAL CONSTANT VARIABLES
|
||||||
|
|
||||||
|
|||||||
@@ -59,8 +59,9 @@ typedef struct {
|
|||||||
uint32_t F;
|
uint32_t F;
|
||||||
/// Modulation order
|
/// Modulation order
|
||||||
uint8_t Qm;
|
uint8_t Qm;
|
||||||
uint32_t E;
|
uint32_t Tbslbrm;
|
||||||
unsigned int G;
|
unsigned int G;
|
||||||
|
nrLDPC_params_per_cb_t perCB[NR_LDPC_MAX_NUM_CB];
|
||||||
// Redundancy version index
|
// Redundancy version index
|
||||||
uint8_t rv;
|
uint8_t rv;
|
||||||
} encoder_implemparams_t;
|
} encoder_implemparams_t;
|
||||||
|
|||||||
@@ -137,6 +137,9 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
|
|
||||||
if (gNB->ldpc_offload_flag)
|
if (gNB->ldpc_offload_flag)
|
||||||
load_LDPClib("_t2", &ldpc_interface_offload);
|
load_LDPClib("_t2", &ldpc_interface_offload);
|
||||||
|
else
|
||||||
|
load_LDPClib(NULL, &ldpc_interface);
|
||||||
|
|
||||||
gNB->max_nb_pdsch = MAX_MOBILES_PER_GNB;
|
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);
|
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,
|
uint32_t re_offset,
|
||||||
uint8_t dmrs_type);
|
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 init_scrambling_luts(void);
|
||||||
void nr_generate_modulation_table(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;
|
impp.harq = harq;
|
||||||
if (gNB->ldpc_offload_flag) {
|
if (gNB->ldpc_offload_flag) {
|
||||||
impp.Qm = rel15->qamModOrder[0];
|
impp.Qm = rel15->qamModOrder[0];
|
||||||
|
impp.Tbslbrm = rel15->maintenance_parms_v3.tbSizeLbrmBytes;
|
||||||
impp.rv = rel15->rvIndex[0];
|
impp.rv = rel15->rvIndex[0];
|
||||||
int nb_re_dmrs =
|
int nb_re_dmrs =
|
||||||
(rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1) ? (6 * rel15->numDmrsCdmGrpsNoData) : (4 * rel15->numDmrsCdmGrpsNoData);
|
(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,
|
harq->unav_res,
|
||||||
rel15->qamModOrder[0],
|
rel15->qamModOrder[0],
|
||||||
rel15->nrOfLayers);
|
rel15->nrOfLayers);
|
||||||
int r_offset = 0;
|
|
||||||
for (int r = 0; r < impp.n_segments; r++) {
|
for (int r = 0; r < impp.n_segments; r++) {
|
||||||
impp.E = nr_get_E(impp.G, impp.n_segments, impp.Qm, rel15->nrOfLayers, r);
|
impp.perCB[r].E_cb = 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;
|
|
||||||
}
|
}
|
||||||
|
ldpc_interface_offload.LDPCencoder(harq->c, &impp.output, &impp);
|
||||||
} else {
|
} else {
|
||||||
notifiedFIFO_t nf;
|
notifiedFIFO_t nf;
|
||||||
initNotifiedFIFO(&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);
|
void free_nr_ru_prach_entry(RU_t *ru, int prach_id);
|
||||||
uint8_t get_nr_prach_duration(uint8_t prach_format);
|
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 free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id);
|
||||||
|
|
||||||
void nr_decode_pucch1(c16_t **rxdataF,
|
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");
|
LOG_E(PHY, "ulsch_decoding.c: Problem in rate_matching\n");
|
||||||
rdata->decodeIterations = max_ldpc_iterations + 1;
|
rdata->decodeIterations = max_ldpc_iterations + 1;
|
||||||
|
set_abort(&ulsch_harq->abort_decode, true);
|
||||||
return;
|
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_gNB_ULSCH_t *ulsch = &phy_vars_gNB->ulsch[ULSCH_id];
|
||||||
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_process;
|
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_process;
|
||||||
int16_t z_ol[LDPC_MAX_CB_SIZE] __attribute__((aligned(16)));
|
int16_t z_ol[NR_LDPC_MAX_NUM_CB * LDPC_MAX_CB_SIZE] __attribute__((aligned(16)));
|
||||||
int8_t l_ol[LDPC_MAX_CB_SIZE] __attribute__((aligned(16)));
|
int8_t l_ol[NR_LDPC_MAX_NUM_CB * LDPC_MAX_CB_SIZE] __attribute__((aligned(16)));
|
||||||
uint8_t Qm = pusch_pdu->qam_mod_order;
|
const int kc = decParams->BG == 2 ? 52 : 68;
|
||||||
uint8_t n_layers = pusch_pdu->nrOfLayers;
|
uint32_t A = (harq_process->TBS) << 3;
|
||||||
const int Kr = harq_process->K;
|
const int Kr = harq_process->K;
|
||||||
const int Kr_bytes = Kr >> 3;
|
const int Kr_bytes = Kr >> 3;
|
||||||
uint32_t A = (harq_process->TBS) << 3;
|
int8_t decodeIterations = 0;
|
||||||
const int kc = decParams->BG == 2 ? 52 : 68;
|
int r_offset = 0;
|
||||||
ulsch->max_ldpc_iterations = 20;
|
int offset = 0;
|
||||||
int decodeIterations = 2;
|
// new data received, set processedSegments to 0
|
||||||
int r_offset = 0, offset = 0;
|
if (!decParams->setCombIn)
|
||||||
for (int r = 0; r < harq_process->C; r++) {
|
harq_process->processedSegments = 0;
|
||||||
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);
|
|
||||||
|
|
||||||
memcpy(z_ol, ulsch_llr + r_offset, E * sizeof(short));
|
for (int r = 0; r < harq_process->C; r++) {
|
||||||
simde__m128i *pv_ol128 = (simde__m128i *)&z_ol;
|
decParams->perCB[r].E_cb = nr_get_E(G, harq_process->C, decParams->Qm, pusch_pdu->nrOfLayers, r);
|
||||||
simde__m128i *pl_ol128 = (simde__m128i *)&l_ol;
|
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++) {
|
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]);
|
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->F = harq_process->F;
|
||||||
decParams->Qm = Qm;
|
r_offset += decParams->perCB[r].E_cb;
|
||||||
decodeIterations =
|
offset += LDPC_MAX_CB_SIZE;
|
||||||
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) {
|
int8_t p_outDec[harq_process->C * Kr_bytes];
|
||||||
LOG_E(PHY, "ulsch_decoding.c: Problem in LDPC decoder offload\n");
|
memset(p_outDec, 0, sizeof(p_outDec));
|
||||||
return -1;
|
decodeIterations =
|
||||||
}
|
ldpc_interface_offload.LDPCdecoder(decParams, harq_pid, ULSCH_id, harq_process->C, (int8_t *)l_ol, p_outDec, NULL, NULL);
|
||||||
bool decodeSuccess = check_crc((uint8_t *)harq_process->c[r], lenWithCrc(harq_process->C, A), crcType(harq_process->C, A));
|
|
||||||
if (decodeSuccess) {
|
if (decodeIterations < 0) {
|
||||||
memcpy(harq_process->b + offset, harq_process->c[r], Kr_bytes - (harq_process->F >> 3) - ((harq_process->C > 1) ? 3 : 0));
|
LOG_E(PHY, "ulsch_decoding.c: Problem in LDPC decoder offload\n");
|
||||||
offset += (Kr_bytes - (harq_process->F >> 3) - ((harq_process->C > 1) ? 3 : 0));
|
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++;
|
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;
|
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) {
|
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_valid = check_crc(harq_process->b, lenWithCrc(1, A), crcType(1, A));
|
||||||
// CRC check made by the LDPC for early termination, so, no need to perform CRC check twice for a single code block
|
if (harq_process->C == 1 && !crc_valid) {
|
||||||
crc_valid = true;
|
harq_process->processedSegments--;
|
||||||
if (harq_process->C > 1) {
|
|
||||||
crc_valid = check_crc(harq_process->b, lenWithCrc(1, A), crcType(1, A));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (crc_valid) {
|
if (crc_valid) {
|
||||||
LOG_D(PHY, "ULSCH: Setting ACK for slot %d TBS %d\n", ulsch->slot, harq_process->TBS);
|
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);
|
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;
|
const uint8_t n_layers = pusch_pdu->nrOfLayers;
|
||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
harq_process->processedSegments = 0;
|
|
||||||
harq_process->TBS = pusch_pdu->pusch_data.tb_size;
|
harq_process->TBS = pusch_pdu->pusch_data.tb_size;
|
||||||
|
|
||||||
t_nrLDPC_dec_params decParams = {.check_crc = check_crc};
|
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.Z = harq_process->Z;
|
||||||
decParams.numMaxIter = ulsch->max_ldpc_iterations;
|
decParams.numMaxIter = ulsch->max_ldpc_iterations;
|
||||||
|
decParams.Qm = Qm;
|
||||||
|
decParams.rv = pusch_pdu->pusch_data.rv_index;
|
||||||
decParams.outMode = 0;
|
decParams.outMode = 0;
|
||||||
decParams.setCombIn = !harq_process->harq_to_be_cleared;
|
decParams.setCombIn = !harq_process->harq_to_be_cleared;
|
||||||
if (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)
|
if (phy_vars_gNB->ldpc_offload_flag)
|
||||||
return decode_offload(phy_vars_gNB, ULSCH_id, ulsch_llr, pusch_pdu, &decParams, harq_pid, G);
|
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;
|
uint32_t offset = 0, r_offset = 0;
|
||||||
set_abort(&harq_process->abort_decode, false);
|
set_abort(&harq_process->abort_decode, false);
|
||||||
for (int r = 0; r < harq_process->C; r++) {
|
for (int r = 0; r < harq_process->C; r++) {
|
||||||
|
|||||||
@@ -28,7 +28,6 @@
|
|||||||
#include "PHY/NR_REFSIG/ptrs_nr.h"
|
#include "PHY/NR_REFSIG/ptrs_nr.h"
|
||||||
#include "PHY/NR_REFSIG/nr_mod_table.h"
|
#include "PHY/NR_REFSIG/nr_mod_table.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
|
#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
|
||||||
#include "nr_phy_common.h"
|
#include "nr_phy_common.h"
|
||||||
#include "filt16a_32.h"
|
#include "filt16a_32.h"
|
||||||
#include "T.h"
|
#include "T.h"
|
||||||
|
|||||||
@@ -36,8 +36,8 @@
|
|||||||
#include "executables/nr-softmodem-common.h"
|
#include "executables/nr-softmodem-common.h"
|
||||||
#include "nr_transport_proto_ue.h"
|
#include "nr_transport_proto_ue.h"
|
||||||
#include "PHY/phy_extern_nr_ue.h"
|
#include "PHY/phy_extern_nr_ue.h"
|
||||||
|
#include "PHY/NR_REFSIG/nr_refsig.h"
|
||||||
#include "common/utils/nr/nr_common.h"
|
#include "common/utils/nr/nr_common.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
|
||||||
#include "PHY/NR_UE_ESTIMATION/filt16a_32.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
|
// 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],
|
int32_t csi_rs_received_signal[][ue->frame_parms.samples_per_slot_wCP],
|
||||||
uint32_t *rsrp,
|
uint32_t *rsrp,
|
||||||
int *rsrp_dBm,
|
int *rsrp_dBm,
|
||||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
|
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
||||||
|
{
|
||||||
const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
const NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
|
||||||
uint16_t meas_count = 0;
|
uint16_t meas_count = 0;
|
||||||
uint32_t rsrp_sum = 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++) {
|
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
|
// loop over frequency resource elements within a group
|
||||||
for (int kp = 0; kp <= k_prime; kp++) {
|
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
|
// loop over time resource elements within a group
|
||||||
for (int lp = 0; lp <= l_prime; lp++) {
|
for (int lp = 0; lp <= l_prime; lp++) {
|
||||||
uint16_t symb = lp + l_overline[cdm_id];
|
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_signal = &rxdataF[ant_rx][symbol_offset];
|
||||||
c16_t *rx_csi_rs_signal = (c16_t*)&csi_rs_received_signal[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;
|
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++;
|
meas_count++;
|
||||||
|
|
||||||
#ifdef NR_CSIRS_DEBUG
|
#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;
|
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];
|
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",
|
LOG_I(NR_PHY,
|
||||||
|
"l,k (%2d,%4d) |\tport_tx %d (%4d,%4d)\tant_rx %d (%4d,%4d)\n",
|
||||||
symb,
|
symb,
|
||||||
k,
|
k,
|
||||||
port_tx+3000,
|
port_tx+3000,
|
||||||
@@ -728,12 +729,12 @@ int nr_csi_rs_cqi_estimation(const uint32_t precoded_sinr,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue,
|
static void nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue,
|
||||||
const UE_nr_rxtx_proc_t *proc,
|
const UE_nr_rxtx_proc_t *proc,
|
||||||
const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu,
|
const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu,
|
||||||
uint32_t *interference_plus_noise_power,
|
uint32_t *interference_plus_noise_power,
|
||||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
|
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
||||||
|
{
|
||||||
const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
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 ?
|
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;
|
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];
|
uint16_t sc = sc0_offset + csiim_config_pdu->k_csiim[sc_idx];
|
||||||
if (sc >= frame_parms->ofdm_symbol_size) {
|
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_re += rx_signal[sc].r;
|
||||||
sum_im += rx_signal[sc].i;
|
sum_im += rx_signal[sc].i;
|
||||||
sum2_re += rx_signal[sc].r*rx_signal[sc].r;
|
sum2_re += rx_signal[sc].r * rx_signal[sc].r;
|
||||||
sum2_im += rx_signal[sc].i*rx_signal[sc].i;
|
sum2_im += rx_signal[sc].i * rx_signal[sc].i;
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t power_re = sum2_re/count - (sum_re/count)*(sum_re/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_im = sum2_im / count - (sum_im / count) * (sum_im / count);
|
||||||
|
|
||||||
*interference_plus_noise_power = power_re + power_im;
|
*interference_plus_noise_power = power_re + power_im;
|
||||||
|
|
||||||
#ifdef NR_CSIIM_DEBUG
|
#ifdef NR_CSIIM_DEBUG
|
||||||
LOG_I(NR_PHY, "interference_plus_noise_power based on CSI-IM = %i\n", *interference_plus_noise_power);
|
LOG_I(NR_PHY, "interference_plus_noise_power based on CSI-IM = %i\n", *interference_plus_noise_power);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue,
|
void nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue,
|
||||||
const UE_nr_rxtx_proc_t *proc,
|
const UE_nr_rxtx_proc_t *proc,
|
||||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
||||||
{
|
{
|
||||||
int gNB_id = proc->gNB_id;
|
int gNB_id = proc->gNB_id;
|
||||||
if(!ue->csiim_vars[gNB_id]->active) {
|
if(!ue->csiim_vars[gNB_id]->active)
|
||||||
return -1;
|
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;
|
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);
|
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;
|
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)
|
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) {
|
switch (csirs_config_pdu->measurement_bitmap) {
|
||||||
case 1 :
|
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;
|
break;
|
||||||
case 26 :
|
case 26 :
|
||||||
LOG_I(NR_PHY, "RI = %i i1 = %i.%i.%i, i2 = %i, SINR = %i dB, CQI = %i\n",
|
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");
|
LOG_D(PHY, "DLSCH received nok \n");
|
||||||
return true; //stop
|
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
|
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)
|
// do the check only if the 2 first bytes of the CRC are 0 (it can be CRC16 or CRC24)
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|||||||
@@ -30,7 +30,6 @@
|
|||||||
*/
|
*/
|
||||||
#include "PHY/defs_nr_UE.h"
|
#include "PHY/defs_nr_UE.h"
|
||||||
#include "PHY/phy_extern.h"
|
#include "PHY/phy_extern.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
|
||||||
#include "nr_transport_proto_ue.h"
|
#include "nr_transport_proto_ue.h"
|
||||||
#include "PHY/sse_intrin.h"
|
#include "PHY/sse_intrin.h"
|
||||||
#include "T.h"
|
#include "T.h"
|
||||||
@@ -159,6 +158,7 @@ static void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
|
|||||||
uint8_t Nl,
|
uint8_t Nl,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint16_t dlDmrsSymbPos,
|
uint16_t dlDmrsSymbPos,
|
||||||
|
uint32_t csi_res_bitmap,
|
||||||
int chest_time_type);
|
int chest_time_type);
|
||||||
|
|
||||||
static void nr_dlsch_channel_level_median(uint32_t rx_size_symbol,
|
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,
|
unsigned short nb_rb,
|
||||||
int length);
|
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 */
|
/* Main Function */
|
||||||
int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||||
const UE_nr_rxtx_proc_t *proc,
|
const UE_nr_rxtx_proc_t *proc,
|
||||||
@@ -360,10 +436,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(symbol > ue->frame_parms.symbols_per_slot>>1)
|
if(symbol > ue->frame_parms.symbols_per_slot >> 1)
|
||||||
{
|
slot = 1;
|
||||||
slot = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t pilots = (dlsch_config->dlDmrsSymbPos >> symbol) & 1;
|
uint8_t pilots = (dlsch_config->dlDmrsSymbPos >> symbol) & 1;
|
||||||
uint8_t config_type = dlsch_config->dmrsConfigType;
|
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];
|
__attribute__((aligned(32))) c16_t rxdataF_ext[nbRx][rx_size_symbol];
|
||||||
memset(rxdataF_ext, 0, sizeof(rxdataF_ext));
|
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,
|
nr_dlsch_extract_rbs(ue->frame_parms.samples_per_slot_wCP,
|
||||||
rxdataF,
|
rxdataF,
|
||||||
rx_size_symbol,
|
rx_size_symbol,
|
||||||
@@ -396,6 +474,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
nl,
|
nl,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
dlsch_config->dlDmrsSymbPos,
|
dlsch_config->dlDmrsSymbPos,
|
||||||
|
csi_res_bitmap,
|
||||||
ue->chest_time);
|
ue->chest_time);
|
||||||
if (meas_enabled) {
|
if (meas_enabled) {
|
||||||
stop_meas(&meas);
|
stop_meas(&meas);
|
||||||
@@ -576,9 +655,22 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
/* Check for PTRS bitmap and process it respectively */
|
/* Check for PTRS bitmap and process it respectively */
|
||||||
if((pduBitmap & 0x1) && (dlsch[0].rnti_type == TYPE_C_RNTI_)) {
|
if((pduBitmap & 0x1) && (dlsch[0].rnti_type == TYPE_C_RNTI_)) {
|
||||||
nr_pdsch_ptrs_processing(
|
nr_pdsch_ptrs_processing(ue,
|
||||||
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);
|
nbRx,
|
||||||
dl_valid_re[symbol-1] -= ptrs_re_per_slot[0][symbol];
|
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 */
|
/* at last symbol in a slot calculate LLR's for whole slot */
|
||||||
if(symbol == (startSymbIdx + nbSymb -1)) {
|
if(symbol == (startSymbIdx + nbSymb -1)) {
|
||||||
@@ -1099,15 +1191,30 @@ static void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
|
|||||||
uint8_t Nl,
|
uint8_t Nl,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint16_t dlDmrsSymbPos,
|
uint16_t dlDmrsSymbPos,
|
||||||
|
uint32_t csi_res_bitmap,
|
||||||
int chest_time_type)
|
int chest_time_type)
|
||||||
{
|
{
|
||||||
if (config_type == NFAPI_NR_DMRS_TYPE1) {
|
if (config_type == NFAPI_NR_DMRS_TYPE1)
|
||||||
AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2,
|
AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2, "n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
|
||||||
"n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
|
else
|
||||||
} else {
|
|
||||||
AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2 || n_dmrs_cdm_groups == 3,
|
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);
|
"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;
|
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;
|
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 = &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];
|
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 (l == 0) {
|
||||||
if (start_re + nb_rb_pdsch * NR_NB_SC_PER_RB <= frame_parms->ofdm_symbol_size) {
|
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));
|
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));
|
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){
|
else {
|
||||||
if (n_dmrs_cdm_groups == 1) { //data is multiplexed
|
int j = 0;
|
||||||
if (l == 0) {
|
int k = start_re;
|
||||||
unsigned short k = start_re;
|
for (int rb = 0; rb < nb_rb_pdsch; rb++) {
|
||||||
for (unsigned short j = 0; j < 6*nb_rb_pdsch; j += 3) {
|
uint32_t overlap_map = rb % 2 ? dmrs_csi_overlap_odd : dmrs_csi_overlap_even;
|
||||||
rxF_ext[j] = rxF[k+1];
|
for (int re = 0; re < 12; re++) {
|
||||||
rxF_ext[j+1] = rxF[k+3];
|
if (((overlap_map >> re) & 0x01) == 0) {
|
||||||
rxF_ext[j+2] = rxF[k+5];
|
// DATA RE
|
||||||
k += 6;
|
if (l == 0)
|
||||||
if (k >= frame_parms->ofdm_symbol_size)
|
rxF_ext[j] = rxF[k];
|
||||||
k -= frame_parms->ofdm_symbol_size;
|
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 += 12;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,16 +151,13 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
|||||||
start_meas(&ue->ulsch_ldpc_encoding_stats);
|
start_meas(&ue->ulsch_ldpc_encoding_stats);
|
||||||
if (ldpc_interface_offload.LDPCencoder) {
|
if (ldpc_interface_offload.LDPCencoder) {
|
||||||
for (int j = 0; j < impp.n_segments; j++) {
|
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);
|
impp.perCB[j].E_cb = 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;
|
|
||||||
}
|
}
|
||||||
|
ldpc_interface_offload.LDPCencoder(harq_process->c, &harq_process->f, &impp);
|
||||||
} else {
|
} else {
|
||||||
if (ulsch->pusch_pdu.pusch_data.new_data_indicator) {
|
if (ulsch->pusch_pdu.pusch_data.new_data_indicator) {
|
||||||
for (int j = 0; j < (impp.n_segments / 8 + 1); j++) {
|
for (int j = 0; j < (impp.n_segments / 8 + 1); j++) {
|
||||||
impp.macro_num = 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;
|
impp.Kr = impp.K;
|
||||||
ldpc_interface.LDPCencoder(harq_process->c, harq_process->d, &impp);
|
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);
|
ulsch->pusch_pdu.pusch_data.rv_index);
|
||||||
|
|
||||||
///////////////////////// d---->| Rate matching bit selection |---->e /////////////////////////
|
///////////////////////// 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);
|
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);
|
start_meas(&ue->ulsch_rate_matching_stats);
|
||||||
@@ -204,7 +201,8 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
|||||||
impp.F,
|
impp.F,
|
||||||
impp.Kr - impp.F - 2 * impp.Zc,
|
impp.Kr - impp.F - 2 * impp.Zc,
|
||||||
impp.rv,
|
impp.rv,
|
||||||
impp.E) == -1)
|
impp.perCB[r].E_cb)
|
||||||
|
== -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
stop_meas(&ue->ulsch_rate_matching_stats);
|
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 /////////////////////////
|
///////////////////////// e---->| Rate matching bit interleaving |---->f /////////////////////////
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INTERLEAVING_LDPC, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INTERLEAVING_LDPC, VCD_FUNCTION_IN);
|
||||||
start_meas(&ue->ulsch_interleaving_stats);
|
start_meas(&ue->ulsch_interleaving_stats);
|
||||||
nr_interleaving_ldpc(impp.E,
|
nr_interleaving_ldpc(impp.perCB[r].E_cb, impp.Qm, harq_process->e + r_offset, harq_process->f + r_offset);
|
||||||
impp.Qm,
|
|
||||||
harq_process->e + r_offset,
|
|
||||||
harq_process->f + r_offset);
|
|
||||||
stop_meas(&ue->ulsch_interleaving_stats);
|
stop_meas(&ue->ulsch_interleaving_stats);
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INTERLEAVING_LDPC, VCD_FUNCTION_OUT);
|
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)
|
if (r == impp.n_segments - 1)
|
||||||
write_output("enc_output.m","enc", harq_process->f, G, 1, 4);
|
write_output("enc_output.m","enc", harq_process->f, G, 1, 4);
|
||||||
#endif
|
#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;
|
uint8_t max_ldpc_iterations;
|
||||||
|
|
||||||
|
int ldpc_offload_enable;
|
||||||
/// SRS variables
|
/// SRS variables
|
||||||
nr_srs_info_t *nr_srs_info;
|
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);
|
bool decodeSuccess = (rdata->decodeIterations <= rdata->decoderParms.numMaxIter);
|
||||||
ulsch_harq->processedSegments++;
|
ulsch_harq->processedSegments++;
|
||||||
LOG_D(PHY,
|
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,
|
rdata->segment_r,
|
||||||
ulsch_harq->processedSegments,
|
ulsch_harq->processedSegments,
|
||||||
rdata->nbSegments);
|
rdata->nbSegments,
|
||||||
|
decodeSuccess ? "Decoded Successfully" : "Decoding Unsuccessful");
|
||||||
|
|
||||||
if (decodeSuccess) {
|
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));
|
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
|
// put timing advance command in 0..63 range
|
||||||
timing_advance_update += 31;
|
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 (crc_flag == 0)
|
||||||
if (timing_advance_update > 63) timing_advance_update = 63;
|
LOG_D(PHY,
|
||||||
|
"%d.%d : Received PUSCH : Estimated timing advance PUSCH is = %d, timing_advance_update is %d \n",
|
||||||
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);
|
frame,
|
||||||
|
slot_rx,
|
||||||
|
sync_pos,
|
||||||
|
timing_advance_update);
|
||||||
|
|
||||||
// estimate UL_CQI for MAC
|
// estimate UL_CQI for MAC
|
||||||
int SNRtimes10 =
|
int SNRtimes10 =
|
||||||
|
|||||||
@@ -149,9 +149,9 @@ int nr_ue_pdcch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
int n_ss,
|
int n_ss,
|
||||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
|
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
|
||||||
|
|
||||||
int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue,
|
void nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue,
|
||||||
const UE_nr_rxtx_proc_t *proc,
|
const UE_nr_rxtx_proc_t *proc,
|
||||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
|
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
|
||||||
|
|
||||||
void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue,
|
void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue,
|
||||||
const UE_nr_rxtx_proc_t *proc,
|
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,
|
static bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
||||||
const UE_nr_rxtx_proc_t *proc,
|
const UE_nr_rxtx_proc_t *proc,
|
||||||
NR_UE_DLSCH_t dlsch[2],
|
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);
|
int ptrsSymbPerSlot = get_ptrs_symbols_in_slot(ptrsSymbPos, dlsch_config->start_symbol, dlsch_config->number_symbols);
|
||||||
unav_res = n_ptrs * ptrsSymbPerSlot;
|
unav_res = n_ptrs * ptrsSymbPerSlot;
|
||||||
}
|
}
|
||||||
int G1 =
|
unav_res += compute_csi_rm_unav_res(dlsch_config);
|
||||||
nr_get_G(dlsch_config->number_rbs, nb_symb_sch, nb_re_dmrs, dmrs_len, unav_res, dlsch_config->qamModOrder, dlsch[1].Nl);
|
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);
|
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);
|
stop_meas(&ue->dlsch_unscrambling_stats);
|
||||||
|
|
||||||
start_meas(&ue->dlsch_decoding_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);
|
stop_meas(&ue->dlsch_decoding_stats);
|
||||||
if (cpumeas(CPUMEAS_GETSTATE)) {
|
if (cpumeas(CPUMEAS_GETSTATE)) {
|
||||||
LOG_D(PHY, " --> Unscrambling for CW1 %5.3f\n",
|
LOG_D(PHY, " --> Unscrambling for CW1 %5.3f\n", (ue->dlsch_unscrambling_stats.p_time) / (cpuf * 1000.0));
|
||||||
(ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
|
LOG_D(PHY,
|
||||||
LOG_D(PHY, "AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
|
"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));
|
frame_rx % 1024,
|
||||||
}
|
nr_slot_rx,
|
||||||
LOG_D(PHY, "harq_pid: %d, TBS expected dlsch1: %d \n", harq_pid, dlsch[1].dlsch_config.TBS);
|
(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
|
// 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 output[harq_output_len];
|
||||||
char *p = output;
|
char *p = output;
|
||||||
const char *end = output + harq_output_len;
|
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)
|
for (int round = 1; round < 16 && (round < 3 || ue->dl_stats[round] != 0); ++round)
|
||||||
p += snprintf(p, end - p,"/%d", ue->dl_stats[round]);
|
p += snprintf(p, end - p,"/%d", ue->dl_stats[round]);
|
||||||
LOG_I(NR_PHY,"%s\n", output);
|
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);
|
start_meas(&meas);
|
||||||
// do procedures for C-RNTI
|
// do procedures for C-RNTI
|
||||||
|
|
||||||
|
bool slot_fep_map[14] = {0};
|
||||||
const uint32_t rxdataF_sz = ue->frame_parms.samples_per_slot_wCP;
|
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];
|
__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) {
|
if (dlsch[0].active) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDSCH, VCD_FUNCTION_IN);
|
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;
|
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 nb_symb_sch = dlsch_config->number_symbols;
|
||||||
uint16_t start_symb_sch = dlsch_config->start_symbol;
|
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);
|
LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx % 1024, nr_slot_rx);
|
||||||
//to update from pdsch config
|
|
||||||
|
|
||||||
for (uint16_t m=start_symb_sch;m<(nb_symb_sch+start_symb_sch) ; m++){
|
for (int m = start_symb_sch; m < (nb_symb_sch + start_symb_sch) ; m++) {
|
||||||
nr_slot_fep(ue,
|
if (!slot_fep_map[m]) {
|
||||||
&ue->frame_parms,
|
nr_slot_fep(ue, &ue->frame_parms, proc, m, rxdataF, link_type_dl);
|
||||||
proc,
|
slot_fep_map[m] = true;
|
||||||
m, // to be updated from higher layer
|
}
|
||||||
rxdataF,
|
|
||||||
link_type_dl);
|
|
||||||
}
|
}
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDSCH, VCD_FUNCTION_OUT);
|
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);
|
int ptrsSymbPerSlot = get_ptrs_symbols_in_slot(ptrsSymbPos, dlsch_config->start_symbol, dlsch_config->number_symbols);
|
||||||
unav_res = n_ptrs * ptrsSymbPerSlot;
|
unav_res = n_ptrs * ptrsSymbPerSlot;
|
||||||
}
|
}
|
||||||
|
unav_res += compute_csi_rm_unav_res(dlsch_config);
|
||||||
int G = nr_get_G(dlsch_config->number_rbs,
|
int G = nr_get_G(dlsch_config->number_rbs,
|
||||||
dlsch_config->number_symbols,
|
dlsch_config->number_symbols,
|
||||||
nb_re_dmrs,
|
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]);
|
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);
|
start_meas(&meas);
|
||||||
|
|
||||||
if (nr_slot_rx==9) {
|
if (nr_slot_rx==9) {
|
||||||
|
|||||||
@@ -5218,7 +5218,7 @@ bool supported_bw_comparison(int bw_mhz, NR_SupportedBandwidth_t *supported_BW,
|
|||||||
return false;
|
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
|
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
|
// 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);
|
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);
|
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;
|
mac->phy_config.CC_id = cc_idP;
|
||||||
|
|
||||||
// carrier config
|
// 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");
|
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)
|
static void setup_pdschconfig(NR_PDSCH_Config_t *source, NR_PDSCH_Config_t *target)
|
||||||
{
|
{
|
||||||
UPDATE_IE(target->dataScramblingIdentityPDSCH, source->dataScramblingIdentityPDSCH, long);
|
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->mcs_Table, source->mcs_Table, long);
|
||||||
UPDATE_IE(target->maxNrofCodeWordsScheduledByDCI, source->maxNrofCodeWordsScheduledByDCI, long);
|
UPDATE_IE(target->maxNrofCodeWordsScheduledByDCI, source->maxNrofCodeWordsScheduledByDCI, long);
|
||||||
UPDATE_NP_IE(target->prb_BundlingType, source->prb_BundlingType, struct NR_PDSCH_Config__prb_BundlingType);
|
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->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList == NULL, "Not handled\n");
|
||||||
AssertFatal(source->sp_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)
|
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);
|
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_CellGroupConfig_t *cell_group_config,
|
||||||
NR_UE_NR_Capability_t *ue_Capability)
|
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");
|
AssertFatal(cell_group_config, "CellGroupConfig should not be NULL\n");
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
|
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,
|
float nr_get_Pcmax(int p_Max,
|
||||||
uint16_t nr_band,
|
uint16_t nr_band,
|
||||||
|
frame_type_t frame_type,
|
||||||
frequency_range_t frequency_range,
|
frequency_range_t frequency_range,
|
||||||
int Qm,
|
int Qm,
|
||||||
bool powerBoostPi2BPSK,
|
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_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_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 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
|
/* \brief This function schedules the Msg3 transmission
|
||||||
@param
|
@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);
|
AssertFatal(nr_ue_mac_inst, "Couldn't allocate %d instances of MAC module\n", nb_inst);
|
||||||
|
|
||||||
for (int j = 0; j < nb_inst; j++) {
|
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;
|
mac->ue_id = j;
|
||||||
nr_ue_init_mac(mac);
|
nr_ue_init_mac(mac);
|
||||||
nr_ue_mac_default_configs(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 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,
|
prach_resources->RA_PCMAX = nr_get_Pcmax(mac->p_Max,
|
||||||
mac->nr_band,
|
mac->nr_band,
|
||||||
|
mac->frame_type,
|
||||||
mac->frequency_range,
|
mac->frequency_range,
|
||||||
2,
|
2,
|
||||||
false,
|
false,
|
||||||
|
|||||||
@@ -66,9 +66,8 @@ static int get_deltatf(uint16_t nb_of_prbs,
|
|||||||
int O_UCI);
|
int O_UCI);
|
||||||
|
|
||||||
// ∆MPR according to Table 6.2.2-3 38.101-1
|
// ∆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 (compare_relative_ul_channel_bw(nr_band, scs, N_RB_UL, frame_type)) {
|
||||||
if (power_class == 3) {
|
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) {
|
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)
|
// -- no additional MPR (A_MPR_c)
|
||||||
float nr_get_Pcmax(int p_Max,
|
float nr_get_Pcmax(int p_Max,
|
||||||
uint16_t nr_band,
|
uint16_t nr_band,
|
||||||
|
frame_type_t frame_type,
|
||||||
frequency_range_t frequency_range,
|
frequency_range_t frequency_range,
|
||||||
int Qm,
|
int Qm,
|
||||||
bool powerBoostPi2BPSK,
|
bool powerBoostPi2BPSK,
|
||||||
@@ -197,7 +197,7 @@ float nr_get_Pcmax(int p_Max,
|
|||||||
int delta_TC = 0;
|
int delta_TC = 0;
|
||||||
|
|
||||||
float MPR = get_mpr(Qm, N_RB_UL, is_transform_precoding, n_prbs, start_prb, power_class);
|
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 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 delta_rx_SRS = 0; // TODO for SRS
|
||||||
int P_MPR = 0; // to ensure compliance with applicable electromagnetic energy absorption requirements
|
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.
|
// modulated CP-OFDM of equivalent RB allocation.
|
||||||
int P_CMAX = nr_get_Pcmax(mac->p_Max,
|
int P_CMAX = nr_get_Pcmax(mac->p_Max,
|
||||||
mac->nr_band,
|
mac->nr_band,
|
||||||
|
mac->frame_type,
|
||||||
mac->frequency_range,
|
mac->frequency_range,
|
||||||
2,
|
2,
|
||||||
false,
|
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 M_pusch_component = 10 * log10((pow(2, mu)) * num_rb);
|
||||||
int P_CMAX = nr_get_Pcmax(mac->p_Max,
|
int P_CMAX = nr_get_Pcmax(mac->p_Max,
|
||||||
mac->nr_band,
|
mac->nr_band,
|
||||||
|
mac->frame_type,
|
||||||
mac->frequency_range,
|
mac->frequency_range,
|
||||||
2,
|
2,
|
||||||
false,
|
false,
|
||||||
|
|||||||
@@ -230,6 +230,57 @@ void nr_ue_decode_mib(NR_UE_MAC_INST_t *mac, int cc_id)
|
|||||||
mac->state = UE_SYNC;
|
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,
|
int8_t nr_ue_decode_BCCH_DL_SCH(NR_UE_MAC_INST_t *mac,
|
||||||
int cc_id,
|
int cc_id,
|
||||||
unsigned int gNB_index,
|
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->BWPSize = current_DL_BWP->BWPSize;
|
||||||
dlsch_pdu->BWPStart = current_DL_BWP->BWPStart;
|
dlsch_pdu->BWPStart = current_DL_BWP->BWPStart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nr_rnti_type_t rnti_type = get_rnti_type(mac, dci_ind->rnti);
|
||||||
|
|
||||||
int mux_pattern = 1;
|
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;
|
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;
|
mux_pattern = type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern;
|
||||||
dl_conf_req->pdu_type = FAPI_NR_DL_CONFIG_TYPE_SI_DLSCH;
|
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;
|
dlsch_pdu->SubcarrierSpacing = mac->mib->subCarrierSpacingCommon + 2;
|
||||||
} else {
|
} else {
|
||||||
dlsch_pdu->SubcarrierSpacing = current_DL_BWP->scs;
|
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;
|
dl_conf_req->pdu_type = FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH;
|
||||||
} else {
|
} else {
|
||||||
dl_conf_req->pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
|
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 */
|
/* IDENTIFIER_DCI_FORMATS */
|
||||||
/* FREQ_DOM_RESOURCE_ASSIGNMENT_DL */
|
/* FREQ_DOM_RESOURCE_ASSIGNMENT_DL */
|
||||||
if (nr_ue_process_dci_freq_dom_resource_assignment(NULL,
|
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;
|
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;
|
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,
|
NR_tda_info_t tda_info = get_dl_tda_info(current_DL_BWP,
|
||||||
dci_ind->ss_type,
|
dci_ind->ss_type,
|
||||||
dci->time_domain_assignment.val,
|
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;
|
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,
|
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",
|
"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,
|
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->BWPStart = current_DL_BWP->BWPStart;
|
||||||
dlsch_pdu->SubcarrierSpacing = current_DL_BWP->scs;
|
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 */
|
/* IDENTIFIER_DCI_FORMATS */
|
||||||
/* CARRIER_IND */
|
/* CARRIER_IND */
|
||||||
/* BANDWIDTH_PART_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 dmrs_typeA_pos = mac->dmrs_TypeA_Position;
|
||||||
int mux_pattern = 1;
|
int mux_pattern = 1;
|
||||||
const int coreset_type = dci_ind->coreset_type == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG; // 0 for coreset0, 1 otherwise;
|
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,
|
NR_tda_info_t tda_info = get_dl_tda_info(current_DL_BWP,
|
||||||
dci_ind->ss_type,
|
dci_ind->ss_type,
|
||||||
dci->time_domain_assignment.val,
|
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)
|
if (mac->state == UE_NOT_SYNC || mac->state == UE_DETACHING)
|
||||||
return;
|
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) {
|
if (mac->state == UE_CONNECTED) {
|
||||||
nr_schedule_csirs_reception(mac, rx_frame, rx_slot);
|
nr_schedule_csirs_reception(mac, rx_frame, rx_slot);
|
||||||
nr_schedule_csi_for_im(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,
|
nr_scheduled_response_t scheduled_response = {.dl_config = dl_config,
|
||||||
.module_id = mac->ue_id,
|
.module_id = mac->ue_id,
|
||||||
.CC_id = dl_info->cc_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;
|
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)
|
void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot)
|
||||||
{
|
{
|
||||||
if (!mac->sc_info.csi_MeasConfig)
|
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);
|
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;
|
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);
|
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->subcarrier_spacing = mu;
|
||||||
csirs_config_pdu->cyclic_prefix = current_DL_BWP->cyclicprefix ? *current_DL_BWP->cyclicprefix : 0;
|
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->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->scramb_id = nzpcsi->scramblingID;
|
||||||
csirs_config_pdu->power_control_offset = nzpcsi->powerControlOffset + 8;
|
csirs_config_pdu->power_control_offset = nzpcsi->powerControlOffset + 8;
|
||||||
if (nzpcsi->powerControlOffsetSS)
|
if (nzpcsi->powerControlOffsetSS)
|
||||||
csirs_config_pdu->power_control_offset_ss = *nzpcsi->powerControlOffsetSS;
|
csirs_config_pdu->power_control_offset_ss = *nzpcsi->powerControlOffsetSS;
|
||||||
else
|
else
|
||||||
csirs_config_pdu->power_control_offset_ss = 1; // 0 dB
|
csirs_config_pdu->power_control_offset_ss = 1; // 0 dB
|
||||||
switch(resourceMapping.frequencyDomainAllocation.present){
|
|
||||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1:
|
configure_csi_resource_mapping(csirs_config_pdu, &nzpcsi->resourceMapping, bwp_size, bwp_start);
|
||||||
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");
|
|
||||||
}
|
|
||||||
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_CSI_RS;
|
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_CSI_RS;
|
||||||
dl_config->number_pdus += 1;
|
dl_config->number_pdus += 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,24 +43,25 @@ TEST(test_pcmax, test_mpr)
|
|||||||
int N_RB_UL = 51; // 10Mhz
|
int N_RB_UL = 51; // 10Mhz
|
||||||
int nr_band = 20;
|
int nr_band = 20;
|
||||||
float expected_power = 23 - (1.5 / 2);
|
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
|
// Outer PRB, MPR = 3, no delta MPR
|
||||||
prb_start = 0;
|
prb_start = 0;
|
||||||
expected_power = 23 - (3.0 / 2);
|
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
|
// Outer PRB on band 28, MPR = 3, delta MPR = 0.5 dB
|
||||||
N_RB_UL = 78;
|
N_RB_UL = 78;
|
||||||
nr_band = 28;
|
nr_band = 28;
|
||||||
expected_power = 23 - ((3.0 + 0.5) / 2);
|
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)
|
TEST(test_pcmax, test_not_implemented)
|
||||||
{
|
{
|
||||||
int N_RB_UL = 51;
|
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)
|
TEST(test_pcmax, test_pucch_max_power)
|
||||||
@@ -69,11 +70,11 @@ TEST(test_pcmax, test_pucch_max_power)
|
|||||||
int prb_start = 0;
|
int prb_start = 0;
|
||||||
int N_RB_UL = 51; // 10Mhz
|
int N_RB_UL = 51; // 10Mhz
|
||||||
float expected_power = 23 - (1.0 / 2);
|
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
|
// Other fromats, no transform precoding, MPR = 3
|
||||||
expected_power = 23 - (3.0 / 2);
|
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)
|
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;
|
pucch_Config.pucch_PowerControl = &power_config;
|
||||||
mac.G_b_f_c = 0;
|
mac.G_b_f_c = 0;
|
||||||
mac.pucch_power_control_initialized = true;
|
mac.pucch_power_control_initialized = true;
|
||||||
|
mac.frame_type = TDD;
|
||||||
|
|
||||||
int scs = 1;
|
int scs = 1;
|
||||||
int sum_delta_pucch = 3;
|
int sum_delta_pucch = 3;
|
||||||
@@ -102,8 +104,17 @@ TEST(test_pucch_power_state, test_accumulated_delta_pucch)
|
|||||||
int subframe_number = 0;
|
int subframe_number = 0;
|
||||||
int O_uci = 2;
|
int O_uci = 2;
|
||||||
uint16_t start_prb = 0;
|
uint16_t start_prb = 0;
|
||||||
int P_CMAX =
|
int P_CMAX = nr_get_Pcmax(23,
|
||||||
nr_get_Pcmax(23, mac.nr_band, FR1, 2, false, current_UL_BWP.scs, current_UL_BWP.BWPSize, false, nb_of_prbs, start_prb);
|
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,
|
int pucch_power_prev = get_pucch_tx_power_ue(&mac,
|
||||||
scs,
|
scs,
|
||||||
&pucch_Config,
|
&pucch_Config,
|
||||||
@@ -187,6 +198,7 @@ TEST(pusch_power_control, pusch_power_control_msg3)
|
|||||||
NR_PUSCH_PowerControl pusch_PowerControl = {0};
|
NR_PUSCH_PowerControl pusch_PowerControl = {0};
|
||||||
pusch_Config.pusch_PowerControl = &pusch_PowerControl;
|
pusch_Config.pusch_PowerControl = &pusch_PowerControl;
|
||||||
pusch_PowerControl.tpc_Accumulation = (long*)1;
|
pusch_PowerControl.tpc_Accumulation = (long*)1;
|
||||||
|
mac.frame_type = TDD;
|
||||||
|
|
||||||
// msg3 cofiguration as in 5g_rfsimulator testcase
|
// msg3 cofiguration as in 5g_rfsimulator testcase
|
||||||
int num_rb = 8;
|
int num_rb = 8;
|
||||||
@@ -201,7 +213,17 @@ TEST(pusch_power_control, pusch_power_control_msg3)
|
|||||||
int delta_pusch = 0;
|
int delta_pusch = 0;
|
||||||
bool is_rar_tx_retx = true;
|
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;
|
long preambleReceivedTargetPower = -96;
|
||||||
nr_rach_ConfigCommon.rach_ConfigGeneric.preambleReceivedTargetPower = preambleReceivedTargetPower;
|
nr_rach_ConfigCommon.rach_ConfigGeneric.preambleReceivedTargetPower = preambleReceivedTargetPower;
|
||||||
@@ -236,26 +258,24 @@ TEST(pusch_power_control, pusch_power_control_msg3)
|
|||||||
delta_pusch,
|
delta_pusch,
|
||||||
is_rar_tx_retx,
|
is_rar_tx_retx,
|
||||||
false);
|
false);
|
||||||
EXPECT_EQ(std::min(P_CMAX, power - 2), reduced_power)
|
EXPECT_EQ(std::min(P_CMAX, power - 2), reduced_power) << "Incorrect handling of preambleReceivedTargetPower";
|
||||||
<< "Incorrect handling of preambleReceivedTargetPower";
|
|
||||||
EXPECT_LT(reduced_power, P_CMAX) << "Power above P_CMAX";
|
EXPECT_LT(reduced_power, P_CMAX) << "Power above P_CMAX";
|
||||||
|
|
||||||
delta_pusch = 4;
|
delta_pusch = 4;
|
||||||
int increased_power = get_pusch_tx_power_ue(&mac,
|
int increased_power = get_pusch_tx_power_ue(&mac,
|
||||||
num_rb,
|
num_rb,
|
||||||
start_prb,
|
start_prb,
|
||||||
nb_symb_sch,
|
nb_symb_sch,
|
||||||
nb_dmrs_prb,
|
nb_dmrs_prb,
|
||||||
nb_ptrs_prb,
|
nb_ptrs_prb,
|
||||||
Qm,
|
Qm,
|
||||||
R,
|
R,
|
||||||
beta_offset_csi1,
|
beta_offset_csi1,
|
||||||
sum_bits_in_codeblocks,
|
sum_bits_in_codeblocks,
|
||||||
delta_pusch,
|
delta_pusch,
|
||||||
is_rar_tx_retx,
|
is_rar_tx_retx,
|
||||||
false);
|
false);
|
||||||
EXPECT_EQ(std::min(P_CMAX, reduced_power + delta_pusch), increased_power)
|
EXPECT_EQ(std::min(P_CMAX, reduced_power + delta_pusch), increased_power) << "delta_pusch should increase tx power";
|
||||||
<< "delta_pusch should increase tx power";
|
|
||||||
EXPECT_LT(increased_power, P_CMAX) << "Power above P_CMAX";
|
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};
|
NR_RACH_ConfigCommon_t nr_rach_ConfigCommon = {0};
|
||||||
current_UL_BWP.rach_ConfigCommon = &nr_rach_ConfigCommon;
|
current_UL_BWP.rach_ConfigCommon = &nr_rach_ConfigCommon;
|
||||||
mac.nr_band = 78;
|
mac.nr_band = 78;
|
||||||
|
mac.frame_type = TDD;
|
||||||
|
|
||||||
bool is_rar_tx_retx = false;
|
bool is_rar_tx_retx = false;
|
||||||
int num_rb = 5;
|
int num_rb = 5;
|
||||||
@@ -291,7 +312,17 @@ TEST(pusch_power_control, pusch_power_data)
|
|||||||
current_UL_BWP.p0_NominalWithGrant = &p0_NominalWithGrant;
|
current_UL_BWP.p0_NominalWithGrant = &p0_NominalWithGrant;
|
||||||
pusch_PowerControl.deltaMCS = (long*)1;
|
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,
|
int power = get_pusch_tx_power_ue(&mac,
|
||||||
num_rb,
|
num_rb,
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
|
|||||||
temp_tda,
|
temp_tda,
|
||||||
tdaList->list.count);
|
tdaList->list.count);
|
||||||
int K2 = get_K2(tdaList, temp_tda, mu, scc);
|
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 sched_slot = (slot + K2) % nr_slots_per_frame[mu];
|
||||||
const int tda = get_ul_tda(nr_mac, scc, sched_frame, sched_slot);
|
const int tda = get_ul_tda(nr_mac, scc, sched_frame, sched_slot);
|
||||||
if (tda < 0)
|
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)
|
if (!tda_info.valid_tda)
|
||||||
return false;
|
return false;
|
||||||
sched_ctrl->sched_pusch.tda_info = tda_info;
|
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);
|
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];
|
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) {
|
for (int i = rbStart; i < rbStart + rbSize; ++i) {
|
||||||
|
|||||||
@@ -390,7 +390,7 @@ static int nr_process_mac_pdu(instance_t module_idP,
|
|||||||
// fixed length
|
// fixed length
|
||||||
mac_subheader_len = 1;
|
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
|
// RRCResumeRequest1 message includes the full I-RNTI and has a size of 8 bytes
|
||||||
mac_len = 8;
|
mac_len = 8;
|
||||||
|
|
||||||
@@ -615,6 +615,26 @@ void handle_nr_ul_harq(const int CC_idP,
|
|||||||
NR_SCHED_UNLOCK(&nrmac->sched_lock);
|
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
|
* 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
|
#endif
|
||||||
|
|
||||||
if (sduP != NULL){
|
if (sduP != NULL) {
|
||||||
LOG_D(NR_MAC, "Received PDU at MAC gNB \n");
|
LOG_D(NR_MAC, "Received PDU at MAC gNB \n");
|
||||||
|
|
||||||
UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt = 0;
|
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 {
|
else {
|
||||||
NR_UE_ul_harq_t *cur_harq = &UE_scheduling_control->ul_harq_processes[harq_pid];
|
NR_UE_ul_harq_t *cur_harq = &UE_scheduling_control->ul_harq_processes[harq_pid];
|
||||||
/* reduce sched_ul_bytes when cur_harq->round == 3 */
|
/* 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;
|
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;
|
UE_scheduling_control->sched_ul_bytes -= tb_size;
|
||||||
if (UE_scheduling_control->sched_ul_bytes < 0)
|
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);
|
nr_mac_trigger_ul_failure(&UE->UE_sched_ctrl, UE->current_UL_BWP.scs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(sduP) {
|
} else if (sduP) {
|
||||||
|
|
||||||
bool no_sig = true;
|
bool no_sig = true;
|
||||||
for (int k = 0; k < sdu_lenP; k++) {
|
for (int k = 0; k < sdu_lenP; k++) {
|
||||||
if(sduP[k]!=0) {
|
if(sduP[k] != 0) {
|
||||||
no_sig = false;
|
no_sig = false;
|
||||||
break;
|
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(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_INT(rntiP), T_INT(frameP), T_INT(slotP), T_INT(-1) /* harq_pid */,
|
||||||
T_BUFFER(sduP, sdu_lenP));
|
T_BUFFER(sduP, sdu_lenP));
|
||||||
@@ -774,8 +790,8 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (no_sig) {
|
if (no_sig) {
|
||||||
LOG_D(NR_MAC, "Random Access %i failed at state %s (no signal)\n", i, nrra_text[ra->ra_state]);
|
LOG_W(NR_MAC, "Random Access %i ULSCH with no signal\n", i);
|
||||||
nr_clear_ra_proc(ra);
|
handle_msg3_failed_rx(ra, i, gNB_mac->ul_bler.harq_round_max);
|
||||||
continue;
|
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))
|
if( (frameP!=ra->Msg3_frame) || (slotP!=ra->Msg3_slot))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// for CFRA (NSA) do not schedule retransmission of msg3
|
handle_msg3_failed_rx(ra, i, gNB_mac->ul_bler.harq_round_max);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1938,7 +1938,7 @@ static void pf_ul(module_id_t module_id,
|
|||||||
UEsched_t *iterator=UE_sched;
|
UEsched_t *iterator=UE_sched;
|
||||||
|
|
||||||
/* Loop UE_sched to find max coeff and allocate transmission */
|
/* 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;
|
NR_UE_sched_ctrl_t *sched_ctrl = &iterator->UE->UE_sched_ctrl;
|
||||||
int CCEIndex = get_cce_index(nrmac,
|
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);
|
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];
|
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)
|
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",
|
"%d.%d future UL_tti_req's frame.slot %d.%d does not match PUSCH %d.%d\n",
|
||||||
frame, slot,
|
frame, slot,
|
||||||
future_ul_tti_req->SFN,
|
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));
|
memset(pusch_pdu, 0, sizeof(nfapi_nr_pusch_pdu_t));
|
||||||
future_ul_tti_req->n_pdus += 1;
|
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,
|
LOG_D(NR_MAC,
|
||||||
sched_pusch->frame,sched_pusch->slot,future_ul_tti_req->SFN,future_ul_tti_req->Slot);
|
"%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->pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA;
|
||||||
pusch_pdu->rnti = rnti;
|
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
|
* will output the packets at a local interface, which is in line with
|
||||||
* the noS1 mode. Hence, below, we simply hardcode ENB_FLAG_NO */
|
* the noS1 mode. Hence, below, we simply hardcode ENB_FLAG_NO */
|
||||||
// setup PDCP, RLC
|
// 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);
|
nr_rlc_add_drb(0x1234, rbconfig->drb_ToAddModList->list.array[0]->drb_Identity, rlc_rbconfig);
|
||||||
|
|
||||||
// free memory
|
// 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
|
// create PDCP bearers. This will also create SDAP bearers
|
||||||
NR_DRB_ToAddModList_t DRB_configList = {0};
|
NR_DRB_ToAddModList_t DRB_configList = {0};
|
||||||
fill_DRB_configList_e1(&DRB_configList, req_pdu);
|
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
|
nr_pdcp_add_drbs(true, // set this to notify PDCP that his not UE
|
||||||
cu_up_ue_id,
|
cu_up_ue_id,
|
||||||
&DRB_configList,
|
&DRB_configList,
|
||||||
(req->integrityProtectionAlgorithm << 4) | req->cipheringAlgorithm,
|
&security_parameters);
|
||||||
(uint8_t *)req->encryptionKey,
|
|
||||||
(uint8_t *)req->integrityProtectionKey);
|
|
||||||
|
|
||||||
if (f1inst >= 0) { /* we have F1(-U) */
|
if (f1inst >= 0) { /* we have F1(-U) */
|
||||||
teid_t dummy_teid = 0xffff; // we will update later with answer from DU
|
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
|
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;
|
modified->id = to_modif->id;
|
||||||
|
|
||||||
if (to_modif->pdcp_config.pDCP_Reestablishment) {
|
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?
|
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 */
|
/* may be called several times, take care to clean previous settings */
|
||||||
static void nr_pdcp_entity_set_security(nr_pdcp_entity_t *entity,
|
static void nr_pdcp_entity_set_security(struct nr_pdcp_entity_t *entity,
|
||||||
int integrity_algorithm,
|
const nr_pdcp_entity_security_keys_and_algos_t *parameters)
|
||||||
char *integrity_key,
|
|
||||||
int ciphering_algorithm,
|
|
||||||
char *ciphering_key)
|
|
||||||
{
|
{
|
||||||
if (integrity_algorithm != -1)
|
if (parameters->integrity_algorithm != -1) {
|
||||||
entity->integrity_algorithm = integrity_algorithm;
|
entity->security_keys_and_algos.integrity_algorithm = parameters->integrity_algorithm;
|
||||||
if (ciphering_algorithm != -1)
|
memcpy(entity->security_keys_and_algos.integrity_key, parameters->integrity_key, NR_K_KEY_SIZE);
|
||||||
entity->ciphering_algorithm = ciphering_algorithm;
|
}
|
||||||
if (integrity_key != NULL)
|
if (parameters->ciphering_algorithm != -1) {
|
||||||
memcpy(entity->integrity_key, integrity_key, 16);
|
entity->security_keys_and_algos.ciphering_algorithm = parameters->ciphering_algorithm;
|
||||||
if (ciphering_key != NULL)
|
memcpy(entity->security_keys_and_algos.ciphering_key, parameters->ciphering_key, NR_K_KEY_SIZE);
|
||||||
memcpy(entity->ciphering_key, ciphering_key, 16);
|
}
|
||||||
|
|
||||||
if (integrity_algorithm == 0) {
|
if (parameters->integrity_algorithm == 0) {
|
||||||
entity->has_integrity = 0;
|
entity->has_integrity = 0;
|
||||||
if (entity->free_integrity != NULL)
|
if (entity->free_integrity != NULL)
|
||||||
entity->free_integrity(entity->integrity_context);
|
entity->free_integrity(entity->integrity_context);
|
||||||
entity->free_integrity = NULL;
|
entity->free_integrity = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (integrity_algorithm != 0 && integrity_algorithm != -1) {
|
if (parameters->integrity_algorithm != 0 && parameters->integrity_algorithm != -1) {
|
||||||
entity->has_integrity = 1;
|
entity->has_integrity = 1;
|
||||||
if (entity->free_integrity != NULL)
|
if (entity->free_integrity != NULL)
|
||||||
entity->free_integrity(entity->integrity_context);
|
entity->free_integrity(entity->integrity_context);
|
||||||
if (integrity_algorithm == 2) {
|
if (parameters->integrity_algorithm == 2) {
|
||||||
entity->integrity_context = nr_pdcp_integrity_nia2_init(entity->integrity_key);
|
entity->integrity_context = nr_pdcp_integrity_nia2_init(entity->security_keys_and_algos.integrity_key);
|
||||||
entity->integrity = nr_pdcp_integrity_nia2_integrity;
|
entity->integrity = nr_pdcp_integrity_nia2_integrity;
|
||||||
entity->free_integrity = nr_pdcp_integrity_nia2_free_integrity;
|
entity->free_integrity = nr_pdcp_integrity_nia2_free_integrity;
|
||||||
} else if (integrity_algorithm == 1) {
|
} else if (parameters->integrity_algorithm == 1) {
|
||||||
entity->integrity_context = nr_pdcp_integrity_nia1_init(entity->integrity_key);
|
entity->integrity_context = nr_pdcp_integrity_nia1_init(entity->security_keys_and_algos.integrity_key);
|
||||||
entity->integrity = nr_pdcp_integrity_nia1_integrity;
|
entity->integrity = nr_pdcp_integrity_nia1_integrity;
|
||||||
entity->free_integrity = nr_pdcp_integrity_nia1_free_integrity;
|
entity->free_integrity = nr_pdcp_integrity_nia1_free_integrity;
|
||||||
} else {
|
} 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;
|
entity->has_ciphering = 0;
|
||||||
if (entity->free_security != NULL)
|
if (entity->free_security != NULL)
|
||||||
entity->free_security(entity->security_context);
|
entity->free_security(entity->security_context);
|
||||||
entity->free_security = NULL;
|
entity->free_security = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ciphering_algorithm != 0 && ciphering_algorithm != -1) {
|
if (parameters->ciphering_algorithm != 0 && parameters->ciphering_algorithm != -1) {
|
||||||
if (ciphering_algorithm != 2) {
|
if (parameters->ciphering_algorithm != 2) {
|
||||||
LOG_E(PDCP, "FATAL: only nea2 supported for the moment\n");
|
LOG_E(PDCP, "FATAL: only nea2 supported for the moment\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
entity->has_ciphering = 1;
|
entity->has_ciphering = 1;
|
||||||
if (entity->free_security != NULL)
|
if (entity->free_security != NULL)
|
||||||
entity->free_security(entity->security_context);
|
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->cipher = nr_pdcp_security_nea2_cipher;
|
||||||
entity->free_security = nr_pdcp_security_nea2_free_security;
|
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
|
* @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
|
* @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 */
|
/* transmitting entity procedures */
|
||||||
/* todo: deal with ciphering/integrity algos and keys */
|
/* do nothing */
|
||||||
|
|
||||||
/* receiving entity procedures */
|
/* 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 */
|
/* Flag PDCP entity as re-established */
|
||||||
entity->entity_suspended = false;
|
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 */
|
/* transmitting entity procedures */
|
||||||
entity->tx_next = 0;
|
entity->tx_next = 0;
|
||||||
/* todo: deal with ciphering/integrity algos and keys */
|
|
||||||
|
|
||||||
/* receiving entity procedures */
|
/* receiving entity procedures */
|
||||||
/* deliver all SDUs if t_reordering is running */
|
/* 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 */
|
/* set rx_next and rx_deliv to the initial value */
|
||||||
entity->rx_next = 0;
|
entity->rx_next = 0;
|
||||||
entity->rx_deliv = 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 */
|
/* Flag PDCP entity as re-established */
|
||||||
entity->entity_suspended = false;
|
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 */
|
/* transmitting entity procedures */
|
||||||
entity->tx_next = 0;
|
entity->tx_next = 0;
|
||||||
/* todo: deal with ciphering/integrity algos and keys */
|
|
||||||
|
|
||||||
/* receiving entity procedures */
|
/* receiving entity procedures */
|
||||||
free_rx_list(entity);
|
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 */
|
/* set rx_next and rx_deliv to the initial value */
|
||||||
entity->rx_next = 0;
|
entity->rx_next = 0;
|
||||||
entity->rx_deliv = 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 */
|
/* Flag PDCP entity as re-established */
|
||||||
entity->entity_suspended = false;
|
entity->entity_suspended = false;
|
||||||
@@ -606,10 +611,7 @@ nr_pdcp_entity_t *new_nr_pdcp_entity(
|
|||||||
int sn_size,
|
int sn_size,
|
||||||
int t_reordering,
|
int t_reordering,
|
||||||
int discard_timer,
|
int discard_timer,
|
||||||
int ciphering_algorithm,
|
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||||
int integrity_algorithm,
|
|
||||||
unsigned char *ciphering_key,
|
|
||||||
unsigned char *integrity_key)
|
|
||||||
{
|
{
|
||||||
nr_pdcp_entity_t *ret;
|
nr_pdcp_entity_t *ret;
|
||||||
|
|
||||||
@@ -663,9 +665,7 @@ nr_pdcp_entity_t *new_nr_pdcp_entity(
|
|||||||
|
|
||||||
ret->is_gnb = is_gnb;
|
ret->is_gnb = is_gnb;
|
||||||
|
|
||||||
nr_pdcp_entity_set_security(ret,
|
nr_pdcp_entity_set_security(ret, security_parameters);
|
||||||
integrity_algorithm, (char *)integrity_key,
|
|
||||||
ciphering_algorithm, (char *)ciphering_key);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,6 +48,13 @@ typedef enum {
|
|||||||
NR_PDCP_SRB
|
NR_PDCP_SRB
|
||||||
} nr_pdcp_entity_type_t;
|
} 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 {
|
typedef struct {
|
||||||
//nr_pdcp_entity_type_t mode;
|
//nr_pdcp_entity_type_t mode;
|
||||||
/* PDU stats */
|
/* PDU stats */
|
||||||
@@ -91,19 +98,15 @@ typedef struct nr_pdcp_entity_t {
|
|||||||
void (*delete_entity)(struct nr_pdcp_entity_t *entity);
|
void (*delete_entity)(struct nr_pdcp_entity_t *entity);
|
||||||
void (*release_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 (*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);
|
void (*get_stats)(struct nr_pdcp_entity_t *entity, nr_pdcp_statistics_t *out);
|
||||||
|
|
||||||
/* set_security: pass -1 to integrity_algorithm / ciphering_algorithm
|
/* set_security: pass -1 to parameters->integrity_algorithm / parameters->ciphering_algorithm
|
||||||
* to keep the current algorithm
|
* to keep the corresponding current algorithm and key
|
||||||
* pass NULL to integrity_key / ciphering_key
|
|
||||||
* to keep the current key
|
|
||||||
*/
|
*/
|
||||||
void (*set_security)(struct nr_pdcp_entity_t *entity,
|
void (*set_security)(struct nr_pdcp_entity_t *entity,
|
||||||
int integrity_algorithm,
|
const nr_pdcp_entity_security_keys_and_algos_t *parameters);
|
||||||
char *integrity_key,
|
|
||||||
int ciphering_algorithm,
|
|
||||||
char *ciphering_key);
|
|
||||||
|
|
||||||
/* check_integrity is used by RRC */
|
/* check_integrity is used by RRC */
|
||||||
bool (*check_integrity)(struct nr_pdcp_entity_t *entity,
|
bool (*check_integrity)(struct nr_pdcp_entity_t *entity,
|
||||||
@@ -148,10 +151,7 @@ typedef struct nr_pdcp_entity_t {
|
|||||||
/* security */
|
/* security */
|
||||||
int has_ciphering;
|
int has_ciphering;
|
||||||
int has_integrity;
|
int has_integrity;
|
||||||
int ciphering_algorithm;
|
nr_pdcp_entity_security_keys_and_algos_t security_keys_and_algos;
|
||||||
int integrity_algorithm;
|
|
||||||
unsigned char ciphering_key[16];
|
|
||||||
unsigned char integrity_key[16];
|
|
||||||
stream_security_context_t *security_context;
|
stream_security_context_t *security_context;
|
||||||
void (*cipher)(stream_security_context_t *security_context,
|
void (*cipher)(stream_security_context_t *security_context,
|
||||||
unsigned char *buffer, int length,
|
unsigned char *buffer, int length,
|
||||||
@@ -196,10 +196,7 @@ nr_pdcp_entity_t *new_nr_pdcp_entity(
|
|||||||
int sn_size,
|
int sn_size,
|
||||||
int t_reordering,
|
int t_reordering,
|
||||||
int discard_timer,
|
int discard_timer,
|
||||||
int ciphering_algorithm,
|
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters);
|
||||||
int integrity_algorithm,
|
|
||||||
unsigned char *ciphering_key,
|
|
||||||
unsigned char *integrity_key);
|
|
||||||
|
|
||||||
/* Get maximum PDCP PDU size */
|
/* Get maximum PDCP PDU size */
|
||||||
int nr_max_pdcp_pdu_size(sdu_size_t sdu_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,
|
void add_srb(int is_gnb,
|
||||||
ue_id_t UEid,
|
ue_id_t UEid,
|
||||||
struct NR_SRB_ToAddMod *s,
|
struct NR_SRB_ToAddMod *s,
|
||||||
int ciphering_algorithm,
|
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||||
int integrity_algorithm,
|
|
||||||
unsigned char *ciphering_key,
|
|
||||||
unsigned char *integrity_key)
|
|
||||||
{
|
{
|
||||||
nr_pdcp_entity_t *pdcp_srb;
|
nr_pdcp_entity_t *pdcp_srb;
|
||||||
nr_pdcp_ue_t *ue;
|
nr_pdcp_ue_t *ue;
|
||||||
@@ -829,10 +826,7 @@ void add_srb(int is_gnb,
|
|||||||
SHORT_SN_SIZE,
|
SHORT_SN_SIZE,
|
||||||
t_Reordering,
|
t_Reordering,
|
||||||
-1,
|
-1,
|
||||||
ciphering_algorithm,
|
security_parameters);
|
||||||
integrity_algorithm,
|
|
||||||
ciphering_key,
|
|
||||||
integrity_key);
|
|
||||||
nr_pdcp_ue_add_srb_pdcp_entity(ue, srb_id, pdcp_srb);
|
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);
|
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,
|
void add_drb(int is_gnb,
|
||||||
ue_id_t UEid,
|
ue_id_t UEid,
|
||||||
struct NR_DRB_ToAddMod *s,
|
struct NR_DRB_ToAddMod *s,
|
||||||
int ciphering_algorithm,
|
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||||
int integrity_algorithm,
|
|
||||||
unsigned char *ciphering_key,
|
|
||||||
unsigned char *integrity_key)
|
|
||||||
{
|
{
|
||||||
nr_pdcp_entity_t *pdcp_drb;
|
nr_pdcp_entity_t *pdcp_drb;
|
||||||
nr_pdcp_ue_t *ue;
|
nr_pdcp_ue_t *ue;
|
||||||
@@ -910,6 +901,10 @@ void add_drb(int is_gnb,
|
|||||||
exit(1);
|
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);
|
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||||
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, UEid);
|
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,
|
deliver_pdu_drb_gnb : deliver_pdu_drb_ue,
|
||||||
ue,
|
ue,
|
||||||
sn_size_dl, t_reordering, discard_timer,
|
sn_size_dl, t_reordering, discard_timer,
|
||||||
has_ciphering ? ciphering_algorithm : 0,
|
&actual_security_parameters);
|
||||||
has_integrity ? integrity_algorithm : 0,
|
|
||||||
has_ciphering ? ciphering_key : NULL,
|
|
||||||
has_integrity ? integrity_key : NULL);
|
|
||||||
nr_pdcp_ue_add_drb_pdcp_entity(ue, drb_id, pdcp_drb);
|
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);
|
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,
|
void nr_pdcp_add_srbs(eNB_flag_t enb_flag,
|
||||||
ue_id_t UEid,
|
ue_id_t UEid,
|
||||||
NR_SRB_ToAddModList_t *const srb2add_list,
|
NR_SRB_ToAddModList_t *const srb2add_list,
|
||||||
const uint8_t security_modeP,
|
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||||
uint8_t *const kRRCenc,
|
|
||||||
uint8_t *const kRRCint)
|
|
||||||
{
|
{
|
||||||
if (srb2add_list != NULL) {
|
if (srb2add_list != NULL) {
|
||||||
for (int i = 0; i < srb2add_list->list.count; i++) {
|
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
|
} else
|
||||||
LOG_W(PDCP, "nr_pdcp_add_srbs() with void list\n");
|
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,
|
void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
|
||||||
ue_id_t UEid,
|
ue_id_t UEid,
|
||||||
NR_DRB_ToAddModList_t *const drb2add_list,
|
NR_DRB_ToAddModList_t *const drb2add_list,
|
||||||
const uint8_t security_modeP,
|
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters)
|
||||||
uint8_t *const kUPenc,
|
|
||||||
uint8_t *const kUPint)
|
|
||||||
{
|
{
|
||||||
if (drb2add_list != NULL) {
|
if (drb2add_list != NULL) {
|
||||||
for (int i = 0; i < drb2add_list->list.count; i++) {
|
for (int i = 0; i < drb2add_list->list.count; i++) {
|
||||||
add_drb(enb_flag,
|
add_drb(enb_flag,
|
||||||
UEid,
|
UEid,
|
||||||
drb2add_list->list.array[i],
|
drb2add_list->list.array[i],
|
||||||
security_modeP & 0x0f,
|
security_parameters);
|
||||||
(security_modeP >> 4) & 0x0f,
|
|
||||||
kUPenc,
|
|
||||||
kUPint);
|
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
LOG_W(PDCP, "nr_pdcp_add_drbs() with void list\n");
|
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,
|
void nr_pdcp_config_set_security(ue_id_t ue_id,
|
||||||
const rb_id_t rb_id,
|
rb_id_t rb_id,
|
||||||
const uint8_t security_modeP,
|
bool is_srb,
|
||||||
uint8_t *const kRRCenc_pP,
|
const nr_pdcp_entity_security_keys_and_algos_t *parameters)
|
||||||
uint8_t *const kRRCint_pP,
|
|
||||||
uint8_t *const kUPenc_pP)
|
|
||||||
{
|
{
|
||||||
nr_pdcp_ue_t *ue;
|
nr_pdcp_ue_t *ue;
|
||||||
nr_pdcp_entity_t *rb;
|
nr_pdcp_entity_t *rb;
|
||||||
int integrity_algorithm;
|
|
||||||
int ciphering_algorithm;
|
|
||||||
|
|
||||||
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||||
|
|
||||||
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id);
|
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, is_srb);
|
||||||
|
|
||||||
rb = nr_pdcp_get_rb(ue, rb_id, true);
|
|
||||||
|
|
||||||
if (rb == NULL) {
|
if (rb == NULL) {
|
||||||
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
integrity_algorithm = (security_modeP>>4) & 0xf;
|
rb->set_security(rb, parameters);
|
||||||
ciphering_algorithm = security_modeP & 0x0f;
|
|
||||||
rb->set_security(rb, integrity_algorithm, (char *)kRRCint_pP,
|
|
||||||
ciphering_algorithm, (char *)kRRCenc_pP);
|
|
||||||
|
|
||||||
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
|
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);
|
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_ue_t *ue;
|
||||||
nr_pdcp_entity_t *rb;
|
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) {
|
if (rb != NULL) {
|
||||||
LOG_D(PDCP, "UE %4.4lx re-establishment of %sRB %d\n", ue_id, srb_flag ? "S" : "D", rb_id);
|
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);
|
LOG_I(PDCP, "%s %d re-established\n", srb_flag ? "SRB" : "DRB" , rb_id);
|
||||||
} else {
|
} else {
|
||||||
LOG_W(PDCP, "UE %4.4lx cannot re-establish %sRB %d, RB not found\n", ue_id, srb_flag ? "S" : "D", rb_id);
|
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,
|
void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
|
||||||
ue_id_t UEid,
|
ue_id_t UEid,
|
||||||
NR_DRB_ToAddModList_t *const drb2add_list,
|
NR_DRB_ToAddModList_t *const drb2add_list,
|
||||||
const uint8_t security_modeP,
|
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters);
|
||||||
uint8_t *const kUPenc,
|
|
||||||
uint8_t *const kUPint);
|
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,
|
void add_drb(int is_gnb,
|
||||||
ue_id_t UEid,
|
ue_id_t UEid,
|
||||||
struct NR_DRB_ToAddMod *s,
|
struct NR_DRB_ToAddMod *s,
|
||||||
int ciphering_algorithm,
|
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters);
|
||||||
int integrity_algorithm,
|
|
||||||
unsigned char *ciphering_key,
|
|
||||||
unsigned char *integrity_key);
|
|
||||||
|
|
||||||
void nr_pdcp_remove_UE(ue_id_t ue_id);
|
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_srb(ue_id_t ue_id, int srb_id);
|
||||||
void nr_pdcp_suspend_drb(ue_id_t ue_id, int drb_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_srb(ue_id_t ue_id, int srb_id);
|
||||||
void nr_pdcp_release_drb(ue_id_t ue_id, int drb_id);
|
void nr_pdcp_release_drb(ue_id_t ue_id, int drb_id);
|
||||||
|
|
||||||
|
|
||||||
void add_srb(int is_gnb,
|
void add_srb(int is_gnb,
|
||||||
ue_id_t UEid,
|
ue_id_t UEid,
|
||||||
struct NR_SRB_ToAddMod *s,
|
struct NR_SRB_ToAddMod *s,
|
||||||
int ciphering_algorithm,
|
const nr_pdcp_entity_security_keys_and_algos_t *security_parameters);
|
||||||
int integrity_algorithm,
|
|
||||||
unsigned char *ciphering_key,
|
|
||||||
unsigned char *integrity_key);
|
|
||||||
|
|
||||||
void nr_pdcp_config_set_security(ue_id_t ue_id,
|
void nr_pdcp_config_set_security(ue_id_t ue_id,
|
||||||
const rb_id_t rb_id,
|
rb_id_t rb_id,
|
||||||
const uint8_t security_modeP,
|
bool is_srb,
|
||||||
uint8_t *const kRRCenc_pP,
|
const nr_pdcp_entity_security_keys_and_algos_t *parameters);
|
||||||
uint8_t *const kRRCint_pP,
|
|
||||||
uint8_t *const kUPenc_pP);
|
|
||||||
|
|
||||||
bool nr_pdcp_check_integrity_srb(ue_id_t ue_id,
|
bool nr_pdcp_check_integrity_srb(ue_id_t ue_id,
|
||||||
int srb_id,
|
int srb_id,
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ void mac_rlc_data_ind(const module_id_t module_idP,
|
|||||||
num_tb_t num_tbP,
|
num_tb_t num_tbP,
|
||||||
crc_t *crcs_pP)
|
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__);
|
LOG_E(RLC, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,3 +36,6 @@ target_link_libraries(asn1_nr_rrc PUBLIC asn1_nr_rrc_hdrs)
|
|||||||
target_compile_options(asn1_nr_rrc
|
target_compile_options(asn1_nr_rrc
|
||||||
PRIVATE -DASN_DISABLE_OER_SUPPORT -w
|
PRIVATE -DASN_DISABLE_OER_SUPPORT -w
|
||||||
PUBLIC -DNR_RRC_VERSION=${NR_RRC_RELEASE})
|
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);
|
100);
|
||||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||||
enc_rval.failed_type->name, enc_rval.encoded);
|
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);
|
return((enc_rval.encoded+7)/8);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,7 +250,6 @@ int do_RRCReject(uint8_t *const buffer)
|
|||||||
asn_enc_rval_t enc_rval;
|
asn_enc_rval_t enc_rval;
|
||||||
NR_DL_CCCH_Message_t dl_ccch_msg;
|
NR_DL_CCCH_Message_t dl_ccch_msg;
|
||||||
NR_RRCReject_t *rrcReject;
|
NR_RRCReject_t *rrcReject;
|
||||||
NR_RejectWaitTime_t waitTime = 1;
|
|
||||||
|
|
||||||
memset((void *)&dl_ccch_msg, 0, sizeof(NR_DL_CCCH_Message_t));
|
memset((void *)&dl_ccch_msg, 0, sizeof(NR_DL_CCCH_Message_t));
|
||||||
dl_ccch_msg.message.present = NR_DL_CCCH_MessageType_PR_c1;
|
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 = CALLOC(1, sizeof(struct NR_RRCReject_IEs));
|
||||||
rrcReject->criticalExtensions.choice.rrcReject->waitTime = CALLOC(1, sizeof(NR_RejectWaitTime_t));
|
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.present = NR_RRCReject__criticalExtensions_PR_rrcReject;
|
||||||
rrcReject->criticalExtensions.choice.rrcReject->waitTime = &waitTime;
|
|
||||||
|
|
||||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||||
xer_fprint(stdout, &asn_DEF_NR_DL_CCCH_Message, (void *)&dl_ccch_msg);
|
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",
|
AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||||
enc_rval.failed_type->name, enc_rval.encoded);
|
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",
|
LOG_D(NR_RRC,"RRCReject Encoded %zd bits (%zd bytes)\n",
|
||||||
enc_rval.encoded,(enc_rval.encoded+7)/8);
|
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) ) {
|
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||||
xer_fprint(stdout, &asn_DEF_NR_UE_CapabilityRequestFilterNR, (void *)sa_band_filter);
|
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;
|
ue_capabilityrat_request->capabilityRequestFilter = req_freq;
|
||||||
|
|
||||||
@@ -843,6 +845,7 @@ int do_NR_RRCReconfigurationComplete_for_nsa(
|
|||||||
buffer_size);
|
buffer_size);
|
||||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||||
enc_rval.failed_type->name, enc_rval.encoded);
|
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);
|
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);
|
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);
|
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",
|
AssertFatal(encoded > 0,"ASN1 message encoding failed (%s, %ld)!\n",
|
||||||
"ULInformationTransfer",encoded);
|
"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);
|
LOG_D(NR_RRC,"ULInformationTransfer Encoded %zd bytes\n",encoded);
|
||||||
|
|
||||||
return encoded;
|
return encoded;
|
||||||
@@ -1004,6 +1009,9 @@ int do_RRCReestablishmentRequest(uint8_t *buffer,
|
|||||||
buffer,
|
buffer,
|
||||||
100);
|
100);
|
||||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded);
|
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);
|
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);
|
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",
|
AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||||
enc_rval.failed_type->name, enc_rval.encoded);
|
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);
|
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);
|
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);
|
buffer_size);
|
||||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded);
|
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);
|
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);
|
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)
|
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);
|
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;
|
pcch_msg.message.present = NR_PCCH_MessageType_PR_c1;
|
||||||
asn1cCalloc(pcch_msg.message.choice.c1, c1);
|
asn1cCalloc(pcch_msg.message.choice.c1, c1);
|
||||||
c1->present = NR_PCCH_MessageType__c1_PR_paging;
|
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);
|
Mod_id, c1->choice.paging->pagingRecordList->list.count);
|
||||||
asn_enc_rval_t enc_rval = uper_encode_to_buffer(
|
asn_enc_rval_t enc_rval = uper_encode_to_buffer(
|
||||||
&asn_DEF_NR_PCCH_Message, NULL, (void *)&pcch_msg, buffer, RRC_BUF_SIZE);
|
&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);
|
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_PCCH_Message, &pcch_msg);
|
||||||
if(enc_rval.encoded == -1) {
|
if(enc_rval.encoded == -1) {
|
||||||
LOG_I(NR_RRC, "[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
|
||||||
xer_fprint(stdout, &asn_DEF_NR_PCCH_Message, (void *)&pcch_msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
return((enc_rval.encoded+7)/8);
|
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,
|
void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p,
|
||||||
e1ap_bearer_setup_resp_t *e1ap_resp);
|
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);
|
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);
|
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;
|
srb->srb_Identity = srb_id;
|
||||||
|
|
||||||
if (srb_id == 1) {
|
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 {
|
} else {
|
||||||
uint8_t kRRCenc[NR_K_KEY_SIZE] = {0};
|
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||||
uint8_t kRRCint[NR_K_KEY_SIZE] = {0};
|
security_parameters.ciphering_algorithm = UE->ciphering_algorithm;
|
||||||
nr_derive_key(RRC_ENC_ALG, UE->ciphering_algorithm, UE->kgnb, kRRCenc);
|
security_parameters.integrity_algorithm = UE->integrity_algorithm;
|
||||||
nr_derive_key(RRC_INT_ALG, UE->integrity_algorithm, UE->kgnb, kRRCint);
|
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,
|
nr_pdcp_add_srbs(true,
|
||||||
UE->rrc_ue_id,
|
UE->rrc_ue_id,
|
||||||
list,
|
list,
|
||||||
(UE->integrity_algorithm << 4) | UE->ciphering_algorithm,
|
&security_parameters);
|
||||||
kRRCenc,
|
|
||||||
kRRCint);
|
|
||||||
}
|
}
|
||||||
freeSRBlist(list);
|
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 */
|
/* increase DRB to modify counter */
|
||||||
pdu_e1->numDRB2Modify += 1;
|
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) */
|
/* Send E1 Bearer Context Modification Request (3GPP TS 38.463) */
|
||||||
sctp_assoc_t assoc_id = get_existing_cuup_for_ue(rrc, ue_p);
|
sctp_assoc_t assoc_id = get_existing_cuup_for_ue(rrc, ue_p);
|
||||||
rrc->cucp_cuup.bearer_context_mod(assoc_id, &req);
|
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;
|
module_id_t module_id = 0;
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[module_id];
|
gNB_RRC_INST *rrc = RC.nrrrc[module_id];
|
||||||
int enable_ciphering = 0;
|
|
||||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||||
uint8_t buffer[RRC_BUF_SIZE] = {0};
|
uint8_t buffer[RRC_BUF_SIZE] = {0};
|
||||||
uint8_t xid = rrc_gNB_get_next_transaction_identifier(module_id);
|
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);
|
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 */
|
/* Ciphering and Integrity according to TS 33.501 */
|
||||||
uint8_t kRRCenc[NR_K_KEY_SIZE] = {0};
|
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||||
uint8_t kRRCint[NR_K_KEY_SIZE] = {0};
|
|
||||||
uint8_t kUPenc[NR_K_KEY_SIZE] = {0};
|
|
||||||
/* Derive the keys from kgnb */
|
/* Derive the keys from kgnb */
|
||||||
if (ue_p->Srb[1].Active)
|
nr_derive_key(RRC_ENC_ALG, ue_p->ciphering_algorithm, ue_p->kgnb, security_parameters.ciphering_key);
|
||||||
nr_derive_key(UP_ENC_ALG, ue_p->ciphering_algorithm, ue_p->kgnb, kUPenc);
|
nr_derive_key(RRC_INT_ALG, ue_p->integrity_algorithm, ue_p->kgnb, security_parameters.integrity_key);
|
||||||
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);
|
|
||||||
LOG_I(NR_RRC,
|
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->rrc_ue_id,
|
||||||
ue_p->rnti,
|
ue_p->rnti,
|
||||||
ue_p->ciphering_algorithm,
|
ue_p->ciphering_algorithm,
|
||||||
ue_p->integrity_algorithm);
|
ue_p->integrity_algorithm);
|
||||||
uint8_t security_mode =
|
/* RRCReestablishment is integrity protected but not ciphered,
|
||||||
enable_ciphering ? ue_p->ciphering_algorithm | (ue_p->integrity_algorithm << 4) : 0 | (ue_p->integrity_algorithm << 4);
|
* 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 */
|
/* SRBs */
|
||||||
for (int srb_id = 1; srb_id < NR_NUM_SRB; srb_id++) {
|
for (int srb_id = 1; srb_id < NR_NUM_SRB; srb_id++) {
|
||||||
if (ue_p->Srb[srb_id].Active)
|
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 */
|
/* 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 */
|
/* F1AP DL RRC Message Transfer */
|
||||||
f1_ue_data_t ue_data = cu_get_f1_ue_data(ue_p->rrc_ue_id);
|
f1_ue_data_t ue_data = cu_get_f1_ue_data(ue_p->rrc_ue_id);
|
||||||
RETURN_IF_INVALID_ASSOC_ID(ue_data);
|
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};
|
.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};
|
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);
|
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.
|
/// @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;
|
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];
|
gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
|
||||||
NR_CellGroupConfig_t *cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
|
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;
|
int srb_id = 2;
|
||||||
if (ue_p->Srb[srb_id].Active) {
|
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) */
|
/* PDCP Reestablishment of DRBs according to 5.3.5.6.5 of 3GPP TS 38.331 (over E1) */
|
||||||
cuup_notify_reestablishment(rrc, ue_p);
|
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.numPDUSessionsMod > 0);
|
||||||
DevAssert(req.numPDUSessions == 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
|
// 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);
|
sctp_assoc_t assoc_id = get_existing_cuup_for_ue(rrc, UE);
|
||||||
rrc->cucp_cuup.bearer_context_mod(assoc_id, &req);
|
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;
|
//uint8_t *k_kdf = NULL;
|
||||||
static int print_keys= 1;
|
static int print_keys= 1;
|
||||||
gNB_RRC_UE_t *UE = &ue_context_pP->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_pP->ue_context;
|
||||||
|
|
||||||
/* Derive the keys from kgnb */
|
/* Derive the keys from kgnb */
|
||||||
if (UE->Srb[1].Active || UE->Srb[2].Active) {
|
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||||
nr_derive_key(UP_ENC_ALG, UE->ciphering_algorithm, UE->kgnb, kUPenc);
|
/* set ciphering algorithm depending on 'enable_ciphering' */
|
||||||
}
|
security_parameters.ciphering_algorithm = enable_ciphering ? UE->ciphering_algorithm : 0;
|
||||||
|
security_parameters.integrity_algorithm = UE->integrity_algorithm;
|
||||||
nr_derive_key(RRC_ENC_ALG, UE->ciphering_algorithm, UE->kgnb, kRRCenc);
|
/* use current ciphering algorithm, independently of 'enable_ciphering' to derive ciphering key */
|
||||||
nr_derive_key(RRC_INT_ALG, UE->integrity_algorithm, UE->kgnb, kRRCint);
|
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 ( LOG_DUMPFLAG( DEBUG_SECURITY ) ) {
|
||||||
if (print_keys == 1 ) {
|
if (print_keys == 1 ) {
|
||||||
print_keys =0;
|
print_keys =0;
|
||||||
LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, UE->kgnb, 32, "\nKgNB:");
|
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, security_parameters.ciphering_key, 16,"\nKRRCenc:" );
|
||||||
LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, kRRCint, 16,"\nKRRCint:" );
|
LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, security_parameters.integrity_key, 16,"\nKRRCint:" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t security_mode =
|
nr_pdcp_config_set_security(ctxt_pP->rntiMaybeUEid, DCCH, true, &security_parameters);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@@ -199,6 +195,13 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ(
|
|||||||
// NGAP_NAS_FIRST_REQ (message_p).nas_pdu.length,
|
// NGAP_NAS_FIRST_REQ (message_p).nas_pdu.length,
|
||||||
// ue_context_pP);
|
// 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 */
|
/* Fill UE identities with available information */
|
||||||
if (UE->Initialue_identity_5g_s_TMSI.presence) {
|
if (UE->Initialue_identity_5g_s_TMSI.presence) {
|
||||||
/* Fill s-TMSI */
|
/* 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_set_id = req->ue_identity.guami.amf_set_id;
|
||||||
UE->ue_guami.amf_pointer = req->ue_identity.guami.amf_pointer;
|
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,
|
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",
|
"[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,
|
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_req_t create_tunnel_req;
|
||||||
gtpv1u_enb_create_tunnel_resp_t create_tunnel_resp;
|
gtpv1u_enb_create_tunnel_resp_t create_tunnel_resp;
|
||||||
protocol_ctxt_t ctxt={0};
|
protocol_ctxt_t ctxt={0};
|
||||||
uint8_t kUPenc[NR_K_KEY_SIZE] = {0};
|
nr_pdcp_entity_security_keys_and_algos_t security_parameters = {0};
|
||||||
uint8_t kUPint[NR_K_KEY_SIZE] = {0};
|
|
||||||
int i;
|
int i;
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
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);
|
LOG_I(RRC, "selecting integrity algorithm %d\n", UE->integrity_algorithm);
|
||||||
|
|
||||||
/* derive UP security key */
|
/* derive UP security key */
|
||||||
nr_derive_key(UP_ENC_ALG, UE->ciphering_algorithm, UE->kgnb, kUPenc);
|
security_parameters.ciphering_algorithm = UE->ciphering_algorithm;
|
||||||
nr_derive_key(UP_INT_ALG, UE->integrity_algorithm, UE->kgnb, kUPint);
|
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;
|
e_NR_CipheringAlgorithm cipher_algo;
|
||||||
switch (UE->ciphering_algorithm) {
|
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,
|
nr_pdcp_add_drbs(ctxt.enb_flag,
|
||||||
rrc_ue_id,
|
rrc_ue_id,
|
||||||
ue_context_p->ue_context.rb_config->drb_ToAddModList,
|
ue_context_p->ue_context.rb_config->drb_ToAddModList,
|
||||||
(ue_context_p->ue_context.integrity_algorithm << 4) | ue_context_p->ue_context.ciphering_algorithm,
|
&security_parameters);
|
||||||
kUPenc,
|
|
||||||
kUPint);
|
|
||||||
|
|
||||||
ctxt.rntiMaybeUEid = du_ue_id;
|
ctxt.rntiMaybeUEid = du_ue_id;
|
||||||
// assume only a single bearer
|
// 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);
|
nr_rrc_cellgroup_configuration(rrc, cellGroupConfig);
|
||||||
|
|
||||||
AssertFatal(!get_softmodem_params()->sa, "secondaryCellGroup only used in NSA for now\n");
|
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);
|
asn1cFreeStruc(asn_DEF_NR_CellGroupConfig, cellGroupConfig);
|
||||||
}
|
}
|
||||||
if (ie->measConfig != NULL) {
|
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);
|
nr_timer_start(&tac->T301);
|
||||||
int srb_id = 1;
|
int srb_id = 1;
|
||||||
// re-establish PDCP for SRB1
|
// 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
|
// re-establish RLC for SRB1
|
||||||
int lc_id = nr_rlc_get_lcid_from_rb(rrc->ue_id, true, 1);
|
int lc_id = nr_rlc_get_lcid_from_rb(rrc->ue_id, true, 1);
|
||||||
nr_rlc_reestablish_entity(rrc->ue_id, lc_id);
|
nr_rlc_reestablish_entity(rrc->ue_id, lc_id);
|
||||||
// apply the specified configuration defined in 9.2.1 for SRB1
|
// apply the specified configuration defined in 9.2.1 for SRB1
|
||||||
nr_rlc_reconfigure_entity(rrc->ue_id, lc_id, NULL);
|
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
|
// resume SRB1
|
||||||
rrc->Srb[srb_id] = RB_ESTABLISHED;
|
rrc->Srb[srb_id] = RB_ESTABLISHED;
|
||||||
break;
|
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;
|
ue_rrc->integrityProtAlgorithm = *securityConfigSMC->securityAlgorithmConfig.integrityProtAlgorithm;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t kRRCenc[NR_K_KEY_SIZE] = {0};
|
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||||
uint8_t kUPenc[NR_K_KEY_SIZE] = {0};
|
nr_derive_key(RRC_ENC_ALG, ue_rrc->cipheringAlgorithm, ue_rrc->kgnb, security_parameters.ciphering_key);
|
||||||
uint8_t kRRCint[NR_K_KEY_SIZE] = {0};
|
nr_derive_key(RRC_INT_ALG, ue_rrc->integrityProtAlgorithm, ue_rrc->kgnb, security_parameters.integrity_key);
|
||||||
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);
|
|
||||||
|
|
||||||
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 */
|
/* 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
|
// configure lower layers to apply SRB integrity protection and ciphering
|
||||||
for (int i = 1; i < NR_NUM_SRB; i++) {
|
for (int i = 1; i < NR_NUM_SRB; i++) {
|
||||||
if (ue_rrc->Srb[i] == RB_ESTABLISHED)
|
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};
|
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);
|
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_UL_DCCH_Message, &ul_dcch_msg);
|
||||||
|
|
||||||
/* disable both ciphering and integrity */
|
/* 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++) {
|
for (int i = 1; i < NR_NUM_SRB; i++) {
|
||||||
if (ue_rrc->Srb[i] == RB_ESTABLISHED)
|
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
|
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);
|
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 */
|
/* 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
|
// configure lower layers to apply SRB integrity protection and ciphering
|
||||||
for (int i = 1; i < NR_NUM_SRB; i++) {
|
for (int i = 1; i < NR_NUM_SRB; i++) {
|
||||||
if (ue_rrc->Srb[i] == RB_ESTABLISHED)
|
if (ue_rrc->Srb[i] == RB_ESTABLISHED)
|
||||||
/* pass NULL to keep current keys */
|
nr_pdcp_config_set_security(ue_rrc->ue_id, i, true, &security_parameters);
|
||||||
nr_pdcp_config_set_security(ue_rrc->ue_id, i, security_mode, NULL, NULL, NULL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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;
|
ue_rrc->Srb[3] = RB_NOT_PRESENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t kRRCenc[NR_K_KEY_SIZE] = {0};
|
nr_pdcp_entity_security_keys_and_algos_t security_rrc_parameters = {0};
|
||||||
uint8_t kRRCint[NR_K_KEY_SIZE] = {0};
|
nr_pdcp_entity_security_keys_and_algos_t security_up_parameters = {0};
|
||||||
uint8_t kUPenc[NR_K_KEY_SIZE] = {0};
|
|
||||||
uint8_t kUPint[NR_K_KEY_SIZE] = {0};
|
|
||||||
|
|
||||||
if (ue_rrc->as_security_activated) {
|
if (ue_rrc->as_security_activated) {
|
||||||
if (radioBearerConfig->securityConfig != NULL) {
|
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;
|
ue_rrc->integrityProtAlgorithm = *radioBearerConfig->securityConfig->securityAlgorithmConfig->integrityProtAlgorithm;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nr_derive_key(RRC_ENC_ALG, ue_rrc->cipheringAlgorithm, ue_rrc->kgnb, kRRCenc);
|
security_rrc_parameters.ciphering_algorithm = ue_rrc->cipheringAlgorithm;
|
||||||
nr_derive_key(RRC_INT_ALG, ue_rrc->integrityProtAlgorithm, ue_rrc->kgnb, kRRCint);
|
security_rrc_parameters.integrity_algorithm = ue_rrc->integrityProtAlgorithm;
|
||||||
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, security_rrc_parameters.ciphering_key);
|
||||||
nr_derive_key(UP_INT_ALG, ue_rrc->integrityProtAlgorithm, ue_rrc->kgnb, kUPint);
|
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) {
|
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,
|
add_srb(false,
|
||||||
ue_rrc->ue_id,
|
ue_rrc->ue_id,
|
||||||
radioBearerConfig->srb_ToAddModList->list.array[cnt],
|
radioBearerConfig->srb_ToAddModList->list.array[cnt],
|
||||||
ue_rrc->cipheringAlgorithm,
|
&security_rrc_parameters);
|
||||||
ue_rrc->integrityProtAlgorithm,
|
|
||||||
kRRCenc,
|
|
||||||
kRRCint);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
AssertFatal(srb->discardOnPDCP == NULL, "discardOnPDCP not yet implemented\n");
|
AssertFatal(srb->discardOnPDCP == NULL, "discardOnPDCP not yet implemented\n");
|
||||||
if (srb->reestablishPDCP) {
|
if (srb->reestablishPDCP) {
|
||||||
ue_rrc->Srb[srb->srb_Identity] = RB_ESTABLISHED;
|
ue_rrc->Srb[srb->srb_Identity] = RB_ESTABLISHED;
|
||||||
nr_pdcp_reestablishment(ue_rrc->ue_id, srb->srb_Identity, true);
|
nr_pdcp_reestablishment(ue_rrc->ue_id,
|
||||||
// TODO configure the PDCP entity to apply the integrity protection algorithm
|
srb->srb_Identity,
|
||||||
// TODO configure the PDCP entity to apply the ciphering algorithm
|
true,
|
||||||
|
&security_rrc_parameters);
|
||||||
}
|
}
|
||||||
if (srb->pdcp_Config && srb->pdcp_Config->t_Reordering)
|
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);
|
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 (get_DRB_status(ue_rrc, DRB_id) != RB_NOT_PRESENT) {
|
||||||
if (drb->reestablishPDCP) {
|
if (drb->reestablishPDCP) {
|
||||||
set_DRB_status(ue_rrc, DRB_id, RB_ESTABLISHED);
|
set_DRB_status(ue_rrc, DRB_id, RB_ESTABLISHED);
|
||||||
nr_pdcp_reestablishment(ue_rrc->ue_id, DRB_id, false);
|
/* get integrity and cipehring settings from radioBearerConfig */
|
||||||
// TODO configure the PDCP entity to apply the integrity protection algorithm
|
bool has_integrity = drb->pdcp_Config != NULL
|
||||||
// TODO configure the PDCP entity to apply the ciphering algorithm
|
&& 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");
|
AssertFatal(drb->recoverPDCP == NULL, "recoverPDCP not yet implemented\n");
|
||||||
/* sdap-Config is included (SA mode) */
|
/* 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,
|
add_drb(false,
|
||||||
ue_rrc->ue_id,
|
ue_rrc->ue_id,
|
||||||
radioBearerConfig->drb_ToAddModList->list.array[cnt],
|
radioBearerConfig->drb_ToAddModList->list.array[cnt],
|
||||||
ue_rrc->cipheringAlgorithm,
|
&security_up_parameters);
|
||||||
ue_rrc->integrityProtAlgorithm,
|
|
||||||
kUPenc,
|
|
||||||
kUPint);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // drb_ToAddModList //
|
} // 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
|
// 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);
|
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 RRCenc key associated with the previously configured cipheringAlgorithm
|
||||||
// derive the K RRCint and K UPint keys associated with the previously configured integrityProtAlgorithm
|
// derive the K RRCint key associated with the previously configured integrityProtAlgorithm
|
||||||
uint8_t kRRCenc[16] = {0};
|
nr_pdcp_entity_security_keys_and_algos_t security_parameters;
|
||||||
uint8_t kRRCint[16] = {0};
|
security_parameters.ciphering_algorithm = rrc->cipheringAlgorithm;
|
||||||
uint8_t kUPenc[16] = {0};
|
security_parameters.integrity_algorithm = rrc->integrityProtAlgorithm;
|
||||||
uint8_t kUPint[16] = {0};
|
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);
|
||||||
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);
|
|
||||||
|
|
||||||
// TODO request lower layers to verify the integrity protection of the RRCReestablishment message
|
// 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
|
// 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 integrity protection for SRB1
|
||||||
// configure lower layers to resume ciphering for SRB1
|
// configure lower layers to resume ciphering for SRB1
|
||||||
int srb_id = 1;
|
int srb_id = 1;
|
||||||
int security_mode = (rrc->integrityProtAlgorithm << 4)
|
nr_pdcp_config_set_security(rrc->ue_id, srb_id, true, &security_parameters);
|
||||||
| rrc->cipheringAlgorithm;
|
|
||||||
nr_pdcp_config_set_security(rrc->ue_id, srb_id, security_mode, kRRCenc, kRRCint, kUPenc);
|
|
||||||
|
|
||||||
// release the measurement gap configuration indicated by the measGapConfig, if configured
|
// release the measurement gap configuration indicated by the measGapConfig, if configured
|
||||||
rrcPerNB_t *rrcNB = rrc->perNB + gNB_index;
|
rrcPerNB_t *rrcNB = rrc->perNB + gNB_index;
|
||||||
|
|||||||
Reference in New Issue
Block a user