mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-21 00:20:30 +00:00
Compare commits
120 Commits
develop-ha
...
NRPPA_Proc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
871258876c | ||
|
|
ec86c2183e | ||
|
|
6ae38e12b1 | ||
|
|
3018fb6b8a | ||
|
|
1986ba04bc | ||
|
|
0a8f164713 | ||
|
|
e17f2b7c33 | ||
|
|
66e22217e5 | ||
|
|
fc43f9b495 | ||
|
|
40eb18c3f2 | ||
|
|
1ea42141dc | ||
|
|
6aa774c965 | ||
|
|
06dadb777b | ||
|
|
3ca7a75b26 | ||
|
|
996a0cfc7e | ||
|
|
2004295e36 | ||
|
|
f5978cf584 | ||
|
|
5fb6fc43ed | ||
|
|
f9f167f6ca | ||
|
|
2f13d17529 | ||
|
|
e440e34c49 | ||
|
|
55b4a49dfc | ||
|
|
42bb444029 | ||
|
|
b34d8db8db | ||
|
|
dbf367f805 | ||
|
|
27c00d949d | ||
|
|
344675c554 | ||
|
|
c77a50a38b | ||
|
|
a8ba89a212 | ||
|
|
a64a3cc480 | ||
|
|
ac977967a6 | ||
|
|
4e3c3f6251 | ||
|
|
c6055d9095 | ||
|
|
e48a3269ec | ||
|
|
a111d4b8c4 | ||
|
|
b014c10f36 | ||
|
|
d8747403f6 | ||
|
|
8a5d2f99b2 | ||
|
|
691442c91e | ||
|
|
98615c8cab | ||
|
|
e3a834cd79 | ||
|
|
a5fe4532ed | ||
|
|
24d3203cc5 | ||
|
|
e5e4deadfb | ||
|
|
ae21d9a97e | ||
|
|
7af01ea53a | ||
|
|
4bd63ff80b | ||
|
|
4b7f0a2617 | ||
|
|
38ce8f7bd1 | ||
|
|
54180d3478 | ||
|
|
d645536c83 | ||
|
|
3804e04ec1 | ||
|
|
2945cfcd79 | ||
|
|
118578e5b6 | ||
|
|
ef3e65e761 | ||
|
|
1a32d19fbb | ||
|
|
f47cba0989 | ||
|
|
687f8f3280 | ||
|
|
96bf4b97ed | ||
|
|
7e45d1febc | ||
|
|
6abfb42d56 | ||
|
|
de30588aec | ||
|
|
bf951fa58e | ||
|
|
2253bd41ba | ||
|
|
93fb95a7b7 | ||
|
|
ce082a5783 | ||
|
|
25a94bc27d | ||
|
|
4b3052b681 | ||
|
|
5b6b34b2a0 | ||
|
|
f6dca65fb4 | ||
|
|
64d9c357da | ||
|
|
6ee8a03410 | ||
|
|
b8e604f437 | ||
|
|
ab0ad109db | ||
|
|
8ce6142bd3 | ||
|
|
80fcc5bd28 | ||
|
|
c5166cb371 | ||
|
|
fe1edff004 | ||
|
|
ae8c83ec3f | ||
|
|
3a104244e3 | ||
|
|
a0507f813d | ||
|
|
85d6aa688e | ||
|
|
c1ed908ead | ||
|
|
3490555fe6 | ||
|
|
aab1927897 | ||
|
|
0b8e43f593 | ||
|
|
d484d449c9 | ||
|
|
c2fdd7b7db | ||
|
|
d044d64515 | ||
|
|
c1b1cf0c61 | ||
|
|
0e21a2d158 | ||
|
|
759944972d | ||
|
|
8e9eee6830 | ||
|
|
2154b7c3d1 | ||
|
|
08f0a4e487 | ||
|
|
bf0b07a3a6 | ||
|
|
733ae7d5cf | ||
|
|
33dc414070 | ||
|
|
59686c7478 | ||
|
|
4b6ca17257 | ||
|
|
50e23f658f | ||
|
|
da1c713245 | ||
|
|
7dbfeead33 | ||
|
|
2a3152cbf5 | ||
|
|
b608d9f009 | ||
|
|
96d0f78cfc | ||
|
|
188d8e4eb5 | ||
|
|
fc74d80376 | ||
|
|
eb101af518 | ||
|
|
3d4554eec2 | ||
|
|
c889c83084 | ||
|
|
4baaef39c5 | ||
|
|
9f5f0c75e4 | ||
|
|
6e3641326b | ||
|
|
5a2b9e29f4 | ||
|
|
8a7c65fedf | ||
|
|
5b90909f6e | ||
|
|
e56de8138f | ||
|
|
88cf3d99f5 | ||
|
|
d9da2f671b |
@@ -345,10 +345,29 @@ add_library(ngap
|
||||
${NGAP_DIR}/ngap_gNB_overload.c
|
||||
${NGAP_DIR}/ngap_gNB_trace.c
|
||||
${NGAP_DIR}/ngap_gNB_ue_context.c
|
||||
${NGAP_DIR}/ngap_gNB_NRPPa_transport_procedures.c
|
||||
)
|
||||
target_link_libraries(ngap PUBLIC asn1_ngap)
|
||||
target_link_libraries(ngap PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||
|
||||
# NRPPA
|
||||
##############
|
||||
# target asn1_nrppa in openair3/NRPPA/MESSAGES/CMakeLists.txt used below
|
||||
set(NRPPA_DIR ${OPENAIR3_DIR}/NRPPA)
|
||||
include_directories ("${NRPPA_DIR}")
|
||||
add_library(nrppa
|
||||
${NRPPA_DIR}/nrppa_gNB.c
|
||||
${NRPPA_DIR}/nrppa_gNB_decoder.c
|
||||
${NRPPA_DIR}/nrppa_gNB_encoder.c
|
||||
${NRPPA_DIR}/nrppa_gNB_handlers.c
|
||||
${NRPPA_DIR}/nrppa_gNB_itti_messaging.c
|
||||
${NRPPA_DIR}/nrppa_gNB_position_information_transfer_procedures.c
|
||||
${NRPPA_DIR}/nrppa_gNB_TRP_information_transfer_procedures.c
|
||||
${NRPPA_DIR}/nrppa_gNB_measurement_information_transfer_procedures.c
|
||||
)
|
||||
target_link_libraries(nrppa PUBLIC asn1_nrppa)
|
||||
target_link_libraries(nrppa PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||
|
||||
#M2AP
|
||||
##############
|
||||
set(M2AP_DIR ${OPENAIR2_DIR}/M2AP)
|
||||
@@ -438,7 +457,9 @@ add_library(f1ap
|
||||
${F1AP_DIR}/f1ap_du_warning_message_transmission.c
|
||||
${F1AP_DIR}/f1ap_encoder.c
|
||||
${F1AP_DIR}/f1ap_handlers.c
|
||||
${F1AP_DIR}/f1ap_itti_messaging.c)
|
||||
${F1AP_DIR}/f1ap_itti_messaging.c
|
||||
${F1AP_DIR}/f1ap_cu_position_information_transfer.c
|
||||
${F1AP_DIR}/f1ap_du_position_information_transfer.c)
|
||||
target_include_directories(f1ap PUBLIC F1AP_DIR)
|
||||
target_link_libraries(f1ap PUBLIC asn1_f1ap L2_NR)
|
||||
target_link_libraries(f1ap PRIVATE ngap nr_rrc HASHTABLE)
|
||||
@@ -2016,7 +2037,7 @@ target_link_libraries(nr-softmodem PRIVATE
|
||||
-Wl,--start-group
|
||||
UTIL HASHTABLE SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU GTPV1U SECURITY
|
||||
ITTI ${NAS_UE_LIB} lte_rrc nr_rrc
|
||||
ngap s1ap L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB SIMU
|
||||
ngap nrppa s1ap L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB SIMU
|
||||
x2ap f1ap m2ap m3ap e1ap shlib_loader
|
||||
-Wl,--end-group z dl)
|
||||
|
||||
@@ -2042,7 +2063,7 @@ endif()
|
||||
|
||||
# force the generation of ASN.1 so that we don't need to wait during the build
|
||||
target_link_libraries(nr-softmodem PRIVATE
|
||||
asn1_lte_rrc asn1_nr_rrc asn1_s1ap asn1_ngap asn1_m2ap asn1_m3ap asn1_x2ap asn1_f1ap asn1_lpp)
|
||||
asn1_lte_rrc asn1_nr_rrc asn1_s1ap asn1_ngap asn1_m2ap asn1_m3ap asn1_x2ap asn1_f1ap asn1_lpp asn1_nrppa)
|
||||
|
||||
add_executable(nr-cuup
|
||||
executables/nr-cuup.c
|
||||
|
||||
101
ci-scripts/yaml_files/5g_fhi_7.2/README.md
Normal file
101
ci-scripts/yaml_files/5g_fhi_7.2/README.md
Normal file
@@ -0,0 +1,101 @@
|
||||
<table style="border-collapse: collapse; border: none;">
|
||||
<tr style="border-collapse: collapse; border: none;">
|
||||
<td style="border-collapse: collapse; border: none;">
|
||||
<a href="http://www.openairinterface.org/">
|
||||
<img src="../../../doc/images/oai_final_logo.png" alt="" border=3 height=50 width=150>
|
||||
</img>
|
||||
</a>
|
||||
</td>
|
||||
<td style="border-collapse: collapse; border: none; vertical-align: center;">
|
||||
<b><font size = "5">OAI O-RAN 7.2 Front-haul Docker Compose</font></b>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||

|
||||
|
||||
This docker-compose is designed to use `OAI-gNB` with a 7.2 compatible Radio Unit. Before using this docker compose you have to configure the host machine as per the [ORAN_FHI7.2_Tutorial](../../../doc/ORAN_FHI7.2_Tutorial.md). The container image used by the docker compose file is tested only on `Ubuntu 22.04` docker host.
|
||||
|
||||
## Build Image (Optional)
|
||||
|
||||
If you wish to make your own image after modification or from a specific branch then you can build it manually,
|
||||
|
||||
### Ubuntu base image
|
||||
|
||||
```bash
|
||||
cd ../../../
|
||||
docker build -f docker/Dockerfile.base.ubuntu22 -t ran:base:latest .
|
||||
docker build -f docker/Dockerfile.build.fhi72.ubuntu22 -t ran:build:latest .
|
||||
docker build -f docker/Dockerfile.gNB.fhi72.ubuntu22 -t oai-gnb-fhi72:<your-image-tag> .
|
||||
```
|
||||
|
||||
### UBI base image
|
||||
|
||||
```bash
|
||||
cd ../../../
|
||||
podman build -f docker/Dockerfile.base.rhel9 -t ran:base:latest .
|
||||
podman build -f docker/Dockerfile.build.fhi72.rhel9 -t ran:build:latest .
|
||||
podman build -f docker/Dockerfile.gNB.fhi72.rhel9 -t oai-gnb-fhi72:<your-image-tag> .
|
||||
```
|
||||
|
||||
The new image will be `oai-gnb-fhi72:<your-image-tag>`. You will have to replace this new image with `oai-gnb-fhi72:latest`.
|
||||
|
||||
## Configure Networking
|
||||
|
||||
### SR-IOV Virtual Functions (VFs)
|
||||
|
||||
In docker-compose environment there is no automated method to configure the VFs on the fly. The user will have to manually configure C/U plane VFs before starting the container `OAI-gNB`.
|
||||
|
||||
You can follow the step [configure-network-interfaces-and-dpdk-vfs](../../../doc/ORAN_FHI7.2_Tutorial.md#configure-network-interfaces-and-dpdk-vfs).
|
||||
|
||||
### Interface towards AMF (N2)
|
||||
|
||||
For `N2` interface we are using `macvlan` driver of docker.
|
||||
|
||||
You can use the `bridge` driver, in situation
|
||||
|
||||
- When the core network is running on the same machine
|
||||
- or different machine but you have configured needed `ip route` and forwarding to access the core network from RAN host.
|
||||
|
||||
To configure docker `macvlan` network you need to choose `ipam.config` and `driver_opts.parent` are per your environment
|
||||
|
||||
```
|
||||
oai-net:
|
||||
driver: macvlan
|
||||
name: oai-net
|
||||
ipam:
|
||||
config:
|
||||
- subnet: "172.21.16.0/22"
|
||||
ip_range: "172.21.18.20/32"
|
||||
gateway: "172.21.19.254"
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: "oai-net"
|
||||
parent: enp193s0f0
|
||||
```
|
||||
|
||||
To configure `bridge` network you need to choose `ipam.config.subnet` as per your environment.
|
||||
|
||||
```
|
||||
oai-net:
|
||||
driver: bridge
|
||||
name: oai-net
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.72.128/26
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: "oai-net"
|
||||
```
|
||||
|
||||
## Deploy OAI-gNB Container
|
||||
|
||||
The [configuration file](../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf) used by docker compose is configured for Benetel 650 RU (RAN650-1v1.0.4-dda1bf5).
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
To check the logs
|
||||
|
||||
```bash
|
||||
docker logs oai-gnb -f
|
||||
```
|
||||
55
ci-scripts/yaml_files/5g_fhi_7.2/docker-compose.yml
Normal file
55
ci-scripts/yaml_files/5g_fhi_7.2/docker-compose.yml
Normal file
@@ -0,0 +1,55 @@
|
||||
services:
|
||||
oai-gnb3:
|
||||
image: ran-gnb:nrppa_procedures_srs
|
||||
privileged: true
|
||||
container_name: oai-gnb3
|
||||
environment:
|
||||
TZ: Europe/Paris
|
||||
USE_ADDITIONAL_OPTIONS: --sa --thread-pool 3,5,7,9,11
|
||||
devices:
|
||||
- /dev/vfio:/dev/vfio/
|
||||
volumes:
|
||||
- /home/eurecom/adeel/geo5g/script/gnb3.9bitCompr.sa.band77.273prb.fhi72.4x4-vvdn_coreoai.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
- /dev/hugepages:/dev/hugepages
|
||||
cpuset: "0,2,3,4,5,6,7,8,9,10,11"
|
||||
networks:
|
||||
oai-net:
|
||||
ipv4_address: 172.21.18.20
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
oai-gnb1:
|
||||
image: ran-gnb:nrppa_procedures_srs
|
||||
privileged: true
|
||||
container_name: oai-gnb1
|
||||
environment:
|
||||
TZ: Europe/Paris
|
||||
USE_ADDITIONAL_OPTIONS: --sa --thread-pool 13,15,17,19,21
|
||||
devices:
|
||||
- /dev/vfio:/dev/vfio/
|
||||
volumes:
|
||||
- /home/eurecom/adeel/geo5g/script/gnb1.9bitCompr.sa.band77.273prb.fhi72.4x4-vvdn_coreoai.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
- /dev/hugepages:/dev/hugepages
|
||||
cpuset: "0,12,13,14,15,16,17,18,19,20,21"
|
||||
networks:
|
||||
oai-net:
|
||||
ipv4_address: 172.21.18.21
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
networks:
|
||||
oai-net:
|
||||
driver: macvlan
|
||||
name: oai-net
|
||||
ipam:
|
||||
config:
|
||||
- subnet: "172.21.16.0/22"
|
||||
ip_range: "172.21.18.20/32"
|
||||
gateway: "172.21.19.254"
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: "oai-net"
|
||||
parent: bond0
|
||||
@@ -161,6 +161,7 @@ extern "C" {
|
||||
COMP_DEF(M2AP, ) \
|
||||
COMP_DEF(M3AP, ) \
|
||||
COMP_DEF(NGAP, ) \
|
||||
COMP_DEF(NRPPA, ) \
|
||||
COMP_DEF(GNB_APP, log) \
|
||||
COMP_DEF(NR_RRC, log) \
|
||||
COMP_DEF(NR_MAC, log) \
|
||||
@@ -208,7 +209,6 @@ typedef struct {
|
||||
log_print_func_t print;
|
||||
} log_component_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
log_component_t log_component[MAX_LOG_COMPONENTS];
|
||||
log_component_back_t log_rarely_used[MAX_LOG_COMPONENTS];
|
||||
|
||||
@@ -119,6 +119,14 @@ ID = GNB_PHY_DL_OUTPUT_SIGNAL
|
||||
DESC = gNodeB output data in the freq domain for slots
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB
|
||||
FORMAT = int,gNB_ID : int,frame : int,slot : int,antenna : buffer,txdata
|
||||
ID = GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE_OVER_SAMPLING
|
||||
DESC = gNodeB channel estimation in the frequency domain
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB
|
||||
FORMAT = int,gNB_ID : int,rnti : int,frame : int,subframe : int,antenna : buffer,chest_f
|
||||
ID = GNB_PHY_UL_TIME_CHANNEL_ESTIMATE_OVER_SAMPLING
|
||||
DESC = gNodeB channel estimation in the time domain
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB
|
||||
FORMAT = int,gNB_ID : int,rnti : int,frame : int,subframe : int,antenna : buffer,chest_t
|
||||
|
||||
#MAC logs
|
||||
ID = ENB_MAC_UE_DL_SDU
|
||||
@@ -497,6 +505,23 @@ ID = LEGACY_NGAP_TRACE
|
||||
GROUP = ALL:LEGACY_NGAP:LEGACY_GROUP_TRACE:LEGACY
|
||||
FORMAT = string,log
|
||||
|
||||
ID = LEGACY_NRPPA_INFO
|
||||
DESC = NRPPA legacy logs - info level
|
||||
GROUP = ALL:LEGACY_NRPPA:LEGACY_GROUP_INFO:LEGACY
|
||||
FORMAT = string,log
|
||||
ID = LEGACY_NRPPA_ERROR
|
||||
DESC = NRPPA legacy logs - error level
|
||||
GROUP = ALL:LEGACY_NRPPA:LEGACY_GROUP_ERROR:LEGACY
|
||||
FORMAT = string,log
|
||||
ID = LEGACY_NRPPA_WARNING
|
||||
DESC = NRPPA legacy logs - warning level
|
||||
GROUP = ALL:LEGACY_NRPPA:LEGACY_GROUP_WARNING:LEGACY
|
||||
FORMAT = string,log
|
||||
ID = LEGACY_NRPPA_DEBUG
|
||||
DESC = NRPPA legacy logs - debug level
|
||||
GROUP = ALL:LEGACY_NRPPA:LEGACY_GROUP_DEBUG:LEGACY
|
||||
FORMAT = string,log
|
||||
|
||||
ID = LEGACY_X2AP_INFO
|
||||
DESC = X2AP legacy logs - info level
|
||||
GROUP = ALL:LEGACY_X2AP:LEGACY_GROUP_INFO:LEGACY
|
||||
|
||||
@@ -17,4 +17,3 @@
|
||||
#include "openair2/COMMON/f1ap_messages_def.h"
|
||||
#include "openair2/COMMON/e1ap_messages_def.h"
|
||||
#include "openair2/COMMON/ngap_messages_def.h"
|
||||
|
||||
|
||||
@@ -261,6 +261,7 @@ typedef struct IttiMsgText_s {
|
||||
void *rrc_enb_process_itti_msg(void *);
|
||||
#include <openair3/SCTP/sctp_eNB_task.h>
|
||||
#include <openair3/NGAP/ngap_gNB.h>
|
||||
#include <openair3/NRPPA/nrppa_gNB.h>
|
||||
|
||||
/*
|
||||
static const char *const messages_definition_xml = {
|
||||
@@ -297,6 +298,7 @@ typedef struct {
|
||||
TASK_DEF(TASK_RAL_ENB, 200) \
|
||||
TASK_DEF(TASK_S1AP, 200) \
|
||||
TASK_DEF(TASK_NGAP, 200) \
|
||||
TASK_DEF(TASK_NRPPA, 200) \
|
||||
TASK_DEF(TASK_X2AP, 200) \
|
||||
TASK_DEF(TASK_M2AP_ENB, 200) \
|
||||
TASK_DEF(TASK_M2AP_MCE, 200) \
|
||||
|
||||
@@ -100,6 +100,12 @@ nfs:
|
||||
port: 8080
|
||||
api_version: v1
|
||||
interface_name: eth0
|
||||
lmf:
|
||||
host: oai-lmf
|
||||
sbi:
|
||||
port: 8080
|
||||
api_version: v1
|
||||
interface_name: eth0
|
||||
|
||||
#### Common for UDR and AMF
|
||||
database:
|
||||
@@ -212,6 +218,20 @@ upf:
|
||||
- dnn: "openairinterface"
|
||||
- dnn: "ims"
|
||||
|
||||
lmf:
|
||||
http_threads_count: 8
|
||||
gnb_id_bits_count: 28
|
||||
num_gnb: 1
|
||||
trp_info_wait_ms: 10000
|
||||
positioning_wait_ms: 10000
|
||||
measurement_wait_ms: 10000
|
||||
support_features:
|
||||
request_trp_info: no
|
||||
determine_num_gnb: yes
|
||||
use_http2: yes
|
||||
use_fqdn_dns: no
|
||||
register_nrf: yes
|
||||
|
||||
## DNN configuration
|
||||
dnns:
|
||||
- dnn: "oai"
|
||||
|
||||
@@ -111,6 +111,24 @@ services:
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.132
|
||||
oai-lmf:
|
||||
container_name: "oai-lmf"
|
||||
image: oaisoftwarealliance/oai-lmf:develop
|
||||
#image: oai-lmf:fixmultigNB
|
||||
expose:
|
||||
- 80/tcp
|
||||
- 8080/tcp
|
||||
volumes:
|
||||
- ./conf/config.yaml:/openair-lmf/etc/config.yaml
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
depends_on:
|
||||
- mysql
|
||||
- oai-nrf
|
||||
- oai-amf
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.141
|
||||
oai-smf:
|
||||
container_name: "oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:develop
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"externalClientType": "VALUE_ADDED_SERVICES",
|
||||
"amfId": "128:1:1",
|
||||
"locationQoS": {
|
||||
"hAccuracy": 1.5,
|
||||
"vAccuracy": 1.5,
|
||||
"verticalRequested": true,
|
||||
"responseTime": "LOW_DELAY",
|
||||
"lcsQosClass": "BEST_EFFORT"
|
||||
},
|
||||
"supportedGADShapes": [
|
||||
"POINT",
|
||||
"POINT_UNCERTAINTY_CIRCLE"
|
||||
],
|
||||
"supi": "imsi-001010000059449",
|
||||
"ncgi": {
|
||||
"plmnId": {
|
||||
"mcc": "001",
|
||||
"mnc": "01"
|
||||
},
|
||||
"nrCellId": "14680064",
|
||||
"nid": "0"
|
||||
},
|
||||
"priority": "HIGHEST_PRIORITY",
|
||||
"velocityRequested": "VELOCITY_IS_NOT_REQUESTED",
|
||||
"lcsServiceType": 127,
|
||||
"ldrType": "UE_AVAILABLE",
|
||||
"hgmlcCallBackURI": "192.168.89.129",
|
||||
"ldrReference": "11",
|
||||
"lirReference": "1",
|
||||
"periodicEventInfo": {
|
||||
"reportingAmount": 10,
|
||||
"reportingInterval": 60
|
||||
},
|
||||
"reportingAccessTypes": [
|
||||
"NR",
|
||||
"NON_3GPP_CONNECTED_TO_5GC"
|
||||
],
|
||||
"ueConnectivityStates": {
|
||||
"accessType": "3GPP_ACCESS",
|
||||
"connectivitystate": "IDLE"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
#/* configuration for channel modelisation */
|
||||
#/* To be included in main config file when */
|
||||
#/* channel modelisation is used (rfsimulator with chanmod options enabled) */
|
||||
channelmod = {
|
||||
max_chan=10;
|
||||
modellist="modellist_rfsimu_1";
|
||||
modellist_rfsimu_1 = (
|
||||
{
|
||||
model_name = "rfsimu_channel_enB0"
|
||||
type = "Rice1"; #"TDL_D";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = -10;
|
||||
forgetfact = 0;
|
||||
offset = 32; # 16 samples -> 80 m -> 1 TA
|
||||
ds_tdl = 0; #0.13;
|
||||
},
|
||||
{
|
||||
model_name = "rfsimu_channel_ue0"
|
||||
type = "Rice1";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = -10;
|
||||
forgetfact = 0;
|
||||
offset = 32;
|
||||
ds_tdl = 0; #0.03;
|
||||
}
|
||||
);
|
||||
modellist_rfsimu_2 = (
|
||||
{
|
||||
model_name = "rfsimu_channel_ue0"
|
||||
type = "Rice1";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = 0;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
},
|
||||
{
|
||||
model_name = "rfsimu_channel_ue1"
|
||||
type = "Rice1";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = 0;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
},
|
||||
{
|
||||
model_name = "rfsimu_channel_ue2"
|
||||
type = "Rice1";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = 0;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
@@ -0,0 +1,322 @@
|
||||
Active_gNBs = ( "gNB-geo5g-1");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe01;
|
||||
gNB_name = "gNB-geo5g-1";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ( { sst = 1;}); });
|
||||
|
||||
//nr_cellid = 12345678L;
|
||||
nr_cellid = 1;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
pusch_AntennaPorts = 2;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 1 ;
|
||||
sib1_tda = 15;
|
||||
min_rxtxtime =6;
|
||||
enable_sdap =0;
|
||||
ssb_SubcarrierOffset =0;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
controlResourceSetZero = 11; #10; #thamizh change
|
||||
searchSpaceZero = 0;
|
||||
}
|
||||
);
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 21;
|
||||
# n_TimingAdvanceOffset = 0;
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
absoluteFrequencySSB = 656640;
|
||||
dl_frequencyBand = 77;
|
||||
dl_absoluteFrequencyPointA = 653364;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 273;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1
|
||||
#
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 11;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 77;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 273;
|
||||
pMax = 23;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 1099;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 159;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 15;
|
||||
preambleReceivedTargetPower = -100;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 7;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1; #2
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 5;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1; #1
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
|
||||
msg3_DeltaPreamble = 2; #2
|
||||
p0_NominalWithGrant = -100;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 0;
|
||||
p0_nominal = -96;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 0x1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 5;
|
||||
nrofDownlinkSlots = 3;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 1;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower =-11; #-27; #0; #0 #-2
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ( { ipv4 = "192.168.89.132";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "bond0"; #"eno8303";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.51";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "bond0"; #"eno8303";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.51";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 300;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
# dl_bler_target_upper=.35;
|
||||
# dl_bler_target_lower=.15;
|
||||
#ul_bler_target_upper=.35;
|
||||
#ul_bler_target_lower=.15;
|
||||
pusch_FailureThres = 100;
|
||||
}
|
||||
);
|
||||
|
||||
positioning_config = (
|
||||
{
|
||||
NumTRPs = 4; # number of TRPs this match with total number of antenas set in config file
|
||||
#gNBID = 0xe03;
|
||||
#nrcellid = 262160L;
|
||||
TRPIDs = [31,32,33,34]; # userdefined distinct IDs
|
||||
TRPxAxis = [50,50,50,50]; # X-axis value of each TRP in millimeter
|
||||
TRPyAxis = [-11,4,0,0]; # Y-axis value of each TRP in millimeter
|
||||
TRPzAxis = [11,11,11,11]; # Z-axis value of each TRP millimeter
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 80; #120 #130
|
||||
pucch0_dtx_threshold = 80;
|
||||
pusch_dtx_threshold = -100;
|
||||
#thread_pool_size = 8;
|
||||
tx_amp_backoff_dB = 3;
|
||||
L1_rx_thread_core = 8;
|
||||
L1_tx_thread_core = 10;
|
||||
phase_compensation = 0; # needs to match O-RU configuration
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "no";
|
||||
nb_tx = 4;
|
||||
nb_rx = 4;
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [77];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 75;
|
||||
sf_extension = 0;
|
||||
eNB_instances = [0];
|
||||
ru_thread_core = 9;
|
||||
sl_ahead = 6; #5
|
||||
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||
bf_weights = [0x00007fff, 0x0000,0x00007fff, 0x0000];
|
||||
clock_src = "internal";
|
||||
tr_preference = "raw_if4p5"; # important: activate FHI7.2
|
||||
do_precoding = 0; # needs to match O-RU configuration
|
||||
}
|
||||
);
|
||||
|
||||
rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = "4043";
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config : {
|
||||
global_log_level = "info";
|
||||
hw_log_level = "info";
|
||||
phy_log_level = "info";
|
||||
mac_log_level = "info";
|
||||
rlc_log_level = "info";
|
||||
pdcp_log_level = "info";
|
||||
rrc_log_level = "info";
|
||||
ngap_log_level = "info";
|
||||
f1ap_log_level = "info";
|
||||
};
|
||||
|
||||
fhi_72 = {
|
||||
dpdk_devices = ("0000:01:01.0", "0000:01:01.1");
|
||||
io_core = 1;
|
||||
worker_cores = (2);
|
||||
system_core = 0;
|
||||
du_addr = ("00:12:22:33:44:66", "00:12:22:33:44:67");
|
||||
ru_addr = ("98:ae:71:00:8a:62", "98:ae:71:00:8a:62");
|
||||
mtu = 9216; # check if xran uses this properly
|
||||
fh_config = ({
|
||||
Tadv_cp_dl = 125;
|
||||
T2a_cp_dl = (285, 429); # (min, max)
|
||||
T2a_cp_ul = (285, 429); # (min, max)
|
||||
T2a_up = (125, 428); # (min, max)
|
||||
Ta3 = (130, 170); # (min, max)
|
||||
T1a_cp_dl = (285, 470); # (min, max)
|
||||
T1a_cp_ul = (285, 429); # (min, max)
|
||||
T1a_up = (125, 350); # (min, max)
|
||||
Ta4 = (110, 180); # (min, max)
|
||||
ru_config = {
|
||||
iq_width = 16;
|
||||
iq_width_prach = 16;
|
||||
fft_size = 12;
|
||||
};
|
||||
prach_config = {
|
||||
eAxC_offset = 2;
|
||||
};
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,306 @@
|
||||
Active_gNBs = ( "gNB-Geo5G-1");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
sa=1;
|
||||
|
||||
device: { name = "rfsimulator" }
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe01;
|
||||
gNB_name = "gNB-Geo5G-1";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 0x0001;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); });
|
||||
|
||||
nr_cellid = 262160L;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
pdsch_AntennaPorts_N1 = 2;
|
||||
maxMIMO_layers = 2;
|
||||
pusch_AntennaPorts = 4;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 1 ;
|
||||
sib1_tda = 15;
|
||||
min_rxtxtime =6;
|
||||
enable_sdap =0;
|
||||
ssb_SubcarrierOffset =0;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
controlResourceSetZero = 12;
|
||||
searchSpaceZero = 0;
|
||||
}
|
||||
);
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||
absoluteFrequencySSB = 641280;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 640008;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 12;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 106;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ( { ipv4 = "192.168.70.132";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 150;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
ulsch_max_frame_inactivity = 20;
|
||||
dl_harq_round_max = 4;
|
||||
ul_harq_round_max = 4;
|
||||
}
|
||||
);
|
||||
|
||||
positioning_config = (
|
||||
{
|
||||
NumTRPs = 4; # number of TRPs this match with total number of antenas set in config file
|
||||
#gNBID = 0xe01;
|
||||
#nrcellid = 26216;
|
||||
TRPIDs = [11,12,13,14]; # userdefined distinct IDs
|
||||
TRPxAxis = [71,21,10,45]; # X-axis value of each TRP in millimeter
|
||||
TRPyAxis = [11,22,62,14]; # Y-axis value of each TRP in millimeter
|
||||
TRPzAxis = [41,22,33,42]; # Z-axis value of each TRP millimeter
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 120;
|
||||
pucch0_dtx_threshold = 150;
|
||||
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "yes"
|
||||
nb_tx = 4
|
||||
nb_rx = 4
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 114;
|
||||
eNB_instances = [0];
|
||||
#beamforming 1x4 matrix:
|
||||
bf_weights = [0x00007fff, 0x0000, 0x00007fff, 0x0000];
|
||||
clock_src = "internal";
|
||||
}
|
||||
);
|
||||
|
||||
THREAD_STRUCT = (
|
||||
{
|
||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||
worker_config = "WORKER_ENABLE";
|
||||
}
|
||||
);
|
||||
|
||||
rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = "4043";
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config = {
|
||||
global_log_level = "info";
|
||||
hw_log_level ="info";
|
||||
phy_log_level ="info";
|
||||
mac_log_level ="info";
|
||||
rlc_log_level ="info";
|
||||
pdcp_log_level ="info";
|
||||
rrc_log_level ="info";
|
||||
ngap_log_level ="debug";
|
||||
nrppa_log_level ="debug";
|
||||
f1ap_log_level ="debug";
|
||||
};
|
||||
|
||||
telnetsrv = {
|
||||
listenport = 9081
|
||||
listenaddr= "127.0.0.81"
|
||||
histfile = "~/history.telnetsrv"
|
||||
}
|
||||
|
||||
@include "channelmod_rfsimu.conf"
|
||||
@@ -0,0 +1,320 @@
|
||||
Active_gNBs = ( "gNB-geo5g-2");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe02;
|
||||
gNB_name = "gNB-geo5g-2";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ( { sst = 1;}); });
|
||||
|
||||
//nr_cellid = 12345678L;
|
||||
nr_cellid = 1;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
pusch_AntennaPorts = 2;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 1 ;
|
||||
sib1_tda = 15;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
controlResourceSetZero = 11; #10; #thamizh change
|
||||
searchSpaceZero = 0;
|
||||
}
|
||||
);
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 21;
|
||||
# n_TimingAdvanceOffset = 0;
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
absoluteFrequencySSB = 656640;
|
||||
dl_frequencyBand = 77;
|
||||
dl_absoluteFrequencyPointA = 653364;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 273;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1
|
||||
#
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 11;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 77;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 273;
|
||||
pMax = 23;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 1099;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 159;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 15;
|
||||
preambleReceivedTargetPower = -100; #-100
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 7;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1; #2
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 5;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1; #1
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
|
||||
msg3_DeltaPreamble = 2; #2
|
||||
p0_NominalWithGrant = -100; #-100
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 0;
|
||||
p0_nominal = -96; #-96
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 0x1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 5;
|
||||
nrofDownlinkSlots = 3;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 1;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower =-11; #-27; #0; #0 #-2
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ( { ipv4 = "192.168.89.132";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "bond0"; #"eno8303";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.154";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "bond0"; #"eno8303";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.154";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 300;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
# dl_bler_target_upper=.35;
|
||||
# dl_bler_target_lower=.15;
|
||||
#ul_bler_target_upper=.35;
|
||||
#ul_bler_target_lower=.15;
|
||||
pusch_FailureThres = 100;
|
||||
}
|
||||
);
|
||||
|
||||
positioning_config = (
|
||||
{
|
||||
NumTRPs = 2; # number of TRPs this match with total number of antenas set in config file
|
||||
#gNBID = 0xe03;
|
||||
#nrcellid = 262160L;
|
||||
TRPIDs = [21,22,23,24]; # userdefined distinct IDs
|
||||
TRPxAxis = [52,52,52,52]; # X-axis value of each TRP in millimeter
|
||||
TRPyAxis = [21,34,21,34]; # Y-axis value of each TRP in millimeter
|
||||
TRPzAxis = [11,11,11,11]; # Z-axis value of each TRP millimeter
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 80; #120 #130
|
||||
pucch0_dtx_threshold = 80;
|
||||
pusch_dtx_threshold = -100;
|
||||
#thread_pool_size = 8;
|
||||
tx_amp_backoff_dB = 3;
|
||||
L1_rx_thread_core = 8;
|
||||
L1_tx_thread_core = 10;
|
||||
phase_compensation = 0; # needs to match O-RU configuration
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "no";
|
||||
nb_tx = 2;
|
||||
nb_rx = 2;
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [77];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 75;
|
||||
sf_extension = 0;
|
||||
eNB_instances = [0];
|
||||
ru_thread_core = 6;
|
||||
sl_ahead = 6; #5
|
||||
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||
bf_weights = [0x00007fff, 0x0000,0x00007fff, 0x0000];
|
||||
clock_src = "internal";
|
||||
tr_preference = "raw_if4p5"; # important: activate FHI7.2
|
||||
do_precoding = 0; # needs to match O-RU configuration
|
||||
}
|
||||
);
|
||||
|
||||
rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = "4043";
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config : {
|
||||
global_log_level = "info";
|
||||
hw_log_level = "info";
|
||||
phy_log_level = "info";
|
||||
mac_log_level = "info";
|
||||
rlc_log_level = "info";
|
||||
pdcp_log_level = "info";
|
||||
rrc_log_level = "info";
|
||||
ngap_log_level = "info";
|
||||
f1ap_log_level = "info";
|
||||
};
|
||||
|
||||
fhi_72 = {
|
||||
dpdk_devices = ("0000:18:0e.2", "0000:18:0e.3");
|
||||
io_core = 4;
|
||||
worker_cores = (2);
|
||||
system_core = 0;
|
||||
du_addr = ("00:12:22:33:44:68", "00:12:22:33:44:69");
|
||||
ru_addr = ("98:AE:71:01:C5:E5", "98:AE:71:01:C5:E5");
|
||||
mtu = 9216; # check if xran uses this properly
|
||||
fh_config = ({
|
||||
Tadv_cp_dl = 125;
|
||||
T2a_cp_dl = (285, 429); # (min, max)
|
||||
T2a_cp_ul = (285, 429); # (min, max)
|
||||
T2a_up = (125, 428); # (min, max)
|
||||
Ta3 = (130, 170); # (min, max)
|
||||
T1a_cp_dl = (285, 470); # (min, max)
|
||||
T1a_cp_ul = (285, 429); # (min, max)
|
||||
T1a_up = (125, 350); # (min, max)
|
||||
Ta4 = (110, 180); # (min, max)
|
||||
ru_config = {
|
||||
iq_width = 16;
|
||||
iq_width_prach = 16;
|
||||
fft_size = 12;
|
||||
};
|
||||
prach_config = {
|
||||
eAxC_offset = 2;
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
@@ -0,0 +1,322 @@
|
||||
Active_gNBs = ( "gNB-geo5g-1");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe01;
|
||||
gNB_name = "gNB-geo5g-1";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ( { sst = 1;}); });
|
||||
|
||||
//nr_cellid = 12345678L;
|
||||
nr_cellid = 1;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
pusch_AntennaPorts = 2;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 1 ;
|
||||
sib1_tda = 15;
|
||||
min_rxtxtime =6;
|
||||
enable_sdap =0;
|
||||
ssb_SubcarrierOffset =0;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
controlResourceSetZero = 11; #10; #thamizh change
|
||||
searchSpaceZero = 0;
|
||||
}
|
||||
);
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 22;
|
||||
# n_TimingAdvanceOffset = 0;
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
absoluteFrequencySSB = 656640;
|
||||
dl_frequencyBand = 77;
|
||||
dl_absoluteFrequencyPointA = 653364;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 273;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1
|
||||
#
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 11;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 77;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 273;
|
||||
pMax = 23;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 1099;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 159;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 15;
|
||||
preambleReceivedTargetPower = -100;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 7;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1; #2
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 5;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 2; #1
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
|
||||
msg3_DeltaPreamble = 2; #2
|
||||
p0_NominalWithGrant = -100;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 0;
|
||||
p0_nominal = -96;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 0x1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 5;
|
||||
nrofDownlinkSlots = 3;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 1;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower =-11; #-27; #0; #0 #-2
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ( { ipv4 = "192.168.89.132";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "bond0"; #"eno8303";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.51";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "bond0"; #"eno8303";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.51";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 300;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
# dl_bler_target_upper=.35;
|
||||
# dl_bler_target_lower=.15;
|
||||
#ul_bler_target_upper=.35;
|
||||
#ul_bler_target_lower=.15;
|
||||
pusch_FailureThres = 100;
|
||||
}
|
||||
);
|
||||
|
||||
positioning_config = (
|
||||
{
|
||||
NumTRPs = 4; # number of TRPs this match with total number of antenas set in config file
|
||||
#gNBID = 0xe03;
|
||||
#nrcellid = 262160L;
|
||||
TRPIDs = [31,32,33,34]; # userdefined distinct IDs
|
||||
TRPxAxis = [52,52,52,52]; # X-axis value of each TRP in millimeter
|
||||
TRPyAxis = [23,36,23,36]; # Y-axis value of each TRP in millimeter
|
||||
TRPzAxis = [11,11,11,11]; # Z-axis value of each TRP millimeter
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 80; #120 #130
|
||||
pucch0_dtx_threshold = 80;
|
||||
pusch_dtx_threshold = -100;
|
||||
#thread_pool_size = 8;
|
||||
tx_amp_backoff_dB = 3;
|
||||
L1_rx_thread_core = 8;
|
||||
L1_tx_thread_core = 10;
|
||||
phase_compensation = 0; # needs to match O-RU configuration
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "no";
|
||||
nb_tx = 4;
|
||||
nb_rx = 4;
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [77];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 75;
|
||||
sf_extension = 0;
|
||||
eNB_instances = [0];
|
||||
ru_thread_core = 9;
|
||||
sl_ahead = 6; #5
|
||||
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||
bf_weights = [0x00007fff, 0x0000,0x00007fff, 0x0000];
|
||||
clock_src = "internal";
|
||||
tr_preference = "raw_if4p5"; # important: activate FHI7.2
|
||||
do_precoding = 0; # needs to match O-RU configuration
|
||||
}
|
||||
);
|
||||
|
||||
rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = "4043";
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config : {
|
||||
global_log_level = "info";
|
||||
hw_log_level = "info";
|
||||
phy_log_level = "info";
|
||||
mac_log_level = "info";
|
||||
rlc_log_level = "info";
|
||||
pdcp_log_level = "info";
|
||||
rrc_log_level = "info";
|
||||
ngap_log_level = "info";
|
||||
f1ap_log_level = "info";
|
||||
};
|
||||
|
||||
fhi_72 = {
|
||||
dpdk_devices = ("0000:01:01.0", "0000:01:01.1");
|
||||
io_core = 1;
|
||||
worker_cores = (2);
|
||||
system_core = 0;
|
||||
du_addr = ("00:12:22:33:44:68", "00:12:22:33:44:69");
|
||||
ru_addr = ("98:AE:71:01:C5:E5", "98:AE:71:01:C5:E5");
|
||||
mtu = 9216; # check if xran uses this properly
|
||||
fh_config = ({
|
||||
Tadv_cp_dl = 125;
|
||||
T2a_cp_dl = (285, 429); # (min, max)
|
||||
T2a_cp_ul = (285, 429); # (min, max)
|
||||
T2a_up = (125, 428); # (min, max)
|
||||
Ta3 = (130, 170); # (min, max)
|
||||
T1a_cp_dl = (285, 470); # (min, max)
|
||||
T1a_cp_ul = (285, 429); # (min, max)
|
||||
T1a_up = (125, 350); # (min, max)
|
||||
Ta4 = (110, 180); # (min, max)
|
||||
ru_config = {
|
||||
iq_width = 16;
|
||||
iq_width_prach = 16;
|
||||
fft_size = 12;
|
||||
};
|
||||
prach_config = {
|
||||
eAxC_offset = 2;
|
||||
};
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,306 @@
|
||||
Active_gNBs = ( "gNB-Geo5G-2");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
sa=1;
|
||||
|
||||
device: { name = "rfsimulator" }
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xfa2;
|
||||
gNB_name = "gNB-Geo5G-2";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 0x0001;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); });
|
||||
|
||||
nr_cellid = 262160L;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
pdsch_AntennaPorts_N1 = 2;
|
||||
maxMIMO_layers = 2;
|
||||
pusch_AntennaPorts = 4;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 1 ;
|
||||
sib1_tda = 15;
|
||||
min_rxtxtime =6;
|
||||
enable_sdap =0;
|
||||
ssb_SubcarrierOffset =0;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
controlResourceSetZero = 12;
|
||||
searchSpaceZero = 0;
|
||||
}
|
||||
);
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 1;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||
absoluteFrequencySSB = 641280;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 640008;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 12;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 106;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 2;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 2;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ( { ipv4 = "192.168.70.132";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.142/24";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.142/24";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 150;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
ulsch_max_frame_inactivity = 20;
|
||||
dl_harq_round_max = 4;
|
||||
ul_harq_round_max = 4;
|
||||
}
|
||||
);
|
||||
|
||||
positioning_config = (
|
||||
{
|
||||
NumTRPs = 4; # number of TRPs this match with total number of antenas set in config file
|
||||
#gNBID = 0xe02;
|
||||
#nrcellid = 262160;
|
||||
TRPIDs = [21,22,23,24]; # userdefined distinct IDs
|
||||
TRPxAxis = [21,21,0,5]; # X-axis value of each TRP in millimeter
|
||||
TRPyAxis = [61,12,2,4]; # Y-axis value of each TRP in millimeter
|
||||
TRPzAxis = [4,22,23,12]; # Z-axis value of each TRP millimeter
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 120;
|
||||
pucch0_dtx_threshold = 150;
|
||||
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "yes"
|
||||
nb_tx = 4
|
||||
nb_rx = 4
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 114;
|
||||
eNB_instances = [0];
|
||||
#beamforming 1x4 matrix:
|
||||
bf_weights = [0x00007fff, 0x0000, 0x00007fff, 0x0000];
|
||||
clock_src = "internal";
|
||||
}
|
||||
);
|
||||
|
||||
THREAD_STRUCT = (
|
||||
{
|
||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||
worker_config = "WORKER_ENABLE";
|
||||
}
|
||||
);
|
||||
|
||||
rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = "4043";
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config = {
|
||||
global_log_level = "info";
|
||||
hw_log_level ="info";
|
||||
phy_log_level ="info";
|
||||
mac_log_level ="info";
|
||||
rlc_log_level ="info";
|
||||
pdcp_log_level ="info";
|
||||
rrc_log_level ="info";
|
||||
ngap_log_level ="debug";
|
||||
nrppa_log_level ="debug";
|
||||
f1ap_log_level ="debug";
|
||||
};
|
||||
|
||||
telnetsrv = {
|
||||
listenport = 9081
|
||||
listenaddr= "127.0.0.81"
|
||||
histfile = "~/history.telnetsrv"
|
||||
}
|
||||
|
||||
@include "channelmod_rfsimu.conf"
|
||||
@@ -0,0 +1,325 @@
|
||||
Active_gNBs = ( "gNB-geo5g-3");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe03;
|
||||
gNB_name = "gNB-geo5g-3";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ( { sst = 1;}); });
|
||||
|
||||
//nr_cellid = 12345678L;
|
||||
nr_cellid = 1;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
pdsch_AntennaPorts_N1 = 2;
|
||||
maxMIMO_layers = 2;
|
||||
pusch_AntennaPorts = 4;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 1 ;
|
||||
sib1_tda = 15;
|
||||
min_rxtxtime =6;
|
||||
enable_sdap =0;
|
||||
ssb_SubcarrierOffset =0;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
controlResourceSetZero = 11; #10; #thamizh change
|
||||
searchSpaceZero = 0;
|
||||
}
|
||||
);
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 23;
|
||||
# n_TimingAdvanceOffset = 0;
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
absoluteFrequencySSB = 656640;
|
||||
dl_frequencyBand = 77;
|
||||
dl_absoluteFrequencyPointA = 653364;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 273;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1
|
||||
#
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 11;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 77;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 273;
|
||||
pMax = 23;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 1099;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 159;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 15;
|
||||
preambleReceivedTargetPower = -100;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 7;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1; #2
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 5;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 3; #1
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
|
||||
msg3_DeltaPreamble = 2; #2
|
||||
p0_NominalWithGrant = -100;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 0;
|
||||
p0_nominal = -96;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 0x4;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 5;
|
||||
nrofDownlinkSlots = 3;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 1;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower =-11; #-27; #0; #0 #-2
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ( { ipv4 = "192.168.89.132";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "bond0"; #"eno8303";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.154";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "bond0"; #"eno8303";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.154";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 300;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
# dl_bler_target_upper=.35;
|
||||
# dl_bler_target_lower=.15;
|
||||
#ul_bler_target_upper=.35;
|
||||
#ul_bler_target_lower=.15;
|
||||
pusch_FailureThres = 100;
|
||||
}
|
||||
);
|
||||
|
||||
positioning_config = (
|
||||
{
|
||||
NumTRPs = 4; # number of TRPs this match with total number of antenas set in config file
|
||||
#gNBID = 0xe03;
|
||||
#nrcellid = 262160L;
|
||||
TRPIDs = [31,32,33,34]; # userdefined distinct IDs
|
||||
TRPxAxis = [0,9,27,36]; # X-axis value of each TRP in millimeter
|
||||
TRPyAxis = [0,0,0,0]; # Y-axis value of each TRP in millimeter
|
||||
TRPzAxis = [2,2,2,2]; # Z-axis value of each TRP millimeter
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 80; #120 #130
|
||||
pucch0_dtx_threshold = 80;
|
||||
pusch_dtx_threshold = -100;
|
||||
#thread_pool_size = 8;
|
||||
tx_amp_backoff_dB = 3;
|
||||
L1_rx_thread_core = 8;
|
||||
L1_tx_thread_core = 10;
|
||||
phase_compensation = 0; # needs to match O-RU configuration
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "no";
|
||||
nb_tx = 4;
|
||||
nb_rx = 4;
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [77];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 75;
|
||||
sf_extension = 0;
|
||||
eNB_instances = [0];
|
||||
ru_thread_core = 6;
|
||||
sl_ahead = 6; #5
|
||||
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||
bf_weights = [0x00007fff, 0x0000,0x00007fff, 0x0000];
|
||||
clock_src = "internal";
|
||||
tr_preference = "raw_if4p5"; # important: activate FHI7.2
|
||||
do_precoding = 0; # needs to match O-RU configuration
|
||||
}
|
||||
);
|
||||
|
||||
rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = "4043";
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config : {
|
||||
global_log_level = "info";
|
||||
hw_log_level = "info";
|
||||
phy_log_level = "info";
|
||||
mac_log_level = "info";
|
||||
rlc_log_level = "info";
|
||||
pdcp_log_level = "info";
|
||||
rrc_log_level = "info";
|
||||
ngap_log_level = "info";
|
||||
f1ap_log_level = "info";
|
||||
};
|
||||
|
||||
fhi_72 = {
|
||||
dpdk_devices = ("0000:18:0e.4", "0000:18:0e.5");
|
||||
io_core = 4;
|
||||
worker_cores = (2);
|
||||
system_core = 0;
|
||||
du_addr = ("00:12:22:33:44:70", "00:12:22:33:44:71");
|
||||
ru_addr = ("98:ae:71:00:8a:60", "98:ae:71:00:8a:60");
|
||||
mtu = 9216; # check if xran uses this properly
|
||||
fh_config = ({
|
||||
Tadv_cp_dl = 125;
|
||||
T2a_cp_dl = (285, 429); # (min, max)
|
||||
T2a_cp_ul = (285, 429); # (min, max)
|
||||
T2a_up = (125, 428); # (min, max)
|
||||
Ta3 = (130, 170); # (min, max)
|
||||
T1a_cp_dl = (285, 470); # (min, max)
|
||||
T1a_cp_ul = (285, 429); # (min, max)
|
||||
T1a_up = (125, 350); # (min, max)
|
||||
Ta4 = (110, 180); # (min, max)
|
||||
ru_config = {
|
||||
iq_width = 9;
|
||||
iq_width_prach = 9;
|
||||
fft_size = 12;
|
||||
};
|
||||
prach_config = {
|
||||
eAxC_offset = 4;
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
@@ -0,0 +1,325 @@
|
||||
Active_gNBs = ( "gNB-geo5g-3");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe03;
|
||||
gNB_name = "gNB-geo5g-3";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ( { sst = 1;}); });
|
||||
|
||||
//nr_cellid = 12345678L;
|
||||
nr_cellid = 1;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
pdsch_AntennaPorts_N1 = 2;
|
||||
maxMIMO_layers = 2;
|
||||
pusch_AntennaPorts = 4;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 1 ;
|
||||
sib1_tda = 15;
|
||||
min_rxtxtime =6;
|
||||
enable_sdap =0;
|
||||
ssb_SubcarrierOffset =0;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
controlResourceSetZero = 11; #10; #thamizh change
|
||||
searchSpaceZero = 0;
|
||||
}
|
||||
);
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 23;
|
||||
# n_TimingAdvanceOffset = 0;
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
absoluteFrequencySSB = 656640;
|
||||
dl_frequencyBand = 77;
|
||||
dl_absoluteFrequencyPointA = 653364;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 273;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1
|
||||
#
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 11;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 77;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 273;
|
||||
pMax = 23;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 1099;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 159;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 15;
|
||||
preambleReceivedTargetPower = -100;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 7;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1; #2
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 5;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 3; #1
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
|
||||
msg3_DeltaPreamble = 2; #2
|
||||
p0_NominalWithGrant = -100;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 0;
|
||||
p0_nominal = -96;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 0x4;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 5;
|
||||
nrofDownlinkSlots = 3;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 1;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower =-11; #-27; #0; #0 #-2
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ( { ipv4 = "192.168.89.132";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "bond0"; #"eno8303";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.51";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "bond0"; #"eno8303";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.51";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 300;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
# dl_bler_target_upper=.35;
|
||||
# dl_bler_target_lower=.15;
|
||||
#ul_bler_target_upper=.35;
|
||||
#ul_bler_target_lower=.15;
|
||||
pusch_FailureThres = 100;
|
||||
}
|
||||
);
|
||||
|
||||
positioning_config = (
|
||||
{
|
||||
NumTRPs = 4; # number of TRPs this match with total number of antenas set in config file
|
||||
#gNBID = 0xe03;
|
||||
#nrcellid = 262160L;
|
||||
TRPIDs = [31,32,33,34]; # userdefined distinct IDs
|
||||
TRPxAxis = [0,9,27,36]; # X-axis value of each TRP in millimeter
|
||||
TRPyAxis = [0,0,0,0]; # Y-axis value of each TRP in millimeter
|
||||
TRPzAxis = [2,2,2,2]; # Z-axis value of each TRP millimeter
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 80; #120 #130
|
||||
pucch0_dtx_threshold = 80;
|
||||
pusch_dtx_threshold = -100;
|
||||
#thread_pool_size = 8;
|
||||
tx_amp_backoff_dB = 3;
|
||||
L1_rx_thread_core = 8;
|
||||
L1_tx_thread_core = 10;
|
||||
phase_compensation = 0; # needs to match O-RU configuration
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "no";
|
||||
nb_tx = 4;
|
||||
nb_rx = 4;
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [77];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 75;
|
||||
sf_extension = 0;
|
||||
eNB_instances = [0];
|
||||
ru_thread_core = 9;
|
||||
sl_ahead = 6; #5
|
||||
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||
bf_weights = [0x00007fff, 0x0000,0x00007fff, 0x0000];
|
||||
clock_src = "internal";
|
||||
tr_preference = "raw_if4p5"; # important: activate FHI7.2
|
||||
do_precoding = 0; # needs to match O-RU configuration
|
||||
}
|
||||
);
|
||||
|
||||
rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = "4043";
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config : {
|
||||
global_log_level = "info";
|
||||
hw_log_level = "info";
|
||||
phy_log_level = "info";
|
||||
mac_log_level = "info";
|
||||
rlc_log_level = "info";
|
||||
pdcp_log_level = "info";
|
||||
rrc_log_level = "info";
|
||||
ngap_log_level = "info";
|
||||
f1ap_log_level = "info";
|
||||
};
|
||||
|
||||
fhi_72 = {
|
||||
dpdk_devices = ("0000:01:01.2", "0000:01:01.3");
|
||||
io_core = 1;
|
||||
worker_cores = (2);
|
||||
system_core = 0;
|
||||
du_addr = ("00:12:22:33:44:70", "00:12:22:33:44:71");
|
||||
ru_addr = ("98:ae:71:00:8a:60", "98:ae:71:00:8a:60");
|
||||
mtu = 9216; # check if xran uses this properly
|
||||
fh_config = ({
|
||||
Tadv_cp_dl = 125;
|
||||
T2a_cp_dl = (285, 429); # (min, max)
|
||||
T2a_cp_ul = (285, 429); # (min, max)
|
||||
T2a_up = (125, 428); # (min, max)
|
||||
Ta3 = (130, 170); # (min, max)
|
||||
T1a_cp_dl = (285, 470); # (min, max)
|
||||
T1a_cp_ul = (285, 429); # (min, max)
|
||||
T1a_up = (125, 350); # (min, max)
|
||||
Ta4 = (110, 180); # (min, max)
|
||||
ru_config = {
|
||||
iq_width = 9;
|
||||
iq_width_prach = 9;
|
||||
fft_size = 12;
|
||||
};
|
||||
prach_config = {
|
||||
eAxC_offset = 4;
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
@@ -0,0 +1,306 @@
|
||||
Active_gNBs = ( "gNB-Geo5G-3");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
sa=1;
|
||||
|
||||
device: { name = "rfsimulator" }
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xbf0;
|
||||
gNB_name = "gNB-Geo5G-3";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 0x0001;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); });
|
||||
|
||||
nr_cellid = 262160L;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
pdsch_AntennaPorts_N1 = 2;
|
||||
maxMIMO_layers = 2;
|
||||
pusch_AntennaPorts = 4;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 1 ;
|
||||
sib1_tda = 15;
|
||||
min_rxtxtime =6;
|
||||
enable_sdap =0;
|
||||
ssb_SubcarrierOffset =0;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
controlResourceSetZero = 12;
|
||||
searchSpaceZero = 0;
|
||||
}
|
||||
);
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 2;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||
absoluteFrequencySSB = 641280;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 640008;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 12;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 106;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 3;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 4;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ( { ipv4 = "192.168.70.132";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.143/24";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.143/24";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 150;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
ulsch_max_frame_inactivity = 20;
|
||||
dl_harq_round_max = 4;
|
||||
ul_harq_round_max = 4;
|
||||
}
|
||||
);
|
||||
|
||||
positioning_config = (
|
||||
{
|
||||
NumTRPs = 4; # number of TRPs this match with total number of antenas set in config file
|
||||
#gNBID = 0xe03;
|
||||
#nrcellid = 262160L;
|
||||
TRPIDs = [31,32,33,34]; # userdefined distinct IDs
|
||||
TRPxAxis = [31,2,50,35]; # X-axis value of each TRP in millimeter
|
||||
TRPyAxis = [12,1,62,34]; # Y-axis value of each TRP in millimeter
|
||||
TRPzAxis = [46,28,33,32]; # Z-axis value of each TRP millimeter
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 120;
|
||||
pucch0_dtx_threshold = 150;
|
||||
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "yes"
|
||||
nb_tx = 4
|
||||
nb_rx = 4
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 114;
|
||||
eNB_instances = [0];
|
||||
#beamforming 1x4 matrix:
|
||||
bf_weights = [0x00007fff, 0x0000, 0x00007fff, 0x0000];
|
||||
clock_src = "internal";
|
||||
}
|
||||
);
|
||||
|
||||
THREAD_STRUCT = (
|
||||
{
|
||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||
worker_config = "WORKER_ENABLE";
|
||||
}
|
||||
);
|
||||
|
||||
rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = "4043";
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config = {
|
||||
global_log_level = "info";
|
||||
hw_log_level ="info";
|
||||
phy_log_level ="info";
|
||||
mac_log_level ="info";
|
||||
rlc_log_level ="info";
|
||||
pdcp_log_level ="info";
|
||||
rrc_log_level ="info";
|
||||
ngap_log_level ="debug";
|
||||
nrppa_log_level ="debug";
|
||||
f1ap_log_level ="debug";
|
||||
};
|
||||
|
||||
telnetsrv = {
|
||||
listenport = 9081
|
||||
listenaddr= "127.0.0.81"
|
||||
histfile = "~/history.telnetsrv"
|
||||
}
|
||||
|
||||
@include "channelmod_rfsimu.conf"
|
||||
@@ -0,0 +1,122 @@
|
||||
# UL-TDoA Positioning Testing Setup
|
||||
|
||||
## Part 1: single gNB
|
||||
|
||||
### Step 1 Pull Core Network Functions
|
||||
```
|
||||
docker pull oaisoftwarealliance/ims:latest
|
||||
docker pull oaisoftwarealliance/oai-amf:develop
|
||||
docker pull oaisoftwarealliance/oai-nrf:develop
|
||||
docker pull oaisoftwarealliance/oai-smf:develop
|
||||
docker pull oaisoftwarealliance/oai-udr:develop
|
||||
docker pull oaisoftwarealliance/oai-upf:develop
|
||||
docker pull oaisoftwarealliance/oai-udm:develop
|
||||
docker pull oaisoftwarealliance/oai-ausf:develop
|
||||
docker pull oaisoftwarealliance/oai-lmf:develop
|
||||
```
|
||||
|
||||
Utility image to generate traffic
|
||||
|
||||
`docker pull oaisoftwarealliance/trf-gen-cn5g:latest`
|
||||
|
||||
### Step 2 Pull RAN Repository and Bulid gNB and nrUE
|
||||
|
||||
Create working folder for Example OAI_RAN
|
||||
|
||||
```
|
||||
cd OAI_RAN
|
||||
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
|
||||
cd openairinterface5g/cmake_targets
|
||||
git checkout NRPPA_Procedures
|
||||
./build_oai -I # install dependencies
|
||||
./build_oai --gNB --nrUE -w SIMU # compile gNB and nrUE
|
||||
```
|
||||
|
||||
### Step 3 Start the 5G core
|
||||
|
||||
```
|
||||
cd OAI_RAN/openairinterface5g/doc/tutorial_resources/oai-cn5g
|
||||
sudo docker compose -f docker-compose.yaml up -d
|
||||
```
|
||||
|
||||
Check the status of the core if all NF are healthy
|
||||
|
||||
`docker ps -a`
|
||||
|
||||
To stop the core
|
||||
|
||||
`sudo docker compose -f docker-compose.yaml down`
|
||||
|
||||
### Step 4 Starting gnb
|
||||
|
||||
Open a terminal
|
||||
|
||||
```
|
||||
cd OAI_RAN/openairinterface5g/cmake_targets/ran_build/build
|
||||
sudo ./nr-softmodem --rfsim --rfsimulator.serveraddr server --sa -O ~/OAI_RAN/doc/tutorial_resources/positioning_tutorial/conf/gnb1.sa.band78.106prb.rfsim4x4.conf
|
||||
```
|
||||
|
||||
Make sure to have channelmod conf file in conf folder for rfsimulator testing
|
||||
|
||||
### Step 5 Starting UE
|
||||
|
||||
Open a terminal
|
||||
|
||||
```
|
||||
cd OAI_RAN/openairinterface5g/cmake_targets/ran_build/build
|
||||
sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --rfsimulator.serveraddr 127.0.0.1 --sa --uicc0.imsi 001010000000001
|
||||
```
|
||||
|
||||
TODO: create ue.conf and include channel model
|
||||
|
||||
### Step 6 External API to initiate Positioning request
|
||||
|
||||
Send the http post request at LMF address (as per our docker compose file http://192.168.70.141:80) to LMF determine location API to initiate the Positioning procedure
|
||||
|
||||
```
|
||||
cd OAI_RAN/doc/tutorial_resources/positioning_tutorial/conf
|
||||
curl --http2-prior-knowledge -H "Content-Type: application/json" -d "@InputData.json" -X POST http://192.168.70.141:8080/nlmf-loc/v1/determine-location
|
||||
```
|
||||
|
||||
## Part 2: multi gNB (on same host)
|
||||
|
||||
### Deploy 5G core
|
||||
|
||||
same as above
|
||||
|
||||
### setup IP addresses for gNBs
|
||||
|
||||
For the 2nd and 3rd gNB we need to add IP addresses. For convenience we add them directly to the docker network that has been created for the core network.
|
||||
|
||||
```
|
||||
sudo ip address add 192.168.70.142/26 dev oai-cn5g
|
||||
sudo ip address add 192.168.70.143/26 dev oai-cn5g
|
||||
```
|
||||
|
||||
### start UE
|
||||
|
||||
In the multi-gNB setup we need to invert the roles of client and server for the rfsimulator to make sure the gNBs are synchronized among themselves. I.e. the UE becomes the rfsimulator server and the gNBs the rfsimulator clients.
|
||||
|
||||
```
|
||||
sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --sa --rfsimulator.serveraddr server --uicc0.imsi 001010000000001
|
||||
```
|
||||
|
||||
### start gNBs
|
||||
|
||||
Once the core is up and IPs are set we can
|
||||
|
||||
```
|
||||
sudo ./nr-softmodem --rfsim --rfsimulator.serveraddr 127.0.0.1 --sa -O ~/OAI_RAN/doc/tutorial_resources/positioning_tutorial/conf/gnb1.sa.band78.106prb.rfsim4x4.conf
|
||||
sudo ./nr-softmodem --rfsim --rfsimulator.serveraddr 127.0.0.1 --sa -O ~/OAI_RAN/doc/tutorial_resources/positioning_tutorial/conf/gnb2.sa.band78.106prb.rfsim2x2.conf
|
||||
sudo ./nr-softmodem --rfsim --rfsimulator.serveraddr 127.0.0.1 --sa -O ~/OAI_RAN/doc/tutorial_resources/positioning_tutorial/conf/gnb3.sa.band78.106prb.rfsim.conf
|
||||
```
|
||||
|
||||
Here in this example, just to check multiple TRPs is working fine, we are running gNB 1 with 4 TRPs, gNB 2 with 2 TRPs, and gNB3 with 1 TRP. So in our measurement response, each gNB should be sending ToA as per their TRP number.
|
||||
|
||||
|
||||
### initiate the localization procedure
|
||||
|
||||
```
|
||||
curl --http2-prior-knowledge -H "Content-Type: application/json" -d "@InputData.json" -X POST http://192.168.70.141:8080/nlmf-loc/v1/determine-location
|
||||
```
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
FROM ran-base:latest AS gnb-base
|
||||
|
||||
FROM ran-build-fhi72:latest AS gnb-build
|
||||
FROM ran-build:latest AS gnb-build
|
||||
|
||||
|
||||
#start from scratch for target executable
|
||||
|
||||
66
docker/Dockerfile.nrppa.rhel9
Normal file
66
docker/Dockerfile.nrppa.rhel9
Normal file
@@ -0,0 +1,66 @@
|
||||
#/*
|
||||
# * 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
|
||||
# */
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# Dockerfile for the Open-Air-Interface RAN Build for FHI 7.2
|
||||
# Valid for UBI9
|
||||
#
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
FROM ran-base:latest as ran-base
|
||||
|
||||
ENV TZ=Europe
|
||||
ARG E2AP_VERSION=E2AP_V3
|
||||
ARG KPM_VERSION=KPM_V3_00
|
||||
|
||||
RUN rm -Rf /oai-ran
|
||||
WORKDIR /oai-ran
|
||||
COPY . .
|
||||
|
||||
## Download and build DPDK
|
||||
RUN wget http://fast.dpdk.org/rel/dpdk-20.11.9.tar.xz && \
|
||||
tar -xvf dpdk-20.11.9.tar.xz && \
|
||||
cd dpdk-stable-20.11.9 && \
|
||||
meson build && \
|
||||
ninja -C build && \
|
||||
ninja install -C build
|
||||
|
||||
## Build Fronthaul library
|
||||
RUN git clone https://gerrit.o-ran-sc.org/r/o-du/phy.git /opt/phy && \
|
||||
cd /opt/phy && \
|
||||
git checkout oran_e_maintenance_release_v1.0 &&\
|
||||
git apply /oai-ran/cmake_targets/tools/oran_fhi_integration_patches/E/oaioran_E.patch && \
|
||||
cd /opt/phy/fhi_lib/lib && \
|
||||
RTE_SDK=/oai-ran/dpdk-stable-20.11.9/ XRAN_DIR=/opt/phy/fhi_lib make XRAN_LIB_SO=1
|
||||
|
||||
## Build and install OAI
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
scl enable gcc-toolset-12 "\
|
||||
./build_oai \
|
||||
--gNB \
|
||||
-t oran_fhlib_5g --cmake-opt -Dxran_LOCATION=/opt/phy/fhi_lib/lib " && \
|
||||
# Mainly to see if the sanitize option was perfectly executed
|
||||
ldd ran_build/build/nr-softmodem && \
|
||||
ldd ran_build/build/liboran_fhlib_5g.so && \
|
||||
ldd /opt/phy/fhi_lib/lib/build/libxran.so
|
||||
|
||||
@@ -75,6 +75,7 @@ unsigned short config_frames[4] = {2,9,11,13};
|
||||
#include "NB_IoT_interface.h"
|
||||
#include "x2ap_eNB.h"
|
||||
#include "ngap_gNB.h"
|
||||
#include "nrppa_gNB.h"
|
||||
#include "gnb_paramdef.h"
|
||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||
#include "nfapi/oai_integration/vendor_ext.h"
|
||||
@@ -356,6 +357,11 @@ static int create_gNB_tasks(ngran_node_t node_type, configmodule_interface_t *cf
|
||||
LOG_E(NGAP, "Create task for NGAP failed\n");
|
||||
return -1;
|
||||
}
|
||||
RCconfig_nr_positioning();
|
||||
if (itti_create_task (TASK_NRPPA, nrppa_gNB_task, NULL) < 0) {
|
||||
LOG_E(NRPPA, "Create task for NRPPA failed\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
2
maketags
2
maketags
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
echo "building ctags for openair1 and openair2 ..."
|
||||
ctags -e -R --exclude=openair1/DOCS/ --exclude=openair2/DOCS/ --exclude=openair1/SIMULATION/ --exclude=targets/DOCS/ --exclude=targets/PROJECTS/ openair1 openair2 openair3 targets cmake_targets common fapi nfapi executables radio
|
||||
ctags -e -R --exclude=openair1/DOCS/ --exclude=openair2/DOCS/ --exclude=openair1/SIMULATION/ --exclude=targets/DOCS/ --exclude=targets/PROJECTS/ openair1 openair2 openair3 targets cmake_targets common nfapi executables radio
|
||||
|
||||
|
||||
@@ -43,7 +43,8 @@ typedef enum {
|
||||
NFAPI_NR_SRS_BEAMMANAGEMENT = 0,
|
||||
NFAPI_NR_SRS_CODEBOOK = 1,
|
||||
NFAPI_NR_SRS_NONCODEBOOK = 2,
|
||||
NFAPI_NR_SRS_ANTENNASWITCH = 3
|
||||
NFAPI_NR_SRS_ANTENNASWITCH = 3,
|
||||
NFAPI_NR_SRS_LOCALIZATION = 4
|
||||
} nfapi_nr_srs_usage_e;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -38,14 +38,15 @@
|
||||
|
||||
extern openair0_config_t openair0_cfg[MAX_CARDS];
|
||||
|
||||
int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms,
|
||||
const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]) {
|
||||
int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms,
|
||||
const uint8_t N_ap_srs,
|
||||
const int32_t srs_estimated_channel_time[N_ap_srs][frame_parms->ofdm_symbol_size]) {
|
||||
int timing_advance = 0;
|
||||
int max_val = 0;
|
||||
|
||||
for (int i = 0; i < frame_parms->ofdm_symbol_size; i++) {
|
||||
int temp = 0;
|
||||
for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
|
||||
for (int aa = 0; aa < N_ap_srs; aa++) {
|
||||
int Re = ((c16_t*)srs_estimated_channel_time[aa])[i].r;
|
||||
int Im = ((c16_t*)srs_estimated_channel_time[aa])[i].i;
|
||||
temp += (Re*Re/2) + (Im*Im/2);
|
||||
|
||||
@@ -41,8 +41,107 @@
|
||||
//#define SRS_DEBUG
|
||||
|
||||
#define NO_INTERP 1
|
||||
#define NR_SRS_IDFT_OVERSAMP_FACTOR 8
|
||||
#define dBc(x,y) (dB_fixed(((int32_t)(x))*(x) + ((int32_t)(y))*(y)))
|
||||
|
||||
/* Generic function to find the peak of channel estimation buffer */
|
||||
int nr_est_toa_ns_srs(NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t N_arx,
|
||||
uint8_t N_ap,
|
||||
uint8_t N_symb_srs,
|
||||
int32_t srs_estimated_channel_freq[N_arx][N_ap][frame_parms->ofdm_symbol_size * N_symb_srs],
|
||||
int16_t *srs_toa_ns)
|
||||
{
|
||||
|
||||
int32_t chF_interpol[N_ap][NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size] __attribute__((aligned(32)));
|
||||
int32_t chT_interpol[N_ap][NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size] __attribute__((aligned(32)));
|
||||
int32_t chT_interpol_mag_squ_avg[NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size] __attribute__((aligned(32)));
|
||||
memset(chF_interpol,0,sizeof(chF_interpol));
|
||||
memset(chT_interpol,0,sizeof(chT_interpol));
|
||||
|
||||
int32_t max_val = 0, max_idx = 0, abs_val = 0, mean_val = 0;
|
||||
|
||||
int16_t start_offset = NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size - (frame_parms->ofdm_symbol_size>>1);
|
||||
|
||||
for (int arx_index = 0; arx_index < N_arx; arx_index++) {
|
||||
|
||||
memset(chT_interpol_mag_squ_avg,0,sizeof(chT_interpol_mag_squ_avg));
|
||||
|
||||
for (int symb = 0; symb < N_symb_srs; symb++){
|
||||
|
||||
for (int ap_index = 0; ap_index < N_ap; ap_index++) {
|
||||
|
||||
// Place SRS channel estimates in FFT shifted format for oversampling
|
||||
memcpy((int16_t *)&chF_interpol[ap_index][0], &srs_estimated_channel_freq[arx_index][ap_index][symb*frame_parms->ofdm_symbol_size], (frame_parms->ofdm_symbol_size>>1) * sizeof(int32_t));
|
||||
memcpy((int16_t *)&chF_interpol[ap_index][start_offset], &srs_estimated_channel_freq[arx_index][ap_index][symb*frame_parms->ofdm_symbol_size + (frame_parms->ofdm_symbol_size>>1)], (frame_parms->ofdm_symbol_size>>1) * sizeof(int32_t));
|
||||
|
||||
// Convert to time domain oversampled
|
||||
freq2time(frame_parms->ofdm_symbol_size*NR_SRS_IDFT_OVERSAMP_FACTOR,
|
||||
(int16_t*) chF_interpol[ap_index],
|
||||
(int16_t*) chT_interpol[ap_index]);
|
||||
|
||||
for(int k = 0; k < NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size; k++) {
|
||||
|
||||
chT_interpol_mag_squ_avg[k] += squaredMod(((c16_t*)chT_interpol[ap_index])[k]);
|
||||
|
||||
} // Loop over samples
|
||||
} // antenna port loop
|
||||
} // SRS OFDM symbol loop
|
||||
|
||||
|
||||
// average over SRS symbols
|
||||
for(int k = 0; k < NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size; k++) {
|
||||
chT_interpol_mag_squ_avg[k] /= N_symb_srs;
|
||||
}
|
||||
|
||||
max_val = 0, max_idx = 0, mean_val = 0;
|
||||
for(int k = 0; k < NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size; k++) {
|
||||
abs_val = chT_interpol_mag_squ_avg[k];
|
||||
mean_val += (abs_val - mean_val)/(k+1);
|
||||
if(abs_val > max_val) {
|
||||
max_val = abs_val;
|
||||
max_idx = k;
|
||||
}
|
||||
}
|
||||
|
||||
if(max_idx > NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size >>1)
|
||||
max_idx = max_idx - NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size;
|
||||
|
||||
// Check for detection threshold
|
||||
|
||||
//LOG_I(PHY, "SRS ToA before (RX ant %d): max_val %d, mean_val %d, max_idx %d\n", arx_index, max_val, mean_val, max_idx);
|
||||
if ((mean_val >= 100) && (max_val / mean_val > 100)) {
|
||||
srs_toa_ns[arx_index] = (max_idx*1e9)/(NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->samples_per_frame*100);
|
||||
} else {
|
||||
srs_toa_ns[arx_index] = 0x8000;
|
||||
}
|
||||
//LOG_I(PHY, "SRS ToA estimator (RX ant %d): toa %d ns\n",arx_index,srs_toa_ns[arx_index]);
|
||||
} // Antenna loop
|
||||
|
||||
// Add T tracer to log these chF and chT
|
||||
/*
|
||||
T(T_GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE_OVER_SAMPLING,
|
||||
T_INT(0),
|
||||
T_INT(srs_pdu->rnti),
|
||||
T_INT(frame),
|
||||
T_INT(0),
|
||||
T_INT(0),
|
||||
T_BUFFER(chF_interpol[0][0], NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size * sizeof(int32_t)));
|
||||
|
||||
T(T_GNB_PHY_UL_TIME_CHANNEL_ESTIMATE_OVER_SAMPLING,
|
||||
T_INT(0),
|
||||
T_INT(srs_pdu->rnti),
|
||||
T_INT(frame),
|
||||
T_INT(0),
|
||||
T_INT(0),
|
||||
T_BUFFER(chT_interpol[0][0], NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size * sizeof(int32_t)));
|
||||
*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
__attribute__((always_inline)) inline c16_t c32x16cumulVectVectWithSteps(c16_t *in1,
|
||||
int *offset1,
|
||||
const int step1,
|
||||
@@ -512,7 +611,7 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
||||
c16_t *phase_per_symbol = (c16_t *)pusch_vars->ptrs_phase_per_slot[aarx];
|
||||
ptrs_re_symbol = &pusch_vars->ptrs_re_per_slot;
|
||||
*ptrs_re_symbol = 0;
|
||||
phase_per_symbol[symbol].i = 0;
|
||||
phase_per_symbol[symbol].i = 0;
|
||||
/* set DMRS estimates to 0 angle with magnitude 1 */
|
||||
if(is_dmrs_symbol(symbol,*dmrsSymbPos)) {
|
||||
/* set DMRS real estimation to 32767 */
|
||||
@@ -522,7 +621,7 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
||||
#endif
|
||||
}
|
||||
else {// real ptrs value is set to 0
|
||||
phase_per_symbol[symbol].r = 0;
|
||||
phase_per_symbol[symbol].r = 0;
|
||||
}
|
||||
|
||||
if(symbol == *startSymbIndex) {
|
||||
@@ -676,116 +775,120 @@ int nr_srs_channel_estimation(
|
||||
LOG_I(NR_PHY,"====================== UE port %d --> gNB Rx antenna %i ======================\n", p_index, ant);
|
||||
#endif
|
||||
|
||||
uint16_t subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0];
|
||||
if (subcarrier>frame_parms->ofdm_symbol_size) {
|
||||
subcarrier -= frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
// Estimate the SRS channel over all OFDM symbols
|
||||
for (int srs_symb = 0; srs_symb<(1<<srs_pdu->num_symbols); srs_symb++) {
|
||||
uint16_t srs_symbol_offset =srs_symb*frame_parms->ofdm_symbol_size;
|
||||
uint16_t subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][srs_symb];
|
||||
if (subcarrier>frame_parms->ofdm_symbol_size) {
|
||||
subcarrier -= frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
|
||||
int16_t *srs_estimated_channel16 = (int16_t *)&srs_est[subcarrier + mem_offset];
|
||||
int16_t *srs_estimated_channel16 = (int16_t *)&srs_est[subcarrier + srs_symbol_offset + mem_offset];
|
||||
|
||||
for (int k = 0; k < M_sc_b_SRS; k++) {
|
||||
|
||||
for (int k = 0; k < M_sc_b_SRS; k++) {
|
||||
if (k%fd_cdm==0) {
|
||||
|
||||
if (k%fd_cdm==0) {
|
||||
ls_estimated[0] = 0;
|
||||
ls_estimated[1] = 0;
|
||||
uint16_t subcarrier_cdm = subcarrier;
|
||||
|
||||
ls_estimated[0] = 0;
|
||||
ls_estimated[1] = 0;
|
||||
uint16_t subcarrier_cdm = subcarrier;
|
||||
for (int cdm_idx = 0; cdm_idx < fd_cdm; cdm_idx++) {
|
||||
int16_t generated_real = srs_generated_signal[p_index][subcarrier_cdm + srs_symbol_offset].r;
|
||||
int16_t generated_imag = srs_generated_signal[p_index][subcarrier_cdm + srs_symbol_offset].i;
|
||||
|
||||
for (int cdm_idx = 0; cdm_idx < fd_cdm; cdm_idx++) {
|
||||
int16_t generated_real = srs_generated_signal[p_index][subcarrier_cdm].r;
|
||||
int16_t generated_imag = srs_generated_signal[p_index][subcarrier_cdm].i;
|
||||
int16_t received_real = ((c16_t*)srs_received_signal[ant])[subcarrier_cdm + srs_symbol_offset].r;
|
||||
int16_t received_imag = ((c16_t*)srs_received_signal[ant])[subcarrier_cdm + srs_symbol_offset].i;
|
||||
|
||||
int16_t received_real = ((c16_t*)srs_received_signal[ant])[subcarrier_cdm].r;
|
||||
int16_t received_imag = ((c16_t*)srs_received_signal[ant])[subcarrier_cdm].i;
|
||||
// We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and generated_imag.
|
||||
// So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 bits.
|
||||
ls_estimated[0] += (int16_t)(((int32_t)generated_real*received_real + (int32_t)generated_imag*received_imag)>>nr_srs_info->srs_generated_signal_bits);
|
||||
ls_estimated[1] += (int16_t)(((int32_t)generated_real*received_imag - (int32_t)generated_imag*received_real)>>nr_srs_info->srs_generated_signal_bits);
|
||||
|
||||
// We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and generated_imag.
|
||||
// So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 bits.
|
||||
ls_estimated[0] += (int16_t)(((int32_t)generated_real*received_real + (int32_t)generated_imag*received_imag)>>nr_srs_info->srs_generated_signal_bits);
|
||||
ls_estimated[1] += (int16_t)(((int32_t)generated_real*received_imag - (int32_t)generated_imag*received_real)>>nr_srs_info->srs_generated_signal_bits);
|
||||
|
||||
// Subcarrier increment
|
||||
subcarrier_cdm += K_TC;
|
||||
if (subcarrier_cdm >= frame_parms->ofdm_symbol_size) {
|
||||
subcarrier_cdm=subcarrier_cdm-frame_parms->ofdm_symbol_size;
|
||||
// Subcarrier increment
|
||||
subcarrier_cdm += K_TC;
|
||||
if (subcarrier_cdm >= frame_parms->ofdm_symbol_size) {
|
||||
subcarrier_cdm=subcarrier_cdm-frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
srs_ls_estimated_channel[subcarrier].r = ls_estimated[0];
|
||||
srs_ls_estimated_channel[subcarrier].i = ls_estimated[1];
|
||||
srs_ls_estimated_channel[subcarrier + srs_symbol_offset].r = ls_estimated[0];
|
||||
srs_ls_estimated_channel[subcarrier + srs_symbol_offset].i = ls_estimated[1];
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
int subcarrier_log = subcarrier-subcarrier_offset;
|
||||
if(subcarrier_log < 0) {
|
||||
subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
if(subcarrier_log%12 == 0) {
|
||||
LOG_I(NR_PHY,"------------------------------------ %d ------------------------------------\n", subcarrier_log/12);
|
||||
LOG_I(NR_PHY,"\t __genRe________genIm__|____rxRe_________rxIm__|____lsRe________lsIm_\n");
|
||||
}
|
||||
LOG_I(NR_PHY,"(%4i) %6i\t%6i | %6i\t%6i | %6i\t%6i\n",
|
||||
subcarrier_log,
|
||||
((c16_t*)srs_generated_signal[p_index])[subcarrier].r, ((c16_t*)srs_generated_signal[p_index])[subcarrier].i,
|
||||
((c16_t*)srs_received_signal[ant])[subcarrier].r, ((c16_t*)srs_received_signal[ant])[subcarrier].i,
|
||||
ls_estimated[0], ls_estimated[1]);
|
||||
#endif
|
||||
|
||||
const uint16_t sc_offset = subcarrier + mem_offset;
|
||||
|
||||
// Channel interpolation
|
||||
if(srs_pdu->comb_size == 0) {
|
||||
if(k == 0) { // First subcarrier case
|
||||
// filt8_start is {12288,8192,4096,0,0,0,0,0}
|
||||
multadd_real_vector_complex_scalar(filt8_start, ls_estimated, srs_estimated_channel16, 8);
|
||||
} else if(subcarrier < K_TC) { // Start of OFDM symbol case
|
||||
// filt8_start is {12288,8192,4096,0,0,0,0,0}
|
||||
srs_estimated_channel16 = (int16_t *)&srs_est[subcarrier];
|
||||
const short *filter = mem_offset == 0 ? filt8_start : filt8_start_shift2;
|
||||
multadd_real_vector_complex_scalar(filter, ls_estimated, srs_estimated_channel16, 8);
|
||||
} else if((subcarrier+K_TC)>=frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS-1)) { // End of OFDM symbol or last subcarrier cases
|
||||
// filt8_end is {4096,8192,12288,16384,0,0,0,0}
|
||||
const short *filter = mem_offset == 0 || k == (M_sc_b_SRS - 1) ? filt8_end : filt8_end_shift2;
|
||||
multadd_real_vector_complex_scalar(filter, ls_estimated, srs_estimated_channel16, 8);
|
||||
} else if(k%2 == 1) { // 1st middle case
|
||||
// filt8_middle2 is {4096,8192,8192,8192,4096,0,0,0}
|
||||
multadd_real_vector_complex_scalar(filt8_middle2, ls_estimated, srs_estimated_channel16, 8);
|
||||
} else if(k%2 == 0) { // 2nd middle case
|
||||
// filt8_middle4 is {0,0,4096,8192,8192,8192,4096,0}
|
||||
multadd_real_vector_complex_scalar(filt8_middle4, ls_estimated, srs_estimated_channel16, 8);
|
||||
srs_estimated_channel16 = (int16_t *)&srs_est[sc_offset];
|
||||
#ifdef SRS_DEBUG
|
||||
int subcarrier_log = subcarrier-subcarrier_offset;
|
||||
if(subcarrier_log < 0) {
|
||||
subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
} else {
|
||||
if(k == 0) { // First subcarrier case
|
||||
// filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0}
|
||||
multadd_real_vector_complex_scalar(filt16_start, ls_estimated, srs_estimated_channel16, 16);
|
||||
} else if(subcarrier < K_TC) { // Start of OFDM symbol case
|
||||
srs_estimated_channel16 = (int16_t *)&srs_est[sc_offset];
|
||||
// filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0}
|
||||
multadd_real_vector_complex_scalar(filt16_start, ls_estimated, srs_estimated_channel16, 16);
|
||||
} else if((subcarrier+K_TC)>=frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS-1)) { // End of OFDM symbol or last subcarrier cases
|
||||
// filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}
|
||||
multadd_real_vector_complex_scalar(filt16_end, ls_estimated, srs_estimated_channel16, 16);
|
||||
} else { // Middle case
|
||||
// filt16_middle4 is {4096,8192,8192,8192,8192,8192,8192,8192,4096,0,0,0,0,0,0,0}
|
||||
multadd_real_vector_complex_scalar(filt16_middle4, ls_estimated, srs_estimated_channel16, 16);
|
||||
srs_estimated_channel16 = (int16_t *)&srs_est[sc_offset];
|
||||
if(subcarrier_log%12 == 0) {
|
||||
LOG_I(NR_PHY,"------------------------------------ %d ------------------------------------\n", subcarrier_log/12);
|
||||
LOG_I(NR_PHY,"\t __genRe________genIm__|____rxRe_________rxIm__|____lsRe________lsIm_\n");
|
||||
}
|
||||
}
|
||||
LOG_I(NR_PHY,"(%4i) %6i\t%6i | %6i\t%6i | %6i\t%6i\n",
|
||||
subcarrier_log,
|
||||
((c16_t*)srs_generated_signal[p_index])[subcarrier].r, ((c16_t*)srs_generated_signal[p_index])[subcarrier].i,
|
||||
((c16_t*)srs_received_signal[ant])[subcarrier].r, ((c16_t*)srs_received_signal[ant])[subcarrier].i,
|
||||
ls_estimated[0], ls_estimated[1]);
|
||||
#endif
|
||||
|
||||
// Subcarrier increment
|
||||
subcarrier += K_TC;
|
||||
if (subcarrier >= frame_parms->ofdm_symbol_size) {
|
||||
subcarrier=subcarrier-frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
const uint16_t sc_offset = subcarrier + mem_offset;
|
||||
|
||||
} // for (int k = 0; k < M_sc_b_SRS; k++)
|
||||
// Channel interpolation
|
||||
if(srs_pdu->comb_size == 0) {
|
||||
if(k == 0) { // First subcarrier case
|
||||
// filt8_start is {12288,8192,4096,0,0,0,0,0}
|
||||
multadd_real_vector_complex_scalar(filt8_start, ls_estimated, srs_estimated_channel16, 8);
|
||||
} else if(subcarrier < K_TC) { // Start of OFDM symbol case
|
||||
// filt8_start is {12288,8192,4096,0,0,0,0,0}
|
||||
srs_estimated_channel16 = (int16_t *)&srs_est[subcarrier + srs_symbol_offset];
|
||||
const short *filter = mem_offset == 0 ? filt8_start : filt8_start_shift2;
|
||||
multadd_real_vector_complex_scalar(filter, ls_estimated, srs_estimated_channel16, 8);
|
||||
} else if((subcarrier+K_TC)>=frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS-1)) { // End of OFDM symbol or last subcarrier cases
|
||||
// filt8_end is {4096,8192,12288,16384,0,0,0,0}
|
||||
const short *filter = mem_offset == 0 || k == (M_sc_b_SRS - 1) ? filt8_end : filt8_end_shift2;
|
||||
multadd_real_vector_complex_scalar(filter, ls_estimated, srs_estimated_channel16, 8);
|
||||
} else if(k%2 == 1) { // 1st middle case
|
||||
// filt8_middle2 is {4096,8192,8192,8192,4096,0,0,0}
|
||||
multadd_real_vector_complex_scalar(filt8_middle2, ls_estimated, srs_estimated_channel16, 8);
|
||||
} else if(k%2 == 0) { // 2nd middle case
|
||||
// filt8_middle4 is {0,0,4096,8192,8192,8192,4096,0}
|
||||
multadd_real_vector_complex_scalar(filt8_middle4, ls_estimated, srs_estimated_channel16, 8);
|
||||
srs_estimated_channel16 = (int16_t *)&srs_est[sc_offset + srs_symbol_offset];
|
||||
}
|
||||
} else {
|
||||
if(k == 0) { // First subcarrier case
|
||||
// filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0}
|
||||
multadd_real_vector_complex_scalar(filt16_start, ls_estimated, srs_estimated_channel16, 16);
|
||||
} else if(subcarrier < K_TC) { // Start of OFDM symbol case
|
||||
srs_estimated_channel16 = (int16_t *)&srs_est[sc_offset + srs_symbol_offset];
|
||||
// filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0}
|
||||
multadd_real_vector_complex_scalar(filt16_start, ls_estimated, srs_estimated_channel16, 16);
|
||||
} else if((subcarrier+K_TC)>=frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS-1)) { // End of OFDM symbol or last subcarrier cases
|
||||
// filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}
|
||||
multadd_real_vector_complex_scalar(filt16_end, ls_estimated, srs_estimated_channel16, 16);
|
||||
} else { // Middle case
|
||||
// filt16_middle4 is {4096,8192,8192,8192,8192,8192,8192,8192,4096,0,0,0,0,0,0,0}
|
||||
multadd_real_vector_complex_scalar(filt16_middle4, ls_estimated, srs_estimated_channel16, 16);
|
||||
srs_estimated_channel16 = (int16_t *)&srs_est[sc_offset + srs_symbol_offset];
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(&srs_estimated_channel_freq[ant][p_index][0],
|
||||
&srs_est[mem_offset],
|
||||
(frame_parms->ofdm_symbol_size*(1<<srs_pdu->num_symbols))*sizeof(int32_t));
|
||||
// Subcarrier increment
|
||||
subcarrier += K_TC;
|
||||
if (subcarrier >= frame_parms->ofdm_symbol_size) {
|
||||
subcarrier=subcarrier-frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
|
||||
} // for (int k = 0; k < M_sc_b_SRS; k++)
|
||||
} // for (int srs_symb = 0; srs_symb<(1<<srs_pdu->num_symbols); srs_symb++)
|
||||
|
||||
memcpy(&srs_estimated_channel_freq[ant][p_index][0],
|
||||
&srs_est[mem_offset],
|
||||
((1<<srs_pdu->num_symbols)*frame_parms->ofdm_symbol_size)*sizeof(int32_t));
|
||||
|
||||
// Compute noise
|
||||
subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0];
|
||||
uint16_t subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0];
|
||||
if (subcarrier>frame_parms->ofdm_symbol_size) {
|
||||
subcarrier -= frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
@@ -801,6 +904,15 @@ int nr_srs_channel_estimation(
|
||||
}
|
||||
}
|
||||
|
||||
// Compute signal power
|
||||
uint32_t signal_power_ant = calc_power(&ch_real[base_idx], M_sc_b_SRS) + calc_power(&ch_imag[base_idx], M_sc_b_SRS);
|
||||
|
||||
//#ifdef SRS_DEBUG
|
||||
LOG_D(NR_PHY,"signal_power(p_index %d, ant %d) = %d dB\n", p_index, ant, dB_fixed(signal_power_ant));
|
||||
//#endif
|
||||
|
||||
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0];
|
||||
if (subcarrier>frame_parms->ofdm_symbol_size) {
|
||||
@@ -847,24 +959,24 @@ int nr_srs_channel_estimation(
|
||||
memcpy(&srs_estimated_channel_time_shifted[ant][p_index][gNB->frame_parms.ofdm_symbol_size>>1],
|
||||
&srs_estimated_channel_time[ant][p_index][0],
|
||||
(gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t));
|
||||
|
||||
} // for (int p_index = 0; p_index < N_ap; p_index++)
|
||||
} // for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++)
|
||||
|
||||
// Compute signal power
|
||||
uint32_t signal_power = calc_power(ch_real, arr_len) + calc_power(ch_imag, arr_len);
|
||||
|
||||
// Compute signal power
|
||||
uint32_t signal_power = calc_power(ch_real, arr_len) + calc_power(ch_imag, arr_len);
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_PHY,"signal_power = %u\n", signal_power);
|
||||
LOG_I(NR_PHY,"signal_power(p_index %d, ant %d) = %d dB\n", p_index, ant, dB_fixed(signal_power));
|
||||
#endif
|
||||
|
||||
if (signal_power == 0) {
|
||||
LOG_W(NR_PHY, "Received SRS signal power is 0\n");
|
||||
return -1;
|
||||
}
|
||||
if (signal_power == 0) {
|
||||
LOG_W(NR_PHY, "Received SRS signal power is 0\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
// Compute noise power
|
||||
|
||||
const uint8_t signal_power_bits = log2_approx(signal_power);
|
||||
const uint8_t factor_bits = signal_power_bits < 32 ? 32 - signal_power_bits : 0; // 32 due to input of dB_fixed(uint32_t x)
|
||||
const int32_t factor_dB = dB_fixed(1<<factor_bits);
|
||||
@@ -912,6 +1024,5 @@ int nr_srs_channel_estimation(
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_PHY,"noise_power = %u, SNR = %i dB\n", noise_power, *snr);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -63,7 +63,15 @@ void nr_gnb_measurements(PHY_VARS_gNB *gNB,
|
||||
uint8_t nrOfLayers);
|
||||
|
||||
int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms,
|
||||
const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]);
|
||||
uint8_t N_ap,
|
||||
const int32_t srs_estimated_channel_time[N_ap][frame_parms->ofdm_symbol_size]);
|
||||
|
||||
int nr_est_toa_ns_srs(NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t N_arx,
|
||||
uint8_t N_ap,
|
||||
uint8_t N_symb_srs,
|
||||
int32_t srs_estimated_channel_freq[N_arx][N_ap][frame_parms->ofdm_symbol_size * N_symb_srs],
|
||||
int16_t *srs_toa_ns);
|
||||
|
||||
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
@@ -700,7 +700,7 @@ idft_size_idx_t get_idft(int ofdm_symbol_size)
|
||||
case 98304:
|
||||
return IDFT_98304;
|
||||
default:
|
||||
printf("function get_idft : unsupported ofdm symbol size \n");
|
||||
printf("function get_idft : unsupported ofdm symbol size %d\n",ofdm_symbol_size);
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -563,7 +563,9 @@ typedef struct PHY_VARS_gNB_s {
|
||||
struct processingData_L1tx *msgDataTx;
|
||||
void *scopeData;
|
||||
/// structure for analyzing high-level RT measurements
|
||||
rt_L1_profiling_t rt_L1_profiling;
|
||||
rt_L1_profiling_t rt_L1_profiling;
|
||||
// Parameter required for positioning
|
||||
positioning_config_t positioning_config;
|
||||
} PHY_VARS_gNB;
|
||||
|
||||
struct puschSymbolReqId {
|
||||
|
||||
@@ -291,6 +291,15 @@ typedef struct {
|
||||
int32_t reserved;
|
||||
} prs_meas_t;
|
||||
|
||||
// Configuration parameters required for 5G Positioning
|
||||
typedef struct {
|
||||
uint32_t TRPIDs[8]; // user define TRP ids
|
||||
uint32_t TRPxAxis[8]; // x-axis values of each TRP
|
||||
uint32_t TRPyAxis[8]; // y-axis values of each TRP
|
||||
uint32_t TRPzAxis[8]; // z-axis values of each TRP
|
||||
uint8_t NumTRPs; // number of TRPs max to 8
|
||||
}positioning_config_t;
|
||||
|
||||
// rel16 prs k_prime table as per ts138.211 sec.7.4.1.7.2
|
||||
#define K_PRIME_TABLE_ROW_SIZE 4
|
||||
#define K_PRIME_TABLE_COL_SIZE 12
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "PHY/NR_ESTIMATION/nr_ul_estimation.h"
|
||||
#include "nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h"
|
||||
#include "fapi_nr_l1.h"
|
||||
#include "nfapi.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
#include "PHY/INIT/nr_phy_init.h"
|
||||
@@ -131,7 +132,7 @@ void nr_common_signal_procedures(PHY_VARS_gNB *gNB, int frame,int slot, nfapi_nr
|
||||
// Beam_id is currently used only for FR2
|
||||
if (fp->freq_range == FR2){
|
||||
LOG_D(PHY,"slot %d, ssb_index %d, beam %d\n",slot,ssb_index,cfg->ssb_table.ssb_beam_id_list[ssb_index].beam_id.value);
|
||||
for (int j=0;j<fp->symbols_per_slot;j++)
|
||||
for (int j=0;j<fp->symbols_per_slot;j++)
|
||||
gNB->common_vars.beam_id[0][slot*fp->symbols_per_slot+j] = cfg->ssb_table.ssb_beam_id_list[ssb_index].beam_id.value;
|
||||
}
|
||||
|
||||
@@ -192,7 +193,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
|
||||
msgTx->ssb[i].active = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX,0);
|
||||
|
||||
int num_pdcch_pdus = msgTx->num_ul_pdcch + msgTx->num_dl_pdcch;
|
||||
@@ -200,14 +201,14 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
|
||||
if (num_pdcch_pdus > 0) {
|
||||
LOG_D(PHY, "[gNB %d] Frame %d slot %d Calling nr_generate_dci_top (number of UL/DL PDCCH PDUs %d/%d)\n",
|
||||
gNB->Mod_id, frame, slot, msgTx->num_ul_pdcch, msgTx->num_dl_pdcch);
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_PDCCH_TX,1);
|
||||
|
||||
nr_generate_dci_top(msgTx, slot, (int32_t *)&gNB->common_vars.txdataF[0][txdataF_offset], gNB->TX_AMP, fp);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_PDCCH_TX,0);
|
||||
}
|
||||
|
||||
|
||||
if (msgTx->num_pdsch_slot > 0) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,1);
|
||||
LOG_D(PHY, "PDSCH generation started (%d) in frame %d.%d\n", msgTx->num_pdsch_slot,frame,slot);
|
||||
@@ -970,22 +971,25 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
|
||||
srs_est = -1;
|
||||
}
|
||||
|
||||
for (int ant_rx = 0; ant_rx < gNB->frame_parms.nb_antennas_rx; ant_rx++) {
|
||||
|
||||
T(T_GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE,
|
||||
T_INT(0),
|
||||
T_INT(gNB->Mod_id),
|
||||
T_INT(srs_pdu->rnti),
|
||||
T_INT(frame_rx),
|
||||
T_INT(0),
|
||||
T_INT(0),
|
||||
T_BUFFER(srs_estimated_channel_freq[0][0], frame_parms->ofdm_symbol_size * sizeof(int32_t)));
|
||||
T_INT(slot_rx),
|
||||
T_INT(ant_rx),
|
||||
T_BUFFER(srs_estimated_channel_freq[ant_rx][0], frame_parms->ofdm_symbol_size * sizeof(int32_t)));
|
||||
|
||||
T(T_GNB_PHY_UL_TIME_CHANNEL_ESTIMATE,
|
||||
T_INT(0),
|
||||
T_INT(gNB->Mod_id),
|
||||
T_INT(srs_pdu->rnti),
|
||||
T_INT(frame_rx),
|
||||
T_INT(0),
|
||||
T_INT(0),
|
||||
T_BUFFER(srs_estimated_channel_time_shifted[0][0], frame_parms->ofdm_symbol_size * sizeof(int32_t)));
|
||||
|
||||
T_INT(slot_rx),
|
||||
T_INT(ant_rx),
|
||||
T_BUFFER(srs_estimated_channel_time_shifted[ant_rx][0], frame_parms->ofdm_symbol_size * sizeof(int32_t)));
|
||||
}
|
||||
|
||||
gNB->UL_INFO.srs_ind.pdu_list = &gNB->srs_pdu_list[0];
|
||||
gNB->UL_INFO.srs_ind.sfn = frame_rx;
|
||||
gNB->UL_INFO.srs_ind.slot = slot_rx;
|
||||
@@ -993,10 +997,24 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
|
||||
nfapi_nr_srs_indication_pdu_t *srs_indication = &gNB->srs_pdu_list[gNB->UL_INFO.srs_ind.number_of_pdus];
|
||||
srs_indication->handle = srs_pdu->handle;
|
||||
srs_indication->rnti = srs_pdu->rnti;
|
||||
|
||||
uint8_t N_ap = 1<<srs_pdu->num_ant_ports;
|
||||
uint8_t N_ant_rx = gNB->frame_parms.nb_antennas_rx;
|
||||
int16_t srs_toa_ns[N_ant_rx];
|
||||
|
||||
start_meas(&gNB->srs_timing_advance_stats);
|
||||
srs_indication->timing_advance_offset = srs_est >= 0 ? nr_est_timing_advance_srs(frame_parms, srs_estimated_channel_time[0]) : 0xFFFF;
|
||||
srs_indication->timing_advance_offset = srs_est >= 0 ? nr_est_timing_advance_srs(frame_parms, N_ap, srs_estimated_channel_time[0]) : 0xFFFF;
|
||||
stop_meas(&gNB->srs_timing_advance_stats);
|
||||
srs_indication->timing_advance_offset_nsec = srs_est >= 0 ? (int16_t)((((int32_t)srs_indication->timing_advance_offset - 31) * ((int32_t)TC_NSEC_x32768)) >> 15) : 0xFFFF;
|
||||
|
||||
nr_est_toa_ns_srs(frame_parms, N_ant_rx, N_ap ,N_symb_SRS, srs_estimated_channel_freq, srs_toa_ns);
|
||||
|
||||
for (int ant=0;ant<N_ant_rx;ant++)
|
||||
LOG_D(NR_PHY,"[first] srs_toa_ns[%d] = %d\n",ant,srs_toa_ns[ant]);
|
||||
|
||||
//the value of the first antenna goes into this field. All of the antennas are also in the TLV part of the localization report below.
|
||||
srs_indication->timing_advance_offset_nsec = srs_toa_ns[0];
|
||||
|
||||
|
||||
switch (srs_pdu->srs_parameters_v4.usage) {
|
||||
case 0:
|
||||
LOG_W(NR_PHY, "SRS report was not requested by MAC\n");
|
||||
@@ -1013,6 +1031,9 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
|
||||
case 1 << NFAPI_NR_SRS_ANTENNASWITCH:
|
||||
srs_indication->srs_usage = NFAPI_NR_SRS_ANTENNASWITCH;
|
||||
break;
|
||||
case 1 << NFAPI_NR_SRS_LOCALIZATION: // standard extension (bit 4 is reserved in the standard)
|
||||
srs_indication->srs_usage = NFAPI_NR_SRS_LOCALIZATION;
|
||||
break;
|
||||
default:
|
||||
LOG_E(NR_PHY, "Invalid srs_pdu->srs_parameters_v4.usage %i\n", srs_pdu->srs_parameters_v4.usage);
|
||||
}
|
||||
@@ -1048,13 +1069,13 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
|
||||
LOG_I(NR_PHY, "nr_srs_bf_report.num_symbols = %i\n", nr_srs_bf_report.num_symbols);
|
||||
LOG_I(NR_PHY, "nr_srs_bf_report.wide_band_snr = %i (%i dB)\n", nr_srs_bf_report.wide_band_snr, (nr_srs_bf_report.wide_band_snr >> 1) - 64);
|
||||
LOG_I(NR_PHY, "nr_srs_bf_report.num_reported_symbols = %i\n", nr_srs_bf_report.num_reported_symbols);
|
||||
LOG_I(NR_PHY, "nr_srs_bf_report.prgs[0].num_prgs = %i\n", nr_srs_bf_report.prgs[0].num_prgs);
|
||||
for (int prg_idx = 0; prg_idx < nr_srs_bf_report.prgs[0].num_prgs; prg_idx++) {
|
||||
LOG_I(NR_PHY, "nr_srs_bf_report.prgs.num_prgs = %i\n", nr_srs_bf_report.prgs.num_prgs);
|
||||
for (int prg_idx = 0; prg_idx < nr_srs_bf_report.prgs.num_prgs; prg_idx++) {
|
||||
LOG_I(NR_PHY,
|
||||
"nr_srs_beamforming_report.prgs[0].prg_list[%3i].rb_snr = %i (%i dB)\n",
|
||||
"nr_srs_beamforming_report.prgs.prg_list[%3i].rb_snr = %i (%i dB)\n",
|
||||
prg_idx,
|
||||
nr_srs_bf_report.prgs[0].prg_list[prg_idx].rb_snr,
|
||||
(nr_srs_bf_report.prgs[0].prg_list[prg_idx].rb_snr >> 1) - 64);
|
||||
nr_srs_bf_report.prgs.prg_list[prg_idx].rb_snr,
|
||||
(nr_srs_bf_report.prgs.prg_list[prg_idx].rb_snr >> 1) - 64);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1117,6 +1138,19 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
|
||||
LOG_W(NR_PHY, "PHY procedures for this SRS usage are not implemented yet!\n");
|
||||
break;
|
||||
|
||||
case NFAPI_NR_SRS_LOCALIZATION: {
|
||||
// this is a custom usage not in the standard
|
||||
// we send Timing advance offset in nanoseconds for each TRP (= RX antenna)
|
||||
|
||||
uint8_t *pWritePackedMessage = (uint8_t*) report_tlv->value;
|
||||
uint8_t *end = (uint8_t*) report_tlv->value + sizeof(report_tlv->value);
|
||||
|
||||
for (int arx_index = 0; arx_index < N_ant_rx; arx_index++) {
|
||||
report_tlv->length += pushs16(srs_toa_ns[arx_index],&pWritePackedMessage,end);
|
||||
LOG_D(NR_PHY, "[second] srs_toa_ns[%d] = %d\n",arx_index,srs_toa_ns[arx_index]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
AssertFatal(1 == 0, "Invalid SRS usage\n");
|
||||
}
|
||||
|
||||
@@ -65,3 +65,25 @@ MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_REFUSE, MESSAGE_PRIORITY_MED, f1ap_ue_c
|
||||
|
||||
/* CU -> DU*/
|
||||
MESSAGE_DEF(F1AP_PAGING_IND, MESSAGE_PRIORITY_MED, f1ap_paging_ind_t, f1ap_paging_ind)
|
||||
|
||||
/*NRPPa CU -> DU */ // adeel
|
||||
MESSAGE_DEF(F1AP_POSITIONING_INFORMATION_REQ, MESSAGE_PRIORITY_MED, f1ap_positioning_information_req_t, f1ap_positioning_information_req)
|
||||
MESSAGE_DEF(F1AP_POSITIONING_ACTIVATION_REQ, MESSAGE_PRIORITY_MED, f1ap_positioning_activation_req_t, f1ap_positioning_activation_req)
|
||||
MESSAGE_DEF(F1AP_POSITIONING_DEACTIVATION, MESSAGE_PRIORITY_MED, f1ap_positioning_deactivation_t, f1ap_positioning_deactivation)
|
||||
MESSAGE_DEF(F1AP_TRP_INFORMATION_REQ, MESSAGE_PRIORITY_MED, f1ap_trp_information_req_t, f1ap_trp_information_req)
|
||||
MESSAGE_DEF(F1AP_MEASUREMENT_REQ, MESSAGE_PRIORITY_MED, f1ap_measurement_req_t, f1ap_measurement_req)
|
||||
MESSAGE_DEF(F1AP_MEASUREMENT_ABORT, MESSAGE_PRIORITY_MED, f1ap_measurement_abort_t, f1ap_measurement_abort)
|
||||
MESSAGE_DEF(F1AP_MEASUREMENT_UPDATE, MESSAGE_PRIORITY_MED, f1ap_measurement_update_t, f1ap_measurement_update)
|
||||
|
||||
/*NRPPa DU -> CU */ // adeel
|
||||
MESSAGE_DEF(F1AP_POSITIONING_INFORMATION_RESP, MESSAGE_PRIORITY_MED, f1ap_positioning_information_resp_t, f1ap_positioning_information_resp)
|
||||
MESSAGE_DEF(F1AP_POSITIONING_INFORMATION_FAILURE, MESSAGE_PRIORITY_MED, f1ap_positioning_information_failure_t, f1ap_positioning_information_failure)
|
||||
MESSAGE_DEF(F1AP_POSITIONING_INFORMATION_UPDATE, MESSAGE_PRIORITY_MED, f1ap_positioning_information_update_t, f1ap_positioning_information_update)
|
||||
MESSAGE_DEF(F1AP_POSITIONING_ACTIVATION_RESP, MESSAGE_PRIORITY_MED, f1ap_positioning_activation_resp_t, f1ap_positioning_activation_resp)
|
||||
MESSAGE_DEF(F1AP_POSITIONING_ACTIVATION_FAILURE, MESSAGE_PRIORITY_MED, f1ap_positioning_activation_failure_t, f1ap_positioning_activation_failure)
|
||||
MESSAGE_DEF(F1AP_TRP_INFORMATION_RESP, MESSAGE_PRIORITY_MED, f1ap_trp_information_resp_t, f1ap_trp_information_resp)
|
||||
MESSAGE_DEF(F1AP_TRP_INFORMATION_FAILURE, MESSAGE_PRIORITY_MED, f1ap_trp_information_failure_t, f1ap_trp_information_failure)
|
||||
MESSAGE_DEF(F1AP_MEASUREMENT_RESP, MESSAGE_PRIORITY_MED, f1ap_measurement_resp_t, f1ap_measurement_resp)
|
||||
MESSAGE_DEF(F1AP_MEASUREMENT_FAILURE, MESSAGE_PRIORITY_MED, f1ap_measurement_failure_t, f1ap_measurement_failure)
|
||||
MESSAGE_DEF(F1AP_MEASUREMENT_REPORT, MESSAGE_PRIORITY_MED, f1ap_measurement_report_t, f1ap_measurement_report)
|
||||
MESSAGE_DEF(F1AP_MEASUREMENT_FAILURE_IND, MESSAGE_PRIORITY_MED, f1ap_measurement_failure_ind_t, f1ap_measurement_failure_ind)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -28,63 +28,96 @@
|
||||
*/
|
||||
|
||||
/* Messages for NGAP logging */
|
||||
MESSAGE_DEF(NGAP_UPLINK_NAS_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_uplink_nas_log)
|
||||
MESSAGE_DEF(NGAP_UE_CAPABILITY_IND_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_ue_capability_ind_log)
|
||||
MESSAGE_DEF(NGAP_INITIAL_CONTEXT_SETUP_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_initial_context_setup_log)
|
||||
MESSAGE_DEF(NGAP_NAS_NON_DELIVERY_IND_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_nas_non_delivery_ind_log)
|
||||
MESSAGE_DEF(NGAP_DOWNLINK_NAS_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_downlink_nas_log)
|
||||
MESSAGE_DEF(NGAP_S1_SETUP_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_s1_setup_log)
|
||||
MESSAGE_DEF(NGAP_INITIAL_UE_MESSAGE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_initial_ue_message_log)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_REQ_LOG, MESSAGE_PRIORITY_MED, IttiMsgText , ngap_ue_context_release_req_log)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMMAND_LOG, MESSAGE_PRIORITY_MED, IttiMsgText , ngap_ue_context_release_command_log)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMPLETE_LOG, MESSAGE_PRIORITY_MED, IttiMsgText , ngap_ue_context_release_complete_log)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_ue_context_release_log)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_SETUP_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_pdusession_setup_request_log)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_SETUP_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_pdusession_setup_response_log)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_pdusession_modify_request_log)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_pdusession_modify_response_log)
|
||||
MESSAGE_DEF(NGAP_PAGING_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_paging_log)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_pdusession_release_request_log)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_pdusession_release_response_log)
|
||||
MESSAGE_DEF(NGAP_ERROR_INDICATION_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_error_indication_log)
|
||||
MESSAGE_DEF(NGAP_PATH_SWITCH_REQ_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_path_switch_req_log)
|
||||
MESSAGE_DEF(NGAP_PATH_SWITCH_REQ_ACK_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_path_switch_req_ack_log)
|
||||
MESSAGE_DEF(NGAP_UPLINK_NAS_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_uplink_nas_log)
|
||||
MESSAGE_DEF(NGAP_UE_CAPABILITY_IND_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_ue_capability_ind_log)
|
||||
MESSAGE_DEF(NGAP_INITIAL_CONTEXT_SETUP_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_initial_context_setup_log)
|
||||
MESSAGE_DEF(NGAP_NAS_NON_DELIVERY_IND_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_nas_non_delivery_ind_log)
|
||||
MESSAGE_DEF(NGAP_DOWNLINK_NAS_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_downlink_nas_log)
|
||||
MESSAGE_DEF(NGAP_S1_SETUP_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_s1_setup_log)
|
||||
MESSAGE_DEF(NGAP_INITIAL_UE_MESSAGE_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_initial_ue_message_log)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_REQ_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_ue_context_release_req_log)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMMAND_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_ue_context_release_command_log)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMPLETE_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_ue_context_release_complete_log)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_ue_context_release_log)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_SETUP_REQUEST_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_pdusession_setup_request_log)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_SETUP_RESPONSE_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_pdusession_setup_response_log)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_REQUEST_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_pdusession_modify_request_log)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_RESPONSE_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_pdusession_modify_response_log)
|
||||
MESSAGE_DEF(NGAP_PAGING_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_paging_log)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_REQUEST_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_pdusession_release_request_log)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_RESPONSE_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_pdusession_release_response_log)
|
||||
MESSAGE_DEF(NGAP_ERROR_INDICATION_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_error_indication_log)
|
||||
MESSAGE_DEF(NGAP_PATH_SWITCH_REQ_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_path_switch_req_log)
|
||||
MESSAGE_DEF(NGAP_PATH_SWITCH_REQ_ACK_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_path_switch_req_ack_log)
|
||||
MESSAGE_DEF(NGAP_UPLINKUEASSOCIATEDNRPPA_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_UplinkUEAssociatedNRPPa_log)
|
||||
MESSAGE_DEF(NGAP_UPLINKNONUEASSOCIATEDNRPPA_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_UplinkNonUEAssociatedNRPPa_log)
|
||||
MESSAGE_DEF(NGAP_DOWNLINKUEASSOCIATEDNRPPA_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_DownlinkUEAssociatedNRPPa_log)
|
||||
MESSAGE_DEF(NGAP_DOWNLINKNONUEASSOCIATEDNRPPA_LOG, MESSAGE_PRIORITY_MED, IttiMsgText, ngap_DownlinkNonUEAssociatedNRPPa_log)
|
||||
|
||||
/* gNB application layer -> NGAP messages */
|
||||
MESSAGE_DEF(NGAP_REGISTER_GNB_REQ , MESSAGE_PRIORITY_MED, ngap_register_gnb_req_t , ngap_register_gnb_req)
|
||||
MESSAGE_DEF(NGAP_REGISTER_GNB_REQ, MESSAGE_PRIORITY_MED, ngap_register_gnb_req_t, ngap_register_gnb_req)
|
||||
|
||||
/* NGAP -> gNB application layer messages */
|
||||
MESSAGE_DEF(NGAP_REGISTER_GNB_CNF , MESSAGE_PRIORITY_MED, ngap_register_gnb_cnf_t , ngap_register_gnb_cnf)
|
||||
MESSAGE_DEF(NGAP_DEREGISTERED_GNB_IND , MESSAGE_PRIORITY_MED, ngap_deregistered_gnb_ind_t , ngap_deregistered_gnb_ind)
|
||||
MESSAGE_DEF(NGAP_REGISTER_GNB_CNF, MESSAGE_PRIORITY_MED, ngap_register_gnb_cnf_t, ngap_register_gnb_cnf)
|
||||
MESSAGE_DEF(NGAP_DEREGISTERED_GNB_IND, MESSAGE_PRIORITY_MED, ngap_deregistered_gnb_ind_t, ngap_deregistered_gnb_ind)
|
||||
|
||||
/* NRPPA -> NGAP messages */
|
||||
MESSAGE_DEF(NGAP_UPLINKUEASSOCIATEDNRPPA, MESSAGE_PRIORITY_MED, ngap_UplinkUEAssociatedNRPPa_t, ngap_UplinkUEAssociatedNRPPa)
|
||||
MESSAGE_DEF(NGAP_UPLINKNONUEASSOCIATEDNRPPA,
|
||||
MESSAGE_PRIORITY_MED,
|
||||
ngap_UplinkNonUEAssociatedNRPPa_t,
|
||||
ngap_UplinkNonUEAssociatedNRPPa)
|
||||
|
||||
/* NGAP messages -> NRPPA */
|
||||
MESSAGE_DEF(NGAP_DOWNLINKUEASSOCIATEDNRPPA, MESSAGE_PRIORITY_MED, ngap_DownlinkUEAssociatedNRPPa_t, ngap_DownlinkUEAssociatedNRPPa)
|
||||
MESSAGE_DEF(NGAP_DOWNLINKNONUEASSOCIATEDNRPPA,
|
||||
MESSAGE_PRIORITY_MED,
|
||||
ngap_DownlinkNonUEAssociatedNRPPa_t,
|
||||
ngap_DownlinkNonUEAssociatedNRPPa)
|
||||
|
||||
/* RRC -> NGAP messages */
|
||||
MESSAGE_DEF(NGAP_NAS_FIRST_REQ , MESSAGE_PRIORITY_MED, ngap_nas_first_req_t , ngap_nas_first_req)
|
||||
MESSAGE_DEF(NGAP_UPLINK_NAS , MESSAGE_PRIORITY_MED, ngap_uplink_nas_t , ngap_uplink_nas)
|
||||
MESSAGE_DEF(NGAP_UE_CAPABILITIES_IND , MESSAGE_PRIORITY_MED, ngap_ue_cap_info_ind_t , ngap_ue_cap_info_ind)
|
||||
MESSAGE_DEF(NGAP_INITIAL_CONTEXT_SETUP_RESP, MESSAGE_PRIORITY_MED, ngap_initial_context_setup_resp_t, ngap_initial_context_setup_resp)
|
||||
MESSAGE_DEF(NGAP_INITIAL_CONTEXT_SETUP_FAIL, MESSAGE_PRIORITY_MED, ngap_initial_context_setup_fail_t, ngap_initial_context_setup_fail)
|
||||
MESSAGE_DEF(NGAP_NAS_NON_DELIVERY_IND , MESSAGE_PRIORITY_MED, ngap_nas_non_delivery_ind_t , ngap_nas_non_delivery_ind)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_RESP , MESSAGE_PRIORITY_MED, ngap_ue_release_resp_t , ngap_ue_release_resp)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMPLETE, MESSAGE_PRIORITY_MED, ngap_ue_release_complete_t , ngap_ue_release_complete)
|
||||
MESSAGE_DEF(NGAP_UE_CTXT_MODIFICATION_RESP , MESSAGE_PRIORITY_MED, ngap_ue_ctxt_modification_resp_t , ngap_ue_ctxt_modification_resp)
|
||||
MESSAGE_DEF(NGAP_UE_CTXT_MODIFICATION_FAIL , MESSAGE_PRIORITY_MED, ngap_ue_ctxt_modification_fail_t , ngap_ue_ctxt_modification_fail)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_SETUP_RESP , MESSAGE_PRIORITY_MED, ngap_pdusession_setup_resp_t , ngap_pdusession_setup_resp)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_SETUP_REQUEST_FAIL , MESSAGE_PRIORITY_MED, ngap_pdusession_setup_req_fail_t , ngap_pdusession_setup_request_fail)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_RESP , MESSAGE_PRIORITY_MED, ngap_pdusession_modify_resp_t , ngap_pdusession_modify_resp)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_RESPONSE , MESSAGE_PRIORITY_MED, ngap_pdusession_release_resp_t , ngap_pdusession_release_resp)
|
||||
MESSAGE_DEF(NGAP_PATH_SWITCH_REQ , MESSAGE_PRIORITY_MED, ngap_path_switch_req_t , ngap_path_switch_req)
|
||||
MESSAGE_DEF(NGAP_PATH_SWITCH_REQ_ACK , MESSAGE_PRIORITY_MED, ngap_path_switch_req_ack_t , ngap_path_switch_req_ack)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_MODIFICATION_IND , MESSAGE_PRIORITY_MED, ngap_pdusession_modification_ind_t , ngap_pdusession_modification_ind)
|
||||
MESSAGE_DEF(NGAP_NAS_FIRST_REQ, MESSAGE_PRIORITY_MED, ngap_nas_first_req_t, ngap_nas_first_req)
|
||||
MESSAGE_DEF(NGAP_UPLINK_NAS, MESSAGE_PRIORITY_MED, ngap_uplink_nas_t, ngap_uplink_nas)
|
||||
MESSAGE_DEF(NGAP_UE_CAPABILITIES_IND, MESSAGE_PRIORITY_MED, ngap_ue_cap_info_ind_t, ngap_ue_cap_info_ind)
|
||||
MESSAGE_DEF(NGAP_INITIAL_CONTEXT_SETUP_RESP,
|
||||
MESSAGE_PRIORITY_MED,
|
||||
ngap_initial_context_setup_resp_t,
|
||||
ngap_initial_context_setup_resp)
|
||||
MESSAGE_DEF(NGAP_INITIAL_CONTEXT_SETUP_FAIL,
|
||||
MESSAGE_PRIORITY_MED,
|
||||
ngap_initial_context_setup_fail_t,
|
||||
ngap_initial_context_setup_fail)
|
||||
MESSAGE_DEF(NGAP_NAS_NON_DELIVERY_IND, MESSAGE_PRIORITY_MED, ngap_nas_non_delivery_ind_t, ngap_nas_non_delivery_ind)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_RESP, MESSAGE_PRIORITY_MED, ngap_ue_release_resp_t, ngap_ue_release_resp)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMPLETE, MESSAGE_PRIORITY_MED, ngap_ue_release_complete_t, ngap_ue_release_complete)
|
||||
MESSAGE_DEF(NGAP_UE_CTXT_MODIFICATION_RESP, MESSAGE_PRIORITY_MED, ngap_ue_ctxt_modification_resp_t, ngap_ue_ctxt_modification_resp)
|
||||
MESSAGE_DEF(NGAP_UE_CTXT_MODIFICATION_FAIL, MESSAGE_PRIORITY_MED, ngap_ue_ctxt_modification_fail_t, ngap_ue_ctxt_modification_fail)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_SETUP_RESP, MESSAGE_PRIORITY_MED, ngap_pdusession_setup_resp_t, ngap_pdusession_setup_resp)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_SETUP_REQUEST_FAIL,
|
||||
MESSAGE_PRIORITY_MED,
|
||||
ngap_pdusession_setup_req_fail_t,
|
||||
ngap_pdusession_setup_request_fail)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_RESP, MESSAGE_PRIORITY_MED, ngap_pdusession_modify_resp_t, ngap_pdusession_modify_resp)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_RESPONSE, MESSAGE_PRIORITY_MED, ngap_pdusession_release_resp_t, ngap_pdusession_release_resp)
|
||||
MESSAGE_DEF(NGAP_PATH_SWITCH_REQ, MESSAGE_PRIORITY_MED, ngap_path_switch_req_t, ngap_path_switch_req)
|
||||
MESSAGE_DEF(NGAP_PATH_SWITCH_REQ_ACK, MESSAGE_PRIORITY_MED, ngap_path_switch_req_ack_t, ngap_path_switch_req_ack)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_MODIFICATION_IND,
|
||||
MESSAGE_PRIORITY_MED,
|
||||
ngap_pdusession_modification_ind_t,
|
||||
ngap_pdusession_modification_ind)
|
||||
|
||||
/* NGAP -> RRC messages */
|
||||
MESSAGE_DEF(NGAP_DOWNLINK_NAS , MESSAGE_PRIORITY_MED, ngap_downlink_nas_t , ngap_downlink_nas )
|
||||
MESSAGE_DEF(NGAP_INITIAL_CONTEXT_SETUP_REQ , MESSAGE_PRIORITY_MED, ngap_initial_context_setup_req_t , ngap_initial_context_setup_req )
|
||||
MESSAGE_DEF(NGAP_UE_CTXT_MODIFICATION_REQ , MESSAGE_PRIORITY_MED, ngap_ue_ctxt_modification_req_t , ngap_ue_ctxt_modification_req)
|
||||
MESSAGE_DEF(NGAP_PAGING_IND , MESSAGE_PRIORITY_MED, ngap_paging_ind_t , ngap_paging_ind )
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_SETUP_REQ , MESSAGE_PRIORITY_MED, ngap_pdusession_setup_req_t , ngap_pdusession_setup_req )
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_REQ , MESSAGE_PRIORITY_MED, ngap_pdusession_modify_req_t , ngap_pdusession_modify_req )
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_COMMAND , MESSAGE_PRIORITY_MED, ngap_pdusession_release_command_t , ngap_pdusession_release_command)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMMAND, MESSAGE_PRIORITY_MED, ngap_ue_release_command_t , ngap_ue_release_command)
|
||||
MESSAGE_DEF(NGAP_DOWNLINK_NAS, MESSAGE_PRIORITY_MED, ngap_downlink_nas_t, ngap_downlink_nas)
|
||||
MESSAGE_DEF(NGAP_INITIAL_CONTEXT_SETUP_REQ, MESSAGE_PRIORITY_MED, ngap_initial_context_setup_req_t, ngap_initial_context_setup_req)
|
||||
MESSAGE_DEF(NGAP_UE_CTXT_MODIFICATION_REQ, MESSAGE_PRIORITY_MED, ngap_ue_ctxt_modification_req_t, ngap_ue_ctxt_modification_req)
|
||||
MESSAGE_DEF(NGAP_PAGING_IND, MESSAGE_PRIORITY_MED, ngap_paging_ind_t, ngap_paging_ind)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_SETUP_REQ, MESSAGE_PRIORITY_MED, ngap_pdusession_setup_req_t, ngap_pdusession_setup_req)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_REQ, MESSAGE_PRIORITY_MED, ngap_pdusession_modify_req_t, ngap_pdusession_modify_req)
|
||||
MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_COMMAND,
|
||||
MESSAGE_PRIORITY_MED,
|
||||
ngap_pdusession_release_command_t,
|
||||
ngap_pdusession_release_command)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMMAND, MESSAGE_PRIORITY_MED, ngap_ue_release_command_t, ngap_ue_release_command)
|
||||
|
||||
/* NGAP <-> RRC messages (can be initiated either by MME or gNB) */
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_REQ , MESSAGE_PRIORITY_MED, ngap_ue_release_req_t , ngap_ue_release_req)
|
||||
MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_REQ, MESSAGE_PRIORITY_MED, ngap_ue_release_req_t, ngap_ue_release_req)
|
||||
|
||||
@@ -66,9 +66,14 @@
|
||||
#define NGAP_PDUSESSION_MODIFY_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_modify_req
|
||||
#define NGAP_PAGING_IND(mSGpTR) (mSGpTR)->ittiMsg.ngap_paging_ind
|
||||
|
||||
#define NGAP_UE_CONTEXT_RELEASE_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_ue_release_req
|
||||
#define NGAP_PDUSESSION_RELEASE_COMMAND(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_release_command
|
||||
#define NGAP_PDUSESSION_RELEASE_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_release_resp
|
||||
#define NGAP_UE_CONTEXT_RELEASE_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_ue_release_req
|
||||
#define NGAP_PDUSESSION_RELEASE_COMMAND(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_release_command
|
||||
#define NGAP_PDUSESSION_RELEASE_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_release_resp
|
||||
|
||||
#define NGAP_UPLINKUEASSOCIATEDNRPPA(mSGpTR) (mSGpTR)->ittiMsg.ngap_UplinkUEAssociatedNRPPa
|
||||
#define NGAP_UPLINKNONUEASSOCIATEDNRPPA(mSGpTR) (mSGpTR)->ittiMsg.ngap_UplinkNonUEAssociatedNRPPa
|
||||
#define NGAP_DOWNLINKUEASSOCIATEDNRPPA(mSGpTR) (mSGpTR)->ittiMsg.ngap_DownlinkUEAssociatedNRPPa
|
||||
#define NGAP_DOWNLINKNONUEASSOCIATEDNRPPA(mSGpTR) (mSGpTR)->ittiMsg.ngap_DownlinkNonUEAssociatedNRPPa
|
||||
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
/* Maximum number of e-rabs to be setup/deleted in a single message.
|
||||
@@ -313,7 +318,7 @@ typedef struct pdusession_setup_s {
|
||||
|
||||
/* qos flow list number */
|
||||
uint8_t nb_of_qos_flow;
|
||||
|
||||
|
||||
/* qos flow list(1 ~ 64) */
|
||||
pdusession_associate_qosflow_t associated_qos_flows[QOSFLOW_MAX_VALUE];
|
||||
} pdusession_setup_t;
|
||||
@@ -356,7 +361,7 @@ typedef enum ngap_Cause_e {
|
||||
//because it is human work, whereas it can be generated by machine
|
||||
//and because humans manual copy creates bugs
|
||||
//and we create multiple names for the same thing, that is a source of confusion
|
||||
} ngap_Cause_t;
|
||||
} ngap_Cause_t;
|
||||
|
||||
typedef enum ngap_Cause_radio_network_e {
|
||||
NGAP_CAUSE_RADIO_NETWORK_UNSPECIFIED,
|
||||
@@ -506,6 +511,56 @@ typedef struct ngap_deregistered_gnb_ind_s {
|
||||
uint8_t nb_amf;
|
||||
} ngap_deregistered_gnb_ind_t;
|
||||
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
// NRPPa -> NGAP
|
||||
typedef struct ngap_routing_id_s {
|
||||
/* Octet string data */
|
||||
uint8_t *buffer;
|
||||
/* Length of the octet string */
|
||||
uint32_t length;
|
||||
} ngap_routing_id_t;
|
||||
|
||||
typedef struct ngap_nrppa_pdu_s {
|
||||
/* Octet string data */
|
||||
uint8_t *buffer;
|
||||
/* Length of the octet string */
|
||||
uint32_t length;
|
||||
} ngap_nrppa_pdu_t;
|
||||
|
||||
typedef struct ngap_UplinkUEAssociatedNRPPa_s {
|
||||
/* Unique UE identifier within an gNB */
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
/* routing ID */
|
||||
ngap_routing_id_t routing_id;
|
||||
/* NRPPa pdu */
|
||||
ngap_nrppa_pdu_t nrppa_pdu;
|
||||
} ngap_UplinkUEAssociatedNRPPa_t;
|
||||
|
||||
typedef struct ngap_UplinkNonUEAssociatedNRPPa_s {
|
||||
/* routing ID */
|
||||
ngap_routing_id_t routing_id;
|
||||
/* NRPPa pdu */
|
||||
ngap_pdu_t nrppa_pdu;
|
||||
} ngap_UplinkNonUEAssociatedNRPPa_t;
|
||||
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
// NGAP -> NRPPa
|
||||
typedef struct ngap_DownlinkUEAssociatedNRPPa_s {
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
uint32_t amf_ue_ngap_id;
|
||||
/* routing ID */
|
||||
ngap_routing_id_t routing_id;
|
||||
/* NRPPa pdu */
|
||||
ngap_pdu_t nrppa_pdu;
|
||||
} ngap_DownlinkUEAssociatedNRPPa_t;
|
||||
|
||||
typedef struct ngap_DownlinkNonUEAssociatedNRPPa_s {
|
||||
/* routing ID */
|
||||
ngap_routing_id_t routing_id;
|
||||
/* NRPPa pdu */
|
||||
ngap_pdu_t nrppa_pdu;
|
||||
} ngap_DownlinkNonUEAssociatedNRPPa_t;
|
||||
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
// RRC -> NGAP messages
|
||||
|
||||
@@ -609,7 +664,6 @@ typedef struct ngap_downlink_nas_s {
|
||||
ngap_pdu_t nas_pdu;
|
||||
} ngap_downlink_nas_t;
|
||||
|
||||
|
||||
typedef struct ngap_initial_context_setup_req_s {
|
||||
/* UE id for initial connection to NGAP */
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
@@ -646,7 +700,6 @@ typedef struct ngap_initial_context_setup_req_s {
|
||||
ngap_pdu_t nas_pdu;
|
||||
} ngap_initial_context_setup_req_t;
|
||||
|
||||
|
||||
typedef struct ngap_paging_ind_s {
|
||||
/* UE paging identity */
|
||||
ngap_ue_paging_identity_t ue_paging_identity;
|
||||
@@ -735,7 +788,6 @@ typedef struct ngap_path_switch_req_s {
|
||||
} ngap_path_switch_req_t;
|
||||
|
||||
typedef struct ngap_path_switch_req_ack_s {
|
||||
|
||||
/* UE id for initial connection to NGAP */
|
||||
uint16_t ue_initial_id;
|
||||
|
||||
@@ -793,7 +845,6 @@ typedef struct ngap_ue_release_command_s {
|
||||
|
||||
} ngap_ue_release_command_t;
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
// NGAP <-- RRC messages
|
||||
typedef struct pdusession_release_s {
|
||||
|
||||
79
openair2/COMMON/positioning_nr_paramdef.h
Normal file
79
openair2/COMMON/positioning_nr_paramdef.h
Normal file
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file positioning_nr_paramdef.h
|
||||
* \brief definition of configuration parameters rquired for 5G positioning
|
||||
* \author
|
||||
* \date 2024
|
||||
* \version 0.1
|
||||
* \company Firecell
|
||||
* \email: adeel.malik@firecell.io
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#ifndef __POSITIONING_NR_PARAMDEF__H__
|
||||
#define __POSITIONING_NR_PARAMDEF__H__
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* Positioning configuration section names */
|
||||
#define CONFIG_STRING_POSITIONING_CONFIG "positioning_config"
|
||||
|
||||
|
||||
/* Global parameters */
|
||||
|
||||
/* PRS configuration parameters names */
|
||||
#define CONFIG_STRING_POSITIONING_NUM_TRPS "NumTRPs"
|
||||
#define CONFIG_STRING_POSITIONING_TRP_IDS_LIST "TRPIDs"
|
||||
#define CONFIG_STRING_POSITIONING_TRP_X_AXIS_LIST "TRPxAxis"
|
||||
#define CONFIG_STRING_POSITIONING_TRP_Y_AXIS_LIST "TRPyAxis"
|
||||
#define CONFIG_STRING_POSITIONING_TRP_Z_AXIS_LIST "TRPzAxis"
|
||||
|
||||
/* Help string for Positioning parameters */
|
||||
#define HELP_STRING_POSITIONING_NUM_TRPS "Number of TRPs connected with gNB(max 4)\n"
|
||||
#define HELP_STRING_POSITIONING_TRP_IDS_LIST "User defined IDs for each TRP \n"
|
||||
#define HELP_STRING_POSITIONING_TRP_X_AXIS_LIST "x-axis value of each TRP \n"
|
||||
#define HELP_STRING_POSITIONING_TRP_Y_AXIS_LIST "y-axis value of each TRP \n"
|
||||
#define HELP_STRING_POSITIONING_TRP_Z_AXIS_LIST "z-axis value of each TRP \n"
|
||||
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* PRS configuration parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
// clang-format off
|
||||
#define POSITIONING_PARAMS_DESC { \
|
||||
{CONFIG_STRING_POSITIONING_NUM_TRPS, HELP_STRING_POSITIONING_NUM_TRPS, 0, .uptr=NULL, .defuintval=0, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_POSITIONING_TRP_IDS_LIST, HELP_STRING_POSITIONING_TRP_IDS_LIST, 0, .uptr=NULL, .defintarrayval=0, TYPE_UINTARRAY, 0}, \
|
||||
{CONFIG_STRING_POSITIONING_TRP_X_AXIS_LIST, HELP_STRING_POSITIONING_TRP_X_AXIS_LIST, 0, .uptr=NULL, .defintarrayval=0, TYPE_UINTARRAY, 0}, \
|
||||
{CONFIG_STRING_POSITIONING_TRP_Y_AXIS_LIST, HELP_STRING_POSITIONING_TRP_Y_AXIS_LIST, 0, .uptr=NULL, .defintarrayval=0, TYPE_UINTARRAY, 0}, \
|
||||
{CONFIG_STRING_POSITIONING_TRP_Z_AXIS_LIST, HELP_STRING_POSITIONING_TRP_Z_AXIS_LIST, 0, .uptr=NULL, .defintarrayval=0, TYPE_UINTARRAY, 0}, \
|
||||
}
|
||||
// clang-format on
|
||||
|
||||
#define POSITIONING_NUM_TRPS 0
|
||||
#define POSITIONING_TRP_IDS_LIST 1
|
||||
#define POSITIONING_TRP_X_AXIS_LIST 2
|
||||
#define POSITIONING_TRP_Y_AXIS_LIST 3
|
||||
#define POSITIONING_TRP_Z_AXIS_LIST 4
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
#endif
|
||||
@@ -342,6 +342,31 @@
|
||||
|
||||
#include "f1ap_default_values.h"
|
||||
|
||||
/* NRPPA IE*/
|
||||
#include "F1AP_SRSConfiguration.h"
|
||||
|
||||
/* NRPPA Procedures*/
|
||||
#include "F1AP_TRPInformationResponse.h"
|
||||
#include "F1AP_TRPInformationRequest.h"
|
||||
#include "F1AP_TRPInformationRequest.h"
|
||||
|
||||
#include "F1AP_PositioningInformationRequest.h"
|
||||
#include "F1AP_PositioningInformationResponse.h"
|
||||
#include "F1AP_PositioningInformationFailure.h"
|
||||
#include "F1AP_PositioningActivationRequest.h"
|
||||
#include "F1AP_PositioningActivationResponse.h"
|
||||
#include "F1AP_PositioningActivationFailure.h"
|
||||
#include "F1AP_PositioningInformationUpdate.h"
|
||||
#include "F1AP_PositioningDeactivation.h"
|
||||
|
||||
#include "F1AP_PositioningMeasurementRequest.h"
|
||||
#include "F1AP_PositioningMeasurementResponse.h"
|
||||
#include "F1AP_PositioningMeasurementFailure.h"
|
||||
#include "F1AP_PositioningMeasurementReport.h"
|
||||
#include "F1AP_PositioningMeasurementUpdate.h"
|
||||
#include "F1AP_PositioningMeasurementFailureIndication.h"
|
||||
#include "F1AP_PositioningMeasurementAbort.h"
|
||||
|
||||
#include "conversions.h"
|
||||
#include "common/platform_types.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
@@ -354,36 +379,36 @@
|
||||
|
||||
/* Checking version of ASN1C compiler */
|
||||
#if (ASN1C_ENVIRONMENT_VERSION < ASN1C_MINIMUM_VERSION)
|
||||
# error "You are compiling f1ap with the wrong version of ASN1C"
|
||||
#error "You are compiling f1ap with the wrong version of ASN1C"
|
||||
#endif
|
||||
|
||||
#define F1AP_UE_ID_FMT "0x%06"PRIX32
|
||||
#define F1AP_UE_ID_FMT "0x%06" PRIX32
|
||||
|
||||
#include "assertions.h"
|
||||
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "f1ap_default_values.h"
|
||||
#define F1AP_ERROR(x, args...) LOG_E(F1AP, x, ##args)
|
||||
#define F1AP_WARN(x, args...) LOG_W(F1AP, x, ##args)
|
||||
#define F1AP_TRAF(x, args...) LOG_I(F1AP, x, ##args)
|
||||
#define F1AP_WARN(x, args...) LOG_W(F1AP, x, ##args)
|
||||
#define F1AP_TRAF(x, args...) LOG_I(F1AP, x, ##args)
|
||||
#define F1AP_INFO(x, args...) LOG_I(F1AP, x, ##args)
|
||||
#define F1AP_DEBUG(x, args...) LOG_I(F1AP, x, ##args)
|
||||
|
||||
//Forward declaration
|
||||
#define F1AP_FIND_PROTOCOLIE_BY_ID(IE_TYPE, ie, container, IE_ID, mandatory) \
|
||||
do {\
|
||||
IE_TYPE **ptr; \
|
||||
ie = NULL; \
|
||||
for (ptr = container->protocolIEs.list.array; \
|
||||
ptr < &container->protocolIEs.list.array[container->protocolIEs.list.count]; \
|
||||
ptr++) { \
|
||||
if((*ptr)->id == IE_ID) { \
|
||||
ie = *ptr; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
if (mandatory) DevAssert(ie != NULL); \
|
||||
} while(0)
|
||||
// Forward declaration
|
||||
#define F1AP_FIND_PROTOCOLIE_BY_ID(IE_TYPE, ie, container, IE_ID, mandatory) \
|
||||
do { \
|
||||
IE_TYPE **ptr; \
|
||||
ie = NULL; \
|
||||
for (ptr = container->protocolIEs.list.array; ptr < &container->protocolIEs.list.array[container->protocolIEs.list.count]; \
|
||||
ptr++) { \
|
||||
if ((*ptr)->id == IE_ID) { \
|
||||
ie = *ptr; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
if (mandatory) \
|
||||
DevAssert(ie != NULL); \
|
||||
} while (0)
|
||||
|
||||
/** \brief Function array prototype.
|
||||
**/
|
||||
@@ -411,7 +436,8 @@ typedef struct f1ap_cudu_inst_s {
|
||||
instance_t gtpInst;
|
||||
} f1ap_cudu_inst_t;
|
||||
|
||||
static const int nrb_lut[29] = {11, 18, 24, 25, 31, 32, 38, 51, 52, 65, 66, 78, 79, 93, 106, 107, 121, 132, 133, 135, 160, 162, 189, 216, 217, 245, 264, 270, 273};
|
||||
static const int nrb_lut[29] = {11, 18, 24, 25, 31, 32, 38, 51, 52, 65, 66, 78, 79, 93, 106,
|
||||
107, 121, 132, 133, 135, 160, 162, 189, 216, 217, 245, 264, 270, 273};
|
||||
|
||||
uint8_t F1AP_get_next_transaction_identifier(instance_t mod_idP, instance_t cu_mod_idP);
|
||||
|
||||
@@ -420,10 +446,12 @@ f1ap_cudu_inst_t *getCxt(instance_t instanceP);
|
||||
void createF1inst(instance_t instanceP, f1ap_setup_req_t *req, f1ap_net_config_t *nc);
|
||||
void destroyF1inst(instance_t instance);
|
||||
|
||||
//lts: C struct type is not homogeneous, so we need macros instead of functions
|
||||
#define addnRCGI(nRCGi, servedCelL) \
|
||||
MCC_MNC_TO_PLMNID((servedCelL)->plmn.mcc,(servedCelL)->plmn.mnc,(servedCelL)->plmn.mnc_digit_length, \
|
||||
&((nRCGi).pLMN_Identity)); \
|
||||
// lts: C struct type is not homogeneous, so we need macros instead of functions
|
||||
#define addnRCGI(nRCGi, servedCelL) \
|
||||
MCC_MNC_TO_PLMNID((servedCelL)->plmn.mcc, \
|
||||
(servedCelL)->plmn.mnc, \
|
||||
(servedCelL)->plmn.mnc_digit_length, \
|
||||
&((nRCGi).pLMN_Identity)); \
|
||||
NR_CELL_ID_TO_BIT_STRING((servedCelL)->nr_cellid, &((nRCGi).nRCellIdentity));
|
||||
extern RAN_CONTEXT_t RC;
|
||||
|
||||
|
||||
202
openair2/F1AP/f1ap_cu_position_information_transfer.c
Normal file
202
openair2/F1AP/f1ap_cu_position_information_transfer.c
Normal file
@@ -0,0 +1,202 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file f1ap_cu_position_information_transfer.c
|
||||
* \brief F1AP tasks related to position information transfer , CU side
|
||||
* \author EURECOM
|
||||
* \date 2023
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: adeel.malik@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#include "f1ap_common.h"
|
||||
#include "f1ap_encoder.h"
|
||||
#include "f1ap_itti_messaging.h"
|
||||
#include "f1ap_cu_position_information_transfer.h"
|
||||
#include <string.h>
|
||||
|
||||
#include "rrc_extern.h"
|
||||
#include "openair2/RRC/NR/rrc_gNB_NGAP.h"
|
||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||
#include "LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
|
||||
|
||||
int CU_send_POSITIONING_INFORMATION_REQUEST(instance_t instance,
|
||||
f1ap_positioning_information_req_t *f1ap_positioning_information_req)
|
||||
{
|
||||
printf("[F1AP] Test1 CU_send_POSITIONING_INFORMATION_REQUEST");
|
||||
F1AP_F1AP_PDU_t pdu = {0};
|
||||
/* Create */
|
||||
/* mandatory */
|
||||
/* 0. Message Type */
|
||||
pdu.present = F1AP_F1AP_PDU_PR_initiatingMessage;
|
||||
asn1cCalloc(pdu.choice.initiatingMessage, tmp);
|
||||
tmp->procedureCode = F1AP_ProcedureCode_id_PositioningInformationExchange;
|
||||
tmp->criticality = F1AP_Criticality_reject;
|
||||
tmp->value.present = F1AP_InitiatingMessage__value_PR_PositioningInformationRequest;
|
||||
F1AP_PositioningInformationRequest_t *out = &pdu.choice.initiatingMessage->value.choice.PositioningInformationRequest;
|
||||
|
||||
/* mandatory */
|
||||
/* c1. GNB_CU_UE_F1AP_ID */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_PositioningInformationRequestIEs_t, ie1);
|
||||
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
||||
ie1->criticality = F1AP_Criticality_reject;
|
||||
ie1->value.present = F1AP_PositioningInformationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
||||
// TODO check CPtype /
|
||||
ie1->value.choice.GNB_CU_UE_F1AP_ID =
|
||||
0; // f1ap_get_cu_ue_f1ap_id(CPtype, instance, f1ap_positioning_information_req->gNB_CU_ue_id);
|
||||
// //f1ap_ue_context_setup_req->gNB_CU_ue_id;
|
||||
// ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance,
|
||||
// f1ap_positioning_information_req->gNB_CU_ue_id); //f1ap_ue_context_setup_req->gNB_CU_ue_id;
|
||||
// ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_ue_context_setup_req->rnti);
|
||||
// //f1ap_ue_context_setup_req->gNB_CU_ue_id;
|
||||
|
||||
/* mandatory TODO*/
|
||||
/* c2. GNB_DU_UE_F1AP_ID */
|
||||
// if (f1ap_ue_context_setup_req->gNB_DU_ue_id) {
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_PositioningInformationRequestIEs_t, ie2);
|
||||
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||
ie2->criticality = F1AP_Criticality_ignore;
|
||||
ie2->value.present = F1AP_PositioningInformationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||
ie2->value.choice.GNB_DU_UE_F1AP_ID =
|
||||
0; // f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_positioning_information_req->gNB_DU_ue_id);
|
||||
// //*f1ap_ue_context_setup_req->gNB_DU_ue_id;
|
||||
}
|
||||
|
||||
/* OPTIONAL */
|
||||
/* Requested_SRS_Transmission_Characteristics // IE 9.3.1.175 (O) */
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_PositioningInformationRequestIEs_t, ie3);
|
||||
ie3->id = F1AP_ProtocolIE_ID_id_RequestedSRSTransmissionCharacteristics;
|
||||
ie3->criticality = F1AP_Criticality_reject;
|
||||
ie3->value.present = F1AP_PositioningInformationRequestIEs__value_PR_RequestedSRSTransmissionCharacteristics;
|
||||
// MaskedIMEISV_TO_BIT_STRING(12340000l, &ie15->value.choice.MaskedIMEISV); // size (64)
|
||||
}
|
||||
/* encode */
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t len = 0;
|
||||
|
||||
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
|
||||
LOG_E(F1AP, "Failed to encode F1 POSITION INFORMATION REQUEST\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
LOG_D(F1AP, "F1AP PositioningInformationRequest Encoded %u bits\n", len);
|
||||
// f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/);
|
||||
f1ap_itti_send_sctp_data_req(instance, buffer, len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CU_handle_POSITIONING_INFORMATION_RESPONSE(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu)
|
||||
{
|
||||
MessageDef *msg_p;
|
||||
F1AP_PositioningInformationResponse_t *container;
|
||||
F1AP_PositioningInformationResponseIEs_t *ie;
|
||||
DevAssert(pdu);
|
||||
msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_POSITIONING_INFORMATION_RESP);
|
||||
f1ap_positioning_information_resp_t *f1ap_positioning_information_resp = &F1AP_POSITIONING_INFORMATION_RESP(msg_p);
|
||||
container = &pdu->choice.successfulOutcome->value.choice.PositioningInformationResponse;
|
||||
|
||||
// int i;
|
||||
/* GNB_CU_UE_F1AP_ID */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PositioningInformationResponseIEs_t,
|
||||
ie,
|
||||
container,
|
||||
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID,
|
||||
true);
|
||||
f1ap_positioning_information_resp->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
|
||||
LOG_D(F1AP, "f1ap_positioning_information_resp->gNB_CU_ue_id is: %d \n", f1ap_positioning_information_resp->gNB_CU_ue_id);
|
||||
|
||||
/* GNB_DU_UE_F1AP_ID */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PositioningInformationResponseIEs_t,
|
||||
ie,
|
||||
container,
|
||||
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID,
|
||||
true);
|
||||
f1ap_positioning_information_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
||||
LOG_D(F1AP, "f1ap_positioning_information_resp->gNB_DU_ue_id is: %d \n", f1ap_positioning_information_resp->gNB_DU_ue_id);
|
||||
|
||||
// f1ap_ue_context_setup_resp->rnti =f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_setup_resp->gNB_DU_ue_id);
|
||||
|
||||
// SRSConfiguration
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PositioningInformationResponseIEs_t,
|
||||
ie,
|
||||
container,
|
||||
F1AP_ProtocolIE_ID_id_SRSConfiguration,
|
||||
false);
|
||||
|
||||
// SFNInitialisationTime
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PositioningInformationResponseIEs_t,
|
||||
ie,
|
||||
container,
|
||||
F1AP_ProtocolIE_ID_id_SFNInitialisationTime,
|
||||
false);
|
||||
|
||||
// CriticalityDiagnostics
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PositioningInformationResponseIEs_t,
|
||||
ie,
|
||||
container,
|
||||
F1AP_ProtocolIE_ID_id_CriticalityDiagnostics,
|
||||
false);
|
||||
|
||||
// itti_send_msg_to_task(TASK_NRPPA, instance, msg_p);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CU_handle_POSITIONING_INFORMATION_FAILURE(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu)
|
||||
{
|
||||
MessageDef *msg_p;
|
||||
F1AP_PositioningInformationFailure_t *container;
|
||||
F1AP_PositioningInformationFailureIEs_t *ie;
|
||||
DevAssert(pdu);
|
||||
msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_POSITIONING_INFORMATION_FAILURE);
|
||||
f1ap_positioning_information_failure_t *f1ap_positioning_information_failure = &F1AP_POSITIONING_INFORMATION_FAILURE(msg_p);
|
||||
container = &pdu->choice.unsuccessfulOutcome->value.choice.PositioningInformationFailure;
|
||||
|
||||
// int i;
|
||||
/* GNB_CU_UE_F1AP_ID */ /* mandatory */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PositioningInformationFailureIEs_t, ie, container, F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
||||
f1ap_positioning_information_failure->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
|
||||
LOG_D(F1AP, "f1ap_positioning_information_failure->gNB_CU_ue_id is: %d \n", f1ap_positioning_information_failure->gNB_CU_ue_id);
|
||||
|
||||
/* GNB_DU_UE_F1AP_ID */ /* mandatory */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PositioningInformationFailureIEs_t, ie, container, F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||
f1ap_positioning_information_failure->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
||||
LOG_D(F1AP, "f1ap_positioning_information_failure->gNB_DU_ue_id is: %d \n", f1ap_positioning_information_failure->gNB_DU_ue_id);
|
||||
|
||||
// f1ap_ue_context_setup_resp->rnti =f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_setup_resp->gNB_DU_ue_id);
|
||||
|
||||
// Cause (M) /* mandatory */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PositioningInformationFailureIEs_t, ie, container, F1AP_ProtocolIE_ID_id_SRSConfiguration, false);
|
||||
|
||||
// CriticalityDiagnostics /* optional */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PositioningInformationFailureIEs_t,
|
||||
ie,
|
||||
container,
|
||||
F1AP_ProtocolIE_ID_id_CriticalityDiagnostics,
|
||||
false);
|
||||
|
||||
// itti_send_msg_to_task(TASK_NRPPA, instance, msg_p);
|
||||
return 0;
|
||||
}
|
||||
43
openair2/F1AP/f1ap_cu_position_information_transfer.h
Normal file
43
openair2/F1AP/f1ap_cu_position_information_transfer.h
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file f1ap_cu_position_information_transfer.h
|
||||
* \brief F1AP tasks related to position information transfer , CU side
|
||||
* \author EURECOM
|
||||
* \date 2023
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: adeel.malik@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#ifndef F1AP_CU_POSITION_INFORMATION_TRANSFER_H_
|
||||
#define F1AP_CU_POSITION_INFORMATION_TRANSFER_H_
|
||||
|
||||
int CU_send_POSITIONING_INFORMATION_REQUEST(instance_t instance,
|
||||
f1ap_positioning_information_req_t *f1ap_positioning_information_req);
|
||||
|
||||
int CU_handle_POSITIONING_INFORMATION_RESPONSE(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu);
|
||||
|
||||
int CU_handle_POSITIONING_INFORMATION_FAILURE(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu);
|
||||
|
||||
#endif /* F1AP_CU_POSITION_INFORMATION_TRANSFER_H_ */
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "f1ap_cu_interface_management.h"
|
||||
#include "f1ap_cu_rrc_message_transfer.h"
|
||||
#include "f1ap_cu_ue_context_management.h"
|
||||
#include "f1ap_cu_position_information_transfer.h"
|
||||
#include "f1ap_cu_paging.h"
|
||||
#include "f1ap_cu_task.h"
|
||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||
|
||||
246
openair2/F1AP/f1ap_du_position_information_transfer.c
Normal file
246
openair2/F1AP/f1ap_du_position_information_transfer.c
Normal file
@@ -0,0 +1,246 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file f1ap_du_position_information_transfer.c
|
||||
* \brief F1AP tasks related to position information transfer , DU side
|
||||
* \author EURECOM
|
||||
* \date 2023
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: adeel.malik@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#include "f1ap_common.h"
|
||||
#include "f1ap_encoder.h"
|
||||
#include "f1ap_itti_messaging.h"
|
||||
#include "f1ap_du_position_information_transfer.h"
|
||||
//#include "openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h"
|
||||
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||
|
||||
int DU_handle_POSITIONING_INFORMATION_REQUEST(instance_t instance, uint32_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu)
|
||||
{
|
||||
// TODO not complete yet
|
||||
MessageDef *msg_p;
|
||||
F1AP_PositioningInformationRequest_t *container;
|
||||
F1AP_PositioningInformationRequestIEs_t *ie;
|
||||
DevAssert(pdu);
|
||||
msg_p = itti_alloc_new_message(TASK_CU_F1, 0, F1AP_POSITIONING_INFORMATION_REQ);
|
||||
f1ap_positioning_information_req_t *f1ap_positioning_information_req = &F1AP_POSITIONING_INFORMATION_REQ(msg_p);
|
||||
container = &pdu->choice.initiatingMessage->value.choice.PositioningInformationRequest;
|
||||
|
||||
// int i;
|
||||
/* GNB_CU_UE_F1AP_ID */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PositioningInformationRequestIEs_t, ie, container, F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
||||
f1ap_positioning_information_req->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
|
||||
LOG_D(F1AP, "f1ap_positioning_information_req->gNB_CU_ue_id is: %d \n", f1ap_positioning_information_req->gNB_CU_ue_id);
|
||||
|
||||
/* GNB_DU_UE_F1AP_ID */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PositioningInformationRequestIEs_t, ie, container, F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||
f1ap_positioning_information_req->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
||||
LOG_D(F1AP, "f1ap_positioning_information_req->gNB_DU_ue_id is: %d \n", f1ap_positioning_information_req->gNB_DU_ue_id);
|
||||
|
||||
// f1ap_ue_context_setup_resp->rnti =f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_setup_resp->gNB_DU_ue_id);
|
||||
|
||||
/* RequestedSRSTransmissionCharacteristics (O)*/
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_PositioningInformationRequestIEs_t,
|
||||
ie,
|
||||
container,
|
||||
F1AP_ProtocolIE_ID_id_RequestedSRSTransmissionCharacteristics,
|
||||
true);
|
||||
|
||||
// Preparing Response for the Received PositioningInformationRequest
|
||||
|
||||
bool response_type_indicator =
|
||||
1; // 1 = send Position Information transfer Response, 0 = send Position Information transfer Failure
|
||||
|
||||
if (response_type_indicator) {
|
||||
printf("[F1AP] PIR Test Adeel: Processing Received PositioningInformationRequest \n");
|
||||
LOG_D(F1AP, "DU Preparing PositioningInformationResponse message \n");
|
||||
// nrppa_gNB_PositioningInformationResponse(nrppa_transaction_id, nrppa_msg_info);
|
||||
// DU_send_POSITIONING_INFORMATION_RESPONSE()
|
||||
return 0;
|
||||
} else {
|
||||
printf("[F1AP] PIF Test Adeel: Processing Received PositioningInformationRequest \n");
|
||||
LOG_D(F1AP, "DU Preparing PositioningInformationFailure message \n");
|
||||
// nrppa_pdu_length= nrppa_gNB_PositioningInformationFailure(nrppa_transaction_id, &tx_nrppa_pdu);
|
||||
// DU_send_POSITIONING_INFORMATION_FAILURE()
|
||||
return 0;
|
||||
}
|
||||
|
||||
// itti_send_msg_to_task(TASK_NRPPA, instance, msg_p);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int DU_send_POSITIONING_INFORMATION_RESPONSE(instance_t instance,
|
||||
f1ap_positioning_information_resp_t *f1ap_positioning_information_resp)
|
||||
{
|
||||
F1AP_F1AP_PDU_t pdu = {0};
|
||||
F1AP_PositioningInformationResponse_t *out;
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t len = 0;
|
||||
|
||||
/* Create */
|
||||
/* 0. Message Type */
|
||||
pdu.present = F1AP_F1AP_PDU_PR_successfulOutcome;
|
||||
asn1cCalloc(pdu.choice.successfulOutcome, tmp);
|
||||
tmp->procedureCode = F1AP_ProcedureCode_id_PositioningInformationExchange;
|
||||
tmp->criticality = F1AP_Criticality_reject;
|
||||
tmp->value.present = F1AP_SuccessfulOutcome__value_PR_PositioningInformationResponse;
|
||||
out = &tmp->value.choice.PositioningInformationResponse;
|
||||
|
||||
/* mandatory */
|
||||
/* c1. GNB_CU_UE_F1AP_ID */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_PositioningInformationResponseIEs_t, ie1);
|
||||
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
||||
ie1->criticality = F1AP_Criticality_reject;
|
||||
ie1->value.present = F1AP_PositioningInformationResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
||||
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_positioning_information_resp->gNB_CU_ue_id;
|
||||
|
||||
/* mandatory */
|
||||
/* c2. GNB_DU_UE_F1AP_ID */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_PositioningInformationResponseIEs_t, ie2);
|
||||
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||
ie2->criticality = F1AP_Criticality_reject;
|
||||
ie2->value.present = F1AP_PositioningInformationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||
ie2->value.choice.GNB_DU_UE_F1AP_ID =
|
||||
f1ap_positioning_information_resp->gNB_DU_ue_id; // f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti);
|
||||
|
||||
/* Optional */
|
||||
/* SRSConfiguration */
|
||||
if (0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_PositioningInformationResponseIEs_t, ie3);
|
||||
ie3->id = F1AP_ProtocolIE_ID_id_SRSConfiguration;
|
||||
ie3->criticality = F1AP_Criticality_ignore;
|
||||
ie3->value.present = F1AP_PositioningInformationResponseIEs__value_PR_SRSConfiguration;
|
||||
}
|
||||
|
||||
/* Optional */
|
||||
/* SFN Initialisation Time*/
|
||||
if (0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_PositioningInformationResponseIEs_t, ie4);
|
||||
ie4->id = F1AP_ProtocolIE_ID_id_SFNInitialisationTime;
|
||||
ie4->criticality = F1AP_Criticality_ignore;
|
||||
ie4->value.present = F1AP_PositioningInformationResponseIEs__value_PR_SFNInitialisationTime;
|
||||
// TODO Retreive SFN Initialisation Time and assign
|
||||
// ie4->value.choice.SFNInitialisationTime.buf = NULL ; //TODO adeel retrieve and add TYPE typedef struct BIT_STRING_s {uint8_t
|
||||
// *buf; size_t size; int bits_unused;} BIT_STRING_t; ie4->value.choice.SFNInitialisationTime.size =4;
|
||||
// ie4->value.choice.SFNInitialisationTime.bits_unused =0;
|
||||
}
|
||||
|
||||
/* Optional */
|
||||
/* CriticalityDiagnostics */
|
||||
if (0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_PositioningInformationResponseIEs_t, ie5);
|
||||
ie5->id = F1AP_ProtocolIE_ID_id_CriticalityDiagnostics;
|
||||
ie5->criticality = F1AP_Criticality_ignore;
|
||||
ie5->value.present = F1AP_PositioningInformationResponseIEs__value_PR_CriticalityDiagnostics;
|
||||
asn1cCallocOne(ie5->value.choice.CriticalityDiagnostics.procedureCode, F1AP_ProcedureCode_id_PositioningInformationExchange);
|
||||
asn1cCallocOne(ie5->value.choice.CriticalityDiagnostics.triggeringMessage, F1AP_TriggeringMessage_initiating_message);
|
||||
asn1cCallocOne(ie5->value.choice.CriticalityDiagnostics.procedureCriticality, F1AP_Criticality_reject);
|
||||
asn1cCallocOne(ie5->value.choice.CriticalityDiagnostics.transactionID, 0);
|
||||
}
|
||||
|
||||
/* encode */
|
||||
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
|
||||
LOG_E(F1AP, "Failed to encode F1 UE CONTEXT SETUP RESPONSE\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(false, instance)->default_sctp_stream_id);
|
||||
f1ap_itti_send_sctp_data_req(instance, buffer, len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int DU_send_POSITIONING_INFORMATION_FAILURE(instance_t instance,
|
||||
f1ap_positioning_information_failure_t *f1ap_positioning_information_failure)
|
||||
{
|
||||
F1AP_F1AP_PDU_t pdu = {0};
|
||||
F1AP_PositioningInformationFailure_t *out;
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t len = 0;
|
||||
|
||||
/* Create */
|
||||
/* 0. Message Type */
|
||||
pdu.present = F1AP_F1AP_PDU_PR_unsuccessfulOutcome;
|
||||
asn1cCalloc(pdu.choice.unsuccessfulOutcome, tmp);
|
||||
tmp->procedureCode = F1AP_ProcedureCode_id_PositioningInformationExchange;
|
||||
tmp->criticality = F1AP_Criticality_reject;
|
||||
tmp->value.present = F1AP_UnsuccessfulOutcome__value_PR_PositioningInformationFailure;
|
||||
out = &tmp->value.choice.PositioningInformationFailure;
|
||||
|
||||
/* mandatory */
|
||||
/* c1. GNB_CU_UE_F1AP_ID */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_PositioningInformationFailureIEs_t, ie1);
|
||||
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
||||
ie1->criticality = F1AP_Criticality_reject;
|
||||
ie1->value.present = F1AP_PositioningInformationFailureIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
||||
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_positioning_information_failure->gNB_CU_ue_id;
|
||||
|
||||
/* mandatory */
|
||||
/* c2. GNB_DU_UE_F1AP_ID */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_PositioningInformationFailureIEs_t, ie2);
|
||||
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||
ie2->criticality = F1AP_Criticality_reject;
|
||||
ie2->value.present = F1AP_PositioningInformationFailureIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||
ie2->value.choice.GNB_DU_UE_F1AP_ID =
|
||||
f1ap_positioning_information_failure->gNB_DU_ue_id; // f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti);
|
||||
|
||||
/* Optional */
|
||||
/* CriticalityDiagnostics */
|
||||
if (0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_PositioningInformationFailureIEs_t, ie3);
|
||||
ie3->id = F1AP_ProtocolIE_ID_id_Cause;
|
||||
ie3->criticality = F1AP_Criticality_ignore;
|
||||
ie3->value.present = F1AP_PositioningInformationFailureIEs__value_PR_Cause;
|
||||
// TODO Reteive Cause and assign
|
||||
ie3->value.choice.Cause.present = F1AP_Cause_PR_misc; // IE 1
|
||||
// ie->value.choice.Cause.present = F1AP_Cause_PR_NOTHING ; //IE 1
|
||||
ie3->value.choice.Cause.choice.misc = 0; // TODO dummay response
|
||||
// ie->value.choice.Cause. =; // IE 2 and so on
|
||||
}
|
||||
|
||||
/* Optional */
|
||||
/* CriticalityDiagnostics */
|
||||
if (0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_PositioningInformationFailureIEs_t, ie4);
|
||||
ie4->id = F1AP_ProtocolIE_ID_id_CriticalityDiagnostics;
|
||||
ie4->criticality = F1AP_Criticality_ignore;
|
||||
ie4->value.present = F1AP_PositioningInformationFailureIEs__value_PR_CriticalityDiagnostics;
|
||||
asn1cCallocOne(ie4->value.choice.CriticalityDiagnostics.procedureCode, F1AP_ProcedureCode_id_PositioningInformationExchange);
|
||||
asn1cCallocOne(ie4->value.choice.CriticalityDiagnostics.triggeringMessage, F1AP_TriggeringMessage_initiating_message);
|
||||
asn1cCallocOne(ie4->value.choice.CriticalityDiagnostics.procedureCriticality, F1AP_Criticality_reject);
|
||||
asn1cCallocOne(ie4->value.choice.CriticalityDiagnostics.transactionID, 0);
|
||||
}
|
||||
|
||||
/* encode */
|
||||
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
|
||||
LOG_E(F1AP, "Failed to encode F1 UE CONTEXT SETUP RESPONSE\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(false, instance)->default_sctp_stream_id);
|
||||
f1ap_itti_send_sctp_data_req(instance, buffer, len);
|
||||
return 0;
|
||||
}
|
||||
44
openair2/F1AP/f1ap_du_position_information_transfer.h
Normal file
44
openair2/F1AP/f1ap_du_position_information_transfer.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file f1ap_du_position_information_transfer.h
|
||||
* \brief F1AP tasks related to position information transfer , DU side
|
||||
* \author EURECOM
|
||||
* \date 2023
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: adeel.malik@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#ifndef F1AP_DU_POSITION_INFORMATION_TRANSFER_H_
|
||||
#define F1AP_DU_POSITION_INFORMATION_TRANSFER_H_
|
||||
|
||||
int DU_handle_POSITIONING_INFORMATION_REQUEST(instance_t instance, uint32_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu);
|
||||
|
||||
int DU_send_POSITIONING_INFORMATION_RESPONSE(instance_t instance,
|
||||
f1ap_positioning_information_resp_t *f1ap_positioning_information_resp);
|
||||
|
||||
int DU_send_POSITIONING_INFORMATION_FAILURE(instance_t instance,
|
||||
f1ap_positioning_information_failure_t *f1ap_positioning_information_failure);
|
||||
|
||||
#endif /* F1AP_DU_POSITION_INFORMATION_TRANSFER_H_ */
|
||||
@@ -39,6 +39,10 @@
|
||||
#include "f1ap_du_ue_context_management.h"
|
||||
#include "f1ap_du_paging.h"
|
||||
|
||||
/*NRPPA*/
|
||||
#include "f1ap_cu_position_information_transfer.h"
|
||||
#include "f1ap_du_position_information_transfer.h"
|
||||
|
||||
/* Handlers matrix. Only f1 related procedure present here */
|
||||
static const f1ap_message_processing_t f1ap_messages_processing[][3] = {
|
||||
|
||||
@@ -55,7 +59,9 @@ static const f1ap_message_processing_t f1ap_messages_processing[][3] = {
|
||||
{DU_handle_UE_CONTEXT_SETUP_REQUEST, CU_handle_UE_CONTEXT_SETUP_RESPONSE, 0}, /* UEContextSetup */
|
||||
{DU_handle_UE_CONTEXT_RELEASE_COMMAND, CU_handle_UE_CONTEXT_RELEASE_COMPLETE, 0}, /* UEContextRelease */
|
||||
{DU_handle_UE_CONTEXT_MODIFICATION_REQUEST, CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE, 0}, /* UEContextModification */
|
||||
{CU_handle_UE_CONTEXT_MODIFICATION_REQUIRED, DU_handle_UE_CONTEXT_MODIFICATION_CONFIRM, DU_handle_UE_CONTEXT_MODIFICATION_REFUSE}, /* UEContextModificationRequired */
|
||||
{CU_handle_UE_CONTEXT_MODIFICATION_REQUIRED,
|
||||
DU_handle_UE_CONTEXT_MODIFICATION_CONFIRM,
|
||||
DU_handle_UE_CONTEXT_MODIFICATION_REFUSE}, /* UEContextModificationRequired */
|
||||
{0, 0, 0}, /* UEMobilityCommand */
|
||||
{CU_handle_UE_CONTEXT_RELEASE_REQUEST, 0, 0}, /* UEContextReleaseRequest */
|
||||
{CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER, 0, 0}, /* InitialULRRCMessageTransfer */
|
||||
@@ -71,16 +77,64 @@ static const f1ap_message_processing_t f1ap_messages_processing[][3] = {
|
||||
{0, 0, 0}, /* PWSCancel */
|
||||
{0, 0, 0}, /* PWSRestartIndication */
|
||||
{0, 0, 0}, /* PWSFailureIndication */
|
||||
{0, 0, 0}, /*GNBDUStatusIndication */
|
||||
{0, 0, 0}, /*RRCDeliveryReport */
|
||||
{0, 0, 0}, /*UEContextModificationRefuse*/
|
||||
{0, 0, 0},
|
||||
/*F1RemovalRequest*/ /*F1RemovalResponse*/ /*F1RemovalFailure*/
|
||||
{0, 0, 0}, /*NetworkAccessRateReduction,*/
|
||||
{0, 0, 0}, /*TraceStart,*/
|
||||
{0, 0, 0}, /*DeactivateTrace,*/
|
||||
{0, 0, 0}, /*DUCURadioInformationTransfer,*/
|
||||
{0, 0, 0}, /*CUDURadioInformationTransfer,*/
|
||||
{0, 0, 0},
|
||||
/*BAPMappingConfiguration,*/ /*BAPMappingConfigurationAcknowledge,*/
|
||||
{0, 0, 0},
|
||||
/*GNBDUResourceConfiguration,*/ /*GNBDUResourceConfigurationAcknowledge,*/
|
||||
{0, 0, 0},
|
||||
/*IABTNLAddressRequest,*/ /*IABTNLAddressResponse,*/
|
||||
{0, 0, 0},
|
||||
/*IABUPConfigurationUpdateRequest,*/ /*IABUPConfigurationUpdateResponse,*/ /*IABUPConfigurationUpdateFailure,*/
|
||||
{0, 0, 0},
|
||||
/*ResourceStatusRequest,*/ /*ResourceStatusResponse,*/ /*ResourceStatusFailure,*/
|
||||
{0, 0, 0}, /*ResourceStatusUpdate,*/
|
||||
{0, 0, 0}, /*AccessAndMobilityIndication,*/
|
||||
{0, 0, 0}, /*ReferenceTimeInformationReportingControl,*/
|
||||
{0, 0, 0}, /*ReferenceTimeInformationReport,*/
|
||||
{0, 0, 0}, /*AccessSuccess,*/
|
||||
{0, 0, 0}, /*CellTrafficTrace,*/
|
||||
{0, 0, 0},
|
||||
/*PositioningMeasurementRequest,*/ /*PositioningMeasurementResponse,*/ /*PositioningMeasurementFailure,*/
|
||||
{0, 0, 0}, /*PositioningAssistanceInformationControl,*/
|
||||
{0, 0, 0}, /*PositioningAssistanceInformationFeedback,*/
|
||||
{0, 0, 0}, /*PositioningMeasurementReport,*/
|
||||
{0, 0, 0}, /*PositioningMeasurementAbort,*/
|
||||
{0, 0, 0}, /*PositioningMeasurementFailureIndication,*/
|
||||
{0, 0, 0}, /*PositioningMeasurementUpdate,*/
|
||||
{0, 0, 0},
|
||||
/*TRPInformationRequest,*/ /*TRPInformationResponse,*/ /*TRPInformationFailure,*/
|
||||
{0, CU_handle_POSITIONING_INFORMATION_RESPONSE, CU_handle_POSITIONING_INFORMATION_FAILURE},
|
||||
/*PositioningInformationRequest,*/ /*PositioningInformationResponse,*/ /*PositioningInformationFailure,*/
|
||||
{0, 0, 0},
|
||||
/*PositioningActivationRequest,*/ /*PositioningActivationResponse,*/ /*PositioningActivationFailure,*/
|
||||
{0, 0, 0}, /*PositioningDeactivation,*/
|
||||
{0, 0, 0}, /*PositioningInformationUpdate,*/
|
||||
{0, 0, 0},
|
||||
/*E-CIDMeasurementInitiationRequest,*/ /*E-CIDMeasurementInitiationResponse,*/ /*E-CIDMeasurementInitiationFailure,*/
|
||||
{0, 0, 0}, /*E-CIDMeasurementFailureIndication,*/
|
||||
{0, 0, 0}, /*E-CIDMeasurementReport,*/
|
||||
{0, 0, 0}, /*E-CIDMeasurementTerminationCommand*/
|
||||
};
|
||||
|
||||
const char *f1ap_direction2String(int f1ap_dir) {
|
||||
const char *f1ap_direction2String(int f1ap_dir)
|
||||
{
|
||||
static const char *const f1ap_direction_String[] = {
|
||||
"", /* Nothing */
|
||||
"Initiating message", /* initiating message */
|
||||
"Successfull outcome", /* successfull outcome */
|
||||
"UnSuccessfull outcome", /* successfull outcome */
|
||||
};
|
||||
return(f1ap_direction_String[f1ap_dir]);
|
||||
return (f1ap_direction_String[f1ap_dir]);
|
||||
}
|
||||
|
||||
static F1AP_F1AP_PDU_t *f1ap_decode_pdu(const uint8_t *const buffer, uint32_t length)
|
||||
@@ -133,10 +187,10 @@ int f1ap_handle_message(instance_t instance,
|
||||
assoc_id,
|
||||
pdu->choice.initiatingMessage->procedureCode,
|
||||
f1ap_direction2String(pdu->present - 1));
|
||||
ret=-1;
|
||||
ret = -1;
|
||||
} else {
|
||||
/* Calling the right handler */
|
||||
LOG_D(F1AP, "Calling handler with instance %ld\n",instance);
|
||||
LOG_D(F1AP, "Calling handler with instance %ld\n", instance);
|
||||
ret = (*f1ap_messages_processing[pdu->choice.initiatingMessage->procedureCode][pdu->present - 1])(instance,
|
||||
assoc_id,
|
||||
stream,
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
#include "nr_pdcp/nr_pdcp_oai_api.h"
|
||||
|
||||
//#include "L1_paramdef.h"
|
||||
#include "positioning_nr_paramdef.h"
|
||||
#include "prs_nr_paramdef.h"
|
||||
#include "L1_nr_paramdef.h"
|
||||
#include "MACRLC_nr_paramdef.h"
|
||||
@@ -789,6 +790,59 @@ void RCconfig_nr_prs(void)
|
||||
}
|
||||
}
|
||||
|
||||
void RCconfig_nr_positioning(void)
|
||||
{
|
||||
positioning_config_t *positioning_config = NULL;
|
||||
paramdef_t POSITIONING_Params[] = POSITIONING_PARAMS_DESC;
|
||||
paramlist_def_t POSITIONING_ParamList = {CONFIG_STRING_POSITIONING_CONFIG,NULL,0};
|
||||
if (RC.gNB == NULL) {
|
||||
RC.gNB = (PHY_VARS_gNB **)malloc((1+NUMBER_OF_gNB_MAX)*sizeof(PHY_VARS_gNB*));
|
||||
LOG_I(NR_PHY,"RC.gNB = %p\n",RC.gNB);
|
||||
memset(RC.gNB,0,(1+NUMBER_OF_gNB_MAX)*sizeof(PHY_VARS_gNB*));
|
||||
}
|
||||
|
||||
config_getlist(config_get_if(), &POSITIONING_ParamList, POSITIONING_Params, sizeofArray(POSITIONING_Params), NULL);
|
||||
|
||||
if (POSITIONING_ParamList.numelt > 0) {
|
||||
for (int j = 0; j < RC.nb_nr_L1_inst; j++) {
|
||||
if (RC.gNB[j] == NULL) {
|
||||
RC.gNB[j] = (PHY_VARS_gNB *)malloc(sizeof(PHY_VARS_gNB));
|
||||
LOG_I(NR_PHY,"RC.gNB[%d] = %p\n",j,RC.gNB[j]);
|
||||
memset(RC.gNB[j],0,sizeof(PHY_VARS_gNB));
|
||||
RC.gNB[j]->Mod_id = j;
|
||||
}
|
||||
positioning_config =&RC.gNB[j]->positioning_config;
|
||||
positioning_config->NumTRPs=*(POSITIONING_ParamList.paramarray[j][POSITIONING_NUM_TRPS].uptr);
|
||||
for (int l = 0; l < POSITIONING_ParamList.paramarray[j][POSITIONING_TRP_IDS_LIST].numelt; l++){
|
||||
positioning_config->TRPIDs[l] = POSITIONING_ParamList.paramarray[j][POSITIONING_TRP_IDS_LIST].uptr[l];
|
||||
}
|
||||
for (int l = 0; l < POSITIONING_ParamList.paramarray[j][POSITIONING_TRP_X_AXIS_LIST].numelt; l++){
|
||||
positioning_config->TRPxAxis[l] = POSITIONING_ParamList.paramarray[j][POSITIONING_TRP_X_AXIS_LIST].uptr[l];
|
||||
}
|
||||
for (int l = 0; l < POSITIONING_ParamList.paramarray[j][POSITIONING_TRP_Y_AXIS_LIST].numelt; l++){
|
||||
positioning_config->TRPyAxis[l] = POSITIONING_ParamList.paramarray[j][POSITIONING_TRP_Y_AXIS_LIST].uptr[l];
|
||||
}
|
||||
for (int l = 0; l < POSITIONING_ParamList.paramarray[j][POSITIONING_TRP_Z_AXIS_LIST].numelt; l++){
|
||||
positioning_config->TRPzAxis[l] = POSITIONING_ParamList.paramarray[j][POSITIONING_TRP_Z_AXIS_LIST].uptr[l];
|
||||
}
|
||||
LOG_I(PHY, "-----------------------------------------\n");
|
||||
LOG_I(PHY, "Positioning Config for gNB_id %d\n", j);
|
||||
LOG_I(PHY, "-----------------------------------------\n");
|
||||
LOG_I(PHY, "Number of TRPs \t\t%d\n", positioning_config->NumTRPs);
|
||||
for(int i=0; i<positioning_config->NumTRPs ; i++){
|
||||
LOG_I(PHY, "X-axis of TRP %d TRPs \t\t%d\n", positioning_config->TRPIDs[i], positioning_config->TRPxAxis[i]);
|
||||
LOG_I(PHY, "Y-axis of TRP %d TRPs \t\t%d\n", positioning_config->TRPIDs[i], positioning_config->TRPyAxis[i]);
|
||||
LOG_I(PHY, "Z-axis of TRP %d TRPs \t\t%d\n", positioning_config->TRPIDs[i], positioning_config->TRPzAxis[i]);
|
||||
}
|
||||
LOG_I(PHY, "-----------------------------------------\n");
|
||||
} // for j
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_I(PHY,"No " CONFIG_STRING_POSITIONING_CONFIG " configuration found..!!\n");
|
||||
}
|
||||
}
|
||||
|
||||
void RCconfig_NR_L1(void)
|
||||
{
|
||||
int j = 0;
|
||||
@@ -1845,6 +1899,43 @@ void RCconfig_NRRRC(gNB_RRC_INST *rrc)
|
||||
|
||||
}//
|
||||
}//End for (k=0; k <num_gnbs ; k++)
|
||||
|
||||
// Extracting Parameter required for Positioning
|
||||
positioning_config_rrc_t *positioning_config = NULL;
|
||||
paramdef_t POSITIONING_Params[] = POSITIONING_PARAMS_DESC;
|
||||
paramlist_def_t POSITIONING_ParamList = {CONFIG_STRING_POSITIONING_CONFIG,NULL,0};
|
||||
config_getlist(config_get_if(), &POSITIONING_ParamList, POSITIONING_Params, sizeofArray(POSITIONING_Params), NULL);
|
||||
if (POSITIONING_ParamList.numelt > 0) {
|
||||
positioning_config = &rrc->positioning_config; // &RC.gNB[j]->positioning_config;
|
||||
positioning_config->NumTRPs=*(POSITIONING_ParamList.paramarray[0][POSITIONING_NUM_TRPS].uptr);
|
||||
for (int l = 0; l < POSITIONING_ParamList.paramarray[0][POSITIONING_TRP_IDS_LIST].numelt; l++){
|
||||
positioning_config->TRPIDs[l] = POSITIONING_ParamList.paramarray[0][POSITIONING_TRP_IDS_LIST].uptr[l];
|
||||
}
|
||||
for (int l = 0; l < POSITIONING_ParamList.paramarray[0][POSITIONING_TRP_X_AXIS_LIST].numelt; l++){
|
||||
positioning_config->TRPxAxis[l] = POSITIONING_ParamList.paramarray[0][POSITIONING_TRP_X_AXIS_LIST].uptr[l];
|
||||
}
|
||||
for (int l = 0; l < POSITIONING_ParamList.paramarray[0][POSITIONING_TRP_Y_AXIS_LIST].numelt; l++){
|
||||
positioning_config->TRPyAxis[l] = POSITIONING_ParamList.paramarray[0][POSITIONING_TRP_Y_AXIS_LIST].uptr[l];
|
||||
}
|
||||
for (int l = 0; l < POSITIONING_ParamList.paramarray[0][POSITIONING_TRP_Z_AXIS_LIST].numelt; l++){
|
||||
positioning_config->TRPzAxis[l] = POSITIONING_ParamList.paramarray[0][POSITIONING_TRP_Z_AXIS_LIST].uptr[l];
|
||||
}
|
||||
|
||||
LOG_I(RRC, "-----------------------------------------\n");
|
||||
LOG_I(RRC, "Positioning Config for gNB_id %d\n", 0);
|
||||
LOG_I(RRC, "-----------------------------------------\n");
|
||||
LOG_I(RRC, "Number of TRPs \t\t%d\n", positioning_config->NumTRPs);
|
||||
for (int i = 0; i < positioning_config->NumTRPs; i++){
|
||||
LOG_I(RRC, "X-axis of TRP %d TRPs \t\t%d\n", positioning_config->TRPIDs[i], positioning_config->TRPxAxis[i]);
|
||||
LOG_I(RRC, "Y-axis of TRP %d TRPs \t\t%d\n", positioning_config->TRPIDs[i], positioning_config->TRPyAxis[i]);
|
||||
LOG_I(RRC, "Z-axis of TRP %d TRPs \t\t%d\n", positioning_config->TRPIDs[i], positioning_config->TRPzAxis[i]);
|
||||
}
|
||||
LOG_I(RRC, "-----------------------------------------\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_I(RRC,"No " CONFIG_STRING_POSITIONING_CONFIG " configuration found..!!\n");
|
||||
}
|
||||
openair_rrc_gNB_configuration(rrc, &nrrrc_config);
|
||||
}//End if (num_gnbs>0)
|
||||
|
||||
|
||||
@@ -94,6 +94,7 @@ typedef struct ru_config_s {
|
||||
|
||||
void RCconfig_verify(configmodule_interface_t *cfg, ngran_node_t node_type);
|
||||
extern void RCconfig_nr_prs(void);
|
||||
extern void RCconfig_nr_positioning(void);
|
||||
extern void RCconfig_NR_L1(void);
|
||||
extern void RCconfig_nr_macrlc(configmodule_interface_t *cfg);
|
||||
extern void NRRCConfig(void);
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
#include "SCHED_NR/phy_frame_config_nr.h"
|
||||
|
||||
#include "NR_MIB.h"
|
||||
#include "RRC/NR/nr_rrc_config.h"
|
||||
#include "LAYER2/NR_MAC_COMMON/nr_mac_common.h"
|
||||
#include "nfapi/oai_integration/vendor_ext.h"
|
||||
/* Softmodem params */
|
||||
|
||||
@@ -286,8 +286,10 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frame, sub_frame_
|
||||
// Schedule CSI measurement reporting
|
||||
nr_csi_meas_reporting(module_idP, frame, slot);
|
||||
|
||||
nr_schedule_srs(module_idP, frame, slot);
|
||||
|
||||
//nr_schedule_srs(module_idP, frame, slot);
|
||||
|
||||
nr_schedule_srs_secondary(module_idP,frame,slot);
|
||||
|
||||
// This schedule RA procedure if not in phy_test mode
|
||||
// Otherwise consider 5G already connected
|
||||
if (get_softmodem_params()->phy_test == 0) {
|
||||
|
||||
@@ -477,13 +477,80 @@ static void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu,
|
||||
vrb_map_UL[i + srs_pdu->bwp_start] |= mask;
|
||||
}
|
||||
|
||||
static void nr_configure_srs_f1ap(nfapi_nr_srs_pdu_t *srs_pdu,
|
||||
int slot,
|
||||
int module_id,
|
||||
int CC_id,
|
||||
NR_UE_info_t *UE,
|
||||
f1ap_srs_resource_set_t *srs_resource_set,
|
||||
f1ap_srs_resource_t *srs_resource,
|
||||
int buffer_index)
|
||||
{
|
||||
NR_UE_UL_BWP_t *current_BWP = &UE->current_UL_BWP;
|
||||
|
||||
srs_pdu->rnti = UE->rnti;
|
||||
srs_pdu->handle = 0;
|
||||
srs_pdu->bwp_size = current_BWP->BWPSize;
|
||||
srs_pdu->bwp_start = current_BWP->BWPStart;
|
||||
srs_pdu->subcarrier_spacing = current_BWP->scs;
|
||||
srs_pdu->cyclic_prefix = 0;
|
||||
srs_pdu->num_ant_ports = srs_resource->nrofSRS_Ports;
|
||||
srs_pdu->num_symbols = srs_resource->nrofSymbols;
|
||||
srs_pdu->num_repetitions = srs_resource->repetitionFactor;
|
||||
srs_pdu->time_start_position = srs_resource->startPosition;
|
||||
srs_pdu->config_index = srs_resource->c_SRS;
|
||||
srs_pdu->sequence_id = srs_resource->sequenceId;
|
||||
srs_pdu->bandwidth_index = srs_resource->b_SRS;
|
||||
srs_pdu->comb_size = srs_resource->transmissionComb.present - 1;
|
||||
|
||||
switch(srs_resource->transmissionComb.present) {
|
||||
case f1ap_transmission_comb_pr_n2:
|
||||
srs_pdu->comb_offset = srs_resource->transmissionComb.choice.n2.combOffset_n2;
|
||||
srs_pdu->cyclic_shift = srs_resource->transmissionComb.choice.n2.cyclicShift_n2;
|
||||
break;
|
||||
case f1ap_transmission_comb_pr_n4:
|
||||
srs_pdu->comb_offset = srs_resource->transmissionComb.choice.n4.combOffset_n4;
|
||||
srs_pdu->cyclic_shift = srs_resource->transmissionComb.choice.n4.cyclicShift_n4;
|
||||
break;
|
||||
default:
|
||||
LOG_W(NR_MAC, "Invalid or not implemented comb_size!\n");
|
||||
}
|
||||
|
||||
srs_pdu->frequency_position = srs_resource->freqDomainPosition;
|
||||
srs_pdu->frequency_shift = srs_resource->freqDomainShift;
|
||||
srs_pdu->frequency_hopping = srs_resource->b_hop;
|
||||
srs_pdu->group_or_sequence_hopping = srs_resource->groupOrSequenceHopping;
|
||||
srs_pdu->resource_type = srs_resource->resourceType.present - 1;
|
||||
srs_pdu->t_srs = srs_period[srs_resource->resourceType.choice.periodic.periodicity];
|
||||
srs_pdu->t_offset = srs_resource->resourceType.choice.periodic.offset;
|
||||
|
||||
// TODO: This should be completed
|
||||
srs_pdu->srs_parameters_v4.srs_bandwidth_size = m_SRS[srs_pdu->config_index];
|
||||
srs_pdu->srs_parameters_v4.usage = 1 << NFAPI_NR_SRS_LOCALIZATION;
|
||||
srs_pdu->srs_parameters_v4.report_type[0] = 1;
|
||||
srs_pdu->srs_parameters_v4.iq_representation = 1;
|
||||
srs_pdu->srs_parameters_v4.prg_size = 1;
|
||||
srs_pdu->srs_parameters_v4.num_total_ue_antennas = 1<<srs_pdu->num_ant_ports;
|
||||
if (/*usage==*/1) {
|
||||
srs_pdu->beamforming.trp_scheme = 0;
|
||||
srs_pdu->beamforming.num_prgs = m_SRS[srs_pdu->config_index];
|
||||
srs_pdu->beamforming.prg_size = 1;
|
||||
}
|
||||
|
||||
uint16_t *vrb_map_UL = &RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[0][buffer_index * MAX_BWP_SIZE];
|
||||
uint64_t mask = SL_to_bitmap(13 - srs_pdu->time_start_position, srs_pdu->num_symbols);
|
||||
for (int i = 0; i < srs_pdu->bwp_size; ++i)
|
||||
vrb_map_UL[i + srs_pdu->bwp_start] |= mask;
|
||||
}
|
||||
|
||||
static void nr_fill_nfapi_srs(int module_id,
|
||||
int CC_id,
|
||||
NR_UE_info_t *UE,
|
||||
int frame,
|
||||
int slot,
|
||||
NR_SRS_ResourceSet_t *srs_resource_set,
|
||||
NR_SRS_Resource_t *srs_resource)
|
||||
void *srs_resource_set,
|
||||
void *srs_resource,
|
||||
int is_f1ap)
|
||||
{
|
||||
|
||||
int index = ul_buffer_index(frame, slot, UE->current_UL_BWP.scs, RC.nrmac[module_id]->UL_tti_req_ahead_size);
|
||||
@@ -497,7 +564,26 @@ static void nr_fill_nfapi_srs(int module_id,
|
||||
memset(srs_pdu, 0, sizeof(nfapi_nr_srs_pdu_t));
|
||||
future_ul_tti_req->n_pdus += 1;
|
||||
index = ul_buffer_index(frame, slot, UE->current_UL_BWP.scs, RC.nrmac[module_id]->vrb_map_UL_size);
|
||||
nr_configure_srs(srs_pdu, slot, module_id, CC_id, UE, srs_resource_set, srs_resource, index);
|
||||
//LOG_I(MAC,"nr_fill_nfapi_srs: is_f1ap %d, num_pdu %d\n",is_f1ap,future_ul_tti_req->n_pdus);
|
||||
if (is_f1ap)
|
||||
nr_configure_srs_f1ap(srs_pdu,
|
||||
slot,
|
||||
module_id,
|
||||
CC_id,
|
||||
UE,
|
||||
(f1ap_srs_resource_set_t *) srs_resource_set,
|
||||
(f1ap_srs_resource_t *) srs_resource,
|
||||
index);
|
||||
else
|
||||
nr_configure_srs(srs_pdu,
|
||||
slot,
|
||||
module_id,
|
||||
CC_id,
|
||||
UE,
|
||||
(NR_SRS_ResourceSet_t*) srs_resource_set,
|
||||
(NR_SRS_Resource_t*) srs_resource,
|
||||
index);
|
||||
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
@@ -540,7 +626,6 @@ void nr_schedule_srs(int module_id, frame_t frame, int slot)
|
||||
NR_SRS_Config_t *srs_config = current_BWP->srs_Config;
|
||||
if (!srs_config)
|
||||
continue;
|
||||
|
||||
for(int rs = 0; rs < srs_config->srs_ResourceSetToAddModList->list.count; rs++) {
|
||||
|
||||
// Find periodic resource set
|
||||
@@ -589,8 +674,8 @@ void nr_schedule_srs(int module_id, frame_t frame, int slot)
|
||||
|
||||
// Check if UE will transmit the SRS in this frame
|
||||
if ((sched_frame * n_slots_frame + sched_slot - offset) % period == 0) {
|
||||
LOG_D(NR_MAC," %d.%d Scheduling SRS reception for %d.%d\n", frame, slot, sched_frame, sched_slot);
|
||||
nr_fill_nfapi_srs(module_id, CC_id, UE, sched_frame, sched_slot, srs_resource_set, srs_resource);
|
||||
//LOG_I(NR_MAC," %d.%d Scheduling SRS reception for %d.%d\n", frame, slot, sched_frame, sched_slot);
|
||||
nr_fill_nfapi_srs(module_id, CC_id, UE, sched_frame, sched_slot, srs_resource_set, srs_resource, 0);
|
||||
sched_ctrl->sched_srs.frame = sched_frame;
|
||||
sched_ctrl->sched_srs.slot = sched_slot;
|
||||
sched_ctrl->sched_srs.srs_scheduled = true;
|
||||
@@ -598,3 +683,60 @@ void nr_schedule_srs(int module_id, frame_t frame, int slot)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
*
|
||||
* NAME : nr_schedule_srs_secondary
|
||||
*
|
||||
* PARAMETERS : module id
|
||||
* frame number for possible SRS reception
|
||||
*
|
||||
* DESCRIPTION : It informs the PHY layer that has an SRS to receive.
|
||||
* To be used at secondary gNB (where UE is not connected).
|
||||
* Only for periodic scheduling yet.
|
||||
*
|
||||
*********************************************************************/
|
||||
void nr_schedule_srs_secondary(int module_id, frame_t frame, int slot) {
|
||||
|
||||
if (RC.nrmac[module_id]->secondary_srs_configured==0)
|
||||
return;
|
||||
|
||||
const int CC_id = 0;
|
||||
// lets configure SRS on the initial BWP. This will only work for cell sizes of 60MHz or lower.
|
||||
// for anything else this needs to be adapted to use the dedicated BWP.
|
||||
|
||||
NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[CC_id].ServingCellConfigCommon;
|
||||
//NR_SRS_Config_t *srs_config = RC.nrmac[module_id]->setup_srs_config[0]->choice.setup;
|
||||
|
||||
if(!scc) {
|
||||
LOG_W(MAC,"no scc, returning\n");
|
||||
return;
|
||||
}
|
||||
|
||||
f1ap_srs_resource_t *srs_resource = &RC.nrmac[module_id]->srs_resource;
|
||||
f1ap_srs_resource_set_t *srs_resource_set = &RC.nrmac[module_id]->srs_resource_set;
|
||||
|
||||
NR_BWP_t ubwp = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
|
||||
|
||||
//we have to add 1 here since the first entry of the field srs_period corresponds to the RRC enmum NR_SRS_PeriodicityAndOffset_PR_NOTHING which does not exist in the NRPPA or F1AP structure.
|
||||
uint16_t period = srs_period[srs_resource->resourceType.choice.periodic.periodicity+1];
|
||||
uint16_t offset = srs_resource->resourceType.choice.periodic.offset;
|
||||
|
||||
LOG_D(MAC, "nr_schedule_srs_secondary: period %d, offset %d\n",period,offset);
|
||||
|
||||
int n_slots_frame = nr_slots_per_frame[ubwp.subcarrierSpacing];
|
||||
|
||||
NR_UE_info_t dummy_ue_info;
|
||||
dummy_ue_info.current_UL_BWP.BWPSize = NRRIV2BW(ubwp.locationAndBandwidth,MAX_BWP_SIZE);
|
||||
dummy_ue_info.current_UL_BWP.BWPStart = NRRIV2PRBOFFSET(ubwp.locationAndBandwidth,MAX_BWP_SIZE);
|
||||
dummy_ue_info.current_UL_BWP.scs = ubwp.subcarrierSpacing;
|
||||
dummy_ue_info.rnti = NON_UE_ASSOCIATED_SRS_DUMMY_RNTI;
|
||||
|
||||
// Check if UE will transmit the SRS in this frame
|
||||
//if ( ((frame - offset/n_slots_frame)*n_slots_frame)%period == 0) {
|
||||
if ( (frame*n_slots_frame + slot)%period == offset) {
|
||||
LOG_D(NR_MAC,"Scheduling non-ue associated SRS measurement for %d.%d\n", frame, offset%n_slots_frame);
|
||||
nr_fill_nfapi_srs(module_id, CC_id, &dummy_ue_info, frame, offset%n_slots_frame, srs_resource_set, srs_resource, 1);
|
||||
//RC.nrmac[module_id]->do_srs_meas = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
|
||||
#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
|
||||
#include "LAYER2/RLC/rlc.h"
|
||||
#include "nfapi.h"
|
||||
|
||||
//#define SRS_IND_DEBUG
|
||||
|
||||
@@ -1337,6 +1338,59 @@ void handle_nr_srs_measurements(const module_id_t module_id,
|
||||
LOG_I(NR_MAC, "srs_ind->report_type = %i\n", srs_ind->report_type);
|
||||
#endif
|
||||
|
||||
if (srs_ind->rnti == NON_UE_ASSOCIATED_SRS_DUMMY_RNTI) {
|
||||
LOG_I(NR_MAC, "Received Non-UE associated SRS with ToA %d (ns)\n",srs_ind->timing_advance_offset_nsec);
|
||||
nrmac->meas_pos_info.toa_ns[0] = srs_ind->timing_advance_offset_nsec;
|
||||
nrmac->meas_pos_info.frame= frame;
|
||||
nrmac->meas_pos_info.slot= slot;
|
||||
|
||||
|
||||
if (srs_ind->srs_usage != NFAPI_NR_SRS_LOCALIZATION) {
|
||||
LOG_W(NR_MAC,"received SRS indication with NON_UE_ASSOCIATED but SRS usage not for localization");
|
||||
} else {
|
||||
|
||||
uint32_t *pReadPackedMessage = srs_ind->report_tlv.value;
|
||||
uint32_t *endReadPackedMessage = srs_ind->report_tlv.value+srs_ind->report_tlv.length;
|
||||
uint16_t bytesRead = 0;
|
||||
|
||||
memset(nrmac->meas_pos_info.toa_ns, 0, sizeof(nrmac->meas_pos_info.toa_ns));
|
||||
nrmac->meas_pos_info.NumberofTRPs= srs_ind->report_tlv.length/2;
|
||||
LOG_I(NR_MAC, "Number of TRPs for ToA %d \n",nrmac->meas_pos_info.NumberofTRPs);
|
||||
|
||||
for (int p_index = 0; p_index < srs_ind->report_tlv.length/2; p_index++) {
|
||||
bytesRead += pulls16(&pReadPackedMessage, &nrmac->meas_pos_info.toa_ns[p_index], endReadPackedMessage);
|
||||
LOG_I(NR_MAC, "TRP %d: ToA: %d\n", p_index, nrmac->meas_pos_info.toa_ns[p_index]);
|
||||
}
|
||||
}
|
||||
|
||||
if (RC.nrmac[module_id]->do_srs_meas==1) {
|
||||
LOG_I(NR_MAC, "Preparing NRPPa measurement response\n");
|
||||
|
||||
/* response has same type as request... */
|
||||
f1ap_measurement_resp_t resp = {
|
||||
.transaction_id = nrmac->f1ap_meas_resp_header.transaction_id,
|
||||
.lmf_measurement_id = nrmac->f1ap_meas_resp_header.lmf_measurement_id,
|
||||
.ran_measurement_id = nrmac->f1ap_meas_resp_header.ran_measurement_id,
|
||||
.nrppa_msg_info.nrppa_transaction_id = nrmac->nrppa_msg_info.nrppa_transaction_id,
|
||||
.nrppa_msg_info.instance = nrmac->nrppa_msg_info.instance,
|
||||
.nrppa_msg_info.gNB_ue_ngap_id = nrmac->nrppa_msg_info.gNB_ue_ngap_id,
|
||||
.nrppa_msg_info.amf_ue_ngap_id = nrmac->nrppa_msg_info.amf_ue_ngap_id,
|
||||
.nrppa_msg_info.ue_rnti = nrmac->nrppa_msg_info.ue_rnti,
|
||||
.nrppa_msg_info.routing_id_buffer = nrmac->nrppa_msg_info.routing_id_buffer,
|
||||
.nrppa_msg_info.routing_id_length = nrmac->nrppa_msg_info.routing_id_length,
|
||||
};
|
||||
|
||||
|
||||
//call the response handler
|
||||
nrmac->mac_rrc.positioning_measurement_response(&resp);
|
||||
RC.nrmac[module_id]->do_srs_meas=0;
|
||||
|
||||
}
|
||||
//for the moment this is all we need so return
|
||||
NR_SCHED_UNLOCK(&nrmac->sched_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
NR_UE_info_t *UE = find_nr_UE(&RC.nrmac[module_id]->UE_info, srs_ind->rnti);
|
||||
if (!UE) {
|
||||
LOG_W(NR_MAC, "Could not find UE for RNTI %04x\n", srs_ind->rnti);
|
||||
@@ -1355,7 +1409,7 @@ void handle_nr_srs_measurements(const module_id_t module_id,
|
||||
nfapi_srs_report_tlv_t *report_tlv = &srs_ind->report_tlv;
|
||||
|
||||
switch (srs_ind->srs_usage) {
|
||||
case NR_SRS_ResourceSet__usage_beamManagement: {
|
||||
case NFAPI_NR_SRS_BEAMMANAGEMENT: {
|
||||
nfapi_nr_srs_beamforming_report_t nr_srs_bf_report;
|
||||
unpack_nr_srs_beamforming_report(report_tlv->value,
|
||||
report_tlv->length,
|
||||
@@ -1403,7 +1457,7 @@ void handle_nr_srs_measurements(const module_id_t module_id,
|
||||
break;
|
||||
}
|
||||
|
||||
case NR_SRS_ResourceSet__usage_codebook: {
|
||||
case NFAPI_NR_SRS_CODEBOOK: {
|
||||
nfapi_nr_srs_normalized_channel_iq_matrix_t nr_srs_channel_iq_matrix;
|
||||
unpack_nr_srs_normalized_channel_iq_matrix(report_tlv->value,
|
||||
report_tlv->length,
|
||||
@@ -1459,8 +1513,8 @@ void handle_nr_srs_measurements(const module_id_t module_id,
|
||||
break;
|
||||
}
|
||||
|
||||
case NR_SRS_ResourceSet__usage_nonCodebook:
|
||||
case NR_SRS_ResourceSet__usage_antennaSwitching:
|
||||
case NFAPI_NR_SRS_NONCODEBOOK:
|
||||
case NFAPI_NR_SRS_ANTENNASWITCH:
|
||||
LOG_W(NR_MAC, "MAC procedures for this SRS usage are not implemented yet!\n");
|
||||
break;
|
||||
|
||||
|
||||
@@ -165,6 +165,8 @@ int get_pucch_resourceid(NR_PUCCH_Config_t *pucch_Config, int O_uci, int pucch_r
|
||||
|
||||
void nr_schedule_srs(int module_id, frame_t frame, int slot);
|
||||
|
||||
void nr_schedule_srs_secondary(int module_id, frame_t frame, int UE_id);
|
||||
|
||||
void nr_csirs_scheduling(int Mod_idP, frame_t frame, sub_frame_t slot, int n_slots_frame, nfapi_nr_dl_tti_request_t *DL_req);
|
||||
|
||||
void nr_csi_meas_reporting(int Mod_idP,
|
||||
|
||||
@@ -779,3 +779,161 @@ void dl_rrc_message_transfer(const f1ap_dl_rrc_message_t *dl_rrc)
|
||||
/* the DU ue id is the RNTI */
|
||||
nr_rlc_srb_recv_sdu(dl_rrc->gNB_DU_ue_id, dl_rrc->srb_id, dl_rrc->rrc_container, dl_rrc->rrc_container_length);
|
||||
}
|
||||
|
||||
/* handlers of Position Information Transfer related NRPPA DL messages */
|
||||
void positioning_information_request(const f1ap_positioning_information_req_t *req)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"DL Processing Received PositioningInformationRequest gNB_CU_ue_id=%d, gNB_DU_ue_id=%d \n",
|
||||
req->gNB_CU_ue_id,
|
||||
req->gNB_DU_ue_id);
|
||||
|
||||
/*f1ap_positioning_information_resp_t resp;
|
||||
resp.gNB_CU_ue_id = req->gNB_CU_ue_id;
|
||||
resp.gNB_DU_ue_id = req->gNB_DU_ue_id;
|
||||
resp.nrppa_msg_info.nrppa_transaction_id = req->nrppa_msg_info.nrppa_transaction_id;
|
||||
resp.nrppa_msg_info.instance = req->nrppa_msg_info.instance;
|
||||
resp.nrppa_msg_info.gNB_ue_ngap_id = req->nrppa_msg_info.gNB_ue_ngap_id;
|
||||
resp.nrppa_msg_info.amf_ue_ngap_id = req->nrppa_msg_info.amf_ue_ngap_id;
|
||||
resp.nrppa_msg_info.ue_rnti = req->nrppa_msg_info.ue_rnti;
|
||||
resp.nrppa_msg_info.routing_id_buffer = req->nrppa_msg_info.routing_id_buffer;
|
||||
resp.nrppa_msg_info.routing_id_length = req->nrppa_msg_info.routing_id_length;*/
|
||||
|
||||
f1ap_positioning_information_resp_t resp= {
|
||||
.gNB_CU_ue_id = req->gNB_CU_ue_id,
|
||||
.gNB_DU_ue_id = req->gNB_DU_ue_id,
|
||||
.nrppa_msg_info.nrppa_transaction_id = req->nrppa_msg_info.nrppa_transaction_id,
|
||||
.nrppa_msg_info.instance = req->nrppa_msg_info.instance,
|
||||
.nrppa_msg_info.gNB_ue_ngap_id = req->nrppa_msg_info.gNB_ue_ngap_id,
|
||||
.nrppa_msg_info.amf_ue_ngap_id = req->nrppa_msg_info.amf_ue_ngap_id,
|
||||
.nrppa_msg_info.ue_rnti = req->nrppa_msg_info.ue_rnti,
|
||||
.nrppa_msg_info.routing_id_buffer = req->nrppa_msg_info.routing_id_buffer,
|
||||
.nrppa_msg_info.routing_id_length = req->nrppa_msg_info.routing_id_length,
|
||||
};
|
||||
|
||||
gNB_MAC_INST *mac = RC.nrmac[req->nrppa_msg_info.instance];
|
||||
mac->mac_rrc.positioning_information_response(&resp);
|
||||
}
|
||||
|
||||
void positioning_activation_request(const f1ap_positioning_activation_req_t *req)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"DL Processing Received PositioningactivationRequest gNB_CU_ue_id=%d, gNB_DU_ue_id=%d \n",
|
||||
req->gNB_CU_ue_id,
|
||||
req->gNB_DU_ue_id);
|
||||
// AssertFatal(false, " Not Implemented \n");
|
||||
f1ap_positioning_activation_resp_t resp= {
|
||||
.gNB_CU_ue_id = req->gNB_CU_ue_id,
|
||||
.gNB_DU_ue_id = req->gNB_DU_ue_id,
|
||||
.nrppa_msg_info.nrppa_transaction_id = req->nrppa_msg_info.nrppa_transaction_id,
|
||||
.nrppa_msg_info.instance = req->nrppa_msg_info.instance,
|
||||
.nrppa_msg_info.gNB_ue_ngap_id = req->nrppa_msg_info.gNB_ue_ngap_id,
|
||||
.nrppa_msg_info.amf_ue_ngap_id = req->nrppa_msg_info.amf_ue_ngap_id,
|
||||
.nrppa_msg_info.ue_rnti = req->nrppa_msg_info.ue_rnti,
|
||||
.nrppa_msg_info.routing_id_buffer = req->nrppa_msg_info.routing_id_buffer,
|
||||
.nrppa_msg_info.routing_id_length = req->nrppa_msg_info.routing_id_length,
|
||||
};
|
||||
|
||||
gNB_MAC_INST *mac = RC.nrmac[req->nrppa_msg_info.instance];
|
||||
mac->mac_rrc.positioning_activation_response(&resp);
|
||||
}
|
||||
|
||||
void positioning_deactivation(const f1ap_positioning_deactivation_t *req)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"DL Processing Received PositioningDeactivation gNB_CU_ue_id=%d, gNB_DU_ue_id=%d \n",
|
||||
req->gNB_CU_ue_id,
|
||||
req->gNB_DU_ue_id);
|
||||
AssertFatal(false, " Not Implemented \n");
|
||||
}
|
||||
|
||||
/* handlers of TRP Information Transfer related NRPPA DL messages */
|
||||
void trp_information_request(const f1ap_trp_information_req_t *req)
|
||||
{
|
||||
LOG_I(MAC, "DL Processing Received TRPInformationRequest transaction_id=%d \n", req->transaction_id);
|
||||
//AssertFatal(false, " Not Implemented \n");
|
||||
f1ap_trp_information_resp_t resp= {
|
||||
.transaction_id=req->transaction_id,
|
||||
.nrppa_msg_info.nrppa_transaction_id = req->nrppa_msg_info.nrppa_transaction_id,
|
||||
.nrppa_msg_info.instance = req->nrppa_msg_info.instance,
|
||||
.nrppa_msg_info.gNB_ue_ngap_id = req->nrppa_msg_info.gNB_ue_ngap_id,
|
||||
.nrppa_msg_info.amf_ue_ngap_id = req->nrppa_msg_info.amf_ue_ngap_id,
|
||||
.nrppa_msg_info.ue_rnti = req->nrppa_msg_info.ue_rnti,
|
||||
.nrppa_msg_info.routing_id_buffer = req->nrppa_msg_info.routing_id_buffer,
|
||||
.nrppa_msg_info.routing_id_length = req->nrppa_msg_info.routing_id_length,
|
||||
};
|
||||
|
||||
gNB_MAC_INST *mac = RC.nrmac[req->nrppa_msg_info.instance];
|
||||
mac->mac_rrc.trp_information_response(&resp);
|
||||
}
|
||||
|
||||
/* handlers of Measurement Information Transfer related NRPPA DL messages */
|
||||
void positioning_measurement_request(const f1ap_measurement_req_t *req)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"DL Processing Received measurement_Request transaction_id=%d, lmf_measurement_id=%d, ran_measurement_id=%d \n",
|
||||
req->transaction_id,
|
||||
req->lmf_measurement_id,
|
||||
req->ran_measurement_id);
|
||||
|
||||
if (req->pos_report_characteristics != 0) {
|
||||
LOG_W(MAC, "periodic positioning measurements not yet supported\n");
|
||||
AssertFatal(false, "Not implemented\n");
|
||||
}
|
||||
|
||||
//store SRS config from measurement in MAC
|
||||
|
||||
f1ap_srs_configuration_t *srs_configuration = &req->srs_configuration;
|
||||
if (!srs_configuration) {
|
||||
LOG_I(MAC, "no srs configuration in F1AP measurement reuqest, skipping\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (srs_configuration->srs_carrier_list.srs_carrier_list_length !=1) {
|
||||
LOG_I(MAC, "expecting exactly 1 item in srs carrier list, skipping\n");
|
||||
}
|
||||
|
||||
f1ap_srs_config_t *sRSConfig = &srs_configuration->srs_carrier_list.srs_carrier_list_item[0].active_ul_bwp.sRSConfig;
|
||||
if (sRSConfig->sRSResource_List.srs_resource_list_length != 1 ||
|
||||
sRSConfig->sRSResourceSet_List.srs_resource_set_list_length != 1) {
|
||||
LOG_I(MAC, "Need exactly 1 SRS Resoure and 1 SRS Resource set in F1AP measurment request\n");
|
||||
return;
|
||||
}
|
||||
|
||||
gNB_MAC_INST *mac = RC.nrmac[req->nrppa_msg_info.instance];
|
||||
mac->srs_resource = *sRSConfig->sRSResource_List.srs_resource;
|
||||
mac->srs_resource_set = *sRSConfig->sRSResourceSet_List.srs_resource_set;
|
||||
|
||||
mac->f1ap_meas_resp_header.transaction_id = req->transaction_id;
|
||||
mac->f1ap_meas_resp_header.lmf_measurement_id = req->lmf_measurement_id;
|
||||
mac->f1ap_meas_resp_header.ran_measurement_id = req->ran_measurement_id;
|
||||
//mac->nrppa_msg_info = req->nrppa_msg_info;
|
||||
mac->nrppa_msg_info.nrppa_transaction_id = req->nrppa_msg_info.nrppa_transaction_id;
|
||||
mac->nrppa_msg_info.instance = req->nrppa_msg_info.instance;
|
||||
mac->nrppa_msg_info.gNB_ue_ngap_id = req->nrppa_msg_info.gNB_ue_ngap_id;
|
||||
mac->nrppa_msg_info.amf_ue_ngap_id = req->nrppa_msg_info.amf_ue_ngap_id;
|
||||
mac->nrppa_msg_info.ue_rnti = req->nrppa_msg_info.ue_rnti;
|
||||
mac->nrppa_msg_info.routing_id_buffer = req->nrppa_msg_info.routing_id_buffer;
|
||||
mac->nrppa_msg_info.routing_id_length = req->nrppa_msg_info.routing_id_length;
|
||||
|
||||
mac->secondary_srs_configured = 1; //this is never reset
|
||||
mac->do_srs_meas = 1; //this is reset once the NRPPA measurement response is set
|
||||
}
|
||||
|
||||
void positioning_measurement_update(const f1ap_measurement_update_t *update)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"DL Processing Received measurement_Update transaction_id=%d, lmf_measurement_id=%d \n",
|
||||
update->transaction_id,
|
||||
update->lmf_measurement_id);
|
||||
AssertFatal(false, " Not Implemented \n");
|
||||
}
|
||||
|
||||
void positioning_measurement_abort(const f1ap_measurement_abort_t *meas_abort)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"DL Processing Received measurement_Abort transaction_id=%d, lmf_measurement_id=%d \n",
|
||||
meas_abort->transaction_id,
|
||||
meas_abort->lmf_measurement_id);
|
||||
AssertFatal(false, " Not Implemented \n");
|
||||
}
|
||||
|
||||
@@ -40,4 +40,17 @@ void ue_context_release_command(const f1ap_ue_context_release_cmd_t *cmd);
|
||||
|
||||
void dl_rrc_message_transfer(const f1ap_dl_rrc_message_t *dl_rrc);
|
||||
|
||||
/* handlers of Position Information Transfer related NRPPA DL messages */
|
||||
void positioning_information_request(const f1ap_positioning_information_req_t *req);
|
||||
void positioning_activation_request(const f1ap_positioning_activation_req_t *req);
|
||||
void positioning_deactivation(const f1ap_positioning_deactivation_t *req);
|
||||
|
||||
/* handlers of TRP Information Transfer related NRPPA DL messages */
|
||||
void trp_information_request(const f1ap_trp_information_req_t *req);
|
||||
|
||||
/* handlers of Measurement Information Transfer related NRPPA DL messages */
|
||||
void positioning_measurement_request(const f1ap_measurement_req_t *req);
|
||||
void positioning_measurement_update(const f1ap_measurement_update_t *update);
|
||||
void positioning_measurement_abort(const f1ap_measurement_abort_t *abort);
|
||||
|
||||
#endif /* MAC_RRC_DL_HANDLER_H */
|
||||
|
||||
@@ -31,15 +31,32 @@ typedef void (*f1_reset_acknowledge_cu_initiated_func_t)(const f1ap_reset_ack_t
|
||||
typedef void (*f1_setup_request_func_t)(const f1ap_setup_req_t* req);
|
||||
typedef void (*gnb_du_configuration_update_t)(const f1ap_gnb_du_configuration_update_t *upd);
|
||||
|
||||
typedef void (*ue_context_setup_response_func_t)(const f1ap_ue_context_setup_t* req, const f1ap_ue_context_setup_t *resp);
|
||||
typedef void (*ue_context_setup_response_func_t)(const f1ap_ue_context_setup_t *req, const f1ap_ue_context_setup_t *resp);
|
||||
typedef void (*ue_context_modification_response_func_t)(const f1ap_ue_context_modif_req_t *req,
|
||||
const f1ap_ue_context_modif_resp_t *resp);
|
||||
typedef void (*ue_context_modification_required_func_t)(const f1ap_ue_context_modif_required_t *t);
|
||||
typedef void (*ue_context_release_request_func_t)(const f1ap_ue_context_release_req_t* req);
|
||||
typedef void (*ue_context_release_request_func_t)(const f1ap_ue_context_release_req_t *req);
|
||||
typedef void (*ue_context_release_complete_func_t)(const f1ap_ue_context_release_complete_t *complete);
|
||||
|
||||
typedef void (*initial_ul_rrc_message_transfer_func_t)(module_id_t module_id, const f1ap_initial_ul_rrc_message_t *ul_rrc);
|
||||
|
||||
/* handlers of Position Information Transfer related NRPPA UL messages */
|
||||
typedef void (*positioning_information_response_func_t)(const f1ap_positioning_information_resp_t *pos_resp); // nrppa adeel
|
||||
typedef void (*positioning_information_failure_func_t)(const f1ap_positioning_information_failure_t *pos_failure);
|
||||
typedef void (*positioning_information_update_func_t)(const f1ap_positioning_information_update_t *pos_update);
|
||||
typedef void (*positioning_activation_response_func_t)(const f1ap_positioning_activation_resp_t *act_resp);
|
||||
typedef void (*positioning_activation_failure_func_t)(const f1ap_positioning_activation_failure_t *act_failure);
|
||||
|
||||
/* handlers of TRP Information Transfer related NRPPA UL messages */
|
||||
typedef void (*trp_information_response_func_t)(const f1ap_trp_information_resp_t *resp);
|
||||
typedef void (*trp_information_failure_func_t)(const f1ap_trp_information_failure_t *failure);
|
||||
|
||||
/* handlers of Measurement Information Transfer related NRPPA UL messages */
|
||||
typedef void (*positioning_measurement_response_func_t)(const f1ap_measurement_resp_t *resp);
|
||||
typedef void (*positioning_measurement_failure_func_t)(const f1ap_measurement_failure_t *failure);
|
||||
typedef void (*positioning_measurement_report_func_t)(const f1ap_measurement_report_t *report);
|
||||
typedef void (*positioning_measurement_failure_indication_func_t)(const f1ap_measurement_failure_ind_t *failure_ind);
|
||||
|
||||
struct nr_mac_rrc_ul_if_s;
|
||||
void mac_rrc_ul_direct_init(struct nr_mac_rrc_ul_if_s *mac_rrc);
|
||||
void mac_rrc_ul_f1ap_init(struct nr_mac_rrc_ul_if_s *mac_rrc);
|
||||
|
||||
@@ -294,6 +294,716 @@ static void initial_ul_rrc_message_transfer_direct(module_id_t module_id, const
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, module_id, msg);
|
||||
}
|
||||
|
||||
/* handlers of Position Information Transfer related NRPPA UL messages */
|
||||
static void positioning_information_response(const f1ap_positioning_information_resp_t *resp)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"Prepring PositioningInformationResponse gNB_CU_ue_id=%d, gNB_DU_ue_id=%d, ue_rnti= %04x\n",
|
||||
resp->gNB_CU_ue_id,
|
||||
resp->gNB_DU_ue_id,
|
||||
resp->nrppa_msg_info.ue_rnti);
|
||||
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_POSITIONING_INFORMATION_RESP);
|
||||
f1ap_positioning_information_resp_t *f1ap_msg = &F1AP_POSITIONING_INFORMATION_RESP(msg);
|
||||
|
||||
/* TODO copy all fields, but reallocate memory buffers! */
|
||||
*f1ap_msg = *resp;
|
||||
f1ap_msg->gNB_CU_ue_id = resp->gNB_CU_ue_id;
|
||||
f1ap_msg->gNB_DU_ue_id = resp->gNB_DU_ue_id;
|
||||
f1ap_msg->nrppa_msg_info.nrppa_transaction_id = resp->nrppa_msg_info.nrppa_transaction_id;
|
||||
f1ap_msg->nrppa_msg_info.instance = resp->nrppa_msg_info.instance;
|
||||
f1ap_msg->nrppa_msg_info.gNB_ue_ngap_id = resp->nrppa_msg_info.gNB_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.amf_ue_ngap_id = resp->nrppa_msg_info.amf_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.ue_rnti = resp->nrppa_msg_info.ue_rnti;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_buffer = resp->nrppa_msg_info.routing_id_buffer;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_length = resp->nrppa_msg_info.routing_id_length;
|
||||
|
||||
gNB_MAC_INST *mac = RC.nrmac[resp->nrppa_msg_info.instance];
|
||||
NR_UEs_t *UE_info = &mac->UE_info;
|
||||
UE_iterator (UE_info->list, UE) {
|
||||
if (UE->rnti == resp->nrppa_msg_info.ue_rnti) { // configuration details of specific UE // TODO manage non UE associated
|
||||
LOG_I(MAC,
|
||||
"Extracting SRS Configuration for Positioning_information_response for ue rnti= %04x \n",
|
||||
resp->nrppa_msg_info.ue_rnti); ////uid_t uid = &UE->uid;
|
||||
NR_UE_UL_BWP_t *current_BWP = &UE->current_UL_BWP;
|
||||
NR_SRS_Config_t *srs_config = current_BWP->srs_Config;
|
||||
//printf("adeel TEST mac_rrc_ul_direct \n \n SRS configuration as per MAC \n");
|
||||
//xer_fprint(stdout, &asn_DEF_NR_SRS_Config, srs_config);
|
||||
|
||||
// IE 9.2.28 SRS Configuration Preparing SRS Configuration IE of PositioningInformationResponse
|
||||
int maxnoSRScarrier = 1; // gNB->max_nb_srs max value is 32; // TODO find the acutal number for carrier and add here
|
||||
f1ap_msg->srs_configuration.srs_carrier_list.srs_carrier_list_length = maxnoSRScarrier;
|
||||
f1ap_msg->srs_configuration.srs_carrier_list.srs_carrier_list_item =
|
||||
malloc(maxnoSRScarrier * sizeof(f1ap_srs_carrier_list_item_t));
|
||||
DevAssert(f1ap_msg->srs_configuration.srs_carrier_list.srs_carrier_list_item);
|
||||
f1ap_srs_carrier_list_item_t *srs_carrier_list_item = f1ap_msg->srs_configuration.srs_carrier_list.srs_carrier_list_item;
|
||||
LOG_D(MAC,
|
||||
"Preparing srs_carrier_list for NRPPA maxnoSRScarrier= %d",
|
||||
f1ap_msg->srs_configuration.srs_carrier_list.srs_carrier_list_length);
|
||||
for (int i = 0; i < maxnoSRScarrier; i++) {
|
||||
srs_carrier_list_item->pointA = 1; // (M)
|
||||
srs_carrier_list_item->pci = 1; // Optional Physical cell ID of the cell that contians the SRS carrier
|
||||
|
||||
// Preparing Active UL BWP information IE of SRSCarrier_List f1ap_active_ul_bwp_ active_ul_bwp; //(M)
|
||||
srs_carrier_list_item->active_ul_bwp.locationAndBandwidth = 0; // long
|
||||
srs_carrier_list_item->active_ul_bwp.subcarrierSpacing = current_BWP->scs; // long
|
||||
srs_carrier_list_item->active_ul_bwp.cyclicPrefix = 0; //*(current_BWP->cyclicprefix);// long
|
||||
srs_carrier_list_item->active_ul_bwp.txDirectCurrentLocation = 0; // long //TODO
|
||||
srs_carrier_list_item->active_ul_bwp.shift7dot5kHz = 0; // long Optional //TODO
|
||||
|
||||
// Preparing sRSResource_List IE of SRSConfig (IE of activeULBWP)
|
||||
int maxnoSRSResources = srs_config->srs_ResourceToAddModList->list.count;
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.sRSResource_List.srs_resource_list_length = maxnoSRSResources;
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.sRSResource_List.srs_resource =
|
||||
malloc(maxnoSRSResources * sizeof(f1ap_srs_resource_t)); // TODO check null condition
|
||||
DevAssert(srs_carrier_list_item->active_ul_bwp.sRSConfig.sRSResource_List.srs_resource);
|
||||
f1ap_srs_resource_t *resource_item = srs_carrier_list_item->active_ul_bwp.sRSConfig.sRSResource_List.srs_resource;
|
||||
LOG_D(MAC,
|
||||
"Preparing sRSResource_List for NRPPA maxnoSRSResources=%d \n",
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.sRSResource_List.srs_resource_list_length);
|
||||
for (int k = 0; k < maxnoSRSResources; k++) { // Preparing SRS Resource List
|
||||
NR_SRS_Resource_t *srs_resource = srs_config->srs_ResourceToAddModList->list.array[k];
|
||||
|
||||
resource_item->sRSResourceID = srs_resource->srs_ResourceId; //(M)
|
||||
resource_item->nrofSRS_Ports = srs_resource->nrofSRS_Ports; //(M) port1 = 0, ports2 = 1, ports4 = 2
|
||||
resource_item->startPosition = srs_resource->resourceMapping.startPosition; //(M)
|
||||
resource_item->nrofSymbols = srs_resource->resourceMapping.nrofSymbols; //(M) n1 = 0, n2 = 1, n4 = 2
|
||||
resource_item->repetitionFactor = srs_resource->resourceMapping.repetitionFactor; //(M) n1 = 0, n2 = 1, n4 = 2
|
||||
resource_item->freqDomainPosition = srs_resource->freqDomainPosition; //(M)
|
||||
resource_item->freqDomainShift = srs_resource->freqDomainShift; //(M)
|
||||
resource_item->c_SRS = srs_resource->freqHopping.c_SRS; //(M)
|
||||
resource_item->b_SRS = srs_resource->freqHopping.b_SRS; //(M)
|
||||
resource_item->b_hop = srs_resource->freqHopping.b_hop; //(M)
|
||||
resource_item->groupOrSequenceHopping = srs_resource->groupOrSequenceHopping; //(M) neither = 0, groupHopping = 1, sequenceHopping = 2
|
||||
resource_item->slotOffset = 0; // TODO not found (M)
|
||||
resource_item->sequenceId = srs_resource->sequenceId; //(M)
|
||||
|
||||
// IE transmissionComb
|
||||
switch (srs_resource->transmissionComb.present) {
|
||||
case NR_SRS_Resource__transmissionComb_PR_n2:
|
||||
resource_item->transmissionComb.present = f1ap_transmission_comb_pr_n2;
|
||||
resource_item->transmissionComb.choice.n2.combOffset_n2 = srs_resource->transmissionComb.choice.n2->combOffset_n2;
|
||||
resource_item->transmissionComb.choice.n2.cyclicShift_n2 = srs_resource->transmissionComb.choice.n2->cyclicShift_n2;
|
||||
break;
|
||||
case NR_SRS_Resource__transmissionComb_PR_n4:
|
||||
resource_item->transmissionComb.present = f1ap_transmission_comb_pr_n4;
|
||||
resource_item->transmissionComb.choice.n4.combOffset_n4 = srs_resource->transmissionComb.choice.n4->combOffset_n4;
|
||||
resource_item->transmissionComb.choice.n4.cyclicShift_n4 = srs_resource->transmissionComb.choice.n4->cyclicShift_n4;
|
||||
break;
|
||||
case NR_SRS_Resource__transmissionComb_PR_NOTHING:
|
||||
resource_item->transmissionComb.present = f1ap_transmission_comb_pr_nothing;
|
||||
break;
|
||||
default:
|
||||
LOG_E(MAC, "Unknown Resource Item TransmissionComb\n");
|
||||
break;
|
||||
}
|
||||
|
||||
// IE resourceType
|
||||
switch (srs_resource->resourceType.present) {
|
||||
case NR_SRS_Resource__resourceType_PR_periodic:
|
||||
resource_item->resourceType.present = f1ap_resource_type_pr_periodic;
|
||||
NR_SRS_PeriodicityAndOffset_t periodAndOff= srs_resource->resourceType.choice.periodic->periodicityAndOffset_p;
|
||||
f1ap_resource_type_periodic_t *periodic= &resource_item->resourceType.choice.periodic;
|
||||
switch (periodAndOff.present) {
|
||||
case NR_SRS_PeriodicityAndOffset_PR_NOTHING:
|
||||
periodic->periodicity =-1; //TODO choice not available in periodAndOff
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl1:
|
||||
periodic->periodicity =0;
|
||||
periodic->offset =periodAndOff.choice.sl1;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl2:
|
||||
periodic->periodicity =1;
|
||||
periodic->offset =periodAndOff.choice.sl2;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl4:
|
||||
periodic->periodicity =2;
|
||||
periodic->offset =periodAndOff.choice.sl4;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl5:
|
||||
periodic->periodicity =3;
|
||||
periodic->offset =periodAndOff.choice.sl5;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl8:
|
||||
periodic->periodicity =4;
|
||||
periodic->offset =periodAndOff.choice.sl8;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl10:
|
||||
periodic->periodicity =5 ;
|
||||
periodic->offset =periodAndOff.choice.sl10;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl16:
|
||||
periodic->periodicity =6;
|
||||
periodic->offset =periodAndOff.choice.sl16;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl20:
|
||||
periodic->periodicity =7;
|
||||
periodic->offset =periodAndOff.choice.sl20;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl32:
|
||||
periodic->periodicity =8;
|
||||
periodic->offset =periodAndOff.choice.sl32;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl40:
|
||||
periodic->periodicity =9;
|
||||
periodic->offset =periodAndOff.choice.sl40;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl64:
|
||||
periodic->periodicity =10;
|
||||
periodic->offset =periodAndOff.choice.sl64;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl80:
|
||||
periodic->periodicity =11;
|
||||
periodic->offset =periodAndOff.choice.sl80;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl160:
|
||||
periodic->periodicity =12;
|
||||
periodic->offset =periodAndOff.choice.sl160;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl320:
|
||||
periodic->periodicity =13;
|
||||
periodic->offset =periodAndOff.choice.sl320;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl640:
|
||||
periodic->periodicity =14 ;
|
||||
periodic->offset =periodAndOff.choice.sl640;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl1280:
|
||||
periodic->periodicity =15;
|
||||
periodic->offset =periodAndOff.choice.sl1280;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl2560:
|
||||
periodic->periodicity =16;
|
||||
periodic->offset =periodAndOff.choice.sl2560;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case NR_SRS_Resource__resourceType_PR_aperiodic:
|
||||
resource_item->resourceType.present = f1ap_resource_type_pr_aperiodic;
|
||||
//resource_item->resourceType.choice.aperiodic.aperiodicResourceType =0;
|
||||
// not done in srs impelmentation srs_resource->resourceType.choice.aperiodic->aperiodicResourceType; //(M)
|
||||
// aperiodic (uint8_t aperiodicResourceType;);
|
||||
break;
|
||||
case NR_SRS_Resource__resourceType_PR_semi_persistent:
|
||||
resource_item->resourceType.present = f1ap_resource_type_pr_semi_persistent;
|
||||
NR_SRS_PeriodicityAndOffset_t periodAndOff_sp= srs_resource->resourceType.choice.semi_persistent->periodicityAndOffset_sp;
|
||||
f1ap_resource_type_semi_persistent_t *semi_persistent= &resource_item->resourceType.choice.semi_persistent;
|
||||
switch (periodAndOff_sp.present) {
|
||||
case NR_SRS_PeriodicityAndOffset_PR_NOTHING:
|
||||
semi_persistent->periodicity =-1; //TODO choice not available in periodAndOff
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl1:
|
||||
semi_persistent->periodicity =0;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl1;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl2:
|
||||
semi_persistent->periodicity =1;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl2;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl4:
|
||||
semi_persistent->periodicity =2;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl4;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl5:
|
||||
semi_persistent->periodicity =3;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl5;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl8:
|
||||
semi_persistent->periodicity =4;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl8;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl10:
|
||||
semi_persistent->periodicity =5 ;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl10;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl16:
|
||||
semi_persistent->periodicity =6;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl16;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl20:
|
||||
semi_persistent->periodicity =7;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl20;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl32:
|
||||
semi_persistent->periodicity =8;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl32;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl40:
|
||||
semi_persistent->periodicity =9;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl40;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl64:
|
||||
semi_persistent->periodicity =10;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl64;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl80:
|
||||
semi_persistent->periodicity =11;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl80;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl160:
|
||||
semi_persistent->periodicity =12;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl160;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl320:
|
||||
semi_persistent->periodicity =13;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl320;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl640:
|
||||
semi_persistent->periodicity =14 ;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl640;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl1280:
|
||||
semi_persistent->periodicity =15;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl1280;
|
||||
break;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl2560:
|
||||
semi_persistent->periodicity =16;
|
||||
semi_persistent->offset =periodAndOff_sp.choice.sl2560;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case NR_SRS_Resource__resourceType_PR_NOTHING:
|
||||
resource_item->resourceType.present = f1ap_resource_type_pr_nothing;
|
||||
break;
|
||||
default:
|
||||
LOG_E(MAC, "Unknown Resource Item resourceType\n");
|
||||
break;
|
||||
}
|
||||
|
||||
if (k < maxnoSRSResources - 1) {
|
||||
resource_item++;
|
||||
}
|
||||
} // for(int k=0; k < nb_srsresource; k++)
|
||||
|
||||
// Preparing sRSResourceSet_List IE of SRSConfig (IE of activeULBWP)
|
||||
int maxnoSRSResourceSets = srs_config->srs_ResourceSetToAddModList->list.count;
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.sRSResourceSet_List.srs_resource_set_list_length = maxnoSRSResourceSets;
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.sRSResourceSet_List.srs_resource_set =
|
||||
malloc(maxnoSRSResourceSets * sizeof(f1ap_srs_resource_set_t));
|
||||
DevAssert(srs_carrier_list_item->active_ul_bwp.sRSConfig.sRSResourceSet_List.srs_resource_set);
|
||||
f1ap_srs_resource_set_t *resourceSet_item =
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.sRSResourceSet_List.srs_resource_set;
|
||||
LOG_D(MAC, "Preparing sRSResourceSet_List for NRPPA maxnoSRSResourceSets=%d \n", maxnoSRSResourceSets);
|
||||
for (int y = 0; y < maxnoSRSResourceSets; y++) { // Preparing SRS Resource Set List
|
||||
|
||||
NR_SRS_ResourceSet_t *srs_resourceset = srs_config->srs_ResourceSetToAddModList->list.array[y];
|
||||
|
||||
// IE sRSResourceSetID (M)
|
||||
resourceSet_item->sRSResourceSetID = srs_resourceset->srs_ResourceSetId;
|
||||
|
||||
// IE resourceSetType
|
||||
// TODO IE not found srs_resourceset->resourceType.choice.periodic->associatedCSI_RS;//(M) F1AP_ResourceSetType_t//
|
||||
// resourceSetType;
|
||||
switch (srs_resourceset->resourceType.present) {
|
||||
case NR_SRS_ResourceSet__resourceType_PR_periodic:
|
||||
resourceSet_item->resourceSetType.present = f1ap_resource_set_type_pr_periodic;
|
||||
resourceSet_item->resourceSetType.choice.periodic.periodicSet = 0; // TODO
|
||||
// Todo periodicSet not found in srs_resourceset->resourceType.choice.periodic
|
||||
break;
|
||||
case NR_SRS_ResourceSet__resourceType_PR_aperiodic:
|
||||
resourceSet_item->resourceSetType.present = f1ap_resource_set_type_pr_aperiodic;
|
||||
resourceSet_item->resourceSetType.choice.aperiodic.sRSResourceTrigger = srs_resourceset->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger;// 1; // range 1-3
|
||||
resourceSet_item->resourceSetType.choice.aperiodic.slotoffset = srs_resourceset->resourceType.choice.aperiodic->slotOffset[0]; //1; // range 1-32
|
||||
break;
|
||||
case NR_SRS_ResourceSet__resourceType_PR_semi_persistent:
|
||||
resourceSet_item->resourceSetType.present = f1ap_resource_set_type_pr_semi_persistent;
|
||||
resourceSet_item->resourceSetType.choice.semi_persistent.semi_persistentSet = 0; //TODO
|
||||
//TODO semi_persistentSet not found in srs_resourceset->resourceType.choice.semi_persistent
|
||||
break;
|
||||
case NR_SRS_ResourceSet__resourceType_PR_NOTHING:
|
||||
resourceSet_item->resourceSetType.present = f1ap_resource_set_type_pr_nothing;
|
||||
break;
|
||||
default:
|
||||
LOG_E(MAC, "Unknown NR_SRS_ResourceSet__resourceType \n");
|
||||
break;
|
||||
}
|
||||
|
||||
// IE sRSResourceID_List
|
||||
int maxnoSRSResourcePerSets = srs_resourceset->srs_ResourceIdList->list.count;// 1; // TODO retrieve and add
|
||||
resourceSet_item->sRSResourceID_List.srs_resource_id_list_length = maxnoSRSResourcePerSets;
|
||||
resourceSet_item->sRSResourceID_List.srs_resource_id = malloc(maxnoSRSResourcePerSets * sizeof(uint8_t));
|
||||
DevAssert(resourceSet_item->sRSResourceID_List.srs_resource_id);
|
||||
for (int z = 0; z < maxnoSRSResourcePerSets; z++) {
|
||||
resourceSet_item->sRSResourceID_List.srs_resource_id = srs_resourceset->srs_ResourceIdList->list.array[z];//0; // (M)F1AP_SRSResourceID_List_t sRSResourceID_List;
|
||||
}
|
||||
|
||||
if (y < maxnoSRSResourceSets - 1) {
|
||||
resourceSet_item++;
|
||||
}
|
||||
} // for(int y=0; y < maxnoSRSResourceSets; y++)
|
||||
|
||||
// Preparing posSRSResource_List IE of SRSConfig (IE of activeULBWP) TODO IE not found in OAI srs_config so filled zero
|
||||
// values
|
||||
int maxnoPosSRSResources = 1; // srs_config->possrs_ResourceToAddModList->list.count;
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.posSRSResource_List.pos_srs_resource_list_length = maxnoPosSRSResources;
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.posSRSResource_List.pos_srs_resource_item =
|
||||
malloc(maxnoPosSRSResources * sizeof(f1ap_pos_srs_resource_item_t));
|
||||
DevAssert(srs_carrier_list_item->active_ul_bwp.sRSConfig.posSRSResource_List.pos_srs_resource_item);
|
||||
f1ap_pos_srs_resource_item_t *pos_resource_item =
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.posSRSResource_List.pos_srs_resource_item;
|
||||
LOG_D(MAC,
|
||||
"Preparing posSRSResource_List IE for NRPPA maxnoPosSRSResources=%d \n",
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.posSRSResource_List.pos_srs_resource_list_length);
|
||||
for (int z = 0; z < maxnoPosSRSResources; z++) { // Preparing Pos SRS Resource List
|
||||
pos_resource_item->srs_PosResourceId = 0; // (M)
|
||||
pos_resource_item->startPosition = 0; // (M) range (0,1,...13)
|
||||
pos_resource_item->nrofSymbols = 0; // (M) n1 = 0, n2 = 1, n4 = 2, n8 = 3, n12 = 4
|
||||
pos_resource_item->freqDomainShift = 0; // (M)
|
||||
pos_resource_item->c_SRS = 0; // (M)
|
||||
pos_resource_item->groupOrSequenceHopping = 0; // (M) neither = 0, groupHopping = 1, sequenceHopping = 2
|
||||
pos_resource_item->sequenceId = 0; //(M)
|
||||
// pos_resource_item->spatialRelationPos; // OPTIONAL
|
||||
|
||||
pos_resource_item->transmissionCombPos.present = f1ap_transmission_comb_pos_pr_n2;
|
||||
pos_resource_item->transmissionCombPos.choice.n2.combOffset_n2 =
|
||||
0; // (M) f1ap_transmission_comb_pos_n2_t n2 (combOffset_n2,cyclicShift_n2) ; f1ap_transmission_comb_pos_n2_t n4;
|
||||
// f1ap_transmission_comb_pos_n8_t n8;
|
||||
pos_resource_item->transmissionCombPos.choice.n2.cyclicShift_n2 = 0;
|
||||
|
||||
pos_resource_item->resourceTypePos.present = f1ap_resource_type_pos_pr_periodic;
|
||||
pos_resource_item->resourceTypePos.choice.periodic.periodicity =
|
||||
0; // (M) f1ap_resource_type_periodic_pos_t periodic; f1ap_resource_type_semi_persistent_pos_t semi_persistent;
|
||||
// f1ap_resource_type_aperiodic_pos_t aperiodic;
|
||||
pos_resource_item->resourceTypePos.choice.periodic.offset = 0; // (M)
|
||||
|
||||
} // for(int z=0; z < maxnoPosSRSResources; z++)
|
||||
|
||||
// Preparing posSRSResourceSet_List IE of SRSConfig (IE of activeULBWP) TODO IE not found in OAI srs_config so filled zero
|
||||
// values
|
||||
int maxnoPosSRSResourceSets = 1; // srs_config->possrs_ResourceSetToAddModList->list.count;
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.posSRSResourceSet_List.pos_srs_resource_set_list_length =
|
||||
maxnoPosSRSResourceSets;
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.posSRSResourceSet_List.pos_srs_resource_set_item =
|
||||
malloc(maxnoPosSRSResourceSets * sizeof(f1ap_pos_srs_resource_set_item_t));
|
||||
DevAssert(srs_carrier_list_item->active_ul_bwp.sRSConfig.posSRSResourceSet_List.pos_srs_resource_set_item);
|
||||
f1ap_pos_srs_resource_set_item_t *pos_resourceSet_item =
|
||||
srs_carrier_list_item->active_ul_bwp.sRSConfig.posSRSResourceSet_List.pos_srs_resource_set_item;
|
||||
LOG_D(MAC, "Preparing posSRSResourceSet_List for NRRPA maxnoPosSRSResourceSets=%d \n", maxnoPosSRSResourceSets);
|
||||
for (int f = 0; f < maxnoPosSRSResourceSets; f++) { // Preparing Pos SRS Resource Set List
|
||||
pos_resourceSet_item->possrsResourceSetID =
|
||||
0; // (M) srs_config->possrs_ResourceSetToAddModList->list.array[y]->srs_ResourceSetId; //// (M)
|
||||
|
||||
// pos_resourceSet_item->possRSResourceID_List; //f1ap_pos_srs_resource_id_list_t possRSResourceID_List;
|
||||
int maxnoPosSRSResourcePerSets = 1;
|
||||
pos_resourceSet_item->possRSResourceID_List.pos_srs_resource_id_list_length = maxnoPosSRSResourcePerSets;
|
||||
pos_resourceSet_item->possRSResourceID_List.srs_pos_resource_id = malloc(maxnoPosSRSResourcePerSets * sizeof(uint8_t));
|
||||
DevAssert(pos_resourceSet_item->possRSResourceID_List.srs_pos_resource_id);
|
||||
for (int z = 0; z < maxnoPosSRSResourcePerSets; z++) {
|
||||
pos_resourceSet_item->possRSResourceID_List.srs_pos_resource_id = 0; // TODO pointer address update
|
||||
}
|
||||
|
||||
// IE posresourceSetType TODO
|
||||
// pos_resourceSet_item->posresourceSetType.present=f1ap_pos_resource_set_type_pr_nothing;
|
||||
pos_resourceSet_item->posresourceSetType.present = f1ap_pos_resource_set_type_pr_aperiodic;
|
||||
pos_resourceSet_item->posresourceSetType.choice.aperiodic.sRSResourceTrigger_List = 1;
|
||||
// pos_resourceSet_item->posresourceSetType.periodic.posperiodicSet = 0; // f1ap_pos_resource_set_type_u
|
||||
// posresourceSetType;
|
||||
} // for(int f=0; f < maxnoSRSResourceSets; f++)
|
||||
|
||||
// Preparing Uplink Channel BW Per SCS List information IE of SRSCarrier_List f1ap_uplink_channel_bw_per_scs_list_t
|
||||
// uplink_channel_bw_per_scs_list ; //(M)
|
||||
int maxnoSCSs = 1; // TODO adeel retrieve and add
|
||||
srs_carrier_list_item->uplink_channel_bw_per_scs_list.scs_specific_carrier_list_length = maxnoSCSs;
|
||||
srs_carrier_list_item->uplink_channel_bw_per_scs_list.scs_specific_carrier =
|
||||
malloc(maxnoSCSs * sizeof(f1ap_scs_specific_carrier_t));
|
||||
DevAssert(srs_carrier_list_item->uplink_channel_bw_per_scs_list.scs_specific_carrier);
|
||||
f1ap_scs_specific_carrier_t *scs_specific_carrier_item =
|
||||
srs_carrier_list_item->uplink_channel_bw_per_scs_list.scs_specific_carrier;
|
||||
LOG_D(MAC, "Preparing Uplink Channel BW Per SCS List for NRPPA maxnoSCSs=%d \n", maxnoSCSs);
|
||||
for (int a = 0; a < maxnoSCSs; a++) {
|
||||
scs_specific_carrier_item->offsetToCarrier = 0; // (M)
|
||||
scs_specific_carrier_item->subcarrierSpacing = 0; // (M) kHz15 = 0, kHz30 = 1, kHz60 = 2, kHz120 = 3
|
||||
scs_specific_carrier_item->carrierBandwidth = 0; // (M)
|
||||
} // for(int a=0; a < maxnoSCSs; a++)
|
||||
} // for (int i = 0; i < maxnoSRScarrier; i++)
|
||||
} // Condition for the target UE of positioning if(UE_SUPI==?)
|
||||
} // UE_iterator UE_iterator(UE_info->list, UE)
|
||||
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, 0, msg);
|
||||
}
|
||||
|
||||
static void positioning_information_failure(const f1ap_positioning_information_failure_t *failure)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"UL Prepring PositioningInformationFailure gNB_CU_ue_id=%d, gNB_DU_ue_id=%d \n",
|
||||
failure->gNB_CU_ue_id,
|
||||
failure->gNB_DU_ue_id);
|
||||
AssertFatal(false, "Not Implemented \n");
|
||||
}
|
||||
|
||||
static void positioning_information_update(const f1ap_positioning_information_update_t *update)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"UL Prepring PositioningInformationUPDATE gNB_CU_ue_id=%d, gNB_DU_ue_id=%d \n",
|
||||
update->gNB_CU_ue_id,
|
||||
update->gNB_DU_ue_id);
|
||||
AssertFatal(false, "Not Implemented \n");
|
||||
}
|
||||
|
||||
static void positioning_activation_response(const f1ap_positioning_activation_resp_t *resp)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"UL Prepring PositioningActivationResponse gNB_CU_ue_id=%d, gNB_DU_ue_id=%d \n",
|
||||
resp->gNB_CU_ue_id,
|
||||
resp->gNB_DU_ue_id);
|
||||
//AssertFatal(false, " Not Implemented \n");
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_POSITIONING_ACTIVATION_RESP);
|
||||
f1ap_positioning_activation_resp_t *f1ap_msg = &F1AP_POSITIONING_ACTIVATION_RESP(msg);
|
||||
|
||||
/* TODO copy all fields, but reallocate memory buffers! */
|
||||
*f1ap_msg = *resp;
|
||||
f1ap_msg->gNB_CU_ue_id = resp->gNB_CU_ue_id;
|
||||
f1ap_msg->gNB_DU_ue_id = resp->gNB_DU_ue_id;
|
||||
f1ap_msg->nrppa_msg_info.nrppa_transaction_id = resp->nrppa_msg_info.nrppa_transaction_id;
|
||||
f1ap_msg->nrppa_msg_info.instance = resp->nrppa_msg_info.instance;
|
||||
f1ap_msg->nrppa_msg_info.gNB_ue_ngap_id = resp->nrppa_msg_info.gNB_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.amf_ue_ngap_id = resp->nrppa_msg_info.amf_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.ue_rnti = resp->nrppa_msg_info.ue_rnti;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_buffer = resp->nrppa_msg_info.routing_id_buffer;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_length = resp->nrppa_msg_info.routing_id_length;
|
||||
|
||||
// PHY_VARS_gNB_s *gNB = RC.gNB[resp->nrppa_msg_info.instance];
|
||||
gNB_MAC_INST *mac = RC.nrmac[resp->nrppa_msg_info.instance];
|
||||
NR_UEs_t *UE_info = &mac->UE_info;
|
||||
UE_iterator (UE_info->list, UE) {
|
||||
if (UE->rnti == resp->nrppa_msg_info.ue_rnti) { // configuration details of specific UE // TODO manage non UE associated
|
||||
LOG_I(MAC, "Extracting SRS frame and slot info of ActivationResponse for ue rnti= %04x \n",
|
||||
resp->nrppa_msg_info.ue_rnti);
|
||||
// IE 9.2.2 CriticalityDiagnostics (O)
|
||||
// IE SystemFrameNumber (O)
|
||||
f1ap_msg->system_frame_number=0; // TODO retireve the actual values and fill it
|
||||
// IE SlotNumber (O)
|
||||
f1ap_msg->slot_number=0; // TODO retireve the actual values and fill it
|
||||
}
|
||||
}
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, 0, msg);
|
||||
}
|
||||
|
||||
static void positioning_activation_failure(const f1ap_positioning_activation_failure_t *failure)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"UL Prepring PositioningActivationFailure gNB_CU_ue_id=%d, gNB_DU_ue_id=%d \n",
|
||||
failure->gNB_CU_ue_id,
|
||||
failure->gNB_DU_ue_id);
|
||||
AssertFatal(false, " Not Implemented \n");
|
||||
}
|
||||
|
||||
/* handlers of TRP Information Transfer related NRPPA UL messages */
|
||||
|
||||
static void trp_information_response(const f1ap_trp_information_resp_t *resp)
|
||||
{
|
||||
LOG_I(MAC, "UL Prepring TRPInformationResponse transaction_id=%d\n", resp->transaction_id);
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_TRP_INFORMATION_RESP);
|
||||
f1ap_trp_information_resp_t *f1ap_msg = &F1AP_TRP_INFORMATION_RESP(msg);
|
||||
|
||||
/* TODO copy all fields, but reallocate memory buffers! */
|
||||
*f1ap_msg = *resp;
|
||||
f1ap_msg->transaction_id = resp->transaction_id;
|
||||
f1ap_msg->nrppa_msg_info.nrppa_transaction_id = resp->nrppa_msg_info.nrppa_transaction_id;
|
||||
f1ap_msg->nrppa_msg_info.instance = resp->nrppa_msg_info.instance;
|
||||
f1ap_msg->nrppa_msg_info.gNB_ue_ngap_id = resp->nrppa_msg_info.gNB_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.amf_ue_ngap_id = resp->nrppa_msg_info.amf_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.ue_rnti = resp->nrppa_msg_info.ue_rnti;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_buffer = resp->nrppa_msg_info.routing_id_buffer;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_length = resp->nrppa_msg_info.routing_id_length;
|
||||
|
||||
|
||||
/*// IE TRP Information List (M)
|
||||
// TODO fill pdu using f1ap_trp_information_resp_t *resp
|
||||
{
|
||||
// TODO Retrieve TRP information from RAN Context
|
||||
|
||||
int nb_of_TRP = 1; // TODO find the acutal number for TRP and add here
|
||||
f1ap_msg->trp_information_list.trp_information_list_length=nb_of_TRP;
|
||||
f1ap_msg->trp_information_list.trp_information_item= malloc(nb_of_TRP * sizeof(f1ap_trp_information_item_t));
|
||||
DevAssert(f1ap_msg->trp_information_list.trp_information_item);
|
||||
f1ap_trp_information_item_t *trp_info_item= f1ap_msg->trp_information_list.trp_information_item;
|
||||
LOG_D(MAC, "Preparing trp information list for NRPPA nb_of_TRP=%d \n", nb_of_TRP);
|
||||
for (int i = 0; i < nb_of_TRP; i++) {
|
||||
trp_info_item->tRPInformation.tRPID=0;// item->tRP_ID = 0; // long NRPPA_TRP_ID_t
|
||||
|
||||
// Preparing tRPInformation IE of TRPInformationList__Member
|
||||
|
||||
int nb_tRPInfoTypes = 1; // TODO find the acutal size add here
|
||||
f1ap_trp_information_type_response_list_t *rspList =&trp_info_item->tRPInformation.tRPInformationTypeResponseList;
|
||||
rspList->trp_information_type_response_list_length= nb_tRPInfoTypes;
|
||||
rspList->trp_information_type_response_item=malloc(nb_tRPInfoTypes*sizeof(f1ap_trp_information_type_response_item_u));
|
||||
DevAssert(rspList->trp_information_type_response_item);
|
||||
f1ap_trp_information_type_response_item_t *rspItem= rspList->trp_information_type_response_item;
|
||||
for (int k = 0; k < nb_tRPInfoTypes; k++) // Preparing NRPPA_TRPInformation_t a list of TRPInformation_item
|
||||
{
|
||||
rspItem->present= f1ap_trp_information_type_response_item_pr_pCI_NR;
|
||||
rspItem->choice.pCI_NR= 10; // dummy values
|
||||
|
||||
// bit_string_t nRCellIdentity; // typedef BIT_STRING_t F1AP_NRCellIdentity_t;
|
||||
|
||||
//rspItem->present=f1ap_trp_information_type_response_item_pr_nG_RAN_CGI;
|
||||
//rspItem->choice.nG_RAN_CGI.nRCellIdentity.bits_unused= ;
|
||||
//rspItem->choice.nG_RAN_CGI.nRCellIdentity.buf= ;
|
||||
//rspItem->choice.nG_RAN_CGI.nRCellIdentity.size=;
|
||||
|
||||
// octet_string_t pLMN_Identity; // typedef OCTET_STRING_t F1AP_PLMN_Identity_t;
|
||||
//rspItem->choice.nG_RAN_CGI.pLMN_Identity.buf=
|
||||
//rspItem->choice.nG_RAN_CGI.pLMN_Identity.size
|
||||
// TODO adeel retrive relevent info and add
|
||||
|
||||
//trpinfo_item->choice.pCI_NR = 0; // long dummy value
|
||||
//trpinfo_item->choice.sSBinformation = NULL; // dummy values
|
||||
//trpinfo_item->choice.nG_RAN_CGI = NULL; // dummy values
|
||||
//trpinfo_item->choice.pRSConfiguration = NULL; // dummy values
|
||||
//trpinfo_item->choice.geographicalCoordinates = NULL; // dummy values
|
||||
if (k < nb_tRPInfoTypes-1){
|
||||
rspItem++;
|
||||
}
|
||||
} // for(int k=0; k < nb_tRPInfoTypes; k++)
|
||||
if (i < nb_of_TRP-1){
|
||||
trp_info_item++;
|
||||
}
|
||||
} // for (int i = 0; i < nb_of_TRP; i++)
|
||||
} // IE Information List */
|
||||
|
||||
/*// TODO IE 9.2.2 CriticalityDiagnostics (O)
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NRPPA_TRPInformationResponse_IEs_t, ie);
|
||||
ie->id = NRPPA_ProtocolIE_ID_id_CriticalityDiagnostics;
|
||||
ie->criticality = NRPPA_Criticality_ignore;
|
||||
ie->value.present = NRPPA_TRPInformationResponse_IEs__value_PR_CriticalityDiagnostics;
|
||||
}*/
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, 0, msg);
|
||||
}
|
||||
|
||||
static void trp_information_failure(const f1ap_trp_information_failure_t *failure)
|
||||
{
|
||||
LOG_I(MAC, "UL Prepring TRPInformationFailure transaction_id=%d \n", failure->transaction_id);
|
||||
AssertFatal(false, " Not Implemented \n");
|
||||
}
|
||||
|
||||
/* handlers of Measurement Information Transfer related NRPPA UL messages */
|
||||
static void positioning_measurement_response(const f1ap_measurement_resp_t *resp)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"UL Prepring MeasurementResponse transaction_id=%d, lmf_measurement_id=%d, ran_measurement_id=%d \n",
|
||||
resp->transaction_id,
|
||||
resp->lmf_measurement_id,
|
||||
resp->ran_measurement_id);
|
||||
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_MEASUREMENT_RESP);
|
||||
f1ap_measurement_resp_t *f1ap_resp= &F1AP_MEASUREMENT_RESP(msg);
|
||||
|
||||
// prepare the common part of the response
|
||||
*f1ap_resp = *resp;
|
||||
f1ap_resp->transaction_id = resp->transaction_id;
|
||||
f1ap_resp->lmf_measurement_id = resp->lmf_measurement_id;
|
||||
f1ap_resp->ran_measurement_id = resp->ran_measurement_id;
|
||||
//f1ap_resp->nrppa_msg_info = resp->nrppa_msg_info;
|
||||
f1ap_resp->nrppa_msg_info.nrppa_transaction_id = resp->nrppa_msg_info.nrppa_transaction_id;
|
||||
f1ap_resp->nrppa_msg_info.instance = resp->nrppa_msg_info.instance;
|
||||
f1ap_resp->nrppa_msg_info.gNB_ue_ngap_id = resp->nrppa_msg_info.gNB_ue_ngap_id;
|
||||
f1ap_resp->nrppa_msg_info.amf_ue_ngap_id = resp->nrppa_msg_info.amf_ue_ngap_id;
|
||||
f1ap_resp->nrppa_msg_info.ue_rnti = resp->nrppa_msg_info.ue_rnti;
|
||||
f1ap_resp->nrppa_msg_info.routing_id_buffer = resp->nrppa_msg_info.routing_id_buffer;
|
||||
f1ap_resp->nrppa_msg_info.routing_id_length = resp->nrppa_msg_info.routing_id_length;
|
||||
|
||||
|
||||
gNB_MAC_INST *mac = RC.nrmac[resp->nrppa_msg_info.instance];
|
||||
f1ap_pos_measurement_result_list_t *measList=&f1ap_resp->pos_measurement_result_list;
|
||||
int noOfTRPs= mac->meas_pos_info.NumberofTRPs; //NB_ANTENNAS_RX;
|
||||
measList->pos_measurement_result_list_length = noOfTRPs;
|
||||
measList->pos_measurement_result_list_item = malloc(noOfTRPs*sizeof(f1ap_pos_measurement_result_list_item_t));
|
||||
DevAssert(measList->pos_measurement_result_list_item);
|
||||
f1ap_pos_measurement_result_list_item_t *meas_res_list_item= measList->pos_measurement_result_list_item;
|
||||
LOG_I(MAC, "Preparing pos_measurement_result_list for NRPPA noOfTRPs= %d\n", noOfTRPs);
|
||||
|
||||
uint32_t Tc_inv = 4096 * 480000;
|
||||
// uint16_t k = 1;
|
||||
// uint64_t T_inv = Tc_inv / (1 << k);
|
||||
// uint64_t T_ns_inv = 1000000000;
|
||||
int16_t k = 1;
|
||||
int64_t T_inv = Tc_inv / (1 << k);
|
||||
int64_t T_ns_inv = 1000000000;
|
||||
|
||||
for (int trp_i=0; trp_i < noOfTRPs; trp_i++){
|
||||
meas_res_list_item->tRPID =trp_i; // TODO: needs to be added to config file
|
||||
f1ap_pos_measurement_result_t *posMeasRes= &meas_res_list_item->posMeasurementResult;
|
||||
posMeasRes->f1ap_pos_measurement_result_length =1;
|
||||
posMeasRes->pos_measurement_result_item =malloc(sizeof(f1ap_pos_measurement_result_item_t));
|
||||
DevAssert(posMeasRes->pos_measurement_result_item);
|
||||
|
||||
LOG_I(MAC,"ToA[%d] = %d\n",trp_i,mac->meas_pos_info.toa_ns[trp_i]);
|
||||
|
||||
// we assume we use UL_RTOA for now with k=1 (i.e. 8 times oversampling from 122.88e6 Msps)
|
||||
f1ap_measured_results_value_t *MeasResVal= &posMeasRes->pos_measurement_result_item->measuredResultsValue;
|
||||
MeasResVal->present = f1ap_measured_results_value_pr_ul_rtoa;
|
||||
//if (mac->meas_pos_info.toa_ns[trp_i] != 0x8000) {
|
||||
if (mac->meas_pos_info.toa_ns[trp_i] != (int16_t) 0x8000) {
|
||||
//int32_t k1 = ((mac->meas_pos_info.toa_ns[trp_i] * T_inv) / T_ns_inv ) + 492512;
|
||||
//int32_t k1 = (int32_t)(((int64_t)mac->meas_pos_info.toa_ns[trp_i] * (int64_t)T_inv) / (int64_t)T_ns_inv) + 492512;
|
||||
int64_t toa = (int64_t)(mac->meas_pos_info.toa_ns[trp_i]);
|
||||
int64_t num = toa * (int64_t)T_inv;
|
||||
int32_t k1;
|
||||
if (num >= 0)
|
||||
k1 = (int32_t)((num + T_ns_inv / 2) / T_ns_inv) + 492512;
|
||||
else
|
||||
k1 = (int32_t)((num - T_ns_inv / 2) / T_ns_inv) + 492512;
|
||||
|
||||
|
||||
if (k1<0) k1=0;
|
||||
if (k1>985025) k1=985025;
|
||||
LOG_I(MAC,"k1[%d] = %d\n",trp_i,k1);
|
||||
|
||||
MeasResVal->choice.uL_RTOA.uL_RTOA_MeasurementItem.present = f1ap_ulrtoameas_pr_k1;
|
||||
MeasResVal->choice.uL_RTOA.uL_RTOA_MeasurementItem.choice.k1 = k1;
|
||||
|
||||
LOG_I(MAC,
|
||||
"Extracting uL_RTOA info of MeasurementResponse, k1=%d \n",
|
||||
MeasResVal->choice.uL_RTOA.uL_RTOA_MeasurementItem.choice.k1);
|
||||
} else {
|
||||
LOG_I(MAC,"ul_RTOA invalid, MeasurementResponse set to '-32768'\n");
|
||||
MeasResVal->choice.uL_RTOA.uL_RTOA_MeasurementItem.choice.k1 = 985025;
|
||||
}
|
||||
LOG_I(MAC,"reported val[%d] = %d\n",trp_i,MeasResVal->choice.uL_RTOA.uL_RTOA_MeasurementItem.choice.k1);
|
||||
|
||||
// IE timeStamp.measurementTime
|
||||
posMeasRes->pos_measurement_result_item->timeStamp.systemFrameNumber = mac->meas_pos_info.frame;// mac->frame;
|
||||
// IE timeStamp.slotIndex
|
||||
posMeasRes->pos_measurement_result_item->timeStamp.slotIndex.present = f1ap_time_stamp_slot_index_pr_sCS_30;
|
||||
posMeasRes->pos_measurement_result_item->timeStamp.slotIndex.choice.sCS_30 = mac->meas_pos_info.slot; //mac->slot;
|
||||
if (trp_i < noOfTRPs - 1) {
|
||||
meas_res_list_item++;
|
||||
}
|
||||
}
|
||||
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, 0, msg);
|
||||
}
|
||||
|
||||
static void positioning_measurement_failure(const f1ap_measurement_failure_t *failure)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"UL Prepring MeasurementFailure transaction_id=%d, lmf_measurement_id=%d \n",
|
||||
failure->transaction_id,
|
||||
failure->lmf_measurement_id);
|
||||
AssertFatal(false, " Not Implemented \n");
|
||||
}
|
||||
|
||||
static void positioning_measurement_report(const f1ap_measurement_report_t *report)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"UL Prepring MeasurementReport transaction_id=%d, lmf_measurement_id=%d \n",
|
||||
report->transaction_id,
|
||||
report->lmf_measurement_id);
|
||||
AssertFatal(false, " Not Implemented \n");
|
||||
}
|
||||
|
||||
static void positioning_measurement_failure_indication(const f1ap_measurement_failure_ind_t *failure_ind)
|
||||
{
|
||||
LOG_I(MAC,
|
||||
"UL Prepring MeasurementFailureIndication transaction_id=%d, lmf_measurement_id=%d \n",
|
||||
failure_ind->transaction_id,
|
||||
failure_ind->lmf_measurement_id);
|
||||
AssertFatal(false, " Not Implemented \n");
|
||||
}
|
||||
|
||||
void mac_rrc_ul_direct_init(struct nr_mac_rrc_ul_if_s *mac_rrc)
|
||||
{
|
||||
mac_rrc->f1_reset = f1_reset_du_initiated_direct;
|
||||
@@ -306,4 +1016,15 @@ void mac_rrc_ul_direct_init(struct nr_mac_rrc_ul_if_s *mac_rrc)
|
||||
mac_rrc->ue_context_release_request = ue_context_release_request_direct;
|
||||
mac_rrc->ue_context_release_complete = ue_context_release_complete_direct;
|
||||
mac_rrc->initial_ul_rrc_message_transfer = initial_ul_rrc_message_transfer_direct;
|
||||
mac_rrc->positioning_information_response = positioning_information_response; // nrppa adeel
|
||||
mac_rrc->positioning_information_failure = positioning_information_failure;
|
||||
mac_rrc->positioning_information_update = positioning_information_update;
|
||||
mac_rrc->positioning_activation_response = positioning_activation_response;
|
||||
mac_rrc->positioning_activation_failure = positioning_activation_failure;
|
||||
mac_rrc->trp_information_response = trp_information_response;
|
||||
mac_rrc->trp_information_failure = trp_information_failure;
|
||||
mac_rrc->positioning_measurement_response = positioning_measurement_response;
|
||||
mac_rrc->positioning_measurement_failure = positioning_measurement_failure;
|
||||
mac_rrc->positioning_measurement_report = positioning_measurement_report;
|
||||
mac_rrc->positioning_measurement_failure_indication = positioning_measurement_failure_indication;
|
||||
}
|
||||
|
||||
@@ -286,6 +286,64 @@ static void initial_ul_rrc_message_transfer_f1ap(module_id_t module_id, const f1
|
||||
itti_send_msg_to_task(TASK_DU_F1, module_id, msg);
|
||||
}
|
||||
|
||||
static void positioning_information_response_f1ap(const f1ap_positioning_information_resp_t *resp)
|
||||
{
|
||||
AssertFatal(false, "not implemented\n");
|
||||
}
|
||||
|
||||
static void positioning_information_failure_f1ap(const f1ap_positioning_information_failure_t *failure)
|
||||
{
|
||||
AssertFatal(false, "not implemented\n");
|
||||
}
|
||||
|
||||
static void positioning_information_update_f1ap(const f1ap_positioning_information_update_t *update)
|
||||
{
|
||||
AssertFatal(false, "not implemented\n");
|
||||
}
|
||||
|
||||
/* handlers of Positioning Information Transfer related NRPPA UL messages */
|
||||
static void positioning_activation_response_f1ap(const f1ap_positioning_activation_resp_t *resp)
|
||||
{
|
||||
AssertFatal(false, "not implemented\n");
|
||||
}
|
||||
|
||||
static void positioning_activation_failure_f1ap(const f1ap_positioning_activation_failure_t *failure)
|
||||
{
|
||||
AssertFatal(false, "not implemented\n");
|
||||
}
|
||||
|
||||
/* handlers of TRP Information Transfer related NRPPA UL messages */
|
||||
static void trp_information_response_f1ap(const f1ap_trp_information_resp_t *resp)
|
||||
{
|
||||
AssertFatal(false, "not implemented\n");
|
||||
}
|
||||
|
||||
static void trp_information_failure_f1ap(const f1ap_trp_information_failure_t *failure)
|
||||
{
|
||||
AssertFatal(false, "not implemented\n");
|
||||
}
|
||||
|
||||
/* handlers of Measurement Information Transfer related NRPPA UL messages */
|
||||
static void positioning_measurement_response_f1ap(const f1ap_measurement_resp_t *resp)
|
||||
{
|
||||
AssertFatal(false, "not implemented\n");
|
||||
}
|
||||
|
||||
static void positioning_measurement_failure_f1ap(const f1ap_measurement_failure_t *failure)
|
||||
{
|
||||
AssertFatal(false, "not implemented\n");
|
||||
}
|
||||
|
||||
static void positioning_measurement_report_f1ap(const f1ap_measurement_report_t *report)
|
||||
{
|
||||
AssertFatal(false, "not implemented\n");
|
||||
}
|
||||
|
||||
static void positioning_measurement_failure_indication_f1ap(const f1ap_measurement_failure_ind_t *failure_ind)
|
||||
{
|
||||
AssertFatal(false, "not implemented\n");
|
||||
}
|
||||
|
||||
void mac_rrc_ul_f1ap_init(struct nr_mac_rrc_ul_if_s *mac_rrc)
|
||||
{
|
||||
mac_rrc->f1_reset = f1_reset_du_initiated_f1ap;
|
||||
@@ -298,5 +356,15 @@ void mac_rrc_ul_f1ap_init(struct nr_mac_rrc_ul_if_s *mac_rrc)
|
||||
mac_rrc->ue_context_release_request = ue_context_release_request_f1ap;
|
||||
mac_rrc->ue_context_release_complete = ue_context_release_complete_f1ap;
|
||||
mac_rrc->initial_ul_rrc_message_transfer = initial_ul_rrc_message_transfer_f1ap;
|
||||
mac_rrc->positioning_information_response = positioning_information_response_f1ap; // nrppa adeel
|
||||
mac_rrc->positioning_information_failure = positioning_information_failure_f1ap;
|
||||
mac_rrc->positioning_information_update = positioning_information_update_f1ap;
|
||||
mac_rrc->positioning_activation_response = positioning_activation_response_f1ap;
|
||||
mac_rrc->positioning_activation_failure = positioning_activation_failure_f1ap;
|
||||
mac_rrc->trp_information_response = trp_information_response_f1ap;
|
||||
mac_rrc->trp_information_failure = trp_information_failure_f1ap;
|
||||
mac_rrc->positioning_measurement_response = positioning_measurement_response_f1ap;
|
||||
mac_rrc->positioning_measurement_failure = positioning_measurement_failure_f1ap;
|
||||
mac_rrc->positioning_measurement_report = positioning_measurement_report_f1ap;
|
||||
mac_rrc->positioning_measurement_failure_indication = positioning_measurement_failure_indication_f1ap;
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,8 @@
|
||||
#include <pthread.h>
|
||||
#include "common/utils/ds/seq_arr.h"
|
||||
|
||||
#define NON_UE_ASSOCIATED_SRS_DUMMY_RNTI 0xcafe
|
||||
|
||||
#define NR_SCHED_LOCK(lock) \
|
||||
do { \
|
||||
int rc = pthread_mutex_lock(lock); \
|
||||
@@ -263,6 +265,8 @@ typedef struct {
|
||||
NR_ServingCellConfigCommon_t *ServingCellConfigCommon;
|
||||
/// pre-configured ServingCellConfig that is default for every UE
|
||||
NR_ServingCellConfig_t *pre_ServingCellConfig;
|
||||
NR_ARFCN_ValueEUTRA_t ul_CarrierFreq;
|
||||
long ul_Bandwidth;
|
||||
/// Outgoing MIB PDU for PHY
|
||||
uint8_t MIB_pdu[3];
|
||||
/// Outgoing BCCH pdu for PHY
|
||||
@@ -335,7 +339,7 @@ typedef struct SPCSIReportingpucch {
|
||||
bool s0tos3_actDeact[4];
|
||||
} SPCSIReportingpucch_t;
|
||||
|
||||
#define MAX_APERIODIC_TRIGGER_STATES 128 //38.331
|
||||
#define MAX_APERIODIC_TRIGGER_STATES 128 //38.331
|
||||
typedef struct aperiodicCSI_triggerStateSelection {
|
||||
bool is_scheduled;
|
||||
uint8_t servingCellId;
|
||||
@@ -344,7 +348,7 @@ typedef struct aperiodicCSI_triggerStateSelection {
|
||||
bool triggerStateSelection[MAX_APERIODIC_TRIGGER_STATES];
|
||||
} aperiodicCSI_triggerStateSelection_t;
|
||||
|
||||
#define MAX_TCI_STATES 128 //38.331
|
||||
#define MAX_TCI_STATES 128 //38.331
|
||||
typedef struct pdschTciStatesActDeact {
|
||||
bool is_scheduled;
|
||||
uint8_t servingCellId;
|
||||
@@ -523,9 +527,9 @@ struct CSI_Report {
|
||||
|
||||
#define MAX_SR_BITLEN 8
|
||||
|
||||
/*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report
|
||||
/*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report
|
||||
the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE
|
||||
From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set
|
||||
From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set
|
||||
From spec 38.214 section 5.2.1.2 For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1
|
||||
*/
|
||||
#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16
|
||||
@@ -712,8 +716,36 @@ typedef struct nr_mac_rrc_ul_if_s {
|
||||
ue_context_release_request_func_t ue_context_release_request;
|
||||
ue_context_release_complete_func_t ue_context_release_complete;
|
||||
initial_ul_rrc_message_transfer_func_t initial_ul_rrc_message_transfer;
|
||||
positioning_information_response_func_t positioning_information_response; // nrppa adeel
|
||||
positioning_information_failure_func_t positioning_information_failure;
|
||||
positioning_information_update_func_t positioning_information_update;
|
||||
positioning_activation_response_func_t positioning_activation_response;
|
||||
positioning_activation_failure_func_t positioning_activation_failure;
|
||||
trp_information_response_func_t trp_information_response;
|
||||
trp_information_failure_func_t trp_information_failure;
|
||||
positioning_measurement_response_func_t positioning_measurement_response;
|
||||
positioning_measurement_failure_func_t positioning_measurement_failure;
|
||||
positioning_measurement_report_func_t positioning_measurement_report;
|
||||
positioning_measurement_failure_indication_func_t positioning_measurement_failure_indication;
|
||||
} nr_mac_rrc_ul_if_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t transaction_id; // IE 9.3.1.23 (M)
|
||||
uint16_t lmf_measurement_id; // (M)
|
||||
uint16_t ran_measurement_id; // (M)
|
||||
} f1ap_meas_resp_header_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t pos_report_characteristics; // (M) // ondemand = 0, periodic = 1
|
||||
uint8_t pos_measurement_periodicity; //(C) if report characteristics periodic ms120=0, ms240=1, ms480=2, ms640=3, ms1024=4, ms20
|
||||
uint8_t pos_report_valid; // (C) if report characteristics ondemand the request sets this to 1 and once response is sent its set back to 0
|
||||
//int16_t toa_ns[NB_ANTENNAS_RX]; // for the moment we only support toa measurements, others can be added here later
|
||||
int16_t toa_ns[8];
|
||||
uint32_t frame;
|
||||
uint32_t slot;
|
||||
uint8_t NumberofTRPs;
|
||||
} NR_meas_pos_t;
|
||||
|
||||
/*! \brief UE list used by gNB to order UEs/CC for scheduling*/
|
||||
typedef struct {
|
||||
rnti_t rnti;
|
||||
@@ -896,6 +928,18 @@ typedef struct gNB_MAC_INST_s {
|
||||
|
||||
pthread_mutex_t sched_lock;
|
||||
|
||||
//holds the SRS config for NRPPa measurement request
|
||||
//f1ap_measurement_req_t *f1ap_meas_req;
|
||||
uint8_t do_srs_meas;//=0;
|
||||
uint8_t secondary_srs_configured;//=0;
|
||||
f1ap_srs_resource_t srs_resource;
|
||||
f1ap_srs_resource_set_t srs_resource_set;
|
||||
f1ap_meas_resp_header_t f1ap_meas_resp_header;
|
||||
nrppa_f1ap_info_t nrppa_msg_info;
|
||||
|
||||
//holds measurement response (non-ue associated)
|
||||
NR_meas_pos_t meas_pos_info;
|
||||
|
||||
} gNB_MAC_INST;
|
||||
|
||||
#endif /*__LAYER2_NR_MAC_GNB_H__ */
|
||||
|
||||
@@ -41,6 +41,19 @@ typedef void (*ue_context_release_command_func_t)(sctp_assoc_t assoc_id, const f
|
||||
|
||||
typedef void (*dl_rrc_message_transfer_func_t)(sctp_assoc_t assoc_id, const f1ap_dl_rrc_message_t *dl_rrc);
|
||||
|
||||
/* handlers of Position Information Transfer related NRPPA DL messages */
|
||||
typedef void (*positioning_information_request_func_t)(const f1ap_positioning_information_req_t *pos_req);
|
||||
typedef void (*positioning_activation_request_func_t)(const f1ap_positioning_activation_req_t *act_req);
|
||||
typedef void (*positioning_deactivation_func_t)(const f1ap_positioning_deactivation_t *deact_req);
|
||||
|
||||
/* handlers of TRP Information Transfer related NRPPA DL messages */
|
||||
typedef void (*trp_information_request_func_t)(const f1ap_trp_information_req_t *trp_req);
|
||||
|
||||
/* handlers of Measurement Information Transfer related NRPPA DL messages */
|
||||
typedef void (*positioning_measurement_request_func_t)(const f1ap_measurement_req_t *meas_req);
|
||||
typedef void (*positioning_measurement_update_func_t)(const f1ap_measurement_update_t *meas_update);
|
||||
typedef void (*positioning_measurement_abort_func_t)(const f1ap_measurement_abort_t *meas_abort);
|
||||
|
||||
struct nr_mac_rrc_dl_if_s;
|
||||
void mac_rrc_dl_direct_init(struct nr_mac_rrc_dl_if_s *mac_rrc);
|
||||
void mac_rrc_dl_f1ap_init(struct nr_mac_rrc_dl_if_s *mac_rrc);
|
||||
|
||||
@@ -103,4 +103,11 @@ void mac_rrc_dl_direct_init(nr_mac_rrc_dl_if_t *mac_rrc)
|
||||
mac_rrc->ue_context_modification_refuse = ue_context_modification_refuse_direct;
|
||||
mac_rrc->ue_context_release_command = ue_context_release_command_direct;
|
||||
mac_rrc->dl_rrc_message_transfer = dl_rrc_message_transfer_direct;
|
||||
mac_rrc->positioning_information_request = positioning_information_request; // nrppa adeel
|
||||
mac_rrc->positioning_activation_request = positioning_activation_request;
|
||||
mac_rrc->positioning_deactivation = positioning_deactivation;
|
||||
mac_rrc->trp_information_request = trp_information_request;
|
||||
mac_rrc->positioning_measurement_request = positioning_measurement_request;
|
||||
mac_rrc->positioning_measurement_update = positioning_measurement_update;
|
||||
mac_rrc->positioning_measurement_abort = positioning_measurement_abort;
|
||||
}
|
||||
|
||||
@@ -225,6 +225,54 @@ static void dl_rrc_message_transfer_f1ap(sctp_assoc_t assoc_id, const f1ap_dl_rr
|
||||
itti_send_msg_to_task (TASK_CU_F1, 0, message_p);
|
||||
}
|
||||
|
||||
/* handlers of Positioning Information Transfer related NRPPA DL messages */
|
||||
static void positioning_information_request_f1ap(const f1ap_positioning_information_req_t *req)
|
||||
{
|
||||
// printf("[NRPPA]Split CU-DU Mode :Processing Received PositioningInformationRequest \n");
|
||||
// TODO forward task to CU
|
||||
// MessageDef *msg = itti_alloc_new_message(TASK_NRPPA, 0, F1AP_POSITIONING_INFORMATION_REQ);
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_RRC_GNB, 0, F1AP_POSITIONING_INFORMATION_REQ);
|
||||
// f1ap_positioning_information_req_t *f1ap_msg = &msg->ittiMsg.f1ap_positioning_information_req;
|
||||
f1ap_positioning_information_req_t *f1ap_msg = &F1AP_POSITIONING_INFORMATION_REQ(msg);
|
||||
|
||||
f1ap_msg->gNB_CU_ue_id = 0; // TODO retrieve and add
|
||||
// LOG_D(RRC, "f1ap_positioning_information_req->gNB_CU_ue_id is: %d \n", f1ap_msg->gNB_CU_ue_id);
|
||||
f1ap_msg->gNB_DU_ue_id = 0; // TODO retrieve and add
|
||||
// LOG_D(RRC, "f1ap_positioning_information_req->gNB_DU_ue_id is: %d \n", f1ap_msg->gNB_DU_ue_id);
|
||||
itti_send_msg_to_task(TASK_CU_F1, 0, msg);
|
||||
}
|
||||
|
||||
static void positioning_activation_request_f1ap(const f1ap_positioning_activation_req_t *req)
|
||||
{
|
||||
AssertFatal(false, "positioning_activation_request_f1ap() Not Implemented \n");
|
||||
}
|
||||
|
||||
static void positioning_deactivation_f1ap(const f1ap_positioning_deactivation_t *req)
|
||||
{
|
||||
AssertFatal(false, "positioning_deactivation_f1ap() Not Implemented \n");
|
||||
}
|
||||
|
||||
/* handlers of trp Information Transfer related NRPPA DL messages */
|
||||
static void trp_information_request_f1ap(const f1ap_trp_information_req_t *req)
|
||||
{
|
||||
AssertFatal(false, "trp_information_request_f1ap() Not Implemented \n");
|
||||
}
|
||||
/* handlers of measurement Information Transfer related NRPPA DL messages */
|
||||
static void positioning_measurement_request_f1ap(const f1ap_measurement_req_t *req)
|
||||
{
|
||||
AssertFatal(false, "measurement_request_f1ap() Not Implemented \n");
|
||||
}
|
||||
|
||||
static void positioning_measurement_update_f1ap(const f1ap_measurement_update_t *req)
|
||||
{
|
||||
AssertFatal(false, "measurement_request_f1ap() Not Implemented \n");
|
||||
}
|
||||
|
||||
static void positioning_measurement_abort_f1ap(const f1ap_measurement_abort_t *meas_abort)
|
||||
{
|
||||
AssertFatal(false, "measurement_request_f1ap() Not Implemented \n");
|
||||
}
|
||||
|
||||
void mac_rrc_dl_f1ap_init(nr_mac_rrc_dl_if_t *mac_rrc)
|
||||
{
|
||||
mac_rrc->f1_reset = f1_reset_cu_initiated_f1ap;
|
||||
@@ -238,4 +286,11 @@ void mac_rrc_dl_f1ap_init(nr_mac_rrc_dl_if_t *mac_rrc)
|
||||
mac_rrc->ue_context_modification_refuse = ue_context_modification_refuse_f1ap;
|
||||
mac_rrc->ue_context_release_command = ue_context_release_command_f1ap;
|
||||
mac_rrc->dl_rrc_message_transfer = dl_rrc_message_transfer_f1ap;
|
||||
mac_rrc->positioning_information_request = positioning_information_request_f1ap; // nrppa adeel
|
||||
mac_rrc->positioning_activation_request = positioning_activation_request_f1ap;
|
||||
mac_rrc->positioning_deactivation = positioning_deactivation_f1ap;
|
||||
mac_rrc->trp_information_request = trp_information_request_f1ap;
|
||||
mac_rrc->positioning_measurement_request = positioning_measurement_request_f1ap;
|
||||
mac_rrc->positioning_measurement_update = positioning_measurement_update_f1ap;
|
||||
mac_rrc->positioning_measurement_abort = positioning_measurement_abort_f1ap;
|
||||
}
|
||||
|
||||
@@ -745,8 +745,8 @@ static NR_SetupRelease_SRS_Config_t *get_config_srs(const NR_ServingCellConfigCo
|
||||
srs_res0->transmissionComb.choice.n2 = calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2));
|
||||
srs_res0->transmissionComb.choice.n2->combOffset_n2 = 0;
|
||||
srs_res0->transmissionComb.choice.n2->cyclicShift_n2 = 0;
|
||||
srs_res0->resourceMapping.startPosition = 1;
|
||||
srs_res0->resourceMapping.nrofSymbols = NR_SRS_Resource__resourceMapping__nrofSymbols_n1;
|
||||
srs_res0->resourceMapping.startPosition = 4;
|
||||
srs_res0->resourceMapping.nrofSymbols = NR_SRS_Resource__resourceMapping__nrofSymbols_n4;
|
||||
srs_res0->resourceMapping.repetitionFactor = NR_SRS_Resource__resourceMapping__repetitionFactor_n1;
|
||||
srs_res0->freqDomainPosition = 0;
|
||||
srs_res0->freqDomainShift = 0;
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
#ifndef __OPENAIR_RRC_DEFS_NR_H__
|
||||
#define __OPENAIR_RRC_DEFS_NR_H__
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -160,7 +159,7 @@ typedef struct HANDOVER_INFO_NR_s {
|
||||
int size; /* size of above message in bytes */
|
||||
} NR_HANDOVER_INFO;
|
||||
|
||||
#define NR_RRC_BUFFER_SIZE sizeof(RRC_BUFFER_NR)
|
||||
#define NR_RRC_BUFFER_SIZE sizeof(RRC_BUFFER_NR)
|
||||
|
||||
typedef struct nr_rrc_guami_s {
|
||||
uint16_t mcc;
|
||||
@@ -342,7 +341,6 @@ typedef struct {
|
||||
} rrc_gNB_carrier_data_t;
|
||||
//---------------------------------------------------
|
||||
|
||||
|
||||
typedef struct {
|
||||
/* nea0 = 0, nea1 = 1, ... */
|
||||
int ciphering_algorithms[4];
|
||||
@@ -409,6 +407,13 @@ typedef struct nr_mac_rrc_dl_if_s {
|
||||
ue_context_modification_refuse_func_t ue_context_modification_refuse;
|
||||
ue_context_release_command_func_t ue_context_release_command;
|
||||
dl_rrc_message_transfer_func_t dl_rrc_message_transfer;
|
||||
positioning_information_request_func_t positioning_information_request; // nrppa adeel
|
||||
positioning_activation_request_func_t positioning_activation_request;
|
||||
positioning_deactivation_func_t positioning_deactivation;
|
||||
trp_information_request_func_t trp_information_request;
|
||||
positioning_measurement_request_func_t positioning_measurement_request;
|
||||
positioning_measurement_update_func_t positioning_measurement_update;
|
||||
positioning_measurement_abort_func_t positioning_measurement_abort;
|
||||
} nr_mac_rrc_dl_if_t;
|
||||
|
||||
typedef struct cucp_cuup_if_s {
|
||||
@@ -436,6 +441,16 @@ typedef struct nr_rrc_cuup_container_t {
|
||||
sctp_assoc_t assoc_id;
|
||||
} nr_rrc_cuup_container_t;
|
||||
|
||||
// Configuration parameters required for 5G Positioning
|
||||
typedef struct {
|
||||
uint32_t TRPIDs[8]; // user defined IDs for each TRP
|
||||
uint32_t TRPxAxis[8]; // x-axis values of each TRP
|
||||
uint32_t TRPyAxis[8]; // y-axis values of each TRP
|
||||
uint32_t TRPzAxis[8]; // z-axis values of each TRP
|
||||
uint8_t NumTRPs; // number of TRPs max to 8
|
||||
}positioning_config_rrc_t;
|
||||
|
||||
|
||||
//---NR---(completely change)---------------------
|
||||
typedef struct gNB_RRC_INST_s {
|
||||
|
||||
@@ -471,9 +486,11 @@ typedef struct gNB_RRC_INST_s {
|
||||
|
||||
RB_HEAD(rrc_cuup_tree, nr_rrc_cuup_container_t) cuups; // CU-UPs, indexed by assoc_id
|
||||
size_t num_cuups;
|
||||
|
||||
// Parameter required for positioning
|
||||
positioning_config_rrc_t positioning_config;
|
||||
} gNB_RRC_INST;
|
||||
|
||||
|
||||
#include "nr_rrc_proto.h" //should be put here otherwise compilation error
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2190,9 +2190,6 @@ void rrc_gNB_process_e1_bearer_context_setup_resp(e1ap_bearer_setup_resp_t *resp
|
||||
/* the DRB QoS parameters: we just reuse the ones from the first flow */
|
||||
drb->drb_info.drb_qos = drb->drb_info.flows_mapped_to_drb[0].qos_params;
|
||||
|
||||
/* pass NSSAI info to MAC */
|
||||
drb->nssai = RRC_pduSession->param.nssai;
|
||||
|
||||
nb_drb++;
|
||||
}
|
||||
}
|
||||
@@ -2345,6 +2342,348 @@ static void write_rrc_stats(const gNB_RRC_INST *rrc)
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
// NRPPA DOWNLINK processes
|
||||
static void rrc_CU_process_positioning_information_request(f1ap_positioning_information_req_t *req)
|
||||
{
|
||||
rrc_gNB_ue_context_t *ue_context_p =
|
||||
rrc_gNB_get_ue_context(RC.nrrrc[req->nrppa_msg_info.instance], req->nrppa_msg_info.gNB_ue_ngap_id);
|
||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||
f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
|
||||
|
||||
req->nrppa_msg_info.ue_rnti = UE->rnti;
|
||||
req->gNB_DU_ue_id = ue_data.secondary_ue;
|
||||
req->gNB_CU_ue_id = UE->rrc_ue_id;
|
||||
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[req->nrppa_msg_info.instance];
|
||||
LOG_I(RRC,
|
||||
"Processing Received PositioningInformationRequest gNB_CU_ue_id=%d, gNB_DU_ue_id=%d, rnti= %04x\n",
|
||||
req->gNB_CU_ue_id,
|
||||
req->gNB_DU_ue_id,
|
||||
req->nrppa_msg_info.ue_rnti);
|
||||
rrc->mac_rrc.positioning_information_request(req);
|
||||
}
|
||||
|
||||
static void rrc_CU_process_positioning_activation_request(f1ap_positioning_activation_req_t *req)
|
||||
{
|
||||
rrc_gNB_ue_context_t *ue_context_p =
|
||||
rrc_gNB_get_ue_context(RC.nrrrc[req->nrppa_msg_info.instance], req->nrppa_msg_info.gNB_ue_ngap_id);
|
||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||
f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
|
||||
|
||||
req->nrppa_msg_info.ue_rnti = UE->rnti;
|
||||
req->gNB_DU_ue_id = ue_data.secondary_ue;
|
||||
req->gNB_CU_ue_id = UE->rrc_ue_id;
|
||||
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[req->nrppa_msg_info.instance];
|
||||
LOG_I(RRC,
|
||||
"Processing Received PositioningActivationRequest gNB_CU_ue_id=%d, gNB_DU_ue_id=%d, rnti= %04x\n",
|
||||
req->gNB_CU_ue_id,
|
||||
req->gNB_DU_ue_id,
|
||||
req->nrppa_msg_info.ue_rnti);
|
||||
rrc->mac_rrc.positioning_activation_request(req);
|
||||
}
|
||||
|
||||
static void rrc_CU_process_positioning_deactivation(f1ap_positioning_deactivation_t *req)
|
||||
{
|
||||
rrc_gNB_ue_context_t *ue_context_p =
|
||||
rrc_gNB_get_ue_context(RC.nrrrc[req->nrppa_msg_info.instance], req->nrppa_msg_info.gNB_ue_ngap_id);
|
||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||
f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
|
||||
|
||||
req->nrppa_msg_info.ue_rnti = UE->rnti;
|
||||
req->gNB_DU_ue_id = ue_data.secondary_ue;
|
||||
req->gNB_CU_ue_id = UE->rrc_ue_id;
|
||||
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[req->nrppa_msg_info.instance];
|
||||
LOG_I(RRC,
|
||||
"Processing Received PositioningDeactivationRequest gNB_CU_ue_id=%d, gNB_DU_ue_id=%d, rnti= %04x\n",
|
||||
req->gNB_CU_ue_id,
|
||||
req->gNB_DU_ue_id,
|
||||
req->nrppa_msg_info.ue_rnti);
|
||||
rrc->mac_rrc.positioning_deactivation(req);
|
||||
}
|
||||
|
||||
static void rrc_CU_process_trp_information_request(f1ap_trp_information_req_t *req)
|
||||
{
|
||||
// f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[req->nrppa_msg_info.instance];
|
||||
LOG_I(RRC, "Processing Received TRPInformationRequest transaction_id=%d\n", req->transaction_id);
|
||||
//.plmn.mcc = rrc->configuration.mcc[0],
|
||||
//.plmn.mnc = rrc->configuration.mnc[0],
|
||||
//.plmn.mnc_digit_length = rrc->configuration.mnc_digit_length[0],
|
||||
//.nr_cellid = rrc->nr_cellid,
|
||||
//.servCellId = 0, /* TODO: correct value? */
|
||||
|
||||
rrc->mac_rrc.trp_information_request(req);
|
||||
}
|
||||
|
||||
static void rrc_CU_process_measurement_request(f1ap_measurement_req_t *req)
|
||||
{
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[req->nrppa_msg_info.instance];
|
||||
|
||||
/*rrc_gNB_ue_context_t *ue_context_p =
|
||||
rrc_gNB_get_ue_context(RC.nrrrc[req->nrppa_msg_info.instance], req->nrppa_msg_info.gNB_ue_ngap_id);
|
||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||
// f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
|
||||
req->nrppa_msg_info.ue_rnti = UE->rnti;*/
|
||||
req->nrppa_msg_info.ue_rnti = NON_UE_ASSOCIATED_SRS_DUMMY_RNTI;
|
||||
// req->gNB_DU_ue_id = ue_data.secondary_ue;
|
||||
// req->gNB_CU_ue_id = UE->rrc_ue_id;
|
||||
|
||||
LOG_I(RRC,
|
||||
"Processing Received MeasurementRequest lmf_measurement_id=%d, ran_measurement_id=%d \n",
|
||||
req->lmf_measurement_id,
|
||||
req->ran_measurement_id);
|
||||
rrc->mac_rrc.positioning_measurement_request(req);
|
||||
}
|
||||
|
||||
static void rrc_CU_process_measurement_update(f1ap_measurement_update_t *req)
|
||||
{
|
||||
// rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[req->nrppa_msg_info.instance],
|
||||
// req->nrppa_msg_info.gNB_ue_ngap_id); gNB_RRC_UE_t *UE = &ue_context_p->ue_context; req->nrppa_msg_info.ue_rnti=UE->rnti;
|
||||
// f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[req->nrppa_msg_info.instance];
|
||||
LOG_I(RRC,
|
||||
"Processing Received MeasurementUpdate lmf_measurement_id=%d, ran_measurement_id=%d \n",
|
||||
req->lmf_measurement_id,
|
||||
req->ran_measurement_id);
|
||||
rrc->mac_rrc.positioning_measurement_update(req);
|
||||
}
|
||||
|
||||
static void rrc_CU_process_measurement_abort(f1ap_measurement_abort_t *req)
|
||||
{
|
||||
// rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[req->nrppa_msg_info.instance],
|
||||
// req->nrppa_msg_info.gNB_ue_ngap_id); gNB_RRC_UE_t *UE = &ue_context_p->ue_context; req->nrppa_msg_info.ue_rnti=UE->rnti;
|
||||
// f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[req->nrppa_msg_info.instance];
|
||||
LOG_I(RRC,
|
||||
"Processing Received MeasurementAbort lmf_measurement_id=%d, ran_measurement_id=%d \n",
|
||||
req->lmf_measurement_id,
|
||||
req->ran_measurement_id);
|
||||
rrc->mac_rrc.positioning_measurement_abort(req);
|
||||
}
|
||||
|
||||
// NRPPA UPLINK processes TODO add remaining
|
||||
static void rrc_CU_process_positioning_information_response(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
f1ap_positioning_information_resp_t *resp = &F1AP_POSITIONING_INFORMATION_RESP(msg_p);
|
||||
LOG_I(RRC,
|
||||
"Processing Received PositioningInformationResponse gNB_CU_ue_id=%d, gNB_DU_ue_id=%d \n",
|
||||
resp->gNB_CU_ue_id,
|
||||
resp->gNB_DU_ue_id);
|
||||
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_RRC_GNB, 0, F1AP_POSITIONING_INFORMATION_RESP);
|
||||
f1ap_positioning_information_resp_t *f1ap_msg = &F1AP_POSITIONING_INFORMATION_RESP(msg);
|
||||
/* copy all fields, but reallocate memory buffers! */
|
||||
*f1ap_msg = *resp;
|
||||
f1ap_msg->gNB_CU_ue_id = resp->gNB_CU_ue_id;
|
||||
f1ap_msg->gNB_DU_ue_id = resp->gNB_DU_ue_id;
|
||||
f1ap_msg->nrppa_msg_info.nrppa_transaction_id = resp->nrppa_msg_info.nrppa_transaction_id;
|
||||
f1ap_msg->nrppa_msg_info.instance = resp->nrppa_msg_info.instance;
|
||||
f1ap_msg->nrppa_msg_info.gNB_ue_ngap_id = resp->nrppa_msg_info.gNB_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.amf_ue_ngap_id = resp->nrppa_msg_info.amf_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.ue_rnti = resp->nrppa_msg_info.ue_rnti;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_buffer = resp->nrppa_msg_info.routing_id_buffer;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_length = resp->nrppa_msg_info.routing_id_length;
|
||||
|
||||
itti_send_msg_to_task(TASK_NRPPA, instance, msg);
|
||||
}
|
||||
|
||||
static void rrc_CU_process_positioning_information_failure(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
LOG_I(RRC, "Processing NOT implemented Received PositioningInformationFailure \n");
|
||||
}
|
||||
|
||||
static void rrc_CU_process_positioning_information_update(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
LOG_I(RRC, "Processing NOT implemented Received PositioningInformationUpdate \n");
|
||||
}
|
||||
|
||||
static void rrc_CU_process_positioning_activation_response(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
f1ap_positioning_activation_resp_t *resp = &F1AP_POSITIONING_ACTIVATION_RESP(msg_p);
|
||||
// gNB_RRC_INST *rrc = RC.nrrrc[instance];
|
||||
LOG_I(RRC,
|
||||
"Processing Received PositioningActivationResponse gNB_CU_ue_id=%d, gNB_DU_ue_id=%d \n",
|
||||
resp->gNB_CU_ue_id,
|
||||
resp->gNB_DU_ue_id);
|
||||
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_RRC_GNB, 0, F1AP_POSITIONING_ACTIVATION_RESP);
|
||||
f1ap_positioning_activation_resp_t *f1ap_msg = &F1AP_POSITIONING_ACTIVATION_RESP(msg);
|
||||
/* copy all fields, but reallocate memory buffers! */
|
||||
*f1ap_msg = *resp;
|
||||
f1ap_msg->gNB_CU_ue_id = resp->gNB_CU_ue_id;
|
||||
f1ap_msg->gNB_DU_ue_id = resp->gNB_DU_ue_id;
|
||||
f1ap_msg->nrppa_msg_info.nrppa_transaction_id = resp->nrppa_msg_info.nrppa_transaction_id;
|
||||
f1ap_msg->nrppa_msg_info.instance = resp->nrppa_msg_info.instance;
|
||||
f1ap_msg->nrppa_msg_info.gNB_ue_ngap_id = resp->nrppa_msg_info.gNB_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.amf_ue_ngap_id = resp->nrppa_msg_info.amf_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.ue_rnti = resp->nrppa_msg_info.ue_rnti;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_buffer = resp->nrppa_msg_info.routing_id_buffer;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_length = resp->nrppa_msg_info.routing_id_length;
|
||||
f1ap_msg->system_frame_number=resp->system_frame_number;
|
||||
f1ap_msg->slot_number=resp->slot_number;
|
||||
|
||||
itti_send_msg_to_task(TASK_NRPPA, instance, msg);
|
||||
}
|
||||
|
||||
static void rrc_CU_process_positioning_activation_failure(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
LOG_I(RRC, "Processing NOT implemented Received PositioningActivationFailure \n");
|
||||
}
|
||||
|
||||
static void rrc_CU_process_trp_information_response(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
f1ap_trp_information_resp_t *resp = &F1AP_TRP_INFORMATION_RESP(msg_p);
|
||||
LOG_I(RRC,
|
||||
"Processing Received TRPInformationResponse transaction_id=%d \n",
|
||||
resp->transaction_id);
|
||||
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_RRC_GNB, 0, F1AP_TRP_INFORMATION_RESP);
|
||||
f1ap_trp_information_resp_t *f1ap_msg = &F1AP_TRP_INFORMATION_RESP(msg);
|
||||
/* copy all fields, but reallocate memory buffers! */
|
||||
*f1ap_msg = *resp;
|
||||
f1ap_msg->transaction_id = resp->transaction_id;
|
||||
f1ap_msg->nrppa_msg_info.nrppa_transaction_id = resp->nrppa_msg_info.nrppa_transaction_id;
|
||||
f1ap_msg->nrppa_msg_info.instance = resp->nrppa_msg_info.instance;
|
||||
f1ap_msg->nrppa_msg_info.gNB_ue_ngap_id = resp->nrppa_msg_info.gNB_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.amf_ue_ngap_id = resp->nrppa_msg_info.amf_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.ue_rnti = resp->nrppa_msg_info.ue_rnti;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_buffer = resp->nrppa_msg_info.routing_id_buffer;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_length = resp->nrppa_msg_info.routing_id_length;
|
||||
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[resp->nrppa_msg_info.instance];
|
||||
|
||||
// IE TRP Information List (M)
|
||||
{
|
||||
int nb_of_TRP = rrc->positioning_config.NumTRPs;
|
||||
f1ap_msg->trp_information_list.trp_information_list_length=nb_of_TRP;
|
||||
f1ap_msg->trp_information_list.trp_information_item= malloc(nb_of_TRP*sizeof(f1ap_trp_information_item_t));
|
||||
DevAssert(f1ap_msg->trp_information_list.trp_information_item);
|
||||
f1ap_trp_information_item_t *trp_info_item= f1ap_msg->trp_information_list.trp_information_item;
|
||||
LOG_D(MAC, "Preparing trp information list for NRPPA nb_of_TRP=%d \n", nb_of_TRP);
|
||||
for (int i = 0; i < nb_of_TRP; i++) {
|
||||
trp_info_item->tRPInformation.tRPID=rrc->positioning_config.TRPIDs[i];
|
||||
|
||||
// Preparing tRPInformation IE of TRPInformationList__Member
|
||||
|
||||
int nb_tRPInfoTypes = 2;//rrc->configuration.num_plmn; // TODO it is hard coded
|
||||
f1ap_trp_information_type_response_list_t *rspList =&trp_info_item->tRPInformation.tRPInformationTypeResponseList;
|
||||
rspList->trp_information_type_response_list_length= nb_tRPInfoTypes;
|
||||
rspList->trp_information_type_response_item=malloc(nb_tRPInfoTypes*sizeof(f1ap_trp_information_type_response_item_t));
|
||||
//rspList->trp_information_type_response_item=malloc(nb_tRPInfoTypes*sizeof(f1ap_trp_information_type_response_item_t));
|
||||
DevAssert(rspList->trp_information_type_response_item);
|
||||
f1ap_trp_information_type_response_item_t *rspItem= rspList->trp_information_type_response_item;
|
||||
// Preparing f1ap_TRPInformation_t a list of TRPInformation_item
|
||||
|
||||
// First Type Item nG_RAN_CGI
|
||||
rspItem->present=f1ap_trp_information_type_response_item_pr_nG_RAN_CGI;
|
||||
rspItem->choice.nG_RAN_CGI.nRCellIdentity.buf=calloc(5, sizeof(uint8_t));
|
||||
DevAssert(rspItem->choice.nG_RAN_CGI.nRCellIdentity.buf);
|
||||
//MACRO_GNB_ID_TO_CELL_IDENTITY(rrc->nr_cellid, 0, &rspItem->choice.nG_RAN_CGI.nRCellIdentity);
|
||||
MACRO_GNB_ID_TO_CELL_IDENTITY(rrc->node_id,rrc->nr_cellid, &rspItem->choice.nG_RAN_CGI.nRCellIdentity);
|
||||
//pLMN_Identity; // typedef OCTET_STRING_t F1AP_PLMN_Identity_t;
|
||||
// TODO Adeel the following function causes "double free or corruption (out)" error if we use
|
||||
// malloc(nb_tRPInfoTypes*sizeof(f1ap_trp_information_type_response_item_t)) for nb_tRPInfoTypes>1 this need to reslove this error
|
||||
rspItem->choice.nG_RAN_CGI.pLMN_Identity.buf=calloc(3, sizeof(uint8_t));
|
||||
DevAssert(rspItem->choice.nG_RAN_CGI.pLMN_Identity.buf);
|
||||
MCC_MNC_TO_TBCD(rrc->configuration.mcc[0], rrc->configuration.mnc[0],
|
||||
rrc->configuration.mnc_digit_length[0], &rspItem->choice.nG_RAN_CGI.pLMN_Identity);
|
||||
|
||||
// Second Type item
|
||||
rspItem++;
|
||||
rspItem->present=f1ap_trp_information_type_response_item_pr_geographicalCoordinates;
|
||||
//IE tRPPositionDefinitionType
|
||||
f1ap_trp_position_definition_type_t *trpPosDef= &rspItem->choice.geographicalCoordinates.tRPPositionDefinitionType;
|
||||
trpPosDef->present= f1ap_trp_position_definition_type_pr_referenced;
|
||||
//IE referencePoint
|
||||
trpPosDef->choice.referenced.referencePoint.present=f1ap_reference_point_pr_coordinateID;
|
||||
trpPosDef->choice.referenced.referencePoint.choice.coordinateID= 2;
|
||||
|
||||
//IE referencePointType
|
||||
trpPosDef->choice.referenced.referencePointType.present=f1ap_trp_reference_point_type_pr_tRPPositionRelativeCartesian;
|
||||
f1ap_trp_reference_point_type_u *RefPoTy= &trpPosDef->choice.referenced.referencePointType.choice;
|
||||
RefPoTy->tRPPositionRelativeCartesian.xvalue=rrc->positioning_config.TRPxAxis[i];
|
||||
RefPoTy->tRPPositionRelativeCartesian.xYZunit=0; // unit 0= millimeter
|
||||
RefPoTy->tRPPositionRelativeCartesian.yvalue=rrc->positioning_config.TRPyAxis[i];
|
||||
RefPoTy->tRPPositionRelativeCartesian.zvalue=rrc->positioning_config.TRPzAxis[i];
|
||||
RefPoTy->tRPPositionRelativeCartesian.locationUncertainty.horizontalConfidence=0;
|
||||
RefPoTy->tRPPositionRelativeCartesian.locationUncertainty.horizontalUncertainty=0;
|
||||
RefPoTy->tRPPositionRelativeCartesian.locationUncertainty.verticalConfidence=0;
|
||||
RefPoTy->tRPPositionRelativeCartesian.locationUncertainty.verticalUncertainty=0;
|
||||
|
||||
//IE dLPRSResourceCoordinates; // optional
|
||||
//rspItem->choice.geographicalCoordinates.dLPRSResourceCoordinates; // optional
|
||||
|
||||
// TODO adeel other items possible
|
||||
|
||||
if (i < nb_of_TRP-1){
|
||||
trp_info_item++;
|
||||
}
|
||||
} // for (int i = 0; i < nb_of_TRP; i++)
|
||||
} // IE Information List */
|
||||
|
||||
itti_send_msg_to_task(TASK_NRPPA, instance, msg);
|
||||
}
|
||||
|
||||
static void rrc_CU_process_trp_information_failure(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
LOG_I(RRC, "Processing NOT implemented Received TRPInformationFailure \n");
|
||||
}
|
||||
|
||||
static void rrc_CU_process_measurement_response(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
// TODO: rebuild ITTI message with RRC task ID
|
||||
f1ap_measurement_resp_t *resp = &F1AP_MEASUREMENT_RESP(msg_p);
|
||||
// gNB_RRC_INST *rrc = RC.nrrrc[instance];
|
||||
LOG_I(RRC,
|
||||
"Processing Received MeasurementResponse lmf_measurement_id=%d, ran_measurement_id=%d \n",
|
||||
resp->lmf_measurement_id,
|
||||
resp->ran_measurement_id);
|
||||
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_RRC_GNB, 0, F1AP_MEASUREMENT_RESP);
|
||||
f1ap_measurement_resp_t *f1ap_msg = &F1AP_MEASUREMENT_RESP(msg);
|
||||
/* copy all fields, but reallocate memory buffers! */
|
||||
*f1ap_msg = *resp;
|
||||
f1ap_msg->transaction_id = resp->transaction_id;
|
||||
f1ap_msg->lmf_measurement_id = resp->lmf_measurement_id;
|
||||
f1ap_msg->ran_measurement_id = resp->ran_measurement_id;
|
||||
f1ap_msg->nrppa_msg_info.nrppa_transaction_id = resp->nrppa_msg_info.nrppa_transaction_id;
|
||||
f1ap_msg->nrppa_msg_info.instance = resp->nrppa_msg_info.instance;
|
||||
f1ap_msg->nrppa_msg_info.gNB_ue_ngap_id = resp->nrppa_msg_info.gNB_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.amf_ue_ngap_id = resp->nrppa_msg_info.amf_ue_ngap_id;
|
||||
f1ap_msg->nrppa_msg_info.ue_rnti = resp->nrppa_msg_info.ue_rnti;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_buffer = resp->nrppa_msg_info.routing_id_buffer;
|
||||
f1ap_msg->nrppa_msg_info.routing_id_length = resp->nrppa_msg_info.routing_id_length;
|
||||
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[resp->nrppa_msg_info.instance];
|
||||
int nb_meas_TRPs = f1ap_msg->pos_measurement_result_list.pos_measurement_result_list_length;
|
||||
f1ap_pos_measurement_result_list_item_t *meas_item = f1ap_msg->pos_measurement_result_list.pos_measurement_result_list_item;
|
||||
LOG_D(RRC, "Assigning user defined TRP IDs to each TOA measurement for # of TRPs %d \n", nb_meas_TRPs);
|
||||
for (int i = 0; i < nb_meas_TRPs; i++) {
|
||||
meas_item->tRPID =rrc->positioning_config.TRPIDs[i];
|
||||
if (i < nb_meas_TRPs - 1) {
|
||||
meas_item++;
|
||||
}
|
||||
}
|
||||
itti_send_msg_to_task(TASK_NRPPA, instance, msg);
|
||||
}
|
||||
|
||||
static void rrc_CU_process_measurement_failure(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
LOG_I(RRC, "Processing NOT implemented Received MeasurementFailure \n");
|
||||
}
|
||||
|
||||
static void rrc_CU_process_measurement_report(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
LOG_I(RRC, "Processing NOT implemented Received MeasurementReport \n");
|
||||
}
|
||||
|
||||
static void rrc_CU_process_measurement_failure_ind(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
LOG_I(RRC, "Processing NOT implemented Received MeasurementFailureIndication \n");
|
||||
}
|
||||
|
||||
void *rrc_gnb_task(void *args_p) {
|
||||
MessageDef *msg_p;
|
||||
instance_t instance;
|
||||
@@ -2466,6 +2805,80 @@ void *rrc_gnb_task(void *args_p) {
|
||||
rrc_gNB_process_f1_du_configuration_update(&F1AP_GNB_DU_CONFIGURATION_UPDATE(msg_p), msg_p->ittiMsgHeader.originInstance);
|
||||
break;
|
||||
|
||||
// F1AP NRPPA DOWNLINK RELATED PROCESSES
|
||||
case F1AP_POSITIONING_INFORMATION_REQ: // ADEEL TODO add other NRPPA messages
|
||||
rrc_CU_process_positioning_information_request(&F1AP_POSITIONING_INFORMATION_REQ(msg_p));
|
||||
break;
|
||||
|
||||
case F1AP_POSITIONING_ACTIVATION_REQ:
|
||||
rrc_CU_process_positioning_activation_request(&F1AP_POSITIONING_ACTIVATION_REQ(msg_p));
|
||||
break;
|
||||
|
||||
case F1AP_POSITIONING_DEACTIVATION:
|
||||
rrc_CU_process_positioning_deactivation(&F1AP_POSITIONING_DEACTIVATION(msg_p));
|
||||
break;
|
||||
|
||||
case F1AP_TRP_INFORMATION_REQ:
|
||||
rrc_CU_process_trp_information_request(&F1AP_TRP_INFORMATION_REQ(msg_p));
|
||||
break;
|
||||
|
||||
case F1AP_MEASUREMENT_REQ:
|
||||
rrc_CU_process_measurement_request(&F1AP_MEASUREMENT_REQ(msg_p));
|
||||
break;
|
||||
|
||||
case F1AP_MEASUREMENT_UPDATE:
|
||||
rrc_CU_process_measurement_update(&F1AP_MEASUREMENT_UPDATE(msg_p));
|
||||
break;
|
||||
|
||||
case F1AP_MEASUREMENT_ABORT:
|
||||
rrc_CU_process_measurement_abort(&F1AP_MEASUREMENT_ABORT(msg_p));
|
||||
break;
|
||||
|
||||
// F1AP NRPPA UPLINK RELATED PROCESSES
|
||||
case F1AP_POSITIONING_INFORMATION_RESP:
|
||||
rrc_CU_process_positioning_information_response(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_POSITIONING_INFORMATION_FAILURE:
|
||||
rrc_CU_process_positioning_information_failure(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_POSITIONING_INFORMATION_UPDATE:
|
||||
rrc_CU_process_positioning_information_update(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_POSITIONING_ACTIVATION_RESP:
|
||||
rrc_CU_process_positioning_activation_response(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_POSITIONING_ACTIVATION_FAILURE:
|
||||
rrc_CU_process_positioning_activation_failure(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_TRP_INFORMATION_RESP:
|
||||
rrc_CU_process_trp_information_response(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_TRP_INFORMATION_FAILURE:
|
||||
rrc_CU_process_trp_information_failure(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_MEASUREMENT_RESP:
|
||||
rrc_CU_process_measurement_response(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_MEASUREMENT_FAILURE:
|
||||
rrc_CU_process_measurement_failure(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_MEASUREMENT_REPORT:
|
||||
rrc_CU_process_measurement_report(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_MEASUREMENT_FAILURE_IND:
|
||||
rrc_CU_process_measurement_failure_ind(msg_p, instance);
|
||||
break;
|
||||
|
||||
/* Messages from X2AP */
|
||||
case X2AP_ENDC_SGNB_ADDITION_REQ:
|
||||
LOG_I(NR_RRC, "Received ENDC sgNB addition request from X2AP \n");
|
||||
@@ -2673,7 +3086,6 @@ int rrc_gNB_generate_pcch_msg(sctp_assoc_t assoc_id, const NR_SIB1_t *sib1, uint
|
||||
LOG_E(RRC, "[gNB %ld] In rrc_gNB_generate_pcch_msg: pfoffset error (pfoffset %d)\n",
|
||||
instance, sib1->servingCellConfigCommon->downlinkConfigCommon.pcch_Config.nAndPagingFrameOffset.present);
|
||||
return (-1);
|
||||
|
||||
}
|
||||
|
||||
switch (sib1->servingCellConfigCommon->downlinkConfigCommon.pcch_Config.ns) {
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
* @ingroup _ngap
|
||||
*/
|
||||
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -57,6 +56,7 @@
|
||||
#include "ngap_gNB_itti_messaging.h"
|
||||
|
||||
#include "ngap_gNB_ue_context.h" // test, to be removed
|
||||
#include "ngap_gNB_NRPPa_transport_procedures.h"
|
||||
|
||||
#include "assertions.h"
|
||||
#include "conversions.h"
|
||||
@@ -118,7 +118,7 @@ static void ngap_gNB_register_amf(ngap_gNB_instance_t *instance_p,
|
||||
/* Create new AMF descriptor */
|
||||
ngap_amf_data_p = calloc(1, sizeof(*ngap_amf_data_p));
|
||||
DevAssert(ngap_amf_data_p != NULL);
|
||||
ngap_amf_data_p->cnx_id = ngap_gNB_fetch_add_global_cnx_id();
|
||||
ngap_amf_data_p->cnx_id = ngap_gNB_fetch_add_global_cnx_id();
|
||||
sctp_new_association_req_p->ulp_cnx_id = ngap_amf_data_p->cnx_id;
|
||||
ngap_amf_data_p->assoc_id = -1;
|
||||
ngap_amf_data_p->broadcast_plmn_num = broadcast_plmn_num;
|
||||
@@ -177,7 +177,7 @@ void ngap_gNB_handle_register_gNB(instance_t instance, ngap_register_gnb_req_t *
|
||||
new_instance->gNB_id = ngap_register_gNB->gNB_id;
|
||||
new_instance->cell_type = ngap_register_gNB->cell_type;
|
||||
new_instance->tac = ngap_register_gNB->tac;
|
||||
|
||||
|
||||
memcpy(&new_instance->gNB_ng_ip,
|
||||
&ngap_register_gNB->gnb_ip_address,
|
||||
sizeof(ngap_register_gNB->gnb_ip_address));
|
||||
@@ -356,6 +356,14 @@ void *ngap_gNB_process_itti_msg(void *notUsed) {
|
||||
ngap_gNB_pdusession_release_resp(instance, &NGAP_PDUSESSION_RELEASE_RESPONSE(received_msg));
|
||||
break;
|
||||
|
||||
case NGAP_UPLINKUEASSOCIATEDNRPPA:
|
||||
ngap_gNB_UplinkUEAssociatedNRPPaTransport(instance, &NGAP_UPLINKUEASSOCIATEDNRPPA(received_msg));
|
||||
break;
|
||||
|
||||
case NGAP_UPLINKNONUEASSOCIATEDNRPPA:
|
||||
ngap_gNB_UplinkNonUEAssociatedNRPPaTransport(instance, &NGAP_UPLINKNONUEASSOCIATEDNRPPA(received_msg));
|
||||
break;
|
||||
|
||||
default:
|
||||
NGAP_ERROR("Received unhandled message: %d:%s\n", ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg));
|
||||
break;
|
||||
@@ -387,15 +395,15 @@ static int ngap_gNB_generate_ng_setup_request(
|
||||
ngap_gNB_amf_data_t *ngap_amf_data_p)
|
||||
//-----------------------------------------------------------------------------
|
||||
{
|
||||
NGAP_NGAP_PDU_t pdu;
|
||||
NGAP_NGSetupRequest_t *out = NULL;
|
||||
NGAP_NGSetupRequestIEs_t *ie = NULL;
|
||||
NGAP_SupportedTAItem_t *ta = NULL;
|
||||
NGAP_BroadcastPLMNItem_t *plmn = NULL;
|
||||
NGAP_SliceSupportItem_t *ssi = NULL;
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t len = 0;
|
||||
int ret = 0;
|
||||
NGAP_NGAP_PDU_t pdu;
|
||||
NGAP_NGSetupRequest_t *out = NULL;
|
||||
NGAP_NGSetupRequestIEs_t *ie = NULL;
|
||||
NGAP_SupportedTAItem_t *ta = NULL;
|
||||
NGAP_BroadcastPLMNItem_t *plmn = NULL;
|
||||
NGAP_SliceSupportItem_t *ssi = NULL;
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t len = 0;
|
||||
int ret = 0;
|
||||
DevAssert(instance_p != NULL);
|
||||
DevAssert(ngap_amf_data_p != NULL);
|
||||
ngap_amf_data_p->state = NGAP_GNB_STATE_WAITING;
|
||||
@@ -476,7 +484,7 @@ static int ngap_gNB_generate_ng_setup_request(
|
||||
asn1cSeqAdd(&ie->value.choice.SupportedTAList.list, ta);
|
||||
}
|
||||
asn1cSeqAdd(&out->protocolIEs.list, ie);
|
||||
|
||||
|
||||
/* mandatory */
|
||||
ie = (NGAP_NGSetupRequestIEs_t *)calloc(1, sizeof(NGAP_NGSetupRequestIEs_t));
|
||||
ie->id = NGAP_ProtocolIE_ID_id_DefaultPagingDRX;
|
||||
@@ -485,7 +493,6 @@ static int ngap_gNB_generate_ng_setup_request(
|
||||
ie->value.choice.PagingDRX = instance_p->default_drx;
|
||||
asn1cSeqAdd(&out->protocolIEs.list, ie);
|
||||
|
||||
|
||||
if (ngap_gNB_encode_pdu(&pdu, &buffer, &len) < 0) {
|
||||
NGAP_ERROR("Failed to encode NG setup request\n");
|
||||
return -1;
|
||||
@@ -495,7 +502,3 @@ static int ngap_gNB_generate_ng_setup_request(
|
||||
ngap_gNB_itti_send_sctp_data_req(instance_p->instance, ngap_amf_data_p->assoc_id, buffer, len, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
321
openair3/NGAP/ngap_gNB_NRPPa_transport_procedures.c
Normal file
321
openair3/NGAP/ngap_gNB_NRPPa_transport_procedures.c
Normal file
@@ -0,0 +1,321 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file ngap_gNB_NRPPa_transport_procedures.c
|
||||
* \brief NGAP gNb procedure handler
|
||||
* \author Adeel Malik
|
||||
* \date 2023
|
||||
* \email: adeel.malik@eurecom.fr
|
||||
* \version 1.0
|
||||
* @ingroup _ngap
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "assertions.h"
|
||||
#include "conversions.h"
|
||||
|
||||
#include "intertask_interface.h"
|
||||
|
||||
#include "ngap_common.h"
|
||||
#include "ngap_gNB_defs.h"
|
||||
#include "ngap_gNB_itti_messaging.h"
|
||||
#include "ngap_gNB_encoder.h"
|
||||
#include "ngap_gNB_nnsf.h"
|
||||
#include "ngap_gNB_ue_context.h"
|
||||
#include "ngap_gNB_management_procedures.h"
|
||||
|
||||
#include "ngap_gNB_NRPPa_transport_procedures.h"
|
||||
|
||||
// UPLINK UE ASSOCIATED NRPPA TRANSPORT (9.2.9.2 of TS 38.413 Version 16.0.0.0 Release 16)
|
||||
int ngap_gNB_UplinkUEAssociatedNRPPaTransport(instance_t instance, ngap_UplinkUEAssociatedNRPPa_t *UlNRPPaMsg)
|
||||
{
|
||||
LOG_I(NGAP, "Initiating ngap_gNB_UplinkUEAssociatedNRPPaTransport \n");
|
||||
DevAssert(UlNRPPaMsg != NULL);
|
||||
struct ngap_gNB_ue_context_s *ue_context_p = NULL;
|
||||
ngap_gNB_instance_t *ngap_gNB_instance_p = NULL;
|
||||
|
||||
/* Retrieve the NGAP gNB instance associated with Mod_id */
|
||||
ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
|
||||
DevAssert(ngap_gNB_instance_p != NULL);
|
||||
|
||||
if ((ue_context_p = ngap_get_ue_context(UlNRPPaMsg->gNB_ue_ngap_id)) == NULL) {
|
||||
/* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
|
||||
NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: %08x\n", UlNRPPaMsg->gNB_ue_ngap_id);
|
||||
return -1;
|
||||
}
|
||||
/* Prepare the NGAP message to encode */
|
||||
NGAP_NGAP_PDU_t pdu ={0};
|
||||
// IE: 9.3.1.1 Message Type UplinkUEAssociatedNRPPaTransport
|
||||
memset(&pdu, 0, sizeof(pdu));
|
||||
pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
|
||||
asn1cCalloc(pdu.choice.initiatingMessage, head);
|
||||
head->procedureCode = NGAP_ProcedureCode_id_UplinkUEAssociatedNRPPaTransport;
|
||||
head->criticality = NGAP_Criticality_ignore;
|
||||
head->value.present = NGAP_InitiatingMessage__value_PR_UplinkUEAssociatedNRPPaTransport;
|
||||
NGAP_UplinkUEAssociatedNRPPaTransport_t *out = &head->value.choice.UplinkUEAssociatedNRPPaTransport;
|
||||
|
||||
// IE: 9.3.3.1 AMF UE NGAP ID /* mandatory */
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NGAP_UplinkUEAssociatedNRPPaTransportIEs_t, ie);
|
||||
ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
|
||||
ie->criticality = NGAP_Criticality_reject;
|
||||
ie->value.present = NGAP_UplinkUEAssociatedNRPPaTransportIEs__value_PR_AMF_UE_NGAP_ID;
|
||||
asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
|
||||
}
|
||||
// IE: 9.3.3.2 RAN UE NGAP ID /* mandatory */
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NGAP_UplinkUEAssociatedNRPPaTransportIEs_t, ie);
|
||||
ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
|
||||
ie->criticality = NGAP_Criticality_reject;
|
||||
ie->value.present = NGAP_UplinkUEAssociatedNRPPaTransportIEs__value_PR_RAN_UE_NGAP_ID;
|
||||
ie->value.choice.RAN_UE_NGAP_ID = ue_context_p->gNB_ue_ngap_id;
|
||||
}
|
||||
// IE: 9.3.3.14 NRPPa-PDU /* mandatory */
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NGAP_UplinkUEAssociatedNRPPaTransportIEs_t, ie);
|
||||
ie->id = NGAP_ProtocolIE_ID_id_NRPPa_PDU;
|
||||
ie->criticality = NGAP_Criticality_reject;
|
||||
ie->value.present = NGAP_UplinkUEAssociatedNRPPaTransportIEs__value_PR_NRPPa_PDU;
|
||||
ie->value.choice.NRPPa_PDU.buf = UlNRPPaMsg->nrppa_pdu.buffer;
|
||||
ie->value.choice.NRPPa_PDU.size = UlNRPPaMsg->nrppa_pdu.length;
|
||||
}
|
||||
// IE: 9.3.3.13 Routing ID /* mandatory */
|
||||
/* TODO get Routing ID from downlink*/
|
||||
// store this routing ID in
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NGAP_UplinkUEAssociatedNRPPaTransportIEs_t, ie);
|
||||
ie->id = NGAP_ProtocolIE_ID_id_RoutingID;
|
||||
ie->criticality = NGAP_Criticality_reject;
|
||||
ie->value.present = NGAP_UplinkUEAssociatedNRPPaTransportIEs__value_PR_RoutingID;
|
||||
ie->value.choice.RoutingID.buf = UlNRPPaMsg->routing_id.buffer;
|
||||
ie->value.choice.RoutingID.size = UlNRPPaMsg->routing_id.length;
|
||||
}
|
||||
/* Encode NGAP message */
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t length = 0;
|
||||
if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
NGAP_ERROR("Failed to encode Uplink UE Associated NRPPa Transport\n");
|
||||
/* Encode procedure has failed... */
|
||||
return -1;
|
||||
}
|
||||
LOG_I(NGAP, "Sending sctp_data_req for ngap_gNB_UplinkUEAssociatedNRPPaTransport \n");
|
||||
/* UE associated signalling -> use the allocated stream */
|
||||
ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
|
||||
ue_context_p->amf_ref->assoc_id,
|
||||
buffer,
|
||||
length,
|
||||
ue_context_p->tx_stream);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// UPLINK NON UE ASSOCIATED NRPPA TRANSPORT (9.2.9.4 of TS 38.413 Version 16.0.0.0 Release 16)
|
||||
int ngap_gNB_UplinkNonUEAssociatedNRPPaTransport(instance_t instance, ngap_UplinkNonUEAssociatedNRPPa_t *UlNRPPaMsg)
|
||||
{
|
||||
LOG_I(NGAP, "Initiating ngap_gNB_UplinkNonUEAssociatedNRPPaTransport \n");
|
||||
DevAssert(UlNRPPaMsg != NULL);
|
||||
|
||||
/* Retrieve the NGAP gNB instance associated with Mod_id */
|
||||
ngap_gNB_instance_t *ngap_gNB_instance_p = NULL;
|
||||
ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
|
||||
DevAssert(ngap_gNB_instance_p != NULL);
|
||||
|
||||
/* Retrieve the NGAP gNB amf data */
|
||||
ngap_gNB_amf_data_t *amf_desc_p = NULL;
|
||||
amf_desc_p = ngap_gNB_get_AMF_from_instance(ngap_gNB_instance_p);
|
||||
DevAssert(amf_desc_p != NULL);
|
||||
|
||||
/* Prepare the NGAP message to encode */
|
||||
NGAP_NGAP_PDU_t pdu ={0};
|
||||
|
||||
// IE: 9.3.1.1 Message Type UplinkNonUEAssociatedNRPPaTransport
|
||||
memset(&pdu, 0, sizeof(pdu));
|
||||
pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
|
||||
asn1cCalloc(pdu.choice.initiatingMessage, head);
|
||||
head->procedureCode = NGAP_ProcedureCode_id_UplinkNonUEAssociatedNRPPaTransport;
|
||||
head->criticality = NGAP_Criticality_ignore;
|
||||
head->value.present = NGAP_InitiatingMessage__value_PR_UplinkNonUEAssociatedNRPPaTransport;
|
||||
|
||||
NGAP_UplinkNonUEAssociatedNRPPaTransport_t *out = &head->value.choice.UplinkNonUEAssociatedNRPPaTransport;
|
||||
|
||||
// IE: 9.3.3.13 Routing ID /* mandatory */
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NGAP_UplinkNonUEAssociatedNRPPaTransportIEs_t, ie);
|
||||
ie->id = NGAP_ProtocolIE_ID_id_RoutingID;
|
||||
ie->criticality = NGAP_Criticality_reject;
|
||||
ie->value.present = NGAP_UplinkNonUEAssociatedNRPPaTransportIEs__value_PR_RoutingID;
|
||||
ie->value.choice.RoutingID.buf = UlNRPPaMsg->routing_id.buffer;
|
||||
ie->value.choice.RoutingID.size = UlNRPPaMsg->routing_id.length;
|
||||
}
|
||||
|
||||
// IE: 9.3.3.14 NRPPa-PDU /* mandatory */
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NGAP_UplinkNonUEAssociatedNRPPaTransportIEs_t, ie);
|
||||
ie->id = NGAP_ProtocolIE_ID_id_NRPPa_PDU;
|
||||
ie->criticality = NGAP_Criticality_reject;
|
||||
ie->value.present = NGAP_UplinkNonUEAssociatedNRPPaTransportIEs__value_PR_NRPPa_PDU;
|
||||
ie->value.choice.NRPPa_PDU.buf = UlNRPPaMsg->nrppa_pdu.buffer;
|
||||
ie->value.choice.NRPPa_PDU.size = UlNRPPaMsg->nrppa_pdu.length;
|
||||
}
|
||||
|
||||
/* Encode NGAP message */
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t length = 0;
|
||||
if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
NGAP_ERROR("Failed to encode Uplink Non UE Associated NRPPa Transport\n");
|
||||
/* Encode procedure has failed... */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Non UE-Associated signalling -> stream = 0 */
|
||||
LOG_I(NGAP, "Sending sctp_data_req for ngap_gNB_UplinkNonUEAssociatedNRPPaTransport (assoc_id %d)\n",amf_desc_p->assoc_id);
|
||||
ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance, amf_desc_p->assoc_id, buffer, length, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// handel DOWNLINK UE ASSOCIATED NRPPA TRANSPORT (9.2.9.1 of TS 38.413 Version 16.0.0.0 Release 16)
|
||||
int ngap_gNB_handle_DownlinkUEAssociatedNRPPaTransport(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu)
|
||||
{
|
||||
DevAssert(pdu != NULL);
|
||||
ngap_gNB_amf_data_t *amf_desc_p = NULL;
|
||||
|
||||
if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
|
||||
NGAP_ERROR("[SCTP %d] Received NRPPa downlink message for non existing AMF context\n", assoc_id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ngap_gNB_instance_t *ngap_gNB_instance = NULL;
|
||||
ngap_gNB_instance = amf_desc_p->ngap_gNB_instance;
|
||||
|
||||
/* Prepare the NGAP message for NRPPA */
|
||||
NGAP_DownlinkUEAssociatedNRPPaTransport_t *container = NULL;
|
||||
NGAP_DownlinkUEAssociatedNRPPaTransportIEs_t *ie = NULL;
|
||||
|
||||
// IE: 9.3.1.1 Message Type
|
||||
container = &pdu->choice.initiatingMessage->value.choice.DownlinkUEAssociatedNRPPaTransport;
|
||||
|
||||
// IE: 9.3.3.1 AMF UE NGAP ID
|
||||
uint64_t amf_ue_ngap_id;
|
||||
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkUEAssociatedNRPPaTransportIEs_t,
|
||||
ie,
|
||||
container,
|
||||
NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID,
|
||||
true);
|
||||
asn_INTEGER2ulong(&(ie->value.choice.AMF_UE_NGAP_ID), &amf_ue_ngap_id);
|
||||
|
||||
// IE: 9.3.3.2 RAN UE NGAP ID
|
||||
NGAP_RAN_UE_NGAP_ID_t gnb_ue_ngap_id;
|
||||
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkUEAssociatedNRPPaTransportIEs_t,
|
||||
ie,
|
||||
container,
|
||||
NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID,
|
||||
true);
|
||||
gnb_ue_ngap_id = ie->value.choice.RAN_UE_NGAP_ID;
|
||||
|
||||
|
||||
ngap_gNB_ue_context_t *ue_desc_p = NULL;
|
||||
if ((ue_desc_p = ngap_get_ue_context(gnb_ue_ngap_id)) == NULL) {
|
||||
NGAP_ERROR("[SCTP %d] Received NRPPa downlink message for non existing UE context gNB_UE_NGAP_ID: 0x%lx\n",
|
||||
assoc_id,
|
||||
gnb_ue_ngap_id);
|
||||
return -1;
|
||||
}
|
||||
/* Is it the first outcome of the AMF for this UE ? If so store the amf
|
||||
* UE ngap id.
|
||||
*/
|
||||
if (ue_desc_p->amf_ue_ngap_id == 0) {
|
||||
ue_desc_p->amf_ue_ngap_id = amf_ue_ngap_id;
|
||||
} else {
|
||||
/* We already have a amf ue ngap id check the received is the same */
|
||||
if (ue_desc_p->amf_ue_ngap_id != amf_ue_ngap_id) {
|
||||
NGAP_ERROR("[SCTP %d] Mismatch in AMF UE NGAP ID (0x%lx != 0x%" PRIx64 "\n",
|
||||
assoc_id,
|
||||
amf_ue_ngap_id,
|
||||
(uint64_t)ue_desc_p->amf_ue_ngap_id);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// IE: 9.3.3.13 Routing ID
|
||||
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkUEAssociatedNRPPaTransportIEs_t, ie, container, NGAP_ProtocolIE_ID_id_RoutingID, true);
|
||||
uint8_t *routingId_buffer = ie->value.choice.RoutingID.buf;
|
||||
uint32_t routingId_buffer_length = ie->value.choice.RoutingID.size;
|
||||
|
||||
// IE: 9.3.3.14 NRPPa-PDU
|
||||
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkUEAssociatedNRPPaTransportIEs_t, ie, container, NGAP_ProtocolIE_ID_id_NRPPa_PDU, true);
|
||||
uint8_t *nrppa_pdu_buffer = ie->value.choice.NRPPa_PDU.buf;
|
||||
uint32_t nrppa_pdu_length = ie->value.choice.NRPPa_PDU.size;
|
||||
|
||||
/* Forward the NRPPA PDU to NRPPA */
|
||||
ngap_gNB_itti_send_DownlinkUEAssociatedNRPPa(ngap_gNB_instance->instance,
|
||||
gnb_ue_ngap_id,
|
||||
amf_ue_ngap_id,
|
||||
routingId_buffer,
|
||||
routingId_buffer_length,
|
||||
nrppa_pdu_buffer,
|
||||
nrppa_pdu_length);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// DOWNLINK NON UE ASSOCIATED NRPPA TRANSPORT (9.2.9.3 of TS 38.413 Version 16.0.0.0 Release 16)
|
||||
int ngap_gNB_handle_DownlinkNonUEAssociatedNRPPaTransport(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu)
|
||||
{
|
||||
DevAssert(pdu != NULL);
|
||||
ngap_gNB_amf_data_t *amf_desc_p = NULL;
|
||||
|
||||
if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
|
||||
NGAP_ERROR("[SCTP %d] Received NRPPa downlink message for non existing AMF context\n", assoc_id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ngap_gNB_instance_t *ngap_gNB_instance = NULL;
|
||||
ngap_gNB_instance = amf_desc_p->ngap_gNB_instance;
|
||||
|
||||
/* Prepare the NGAP message to forward to NRPPA */
|
||||
NGAP_DownlinkNonUEAssociatedNRPPaTransport_t *container;
|
||||
NGAP_DownlinkNonUEAssociatedNRPPaTransportIEs_t *ie;
|
||||
// IE: 9.3.1.1 Message Type
|
||||
container = &pdu->choice.initiatingMessage->value.choice.DownlinkNonUEAssociatedNRPPaTransport;
|
||||
|
||||
// IE: 9.3.3.13 Routing ID
|
||||
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkNonUEAssociatedNRPPaTransportIEs_t, ie, container, NGAP_ProtocolIE_ID_id_RoutingID, true);
|
||||
uint8_t *routingId_buffer = ie->value.choice.RoutingID.buf;
|
||||
uint32_t routingId_buffer_length = ie->value.choice.RoutingID.size;
|
||||
|
||||
// IE: 9.3.3.14 NRPPa-PDU
|
||||
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkNonUEAssociatedNRPPaTransportIEs_t, ie, container, NGAP_ProtocolIE_ID_id_NRPPa_PDU, true);
|
||||
uint8_t *nrppa_pdu_buffer = ie->value.choice.NRPPa_PDU.buf;
|
||||
uint32_t nrppa_pdu_length = ie->value.choice.NRPPa_PDU.size;
|
||||
|
||||
/* Forward the NRPPA PDU to NRPPA */
|
||||
// ngap_gNB_itti_send_DownlinkNonUEAssociatedNRPPa(ngap_gNB_instance->instance, ie->value.choice.RoutingID.buf,
|
||||
// ie->value.choice.RoutingID.size, ie->value.choice.NRPPa_PDU.buf, ie->value.choice.NRPPa_PDU.size); //ad**l todo
|
||||
ngap_gNB_itti_send_DownlinkNonUEAssociatedNRPPa(ngap_gNB_instance->instance,
|
||||
routingId_buffer,
|
||||
routingId_buffer_length,
|
||||
nrppa_pdu_buffer,
|
||||
nrppa_pdu_length); // ad**l todo
|
||||
|
||||
return 0;
|
||||
}
|
||||
48
openair3/NGAP/ngap_gNB_NRPPa_transport_procedures.h
Normal file
48
openair3/NGAP/ngap_gNB_NRPPa_transport_procedures.h
Normal file
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file ngap_gNB_NRPPa_transport_procedures.h
|
||||
* \brief NGAP gNB NRPPa transport procedures
|
||||
* \author Adeel Malik
|
||||
* \date 2023
|
||||
* \email: adeel.malik@eurecom.fr
|
||||
* \version 1.0
|
||||
* @ingroup _ngap
|
||||
*/
|
||||
|
||||
#ifndef NGAP_GNB_NRPPA_PROCEDURES_H_
|
||||
#define NGAP_GNB_NRPPA_PROCEDURES_H_
|
||||
|
||||
// UPLINK UE ASSOCIATED NRPPA TRANSPORT (9.2.9.2 of TS 38.413 Version 16.0.0.0 Release 16)
|
||||
int ngap_gNB_UplinkUEAssociatedNRPPaTransport(instance_t instance, ngap_UplinkUEAssociatedNRPPa_t *ngap_UplinkUEAssociatedNRPPa_p);
|
||||
|
||||
// UPLINK NON UE ASSOCIATED NRPPA TRANSPORT (9.2.9.4 of TS 38.413 Version 16.0.0.0 Release 16)
|
||||
int ngap_gNB_UplinkNonUEAssociatedNRPPaTransport(instance_t instance,
|
||||
ngap_UplinkNonUEAssociatedNRPPa_t *ngap_UplinkNonUEAssociatedNRPPa_p);
|
||||
|
||||
// DOWNLINK UE ASSOCIATED NRPPA TRANSPORT (9.2.9.1 of TS 38.413 Version 16.0.0.0 Release 16)
|
||||
int ngap_gNB_handle_DownlinkUEAssociatedNRPPaTransport(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu);
|
||||
// sctp_assoc_t instead of uint32_t check
|
||||
|
||||
// DOWNLINK NON UE ASSOCIATED NRPPA TRANSPORT (9.2.9.3 of TS 38.413 Version 16.0.0.0 Release 16)
|
||||
int ngap_gNB_handle_DownlinkNonUEAssociatedNRPPaTransport(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu);
|
||||
|
||||
#endif /* NGAP_GNB_NRPPA_PROCEDURES_H_ */
|
||||
@@ -27,7 +27,6 @@
|
||||
* \version 0.1
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "assertions.h"
|
||||
@@ -37,11 +36,12 @@
|
||||
#include "ngap_common.h"
|
||||
#include "ngap_gNB_decoder.h"
|
||||
|
||||
static int ngap_gNB_decode_initiating_message(NGAP_NGAP_PDU_t *pdu) {
|
||||
asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
|
||||
static int ngap_gNB_decode_initiating_message(NGAP_NGAP_PDU_t *pdu)
|
||||
{
|
||||
asn_encode_to_new_buffer_result_t res = {NULL, {0, NULL, NULL}};
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
switch(pdu->choice.initiatingMessage->procedureCode) {
|
||||
switch (pdu->choice.initiatingMessage->procedureCode) {
|
||||
case NGAP_ProcedureCode_id_DownlinkNASTransport:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
@@ -87,22 +87,31 @@ static int ngap_gNB_decode_initiating_message(NGAP_NGAP_PDU_t *pdu) {
|
||||
NGAP_INFO("TODO ErrorIndication initiating message\n");
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_DownlinkUEAssociatedNRPPaTransport:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_DownlinkNonUEAssociatedNRPPaTransport:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
default:
|
||||
NGAP_ERROR("Unknown procedure ID (%d) for initiating message\n",
|
||||
(int)pdu->choice.initiatingMessage->procedureCode);
|
||||
AssertFatal( 0, "Unknown procedure ID (%d) for initiating message\n",
|
||||
(int)pdu->choice.initiatingMessage->procedureCode);
|
||||
NGAP_ERROR("Unknown procedure ID (%d) for initiating message\n", (int)pdu->choice.initiatingMessage->procedureCode);
|
||||
AssertFatal(0, "Unknown procedure ID (%d) for initiating message\n", (int)pdu->choice.initiatingMessage->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ngap_gNB_decode_successful_outcome(NGAP_NGAP_PDU_t *pdu) {
|
||||
asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
|
||||
static int ngap_gNB_decode_successful_outcome(NGAP_NGAP_PDU_t *pdu)
|
||||
{
|
||||
asn_encode_to_new_buffer_result_t res = {NULL, {0, NULL, NULL}};
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
switch(pdu->choice.successfulOutcome->procedureCode) {
|
||||
switch (pdu->choice.successfulOutcome->procedureCode) {
|
||||
case NGAP_ProcedureCode_id_NGSetup:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
@@ -118,26 +127,25 @@ static int ngap_gNB_decode_successful_outcome(NGAP_NGAP_PDU_t *pdu) {
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
NGAP_ERROR("Unknown procedure ID (%d) for successfull outcome message\n",
|
||||
(int)pdu->choice.successfulOutcome->procedureCode);
|
||||
NGAP_ERROR("Unknown procedure ID (%d) for successfull outcome message\n", (int)pdu->choice.successfulOutcome->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ngap_gNB_decode_unsuccessful_outcome(NGAP_NGAP_PDU_t *pdu) {
|
||||
asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
|
||||
static int ngap_gNB_decode_unsuccessful_outcome(NGAP_NGAP_PDU_t *pdu)
|
||||
{
|
||||
asn_encode_to_new_buffer_result_t res = {NULL, {0, NULL, NULL}};
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
switch(pdu->choice.unsuccessfulOutcome->procedureCode) {
|
||||
switch (pdu->choice.unsuccessfulOutcome->procedureCode) {
|
||||
case NGAP_ProcedureCode_id_NGSetup:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
case NGAP_ProcedureCode_id_PathSwitchRequest:
|
||||
case NGAP_ProcedureCode_id_PathSwitchRequest:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
@@ -151,8 +159,8 @@ static int ngap_gNB_decode_unsuccessful_outcome(NGAP_NGAP_PDU_t *pdu) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ngap_gNB_decode_pdu(NGAP_NGAP_PDU_t *pdu, const uint8_t *const buffer,
|
||||
const uint32_t length) {
|
||||
int ngap_gNB_decode_pdu(NGAP_NGAP_PDU_t *pdu, const uint8_t *const buffer, const uint32_t length)
|
||||
{
|
||||
asn_dec_rval_t dec_ret;
|
||||
DevAssert(pdu != NULL);
|
||||
DevAssert(buffer != NULL);
|
||||
@@ -164,7 +172,7 @@ int ngap_gNB_decode_pdu(NGAP_NGAP_PDU_t *pdu, const uint8_t *const buffer,
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch(pdu->present) {
|
||||
switch (pdu->present) {
|
||||
case NGAP_NGAP_PDU_PR_initiatingMessage:
|
||||
return ngap_gNB_decode_initiating_message(pdu);
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
* \version 0.1
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
@@ -49,6 +48,8 @@ static inline int ngap_gNB_encode_initiating(NGAP_NGAP_PDU_t *pdu, uint8_t **buf
|
||||
NGAP_ProcedureCode_id_NASNonDeliveryIndication,
|
||||
NGAP_ProcedureCode_id_UEContextReleaseRequest,
|
||||
NGAP_ProcedureCode_id_PathSwitchRequest,
|
||||
NGAP_ProcedureCode_id_UplinkUEAssociatedNRPPaTransport,
|
||||
NGAP_ProcedureCode_id_UplinkNonUEAssociatedNRPPaTransport,
|
||||
NGAP_ProcedureCode_id_PDUSessionResourceModifyIndication};
|
||||
int i;
|
||||
for (i = 0; i < sizeofArray(tmp); i++)
|
||||
@@ -95,7 +96,8 @@ static inline int ngap_gNB_encode_unsuccessfull_outcome(NGAP_NGAP_PDU_t *pdu, ui
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
if (pdu->choice.unsuccessfulOutcome->procedureCode != NGAP_ProcedureCode_id_InitialContextSetup) {
|
||||
NGAP_DEBUG("Unknown procedure ID (%d) for unsuccessfull outcome message\n", (int)pdu->choice.unsuccessfulOutcome->procedureCode);
|
||||
NGAP_DEBUG("Unknown procedure ID (%d) for unsuccessfull outcome message\n",
|
||||
(int)pdu->choice.unsuccessfulOutcome->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
* \date 2020
|
||||
* \version 0.1
|
||||
*/
|
||||
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "intertask_interface.h"
|
||||
@@ -40,6 +40,7 @@
|
||||
#include "ngap_gNB_ue_context.h"
|
||||
#include "ngap_gNB_trace.h"
|
||||
#include "ngap_gNB_nas_procedures.h"
|
||||
#include "ngap_gNB_NRPPa_transport_procedures.h"
|
||||
#include "ngap_gNB_management_procedures.h"
|
||||
|
||||
#include "ngap_gNB_default_values.h"
|
||||
@@ -182,7 +183,7 @@ static int ngap_gNB_handle_ng_setup_response(sctp_assoc_t assoc_id, uint32_t str
|
||||
STAILQ_INIT(&new_guami_p->served_region_ids);
|
||||
STAILQ_INIT(&new_guami_p->amf_set_ids);
|
||||
STAILQ_INIT(&new_guami_p->amf_pointers);
|
||||
|
||||
|
||||
NGAP_PLMNIdentity_t *plmn_identity_p;
|
||||
struct plmn_identity_s *new_plmn_identity_p;
|
||||
plmn_identity_p = &guami_item_p->gUAMI.pLMNIdentity;
|
||||
@@ -191,7 +192,7 @@ static int ngap_gNB_handle_ng_setup_response(sctp_assoc_t assoc_id, uint32_t str
|
||||
new_plmn_identity_p->mnc, new_plmn_identity_p->mnc_digit_length);
|
||||
STAILQ_INSERT_TAIL(&new_guami_p->served_plmns, new_plmn_identity_p, next);
|
||||
new_guami_p->nb_served_plmns++;
|
||||
|
||||
|
||||
NGAP_AMFRegionID_t *amf_region_id_p;
|
||||
struct served_region_id_s *new_region_id_p;
|
||||
amf_region_id_p = &guami_item_p->gUAMI.aMFRegionID;
|
||||
@@ -665,7 +666,6 @@ static int ngap_gNB_handle_error_indication(sctp_assoc_t assoc_id, uint32_t stre
|
||||
// TODO continue
|
||||
}
|
||||
|
||||
|
||||
// TODO continue
|
||||
return 0;
|
||||
}
|
||||
@@ -776,7 +776,7 @@ static int ngap_gNB_handle_initial_context_request(sctp_assoc_t assoc_id, uint32
|
||||
/* id-AllowedNSSAI */
|
||||
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
|
||||
NGAP_ProtocolIE_ID_id_AllowedNSSAI, true);
|
||||
|
||||
|
||||
//if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
|
||||
NGAP_AllowedNSSAI_Item_t *allow_nssai_item_p = NULL;
|
||||
|
||||
@@ -788,7 +788,7 @@ static int ngap_gNB_handle_initial_context_request(sctp_assoc_t assoc_id, uint32
|
||||
|
||||
NGAP_DEBUG("AllowedNSSAI.list.count %d\n", ie->value.choice.AllowedNSSAI.list.count);
|
||||
msg->nb_allowed_nssais = ie->value.choice.AllowedNSSAI.list.count;
|
||||
|
||||
|
||||
for(i = 0; i < ie->value.choice.AllowedNSSAI.list.count; i++) {
|
||||
allow_nssai_item_p = ie->value.choice.AllowedNSSAI.list.array[i];
|
||||
|
||||
@@ -828,7 +828,7 @@ static int ngap_gNB_handle_initial_context_request(sctp_assoc_t assoc_id, uint32
|
||||
msg->mobility_restriction_flag = 1;
|
||||
TBCD_TO_MCC_MNC(
|
||||
&mobility_rest_list_p->servingPLMN, msg->mobility_restriction.serving_plmn.mcc, msg->mobility_restriction.serving_plmn.mnc, msg->mobility_restriction.serving_plmn.mnc_digit_length);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* id-NAS-PDU */
|
||||
@@ -1188,7 +1188,6 @@ static int ngap_gNB_handle_pdusession_release_command(sctp_assoc_t assoc_id, uin
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* id-AMF-UE-NGAP-ID */
|
||||
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSessionResourceReleaseCommandIEs_t, ie, container,
|
||||
NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID, true);
|
||||
@@ -1281,10 +1280,10 @@ const ngap_message_decoded_callback ngap_messages_callback[][3] = {
|
||||
{0, 0, 0}, /* CellTrafficTrace */
|
||||
{ngap_gNB_handle_deactivate_trace, 0, 0}, /* DeactivateTrace */
|
||||
{ngap_gNB_handle_nas_downlink, 0, 0}, /* DownlinkNASTransport */
|
||||
{0, 0, 0}, /* DownlinkNonUEAssociatedNRPPaTransport */
|
||||
{ngap_gNB_handle_DownlinkNonUEAssociatedNRPPaTransport, 0, 0}, /* DownlinkNonUEAssociatedNRPPaTransport*/
|
||||
{0, 0, 0}, /* DownlinkRANConfigurationTransfer */
|
||||
{0, 0, 0}, /* DownlinkRANStatusTransfer */
|
||||
{0, 0, 0}, /* DownlinkUEAssociatedNRPPaTransport */
|
||||
{ngap_gNB_handle_DownlinkUEAssociatedNRPPaTransport, 0, 0}, /* DownlinkUEAssociatedNRPPaTransport*/
|
||||
{ngap_gNB_handle_error_indication, 0, 0}, /* ErrorIndication */
|
||||
{0, 0, 0}, /* HandoverCancel */
|
||||
{0, 0, 0}, /* HandoverNotification */
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
|
||||
/*! \file ngap_gNB_itti_messaging.c
|
||||
* \brief ngap itti messages handlers for gNB
|
||||
* \author Yoshio INOUE, Masayuki HARADA
|
||||
@@ -26,7 +26,7 @@
|
||||
* \date 2020
|
||||
* \version 0.1
|
||||
*/
|
||||
|
||||
|
||||
#include "intertask_interface.h"
|
||||
|
||||
#include "ngap_gNB_itti_messaging.h"
|
||||
@@ -37,15 +37,15 @@ void ngap_gNB_itti_send_sctp_data_req(instance_t instance,
|
||||
uint32_t buffer_length,
|
||||
uint16_t stream)
|
||||
{
|
||||
MessageDef *message_p;
|
||||
MessageDef *message_p;
|
||||
sctp_data_req_t *sctp_data_req;
|
||||
|
||||
message_p = itti_alloc_new_message(TASK_NGAP, 0, SCTP_DATA_REQ);
|
||||
|
||||
sctp_data_req = &message_p->ittiMsg.sctp_data_req;
|
||||
|
||||
sctp_data_req->assoc_id = assoc_id;
|
||||
sctp_data_req->buffer = buffer;
|
||||
sctp_data_req->assoc_id = assoc_id;
|
||||
sctp_data_req->buffer = buffer;
|
||||
sctp_data_req->buffer_length = buffer_length;
|
||||
sctp_data_req->stream = stream;
|
||||
|
||||
@@ -54,7 +54,7 @@ void ngap_gNB_itti_send_sctp_data_req(instance_t instance,
|
||||
|
||||
void ngap_gNB_itti_send_nas_downlink_ind(instance_t instance, uint32_t gNB_ue_ngap_id, uint8_t *nas_pdu, uint32_t nas_pdu_length)
|
||||
{
|
||||
MessageDef *message_p;
|
||||
MessageDef *message_p;
|
||||
ngap_downlink_nas_t *ngap_downlink_nas;
|
||||
|
||||
message_p = itti_alloc_new_message(TASK_NGAP, 0, NGAP_DOWNLINK_NAS);
|
||||
@@ -71,13 +71,98 @@ void ngap_gNB_itti_send_nas_downlink_ind(instance_t instance, uint32_t gNB_ue_ng
|
||||
|
||||
void ngap_gNB_itti_send_sctp_close_association(instance_t instance, sctp_assoc_t assoc_id)
|
||||
{
|
||||
MessageDef *message_p = NULL;
|
||||
MessageDef *message_p = NULL;
|
||||
sctp_close_association_t *sctp_close_association_p = NULL;
|
||||
|
||||
message_p = itti_alloc_new_message(TASK_NGAP, 0, SCTP_CLOSE_ASSOCIATION);
|
||||
sctp_close_association_p = &message_p->ittiMsg.sctp_close_association;
|
||||
sctp_close_association_p->assoc_id = assoc_id;
|
||||
sctp_close_association_p->assoc_id = assoc_id;
|
||||
|
||||
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
|
||||
}
|
||||
|
||||
void ngap_gNB_itti_send_DownlinkUEAssociatedNRPPa(instance_t instance,
|
||||
uint32_t gNB_ue_ngap_id,
|
||||
uint64_t amf_ue_ngap_id,
|
||||
uint8_t *routingId_buffer,
|
||||
uint32_t routingId_buffer_length,
|
||||
uint8_t *nrppa_pdu,
|
||||
uint32_t nrppa_pdu_length)
|
||||
{
|
||||
MessageDef *msg= itti_alloc_new_message(TASK_NGAP, 0, NGAP_DOWNLINKUEASSOCIATEDNRPPA);
|
||||
ngap_DownlinkUEAssociatedNRPPa_t *DLNRPPa= &NGAP_DOWNLINKUEASSOCIATEDNRPPA(msg);
|
||||
|
||||
DLNRPPa->gNB_ue_ngap_id = gNB_ue_ngap_id;
|
||||
DLNRPPa->amf_ue_ngap_id = amf_ue_ngap_id;
|
||||
|
||||
// Routing ID
|
||||
DLNRPPa->routing_id.buffer = malloc(sizeof(uint8_t) * routingId_buffer_length);
|
||||
memcpy(DLNRPPa->routing_id.buffer, routingId_buffer, routingId_buffer_length);
|
||||
DLNRPPa->routing_id.length = routingId_buffer_length;
|
||||
|
||||
// NRPPa PDU
|
||||
DLNRPPa->nrppa_pdu.buffer = malloc(sizeof(uint8_t) * nrppa_pdu_length);
|
||||
memcpy(DLNRPPa->nrppa_pdu.buffer, nrppa_pdu, nrppa_pdu_length);
|
||||
DLNRPPa->nrppa_pdu.length = nrppa_pdu_length;
|
||||
|
||||
itti_send_msg_to_task(TASK_NRPPA, instance, msg);
|
||||
|
||||
/*MessageDef *msg=itti_alloc_new_message_sized(TASK_NGAP, 0, NGAP_DOWNLINKUEASSOCIATEDNRPPA,
|
||||
sizeof(ngap_DownlinkUEAssociatedNRPPa_t)+ routingId_buffer_length + nrppa_pdu_length);
|
||||
ngap_DownlinkUEAssociatedNRPPa_t *msgData = &NGAP_DOWNLINKUEASSOCIATEDNRPPA(msg);
|
||||
|
||||
msgData->gNB_ue_ngap_id = gNB_ue_ngap_id;
|
||||
msgData->amf_ue_ngap_id = amf_ue_ngap_id;
|
||||
|
||||
// Routing ID
|
||||
msgData->routing_id.buffer=(uint8_t *)(msgData+1);
|
||||
memcpy(msgData->routing_id.buffer, routingId_buffer, routingId_buffer_length);
|
||||
msgData->routing_id.length = routingId_buffer_length;
|
||||
|
||||
// NRPPa PDU
|
||||
msgData->nrppa_pdu.buffer = msgData->routing_id.buffer+routingId_buffer_length;
|
||||
memcpy(msgData->nrppa_pdu.buffer, nrppa_pdu, nrppa_pdu_length);
|
||||
msgData->nrppa_pdu.length = nrppa_pdu_length;
|
||||
|
||||
itti_send_msg_to_task(TASK_NRPPA, instance, msg);*/
|
||||
}
|
||||
|
||||
void ngap_gNB_itti_send_DownlinkNonUEAssociatedNRPPa(instance_t instance,
|
||||
uint8_t *routingId_buffer,
|
||||
uint32_t routingId_buffer_length,
|
||||
uint8_t *nrppa_pdu,
|
||||
uint32_t nrppa_pdu_length)
|
||||
{
|
||||
/*MessageDef *msg= itti_alloc_new_message(TASK_NGAP, 0, NGAP_DOWNLINKNONUEASSOCIATEDNRPPA);
|
||||
ngap_DownlinkNonUEAssociatedNRPPa_t *DLNRPPa = &NGAP_DOWNLINKNONUEASSOCIATEDNRPPA(msg);
|
||||
|
||||
// Routing ID
|
||||
DLNRPPa->routing_id.buffer = malloc(sizeof(uint8_t) * routingId_buffer_length);
|
||||
memcpy(DLNRPPa->routing_id.buffer, routingId_buffer, routingId_buffer_length);
|
||||
DLNRPPa->routing_id.length = routingId_buffer_length;
|
||||
|
||||
// NRPPa PDU
|
||||
DLNRPPa->nrppa_pdu.buffer = malloc(sizeof(uint8_t) * nrppa_pdu_length);
|
||||
memcpy(DLNRPPa->nrppa_pdu.buffer, nrppa_pdu, nrppa_pdu_length);
|
||||
DLNRPPa->nrppa_pdu.length = nrppa_pdu_length;
|
||||
|
||||
itti_send_msg_to_task(TASK_NRPPA, instance, msg);*/
|
||||
|
||||
|
||||
MessageDef *msg=itti_alloc_new_message_sized(TASK_NGAP, 0, NGAP_DOWNLINKNONUEASSOCIATEDNRPPA,
|
||||
sizeof(ngap_DownlinkNonUEAssociatedNRPPa_t)+ routingId_buffer_length + nrppa_pdu_length);
|
||||
ngap_DownlinkNonUEAssociatedNRPPa_t *msgData = &NGAP_DOWNLINKNONUEASSOCIATEDNRPPA(msg);
|
||||
|
||||
// Routing ID
|
||||
msgData->routing_id.buffer=(uint8_t *)(msgData+1);
|
||||
memcpy(msgData->routing_id.buffer, routingId_buffer, routingId_buffer_length);
|
||||
msgData->routing_id.length = routingId_buffer_length;
|
||||
|
||||
// NRPPa PDU
|
||||
msgData->nrppa_pdu.buffer = msgData->routing_id.buffer+routingId_buffer_length;
|
||||
memcpy(msgData->nrppa_pdu.buffer, nrppa_pdu, nrppa_pdu_length);
|
||||
msgData->nrppa_pdu.length = nrppa_pdu_length;
|
||||
|
||||
itti_send_msg_to_task(TASK_NRPPA, instance, msg);
|
||||
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
|
||||
/*! \file ngap_gNB_itti_messaging.h
|
||||
* \brief ngap itti messages handlers for gNB
|
||||
* \author Yoshio INOUE, Masayuki HARADA
|
||||
@@ -40,4 +40,18 @@ void ngap_gNB_itti_send_nas_downlink_ind(instance_t instance, uint32_t gNB_ue_ng
|
||||
|
||||
void ngap_gNB_itti_send_sctp_close_association(instance_t instance, sctp_assoc_t assoc_id);
|
||||
|
||||
void ngap_gNB_itti_send_DownlinkUEAssociatedNRPPa(instance_t instance,
|
||||
uint32_t gNB_ue_ngap_id,
|
||||
uint64_t amf_ue_ngap_id,
|
||||
uint8_t *routingId_buffer,
|
||||
uint32_t routingId_buffer_length,
|
||||
uint8_t *nrppa_pdu,
|
||||
uint32_t nrppa_pdu_length);
|
||||
|
||||
void ngap_gNB_itti_send_DownlinkNonUEAssociatedNRPPa(instance_t instance,
|
||||
uint8_t *routingId_buffer,
|
||||
uint32_t routingId_buffer_length,
|
||||
uint8_t *nrppa_pdu,
|
||||
uint32_t nrppa_pdu_length);
|
||||
|
||||
#endif /* NGAP_GNB_ITTI_MESSAGING_H_ */
|
||||
|
||||
@@ -21,14 +21,14 @@
|
||||
|
||||
/*! \file ngap_gNB_nas_procedures.c
|
||||
* \brief NGAP gNb NAS procedure handler
|
||||
* \author Yoshio INOUE, Masayuki HARADA
|
||||
* \author Yoshio INOUE, Masayuki HARADA
|
||||
* \date 2020
|
||||
* \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
|
||||
* \version 1.0
|
||||
* @ingroup _ngap
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
@@ -319,6 +319,7 @@ int ngap_gNB_handle_nas_downlink(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NG
|
||||
}
|
||||
|
||||
ngap_gNB_instance = amf_desc_p->ngap_gNB_instance;
|
||||
|
||||
/* Prepare the NGAP message to encode */
|
||||
container = &pdu->choice.initiatingMessage->value.choice.DownlinkNASTransport;
|
||||
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkNASTransport_IEs_t, ie, container,
|
||||
@@ -666,7 +667,7 @@ int ngap_gNB_initial_ctxt_resp(instance_t instance, ngap_initial_context_setup_r
|
||||
for (i = 0; i < initial_ctxt_resp_p->nb_of_pdusessions_failed; i++) {
|
||||
asn1cSequenceAdd(ie->value.choice.PDUSessionResourceFailedToSetupListCxtRes.list, NGAP_PDUSessionResourceFailedToSetupItemCxtRes_t, item);
|
||||
NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t pdusessionUnTransfer = {0};
|
||||
|
||||
|
||||
/* pDUSessionID */
|
||||
item->pDUSessionID = initial_ctxt_resp_p->pdusessions_failed[i].pdusession_id;
|
||||
|
||||
@@ -1219,7 +1220,7 @@ int ngap_gNB_pdusession_release_resp(instance_t instance, ngap_pdusession_releas
|
||||
ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceReleasedListRelRes;
|
||||
ie->criticality = NGAP_Criticality_ignore;
|
||||
ie->value.present = NGAP_PDUSessionResourceReleaseResponseIEs__value_PR_PDUSessionResourceReleasedListRelRes;
|
||||
|
||||
|
||||
for (i = 0; i < pdusession_release_resp_p->nb_of_pdusessions_released; i++) {
|
||||
asn1cSequenceAdd(ie->value.choice.PDUSessionResourceReleasedListRelRes.list, NGAP_PDUSessionResourceReleasedItemRelRes_t, item);
|
||||
item->pDUSessionID = pdusession_release_resp_p->pdusession_release[i].pdusession_id;
|
||||
@@ -1227,7 +1228,7 @@ int ngap_gNB_pdusession_release_resp(instance_t instance, ngap_pdusession_releas
|
||||
NGAP_DEBUG("pdusession_release_resp: pdusession ID %ld\n", item->pDUSessionID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
NGAP_ERROR("Failed to encode release response\n");
|
||||
/* Encode procedure has failed... */
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
add_subdirectory(MESSAGES)
|
||||
|
||||
add_executable(test_nrppa ${OPENAIR3_DIR}/NRPPA/test_nrppa.c )
|
||||
target_link_libraries(test_nrppa asn1_nrppa)
|
||||
|
||||
#add_executable(test_nrppa ${OPENAIR3_DIR}/NRPPA/test_nrppa.c )
|
||||
#target_link_libraries(test_nrppa asn1_nrppa)
|
||||
|
||||
44
openair3/NRPPA/nrppa_common.c
Normal file
44
openair3/NRPPA/nrppa_common.c
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_common.h
|
||||
* \brief nrppa common procedures
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
* \date 2023
|
||||
* \version 0.1
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
int asn1_xer_print = 0;
|
||||
|
||||
/* ad**l todo
|
||||
void ngap_handle_criticality(NGAP_Criticality_t criticality)
|
||||
{
|
||||
}
|
||||
*/
|
||||
|
||||
/* todo ad**l */
|
||||
#include "nrppa_common.h"
|
||||
//#include "NRPPA_NRPPA-PDU.h"
|
||||
|
||||
/* todo ad**l */
|
||||
300
openair3/NRPPA/nrppa_common.h
Normal file
300
openair3/NRPPA/nrppa_common.h
Normal file
@@ -0,0 +1,300 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_common.h
|
||||
* \brief nrppa common procedures
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
* \date 2023
|
||||
* \version 0.1
|
||||
*/
|
||||
|
||||
#ifndef NRPPA_COMMON_H_
|
||||
#define NRPPA_COMMON_H_
|
||||
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "oai_asn1.h"
|
||||
|
||||
/*#include "NRPPA_ProtocolIE-ID.h"
|
||||
#include "NRPPA_Criticality.h"
|
||||
#include <ANY.h>
|
||||
#include <asn_ioc.h>
|
||||
#include "NRPPA_OTDOA-Information-Type-Item.h"
|
||||
#include "NRPPA_Presence.h"
|
||||
#include <OPEN_TYPE.h>
|
||||
#include <constr_CHOICE.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
#include "NRPPA_MeasurementQuantities-Item.h"
|
||||
#include "NRPPA_ResultSS-RSRP.h"
|
||||
#include "NRPPA_ResultSS-RSRQ.h"
|
||||
#include "NRPPA_ResultCSI-RSRP.h"
|
||||
#include "NRPPA_ResultCSI-RSRQ.h"
|
||||
#include "NRPPA_UL-AoA.h"
|
||||
#include "NRPPA_TDD-Config-EUTRA-Item.h"
|
||||
#include "NRPPA_OtherRATMeasurementQuantities-Item.h"
|
||||
#include "NRPPA_ResultNR.h"
|
||||
#include "NRPPA_ResultEUTRA.h"
|
||||
#include "NRPPA_WLANMeasurementQuantities-Item.h"
|
||||
#include "NRPPA_UE-Measurement-ID.h"
|
||||
#include "NRPPA_ReportCharacteristics.h"
|
||||
#include "NRPPA_MeasurementPeriodicity.h"
|
||||
#include "NRPPA_MeasurementQuantities.h"
|
||||
#include "NRPPA_OtherRATMeasurementQuantities.h"
|
||||
#include "NRPPA_WLANMeasurementQuantities.h"
|
||||
#include "NRPPA_E-CID-MeasurementResult.h"
|
||||
|
||||
#include "NRPPA_Cell-Portion-ID.h"
|
||||
#include "NRPPA_OtherRATMeasurementResult.h"
|
||||
#include "NRPPA_WLANMeasurementResult.h"
|
||||
|
||||
#include "NRPPA_OTDOA-Information-Type.h"
|
||||
#include "NRPPA_OTDOACells.h"
|
||||
#include "NRPPA_Assistance-Information.h"
|
||||
#include "NRPPA_Broadcast.h"
|
||||
#include "NRPPA_PositioningBroadcastCells.h"
|
||||
#include "NRPPA_AssistanceInformationFailureList.h"
|
||||
|
||||
#include "NRPPA_TRPList.h"
|
||||
#include "NRPPA_TRPInformationTypeList.h"
|
||||
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/* Start: ad**l todo add all nrppa ASN genrated header files here */
|
||||
#include "NRPPA_NRPPA-PDU.h"
|
||||
#include "NRPPA_InitiatingMessage.h"
|
||||
#include "NRPPA_SuccessfulOutcome.h"
|
||||
#include "NRPPA_UnsuccessfulOutcome.h"
|
||||
|
||||
#include "NRPPA_ProtocolIE-ID.h"
|
||||
#include "NRPPA_ProtocolIE-Field.h"
|
||||
#include "NRPPA_ProtocolIE-Container.h"
|
||||
#include "NRPPA_ProtocolExtensionField.h"
|
||||
#include "NRPPA_ProtocolIE-ContainerList.h"
|
||||
#include "NRPPA_ProtocolExtensionContainer.h"
|
||||
#include "NRPPA_ProtocolIE-Single-Container.h"
|
||||
#include "NRPPA_asn_constant.h"
|
||||
|
||||
// Position Information Transfer Procedures
|
||||
#include "NRPPA_PositioningActivationFailure.h"
|
||||
#include "NRPPA_PositioningActivationRequest.h"
|
||||
#include "NRPPA_PositioningActivationResponse.h"
|
||||
#include "NRPPA_PositioningBroadcastCells.h"
|
||||
#include "NRPPA_PositioningDeactivation.h"
|
||||
#include "NRPPA_PositioningInformationFailure.h"
|
||||
#include "NRPPA_PositioningInformationRequest.h"
|
||||
#include "NRPPA_PositioningInformationResponse.h"
|
||||
#include "NRPPA_PositioningInformationUpdate.h"
|
||||
|
||||
// IEs of Position Information Transfer Procedures
|
||||
#include "NRPPA_Cause.h"
|
||||
#include "NRPPA_RequestedSRSTransmissionCharacteristics.h"
|
||||
|
||||
#include "NRPPA_SRSConfiguration.h"
|
||||
#include "NRPPA_SRSCarrier-List.h"
|
||||
#include "NRPPA_SRSCarrier-List-Item.h"
|
||||
#include "NRPPA_UplinkChannelBW-PerSCS-List.h"
|
||||
#include "NRPPA_SCS-SpecificCarrier.h"
|
||||
#include "NRPPA_ActiveULBWP.h"
|
||||
#include "NRPPA_SRSConfig.h"
|
||||
#include "NRPPA_SRSResource-List.h"
|
||||
#include "NRPPA_SRSResource.h"
|
||||
|
||||
#include "NRPPA_ResourceType.h"
|
||||
#include "NRPPA_ResourceTypePeriodic.h"
|
||||
#include "NRPPA_ResourceTypeAperiodic.h"
|
||||
#include "NRPPA_ResourceTypeSemi-persistent.h"
|
||||
|
||||
#include "NRPPA_SRSResourceSet-List.h"
|
||||
#include "NRPPA_SRSResourceSet.h"
|
||||
#include "NRPPA_SRSResourceID-List.h"
|
||||
#include "NRPPA_SRSResourceSetID.h"
|
||||
#include "NRPPA_ResourceSetType.h"
|
||||
#include "NRPPA_ResourceSetTypePeriodic.h"
|
||||
#include "NRPPA_ResourceSetTypeAperiodic.h"
|
||||
#include "NRPPA_ResourceSetTypeSemi-persistent.h"
|
||||
|
||||
#include "NRPPA_PosSRSResource-List.h"
|
||||
#include "NRPPA_PosSRSResource-Item.h"
|
||||
#include "NRPPA_PosSRSResourceID-List.h"
|
||||
#include "NRPPA_SRSPosResourceID.h"
|
||||
#include "NRPPA_ResourceTypePos.h"
|
||||
#include "NRPPA_ResourceTypePeriodicPos.h"
|
||||
#include "NRPPA_ResourceTypeAperiodicPos.h"
|
||||
#include "NRPPA_ResourceTypeSemi-persistentPos.h"
|
||||
|
||||
#include "NRPPA_PosSRSResourceSet-List.h"
|
||||
#include "NRPPA_PosSRSResourceSet-Item.h"
|
||||
#include "NRPPA_PosResourceSetType.h"
|
||||
#include "NRPPA_PosResourceSetTypePeriodic.h"
|
||||
#include "NRPPA_PosResourceSetTypeAperiodic.h"
|
||||
#include "NRPPA_PosResourceSetTypeSemi-persistent.h"
|
||||
|
||||
#include "NRPPA_SFNInitialisationTime.h"
|
||||
#include "NRPPA_CriticalityDiagnostics.h"
|
||||
#include "NRPPA_Criticality.h"
|
||||
|
||||
#include "NRPPA_SRSType.h"
|
||||
#include "NRPPA_SemipersistentSRS.h"
|
||||
#include "NRPPA_AperiodicSRS.h"
|
||||
#include "NRPPA_ActivationTime.h"
|
||||
#include "NRPPA_AbortTransmission.h"
|
||||
|
||||
// TRP Information Transfer
|
||||
#include "NRPPA_TRPInformationFailure.h"
|
||||
#include "NRPPA_TRPInformationRequest.h"
|
||||
#include "NRPPA_TRPInformationResponse.h"
|
||||
//
|
||||
//#include ".h"
|
||||
#include "NRPPA_TRPInformationList.h"
|
||||
#include "NRPPA_TRPInformationItem.h"
|
||||
|
||||
// Measurement Transfer
|
||||
#include "NRPPA_MeasurementRequest.h"
|
||||
#include "NRPPA_MeasurementFailure.h"
|
||||
#include "NRPPA_MeasurementResponse.h"
|
||||
#include "NRPPA_MeasurementReport.h"
|
||||
#include "NRPPA_MeasurementUpdate.h"
|
||||
#include "NRPPA_MeasurementAbort.h"
|
||||
#include "NRPPA_MeasurementFailureIndication.h"
|
||||
|
||||
//#include ".h"
|
||||
#include "NRPPA_TRP-MeasurementRequestList.h"
|
||||
#include "NRPPA_TRP-MeasurementRequestItem.h"
|
||||
#include "NRPPA_TRPMeasurementQuantities.h"
|
||||
|
||||
#include "NRPPA_TRPMeasurementQuantitiesList-Item.h"
|
||||
|
||||
#include "NRPPA_TRP-MeasurementResponseList.h"
|
||||
#include "NRPPA_TRP-MeasurementResponseItem.h"
|
||||
#include "NRPPA_TrpMeasurementResult.h"
|
||||
#include "NRPPA_TrpMeasurementResultItem.h"
|
||||
#include "NRPPA_TrpMeasuredResultsValue.h"
|
||||
#include "NRPPA_MeasuredResults.h"
|
||||
#include "NRPPA_MeasuredResultsValue.h"
|
||||
#include "NRPPA_MeasurementQuantities.h"
|
||||
#include "NRPPA_UL-AoA.h"
|
||||
#include "NRPPA_UL-RTOAMeasurement.h"
|
||||
#include "NRPPA_ULRTOAMeas.h"
|
||||
#include "NRPPA_GNBRxTxTimeDiffMeas.h"
|
||||
#include "NRPPA_GNB-RxTxTimeDiff.h"
|
||||
#include "NRPPA_Measurement-ID.h"
|
||||
#include "NRPPA_MeasurementBeamInfo.h"
|
||||
#include "NRPPA_SystemFrameNumber.h"
|
||||
#include "NRPPA_SlotNumber.h"
|
||||
#include "NRPPA_TRPReferencePointType.h"
|
||||
#include "NRPPA_ReferencePoint.h"
|
||||
#include "NRPPA_TRPPositionReferenced.h"
|
||||
#include "NRPPA_RelativeGeodeticLocation.h"
|
||||
#include "NRPPA_RelativeCartesianLocation.h"
|
||||
#include "NRPPA_TRPPositionDefinitionType.h"
|
||||
|
||||
/* END: ad**l todo add all nrppa ASN genrated header files here*/
|
||||
|
||||
/* Checking version of ASN1C compiler */
|
||||
#if (ASN1C_ENVIRONMENT_VERSION < ASN1C_MINIMUM_VERSION)
|
||||
#error "You are compiling nrppa with the wrong version of ASN1C"
|
||||
#endif
|
||||
|
||||
extern int asn_debug;
|
||||
extern int asn1_xer_print;
|
||||
|
||||
#if defined(ENB_MODE)
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "ngap_gNB_default_values.h"
|
||||
#define NRPPA_ERROR(x, args...) LOG_E(NRPPA, x, ##args)
|
||||
#define NRPPA_WARN(x, args...) LOG_W(NRPPA, x, ##args)
|
||||
#define NRPPA_TRAF(x, args...) LOG_I(NRPPA, x, ##args)
|
||||
#define NRPPA_INFO(x, args...) LOG_I(NRPPA, x, ##args)
|
||||
#define NRPPA_DEBUG(x, args...) LOG_I(NRPPA, x, ##args)
|
||||
#else
|
||||
#define NRPPA_ERROR(x, args...) \
|
||||
do { \
|
||||
fprintf(stdout, "[NRPPA][E]" x, ##args); \
|
||||
} while (0)
|
||||
#define NRPPA_WARN(x, args...) \
|
||||
do { \
|
||||
fprintf(stdout, "[NRPPA][W]" x, ##args); \
|
||||
} while (0)
|
||||
#define NRPPA_TRAF(x, args...) \
|
||||
do { \
|
||||
fprintf(stdout, "[NRPPA][T]" x, ##args); \
|
||||
} while (0)
|
||||
#define NRPPA_INFO(x, args...) \
|
||||
do { \
|
||||
fprintf(stdout, "[NRPPA][I]" x, ##args); \
|
||||
} while (0)
|
||||
#define NRPPA_DEBUG(x, args...) \
|
||||
do { \
|
||||
fprintf(stdout, "[NRPPA][D]" x, ##args); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#define NRPPA_FIND_PROTOCOLIE_BY_ID(IE_TYPE, ie, container, IE_ID, mandatory) \
|
||||
do { \
|
||||
IE_TYPE **ptr; \
|
||||
ie = NULL; \
|
||||
for (ptr = container->protocolIEs.list.array; ptr < &container->protocolIEs.list.array[container->protocolIEs.list.count]; \
|
||||
ptr++) { \
|
||||
if ((*ptr)->id == IE_ID) { \
|
||||
ie = *ptr; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
if (ie == NULL) { \
|
||||
if (mandatory) { \
|
||||
AssertFatal(NRPPA, "NRPPA_FIND_PROTOCOLIE_BY_ID ie is NULL (searching for ie: %ld)\n", IE_ID); \
|
||||
} else { \
|
||||
NRPPA_INFO("NRPPA_FIND_PROTOCOLIE_BY_ID ie is NULL (searching for ie: %ld)\n", IE_ID); \
|
||||
} \
|
||||
} \
|
||||
} while (0); \
|
||||
if (mandatory && !ie) \
|
||||
return -1
|
||||
|
||||
/* ad**l todo */
|
||||
/* gnb and ue related info in NRPPA emssage */
|
||||
typedef struct nrppa_gnb_ue_info_s {
|
||||
instance_t instance;
|
||||
int32_t gNB_ue_ngap_id;
|
||||
int64_t amf_ue_ngap_id;
|
||||
// routing ID
|
||||
uint8_t *routing_id_buffer;
|
||||
uint32_t routing_id_length; // Length of the octet string
|
||||
// ngap_routing_id_t routing_id;
|
||||
} nrppa_gnb_ue_info_t;
|
||||
|
||||
/** \brief Function callback prototype.
|
||||
**/
|
||||
typedef int (*nrppa_message_decoded_callback)(nrppa_gnb_ue_info_t *nrppa_msg_info, NRPPA_NRPPA_PDU_t *pdu);
|
||||
|
||||
/** \brief Handle criticality
|
||||
\param criticality Criticality of the IE
|
||||
@returns void
|
||||
**/
|
||||
|
||||
/* ad**l todo
|
||||
void nrppa_handle_criticality(NRPPA_Criticality_t criticality);
|
||||
*/
|
||||
|
||||
#endif /* NRPPA_COMMON_H_ */
|
||||
129
openair3/NRPPA/nrppa_gNB.c
Normal file
129
openair3/NRPPA/nrppa_gNB.c
Normal file
@@ -0,0 +1,129 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_gNB.c
|
||||
* \brief NRPPA gNB task
|
||||
* \author Adeel Maik
|
||||
* \date 2023
|
||||
* \email: adeel.malik@eurecom.fr
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <crypt.h>
|
||||
|
||||
#include "tree.h"
|
||||
#include "queue.h"
|
||||
|
||||
#include "intertask_interface.h"
|
||||
|
||||
#include "assertions.h"
|
||||
#include "conversions.h"
|
||||
|
||||
#include "nrppa_gNB.h"
|
||||
#include "nrppa_common.h"
|
||||
#include "nrppa_gNB_handlers.h"
|
||||
#include "nrppa_gNB_position_information_transfer_procedures.h"
|
||||
#include "nrppa_gNB_TRP_information_transfer_procedures.h"
|
||||
#include "nrppa_gNB_measurement_information_transfer_procedures.h"
|
||||
|
||||
void nrppa_gNB_init(void)
|
||||
{
|
||||
NRPPA_DEBUG("Starting NRPPA layer\n");
|
||||
itti_mark_task_ready(TASK_NRPPA);
|
||||
}
|
||||
|
||||
void *nrppa_gNB_process_itti_msg(void *notUsed)
|
||||
{
|
||||
MessageDef *received_msg = NULL;
|
||||
int result;
|
||||
itti_receive_msg(TASK_NRPPA, &received_msg);
|
||||
if (received_msg) {
|
||||
instance_t instance = ITTI_MSG_DESTINATION_INSTANCE(received_msg);
|
||||
LOG_I(NRPPA, "Received message %s\n", ITTI_MSG_NAME(received_msg));
|
||||
switch (ITTI_MSG_ID(received_msg)) {
|
||||
case TERMINATE_MESSAGE:
|
||||
NRPPA_WARN(" *** Exiting NRPPA thread\n"); // to be implemented // ad**l
|
||||
itti_exit_task();
|
||||
break;
|
||||
case NGAP_DOWNLINKUEASSOCIATEDNRPPA:
|
||||
nrppa_handle_DownlinkUEAssociatedNRPPaTransport(instance, &NGAP_DOWNLINKUEASSOCIATEDNRPPA(received_msg));
|
||||
break;
|
||||
case NGAP_DOWNLINKNONUEASSOCIATEDNRPPA:
|
||||
nrppa_handle_DownlinkNonUEAssociatedNRPPaTransport(instance, &NGAP_DOWNLINKNONUEASSOCIATEDNRPPA(received_msg));
|
||||
break;
|
||||
case F1AP_POSITIONING_INFORMATION_RESP:
|
||||
nrppa_gNB_PositioningInformationResponse(instance, received_msg);
|
||||
break;
|
||||
case F1AP_POSITIONING_INFORMATION_FAILURE:
|
||||
nrppa_gNB_PositioningInformationFailure(instance, received_msg);
|
||||
break;
|
||||
case F1AP_POSITIONING_INFORMATION_UPDATE:
|
||||
nrppa_gNB_PositioningInformationUpdate(instance, received_msg);
|
||||
break;
|
||||
case F1AP_POSITIONING_ACTIVATION_RESP:
|
||||
nrppa_gNB_PositioningActivationResponse(instance, received_msg);
|
||||
break;
|
||||
case F1AP_POSITIONING_ACTIVATION_FAILURE:
|
||||
nrppa_gNB_PositioningActivationFailure(instance, received_msg);
|
||||
break;
|
||||
case F1AP_MEASUREMENT_RESP:
|
||||
nrppa_gNB_MeasurementResponse(instance, received_msg);
|
||||
break;
|
||||
case F1AP_MEASUREMENT_FAILURE:
|
||||
nrppa_gNB_MeasurementFailure(instance, received_msg);
|
||||
break;
|
||||
case F1AP_MEASUREMENT_REPORT:
|
||||
nrppa_gNB_MeasurementReport(instance, received_msg);
|
||||
break;
|
||||
case F1AP_MEASUREMENT_FAILURE_IND:
|
||||
nrppa_gNB_MeasurementFailureIndication(instance, received_msg);
|
||||
break;
|
||||
case F1AP_TRP_INFORMATION_RESP:
|
||||
nrppa_gNB_TRPInformationResponse(instance, received_msg);
|
||||
break;
|
||||
case F1AP_TRP_INFORMATION_FAILURE:
|
||||
nrppa_gNB_TRPInformationFailure(instance, received_msg);
|
||||
break;
|
||||
default:
|
||||
NRPPA_ERROR("Received unhandled message: %d:%s\n", ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg));
|
||||
break;
|
||||
}
|
||||
result = itti_free(ITTI_MSG_ORIGIN_ID(received_msg), received_msg);
|
||||
AssertFatal(result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *nrppa_gNB_task(void *arg)
|
||||
{
|
||||
nrppa_gNB_init();
|
||||
|
||||
while (1) {
|
||||
(void)nrppa_gNB_process_itti_msg(NULL);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
41
openair3/NRPPA/nrppa_gNB.h
Normal file
41
openair3/NRPPA/nrppa_gNB.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_gNB.h
|
||||
* \brief NRPPA gNB task
|
||||
* \author Adeel Maik
|
||||
* \date 2023
|
||||
* \email: adeel.malik@eurecom.fr
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#ifndef NRPPA_GNB_H_
|
||||
#define NRPPA_GNB_H_
|
||||
|
||||
void nrppa_gNB_init(void);
|
||||
void *nrppa_gNB_process_itti_msg(void *notUsed);
|
||||
void *nrppa_gNB_task(void *arg);
|
||||
|
||||
#endif /* NRPPA_GNB_H_ */
|
||||
418
openair3/NRPPA/nrppa_gNB_TRP_information_transfer_procedures.c
Normal file
418
openair3/NRPPA/nrppa_gNB_TRP_information_transfer_procedures.c
Normal file
@@ -0,0 +1,418 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_gNB_TRP_information_transfer_procedures.c
|
||||
* \brief NRPPA gNB tasks related to TRP information transfer
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
* \date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#include "intertask_interface.h"
|
||||
|
||||
#include "nrppa_common.h"
|
||||
#include "nrppa_gNB_TRP_information_transfer_procedures.h"
|
||||
#include "nrppa_gNB_itti_messaging.h"
|
||||
#include "nrppa_gNB_encoder.h"
|
||||
|
||||
/* TRPInformationExchange (Parent) procedure for TRPInformationRequest, TRPInformationResponse, and TRPInformationFailure*/
|
||||
int nrppa_gNB_handle_TRPInformationExchange(nrppa_gnb_ue_info_t *nrppa_msg_info, NRPPA_NRPPA_PDU_t *pdu)
|
||||
{
|
||||
LOG_I(NRPPA, "Processing Received TRPInformationRequest \n");
|
||||
DevAssert(pdu != NULL);
|
||||
xer_fprint(stdout, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
|
||||
// Forward request to RRC
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_RRC_GNB, 0, F1AP_TRP_INFORMATION_REQ);
|
||||
f1ap_trp_information_req_t *f1ap_req = &F1AP_TRP_INFORMATION_REQ(msg);
|
||||
f1ap_req->nrppa_msg_info.instance = nrppa_msg_info->instance;
|
||||
f1ap_req->nrppa_msg_info.gNB_ue_ngap_id = nrppa_msg_info->gNB_ue_ngap_id;
|
||||
f1ap_req->nrppa_msg_info.amf_ue_ngap_id = nrppa_msg_info->amf_ue_ngap_id;
|
||||
f1ap_req->nrppa_msg_info.routing_id_buffer = nrppa_msg_info->routing_id_buffer;
|
||||
f1ap_req->nrppa_msg_info.routing_id_length = nrppa_msg_info->routing_id_length;
|
||||
|
||||
// Processing Received TRPInformationRequest
|
||||
NRPPA_TRPInformationRequest_t *container= NULL;
|
||||
NRPPA_TRPInformationRequest_IEs_t *ie= NULL;
|
||||
|
||||
// IE 9.2.3 Message type (M)
|
||||
container = &pdu->choice.initiatingMessage->value.choice.TRPInformationRequest;
|
||||
// IE 9.2.4 nrppatransactionID (M)
|
||||
f1ap_req->transaction_id = pdu->choice.initiatingMessage->nrppatransactionID;
|
||||
f1ap_req->nrppa_msg_info.nrppa_transaction_id = pdu->choice.initiatingMessage->nrppatransactionID;
|
||||
|
||||
// IE TRP List
|
||||
NRPPA_FIND_PROTOCOLIE_BY_ID(NRPPA_TRPInformationRequest_IEs_t, ie, container, NRPPA_ProtocolIE_ID_id_TRPList, false);
|
||||
if (ie != NULL) {
|
||||
LOG_I(NRPPA, "Process TRPInformationRequest IE TRP List");
|
||||
// NRPPA_TRPList_t TRP_List = ie->value.choice.TRPList; // TODO process this and fill f1ap message
|
||||
}
|
||||
|
||||
// IE TRP Information Type List
|
||||
NRPPA_FIND_PROTOCOLIE_BY_ID(NRPPA_TRPInformationRequest_IEs_t,
|
||||
ie,
|
||||
container,
|
||||
NRPPA_ProtocolIE_ID_id_TRPInformationTypeList,
|
||||
false);
|
||||
if (ie != NULL) {
|
||||
LOG_I(NRPPA, "Process TRPInformationRequest IE TRPInformationTypeList");
|
||||
// NRPPA_TRPInformationTypeList_t TRP_Info_Type_List= ie->value.choice.TRPInformationTypeList; // TODO process this and fill
|
||||
// f1ap message
|
||||
}
|
||||
|
||||
LOG_I(NRPPA, "Forwarding to RRC TRPInformationRequest transaction_id=%d\n", f1ap_req->transaction_id);
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, 0, msg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nrppa_gNB_TRPInformationResponse(instance_t instance, MessageDef *msg_p)
|
||||
{
|
||||
f1ap_trp_information_resp_t *resp = &F1AP_TRP_INFORMATION_RESP(msg_p);
|
||||
LOG_I(NRPPA,
|
||||
"Received TRPInformationResponse info from RRC transaction_id=%d, rnti= %04x\n",
|
||||
resp->transaction_id,
|
||||
resp->nrppa_msg_info.ue_rnti);
|
||||
|
||||
// Prepare NRPPA TRP Information transfer Response
|
||||
NRPPA_NRPPA_PDU_t pdu= {0};
|
||||
/* Prepare the NRPPA message to encode for successfulOutcome TRPInformationResponse */
|
||||
|
||||
// IE: 9.2.3 Message Type successfulOutcome TRPInformationResponse (M)
|
||||
memset(&pdu, 0, sizeof(pdu));
|
||||
pdu.present = NRPPA_NRPPA_PDU_PR_successfulOutcome;
|
||||
asn1cCalloc(pdu.choice.successfulOutcome, head);
|
||||
head->procedureCode = NRPPA_ProcedureCode_id_tRPInformationExchange;
|
||||
head->criticality = NRPPA_Criticality_reject;
|
||||
head->value.present = NRPPA_SuccessfulOutcome__value_PR_TRPInformationResponse;
|
||||
|
||||
// IE 9.2.4 nrppatransactionID (M)
|
||||
head->nrppatransactionID = resp->nrppa_msg_info.nrppa_transaction_id;
|
||||
NRPPA_TRPInformationResponse_t *out = &head->value.choice.TRPInformationResponse;
|
||||
|
||||
// IE TRP Information List (M)
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NRPPA_TRPInformationResponse_IEs_t, ie);
|
||||
ie->id = NRPPA_ProtocolIE_ID_id_TRPInformationList;
|
||||
ie->criticality = NRPPA_Criticality_ignore;
|
||||
ie->value.present = NRPPA_TRPInformationResponse_IEs__value_PR_TRPInformationList;
|
||||
|
||||
int nb_of_TRP = resp->trp_information_list.trp_information_list_length;
|
||||
f1ap_trp_information_item_t *trpInfItem= resp->trp_information_list.trp_information_item;
|
||||
for (int i = 0; i < nb_of_TRP; i++) {
|
||||
asn1cSequenceAdd(ie->value.choice.TRPInformationList.list, TRPInformationList__Member, item);
|
||||
item->tRP_ID = trpInfItem->tRPInformation.tRPID;
|
||||
|
||||
// Preparing tRPInformation IE of NRPPA_TRPInformationList__Member
|
||||
int nb_tRPInfoTypes = trpInfItem->tRPInformation.tRPInformationTypeResponseList.trp_information_type_response_list_length;
|
||||
f1ap_trp_information_type_response_item_t *resItem=trpInfItem->tRPInformation.tRPInformationTypeResponseList.trp_information_type_response_item;
|
||||
for (int k = 0; k < nb_tRPInfoTypes; k++) // Preparing NRPPA_TRPInformation_t a list of TRPInformation_item
|
||||
{
|
||||
asn1cSequenceAdd(item->tRPInformation.list, NRPPA_TRPInformationItem_t, trpinfo_item);
|
||||
switch (resItem->present){
|
||||
case f1ap_trp_information_type_response_item_pr_NOTHING:
|
||||
trpinfo_item->present= NRPPA_TRPInformationItem_PR_NOTHING;
|
||||
break;
|
||||
case f1ap_trp_information_type_response_item_pr_nG_RAN_CGI:
|
||||
trpinfo_item->present= NRPPA_TRPInformationItem_PR_nG_RAN_CGI;
|
||||
asn1cCalloc(trpinfo_item->choice.nG_RAN_CGI, nG_RAN_CGI);
|
||||
// nR_CellID
|
||||
nG_RAN_CGI->nG_RANcell.present = NRPPA_NG_RANCell_PR_nR_CellID;
|
||||
nG_RAN_CGI->nG_RANcell.choice.nR_CellID.bits_unused=resItem->choice.nG_RAN_CGI.nRCellIdentity.bits_unused;
|
||||
nG_RAN_CGI->nG_RANcell.choice.nR_CellID.size=resItem->choice.nG_RAN_CGI.nRCellIdentity.size;
|
||||
nG_RAN_CGI->nG_RANcell.choice.nR_CellID.buf=calloc(resItem->choice.nG_RAN_CGI.nRCellIdentity.size, sizeof(uint8_t));
|
||||
memcpy(nG_RAN_CGI->nG_RANcell.choice.nR_CellID.buf,resItem->choice.nG_RAN_CGI.nRCellIdentity.buf,resItem->choice.nG_RAN_CGI.nRCellIdentity.size);
|
||||
// pLMN_Identity
|
||||
nG_RAN_CGI->pLMN_Identity.size = resItem->choice.nG_RAN_CGI.pLMN_Identity.size;
|
||||
nG_RAN_CGI->pLMN_Identity.buf = calloc(resItem->choice.nG_RAN_CGI.pLMN_Identity.size, sizeof(uint8_t));
|
||||
memcpy(nG_RAN_CGI->pLMN_Identity.buf,resItem->choice.nG_RAN_CGI.pLMN_Identity.buf,resItem->choice.nG_RAN_CGI.pLMN_Identity.size);
|
||||
break;
|
||||
case f1ap_trp_information_type_response_item_pr_geographicalCoordinates:
|
||||
trpinfo_item->present= NRPPA_TRPInformationItem_PR_geographicalCoordinates;
|
||||
asn1cCalloc(trpinfo_item->choice.geographicalCoordinates, geoCord);
|
||||
f1ap_trp_position_definition_type_t *f1_trpPosDef= &resItem->choice.geographicalCoordinates.tRPPositionDefinitionType;
|
||||
NRPPA_TRPPositionDefinitionType_t *nrppa_trpPosDef= &geoCord->tRPPositionDefinitionType;
|
||||
switch (f1_trpPosDef->present){
|
||||
case f1ap_trp_position_definition_type_pr_NOTHING:
|
||||
nrppa_trpPosDef->present = NRPPA_TRPPositionDefinitionType_PR_NOTHING;
|
||||
break;
|
||||
case f1ap_trp_position_definition_type_pr_direct:
|
||||
nrppa_trpPosDef->present = NRPPA_TRPPositionDefinitionType_PR_direct;
|
||||
NRPPA_ERROR(" TODO at RRC/F1AP TRP Position Definition Type Direct\n");
|
||||
break;
|
||||
case f1ap_trp_position_definition_type_pr_referenced:
|
||||
nrppa_trpPosDef->present = NRPPA_TRPPositionDefinitionType_PR_referenced;
|
||||
asn1cCalloc(nrppa_trpPosDef->choice.referenced, referenced);
|
||||
// IE referencePoint
|
||||
switch (f1_trpPosDef->choice.referenced.referencePoint.present){
|
||||
case f1ap_reference_point_pr_NOTHING:
|
||||
referenced->referencePoint.present=NRPPA_ReferencePoint_PR_NOTHING;
|
||||
break;
|
||||
case f1ap_reference_point_pr_coordinateID:
|
||||
referenced->referencePoint.present=NRPPA_ReferencePoint_PR_relativeCoordinateID;
|
||||
referenced->referencePoint.choice.relativeCoordinateID=f1_trpPosDef->choice.referenced.referencePoint.choice.coordinateID;
|
||||
break;
|
||||
case f1ap_reference_point_pr_referencePointCoordinate:
|
||||
NRPPA_ERROR(" TODO at RRC/F1AP TRP referencePointCoordinate\n");
|
||||
break;
|
||||
case f1ap_reference_point_pr_referencePointCoordinateHA:
|
||||
NRPPA_ERROR(" TODO at RRC/F1AP TRP referencePointCoordinateHA\n");
|
||||
break;
|
||||
default:
|
||||
NRPPA_ERROR("Unknown TRP referencePoint\n");
|
||||
break;
|
||||
}
|
||||
|
||||
// IE referencePointType
|
||||
switch (f1_trpPosDef->choice.referenced.referencePointType.present){
|
||||
case f1ap_trp_reference_point_type_pr_NOTHING:
|
||||
referenced->referencePointType.present=NRPPA_TRPReferencePointType_PR_NOTHING;
|
||||
break;
|
||||
case f1ap_trp_reference_point_type_pr_tRPPositionRelativeGeodetic:
|
||||
referenced->referencePointType.present=NRPPA_TRPReferencePointType_PR_tRPPositionRelativeGeodetic;
|
||||
NRPPA_ERROR(" TODO F1AP not done TRP Reference Point Type\n");
|
||||
break;
|
||||
case f1ap_trp_reference_point_type_pr_tRPPositionRelativeCartesian:
|
||||
referenced->referencePointType.present=NRPPA_TRPReferencePointType_PR_tRPPositionRelativeCartesian;
|
||||
asn1cCalloc(referenced->referencePointType.choice.tRPPositionRelativeCartesian, RelCart);
|
||||
f1ap_relative_cartesian_location_t *f1_RelCart=&f1_trpPosDef->choice.referenced.referencePointType.choice.tRPPositionRelativeCartesian;
|
||||
RelCart->xvalue=f1_RelCart->xvalue;
|
||||
RelCart->xYZunit=f1_RelCart->xYZunit;
|
||||
RelCart->yvalue=f1_RelCart->yvalue;
|
||||
RelCart->zvalue=f1_RelCart->zvalue;
|
||||
RelCart->locationUncertainty.horizontalConfidence=f1_RelCart->locationUncertainty.horizontalConfidence;
|
||||
RelCart->locationUncertainty.horizontalUncertainty=f1_RelCart->locationUncertainty.horizontalUncertainty;
|
||||
RelCart->locationUncertainty.verticalConfidence=f1_RelCart->locationUncertainty.verticalConfidence;
|
||||
RelCart->locationUncertainty.verticalUncertainty=f1_RelCart->locationUncertainty.verticalUncertainty;
|
||||
break;
|
||||
default:
|
||||
NRPPA_ERROR(" Unknown TRP Reference Point Type\n");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
NRPPA_ERROR("Unknown TRP Position Definition Type\n");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
/*TODO following options are not filled at RRC level
|
||||
case f1ap_trp_information_type_response_item_pr_pCI_NR:
|
||||
trpinfo_item->present= NRPPA_TRPInformationItem_PR_pCI_NR;
|
||||
trpinfo_item->choice.pCI_NR = resItem->choice.pCI_NR;
|
||||
break;
|
||||
case f1ap_trp_information_type_response_item_pr_nRARFCN:
|
||||
// Not present in NRPPa
|
||||
//trpinfo_item->present= NRPPA_TRPInformationItem_PR_nRARFCN;
|
||||
//trpinfo_item->choice.nRARFCN = resItem->choice.nRARFCN;
|
||||
break;
|
||||
case f1ap_trp_information_type_response_item_pr_pRSConfiguration:
|
||||
trpinfo_item->present= NRPPA_TRPInformationItem_PR_pRSConfiguration;
|
||||
trpinfo_item->choice.pRSConfiguration = resItem->choice.pRSConfiguration;
|
||||
break;
|
||||
case f1ap_trp_information_type_response_item_pr_sSBinformation:
|
||||
trpinfo_item->present= NRPPA_TRPInformationItem_PR_sSBinformation;
|
||||
trpinfo_item->choice.sSBinformation = resItem->choice.sSBinformation;
|
||||
break;
|
||||
case f1ap_trp_information_type_response_item_pr_sFNInitialisationTime:
|
||||
trpinfo_item->present= NRPPA_TRPInformationItem_PR_sFNInitialisationTime;
|
||||
trpinfo_item->choice.sFNInitialisationTime = resItem->choice.sFNInitialisationTime;
|
||||
break;
|
||||
case f1ap_trp_information_type_response_item_pr_spatialDirectionInformation:
|
||||
trpinfo_item->present= NRPPA_TRPInformationItem_PR_spatialDirectionInformation;
|
||||
trpinfo_item->choice.spatialDirectionInformation = resItem->choice.spatialDirectionInformation;
|
||||
break;
|
||||
*/
|
||||
default:
|
||||
NRPPA_ERROR("Unknown TRP Information Item\n");
|
||||
break;
|
||||
}
|
||||
if (k < nb_tRPInfoTypes - 1) {
|
||||
resItem++;
|
||||
}
|
||||
} // for(int k=0; k < nb_tRPInfoTypes; k++)
|
||||
if (i < nb_of_TRP - 1) {
|
||||
trpInfItem++;
|
||||
}
|
||||
} // for (int i = 0; i < nb_of_TRP; i++)
|
||||
|
||||
} // IE Information List
|
||||
|
||||
/*// TODO IE 9.2.2 CriticalityDiagnostics (O)
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NRPPA_TRPInformationResponse_IEs_t, ie);
|
||||
ie->id = NRPPA_ProtocolIE_ID_id_CriticalityDiagnostics;
|
||||
ie->criticality = NRPPA_Criticality_ignore;
|
||||
ie->value.present = NRPPA_TRPInformationResponse_IEs__value_PR_CriticalityDiagnostics;
|
||||
}*/
|
||||
|
||||
LOG_I(NRPPA, "Calling encoder for TRPInformationResponse \n");
|
||||
xer_fprint(stdout, &asn_DEF_NRPPA_NRPPA_PDU, &pdu);
|
||||
|
||||
/* Encode NRPPA message */
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t length = 0;
|
||||
if (nrppa_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
NRPPA_ERROR("Failed to encode Uplink NRPPa TRPInformationResponse\n");
|
||||
/* Encode procedure has failed... */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Forward the NRPPA PDU to NGAP */
|
||||
nrppa_f1ap_info_t *info=&resp->nrppa_msg_info;
|
||||
if (info->gNB_ue_ngap_id > 0 && info->amf_ue_ngap_id > 0) //( 1) // TODO
|
||||
{
|
||||
LOG_D(NRPPA,
|
||||
"Sending UplinkUEAssociatedNRPPa (TRPInformationResponse) to NGAP (gNB_ue_ngap_id= %d, amf_ue_ngap_id =%ld) \n",
|
||||
info->gNB_ue_ngap_id,
|
||||
info->amf_ue_ngap_id);
|
||||
nrppa_gNB_itti_send_UplinkUEAssociatedNRPPa(info->instance,
|
||||
info->gNB_ue_ngap_id,
|
||||
info->amf_ue_ngap_id,
|
||||
info->routing_id_buffer,
|
||||
info->routing_id_length,
|
||||
buffer,
|
||||
length);
|
||||
return length;
|
||||
} else if (info->gNB_ue_ngap_id == -1 && info->amf_ue_ngap_id == -1) //
|
||||
{
|
||||
LOG_D(NRPPA,
|
||||
"Sending UplinkNonUEAssociatedNRPPa (TRPInformationResponse) to NGAP (gNB_ue_ngap_id= %d, amf_ue_ngap_id =%ld) \n",
|
||||
info->gNB_ue_ngap_id,
|
||||
info->amf_ue_ngap_id);
|
||||
nrppa_gNB_itti_send_UplinkNonUEAssociatedNRPPa(info->instance,
|
||||
info->routing_id_buffer,
|
||||
info->routing_id_length,
|
||||
buffer,
|
||||
length);
|
||||
return length;
|
||||
} else {
|
||||
NRPPA_ERROR("Failed to find context for Uplink NonUE/UE Associated NRPPa TRPInformationResponse\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO fill F1AP msg for rrc
|
||||
int nrppa_gNB_TRPInformationFailure(instance_t instance, MessageDef *msg_p)
|
||||
{
|
||||
f1ap_trp_information_failure_t *failure_msg = &F1AP_TRP_INFORMATION_FAILURE(msg_p);
|
||||
LOG_I(NRPPA,
|
||||
"Received TrpInformationFailure info from RRC transaction_id=%d, rnti= %04x\n",
|
||||
failure_msg->transaction_id,
|
||||
failure_msg->nrppa_msg_info.ue_rnti);
|
||||
|
||||
// Prepare NRPPA Position Information failure
|
||||
NRPPA_NRPPA_PDU_t pdu ={0};
|
||||
/* Prepare the NRPPA message to encode for unsuccessfulOutcome TRPInformationFailure */
|
||||
|
||||
// IE: 9.2.3 Message Type unsuccessfulOutcome TRPInformationFaliure (M)
|
||||
memset(&pdu, 0, sizeof(pdu));
|
||||
pdu.present = NRPPA_NRPPA_PDU_PR_unsuccessfulOutcome;
|
||||
asn1cCalloc(pdu.choice.unsuccessfulOutcome, head);
|
||||
head->procedureCode = NRPPA_ProcedureCode_id_tRPInformationExchange;
|
||||
head->criticality = NRPPA_Criticality_reject;
|
||||
head->value.present = NRPPA_UnsuccessfulOutcome__value_PR_TRPInformationFailure;
|
||||
|
||||
// IE 9.2.4 nrppatransactionID (M)
|
||||
head->nrppatransactionID = failure_msg->nrppa_msg_info.nrppa_transaction_id;
|
||||
|
||||
NRPPA_TRPInformationFailure_t *out = &head->value.choice.TRPInformationFailure;
|
||||
// TODO IE 9.2.1 Cause (M)
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NRPPA_TRPInformationFailure_IEs_t, ie);
|
||||
ie->id = NRPPA_ProtocolIE_ID_id_Cause;
|
||||
ie->criticality = NRPPA_Criticality_ignore;
|
||||
ie->value.present = NRPPA_TRPInformationFailure_IEs__value_PR_Cause;
|
||||
switch (failure_msg->cause.present) {
|
||||
case f1ap_cause_nothing:
|
||||
ie->value.choice.Cause.present = NRPPA_Cause_PR_NOTHING;
|
||||
break;
|
||||
case f1ap_cause_radio_network:
|
||||
ie->value.choice.Cause.present = NRPPA_Cause_PR_radioNetwork;
|
||||
ie->value.choice.Cause.choice.radioNetwork = failure_msg->cause.choice.radioNetwork;
|
||||
break;
|
||||
// case f1ap_cause_transport:
|
||||
// ie->value.choice.Cause.present = NRPPA_Cause_PR_transport;
|
||||
// ie->value.choice.Cause.choice.transport = 0;
|
||||
// break; // IE not in nrppa specification
|
||||
case f1ap_cause_protocol:
|
||||
ie->value.choice.Cause.present = NRPPA_Cause_PR_protocol;
|
||||
ie->value.choice.Cause.choice.protocol = failure_msg->cause.choice.protocol;
|
||||
break;
|
||||
case f1ap_cause_misc:
|
||||
ie->value.choice.Cause.present = NRPPA_Cause_PR_misc;
|
||||
ie->value.choice.Cause.choice.misc = failure_msg->cause.choice.misc;
|
||||
break;
|
||||
default:
|
||||
NRPPA_ERROR("Unknown TrpInformationFailure Cause\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*// TODO IE 9.2.2 CriticalityDiagnostics (O)
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NRPPA_TRPInformationFailure_IEs_t, ie);
|
||||
ie->id = NRPPA_ProtocolIE_ID_id_CriticalityDiagnostics;
|
||||
ie->criticality = NRPPA_Criticality_ignore;
|
||||
ie->value.present = NRPPA_TRPInformationFailure_IEs__value_PR_CriticalityDiagnostics;
|
||||
}*/
|
||||
|
||||
/* Encode NRPPA message */
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t length = 0;
|
||||
if (nrppa_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
NRPPA_ERROR("Failed to encode Uplink NRPPa TRPInformationFailure \n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Forward the NRPPA PDU to NGAP */
|
||||
nrppa_f1ap_info_t *info=&failure_msg->nrppa_msg_info;
|
||||
if (info->gNB_ue_ngap_id > 0 && info->amf_ue_ngap_id > 0) {
|
||||
LOG_D(NRPPA,
|
||||
"Sending UplinkUEAssociatedNRPPa (TRPInformationFailure) to NGAP (gNB_ue_ngap_id= %d, amf_ue_ngap_id =%ld) \n",
|
||||
info->gNB_ue_ngap_id,
|
||||
info->amf_ue_ngap_id);
|
||||
nrppa_gNB_itti_send_UplinkUEAssociatedNRPPa(info->instance,
|
||||
info->gNB_ue_ngap_id,
|
||||
info->amf_ue_ngap_id,
|
||||
info->routing_id_buffer,
|
||||
info->routing_id_length,
|
||||
buffer,
|
||||
length); // tx_nrppa_pdu=buffer, nrppa_pdu_length=length
|
||||
return length;
|
||||
} else if (info->gNB_ue_ngap_id == -1 && info->amf_ue_ngap_id == -1) //
|
||||
{
|
||||
LOG_D(NRPPA,
|
||||
"Sending UplinkNonUEAssociatedNRPPa (TRPInformationFailure) to NGAP (gNB_ue_ngap_id= %d, amf_ue_ngap_id =%ld) \n",
|
||||
info->gNB_ue_ngap_id,
|
||||
info->amf_ue_ngap_id);
|
||||
nrppa_gNB_itti_send_UplinkNonUEAssociatedNRPPa(info->instance,
|
||||
info->routing_id_buffer,
|
||||
info->routing_id_length,
|
||||
buffer,
|
||||
length);
|
||||
return length;
|
||||
} else {
|
||||
NRPPA_ERROR("Failed to find context for Uplink NonUE/UE Associated NRPPa PositioningInformationFailure\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_gNB_TRP_information_transfer_procedures.h
|
||||
* \brief NRPPA gNB tasks related to TRP information transfer
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
*\date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#ifndef NRPPA_GNB_TRP_INFORMATION_TRANSFER_PROCEDURES_H_
|
||||
#define NRPPA_GNB_TRP_INFORMATION_TRANSFER_PROCEDURES_H_
|
||||
|
||||
/* TRPInformationExchange (Parent) procedure for TRPInformationRequest, TRPInformationResponse, and
|
||||
TRPInformationFailure*/
|
||||
int nrppa_gNB_handle_TRPInformationExchange(nrppa_gnb_ue_info_t *nrppa_msg_info, NRPPA_NRPPA_PDU_t *pdu);
|
||||
int nrppa_gNB_TRPInformationFailure(instance_t instance, MessageDef *msg_p);
|
||||
int nrppa_gNB_TRPInformationResponse(instance_t instance, MessageDef *msg_p);
|
||||
|
||||
#endif /* NRPPA_GNB_TRP_INFORMATION_TRANSFER_PROCEDURES_H_ */
|
||||
224
openair3/NRPPA/nrppa_gNB_decoder.c
Normal file
224
openair3/NRPPA/nrppa_gNB_decoder.c
Normal file
@@ -0,0 +1,224 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_gNB_decoder.c
|
||||
* \brief NRPPA pdu decode procedures for gNB
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
*\date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "assertions.h"
|
||||
#include "intertask_interface.h"
|
||||
#include "nrppa_common.h"
|
||||
#include "nrppa_gNB_decoder.h"
|
||||
|
||||
static int nrppa_gNB_decode_initiating_message(NRPPA_NRPPA_PDU_t *pdu)
|
||||
{
|
||||
asn_encode_to_new_buffer_result_t res = {NULL, {0, NULL, NULL}};
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
switch (pdu->choice.initiatingMessage->procedureCode) {
|
||||
case NRPPA_ProcedureCode_id_positioningInformationExchange: // Parent procedure for PositioningInformationRequest,
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Positioning Information Request initiating message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_positioningActivation:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Positioning Activation Request initiating message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_positioningInformationUpdate:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Positioning Information Update initiating message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_positioningDeactivation:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Positioning Deactivation Request initiating message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_tRPInformationExchange: // Parent procedure for TRPInformationRequest,
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "TRP Information Request initiating message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_Measurement: // Parent procedure for Measurement Request,
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Measurement Request initiating message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_MeasurementReport:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Measurement Report initiating message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_MeasurementFailureIndication:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Measurement Failure Indication initiating message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_MeasurementAbort:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Measurement Abort initiating message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_MeasurementUpdate:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Measurement Update initiating message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
/*TODO add other procedures check TABLE 8.1-2 and TABLE 8.1-1 of NRPPA TS38.455 v16*/
|
||||
// TODO ad**l add remaining DOWNLINK type NRPPA Procedure code
|
||||
|
||||
default:
|
||||
NRPPA_ERROR("Unknown procedure ID (%d) for initiating message\n", (int)pdu->choice.initiatingMessage->procedureCode);
|
||||
AssertFatal(0, "Unknown procedure ID (%d) for initiating message\n", (int)pdu->choice.initiatingMessage->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nrppa_gNB_decode_successful_outcome(NRPPA_NRPPA_PDU_t *pdu)
|
||||
{
|
||||
asn_encode_to_new_buffer_result_t res = {NULL, {0, NULL, NULL}};
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
switch (pdu->choice.successfulOutcome->procedureCode) {
|
||||
case NRPPA_ProcedureCode_id_positioningInformationExchange:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Positioning Information Response successfull outcome message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_positioningActivation:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Positioning Activation Response successfull outcome message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_tRPInformationExchange:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "TRP Information Response successfull outcome message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_Measurement:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Measurement Response successfull outcome message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
// ad**l TODO add other procedures check TABLE 8.1-2 and TABLE 8.1-1 of NRPPA TS38.455 v16
|
||||
|
||||
default:
|
||||
NRPPA_ERROR("Unknown procedure ID (%d) for successfull outcome message\n", (int)pdu->choice.initiatingMessage->procedureCode);
|
||||
AssertFatal(0,
|
||||
"Unknown procedure ID (%d) for successfull outcome message\n",
|
||||
(int)pdu->choice.initiatingMessage->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nrppa_gNB_decode_unsuccessful_outcome(NRPPA_NRPPA_PDU_t *pdu)
|
||||
{
|
||||
asn_encode_to_new_buffer_result_t res = {NULL, {0, NULL, NULL}};
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
switch (pdu->choice.unsuccessfulOutcome->procedureCode) {
|
||||
case NRPPA_ProcedureCode_id_positioningInformationExchange:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Positioning Information Failure unsuccessfull outcome message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_positioningActivation:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Positioning Activation Failure unsuccessfull outcome message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_tRPInformationExchange:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "TRP Information Failure unsuccessfull outcome message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NRPPA_ProcedureCode_id_Measurement:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
LOG_I(NRPPA, "Measurement Failure unsuccessfull outcome message\n");
|
||||
free(res.buffer);
|
||||
break;
|
||||
// ad**l TODO add other procedures check TABLE 8.1-2 and TABLE 8.1-1 of NRPPA TS38.455 v16
|
||||
|
||||
default:
|
||||
NRPPA_ERROR("Unknown procedure ID (%d) for unsuccessfull outcome message\n",
|
||||
(int)pdu->choice.initiatingMessage->procedureCode);
|
||||
AssertFatal(0,
|
||||
"Unknown procedure ID (%d) for unsuccessfull outcome message\n",
|
||||
(int)pdu->choice.initiatingMessage->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nrppa_gNB_decode_pdu(NRPPA_NRPPA_PDU_t *pdu, const uint8_t *const buffer, const uint32_t length)
|
||||
{
|
||||
asn_dec_rval_t dec_ret;
|
||||
DevAssert(pdu != NULL);
|
||||
DevAssert(buffer != NULL);
|
||||
asn_codec_ctx_t st = {.max_stack_size = 100 * 1000}; // if we enable asn1c debug the stack size become large // ad**l todo
|
||||
dec_ret = aper_decode(&st, &asn_DEF_NRPPA_NRPPA_PDU, (void **)&pdu, buffer, length, 0, 0);
|
||||
if (dec_ret.code != RC_OK) {
|
||||
NRPPA_ERROR("Failed to decode pdu\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (pdu->present) {
|
||||
case NRPPA_NRPPA_PDU_PR_initiatingMessage:
|
||||
return nrppa_gNB_decode_initiating_message(pdu);
|
||||
|
||||
case NRPPA_NRPPA_PDU_PR_successfulOutcome:
|
||||
return nrppa_gNB_decode_successful_outcome(pdu);
|
||||
|
||||
case NRPPA_NRPPA_PDU_PR_unsuccessfulOutcome:
|
||||
return nrppa_gNB_decode_unsuccessful_outcome(pdu);
|
||||
|
||||
default:
|
||||
LOG_I(NRPPA, "Unknown presence (%d) or not implemented\n", (int)pdu->present);
|
||||
break;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
44
openair3/NRPPA/nrppa_gNB_decoder.h
Normal file
44
openair3/NRPPA/nrppa_gNB_decoder.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
/*! \file nrppa_gNB_decoder.h
|
||||
* \brief NRPPA pdu decode procedures for gNB
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
*\date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* ad**l todo */
|
||||
#include "nrppa_common.h"
|
||||
/* ad**l todo */
|
||||
|
||||
#ifndef NRPPA_GNB_DECODER_H_
|
||||
#define NRPPA_GNB_DECODER_H_
|
||||
|
||||
// int nrppa_gNB_decode_pdu(NRPPA_NRPPA_PDU_t *pdu, const uint8_t *const buffer, const uint32_t length) __attribute__
|
||||
// ((warn_unused_result)); // to check ad**l __attribute__ ((warn_unused_result))
|
||||
|
||||
int nrppa_gNB_decode_pdu(NRPPA_NRPPA_PDU_t *pdu, const uint8_t *const buffer, const uint32_t length)
|
||||
__attribute__((warn_unused_result));
|
||||
#endif /* NRPPA_GNB_DECODER_H_ */
|
||||
39
openair3/NRPPA/nrppa_gNB_defs.h
Normal file
39
openair3/NRPPA/nrppa_gNB_defs.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file ngap_gNB_defs.h
|
||||
* \brief NRPPA define procedures for gNB
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
*\date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "queue.h"
|
||||
#include "tree.h"
|
||||
|
||||
#ifndef NRPPA_GNB_DEFS_H_
|
||||
#define NRPPA_GNB_DEFS_H_
|
||||
|
||||
#endif /* NRPPA_GNB_DEFS_H_ */
|
||||
154
openair3/NRPPA/nrppa_gNB_encoder.c
Normal file
154
openair3/NRPPA/nrppa_gNB_encoder.c
Normal file
@@ -0,0 +1,154 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_gNB_encoder.c
|
||||
* \brief ngap pdu encode procedures for gNB
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
*\date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "nrppa_common.h"
|
||||
#include "nrppa_gNB_encoder.h"
|
||||
|
||||
static inline int nrppa_gNB_encode_initiating(NRPPA_NRPPA_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
|
||||
{
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
const NRPPA_ProcedureCode_t tmp[] = {
|
||||
NRPPA_ProcedureCode_id_positioningInformationExchange, // Parent procedure for PositioningInformationRequest,
|
||||
NRPPA_ProcedureCode_id_positioningActivation,
|
||||
NRPPA_ProcedureCode_id_positioningInformationUpdate,
|
||||
NRPPA_ProcedureCode_id_positioningDeactivation,
|
||||
NRPPA_ProcedureCode_id_tRPInformationExchange,
|
||||
NRPPA_ProcedureCode_id_Measurement,
|
||||
NRPPA_ProcedureCode_id_MeasurementReport,
|
||||
NRPPA_ProcedureCode_id_MeasurementFailureIndication,
|
||||
NRPPA_ProcedureCode_id_MeasurementAbort,
|
||||
NRPPA_ProcedureCode_id_MeasurementUpdate};
|
||||
// TODO add remaining UPLINK type NRPPA Procedure codes with message type Initiating
|
||||
// For other procedures check TABLE 8.1-2 and TABLE 8.1-1 of NRPPA TS38.455 v16
|
||||
|
||||
int i;
|
||||
for (i = 0; i < sizeofArray(tmp); i++)
|
||||
if (pdu->choice.initiatingMessage->procedureCode == tmp[i])
|
||||
break;
|
||||
if (i == sizeofArray(tmp)) {
|
||||
NRPPA_DEBUG("Unknown procedure ID (%d) for initiating message\n", (int)pdu->choice.initiatingMessage->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
asn_encode_to_new_buffer_result_t res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
AssertFatal(res.result.encoded > 0, "failed to encode NRPPA msg\n");
|
||||
*buffer = res.buffer;
|
||||
*len = res.result.encoded;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int nrppa_gNB_encode_successfull_outcome(NRPPA_NRPPA_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
|
||||
{
|
||||
DevAssert(pdu != NULL);
|
||||
const NRPPA_ProcedureCode_t tmp[] = {
|
||||
NRPPA_ProcedureCode_id_positioningInformationExchange, // Parent procedure for PositioningInformationResponse
|
||||
NRPPA_ProcedureCode_id_positioningActivation,
|
||||
NRPPA_ProcedureCode_id_tRPInformationExchange,
|
||||
NRPPA_ProcedureCode_id_Measurement};
|
||||
// TODO ad**l add remaining UPLINK type NRPPA Procedure codes with message type successful
|
||||
// For other procedures check TABLE 8.1-2 and TABLE 8.1-1 of NRPPA TS38.455 v16
|
||||
int i;
|
||||
for (i = 0; i < sizeofArray(tmp); i++)
|
||||
if (pdu->choice.successfulOutcome->procedureCode == tmp[i])
|
||||
break;
|
||||
if (i == sizeofArray(tmp)) {
|
||||
NRPPA_WARN("Unknown procedure ID (%ld) for successfull outcome message\n", pdu->choice.successfulOutcome->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
// printf("TEST 1 nrppa encoder for PositioningInformationResponse \n");
|
||||
// xer_fprint(stdout, &asn_DEF_NRPPA_NRPPA_PDU, pdu); // test adeel
|
||||
asn_encode_to_new_buffer_result_t res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
AssertFatal(res.result.encoded > 0, "failed to encode NRPPA msg\n");
|
||||
*buffer = res.buffer;
|
||||
*len = res.result.encoded;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int nrppa_gNB_encode_unsuccessfull_outcome(NRPPA_NRPPA_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
|
||||
{
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
const NRPPA_ProcedureCode_t tmp[] = {
|
||||
NRPPA_ProcedureCode_id_positioningInformationExchange, // Parent procedure for PositioningInformationFailure
|
||||
NRPPA_ProcedureCode_id_positioningActivation,
|
||||
NRPPA_ProcedureCode_id_tRPInformationExchange,
|
||||
NRPPA_ProcedureCode_id_Measurement};
|
||||
// TODO ad**l add remaining UPLINK type NRPPA Procedure codes with message type unsuccessful
|
||||
// For other procedures check TABLE 8.1-2 and TABLE 8.1-1 of NRPPA TS38.455 v16
|
||||
|
||||
int i;
|
||||
for (i = 0; i < sizeofArray(tmp); i++)
|
||||
if (pdu->choice.unsuccessfulOutcome->procedureCode == tmp[i])
|
||||
break;
|
||||
if (i == sizeofArray(tmp)) {
|
||||
NRPPA_WARN("Unknown procedure ID (%ld) for unsuccessfull outcome message\n", pdu->choice.unsuccessfulOutcome->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
asn_encode_to_new_buffer_result_t res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
AssertFatal(res.result.encoded > 0, "failed to encode NRPPA msg\n");
|
||||
*buffer = res.buffer;
|
||||
*len = res.result.encoded;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nrppa_gNB_encode_pdu(NRPPA_NRPPA_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
|
||||
{
|
||||
int ret = -1;
|
||||
DevAssert(pdu != NULL);
|
||||
DevAssert(buffer != NULL);
|
||||
DevAssert(len != NULL);
|
||||
if (asn1_xer_print) {
|
||||
xer_fprint(stdout, &asn_DEF_NRPPA_NRPPA_PDU, (void *)pdu);
|
||||
}
|
||||
switch (pdu->present) {
|
||||
case NRPPA_NRPPA_PDU_PR_initiatingMessage:
|
||||
ret = nrppa_gNB_encode_initiating(pdu, buffer, len);
|
||||
break;
|
||||
|
||||
case NRPPA_NRPPA_PDU_PR_successfulOutcome:
|
||||
ret = nrppa_gNB_encode_successfull_outcome(pdu, buffer, len);
|
||||
break;
|
||||
|
||||
case NRPPA_NRPPA_PDU_PR_unsuccessfulOutcome:
|
||||
ret = nrppa_gNB_encode_unsuccessfull_outcome(pdu, buffer, len);
|
||||
break;
|
||||
|
||||
default:
|
||||
NRPPA_DEBUG("Unknown message outcome (%d) or not implemented", (int)pdu->present);
|
||||
return -1;
|
||||
}
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NRPPA_NRPPA_PDU, pdu);
|
||||
return ret;
|
||||
}
|
||||
36
openair3/NRPPA/nrppa_gNB_encoder.h
Normal file
36
openair3/NRPPA/nrppa_gNB_encoder.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file ngap_gNB_encoder.h
|
||||
* \brief ngap pdu encode procedures for gNB
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
*\date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#ifndef NRPPA_GNB_ENCODER_H_
|
||||
#define NRPPA_GNB_ENCODER_H_
|
||||
|
||||
int nrppa_gNB_encode_pdu(NRPPA_NRPPA_PDU_t *pdu, uint8_t **buffer, uint32_t *len) __attribute__((warn_unused_result));
|
||||
|
||||
#endif /* NRPPA_GNB_ENCODER_H_ */
|
||||
200
openair3/NRPPA/nrppa_gNB_handlers.c
Normal file
200
openair3/NRPPA/nrppa_gNB_handlers.c
Normal file
@@ -0,0 +1,200 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_gNB_handlers.c
|
||||
* \brief NRPPA messages handlers for gNB
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
*\date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* TODO */
|
||||
#include "intertask_interface.h"
|
||||
#include "nrppa_gNB_handlers.h"
|
||||
#include "nrppa_gNB_decoder.h"
|
||||
#include "nrppa_common.h"
|
||||
#include "nrppa_gNB_position_information_transfer_procedures.h"
|
||||
#include "nrppa_gNB_TRP_information_transfer_procedures.h"
|
||||
#include "nrppa_gNB_measurement_information_transfer_procedures.h"
|
||||
|
||||
/*static void allocCopy(ngap_pdu_t *out, OCTET_STRING_t in)
|
||||
{
|
||||
if (in.size) {
|
||||
out->buffer = malloc(in.size);
|
||||
memcpy(out->buffer, in.buf, in.size);
|
||||
}
|
||||
out->length = in.size;
|
||||
}*/
|
||||
|
||||
/* TODO ad**l */
|
||||
char *nrppa_direction2String(int nrppa_dir)
|
||||
{
|
||||
static char *nrppa_direction_String[] = {
|
||||
"", /* Nothing */
|
||||
"Originating message", /* originating message */
|
||||
"Successfull outcome", /* successfull outcome */
|
||||
"UnSuccessfull outcome", /* successfull outcome */
|
||||
};
|
||||
return (nrppa_direction_String[nrppa_dir]);
|
||||
}
|
||||
|
||||
/* TODO ad**l */
|
||||
|
||||
/* Handlers matrix. Only gNB related procedure present here */
|
||||
nrppa_message_decoded_callback nrppa_messages_callback[][3] = {
|
||||
{0, 0, 0}, // NRPPA_ProcedureCode_id_errorIndication ((NRPPA_ProcedureCode_t)0)
|
||||
{0, 0, 0}, // NRPPA_ProcedureCode_id_privateMessage ((NRPPA_ProcedureCode_t)1)
|
||||
{0, 0, 0}, // NRPPA_ProcedureCode_id_e_CIDMeasurementInitiation ((NRPPA_ProcedureCode_t)2)
|
||||
{0, 0, 0}, // NRPPA_ProcedureCode_id_e_CIDMeasurementFailureIndication ((NRPPA_ProcedureCode_t)3)
|
||||
{0, 0, 0}, // NRPPA_ProcedureCode_id_e_CIDMeasurementReport ((NRPPA_ProcedureCode_t)4)
|
||||
{0, 0, 0}, // NRPPA_ProcedureCode_id_e_CIDMeasurementTermination ((NRPPA_ProcedureCode_t)5)
|
||||
{0, 0, 0}, // NRPPA_ProcedureCode_id_oTDOAInformationExchange ((NRPPA_ProcedureCode_t)6)
|
||||
{0, 0, 0}, // NRPPA_ProcedureCode_id_assistanceInformationControl ((NRPPA_ProcedureCode_t)7)
|
||||
{0, 0, 0}, // NRPPA_ProcedureCode_id_assistanceInformationFeedback ((NRPPA_ProcedureCode_t)8)
|
||||
{nrppa_gNB_handle_PositioningInformationExchange,
|
||||
0,
|
||||
0}, // NRPPA_ProcedureCode_id_positioningInformationExchange ((NRPPA_ProcedureCode_t)9) /* PositioningInformationRequest */ //
|
||||
// todo nrppa_gNB_handle_PositioningInformationExchange
|
||||
{0, 0, 0}, // NRPPA_ProcedureCode_id_positioningInformationUpdate ((NRPPA_ProcedureCode_t)10)
|
||||
{nrppa_gNB_handle_Measurement, 0, 0}, // NRPPA_ProcedureCode_id_Measurement ((NRPPA_ProcedureCode_t)11) /* MeasurementRequest */
|
||||
// // todo nrppa_gNB_handle_Measurement
|
||||
{0, 0, 0}, // NRPPA_ProcedureCode_id_MeasurementReport ((NRPPA_ProcedureCode_t)12)
|
||||
{nrppa_gNB_handle_MeasurementUpdate,
|
||||
0,
|
||||
0}, // NRPPA_ProcedureCode_id_MeasurementUpdate ((NRPPA_ProcedureCode_t)13) // todo nrppa_gNB_handle_MeasurementUpdate
|
||||
{nrppa_gNB_handle_MeasurementAbort,
|
||||
0,
|
||||
0}, // NRPPA_ProcedureCode_id_MeasurementAbort ((NRPPA_ProcedureCode_t)14) // todo nrppa_gNB_handle_MeasurementAbort
|
||||
{0, 0, 0}, // NRPPA_ProcedureCode_id_MeasurementFailureIndication ((NRPPA_ProcedureCode_t)15)
|
||||
{nrppa_gNB_handle_TRPInformationExchange, 0, 0}, // NRPPA_ProcedureCode_id_tRPInformationExchange ((NRPPA_ProcedureCode_t)16) /*
|
||||
// TRPInformationRequest */ // todo nrppa_gNB_handle_TRPInformationExchange
|
||||
{nrppa_gNB_handle_PositioningActivation,
|
||||
0,
|
||||
0}, // NRPPA_ProcedureCode_id_positioningActivation ((NRPPA_ProcedureCode_t)17) /* PositioningActivationRequest */ // todo
|
||||
// nrppa_gNB_handle_PositioningActivation
|
||||
{nrppa_gNB_handle_PositioningDeactivation,
|
||||
0,
|
||||
0}, // NRPPA_ProcedureCode_id_positioningDeactivation ((NRPPA_ProcedureCode_t)18) /* PositioningDeactivation */ // todo
|
||||
// nrppa_gNB_handle_PositioningDeactivation
|
||||
};
|
||||
|
||||
// Processing DownLINK UE ASSOCIATED NRPPA TRANSPORT
|
||||
int nrppa_handle_DownlinkUEAssociatedNRPPaTransport(instance_t instance,
|
||||
ngap_DownlinkUEAssociatedNRPPa_t *ngap_DownlinkUEAssociatedNRPPa_p)
|
||||
{
|
||||
LOG_I(NRPPA, "nrppa_handle_DownlinkUEAssociatedNRPPaTransport Handling case NGAP_DOWNLINKUEASSOCIATEDNRPPA \n");
|
||||
uint8_t *const data = ngap_DownlinkUEAssociatedNRPPa_p->nrppa_pdu.buffer;
|
||||
const uint32_t data_length = ngap_DownlinkUEAssociatedNRPPa_p->nrppa_pdu.length;
|
||||
NRPPA_NRPPA_PDU_t pdu;
|
||||
int ret;
|
||||
DevAssert(data != NULL);
|
||||
memset(&pdu, 0, sizeof(pdu));
|
||||
|
||||
if (nrppa_gNB_decode_pdu(&pdu, data, data_length) < 0) // todo nrppa_gNB_decode_pdu
|
||||
{
|
||||
NRPPA_ERROR("Failed to decode PDU\n");
|
||||
return -1;
|
||||
}
|
||||
/* Checking procedure Code and direction of message*/
|
||||
if (pdu.choice.initiatingMessage->procedureCode >= sizeof(nrppa_messages_callback) / (3 * sizeof(nrppa_message_decoded_callback))
|
||||
|| (pdu.present > NRPPA_NRPPA_PDU_PR_unsuccessfulOutcome)) {
|
||||
NRPPA_ERROR("[NGAP] Either procedureCode %ld or direction %d exceed expected\n",
|
||||
pdu.choice.initiatingMessage->procedureCode,
|
||||
pdu.present);
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NRPPA_NRPPA_PDU, &pdu);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* No handler present.
|
||||
* This can mean not implemented or no procedure for gNB (wrong direction).*/
|
||||
if (nrppa_messages_callback[pdu.choice.initiatingMessage->procedureCode][pdu.present - 1] == NULL) {
|
||||
NRPPA_ERROR("[NGAP] No handler for procedureCode %ld in %s\n",
|
||||
pdu.choice.initiatingMessage->procedureCode,
|
||||
nrppa_direction2String(pdu.present - 1));
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NRPPA_NRPPA_PDU, &pdu);
|
||||
return -1;
|
||||
}
|
||||
/* Calling the right handler*/
|
||||
nrppa_gnb_ue_info_t nrppa_msg_info;
|
||||
nrppa_msg_info.instance = instance;
|
||||
nrppa_msg_info.gNB_ue_ngap_id = ngap_DownlinkUEAssociatedNRPPa_p->gNB_ue_ngap_id;
|
||||
nrppa_msg_info.amf_ue_ngap_id = ngap_DownlinkUEAssociatedNRPPa_p->amf_ue_ngap_id;
|
||||
nrppa_msg_info.routing_id_buffer = ngap_DownlinkUEAssociatedNRPPa_p->routing_id.buffer;
|
||||
nrppa_msg_info.routing_id_length = ngap_DownlinkUEAssociatedNRPPa_p->routing_id.length;
|
||||
ret = (*nrppa_messages_callback[pdu.choice.initiatingMessage->procedureCode][pdu.present - 1])(&nrppa_msg_info, &pdu); // ad**l
|
||||
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NRPPA_NRPPA_PDU, &pdu);
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Processing DOWNLINK NON UE ASSOCIATED NRPPA TRANSPORT (9.2.9.4 of TS 38.413 Version 16.0.0.0 Release 16)
|
||||
int nrppa_handle_DownlinkNonUEAssociatedNRPPaTransport(instance_t instance,
|
||||
ngap_DownlinkNonUEAssociatedNRPPa_t *ngap_DownlinkNonUEAssociatedNRPPa_p)
|
||||
{
|
||||
LOG_D(NRPPA, "nrppa_handle_DownlinkNonUEAssociatedNRPPaTransport Handling case NGAP_DOWNLINKUEASSOCIATEDNRPPA \n");
|
||||
uint8_t *const data = ngap_DownlinkNonUEAssociatedNRPPa_p->nrppa_pdu.buffer;
|
||||
const uint32_t data_length = ngap_DownlinkNonUEAssociatedNRPPa_p->nrppa_pdu.length;
|
||||
NRPPA_NRPPA_PDU_t pdu;
|
||||
int ret;
|
||||
DevAssert(data != NULL);
|
||||
memset(&pdu, 0, sizeof(pdu));
|
||||
|
||||
if (nrppa_gNB_decode_pdu(&pdu, data, data_length) < 0) // todo nrppa_gNB_decode_pdu
|
||||
{
|
||||
NRPPA_ERROR("Failed to decode Downlink Non UE Associated NRPPa PDU\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Checking procedure Code and direction of message*/
|
||||
if (pdu.choice.initiatingMessage->procedureCode >= sizeof(nrppa_messages_callback) / (3 * sizeof(nrppa_message_decoded_callback))
|
||||
|| (pdu.present > NRPPA_NRPPA_PDU_PR_unsuccessfulOutcome)) {
|
||||
NRPPA_ERROR("[NGAP] Either procedureCode %ld or direction %d exceed expected\n",
|
||||
pdu.choice.initiatingMessage->procedureCode,
|
||||
pdu.present);
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NRPPA_NRPPA_PDU, &pdu);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* No handler present.
|
||||
* This can mean not implemented or no procedure for gNB (wrong direction).*/
|
||||
if (nrppa_messages_callback[pdu.choice.initiatingMessage->procedureCode][pdu.present - 1] == NULL) {
|
||||
NRPPA_ERROR("[NGAP] No handler for procedureCode %ld in %s\n",
|
||||
pdu.choice.initiatingMessage->procedureCode,
|
||||
nrppa_direction2String(pdu.present - 1));
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NRPPA_NRPPA_PDU, &pdu);
|
||||
return -1;
|
||||
}
|
||||
/* Calling the right handler*/
|
||||
nrppa_gnb_ue_info_t nrppa_msg_info;
|
||||
nrppa_msg_info.instance = instance;
|
||||
nrppa_msg_info.gNB_ue_ngap_id = -1; //%0; TODO check
|
||||
nrppa_msg_info.amf_ue_ngap_id = -1; //%0;
|
||||
nrppa_msg_info.routing_id_buffer = ngap_DownlinkNonUEAssociatedNRPPa_p->routing_id.buffer;
|
||||
nrppa_msg_info.routing_id_length = ngap_DownlinkNonUEAssociatedNRPPa_p->routing_id.length;
|
||||
ret = (*nrppa_messages_callback[pdu.choice.initiatingMessage->procedureCode][pdu.present - 1])(&nrppa_msg_info, &pdu);
|
||||
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NRPPA_NRPPA_PDU, &pdu);
|
||||
return ret;
|
||||
}
|
||||
38
openair3/NRPPA/nrppa_gNB_handlers.h
Normal file
38
openair3/NRPPA/nrppa_gNB_handlers.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_gNB_handlers.h
|
||||
* \brief NRPPA messages handlers for gNB
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
*\date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#ifndef NRPPA_GNB_HANDLERS_H_
|
||||
#define NRPPA_GNB_HANDLERS_H_
|
||||
|
||||
int nrppa_handle_DownlinkUEAssociatedNRPPaTransport(instance_t instance,
|
||||
ngap_DownlinkUEAssociatedNRPPa_t *ngap_DownlinkUEAssociatedNRPPa_p);
|
||||
int nrppa_handle_DownlinkNonUEAssociatedNRPPaTransport(instance_t instance,
|
||||
ngap_DownlinkNonUEAssociatedNRPPa_t *ngap_DownlinkNonUEAssociatedNRPPa_p);
|
||||
#endif /* NRPPA_GNB_HANDLERS_H_ */
|
||||
121
openair3/NRPPA/nrppa_gNB_itti_messaging.c
Normal file
121
openair3/NRPPA/nrppa_gNB_itti_messaging.c
Normal file
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_gNB_itti_messaging.c
|
||||
* \brief nrppa itti messages handlers for gNB
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
*\date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
/* TODO */
|
||||
#include "intertask_interface.h"
|
||||
#include "nrppa_gNB_itti_messaging.h"
|
||||
/* TODO */
|
||||
|
||||
void nrppa_gNB_itti_send_UplinkUEAssociatedNRPPa(instance_t instance,
|
||||
uint32_t gNB_ue_ngap_id,
|
||||
uint32_t amf_ue_ngap_id,
|
||||
uint8_t *routingId_buffer,
|
||||
uint32_t routingId_buffer_length,
|
||||
uint8_t *nrppa_pdu,
|
||||
uint32_t nrppa_pdu_length)
|
||||
{
|
||||
LOG_I(NRPPA, "initiating nrppa_gNB_itti_send_UplinkUEAssociatedNRPPa \n");
|
||||
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_NRPPA, 0, NGAP_UPLINKUEASSOCIATEDNRPPA);
|
||||
ngap_UplinkUEAssociatedNRPPa_t *ULNRPPA = &NGAP_UPLINKUEASSOCIATEDNRPPA(msg);
|
||||
ULNRPPA->gNB_ue_ngap_id = gNB_ue_ngap_id;
|
||||
|
||||
// Routing ID
|
||||
ULNRPPA->routing_id.buffer = malloc(sizeof(uint8_t) * routingId_buffer_length);
|
||||
memcpy(ULNRPPA->routing_id.buffer, routingId_buffer, routingId_buffer_length);
|
||||
ULNRPPA->routing_id.length = routingId_buffer_length;
|
||||
|
||||
// NRPPA PDU
|
||||
ULNRPPA->nrppa_pdu.buffer = malloc(sizeof(uint8_t) * nrppa_pdu_length);
|
||||
memcpy(ULNRPPA->nrppa_pdu.buffer, nrppa_pdu, nrppa_pdu_length);
|
||||
ULNRPPA->nrppa_pdu.length = nrppa_pdu_length;
|
||||
itti_send_msg_to_task(TASK_NGAP, instance, msg);
|
||||
|
||||
|
||||
/*MessageDef *msg=itti_alloc_new_message_sized(TASK_NRPPA, 0, NGAP_UPLINKUEASSOCIATEDNRPPA,
|
||||
sizeof(ngap_UplinkUEAssociatedNRPPa_t)+ routingId_buffer_length + nrppa_pdu_length);
|
||||
|
||||
ngap_UplinkUEAssociatedNRPPa_t *msgData = &NGAP_UPLINKUEASSOCIATEDNRPPA(msg);
|
||||
msgData->gNB_ue_ngap_id = gNB_ue_ngap_id;
|
||||
|
||||
// Routing ID
|
||||
msgData->routing_id.buffer=(uint8_t *)(msgData+1);
|
||||
memcpy(msgData->routing_id.buffer, routingId_buffer, routingId_buffer_length);
|
||||
msgData->routing_id.length = routingId_buffer_length;
|
||||
|
||||
// NRPPa PDU
|
||||
msgData->nrppa_pdu.buffer = msgData->routing_id.buffer+routingId_buffer_length;
|
||||
memcpy(msgData->nrppa_pdu.buffer, nrppa_pdu, nrppa_pdu_length);
|
||||
msgData->nrppa_pdu.length = nrppa_pdu_length;
|
||||
|
||||
itti_send_msg_to_task(TASK_NGAP, instance, msg);*/
|
||||
}
|
||||
|
||||
void nrppa_gNB_itti_send_UplinkNonUEAssociatedNRPPa(instance_t instance,
|
||||
uint8_t *routingId_buffer,
|
||||
uint32_t routingId_buffer_length,
|
||||
uint8_t *nrppa_pdu,
|
||||
uint32_t nrppa_pdu_length)
|
||||
{
|
||||
LOG_I(NRPPA, "initiating nrppa_gNB_itti_send_UplinkNonUEAssociatedNRPPa \n");
|
||||
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_NRPPA, 0, NGAP_UPLINKNONUEASSOCIATEDNRPPA);
|
||||
ngap_UplinkNonUEAssociatedNRPPa_t *ULNRPPA= &NGAP_UPLINKNONUEASSOCIATEDNRPPA(msg);
|
||||
|
||||
// Routing ID
|
||||
ULNRPPA->routing_id.buffer = malloc(sizeof(uint8_t) * routingId_buffer_length);
|
||||
memcpy(ULNRPPA->routing_id.buffer, routingId_buffer, routingId_buffer_length);
|
||||
ULNRPPA->routing_id.length = routingId_buffer_length;
|
||||
|
||||
// NRPPa PDU
|
||||
ULNRPPA->nrppa_pdu.buffer = malloc(sizeof(uint8_t) * nrppa_pdu_length);
|
||||
memcpy(ULNRPPA->nrppa_pdu.buffer, nrppa_pdu, nrppa_pdu_length);
|
||||
ULNRPPA->nrppa_pdu.length = nrppa_pdu_length;
|
||||
|
||||
itti_send_msg_to_task(TASK_NGAP, instance, msg);
|
||||
|
||||
// TODO try the below approach
|
||||
/* MessageDef *msg=itti_alloc_new_message_sized(TASK_NRPPA, 0, NGAP_UPLINKNONUEASSOCIATEDNRPPA,
|
||||
sizeof(ngap_UplinkNonUEAssociatedNRPPa_t)+ routingId_buffer_length + nrppa_pdu_length);
|
||||
|
||||
ngap_UplinkNonUEAssociatedNRPPa_t *msgData = &NGAP_UPLINKNONUEASSOCIATEDNRPPA(msg);
|
||||
|
||||
// Routing ID
|
||||
msgData->routing_id.buffer=(uint8_t *)(msgData+1);
|
||||
memcpy(msgData->routing_id.buffer, routingId_buffer, routingId_buffer_length);
|
||||
msgData->routing_id.length = routingId_buffer_length;
|
||||
|
||||
// NRPPa PDU
|
||||
msgData->nrppa_pdu.buffer = msgData->routing_id.buffer+routingId_buffer_length;
|
||||
memcpy(msgData->nrppa_pdu.buffer, nrppa_pdu, nrppa_pdu_length);
|
||||
msgData->nrppa_pdu.length = nrppa_pdu_length;
|
||||
|
||||
itti_send_msg_to_task(TASK_NGAP, instance, msg);*/
|
||||
}
|
||||
48
openair3/NRPPA/nrppa_gNB_itti_messaging.h
Normal file
48
openair3/NRPPA/nrppa_gNB_itti_messaging.h
Normal file
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_gNB_itti_messaging.h
|
||||
* \brief nrppa itti messages handlers for gNB
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
*\date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#ifndef NRPPA_GNB_ITTI_MESSAGING_H_
|
||||
#define NRPPA_GNB_ITTI_MESSAGING_H_
|
||||
|
||||
void nrppa_gNB_itti_send_UplinkUEAssociatedNRPPa(instance_t instance,
|
||||
uint32_t gNB_ue_ngap_id,
|
||||
uint32_t amf_ue_ngap_id,
|
||||
uint8_t *routingId_buffer,
|
||||
uint32_t routingId_buffer_length,
|
||||
uint8_t *nrppa_pdu,
|
||||
uint32_t nrppa_pdu_length);
|
||||
|
||||
void nrppa_gNB_itti_send_UplinkNonUEAssociatedNRPPa(instance_t instance,
|
||||
uint8_t *routingId_buffer,
|
||||
uint32_t routingId_buffer_length,
|
||||
uint8_t *nrppa_pdu,
|
||||
uint32_t nrppa_pdu_length);
|
||||
|
||||
#endif /* NRPPA_GNB_ITTI_MESSAGING_H_ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_gNB_measurement_information_transfer_procedures.h
|
||||
* \brief NRPPA gNB tasks related to measurement information transfer
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
*\date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#ifndef NRPPA_GNB_MEASUREMENT_INFORMATION_TRANSFER_PROCEDURES_H_
|
||||
#define NRPPA_GNB_MEASUREMENT_INFORMATION_TRANSFER_PROCEDURES_H_
|
||||
|
||||
// DOWNLINK
|
||||
// Measurement (Parent) procedure for MeasurementRequest, MeasurementResponse, and MeasurementFailure
|
||||
int nrppa_gNB_handle_Measurement(nrppa_gnb_ue_info_t *nrppa_msg_info, NRPPA_NRPPA_PDU_t *pdu);
|
||||
int nrppa_gNB_handle_MeasurementUpdate(nrppa_gnb_ue_info_t *nrppa_msg_info, NRPPA_NRPPA_PDU_t *pdu);
|
||||
int nrppa_gNB_handle_MeasurementAbort(nrppa_gnb_ue_info_t *nrppa_msg_info, NRPPA_NRPPA_PDU_t *pdu);
|
||||
|
||||
// UPLINK
|
||||
int nrppa_gNB_MeasurementFailure(instance_t instance, MessageDef *msg_p);
|
||||
int nrppa_gNB_MeasurementResponse(instance_t instance, MessageDef *msg_p);
|
||||
int nrppa_gNB_MeasurementReport(instance_t instance, MessageDef *msg_p);
|
||||
int nrppa_gNB_MeasurementFailureIndication(instance_t instance, MessageDef *msg_p);
|
||||
#endif /* NGAP_GNB_MEASUREMENT_INFORMATION_TRANSFER_PROCEDURES_H_ */
|
||||
1031
openair3/NRPPA/nrppa_gNB_position_information_transfer_procedures.c
Normal file
1031
openair3/NRPPA/nrppa_gNB_position_information_transfer_procedures.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file nrppa_gNB_position_information_transfer_procedures.h
|
||||
* \brief NRPPA gNB tasks related to position information transfer
|
||||
* \author Adeel Malik
|
||||
* \email adeel.malik@eurecom.fr
|
||||
*\date 2023
|
||||
* \version 1.0
|
||||
* @ingroup _nrppa
|
||||
*/
|
||||
|
||||
#ifndef NRPPA_GNB_POSITION_INFORMATION_TRANSFER_PROCEDURES_H_
|
||||
#define NRPPA_GNB_POSITION_INFORMATION_TRANSFER_PROCEDURES_H_
|
||||
|
||||
// DOWNLINK
|
||||
// PositioningInformationExchange (Parent) procedure for PositioningInformationRequest,
|
||||
// PositioningInformationResponse, and PositioningInformationFailure
|
||||
int nrppa_gNB_handle_PositioningInformationExchange(nrppa_gnb_ue_info_t *nrppa_msg_info, NRPPA_NRPPA_PDU_t *pdu);
|
||||
// PositioningActivation (Parent) procedure for PositioningActivationRequest,
|
||||
// PositioningActivationResponse, and PositioningActivationFailure
|
||||
int nrppa_gNB_handle_PositioningActivation(nrppa_gnb_ue_info_t *nrppa_msg_info, NRPPA_NRPPA_PDU_t *pdu);
|
||||
int nrppa_gNB_handle_PositioningDeactivation(nrppa_gnb_ue_info_t *nrppa_msg_info, NRPPA_NRPPA_PDU_t *pdu);
|
||||
|
||||
// UPLINK
|
||||
int nrppa_gNB_PositioningInformationFailure(instance_t instance, MessageDef *msg_p);
|
||||
int nrppa_gNB_PositioningInformationResponse(instance_t instance, MessageDef *msg_p);
|
||||
int nrppa_gNB_PositioningActivationFailure(instance_t instance, MessageDef *msg_p);
|
||||
int nrppa_gNB_PositioningActivationResponse(instance_t instance, MessageDef *msg_p);
|
||||
int nrppa_gNB_PositioningInformationUpdate(instance_t instance, MessageDef *msg_p);
|
||||
|
||||
#endif /* NRPPA_GNB_POSITION_INFORMATION_TRANSFER_PROCEDURES_H_ */
|
||||
@@ -1,86 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <NRPPA_MeasurementRequest.h>
|
||||
#include <NRPPA_ProtocolIE-Field.h>
|
||||
#include <asn_SEQUENCE_OF.h>
|
||||
/*
|
||||
* This is a custom function which writes the
|
||||
* encoded output into some FILE stream.
|
||||
*/
|
||||
|
||||
static int write_out(const void *buffer, size_t size, void *app_key)
|
||||
{
|
||||
FILE *out_fp = app_key;
|
||||
size_t wrote;
|
||||
|
||||
wrote = fwrite(buffer, 1, size, out_fp);
|
||||
|
||||
return (wrote == size) ? 0 : -1;
|
||||
}
|
||||
|
||||
int main(int ac, char **av)
|
||||
{
|
||||
NRPPA_MeasurementRequest_t *NRPPA_MeasurementRequest; /* Type to encode */
|
||||
asn_enc_rval_t ec; /* Encoder return value */
|
||||
|
||||
/* Allocate the NRPPA_MeasurementRequest_t */
|
||||
NRPPA_MeasurementRequest = calloc(1, sizeof(NRPPA_MeasurementRequest_t)); /* not malloc! */
|
||||
if (!NRPPA_MeasurementRequest) {
|
||||
perror("calloc() failed");
|
||||
exit(71); /* better, EX_OSERR */
|
||||
}
|
||||
|
||||
NRPPA_MeasurementRequest_IEs_t xyz;
|
||||
ASN_SEQUENCE_ADD(&NRPPA_MeasurementRequest->protocolIEs.list, &xyz);
|
||||
|
||||
/* MeasurementRequest ::= SEQUENCE {
|
||||
protocolIEs ProtocolIE-Container {{MeasurementRequest-IEs}},
|
||||
...
|
||||
} */
|
||||
|
||||
/* Protocl IE container
|
||||
id-LMF-Measurement-ID ProtocolIE-ID ::= 39
|
||||
id-RAN-Measurement-ID ProtocolIE-ID ::= 40
|
||||
ID id-TRP-MeasurementRequestList ProtocolIE-ID ::= 41
|
||||
ID id-ReportCharacteristics ProtocolIE-ID ::= 3
|
||||
ID id-MeasurementPeriodicity ProtocolIE-ID ::= 4
|
||||
ID id-TRPMeasurementQuantities ProtocolIE-ID ::= 52
|
||||
*/
|
||||
//NRPPA_MeasurementRequest->protocolIEs;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
//NRPPA_MeasurementRequest->_asn_ctx;
|
||||
|
||||
/* BER encode the data if filename is given */
|
||||
if (ac < 2) {
|
||||
fprintf(stderr, "Specify filename for BER output\n");
|
||||
} else {
|
||||
const char *filename = av[1];
|
||||
FILE *fp = fopen(filename, "wb"); /* for BER output */
|
||||
|
||||
if (!fp) {
|
||||
perror(filename);
|
||||
exit(71); /* better, EX_OSERR */
|
||||
}
|
||||
|
||||
// asn_enc_rval_t der_encode(const struct asn_TYPE_descriptor_s *type_descriptor,
|
||||
// const void *struct_ptr, /* Structure to be encoded */
|
||||
// asn_app_consume_bytes_f *consume_bytes_cb,
|
||||
// void *app_key /* Arbitrary callback argument */);
|
||||
|
||||
/* Encode the NRPPA_MeasurementRequest type as BER (DER) */
|
||||
ec = der_encode(&asn_DEF_NRPPA_MeasurementRequest, NRPPA_MeasurementRequest, write_out, fp);
|
||||
|
||||
fclose(fp);
|
||||
if (ec.encoded == -1) {
|
||||
fprintf(stderr, "Could not encode NRPPA_MeasurementRequest (at %s)\n", ec.failed_type ? ec.failed_type->name : "unknown");
|
||||
exit(65); /* better, EX_DATAERR */
|
||||
} else {
|
||||
fprintf(stderr, "Created %s with BER encoded NRPPA_MeasurementRequest\n", filename);
|
||||
}
|
||||
}
|
||||
|
||||
/* Also print the constructed NRPPA_MeasurementRequest XER encoded (XML) */
|
||||
xer_fprint(stdout, &asn_DEF_NRPPA_MeasurementRequest, NRPPA_MeasurementRequest);
|
||||
|
||||
return 0; /* Encoding finished successfully */
|
||||
}
|
||||
@@ -177,8 +177,8 @@ gNBs =
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.108/22";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.108/22";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.18.20/22";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.18.20/22";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
@@ -226,7 +226,7 @@ RUs = (
|
||||
max_rxgain = 75;
|
||||
sf_extension = 0;
|
||||
eNB_instances = [0];
|
||||
ru_thread_core = 6;
|
||||
ru_thread_core = 9;
|
||||
sl_ahead = 5;
|
||||
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||
bf_weights = [0x00007fff, 0x0000,0x00007fff, 0x0000];
|
||||
@@ -277,7 +277,7 @@ log_config : {
|
||||
fhi_72 = {
|
||||
dpdk_devices = ("0000:31:06.0", "0000:31:06.1");
|
||||
system_core = 0;
|
||||
io_core = 4;
|
||||
io_core = 1;
|
||||
worker_cores = (2);
|
||||
du_addr = ("76:76:64:6e:00:01", "76:76:64:6e:00:01");
|
||||
ru_addr = ("98:ae:71:01:c5:eb", "98:ae:71:01:c5:eb");
|
||||
|
||||
@@ -176,8 +176,8 @@ gNBs =
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.51";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.51";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.18.20";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.18.20";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user