Compare commits

...

120 Commits

Author SHA1 Message Date
firecell
871258876c Merge branch 'NRPPA_Procedures_Florian' of https://gitlab.eurecom.fr/oai/openairinterface5g into NRPPA_Procedures_Florian 2025-04-28 09:30:34 +02:00
Florian Kaltenberger
ec86c2183e partially reverting previous commit. adding power threshold to toa estimation instead. 2025-04-17 16:20:12 -04:00
firecell
6ae38e12b1 sending invalid -32768 to LMF 2025-04-11 18:24:01 +02:00
Florian Kaltenberger
3018fb6b8a making sure toa estimates have same type everywhere, using 0x8000 instead of 0xffff to indicate invalid ToA estimates in SRS_indication (bug in FAPI<=v6). 2025-04-09 11:45:48 -04:00
firecell
1986ba04bc fix LMF gNB k1 to ToA conversion error 2025-04-02 14:33:47 +02:00
malik
0a8f164713 minor changes 2025-03-27 14:15:13 +01:00
malik
e17f2b7c33 fix multignb same ToA bug for TRPs with negative toa_ns 2025-03-26 10:22:35 +01:00
Mohsen Ahadi
66e22217e5 updating InputData.json IMSI 2024-12-18 10:33:48 +01:00
Mohsen Ahadi
fc43f9b495 updating confs for multignb on colibri and peafowl 2024-12-18 10:31:15 +01:00
Raymond Knopp
40eb18c3f2 adding gNB1 config from peafowl 2024-11-26 18:02:36 +01:00
Mohsen Ahadi
1ea42141dc adding config file for gNB3 from colibri 2024-11-26 17:58:43 +01:00
Florian Kaltenberger
6aa774c965 checking vlaue of ul_rtoa before encoding NRPPA Measurement response 2024-11-19 15:31:26 -05:00
Florian Kaltenberger
06dadb777b renaming folder for positioning tutorial
changing .doc to markdown
added tutorial and config files for multi gNB (from Adeel)
2024-11-19 13:51:04 -05:00
Florian Kaltenberger
3ca7a75b26 handling of bad ToA estimate in Measruement response 2024-11-15 16:23:42 -05:00
Florian Kaltenberger
996a0cfc7e This commit partially reverts commit e440e34c49 "remove the scheduling of the non-ue associated SRS measurements. Instead report type of the classical SRS measurements to "LOCALIZATION" and send these measurements in the NRPPa measurement response"
instead we don't schedule regular SRS
also fixed some compilation warning and other bugs
2024-11-15 21:37:36 +01:00
malik
2004295e36 positioning tutorial 2024-09-20 15:54:51 +02:00
Mohsen Ahadi
f5978cf584 updating NB_ANTENNAS_RX for 8 antennas 2024-09-10 15:50:00 +02:00
Mohsen Ahadi
5fb6fc43ed updating positioning_config_rrc_t 2024-09-09 19:39:00 +02:00
Mohsen Ahadi
f9f167f6ca updating multi srs symbols 2024-09-05 17:08:42 +02:00
Eurecom
2f13d17529 Merge remote-tracking branch 'origin/develop' into NRPPA_Procedures 2024-09-04 20:20:42 +02:00
Florian Kaltenberger
e440e34c49 remove the scheduling of the non-ue associated SRS measurements. Instead report type of the classical SRS measurements to "LOCALIZATION" and send these measurements in the NRPPa measurement response 2024-09-03 22:38:14 +02:00
malik
55b4a49dfc synch with develop 2024-08-27 18:02:03 +02:00
firecell
42bb444029 minor fix 2024-08-23 16:36:09 +02:00
malik
b34d8db8db minor correction TRP response 2024-08-09 12:46:21 +02:00
Florian Kaltenberger
dbf367f805 making secondary srs measurement periodic 2024-08-08 14:17:45 +02:00
ahadi
27c00d949d correcting the nr_est_toa_ns_srs() 2024-08-07 07:34:07 -04:00
Florian Kaltenberger
344675c554 properly handling return of nr_srs_indication 2024-08-07 07:34:07 -04:00
Florian Kaltenberger
c77a50a38b adding LMF service to docker-compose of CN5G 2024-08-07 07:34:07 -04:00
malik
a8ba89a212 Enabling User defined TRD IDs via gNB config file for Positioning 2024-08-07 07:34:07 -04:00
malik
a64a3cc480 minor fix for # of TRPs, frame # and slot # 2024-08-07 07:34:07 -04:00
malik
ac977967a6 trp reponse fix for malloc: invalid free() 2024-08-07 07:34:07 -04:00
Adeel Malik
4e3c3f6251 T_IDs.h compilation error issue fix 2024-08-07 07:34:07 -04:00
malik
c6055d9095 merge NRPPA_Procedures_SRS 2024-06-24 17:40:55 +02:00
malik
e48a3269ec synch with develop 2024-06-24 13:27:29 +02:00
malik
a111d4b8c4 Enabling Multi-TRP and Multi-gNB for NRPPA Measurement Response 2024-06-24 11:55:07 +02:00
Raymond Knopp
b014c10f36 docker compose now starts 2 gNBs 2024-06-14 20:29:26 +02:00
arora
d8747403f6 Remove compilation of swig it is not needed for E2SM 2024-06-13 22:06:10 +02:00
arora
8a5d2f99b2 Updating benetel 650 configuration file for peafowl macvlan 2024-06-13 22:06:10 +02:00
arora
691442c91e Updating the documentation and adding manifests for fhi72 build on openshift
- Updated docker-compose documentation
- Openshift Readme
2024-06-13 22:06:10 +02:00
arora
98615c8cab UBI9 docker images and updated ubuntu images with E2 SM models 2024-06-13 22:06:10 +02:00
arora
e3a834cd79 Updating the name of the dockerfiles 2024-06-13 22:06:10 +02:00
arora
a5fe4532ed Correcting the path for the image and conf file 2024-06-13 22:06:10 +02:00
arora
24d3203cc5 Adding 7.2 containerfiles and docker-compose
Signed-off-by: arora <sagar.arora@eurecom.fr>
2024-06-13 22:06:10 +02:00
Florian Kaltenberger
e5e4deadfb fixing a bug in nr_est_timing_advance_srs 2024-06-11 04:19:05 +02:00
Florian Kaltenberger
ae21d9a97e storing relevant measurement request paramters properly in MAC 2024-06-11 04:19:05 +02:00
Florian Kaltenberger
7af01ea53a Merge branch 'NRPPA_Procedures' into NRPPA_Procedures_SRS 2024-06-05 21:15:41 +02:00
Florian Kaltenberger
4bd63ff80b fixing compiler warnings 2024-06-05 20:46:03 +02:00
Florian Kaltenberger
4b7f0a2617 fixing a weird bug 2024-06-05 20:45:29 +02:00
Florian Kaltenberger
38ce8f7bd1 bugfix 2024-06-05 20:08:20 +02:00
Florian Kaltenberger
54180d3478 Merge remote-tracking branch 'origin/NRPPA_Procedures' into NRPPA_Procedures_SRS 2024-04-26 20:08:47 +02:00
Florian Kaltenberger
d645536c83 multi TRP SRS estimation 2024-04-23 14:39:21 -04:00
malik
3804e04ec1 merge NRRPA_proceudre_SRS and NRPPA_procedures 2024-04-23 08:48:43 +02:00
malik
2945cfcd79 Synch with develop 2024-04-22 10:11:22 +02:00
malik
118578e5b6 Add geographicalCoordinates in TRPInformationResponse 2024-04-04 17:05:17 +02:00
malik
ef3e65e761 Adding ng_RAN_CGI in TRP information response 2024-04-02 12:36:43 +02:00
malik
1a32d19fbb synch with develop 2024-04-01 13:08:34 +02:00
Florian Kaltenberger
f47cba0989 fixing scheduling of secondary srs 2024-03-28 21:56:19 +01:00
Florian Kaltenberger
687f8f3280 fixing a +1 offset bug 2024-03-26 21:47:35 +01:00
Florian Kaltenberger
96bf4b97ed fixing bug 2024-03-11 14:04:08 -04:00
Florian Kaltenberger
7e45d1febc fixing merge 2024-03-11 18:59:32 +01:00
Florian Kaltenberger
6abfb42d56 Merge remote-tracking branch 'origin/NRPPA_Procedures' into NRPPA_Procedures_SRS 2024-03-11 12:12:29 -04:00
malik
de30588aec updating processing of measurement information request 2024-03-11 12:10:41 +01:00
Florian Kaltenberger
bf951fa58e improving the logic of measurement request/response 2024-03-06 16:50:41 -05:00
Florian Kaltenberger
2253bd41ba adding dummy srs config to F1AP measurment request 2024-03-06 15:58:21 -05:00
Florian Kaltenberger
93fb95a7b7 Merge remote-tracking branch 'origin/NRPPA_Procedures' into NRPPA_Procedures_SRS 2024-03-04 22:59:32 +01:00
malik
ce082a5783 updating Position information response 2024-03-04 19:40:45 +01:00
malik
25a94bc27d minor typo 2024-03-04 07:46:32 +01:00
Florian Kaltenberger
4b3052b681 non UE associated measurements now stored in structure outside of UE list. 2024-03-03 20:17:16 +01:00
malik
5b6b34b2a0 fix Trp info response and position activation response 2024-03-03 20:13:00 +01:00
malik
f6dca65fb4 Trp info response and position activation response 2024-03-01 16:38:40 +01:00
Florian Kaltenberger
64d9c357da first test of non-ue-associated nrppa measurement request/response 2024-02-29 14:05:35 -05:00
Florian Kaltenberger
6ee8a03410 adapting previous commit to F1AP measurement request 2024-02-29 12:46:58 -05:00
Florian Kaltenberger
b8e604f437 adding srs estimation at secondary gNB 2024-02-29 12:46:58 -05:00
malik
ab0ad109db synch with latest develop 2024-02-27 12:02:44 +01:00
malik
8ce6142bd3 temporary fix for no ue nrppa messages 2024-02-16 16:19:45 +01:00
Florian Kaltenberger
80fcc5bd28 sending frame and slot number in F1AP measurement response 2024-02-12 16:19:39 +01:00
Florian Kaltenberger
c5166cb371 Merge branch 'NRPPA_Procedures' of https://gitlab.eurecom.fr/oai/openairinterface5g into NRPPA_Procedures 2024-02-09 22:07:51 +01:00
malik
fe1edff004 synch with latest develop 2024-02-06 08:47:42 +01:00
malik
ae8c83ec3f synch with develop 2024-02-06 08:40:00 +01:00
Florian Kaltenberger
3a104244e3 bugfix 2024-01-23 19:41:07 +01:00
Florian Kaltenberger
a0507f813d now computing toa in ns 2024-01-17 20:17:54 +01:00
Florian Kaltenberger
85d6aa688e reworking ToA estimation 2024-01-17 20:17:41 +01:00
rakesh mundlamuri
c1ed908ead Initial version of SRS oversampling 2024-01-17 20:17:25 +01:00
Adeel Malik
3490555fe6 sync with latest develop 2024.w02 2024-01-16 12:43:21 +01:00
Adeel Malik
aab1927897 minor typo correction 2024-01-16 12:07:36 +01:00
Adeel Malik
0b8e43f593 partial code refinement based on merge request comments 2024-01-05 11:55:18 +01:00
Adeel Malik
d484d449c9 minor correction 2024-01-02 14:42:02 +01:00
Adeel Malik
c2fdd7b7db synch with develop w51 2024-01-02 13:17:11 +01:00
Adeel Malik
d044d64515 rebase to w49 2024-01-02 12:48:06 +01:00
Adeel Malik
c1b1cf0c61 rebase to develop w49 2024-01-02 12:08:32 +01:00
Adeel Malik
0e21a2d158 fixing typo 2023-12-20 15:28:13 +01:00
Adeel Malik
759944972d typo 2023-12-20 15:28:13 +01:00
Adeel Malik
8e9eee6830 clang formating 2023-12-20 15:28:12 +01:00
Adeel Malik
2154b7c3d1 code refinement 2023-12-20 15:20:23 +01:00
Adeel Malik
08f0a4e487 handling/testing NRPPA measurement request/response 2023-12-20 15:10:12 +01:00
Adeel Malik
bf0b07a3a6 adding handlers of NRRPPA msg in rrc_cu and adopting clang format 2023-12-20 14:57:56 +01:00
Adeel Malik
733ae7d5cf Defination of NRRPA related F1AP structure and declaration/integration of F1AP positioning messages for UL TDOA 2023-12-19 16:59:52 +01:00
Adeel Malik
33dc414070 F1 based flow of NRPPA positioning information request/response 2023-12-19 15:44:48 +01:00
Adeel Malik
59686c7478 correction position information response 2023-12-19 15:25:39 +01:00
Adeel Malik
4b6ca17257 1st version of NRPPa Measurement Information Transfer Procedure 2023-12-19 15:21:52 +01:00
Adeel Malik
50e23f658f 1st version of NRPPa TRP Information Transfer Procedure 2023-12-19 15:15:29 +01:00
Adeel Malik
da1c713245 1st version of NRPPa Position Information Transfer Procedure 2023-12-19 14:59:14 +01:00
Adeel Malik
7dbfeead33 Enabling NGAP NRPPA Transport Procedure 2023-12-19 14:34:20 +01:00
Adeel Malik
2a3152cbf5 Merge branch 'develop' of https://gitlab.eurecom.fr/oai/openairinterface5g into NRPPA_Procedures
synch with develop
2023-12-14 12:30:40 +01:00
Adeel Malik
b608d9f009 fixing typo 2023-12-11 15:48:54 +01:00
Adeel Malik
96d0f78cfc typo 2023-12-08 17:20:53 +01:00
Adeel Malik
188d8e4eb5 clang formating 2023-12-08 13:54:29 +01:00
Adeel Malik
fc74d80376 synch with develop 2023-12-08 10:27:59 +01:00
Adeel Malik
eb101af518 code refinement 2023-12-07 13:09:55 +01:00
Adeel Malik
3d4554eec2 handling/testing NRPPA measurement request/response 2023-12-01 16:05:22 +01:00
Adeel Malik
c889c83084 adding handlers of NRRPPA msg in rrc_cu and adopting clang format 2023-11-15 15:16:33 +01:00
Adeel Malik
4baaef39c5 Defination of NRRPA related F1AP structure and declaration/integration of F1AP positioning messages for UL TDOA 2023-11-10 16:44:19 +01:00
Adeel Malik
9f5f0c75e4 synch with develop 2023-10-18 14:36:51 +02:00
Adeel Malik
6e3641326b F1 based flow of NRPPA positioning information request/response 2023-10-17 11:46:02 +02:00
Adeel Malik
5a2b9e29f4 correction position information response 2023-09-29 12:23:13 +02:00
Adeel Malik
8a7c65fedf Sync with OAI Develop 2023-08-08 14:36:33 +02:00
Adeel Malik
5b90909f6e 1st version of NRPPa Measurement Information Transfer Procedure 2023-08-08 10:14:28 +02:00
Adeel Malik
e56de8138f 1st version of NRPPa TRP Information Transfer Procedure 2023-08-03 08:46:07 +02:00
Adeel Malik
88cf3d99f5 1st version of NRPPa Position Information Transfer Procedure 2023-08-01 14:53:37 +02:00
Adeel Malik
d9da2f671b Enabling NGAP NRPPA Transport Procedure 2023-05-03 17:08:06 +02:00
95 changed files with 12205 additions and 416 deletions

View File

@@ -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

View 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>
![Docker deploy 7.2](../../../doc/images/docker-deploy-oai-7-2.png)
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
```

View 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

View File

@@ -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];

View File

@@ -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

View File

@@ -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"

View File

@@ -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) \

View File

@@ -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"

View File

@@ -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

View File

@@ -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"
}
}

View File

@@ -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;
}
);
};

View File

@@ -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;
};
});
};

View File

@@ -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"

View File

@@ -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;
};
});
};

View File

@@ -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;
};
});
};

View File

@@ -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"

View File

@@ -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;
};
});
};

View File

@@ -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;
};
});
};

View File

@@ -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"

View File

@@ -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
```

View File

@@ -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

View 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

View File

@@ -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;
}
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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;
}

View File

@@ -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 {

View File

@@ -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

View File

@@ -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");
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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 {

View 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

View File

@@ -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;

View 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;
}

View 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_ */

View File

@@ -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>

View 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;
}

View 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_ */

View File

@@ -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,

View File

@@ -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)

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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) {

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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,

View File

@@ -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");
}

View File

@@ -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 */

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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__ */

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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) {

View File

@@ -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;
}

View 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;
}

View 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_ */

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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 */

View File

@@ -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);
}

View File

@@ -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_ */

View File

@@ -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... */

View File

@@ -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)

View 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 */

View 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
View 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;
}

View 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_ */

View 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;
}
}

View File

@@ -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_ */

View 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;
}

View 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_ */

View 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_ */

View 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;
}

View 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_ */

View 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;
}

View 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_ */

View 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);*/
}

View 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

View File

@@ -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_ */

File diff suppressed because it is too large Load Diff

View File

@@ -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_ */

View File

@@ -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 */
}

View File

@@ -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");

View File

@@ -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
};
}